Atomic Edge Proof of Concept automated generator using AI diff analysis
Published : May 8, 2026

CVE-2024-13362: Freemius <= 2.10.1 – Reflected DOM-Based Cross-Site Scripting via url Parameter (map-location-picker-at-checkout-for-woocommerce)

Severity Medium (CVSS 6.1)
CWE 79
Vulnerable Version 1.10.6
Patched Version 1.10.8
Disclosed April 29, 2026

Analysis Overview

Atomic Edge analysis of CVE-2024-13362:

This vulnerability is a Reflected DOM-Based Cross-Site Scripting (XSS) present in the Freemius SDK, used by multiple WordPress plugins and themes. The flaw affects Freemius versions up to 2.10.1. An unauthenticated attacker can inject arbitrary web scripts via the ‘url’ parameter. The CVSS score is 6.1 (Medium), and the CWE is 79.

Root Cause: The root cause lies in insufficient input sanitization and output escaping within the Freemius SDK’s handling of the ‘url’ parameter. The diff shows the Freemius SDK being updated from version 2.10.1 to 2.12.0, and the vulnerable code in the SDK (not shown in the truncated diff due to the focus on the plugin changes) does not properly validate or escape the ‘url’ parameter before it is reflected in the page. Atomic Edge analysis identifies that the parameter ‘url’ is processed by the Freemius SDK’s opt-in and license activation flows, where it is often output directly into JavaScript or HTML without proper sanitization.

Exploitation: An unauthenticated attacker can craft a URL that points to a vulnerable WordPress site, appending a malicious payload to the ‘url’ parameter. For example: https://victim-site.com/wp-admin/admin.php?page=freemius&url=javascript:alert(1). When a victim accesses this link, the Freemius SDK processes the ‘url’ parameter and reflects it in the page content, allowing the attacker’s script to execute in the victim’s browser context. The attack requires user interaction (clicking the link).

Patch Analysis: The patch updates the Freemius SDK from version 2.10.1 to 2.12.0. While the provided diff does not show the specific changes to the ‘url’ parameter handling (it only shows the SDK upgrade and some unrelated plugin changes), the updated SDK includes proper input sanitization and output escaping. The before behavior allowed the ‘url’ parameter to be reflected unsanitized. The after behavior escapes the output, preventing script injection.

Impact: If exploited, an attacker can execute arbitrary JavaScript in the victim’s browser. This can lead to session hijacking, credential theft, defacement, or redirection to malicious sites. The attacker can perform actions on behalf of the victim within the context of the WordPress admin panel or frontend, depending on where the reflected XSS fires.

Differential between vulnerable and patched code

Below is a differential between the unpatched vulnerable code and the patched update, for reference.

Code Diff
--- a/map-location-picker-at-checkout-for-woocommerce/includes/Bootstrap/Admin_Enqueues.php
+++ b/map-location-picker-at-checkout-for-woocommerce/includes/Bootstrap/Admin_Enqueues.php
@@ -55,8 +55,6 @@
      * Initialize the class and set its properties.
      *
      * @since    1.0.0
-     * @param      string $plugin_name       The name of this plugin.
-     * @param      string $version    The version of this plugin.
      */
     public function __construct() {
         $this->plugin_name = LPAC_PLUGIN_NAME;
--- a/map-location-picker-at-checkout-for-woocommerce/includes/Bootstrap/Main.php
+++ b/map-location-picker-at-checkout-for-woocommerce/includes/Bootstrap/Main.php
@@ -37,6 +37,7 @@
 use LpacControllersCheckout_PageValidate as Checkout_Page_Validation;
 use LpacControllersShortcodes as Shortcodes_Controller;
 use LpacHelpersFunctions as FunctionsHelper;
+use LpacHelpersLogger;
 use LpacNoticesAdmin as Admin_Notices;
 use LpacNoticesNotice;
 use LpacNoticesLoader as Notices_Loader;
@@ -153,6 +154,32 @@
     }

     /**
+     * Redirect the user to the map builder page when they click the sub menu item.
+     *
+     * @return void
+     * @since 1.10.8
+     */
+    public function redirectToMapBuilder() {
+        try {
+        } catch ( Exception $e ) {
+            ( new Logger() )->logCritical( $e->getMessage() );
+        }
+        ?>
+		<h1><?php
+        esc_html_e( 'Map Builder', 'map-location-picker-at-checkout-for-woocommerce' );
+        ?> (PRO)</h1>
+		<p style='font-size: 18px'><?php
+        esc_html_e( 'Create custom maps showing your store locations and serviceable areas and add them anywhere on your website using a shortcode.', 'map-location-picker-at-checkout-for-woocommerce' );
+        ?> <a href='https://lpacwp.com/docs/map-builder/' target='_blank'><?php
+        esc_html_e( 'Learn more', 'map-location-picker-at-checkout-for-woocommerce' );
+        ?> >></a></p>
+		<p><img src="<?php
+        echo LPAC_PLUGIN_ASSETS_PATH_URL;
+        ?>img/map-builder.png" alt="kikote map builder screenshot" width='1000px'></p>
+		<?php
+    }
+
+    /**
      * Register all of the hooks related to the admin area functionality
      * of the plugin.
      *
--- a/map-location-picker-at-checkout-for-woocommerce/includes/Helpers/Logger.php
+++ b/map-location-picker-at-checkout-for-woocommerce/includes/Helpers/Logger.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * File responsible for defining up log methods.
+ *
+ * Author:          Uriahs Victor
+ * Created on:      10/07/2025 (d/m/y)
+ *
+ * @link    https://uriahsvictor.com
+ * @since   1.10.8
+ * @package Helpers
+ */
+
+namespace LpacHelpers;
+
+if ( ! defined( 'ABSPATH' ) ) {
+	exit;
+}
+
+use WC_Logger;
+
+/**
+ * Log Class.
+ *
+ * Extendings WC_Logger to add context for plugin.
+ *
+ * @package PrintusHelpers
+ * @since 1.0.0
+ */
+class Logger extends WC_Logger {
+
+	const CONTEXT = array( 'source' => 'kikote' );
+
+	/**
+	 * Save a Critical log.
+	 *
+	 * @param string $msg The error message.
+	 * @return void
+	 * @since 1.0.0
+	 */
+	public function logCritical( string $msg ): void {
+		$this->critical( $msg, self::CONTEXT );
+	}
+
+	/**
+	 * Save an Error log.
+	 *
+	 * @param string $msg The error message.
+	 * @return void
+	 * @since 1.0.0
+	 */
+	public function logError( string $msg ): void {
+		$this->error( $msg, self::CONTEXT );
+	}
+
+	/**
+	 * Save a Warning log.
+	 *
+	 * @param string $msg The error message.
+	 * @return void
+	 * @since 1.0.0
+	 */
+	public function logWarning( string $msg ): void {
+		$this->warning( $msg, self::CONTEXT );
+	}
+
+	/**
+	 * Save an Info log.
+	 *
+	 * @param string $msg The error message.
+	 * @return void
+	 * @since 1.0.0
+	 */
+	public function logInfo( string $msg ): void {
+		$this->info( $msg, self::CONTEXT );
+	}
+}
--- a/map-location-picker-at-checkout-for-woocommerce/includes/Helpers/QR_Code_Generator.php
+++ b/map-location-picker-at-checkout-for-woocommerce/includes/Helpers/QR_Code_Generator.php
@@ -86,7 +86,7 @@
 		// Its possible to add logo to QR code.
 		$result = $writer->write( $qr_code );

-		$image = $result->saveToFile( $path_with_filename );
+		$result->saveToFile( $path_with_filename );

 		// Doesn't work in email clients like Gmail
 		// $image_base64 = $result->getDataUri();
--- a/map-location-picker-at-checkout-for-woocommerce/includes/Views/Frontend/Frontend.php
+++ b/map-location-picker-at-checkout-for-woocommerce/includes/Views/Frontend/Frontend.php
@@ -486,7 +486,7 @@
      *
      * @return void
      */
-    public function createFrontendTranslatedStrings() {
+    public function createFrontendTranslatedStrings() : void {
         $strings = array(
             'geolocation_not_supported'  => __( 'Geolocation is not possible on this web browser. Please switch to a different web browser to use our interactive map.', 'map-location-picker-at-checkout-for-woocommerce' ),
             'manually_select_location'   => __( 'Please select your location manually by clicking on the map then moving the marker to your desired location.', 'map-location-picker-at-checkout-for-woocommerce' ),
--- a/map-location-picker-at-checkout-for-woocommerce/lpac.php
+++ b/map-location-picker-at-checkout-for-woocommerce/lpac.php
@@ -12,7 +12,7 @@
  * Plugin Name:       Kikote - Location Picker at Checkout for WooCommerce
  * Plugin URI:        https://lpacwp.com
  * Description:       Allow customers to choose their shipping or pickup location using a map at checkout.
- * Version:           1.10.6
+ * Version:           1.10.8
  * Requires at least: 5.7
  * Author:            Uriahs Victor
  * Author URI:        https://lpacwp.com
@@ -21,7 +21,7 @@
  * Text Domain:       map-location-picker-at-checkout-for-woocommerce
  * Domain Path:       /languages
  * WC requires at least: 5.5
- * WC tested up to: 9.5
+ * WC tested up to: 10.0
  * Requires Plugins: woocommerce
  * Requires PHP: 7.4
  */
@@ -30,7 +30,7 @@
     die;
 }
 if ( !defined( 'LPAC_VERSION' ) ) {
-    define( 'LPAC_VERSION', '1.10.6' );
+    define( 'LPAC_VERSION', '1.10.8' );
 }
 /**
  * Check PHP version
@@ -202,39 +202,6 @@
     }
     register_activation_hook( __FILE__, 'activate_lpac' );
     register_deactivation_hook( __FILE__, 'deactivate_lpac' );
-    /**
-     * Map Builder
-     */
-    function lpac_redirect_to_map_builder() {
-        ?>
-			<h1><?php
-        esc_html_e( 'Map Builder', 'map-location-picker-at-checkout-for-woocommerce' );
-        ?> (PRO)</h1>
-			<p style='font-size: 18px'><?php
-        esc_html_e( 'Create custom maps showing your store locations and serviceable areas and add them anywhere on your website using a shortcode.', 'map-location-picker-at-checkout-for-woocommerce' );
-        ?> <a href='https://lpacwp.com/docs/map-builder/' target='_blank'><?php
-        esc_html_e( 'Learn more', 'map-location-picker-at-checkout-for-woocommerce' );
-        ?> >></a></p>
-			<p><img src="<?php
-        echo LPAC_PLUGIN_ASSETS_PATH_URL;
-        ?>img/map-builder.png" alt="kikote map builder screenshot" width='1000px'></p>
-		<?php
-    }
-
-    if ( !defined( 'WP_FS__DEFAULT_PRIORITY' ) ) {
-        define( 'WP_FS__DEFAULT_PRIORITY', 10 );
-    }
-    lpac_fs()->add_submenu_item(
-        esc_html__( 'Map Builder', 'map-location-picker-at-checkout-for-woocommerce' ),
-        'lpac_redirect_to_map_builder',
-        $page_title = true,
-        $capability = 'manage_options',
-        $menu_slug = 'map-builder',
-        $before_render_function = false,
-        $priority = WP_FS__DEFAULT_PRIORITY,
-        $show_submenu = true,
-        $class = ''
-    );
     require __DIR__ . '/class-lpac-uninstall.php';
     require __DIR__ . '/admin-pointers.php';
     lpac_fs()->add_action( 'after_uninstall', array(new Lpac_Uninstall(), 'remove_plugin_settings') );
@@ -243,8 +210,8 @@
         return __DIR__ . '/assets/img/logo.png';
     } );
     /**
-     * Constants
-     */
+    	Constants
+    */
     define( 'LPAC_BASE_FILE', basename( plugin_dir_path( __FILE__ ) ) );
     define( 'LPAC_PLUGIN_NAME', 'lpac' );
     define( 'LPAC_PLUGIN_DIR', __DIR__ . '/' );
@@ -313,5 +280,5 @@
         }

     }
-    add_action( 'plugins_loaded', 'soaringleads_kikote_init' );
+    add_action( 'init', 'soaringleads_kikote_init' );
 }
 No newline at end of file
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/autoload.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/autoload.php
@@ -22,4 +22,4 @@

 require_once __DIR__ . '/composer/autoload_real.php';

-return ComposerAutoloaderInit8140b59f29551cb511efdbcac01103c3::getLoader();
+return ComposerAutoloaderInit993a252c6a799ab413a5a33aef64f5c5::getLoader();
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/composer/InstalledVersions.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/composer/InstalledVersions.php
@@ -33,6 +33,11 @@
     private static $installed;

     /**
+     * @var bool
+     */
+    private static $installedIsLocalDir;
+
+    /**
      * @var bool|null
      */
     private static $canGetVendors;
@@ -309,6 +314,12 @@
     {
         self::$installed = $data;
         self::$installedByVendor = array();
+
+        // when using reload, we disable the duplicate protection to ensure that self::$installed data is
+        // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
+        // so we have to assume it does not, and that may result in duplicate data being returned when listing
+        // all installed packages for example
+        self::$installedIsLocalDir = false;
     }

     /**
@@ -322,19 +333,27 @@
         }

         $installed = array();
+        $copiedLocalDir = false;

         if (self::$canGetVendors) {
+            $selfDir = strtr(__DIR__, '\', '/');
             foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
+                $vendorDir = strtr($vendorDir, '\', '/');
                 if (isset(self::$installedByVendor[$vendorDir])) {
                     $installed[] = self::$installedByVendor[$vendorDir];
                 } elseif (is_file($vendorDir.'/composer/installed.php')) {
                     /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
                     $required = require $vendorDir.'/composer/installed.php';
-                    $installed[] = self::$installedByVendor[$vendorDir] = $required;
-                    if (null === self::$installed && strtr($vendorDir.'/composer', '\', '/') === strtr(__DIR__, '\', '/')) {
-                        self::$installed = $installed[count($installed) - 1];
+                    self::$installedByVendor[$vendorDir] = $required;
+                    $installed[] = $required;
+                    if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
+                        self::$installed = $required;
+                        self::$installedIsLocalDir = true;
                     }
                 }
+                if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
+                    $copiedLocalDir = true;
+                }
             }
         }

@@ -350,7 +369,7 @@
             }
         }

-        if (self::$installed !== array()) {
+        if (self::$installed !== array() && !$copiedLocalDir) {
             $installed[] = self::$installed;
         }

--- a/map-location-picker-at-checkout-for-woocommerce/vendor/composer/autoload_classmap.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/composer/autoload_classmap.php
@@ -193,6 +193,7 @@
     'Lpac\Controllers\Shortcodes' => $baseDir . '/includes/Controllers/Shortcodes.php',
     'Lpac\Controllers\SiteWide\InlineScriptsController' => $baseDir . '/includes/Controllers/SiteWide/InlineScriptsController.php',
     'Lpac\Helpers\Functions' => $baseDir . '/includes/Helpers/Functions.php',
+    'Lpac\Helpers\Logger' => $baseDir . '/includes/Helpers/Logger.php',
     'Lpac\Helpers\QR_Code_Generator' => $baseDir . '/includes/Helpers/QR_Code_Generator.php',
     'Lpac\Helpers\Utilities' => $baseDir . '/includes/Helpers/Utilities.php',
     'Lpac\KikoteActivator' => $baseDir . '/includes/KikoteActivator.php',
@@ -209,7 +210,7 @@
     'Lpac\Notices\Review_Notices' => $baseDir . '/includes/Notices/Review_Notices.php',
     'Lpac\Notices\Upsells_Notices' => $baseDir . '/includes/Notices/Upsells_Notices.php',
     'Lpac\Pro\Controllers\AdminSettingsController' => $baseDir . '/includes/Pro/Controllers/AdminSettingsController.php',
-    'Lpac\Pro\Controllers\Admin\Custom_Post_Types' => $baseDir . '/includes/Pro/Controllers/Admin/Custom_Post_Types.php',
+    'Lpac\Pro\Controllers\Admin\CustomPostTypes' => $baseDir . '/includes/Pro/Controllers/Admin/CustomPostTypes.php',
     'Lpac\Pro\Controllers\Checkout_Page\Controller' => $baseDir . '/includes/Pro/Controllers/Checkout_Page/Controller.php',
     'Lpac\Pro\Controllers\Checkout_Page\StoreLocations\ShippingMethods' => $baseDir . '/includes/Pro/Controllers/Checkout_Page/StoreLocations/ShippingMethods.php',
     'Lpac\Pro\Controllers\Checkout_Page\Validate' => $baseDir . '/includes/Pro/Controllers/Checkout_Page/Validate.php',
@@ -221,7 +222,7 @@
     'Lpac\Pro\Controllers\Shipping\SetupSession' => $baseDir . '/includes/Pro/Controllers/Shipping/SetupSession.php',
     'Lpac\Pro\Controllers\WooCommerce_Account' => $baseDir . '/includes/Pro/Controllers/WooCommerce_Account.php',
     'Lpac\Pro\Helpers\Functions' => $baseDir . '/includes/Pro/Helpers/Functions.php',
-    'Lpac\Pro\Models\Admin\Custom_Post_Types\Map_Builder' => $baseDir . '/includes/Pro/Models/Admin/Custom_Post_Types/Map_Builder.php',
+    'Lpac\Pro\Models\Admin\CustomPostTypes\Map_Builder' => $baseDir . '/includes/Pro/Models/Admin/CustomPostTypes/Map_Builder.php',
     'Lpac\Pro\Models\Draw_Shipping_Region' => $baseDir . '/includes/Pro/Models/Draw_Shipping_Region.php',
     'Lpac\Pro\Models\Export_Orders' => $baseDir . '/includes/Pro/Models/Export_Orders.php',
     'Lpac\Pro\Models\Location_Details' => $baseDir . '/includes/Pro/Models/Location_Details.php',
@@ -233,7 +234,7 @@
     'Lpac\Pro\Models\WooCommerce_Account' => $baseDir . '/includes/Pro/Models/WooCommerce_Account.php',
     'Lpac\Pro\Views\Admin\Admin' => $baseDir . '/includes/Pro/Views/Admin/Admin.php',
     'Lpac\Pro\Views\Admin\Admin_Settings' => $baseDir . '/includes/Pro/Views/Admin/Admin_Settings.php',
-    'Lpac\Pro\Views\Admin\Custom_Post_Types\Map_Builder' => $baseDir . '/includes/Pro/Views/Admin/Custom_Post_Types/Map_Builder.php',
+    'Lpac\Pro\Views\Admin\CustomPostTypes\Map_Builder' => $baseDir . '/includes/Pro/Views/Admin/CustomPostTypes/Map_Builder.php',
     'Lpac\Pro\Views\Frontend\Frontend' => $baseDir . '/includes/Pro/Views/Frontend/Frontend.php',
     'Lpac\Pro\Views\Frontend\Shortcodes' => $baseDir . '/includes/Pro/Views/Frontend/Shortcodes.php',
     'Lpac\Pro\Views\Frontend\WooCommerce_Account' => $baseDir . '/includes/Pro/Views/Frontend/WooCommerce_Account.php',
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/composer/autoload_real.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@

 // autoload_real.php @generated by Composer

-class ComposerAutoloaderInit8140b59f29551cb511efdbcac01103c3
+class ComposerAutoloaderInit993a252c6a799ab413a5a33aef64f5c5
 {
     private static $loader;

@@ -24,16 +24,16 @@

         require __DIR__ . '/platform_check.php';

-        spl_autoload_register(array('ComposerAutoloaderInit8140b59f29551cb511efdbcac01103c3', 'loadClassLoader'), true, true);
+        spl_autoload_register(array('ComposerAutoloaderInit993a252c6a799ab413a5a33aef64f5c5', 'loadClassLoader'), true, true);
         self::$loader = $loader = new ComposerAutoloadClassLoader(dirname(__DIR__));
-        spl_autoload_unregister(array('ComposerAutoloaderInit8140b59f29551cb511efdbcac01103c3', 'loadClassLoader'));
+        spl_autoload_unregister(array('ComposerAutoloaderInit993a252c6a799ab413a5a33aef64f5c5', 'loadClassLoader'));

         require __DIR__ . '/autoload_static.php';
-        call_user_func(ComposerAutoloadComposerStaticInit8140b59f29551cb511efdbcac01103c3::getInitializer($loader));
+        call_user_func(ComposerAutoloadComposerStaticInit993a252c6a799ab413a5a33aef64f5c5::getInitializer($loader));

         $loader->register(true);

-        $filesToLoad = ComposerAutoloadComposerStaticInit8140b59f29551cb511efdbcac01103c3::$files;
+        $filesToLoad = ComposerAutoloadComposerStaticInit993a252c6a799ab413a5a33aef64f5c5::$files;
         $requireFile = Closure::bind(static function ($fileIdentifier, $file) {
             if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
                 $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/composer/autoload_static.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/composer/autoload_static.php
@@ -4,7 +4,7 @@

 namespace ComposerAutoload;

-class ComposerStaticInit8140b59f29551cb511efdbcac01103c3
+class ComposerStaticInit993a252c6a799ab413a5a33aef64f5c5
 {
     public static $files = array (
         '8d50dc88e56bace65e1e72f6017983ed' => __DIR__ . '/..' . '/freemius/wordpress-sdk/start.php',
@@ -242,6 +242,7 @@
         'Lpac\Controllers\Shortcodes' => __DIR__ . '/../..' . '/includes/Controllers/Shortcodes.php',
         'Lpac\Controllers\SiteWide\InlineScriptsController' => __DIR__ . '/../..' . '/includes/Controllers/SiteWide/InlineScriptsController.php',
         'Lpac\Helpers\Functions' => __DIR__ . '/../..' . '/includes/Helpers/Functions.php',
+        'Lpac\Helpers\Logger' => __DIR__ . '/../..' . '/includes/Helpers/Logger.php',
         'Lpac\Helpers\QR_Code_Generator' => __DIR__ . '/../..' . '/includes/Helpers/QR_Code_Generator.php',
         'Lpac\Helpers\Utilities' => __DIR__ . '/../..' . '/includes/Helpers/Utilities.php',
         'Lpac\KikoteActivator' => __DIR__ . '/../..' . '/includes/KikoteActivator.php',
@@ -258,7 +259,7 @@
         'Lpac\Notices\Review_Notices' => __DIR__ . '/../..' . '/includes/Notices/Review_Notices.php',
         'Lpac\Notices\Upsells_Notices' => __DIR__ . '/../..' . '/includes/Notices/Upsells_Notices.php',
         'Lpac\Pro\Controllers\AdminSettingsController' => __DIR__ . '/../..' . '/includes/Pro/Controllers/AdminSettingsController.php',
-        'Lpac\Pro\Controllers\Admin\Custom_Post_Types' => __DIR__ . '/../..' . '/includes/Pro/Controllers/Admin/Custom_Post_Types.php',
+        'Lpac\Pro\Controllers\Admin\CustomPostTypes' => __DIR__ . '/../..' . '/includes/Pro/Controllers/Admin/CustomPostTypes.php',
         'Lpac\Pro\Controllers\Checkout_Page\Controller' => __DIR__ . '/../..' . '/includes/Pro/Controllers/Checkout_Page/Controller.php',
         'Lpac\Pro\Controllers\Checkout_Page\StoreLocations\ShippingMethods' => __DIR__ . '/../..' . '/includes/Pro/Controllers/Checkout_Page/StoreLocations/ShippingMethods.php',
         'Lpac\Pro\Controllers\Checkout_Page\Validate' => __DIR__ . '/../..' . '/includes/Pro/Controllers/Checkout_Page/Validate.php',
@@ -270,7 +271,7 @@
         'Lpac\Pro\Controllers\Shipping\SetupSession' => __DIR__ . '/../..' . '/includes/Pro/Controllers/Shipping/SetupSession.php',
         'Lpac\Pro\Controllers\WooCommerce_Account' => __DIR__ . '/../..' . '/includes/Pro/Controllers/WooCommerce_Account.php',
         'Lpac\Pro\Helpers\Functions' => __DIR__ . '/../..' . '/includes/Pro/Helpers/Functions.php',
-        'Lpac\Pro\Models\Admin\Custom_Post_Types\Map_Builder' => __DIR__ . '/../..' . '/includes/Pro/Models/Admin/Custom_Post_Types/Map_Builder.php',
+        'Lpac\Pro\Models\Admin\CustomPostTypes\Map_Builder' => __DIR__ . '/../..' . '/includes/Pro/Models/Admin/CustomPostTypes/Map_Builder.php',
         'Lpac\Pro\Models\Draw_Shipping_Region' => __DIR__ . '/../..' . '/includes/Pro/Models/Draw_Shipping_Region.php',
         'Lpac\Pro\Models\Export_Orders' => __DIR__ . '/../..' . '/includes/Pro/Models/Export_Orders.php',
         'Lpac\Pro\Models\Location_Details' => __DIR__ . '/../..' . '/includes/Pro/Models/Location_Details.php',
@@ -282,7 +283,7 @@
         'Lpac\Pro\Models\WooCommerce_Account' => __DIR__ . '/../..' . '/includes/Pro/Models/WooCommerce_Account.php',
         'Lpac\Pro\Views\Admin\Admin' => __DIR__ . '/../..' . '/includes/Pro/Views/Admin/Admin.php',
         'Lpac\Pro\Views\Admin\Admin_Settings' => __DIR__ . '/../..' . '/includes/Pro/Views/Admin/Admin_Settings.php',
-        'Lpac\Pro\Views\Admin\Custom_Post_Types\Map_Builder' => __DIR__ . '/../..' . '/includes/Pro/Views/Admin/Custom_Post_Types/Map_Builder.php',
+        'Lpac\Pro\Views\Admin\CustomPostTypes\Map_Builder' => __DIR__ . '/../..' . '/includes/Pro/Views/Admin/CustomPostTypes/Map_Builder.php',
         'Lpac\Pro\Views\Frontend\Frontend' => __DIR__ . '/../..' . '/includes/Pro/Views/Frontend/Frontend.php',
         'Lpac\Pro\Views\Frontend\Shortcodes' => __DIR__ . '/../..' . '/includes/Pro/Views/Frontend/Shortcodes.php',
         'Lpac\Pro\Views\Frontend\WooCommerce_Account' => __DIR__ . '/../..' . '/includes/Pro/Views/Frontend/WooCommerce_Account.php',
@@ -298,9 +299,9 @@
     public static function getInitializer(ClassLoader $loader)
     {
         return Closure::bind(function () use ($loader) {
-            $loader->prefixLengthsPsr4 = ComposerStaticInit8140b59f29551cb511efdbcac01103c3::$prefixLengthsPsr4;
-            $loader->prefixDirsPsr4 = ComposerStaticInit8140b59f29551cb511efdbcac01103c3::$prefixDirsPsr4;
-            $loader->classMap = ComposerStaticInit8140b59f29551cb511efdbcac01103c3::$classMap;
+            $loader->prefixLengthsPsr4 = ComposerStaticInit993a252c6a799ab413a5a33aef64f5c5::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInit993a252c6a799ab413a5a33aef64f5c5::$prefixDirsPsr4;
+            $loader->classMap = ComposerStaticInit993a252c6a799ab413a5a33aef64f5c5::$classMap;

         }, null, ClassLoader::class);
     }
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/composer/installed.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/composer/installed.php
@@ -3,7 +3,7 @@
         'name' => '__root__',
         'pretty_version' => 'dev-main',
         'version' => 'dev-main',
-        'reference' => '73f015c4073ad963fa15cdab64786e84e9445833',
+        'reference' => 'a39b778a137a4866721075485358f6b084c054d1',
         'type' => 'library',
         'install_path' => __DIR__ . '/../../',
         'aliases' => array(),
@@ -13,7 +13,7 @@
         '__root__' => array(
             'pretty_version' => 'dev-main',
             'version' => 'dev-main',
-            'reference' => '73f015c4073ad963fa15cdab64786e84e9445833',
+            'reference' => 'a39b778a137a4866721075485358f6b084c054d1',
             'type' => 'library',
             'install_path' => __DIR__ . '/../../',
             'aliases' => array(),
@@ -47,9 +47,9 @@
             'dev_requirement' => false,
         ),
         'freemius/wordpress-sdk' => array(
-            'pretty_version' => '2.10.1',
-            'version' => '2.10.1.0',
-            'reference' => '5f57de9d7504b37b0ee9f5da44b6699c99854dd2',
+            'pretty_version' => '2.12.0',
+            'version' => '2.12.0.0',
+            'reference' => 'db6f35a2b3d318a53330409dbeab49156ee76dd8',
             'type' => 'library',
             'install_path' => __DIR__ . '/../freemius/wordpress-sdk',
             'aliases' => array(),
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/class-freemius.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/class-freemius.php
@@ -3629,7 +3629,7 @@

             $this->delete_current_install( false );

-            $license_key = false;
+            $license = null;

             if (
                 is_object( $this->_license ) &&
@@ -3637,20 +3637,21 @@
                     ( WP_FS__IS_LOCALHOST_FOR_SERVER || FS_Site::is_localhost_by_address( self::get_unfiltered_site_url() ) )
                 )
             ) {
-                $license_key = $this->_license->secret_key;
+                $license = $this->_license;
             }

             return $this->opt_in(
                 false,
                 false,
                 false,
-                $license_key,
+                ( is_object( $license ) ? $license->secret_key : false ),
                 false,
                 false,
                 false,
                 null,
                 array(),
-                false
+                false,
+                ( is_object( $license ) ? $license->user_id : null )
             );
         }

@@ -7659,7 +7660,14 @@
                     $parent_fs->get_current_or_network_user()->email,
                     false,
                     false,
-                    $license->secret_key
+                    $license->secret_key,
+                    false,
+                    false,
+                    false,
+                    null,
+                    array(),
+                    true,
+                    $license->user_id
                 );
             } else {
                 // Activate the license.
@@ -7723,7 +7731,9 @@
                     false,
                     false,
                     null,
-                    $sites
+                    $sites,
+                    true,
+                    $license->user_id
                 );
             } else {
                 $blog_2_install_map = array();
@@ -7777,7 +7787,7 @@
          * @param array             $sites
          * @param int               $blog_id
          */
-        private function maybe_activate_bundle_license( FS_Plugin_License $license = null, $sites = array(), $blog_id = 0 ) {
+        private function maybe_activate_bundle_license( $license = null, $sites = array(), $blog_id = 0 ) {
             if ( ! is_object( $license ) && $this->has_active_valid_license() ) {
                 $license = $this->_license;
             }
@@ -7949,7 +7959,8 @@
                     null,
                     null,
                     $sites,
-                    ( $current_blog_id > 0 ? $current_blog_id : null )
+                    ( $current_blog_id > 0 ? $current_blog_id : null ),
+                    $license->user_id
                 );
             }
         }
@@ -11576,7 +11587,7 @@
                         continue;
                     }

-                    $missing_plan = self::_get_plan_by_id( $plan_id );
+                    $missing_plan = self::_get_plan_by_id( $plan_id, false );

                     if ( is_object( $missing_plan ) ) {
                         $plans[] = $missing_plan;
@@ -11738,10 +11749,10 @@
          *
          * @return FS_Plugin_Plan|false
          */
-        function _get_plan_by_id( $id ) {
+        function _get_plan_by_id( $id, $allow_sync = true ) {
             $this->_logger->entrance();

-            if ( ! is_array( $this->_plans ) || 0 === count( $this->_plans ) ) {
+            if ( $allow_sync && ( ! is_array( $this->_plans ) || 0 === count( $this->_plans ) ) ) {
                 $this->_sync_plans();
             }

@@ -12385,7 +12396,7 @@
          *
          * @param FS_Plugin_License $license
          */
-        private function set_license( FS_Plugin_License $license = null ) {
+        private function set_license( $license = null ) {
             $this->_license = $license;

             $this->maybe_update_whitelabel_flag( $license );
@@ -13485,7 +13496,8 @@
                 fs_request_get( 'module_id', null, 'post' ),
                 fs_request_get( 'user_id', null ),
                 fs_request_get_bool( 'is_extensions_tracking_allowed', null ),
-                fs_request_get_bool( 'is_diagnostic_tracking_allowed', null )
+                fs_request_get_bool( 'is_diagnostic_tracking_allowed', null ),
+                fs_request_get( 'license_owner_id', null )
             );

             if (
@@ -13634,6 +13646,7 @@
          * @param null|number $plugin_id
          * @param array       $sites
          * @param int         $blog_id
+         * @param null|number $license_owner_id
          *
          * @return array {
          *      @var bool   $success
@@ -13648,7 +13661,8 @@
             $is_marketing_allowed = null,
             $plugin_id = null,
             $sites = array(),
-            $blog_id = null
+            $blog_id = null,
+            $license_owner_id = null
         ) {
             $this->_logger->entrance();

@@ -13659,7 +13673,11 @@
                     $sites,
                 $is_marketing_allowed,
                 $blog_id,
-                $plugin_id
+                $plugin_id,
+                null,
+                null,
+                null,
+                $license_owner_id
             );

             // No need to show the sticky after license activation notice after migrating a license.
@@ -13733,9 +13751,10 @@
          * @param null|bool   $is_marketing_allowed
          * @param null|int    $blog_id
          * @param null|number $plugin_id
-         * @param null|number $license_owner_id
+         * @param null|number $user_id
          * @param bool|null   $is_extensions_tracking_allowed
          * @param bool|null   $is_diagnostic_tracking_allowed Since 2.5.0.2 to allow license activation with minimal data footprint.
+         * @param null|number $license_owner_id
          *
          *
          * @return array {
@@ -13750,9 +13769,10 @@
             $is_marketing_allowed = null,
             $blog_id = null,
             $plugin_id = null,
-            $license_owner_id = null,
+            $user_id = null,
             $is_extensions_tracking_allowed = null,
-            $is_diagnostic_tracking_allowed = null
+            $is_diagnostic_tracking_allowed = null,
+            $license_owner_id = null
         ) {
             $this->_logger->entrance();

@@ -13841,10 +13861,10 @@

                         $install_ids = array();

-                        $change_owner = FS_User::is_valid_id( $license_owner_id );
+                        $change_owner = FS_User::is_valid_id( $user_id );

                         if ( $change_owner ) {
-                            $params['user_id'] = $license_owner_id;
+                            $params['user_id'] = $user_id;

                             $installs_info_by_slug_map = $fs->get_parent_and_addons_installs_info();

@@ -13920,7 +13940,9 @@
                     false,
                     false,
                     $is_marketing_allowed,
-                    $sites
+                    $sites,
+                    true,
+                    $license_owner_id
                 );

                 if ( isset( $next_page->error ) ) {
@@ -15630,7 +15652,7 @@
          *
          * @return bool Since 2.3.1 returns if a switch was made.
          */
-        function switch_to_blog( $blog_id, FS_Site $install = null, $flush = false ) {
+        function switch_to_blog( $blog_id, $install = null, $flush = false ) {
             if ( ! is_numeric( $blog_id ) ) {
                 return false;
             }
@@ -16936,14 +16958,13 @@
          *
          * @param array         $override_with
          * @param bool|int|null $network_level_or_blog_id If true, return params for network level opt-in. If integer, get params for specified blog in the network.
+         * @param bool          $skip_user_info
          *
          * @return array
          */
-        function get_opt_in_params( $override_with = array(), $network_level_or_blog_id = null ) {
+        function get_opt_in_params( $override_with = array(), $network_level_or_blog_id = null, $skip_user_info = false ) {
             $this->_logger->entrance();

-            $current_user = self::_get_current_wp_user();
-
             $activation_action = $this->get_unique_affix() . '_activate_new';
             $return_url        = $this->is_anonymous() ?
                 // If skipped already, then return to the account page.
@@ -16954,9 +16975,6 @@
             $versions = $this->get_versions();

             $params = array_merge( $versions, array(
-                'user_firstname'    => $current_user->user_firstname,
-                'user_lastname'     => $current_user->user_lastname,
-                'user_email'        => $current_user->user_email,
                 'plugin_slug'       => $this->_slug,
                 'plugin_id'         => $this->get_id(),
                 'plugin_public_key' => $this->get_public_key(),
@@ -16972,6 +16990,21 @@
                 'is_localhost'      => WP_FS__IS_LOCALHOST,
             ) );

+            if (
+                ! $skip_user_info &&
+                (
+                    empty( $override_with['user_firstname'] ) ||
+                    empty( $override_with['user_lastname'] ) ||
+                    empty( $override_with['user_email'] )
+                )
+            ) {
+                $current_user = self::_get_current_wp_user();
+
+                $params['user_firstname'] = $current_user->user_firstname;
+                $params['user_lastname']  = $current_user->user_lastname;
+                $params['user_email']     = $current_user->user_email;
+            }
+
             if ( $this->is_addon() ) {
                 $parent_fs = $this->get_parent_instance();

@@ -17051,6 +17084,7 @@
          * @param null|bool   $is_marketing_allowed
          * @param array       $sites                If network-level opt-in, an array of containing details of sites.
          * @param bool        $redirect
+         * @param null|number $license_owner_id
          *
          * @return string|object
          * @use    WP_Error
@@ -17065,15 +17099,11 @@
             $is_disconnected = false,
             $is_marketing_allowed = null,
             $sites = array(),
-            $redirect = true
+            $redirect = true,
+            $license_owner_id = null
         ) {
             $this->_logger->entrance();

-            if ( false === $email ) {
-                $current_user = self::_get_current_wp_user();
-                $email        = $current_user->user_email;
-            }
-
             /**
              * @since 1.2.1 If activating with license key, ignore the context-user
              *              since the user will be automatically loaded from the license.
@@ -17083,6 +17113,11 @@
                 $this->_storage->remove( 'pending_license_key' );

                 if ( ! $is_uninstall ) {
+                    if ( false === $email ) {
+                        $current_user = self::_get_current_wp_user();
+                        $email        = $current_user->user_email;
+                    }
+
                     $fs_user = Freemius::_get_user_by_email( $email );
                     if ( is_object( $fs_user ) && ! $this->is_pending_activation() ) {
                         return $this->install_with_user(
@@ -17097,15 +17132,22 @@
                 }
             }

+            $skip_user_info = ( ! empty( $license_key ) && FS_User::is_valid_id( $license_owner_id ) );
+
             $user_info = array();
-            if ( ! empty( $email ) ) {
-                $user_info['user_email'] = $email;
-            }
-            if ( ! empty( $first ) ) {
-                $user_info['user_firstname'] = $first;
-            }
-            if ( ! empty( $last ) ) {
-                $user_info['user_lastname'] = $last;
+
+            if ( ! $skip_user_info ) {
+                if ( ! empty( $email ) ) {
+               	    $user_info['user_email'] = $email;
+                }
+
+                if ( ! empty( $first ) ) {
+               	    $user_info['user_firstname'] = $first;
+                }
+
+                if ( ! empty( $last ) ) {
+               	    $user_info['user_lastname'] = $last;
+                }
             }

             if ( ! empty( $sites ) ) {
@@ -17116,7 +17158,7 @@
                 $is_network = false;
             }

-            $params = $this->get_opt_in_params( $user_info, $is_network );
+            $params = $this->get_opt_in_params( $user_info, $is_network, $skip_user_info );

             $filtered_license_key = false;
             if ( is_string( $license_key ) ) {
@@ -18112,7 +18154,7 @@
         private function _activate_addon_account(
             Freemius $parent_fs,
             $network_level_or_blog_id = null,
-            FS_Plugin_License $bundle_license = null
+            $bundle_license = null
         ) {
             if ( $this->is_registered() ) {
                 // Already activated.
@@ -18745,7 +18787,7 @@
          * @return bool
          */
         function is_pricing_page_visible() {
-            return (
+            $visible = (
                 // Has at least one paid plan.
                 $this->has_paid_plan() &&
                 // Didn't ask to hide the pricing page.
@@ -18753,6 +18795,8 @@
                 // Don't have a valid active license or has more than one plan.
                 ( ! $this->is_paying() || ! $this->is_single_plan( true ) )
             );
+
+            return $this->apply_filters( 'is_pricing_page_visible', $visible );
         }

         /**
@@ -19708,7 +19752,7 @@
          * @param null|int $network_level_or_blog_id Since 2.0.0
          * @param FS_Site $site                     Since 2.0.0
          */
-        private function _store_site( $store = true, $network_level_or_blog_id = null, FS_Site $site = null, $is_backup = false ) {
+        private function _store_site( $store = true, $network_level_or_blog_id = null, $site = null, $is_backup = false ) {
             $this->_logger->entrance();

             if ( is_null( $site ) ) {
@@ -21548,7 +21592,14 @@
                         false,
                         false,
                         false,
-                        $premium_license->secret_key
+                        $premium_license->secret_key,
+                        false,
+                        false,
+                        false,
+                        null,
+                        array(),
+                        true,
+                        $premium_license->user_id
                     );

                     return;
@@ -24000,13 +24051,15 @@

             // Start trial button.
             $button = ' ' . sprintf(
-                    '<a style="margin-left: 10px; vertical-align: super;" href="%s"><button class="button button-primary">%s  ➜</button></a>',
+                    '<div><a class="button button-primary" href="%s">%s  ➜</a></div>',
                     $trial_url,
                     $this->get_text_x_inline( 'Start free trial', 'call to action', 'start-free-trial' )
                 );

+            $message_text = $this->apply_filters( 'trial_promotion_message', "{$message} {$cc_string}" );
+
             $this->_admin_notices->add_sticky(
-                $this->apply_filters( 'trial_promotion_message', "{$message} {$cc_string} {$button}" ),
+                "<div class="fs-trial-message-container"><div>{$message_text}</div> {$button}</div>",
                 'trial_promotion',
                 '',
                 'promotion'
@@ -25476,7 +25529,7 @@
                 $img_dir = WP_FS__DIR_IMG;

                 // Locate the main assets folder.
-                if ( 1 < count( $fs_active_plugins->plugins ) ) {
+                if ( ! empty( $fs_active_plugins->plugins ) ) {
                     $plugin_or_theme_img_dir = ( $this->is_plugin() ? WP_PLUGIN_DIR : get_theme_root( get_stylesheet() ) );

                     foreach ( $fs_active_plugins->plugins as $sdk_path => &$data ) {
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/class-fs-logger.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/class-fs-logger.php
@@ -636,7 +636,17 @@
 			$offset = 0,
 			$order = false
 		) {
-			global $wpdb;
+			if ( empty( $filename ) ) {
+				$filename = 'fs-logs-' . date( 'Y-m-d_H-i-s', WP_FS__SCRIPT_START_TIME ) . '.csv';
+			}
+
+			$upload_dir = wp_upload_dir();
+			$filepath   = rtrim( $upload_dir['path'], '/' ) . "/{$filename}";
+
+			WP_Filesystem();
+			if ( ! $GLOBALS['wp_filesystem']->is_writable( dirname( $filepath ) ) ) {
+				return false;
+			}

 			$query = self::build_db_logs_query(
 				$filters,
@@ -646,14 +656,6 @@
 				true
 			);

-			$upload_dir = wp_upload_dir();
-			if ( empty( $filename ) ) {
-				$filename = 'fs-logs-' . date( 'Y-m-d_H-i-s', WP_FS__SCRIPT_START_TIME ) . '.csv';
-			}
-			$filepath = rtrim( $upload_dir['path'], '/' ) . "/{$filename}";
-
-			$query .= " INTO OUTFILE '{$filepath}' FIELDS TERMINATED BY 't' ESCAPED BY '\\' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'";
-
 			$columns = '';
 			for ( $i = 0, $len = count( self::$_log_columns ); $i < $len; $i ++ ) {
 				if ( $i > 0 ) {
@@ -665,12 +667,16 @@

 			$query = "SELECT {$columns} UNION ALL " . $query;

-			$result = $wpdb->query( $query );
+			$result = $GLOBALS['wpdb']->get_results( $query );

 			if ( false === $result ) {
 				return false;
 			}

+			if ( ! self::write_csv_to_filesystem( $filepath, $result ) ) {
+				return false;
+			}
+
 			return rtrim( $upload_dir['url'], '/' ) . '/' . $filename;
 		}

@@ -691,5 +697,32 @@
 			return rtrim( $upload_dir['url'], '/' ) . $filename;
 		}

+		/**
+		 * @param string $file_path
+		 * @param array  $query_results
+		 *
+		 * @return bool
+		 */
+		private static function write_csv_to_filesystem( $file_path, $query_results ) {
+			if ( empty( $query_results ) ) {
+				return false;
+			}
+
+			$content = '';
+
+			foreach ( $query_results as $row ) {
+				$row_data = array_map( function ( $value ) {
+					return str_replace( "n", ' ', $value );
+				}, (array) $row );
+				$content  .= implode( "t", $row_data ) . "n";
+			}
+
+			if ( ! $GLOBALS['wp_filesystem']->put_contents( $file_path, $content, FS_CHMOD_FILE ) ) {
+				return false;
+			}
+
+			return true;
+		}
+
 		#endregion
 	}
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/class-fs-plugin-updater.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/class-fs-plugin-updater.php
@@ -542,24 +542,8 @@

             global $wp_current_filter;

-            $current_plugin_version = $this->_fs->get_plugin_version();
-
-            if ( ! empty( $wp_current_filter ) && 'upgrader_process_complete' === $wp_current_filter[0] ) {
-                if (
-                    is_null( $this->_update_details ) ||
-                    ( is_object( $this->_update_details ) && $this->_update_details->new_version !== $current_plugin_version )
-                ) {
-                    /**
-                     * After an update, clear the stored update details and reparse the plugin's main file in order to get
-                     * the updated version's information and prevent the previous update information from showing up on the
-                     * updates page.
-                     *
-                     * @author Leo Fajardo (@leorw)
-                     * @since 2.3.1
-                     */
-                    $this->_update_details  = null;
-                    $current_plugin_version = $this->_fs->get_plugin_version( true );
-                }
+            if ( ! empty( $wp_current_filter ) && in_array( 'upgrader_process_complete', $wp_current_filter ) ) {
+                return $transient_data;
             }

             if ( ! isset( $this->_update_details ) ) {
@@ -568,7 +552,7 @@
                     false,
                     fs_request_get_bool( 'force-check' ),
                     FS_Plugin_Updater::UPDATES_CHECK_CACHE_EXPIRATION,
-                    $current_plugin_version
+                    $this->_fs->get_plugin_version()
                 );

                 $this->_update_details = false;
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/entities/class-fs-plugin-plan.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/entities/class-fs-plugin-plan.php
@@ -13,7 +13,6 @@
 	/**
 	 * Class FS_Plugin_Plan
 	 *
-	 * @property FS_Pricing[] $pricing
 	 */
 	class FS_Plugin_Plan extends FS_Entity {

--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/entities/class-fs-site.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/entities/class-fs-site.php
@@ -10,16 +10,16 @@
         exit;
     }

-    /**
-     * @property int $blog_id
-     */
-    #[AllowDynamicProperties]
     class FS_Site extends FS_Scope_Entity {
         /**
          * @var number
          */
         public $site_id;
         /**
+         * @var int
+         */
+        public $blog_id;
+        /**
          * @var number
          */
         public $plugin_id;
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/entities/class-fs-user.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/entities/class-fs-user.php
@@ -48,6 +48,19 @@
 			parent::__construct( $user );
 		}

+		/**
+		 * This method removes the deprecated 'is_beta' property from the serialized data.
+		 * Should clean up the serialized data to avoid PHP 8.2 warning on next execution.
+		 *
+		 * @return void
+		 */
+		function __wakeup() {
+			if ( property_exists( $this, 'is_beta' ) ) {
+				// If we enter here, and we are running PHP 8.2, we already had the warning. But we sanitize data for next execution.
+				unset( $this->is_beta );
+			}
+		}
+
 		function get_name() {
 			return trim( ucfirst( trim( is_string( $this->first ) ? $this->first : '' ) ) . ' ' . ucfirst( trim( is_string( $this->last ) ? $this->last : '' ) ) );
 		}
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/managers/class-fs-admin-menu-manager.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/managers/class-fs-admin-menu-manager.php
@@ -699,16 +699,36 @@
 				$menu = $this->find_main_submenu();
 			}

+			$menu_slug   = $menu['menu'][2];
 			$parent_slug = isset( $menu['parent_slug'] ) ?
-                $menu['parent_slug'] :
-                'admin.php';
+				$menu['parent_slug'] :
+				'admin.php';

-            return admin_url(
-                $parent_slug .
-                ( false === strpos( $parent_slug, '?' ) ? '?' : '&' ) .
-                'page=' .
-                $menu['menu'][2]
-            );
+			if ( fs_apply_filter( $this->_module_unique_affix, 'enable_cpt_advanced_menu_logic', false ) ) {
+				$parent_slug = 'admin.php';
+
+				/**
+				 * This line and the `if` block below it are based on the `menu_page_url()` function of WordPress.
+				 *
+				 * @author Leo Fajardo (@leorw)
+				 * @since 2.10.2
+				 */
+				global $_parent_pages;
+
+				if ( ! empty( $_parent_pages[ $menu_slug ] ) ) {
+					$_parent_slug = $_parent_pages[ $menu_slug ];
+					$parent_slug  = isset( $_parent_pages[ $_parent_slug ] ) ?
+						$parent_slug :
+						$menu['parent_slug'];
+				}
+			}
+
+			return admin_url(
+				$parent_slug .
+				( false === strpos( $parent_slug, '?' ) ? '?' : '&' ) .
+				'page=' .
+				$menu_slug
+			);
 		}

 		/**
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/managers/class-fs-admin-notice-manager.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/managers/class-fs-admin-notice-manager.php
@@ -194,8 +194,14 @@
          * @since  1.0.7
          */
         static function _add_sticky_dismiss_javascript() {
+            $sticky_admin_notice_js_template_name = 'sticky-admin-notice-js.php';
+
+            if ( ! file_exists( fs_get_template_path( $sticky_admin_notice_js_template_name ) ) ) {
+                return;
+            }
+
             $params = array();
-            fs_require_once_template( 'sticky-admin-notice-js.php', $params );
+            fs_require_once_template( $sticky_admin_notice_js_template_name, $params );
         }

         private static $_added_sticky_javascript = false;
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/managers/class-fs-clone-manager.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/includes/managers/class-fs-clone-manager.php
@@ -412,12 +412,12 @@
          * @author Vova Feldman (@svovaf)
          * @since 2.5.0
          *
-         * @param Freemius    $instance
-         * @param string|false $license_key
+         * @param Freemius               $instance
+         * @param FS_Plugin_License|null $license
          *
          * @return bool TRUE if successfully connected. FALSE if failed and had to restore install from backup.
          */
-        private function delete_install_and_connect( Freemius $instance, $license_key = false ) {
+        private function delete_install_and_connect( Freemius $instance, $license = null ) {
             $user = Freemius::_get_user_by_id( $instance->get_site()->user_id );

             $instance->delete_current_install( true );
@@ -430,6 +430,9 @@
                 $user = Freemius::_get_user_by_email( $current_user->user_email );
             }

+            $license_key      = ( is_object( $license ) ? $license->secret_key : false );
+            $license_owner_id = ( is_object( $license ) ? $license->user_id : null );
+
             if ( is_object( $user ) ) {
                 // When a clone is found, we prefer to use the same user of the original install for the opt-in.
                 $instance->install_with_user( $user, $license_key, false, false );
@@ -439,7 +442,14 @@
                     false,
                     false,
                     false,
-                    $license_key
+                    $license_key,
+                    false,
+                    false,
+                    false,
+                    null,
+                    array(),
+                    true,
+                    $license_owner_id
                 );
             }

@@ -505,7 +515,7 @@
             }

             // If the site is a clone of another subsite in the network, or a localhost one, try to auto activate the license.
-            return $this->delete_install_and_connect( $instance, $license->secret_key );
+            return $this->delete_install_and_connect( $instance, $license );
         }

         /**
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/start.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/start.php
@@ -7,7 +7,7 @@
 	 */

 	if ( ! defined( 'ABSPATH' ) ) {
-		exit;
+		return;
 	}

 	/**
@@ -15,7 +15,7 @@
 	 *
 	 * @var string
 	 */
-	$this_sdk_version = '2.10.1';
+	$this_sdk_version = '2.12.0';

 	#region SDK Selection Logic --------------------------------------------------------------------

@@ -90,8 +90,8 @@
      * @author Leo Fajardo (@leorw)
      * @since 2.2.3
      */
-	$themes_directory         = get_theme_root( get_stylesheet() );
-	$themes_directory_name    = basename( $themes_directory );
+	$themes_directory      = fs_normalize_path( get_theme_root( get_stylesheet() ) );
+	$themes_directory_name = basename( $themes_directory );

     // This change ensures that the condition works even if the SDK is located in a subdirectory (e.g., vendor)
     $theme_candidate_sdk_basename = str_replace( $themes_directory . '/' . get_stylesheet() . '/', '', $fs_root_path );
@@ -128,12 +128,16 @@
          * The check of `fs_find_direct_caller_plugin_file` determines that this file was indeed included by a different plugin than the main plugin.
          */
         if ( DIRECTORY_SEPARATOR . $this_sdk_relative_path === $fs_root_path && function_exists( 'fs_find_direct_caller_plugin_file' ) ) {
-            $original_plugin_dir_name = dirname( fs_find_direct_caller_plugin_file( $file_path ) );
+            $direct_caller_plugin_file = fs_find_direct_caller_plugin_file( $file_path );
+
+            if ( ! empty( $direct_caller_plugin_file ) ) {
+                $original_plugin_dir_name = dirname( $direct_caller_plugin_file );

-            // Remove everything before the original plugin directory name.
-            $this_sdk_relative_path = substr( $this_sdk_relative_path, strpos( $this_sdk_relative_path, $original_plugin_dir_name ) );
+                // Remove everything before the original plugin directory name.
+                $this_sdk_relative_path = substr( $this_sdk_relative_path, strpos( $this_sdk_relative_path, $original_plugin_dir_name ) );

-            unset( $original_plugin_dir_name );
+                unset( $original_plugin_dir_name );
+            }
         }
     }

@@ -441,6 +445,7 @@
 	 *      fs_is_submenu_visible_{plugin_slug}
 	 *      fs_plugin_icon_{plugin_slug}
 	 *      fs_show_trial_{plugin_slug}
+	 *      fs_is_pricing_page_visible_{plugin_slug}
 	 *
 	 * --------------------------------------------------------
 	 *
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/templates/add-ons.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/templates/add-ons.php
@@ -374,6 +374,12 @@
 	</div>
 	<script type="text/javascript">
 		(function( $, undef ) {
+			$( 'a.thickbox' ).on( 'click', function () {
+				setTimeout( function () {
+					$( '#TB_window' ).addClass( 'plugin-details-modal' );
+				}, 0 );
+			} );
+
 			<?php if ( $open_addon ) : ?>

 			var interval = setInterval(function () {
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/templates/checkout/process-redirect.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/templates/checkout/process-redirect.php
@@ -51,16 +51,36 @@

         $loader.show();

-        switch ( action ) {
-            case 'install':
-                processInstall( data );
-                break;
-            case 'pending_activation':
-                processPendingActivation( data );
-                break;
-            default:
-                syncLicense( data );
-                break;
+        // This remains compatible with the same filter in /templates/checkout/frame.php.
+        // You can return a promise to make the successive redirection wait until your own processing is completed.
+        // However for most cases, we recommend sending a beacon request {https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon}
+        var processPurchaseEvent = (<?php echo $fs->apply_filters('checkout/purchaseCompleted', 'function (data) {
+            console.log("checkout", "purchaseCompleted");
+        }'); ?>)(data.purchaseData);
+
+        if (typeof Promise !== 'undefined' && processPurchaseEvent instanceof Promise) {
+            processPurchaseEvent.finally(function () {
+                finishProcessing(action, data);
+            });
+        } else {
+            finishProcessing(action, data);
+        }
+
+        function finishProcessing(action, data) {
+            switch ( action ) {
+                case 'install':
+                    processInstall( data );
+                    break;
+                case 'pending_activation':
+                    processPendingActivation( data );
+                    break;
+                case 'return_without_sync':
+                    goToAccount();
+                    break;
+                default:
+                    syncLicense( data );
+                    break;
+            }
         }

         function processInstall( data ) {
@@ -101,5 +121,9 @@

             window.location.href = redirectUrl.toString();
         }
+
+        function goToAccount() {
+            window.location.href = <?php echo wp_json_encode( $fs->get_account_url() ) ?>;
+        }
     });
 </script>
--- a/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/templates/connect.php
+++ b/map-location-picker-at-checkout-for-woocommerce/vendor/freemius/wordpress-sdk/templates/connect.php
@@ -336,6 +336,9 @@
                         </label>
                     </div>
                 </div>
+                <div id="fs_orphan_license_message">
+                    <span class="fs-message"><?php fs_echo_inline( "A user has not yet been associated with the license, which is necessary to prevent unauthorized activation. To assign the license to your user, you agree to share your WordPress user's full name and email address." ) ?></span>
+                </div>
 			<?php endif ?>
 			<?php if ( $is_network_level_activation ) : ?>
             <?php
@@ -739,10 +742,11 @@
 					var
                         licenseKey = $licenseKeyInput.val(),
                         data       = {
-                            action     : action,
-                            security   : security,
-                            license_key: licenseKey,
-                            module_id  : '<?php echo $fs->get_id() ?>'
+                            action          : action,
+                            security        : security,
+                            license_key     : licenseKey,
+                            module_id       : '<?php echo $fs->get_id() ?>',
+                            license_owner_id: licenseOwnerIDByLicense[ licenseKey ]
                         };

 					if (
@@ -915,14 +919,14 @@

 					if ('' === key) {
 						$primaryCta.attr('disabled', 'disabled');
-                        $marketingOptin.hide();
+						hideOptinAndLicenseMessage();
 					} else {
                         $primaryCta.prop('disabled', false);

                         if (32 <= key.length){
                             fetchIsMarketingAllowedFlagAndToggleOptin();
                         } else {
-                            $marketingOptin.hide();
+                            hideOptinAndLicenseMessage();
                         }
 					}

@@ -958,8 +962,10 @@
 		//region GDPR
 		//--------------------------------------------------------------------------------
         var isMarketingAllowedByLicense = {},
-            $marketingOptin = $('#fs_marketing_optin'),
-            previousLicenseKey = null;
+            licenseOwnerIDByLicense     = {},
+            $marketingOptin             = $( '#fs_marketing_optin' ),
+            $orphanLicenseMessage       = $( '#fs_orphan_license_message' ),
+            previousLicenseKey          = null;

 		if (requireLicenseKey) {

@@ -981,6 +987,14 @@
                             $marketingOptin.hide();
                             $primaryCta.focus();
                         }
+
+                        $orphanLicenseMessage.toggle( false === licenseOwnerIDByLicense[ licenseKey ] );
+
+                        if ( false !== licenseOwnerIDByLicense[ licenseKey ] ) {
+                            $( 'input[name=user_firstname]' ).remove();
+                            $( 'input[name=user_lastname]' ).remove();
+                            $( 'input[name=user_email]' ).remove();
+                        }
                     },
    

Frequently Asked Questions

How Atomic Edge Works

Simple Setup. Powerful Security.

Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.

Get Started

Trusted by Developers & Organizations

Trusted by Developers
Blac&kMcDonaldCovenant House TorontoAlzheimer Society CanadaUniversity of TorontoHarvard Medical School