/** * Astra Updates * * Functions for updating data, used by the background updater. * * @package Astra * @version 2.1.3 */ defined( 'ABSPATH' ) || exit; /** * Clear Astra + Astra Pro assets cache. * * @since 3.6.1 * @return void. */ function astra_clear_all_assets_cache() { if ( ! class_exists( 'Astra_Cache_Base' ) ) { return; } // Clear Astra theme asset cache. $astra_cache_base_instance = new Astra_Cache_Base( 'astra' ); $astra_cache_base_instance->refresh_assets( 'astra' ); // Clear Astra Addon's static and dynamic CSS asset cache. $astra_addon_cache_base_instance = new Astra_Cache_Base( 'astra-addon' ); $astra_addon_cache_base_instance->refresh_assets( 'astra-addon' ); } /** * 4.0.0 backward handling part. * * 1. Migrate existing setting & do required onboarding for new admin dashboard v4.0.0 app. * 2. Migrating Post Structure & Meta options in title area meta parts. * * @since 4.0.0 * @return void */ function astra_theme_background_updater_4_0_0() { // Dynamic customizer migration starts here. $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['dynamic-blog-layouts'] ) && ! isset( $theme_options['theme-dynamic-customizer-support'] ) ) { $theme_options['dynamic-blog-layouts'] = false; $theme_options['theme-dynamic-customizer-support'] = true; $post_types = Astra_Posts_Structure_Loader::get_supported_post_types(); // Archive summary box compatibility. $archive_title_font_size = array( 'desktop' => isset( $theme_options['font-size-archive-summary-title']['desktop'] ) ? $theme_options['font-size-archive-summary-title']['desktop'] : 40, 'tablet' => isset( $theme_options['font-size-archive-summary-title']['tablet'] ) ? $theme_options['font-size-archive-summary-title']['tablet'] : '', 'mobile' => isset( $theme_options['font-size-archive-summary-title']['mobile'] ) ? $theme_options['font-size-archive-summary-title']['mobile'] : '', 'desktop-unit' => isset( $theme_options['font-size-archive-summary-title']['desktop-unit'] ) ? $theme_options['font-size-archive-summary-title']['desktop-unit'] : 'px', 'tablet-unit' => isset( $theme_options['font-size-archive-summary-title']['tablet-unit'] ) ? $theme_options['font-size-archive-summary-title']['tablet-unit'] : 'px', 'mobile-unit' => isset( $theme_options['font-size-archive-summary-title']['mobile-unit'] ) ? $theme_options['font-size-archive-summary-title']['mobile-unit'] : 'px', ); $single_title_font_size = array( 'desktop' => isset( $theme_options['font-size-entry-title']['desktop'] ) ? $theme_options['font-size-entry-title']['desktop'] : '', 'tablet' => isset( $theme_options['font-size-entry-title']['tablet'] ) ? $theme_options['font-size-entry-title']['tablet'] : '', 'mobile' => isset( $theme_options['font-size-entry-title']['mobile'] ) ? $theme_options['font-size-entry-title']['mobile'] : '', 'desktop-unit' => isset( $theme_options['font-size-entry-title']['desktop-unit'] ) ? $theme_options['font-size-entry-title']['desktop-unit'] : 'px', 'tablet-unit' => isset( $theme_options['font-size-entry-title']['tablet-unit'] ) ? $theme_options['font-size-entry-title']['tablet-unit'] : 'px', 'mobile-unit' => isset( $theme_options['font-size-entry-title']['mobile-unit'] ) ? $theme_options['font-size-entry-title']['mobile-unit'] : 'px', ); $archive_summary_box_bg = array( 'desktop' => array( 'background-color' => ! empty( $theme_options['archive-summary-box-bg-color'] ) ? $theme_options['archive-summary-box-bg-color'] : '', 'background-image' => '', 'background-repeat' => 'repeat', 'background-position' => 'center center', 'background-size' => 'auto', 'background-attachment' => 'scroll', 'background-type' => '', 'background-media' => '', ), 'tablet' => array( 'background-color' => '', 'background-image' => '', 'background-repeat' => 'repeat', 'background-position' => 'center center', 'background-size' => 'auto', 'background-attachment' => 'scroll', 'background-type' => '', 'background-media' => '', ), 'mobile' => array( 'background-color' => '', 'background-image' => '', 'background-repeat' => 'repeat', 'background-position' => 'center center', 'background-size' => 'auto', 'background-attachment' => 'scroll', 'background-type' => '', 'background-media' => '', ), ); // Single post structure. foreach ( $post_types as $index => $post_type ) { /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $single_post_structure = isset( $theme_options['blog-single-post-structure'] ) ? $theme_options['blog-single-post-structure'] : array( 'single-image', 'single-title-meta' ); /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $migrated_post_structure = array(); if ( ! empty( $single_post_structure ) ) { /** @psalm-suppress PossiblyInvalidIterator */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort foreach ( $single_post_structure as $key ) { /** @psalm-suppress PossiblyInvalidIterator */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( 'single-title-meta' === $key ) { $migrated_post_structure[] = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-title'; if ( 'post' === $post_type ) { $migrated_post_structure[] = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-meta'; } } if ( 'single-image' === $key ) { $migrated_post_structure[] = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-image'; } } $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-structure' ] = $migrated_post_structure; } // Single post meta. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $single_post_meta = isset( $theme_options['blog-single-meta'] ) ? $theme_options['blog-single-meta'] : array( 'comments', 'category', 'author' ); /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $migrated_post_metadata = array(); if ( ! empty( $single_post_meta ) ) { $tax_counter = 0; $tax_slug = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-taxonomy'; /** @psalm-suppress PossiblyInvalidIterator */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort foreach ( $single_post_meta as $key ) { /** @psalm-suppress PossiblyInvalidIterator */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort switch ( $key ) { case 'author': $migrated_post_metadata[] = 'author'; break; case 'date': $migrated_post_metadata[] = 'date'; break; case 'comments': $migrated_post_metadata[] = 'comments'; break; case 'category': if ( 'post' === $post_type ) { $migrated_post_metadata[] = $tax_slug; $theme_options[ $tax_slug ] = 'category'; $tax_counter = ++$tax_counter; $tax_slug = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-taxonomy-' . $tax_counter; } break; case 'tag': if ( 'post' === $post_type ) { $migrated_post_metadata[] = $tax_slug; $theme_options[ $tax_slug ] = 'post_tag'; $tax_counter = ++$tax_counter; $tax_slug = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-taxonomy-' . $tax_counter; } break; default: break; } } $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-metadata' ] = $migrated_post_metadata; } // Archive layout compatibilities. $archive_banner_layout = ( class_exists( 'WooCommerce' ) && 'product' === $post_type ) ? false : true; // Setting WooCommerce archive option disabled as WC already added their header content on archive. $theme_options[ 'ast-archive-' . esc_attr( $post_type ) . '-title' ] = $archive_banner_layout; // Single layout compatibilities. $single_banner_layout = ( class_exists( 'WooCommerce' ) && 'product' === $post_type ) ? false : true; // Setting WC single option disabled as there is no any header set from default WooCommerce. $theme_options[ 'ast-single-' . esc_attr( $post_type ) . '-title' ] = $single_banner_layout; // BG color support. $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-banner-image-type' ] = ! empty( $theme_options['archive-summary-box-bg-color'] ) ? 'custom' : 'none'; $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-banner-custom-bg' ] = $archive_summary_box_bg; // Archive title font support. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-title-font-family' ] = ! empty( $theme_options['font-family-archive-summary-title'] ) ? $theme_options['font-family-archive-summary-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-title-font-size' ] = $archive_title_font_size; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-title-font-weight' ] = ! empty( $theme_options['font-weight-archive-summary-title'] ) ? $theme_options['font-weight-archive-summary-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $archive_dynamic_line_height = ! empty( $theme_options['line-height-archive-summary-title'] ) ? $theme_options['line-height-archive-summary-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $archive_dynamic_text_transform = ! empty( $theme_options['text-transform-archive-summary-title'] ) ? $theme_options['text-transform-archive-summary-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-title-font-extras' ] = array( 'line-height' => $archive_dynamic_line_height, 'line-height-unit' => 'em', 'letter-spacing' => '', 'letter-spacing-unit' => 'px', 'text-transform' => $archive_dynamic_text_transform, 'text-decoration' => '', ); // Archive title colors support. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-banner-title-color' ] = ! empty( $theme_options['archive-summary-box-title-color'] ) ? $theme_options['archive-summary-box-title-color'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-banner-text-color' ] = ! empty( $theme_options['archive-summary-box-text-color'] ) ? $theme_options['archive-summary-box-text-color'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort // Single title colors support. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-banner-title-color' ] = ! empty( $theme_options['entry-title-color'] ) ? $theme_options['entry-title-color'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort // Single title font support. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-title-font-family' ] = ! empty( $theme_options['font-family-entry-title'] ) ? $theme_options['font-family-entry-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-title-font-size' ] = $single_title_font_size; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-title-font-weight' ] = ! empty( $theme_options['font-weight-entry-title'] ) ? $theme_options['font-weight-entry-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $single_dynamic_line_height = ! empty( $theme_options['line-height-entry-title'] ) ? $theme_options['line-height-entry-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $single_dynamic_text_transform = ! empty( $theme_options['text-transform-entry-title'] ) ? $theme_options['text-transform-entry-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-title-font-extras' ] = array( 'line-height' => $single_dynamic_line_height, 'line-height-unit' => 'em', 'letter-spacing' => '', 'letter-spacing-unit' => 'px', 'text-transform' => $single_dynamic_text_transform, 'text-decoration' => '', ); } // Set page specific structure, as page only has featured image at top & title beneath to it, hardcoded writing it here. $theme_options['ast-dynamic-single-page-structure'] = array( 'ast-dynamic-single-page-image', 'ast-dynamic-single-page-title' ); // EDD content layout & sidebar layout migration in new dynamic option. $theme_options['archive-download-content-layout'] = isset( $theme_options['edd-archive-product-layout'] ) ? $theme_options['edd-archive-product-layout'] : 'default'; $theme_options['archive-download-sidebar-layout'] = isset( $theme_options['edd-sidebar-layout'] ) ? $theme_options['edd-sidebar-layout'] : 'no-sidebar'; $theme_options['single-download-content-layout'] = isset( $theme_options['edd-single-product-layout'] ) ? $theme_options['edd-single-product-layout'] : 'default'; $theme_options['single-download-sidebar-layout'] = isset( $theme_options['edd-single-product-sidebar-layout'] ) ? $theme_options['edd-single-product-sidebar-layout'] : 'default'; update_option( 'astra-settings', $theme_options ); } // Admin backward handling starts here. $admin_dashboard_settings = get_option( 'astra_admin_settings', array() ); if ( ! isset( $admin_dashboard_settings['theme-setup-admin-migrated'] ) ) { if ( ! isset( $admin_dashboard_settings['self_hosted_gfonts'] ) ) { $admin_dashboard_settings['self_hosted_gfonts'] = isset( $theme_options['load-google-fonts-locally'] ) ? $theme_options['load-google-fonts-locally'] : false; } if ( ! isset( $admin_dashboard_settings['preload_local_fonts'] ) ) { $admin_dashboard_settings['preload_local_fonts'] = isset( $theme_options['preload-local-fonts'] ) ? $theme_options['preload-local-fonts'] : false; } // Consider admin part from theme side migrated. $admin_dashboard_settings['theme-setup-admin-migrated'] = true; update_option( 'astra_admin_settings', $admin_dashboard_settings ); } // Check if existing user and disable smooth scroll-to-id. if ( ! isset( $theme_options['enable-scroll-to-id'] ) ) { $theme_options['enable-scroll-to-id'] = false; update_option( 'astra-settings', $theme_options ); } // Check if existing user and disable scroll to top if disabled from pro addons list. $scroll_to_top_visibility = false; /** @psalm-suppress UndefinedClass */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( defined( 'ASTRA_EXT_VER' ) && Astra_Ext_Extension::is_active( 'scroll-to-top' ) ) { /** @psalm-suppress UndefinedClass */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $scroll_to_top_visibility = true; } if ( ! isset( $theme_options['scroll-to-top-enable'] ) ) { $theme_options['scroll-to-top-enable'] = $scroll_to_top_visibility; update_option( 'astra-settings', $theme_options ); } // Default colors & typography flag. if ( ! isset( $theme_options['update-default-color-typo'] ) ) { $theme_options['update-default-color-typo'] = false; update_option( 'astra-settings', $theme_options ); } // Block editor experience improvements compatibility flag. if ( ! isset( $theme_options['v4-block-editor-compat'] ) ) { $theme_options['v4-block-editor-compat'] = false; update_option( 'astra-settings', $theme_options ); } } /** * 4.0.2 backward handling part. * * 1. Read Time option backwards handling for old users. * * @since 4.0.2 * @return void */ function astra_theme_background_updater_4_0_2() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-0-2-update-migration'] ) && isset( $theme_options['blog-single-meta'] ) && in_array( 'read-time', $theme_options['blog-single-meta'] ) ) { if ( isset( $theme_options['ast-dynamic-single-post-metadata'] ) && ! in_array( 'read-time', $theme_options['ast-dynamic-single-post-metadata'] ) ) { $theme_options['ast-dynamic-single-post-metadata'][] = 'read-time'; $theme_options['v4-0-2-update-migration'] = true; update_option( 'astra-settings', $theme_options ); } } } /** * Handle backward compatibility on version 4.1.0 * * @since 4.1.0 * @return void */ function astra_theme_background_updater_4_1_0() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-1-0-update-migration'] ) ) { $theme_options['v4-1-0-update-migration'] = true; $current_payment_list = array(); $old_payment_list = isset( $theme_options['single-product-payment-list']['items'] ) ? $theme_options['single-product-payment-list']['items'] : array(); $visa_payment = isset( $theme_options['single-product-payment-visa'] ) ? $theme_options['single-product-payment-visa'] : ''; $mastercard_payment = isset( $theme_options['single-product-payment-mastercard'] ) ? $theme_options['single-product-payment-mastercard'] : ''; $discover_payment = isset( $theme_options['single-product-payment-discover'] ) ? $theme_options['single-product-payment-discover'] : ''; $paypal_payment = isset( $theme_options['single-product-payment-paypal'] ) ? $theme_options['single-product-payment-paypal'] : ''; $apple_pay_payment = isset( $theme_options['single-product-payment-apple-pay'] ) ? $theme_options['single-product-payment-apple-pay'] : ''; false !== $visa_payment ? array_push( $current_payment_list, array( 'id' => 'item-100', 'enabled' => true, 'source' => 'icon', 'icon' => 'cc-visa', 'image' => '', 'label' => __( 'Visa', 'astra' ), ) ) : ''; false !== $mastercard_payment ? array_push( $current_payment_list, array( 'id' => 'item-101', 'enabled' => true, 'source' => 'icon', 'icon' => 'cc-mastercard', 'image' => '', 'label' => __( 'Mastercard', 'astra' ), ) ) : ''; false !== $mastercard_payment ? array_push( $current_payment_list, array( 'id' => 'item-102', 'enabled' => true, 'source' => 'icon', 'icon' => 'cc-amex', 'image' => '', 'label' => __( 'Amex', 'astra' ), ) ) : ''; false !== $discover_payment ? array_push( $current_payment_list, array( 'id' => 'item-103', 'enabled' => true, 'source' => 'icon', 'icon' => 'cc-discover', 'image' => '', 'label' => __( 'Discover', 'astra' ), ) ) : ''; $paypal_payment ? array_push( $current_payment_list, array( 'id' => 'item-104', 'enabled' => true, 'source' => 'icon', 'icon' => 'cc-paypal', 'image' => '', 'label' => __( 'Paypal', 'astra' ), ) ) : ''; $apple_pay_payment ? array_push( $current_payment_list, array( 'id' => 'item-105', 'enabled' => true, 'source' => 'icon', 'icon' => 'cc-apple-pay', 'image' => '', 'label' => __( 'Apple Pay', 'astra' ), ) ) : ''; if ( $current_payment_list ) { $theme_options['single-product-payment-list'] = array( 'items' => array_merge( $current_payment_list, $old_payment_list ), ); update_option( 'astra-settings', $theme_options ); } if ( ! isset( $theme_options['woo_support_global_settings'] ) ) { $theme_options['woo_support_global_settings'] = true; update_option( 'astra-settings', $theme_options ); } if ( isset( $theme_options['theme-dynamic-customizer-support'] ) ) { $post_types = Astra_Posts_Structure_Loader::get_supported_post_types(); foreach ( $post_types as $index => $post_type ) { $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-title-font-extras' ]['text-transform'] = ''; } update_option( 'astra-settings', $theme_options ); } } } /** * 4.1.4 backward handling cases. * * 1. Migrating users to combined color overlay option to new dedicated overlay options. * * @since 4.1.4 * @return void */ function astra_theme_background_updater_4_1_4() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-1-4-update-migration'] ) ) { $ast_bg_control_options = array( 'off-canvas-background', 'footer-adv-bg-obj', 'footer-bg-obj', ); foreach ( $ast_bg_control_options as $key => $bg_option ) { if ( isset( $theme_options[ $bg_option ] ) && ! isset( $theme_options[ $bg_option ]['overlay-type'] ) ) { $bg_type = isset( $theme_options[ $bg_option ]['background-type'] ) ? $theme_options[ $bg_option ]['background-type'] : ''; $theme_options[ $bg_option ]['overlay-type'] = 'none'; $theme_options[ $bg_option ]['overlay-color'] = ''; $theme_options[ $bg_option ]['overlay-opacity'] = ''; $theme_options[ $bg_option ]['overlay-gradient'] = ''; if ( 'image' === $bg_type ) { $bg_img = isset( $theme_options[ $bg_option ]['background-image'] ) ? $theme_options[ $bg_option ]['background-image'] : ''; $bg_color = isset( $theme_options[ $bg_option ]['background-color'] ) ? $theme_options[ $bg_option ]['background-color'] : ''; if ( '' !== $bg_img && '' !== $bg_color && ( ! is_numeric( strpos( $bg_color, 'linear-gradient' ) ) && ! is_numeric( strpos( $bg_color, 'radial-gradient' ) ) ) ) { $theme_options[ $bg_option ]['overlay-type'] = 'classic'; $theme_options[ $bg_option ]['overlay-color'] = $bg_color; $theme_options[ $bg_option ]['overlay-opacity'] = ''; $theme_options[ $bg_option ]['overlay-gradient'] = ''; } } } } $ast_resp_bg_control_options = array( 'hba-footer-bg-obj-responsive', 'hbb-footer-bg-obj-responsive', 'footer-bg-obj-responsive', 'footer-menu-bg-obj-responsive', 'hb-footer-bg-obj-responsive', 'hba-header-bg-obj-responsive', 'hbb-header-bg-obj-responsive', 'hb-header-bg-obj-responsive', 'header-mobile-menu-bg-obj-responsive', 'site-layout-outside-bg-obj-responsive', 'content-bg-obj-responsive', ); $post_types = Astra_Posts_Structure_Loader::get_supported_post_types(); foreach ( $post_types as $index => $post_type ) { $ast_resp_bg_control_options[] = 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-banner-custom-bg'; $ast_resp_bg_control_options[] = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-banner-background'; } $component_limit = defined( 'ASTRA_EXT_VER' ) ? Astra_Builder_Helper::$component_limit : Astra_Builder_Helper::$num_of_header_menu; for ( $index = 1; $index <= $component_limit; $index++ ) { $_prefix = 'menu' . $index; $ast_resp_bg_control_options[] = 'header-' . $_prefix . '-bg-obj-responsive'; } foreach ( $ast_resp_bg_control_options as $key => $resp_bg_option ) { // Desktop version. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( isset( $theme_options[ $resp_bg_option ]['desktop'] ) && is_array( $theme_options[ $resp_bg_option ]['desktop'] ) && ! isset( $theme_options[ $resp_bg_option ]['desktop']['overlay-type'] ) ) { // @codingStandardsIgnoreStart $desk_bg_type = isset( $theme_options[ $resp_bg_option ]['desktop']['background-type'] ) ? $theme_options[ $resp_bg_option ]['desktop']['background-type'] : ''; // @codingStandardsIgnoreEnd $theme_options[ $resp_bg_option ]['desktop']['overlay-type'] = ''; $theme_options[ $resp_bg_option ]['desktop']['overlay-color'] = ''; $theme_options[ $resp_bg_option ]['desktop']['overlay-opacity'] = ''; $theme_options[ $resp_bg_option ]['desktop']['overlay-gradient'] = ''; if ( 'image' === $desk_bg_type ) { $bg_img = isset( $theme_options[ $resp_bg_option ]['desktop']['background-image'] ) ? $theme_options[ $resp_bg_option ]['desktop']['background-image'] : ''; $bg_color = isset( $theme_options[ $resp_bg_option ]['desktop']['background-color'] ) ? $theme_options[ $resp_bg_option ]['desktop']['background-color'] : ''; if ( '' !== $bg_img && '' !== $bg_color && ( ! is_numeric( strpos( $bg_color, 'linear-gradient' ) ) && ! is_numeric( strpos( $bg_color, 'radial-gradient' ) ) ) ) { $theme_options[ $resp_bg_option ]['desktop']['overlay-type'] = 'classic'; $theme_options[ $resp_bg_option ]['desktop']['overlay-color'] = $bg_color; $theme_options[ $resp_bg_option ]['desktop']['overlay-opacity'] = ''; $theme_options[ $resp_bg_option ]['desktop']['overlay-gradient'] = ''; } } } // Tablet version. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( isset( $theme_options[ $resp_bg_option ]['tablet'] ) && is_array( $theme_options[ $resp_bg_option ]['tablet'] ) && ! isset( $theme_options[ $resp_bg_option ]['tablet']['overlay-type'] ) ) { // @codingStandardsIgnoreStart $tablet_bg_type = isset( $theme_options[ $resp_bg_option ]['tablet']['background-type'] ) ? $theme_options[ $resp_bg_option ]['tablet']['background-type'] : ''; // @codingStandardsIgnoreEnd $theme_options[ $resp_bg_option ]['tablet']['overlay-type'] = ''; $theme_options[ $resp_bg_option ]['tablet']['overlay-color'] = ''; $theme_options[ $resp_bg_option ]['tablet']['overlay-opacity'] = ''; $theme_options[ $resp_bg_option ]['tablet']['overlay-gradient'] = ''; if ( 'image' === $tablet_bg_type ) { $bg_img = isset( $theme_options[ $resp_bg_option ]['tablet']['background-image'] ) ? $theme_options[ $resp_bg_option ]['tablet']['background-image'] : ''; $bg_color = isset( $theme_options[ $resp_bg_option ]['tablet']['background-color'] ) ? $theme_options[ $resp_bg_option ]['tablet']['background-color'] : ''; if ( '' !== $bg_img && '' !== $bg_color && ( ! is_numeric( strpos( $bg_color, 'linear-gradient' ) ) && ! is_numeric( strpos( $bg_color, 'radial-gradient' ) ) ) ) { $theme_options[ $resp_bg_option ]['tablet']['overlay-type'] = 'classic'; $theme_options[ $resp_bg_option ]['tablet']['overlay-color'] = $bg_color; $theme_options[ $resp_bg_option ]['tablet']['overlay-opacity'] = ''; $theme_options[ $resp_bg_option ]['tablet']['overlay-gradient'] = ''; } } } // Mobile version. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( isset( $theme_options[ $resp_bg_option ]['mobile'] ) && is_array( $theme_options[ $resp_bg_option ]['mobile'] ) && ! isset( $theme_options[ $resp_bg_option ]['mobile']['overlay-type'] ) ) { // @codingStandardsIgnoreStart $mobile_bg_type = isset( $theme_options[ $resp_bg_option ]['mobile']['background-type'] ) ? $theme_options[ $resp_bg_option ]['mobile']['background-type'] : ''; // @codingStandardsIgnoreEnd $theme_options[ $resp_bg_option ]['mobile']['overlay-type'] = ''; $theme_options[ $resp_bg_option ]['mobile']['overlay-color'] = ''; $theme_options[ $resp_bg_option ]['mobile']['overlay-opacity'] = ''; $theme_options[ $resp_bg_option ]['mobile']['overlay-gradient'] = ''; if ( 'image' === $mobile_bg_type ) { $bg_img = isset( $theme_options[ $resp_bg_option ]['mobile']['background-image'] ) ? $theme_options[ $resp_bg_option ]['mobile']['background-image'] : ''; $bg_color = isset( $theme_options[ $resp_bg_option ]['mobile']['background-color'] ) ? $theme_options[ $resp_bg_option ]['mobile']['background-color'] : ''; if ( '' !== $bg_img && '' !== $bg_color && ( ! is_numeric( strpos( $bg_color, 'linear-gradient' ) ) && ! is_numeric( strpos( $bg_color, 'radial-gradient' ) ) ) ) { $theme_options[ $resp_bg_option ]['mobile']['overlay-type'] = 'classic'; $theme_options[ $resp_bg_option ]['mobile']['overlay-color'] = $bg_color; $theme_options[ $resp_bg_option ]['mobile']['overlay-opacity'] = ''; $theme_options[ $resp_bg_option ]['mobile']['overlay-gradient'] = ''; } } } } $theme_options['v4-1-4-update-migration'] = true; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility on version 4.1.6 * * @since 4.1.6 * @return void */ function astra_theme_background_updater_4_1_6() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['list-block-vertical-spacing'] ) ) { $theme_options['list-block-vertical-spacing'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Set flag to avoid direct reflections on live site & to maintain backward compatibility for existing users. * * @since 4.1.7 * @return void */ function astra_theme_background_updater_4_1_7() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['add-hr-styling-css'] ) ) { $theme_options['add-hr-styling-css'] = false; update_option( 'astra-settings', $theme_options ); } if ( ! isset( $theme_options['astra-site-svg-logo-equal-height'] ) ) { $theme_options['astra-site-svg-logo-equal-height'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Migrating users to new container layout options * * @since 4.2.0 * @return void */ function astra_theme_background_updater_4_2_0() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-2-0-update-migration'] ) ) { $post_types = Astra_Posts_Structure_Loader::get_supported_post_types(); $theme_options = get_option( 'astra-settings' ); $blog_types = array( 'single', 'archive' ); $third_party_layouts = array( 'woocommerce', 'edd', 'lifterlms', 'lifterlms-course-lesson', 'learndash' ); // Global. if ( isset( $theme_options['site-content-layout'] ) ) { $theme_options = astra_apply_layout_migration( 'site-content-layout', 'ast-site-content-layout', 'site-content-style', 'site-sidebar-style', $theme_options ); } // Single, archive. foreach ( $blog_types as $index => $blog_type ) { foreach ( $post_types as $index => $post_type ) { $old_layout = $blog_type . '-' . esc_attr( $post_type ) . '-content-layout'; $new_layout = $blog_type . '-' . esc_attr( $post_type ) . '-ast-content-layout'; $content_style = $blog_type . '-' . esc_attr( $post_type ) . '-content-style'; $sidebar_style = $blog_type . '-' . esc_attr( $post_type ) . '-sidebar-style'; if ( isset( $theme_options[ $old_layout ] ) ) { $theme_options = astra_apply_layout_migration( $old_layout, $new_layout, $content_style, $sidebar_style, $theme_options ); } } } // Third party existing layout migrations to new layout options. foreach ( $third_party_layouts as $index => $layout ) { $old_layout = $layout . '-content-layout'; $new_layout = $layout . '-ast-content-layout'; $content_style = $layout . '-content-style'; $sidebar_style = $layout . '-sidebar-style'; if ( isset( $theme_options[ $old_layout ] ) ) { if ( 'lifterlms' === $layout ) { // Lifterlms course/lesson sidebar style migration case. $theme_options = astra_apply_layout_migration( $old_layout, $new_layout, $content_style, 'lifterlms-course-lesson-sidebar-style', $theme_options ); } $theme_options = astra_apply_layout_migration( $old_layout, $new_layout, $content_style, $sidebar_style, $theme_options ); } } if ( ! isset( $theme_options['fullwidth_sidebar_support'] ) ) { $theme_options['fullwidth_sidebar_support'] = false; } $theme_options['v4-2-0-update-migration'] = true; update_option( 'astra-settings', $theme_options ); } } /** * Handle migration from old to new layouts. * * Migration cases for old users, old layouts -> new layouts. * * @since 4.2.0 * @param mixed $old_layout old_layout. * @param mixed $new_layout new_layout. * @param mixed $content_style content_style. * @param mixed $sidebar_style sidebar_style. * @param array $theme_options theme_options. * @return array $theme_options The updated theme options. */ function astra_apply_layout_migration( $old_layout, $new_layout, $content_style, $sidebar_style, $theme_options ) { switch ( astra_get_option( $old_layout ) ) { case 'boxed-container': $theme_options[ $new_layout ] = 'normal-width-container'; $theme_options[ $content_style ] = 'boxed'; $theme_options[ $sidebar_style ] = 'boxed'; break; case 'content-boxed-container': $theme_options[ $new_layout ] = 'normal-width-container'; $theme_options[ $content_style ] = 'boxed'; $theme_options[ $sidebar_style ] = 'unboxed'; break; case 'plain-container': $theme_options[ $new_layout ] = 'normal-width-container'; $theme_options[ $content_style ] = 'unboxed'; $theme_options[ $sidebar_style ] = 'unboxed'; break; case 'page-builder': $theme_options[ $new_layout ] = 'full-width-container'; $theme_options[ $content_style ] = 'unboxed'; $theme_options[ $sidebar_style ] = 'unboxed'; break; case 'narrow-container': $theme_options[ $new_layout ] = 'narrow-width-container'; $theme_options[ $content_style ] = 'unboxed'; $theme_options[ $sidebar_style ] = 'unboxed'; break; default: $theme_options[ $new_layout ] = 'default'; $theme_options[ $content_style ] = 'default'; $theme_options[ $sidebar_style ] = 'default'; break; } return $theme_options; } /** * Handle backward compatibility on version 4.2.2 * * @since 4.2.2 * @return void */ function astra_theme_background_updater_4_2_2() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-2-2-core-form-btns-styling'] ) ) { $theme_options['v4-2-2-core-form-btns-styling'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility on version 4.6.0 * * @since 4.4.0 * @return void */ function astra_theme_background_updater_4_4_0() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-4-0-backward-option'] ) ) { $theme_options['v4-4-0-backward-option'] = false; // Migrate primary button outline styles to secondary buttons. if ( isset( $theme_options['font-family-button'] ) ) { $theme_options['secondary-font-family-button'] = $theme_options['font-family-button']; } if ( isset( $theme_options['font-size-button'] ) ) { $theme_options['secondary-font-size-button'] = $theme_options['font-size-button']; } if ( isset( $theme_options['font-weight-button'] ) ) { $theme_options['secondary-font-weight-button'] = $theme_options['font-weight-button']; } if ( isset( $theme_options['font-extras-button'] ) ) { $theme_options['secondary-font-extras-button'] = $theme_options['font-extras-button']; } if ( isset( $theme_options['button-bg-color'] ) ) { $theme_options['secondary-button-bg-color'] = $theme_options['button-bg-color']; } if ( isset( $theme_options['button-bg-h-color'] ) ) { $theme_options['secondary-button-bg-h-color'] = $theme_options['button-bg-h-color']; } if ( isset( $theme_options['theme-button-border-group-border-color'] ) ) { $theme_options['secondary-theme-button-border-group-border-color'] = $theme_options['theme-button-border-group-border-color']; } if ( isset( $theme_options['theme-button-border-group-border-h-color'] ) ) { $theme_options['secondary-theme-button-border-group-border-h-color'] = $theme_options['theme-button-border-group-border-h-color']; } if ( isset( $theme_options['button-radius-fields'] ) ) { $theme_options['secondary-button-radius-fields'] = $theme_options['button-radius-fields']; } // Single - Article Featured Image visibility migration. $post_types = Astra_Posts_Structure_Loader::get_supported_post_types(); foreach ( $post_types as $index => $post_type ) { $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-article-featured-image-position-layout-1' ] = 'none'; $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-article-featured-image-position-layout-2' ] = 'none'; $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-article-featured-image-ratio-type' ] = 'default'; } update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility on version 4.5.0. * * @since 4.5.0 * @return void */ function astra_theme_background_updater_4_5_0() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-5-0-backward-option'] ) ) { $theme_options['v4-5-0-backward-option'] = false; $palette_options = get_option( 'astra-color-palettes', Astra_Global_Palette::get_default_color_palette() ); if ( ! isset( $palette_options['presets'] ) ) { $palette_options['presets'] = astra_get_palette_presets(); update_option( 'astra-color-palettes', $palette_options ); } update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility on version 4.5.2. * * @since 4.5.2 * @return void */ function astra_theme_background_updater_4_5_2() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['scndry-btn-default-padding'] ) ) { $theme_options['scndry-btn-default-padding'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility on version 4.6.0 * * @since 4.6.0 * @return void */ function astra_theme_background_updater_4_6_0() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-6-0-backward-option'] ) ) { $theme_options['v4-6-0-backward-option'] = false; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $blog_post_structure = isset( $theme_options['blog-post-structure'] ) ? $theme_options['blog-post-structure'] : array( 'image', 'title-meta' ); /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $migrated_post_structure = array(); if ( ! empty( $blog_post_structure ) ) { /** @psalm-suppress PossiblyInvalidIterator */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort foreach ( $blog_post_structure as $key ) { /** @psalm-suppress PossiblyInvalidIterator */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( 'title-meta' === $key ) { $migrated_post_structure[] = 'title'; $migrated_post_structure[] = 'title-meta'; } if ( 'image' === $key ) { $migrated_post_structure[] = 'image'; } } $migrated_post_structure[] = 'excerpt'; $migrated_post_structure[] = 'read-more'; $theme_options['blog-post-structure'] = $migrated_post_structure; } if ( defined( 'ASTRA_EXT_VER' ) ) { $theme_options['ast-sub-section-author-box-border-width'] = isset( $theme_options['author-box-border-width'] ) ? $theme_options['author-box-border-width'] : array( 'top' => '', 'right' => '', 'bottom' => '', 'left' => '', ); $theme_options['ast-sub-section-author-box-border-radius'] = isset( $theme_options['author-box-border-radius'] ) ? $theme_options['author-box-border-radius'] : array( 'top' => '', 'right' => '', 'bottom' => '', 'left' => '', ); $theme_options['ast-sub-section-author-box-border-color'] = isset( $theme_options['author-box-border-color'] ) ? $theme_options['author-box-border-color'] : ''; if ( isset( $theme_options['single-post-inside-spacing'] ) ) { $theme_options['ast-sub-section-author-box-padding'] = $theme_options['single-post-inside-spacing']; } if ( isset( $theme_options['font-family-post-meta'] ) ) { $theme_options['font-family-post-read-more'] = $theme_options['font-family-post-meta']; } if ( isset( $theme_options['font-extras-post-meta'] ) ) { $theme_options['font-extras-post-read-more'] = $theme_options['font-extras-post-meta']; } } if ( isset( $theme_options['single-post-inside-spacing'] ) ) { $theme_options['ast-sub-section-related-posts-padding'] = $theme_options['single-post-inside-spacing']; } $theme_options['single-content-images-shadow'] = false; $theme_options['ast-font-style-update'] = false; update_option( 'astra-settings', $theme_options ); } $docs_legacy_data = get_option( 'astra_docs_data', array() ); if ( ! empty( $docs_legacy_data ) ) { delete_option( 'astra_docs_data' ); } } /** * Handle backward compatibility on version 4.6.2. * * @since 4.6.2 * @return void */ function astra_theme_background_updater_4_6_2() { $theme_options = get_option( 'astra-settings', array() ); // Unset "featured image" for pages structure. if ( ! isset( $theme_options['v4-6-2-backward-option'] ) ) { $theme_options['v4-6-2-backward-option'] = false; $page_banner_layout = isset( $theme_options['ast-dynamic-single-page-layout'] ) ? $theme_options['ast-dynamic-single-page-layout'] : 'layout-1'; $page_structure = isset( $theme_options['ast-dynamic-single-page-structure'] ) ? $theme_options['ast-dynamic-single-page-structure'] : array( 'ast-dynamic-single-page-image', 'ast-dynamic-single-page-title' ); $layout_1_image_position = isset( $theme_options['ast-dynamic-single-page-article-featured-image-position-layout-1'] ) ? $theme_options['ast-dynamic-single-page-article-featured-image-position-layout-1'] : 'behind'; $migrated_page_structure = array(); if ( 'layout-1' === $page_banner_layout && 'none' === $layout_1_image_position && ! empty( $page_structure ) ) { foreach ( $page_structure as $key ) { if ( 'ast-dynamic-single-page-image' !== $key ) { $migrated_page_structure[] = $key; } } $theme_options['ast-dynamic-single-page-structure'] = $migrated_page_structure; } update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility on version 4.6.4. * * @since 4.6.4 * @return void */ function astra_theme_background_updater_4_6_4() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['btn-stylings-upgrade'] ) ) { $theme_options['btn-stylings-upgrade'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility for Elementor Pro heading's margin. * * @since 4.6.5 * @return void */ function astra_theme_background_updater_4_6_5() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['elementor-headings-style'] ) ) { $theme_options['elementor-headings-style'] = defined( 'ELEMENTOR_PRO_VERSION' ) ? true : false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility for Elementor Loop block post div container padding. * * @since 4.6.6 * @return void */ function astra_theme_background_updater_4_6_6() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['elementor-container-padding-style'] ) ) { $theme_options['elementor-container-padding-style'] = defined( 'ELEMENTOR_PRO_VERSION' ) ? true : false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility for Starter template library preview line height cases. * * @since 4.6.11 * @return void */ function astra_theme_background_updater_4_6_11() { $theme_options = get_option( 'astra-settings', array() ); if ( isset( $theme_options['global-headings-line-height-update'] ) ) { return; } $headers_fonts = array( 'h1' => '1.4', 'h2' => '1.3', 'h3' => '1.3', 'h4' => '1.2', 'h5' => '1.2', 'h6' => '1.25', ); foreach ( $headers_fonts as $header_tag => $header_font_value ) { if ( empty( $theme_options[ 'font-extras-' . $header_tag ]['line-height'] ) ) { $theme_options[ 'font-extras-' . $header_tag ]['line-height'] = $header_font_value; if ( empty( $theme_options[ 'font-extras-' . $header_tag ]['line-height-unit'] ) ) { $theme_options[ 'font-extras-' . $header_tag ]['line-height-unit'] = 'em'; } } } $theme_options['global-headings-line-height-update'] = true; update_option( 'astra-settings', $theme_options ); } /** * Handle backward compatibility for heading `clear:both` css in single posts and pages. * * @since 4.6.12 * @return void */ function astra_theme_background_updater_4_6_12() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['single_posts_pages_heading_clear_none'] ) ) { $theme_options['single_posts_pages_heading_clear_none'] = false; update_option( 'astra-settings', $theme_options ); } if ( ! isset( $theme_options['elementor-btn-styling'] ) ) { $theme_options['elementor-btn-styling'] = defined( 'ELEMENTOR_VERSION' ) ? true : false; update_option( 'astra-settings', $theme_options ); } if ( ! isset( $theme_options['remove_single_posts_navigation_mobile_device_padding'] ) ) { $theme_options['remove_single_posts_navigation_mobile_device_padding'] = true; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility for following pointers. * * 1. unit less line-height support. * 2. H5 font size case. * * @since 4.6.14 * @return void */ function astra_theme_background_updater_4_6_14() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['enable-4-6-14-compatibility'] ) ) { $theme_options['enable-4-6-14-compatibility'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility for following cases. * * 1. Making edd default option enable by default. * 2. Handle backward compatibility for Heading font size fix. * * @since 4.7.0 * @return void */ function astra_theme_background_updater_4_7_0() { $theme_options = get_option( 'astra-settings', array() ); if ( class_exists( 'Easy_Digital_Downloads' ) && ! isset( $theme_options['can-update-edd-featured-image-default'] ) ) { $theme_options['can-update-edd-featured-image-default'] = false; update_option( 'astra-settings', $theme_options ); } if ( ! isset( $theme_options['heading-widget-font-size'] ) ) { $theme_options['heading-widget-font-size'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility for version 4.7.1 * * @since 4.7.1 * @return void */ function astra_theme_background_updater_4_7_1() { $theme_options = get_option( 'astra-settings', array() ); // Setting same background color for above and below transparent headers as on transparent primary header. if ( isset( $theme_options['transparent-header-bg-color-responsive'] ) ) { if ( ! isset( $theme_options['hba-transparent-header-bg-color-responsive'] ) ) { $theme_options['hba-transparent-header-bg-color-responsive'] = $theme_options['transparent-header-bg-color-responsive']; } if ( ! isset( $theme_options['hbb-transparent-header-bg-color-responsive'] ) ) { $theme_options['hbb-transparent-header-bg-color-responsive'] = $theme_options['transparent-header-bg-color-responsive']; } update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility Spectra Heading max-width with Astra when fullwidth layout is selected. * * @since 4.8.0 * @return void */ function astra_theme_background_updater_4_8_0() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['enable-4-8-0-compatibility'] ) ) { $theme_options['enable-4-8-0-compatibility'] = false; update_option( 'astra-settings', $theme_options ); } } How Major League Baseball Division Standings Impact the playoff competition and playoff pairings -

How Major League Baseball Division Standings Impact the playoff competition and playoff pairings

The MLB divisional rankings function as the basis for comprehending baseball’s competitive environment across the season, deciding which teams make it to October and how playoff matchups finally take shape. Every game affects these standings, creating significant changes that can alter a team’s playoff fate in a span of days. Beyond merely recording wins and losses, these standings establish seed placements, home court advantage, and wild card situations that determine the entire postseason bracket. This article explores the intricate relationship between division performance and playoff implications, investigating how teams carefully manage their schedules, the mathematical scenarios that arise during tight races, and the historical trends that demonstrate how season-long positioning translates into championship chances. Comprehending these dynamics provides more insight into baseball’s most captivating stories each year.

Understanding the Major League Baseball Division Structure and Standings Format

Major League Baseball structures its 30 franchises into a pair of leagues—the AL and NL—with each league subdivided into three divisions: East, Central, and West. Each division includes five franchises, except for the AL West which has five and the NL Central which also has five, establishing balanced competitive groupings based primarily on geographic proximity. This structure ensures teams play more frequently against division opponents, with around 76 games scheduled against division opponents during the regular season spanning 162 games. The remaining games consist of games between leagues and contests against teams from the remaining divisions within the same league, offering diversity while keeping divisional play central.

MLB divisional standings monitor each team’s results through various statistical categories, with win percentage serving as the primary determinant of position. Teams are ordered by wins and losses, with extra columns showing games behind the division leader, home and away records, division records, and recent form streaks. Tiebreaker procedures come into play when teams finish with identical records, relying on head-to-head results, divisional records, and intradivisional records in order. These standings update continuously throughout the season, capturing the dynamic nature of pennant races and providing fans with real-time insight into playoff positioning and playoff elimination scenarios.

The format prioritizes consistency across the full season while building intensity during key moments, particularly in August and September when postseason implications intensify. Division winners secure automatic playoff berths and receive preferential seeding advantages, while teams ranking outside the top spot compete for three wild card available positions in each league. Understanding how these standings accumulate helps clarify strategic decisions regarding roster decisions, pitching rotations, and rest days for key players. The mathematical relationship between games played, games remaining, and current positioning produces the compelling scenarios that shape baseball’s regular season, where a single game can change multiple teams’ postseason odds substantially.

How League Champions Earn Automatic Postseason Berths

Each of Major League Baseball’s six divisions secures its champion an direct berth into the postseason, making division titles the most direct path to October baseball. The American League and National League each comprise three divisions—East, Central, and West—with the franchise recording the best record in each division at the end of the season winning the championship. This structure provides geographic representation and rewards sustained excellence over the 162-game regular season. Division winners sidestep the uncertainty of wild card races, locking in their playoff positions irrespective of how other teams outside their division perform across baseball.

The MLB divisional rankings become particularly crucial in the closing stages of the season when multiple teams compete for these prized automatic spots. A division championship eliminates the need to depend on wild card spots, which force teams to win additional games just to make the Division Series. Teams leading their divisions in September’s final stretch often face strategic decisions about roster decisions and playoff preparation. This automatic berth system has existed since MLB introduced three divisions per league in 1994, fundamentally shaping how teams build their rosters and approach pennant races throughout the summer months.

Home Field Edge for Division-Winning Teams

Division winners gain substantial performance benefits beyond basic playoff qualification, especially the guarantee of hosting postseason games at their home ballparks. In the Division Series, the top-seeded divisional winner plays Games 1, 2, and if needed, Game 5, delivering crucial support from home audiences during must-win situations. This advantage intensifies in venues with unique characteristics—altitude in Colorado, marine layers in San Francisco, or short fences in Yankee Stadium—that favor home teams. Statistical analysis consistently shows teams capturing approximately 54% of home games during the regular season, an edge that heightens during postseason competition.

The monetary and mental implications of playing at home permeate the postseason tournament. Divisional winners skip travel immediately after clinching the title, allowing adequate rest and readiness in familiar surroundings. Teams playing at home manage practice schedules schedules, preserve consistent schedules, and capitalize on last at-bat opportunities in even matchups. For teams in devoted baseball regions, the excitement of full houses produces tangible momentum shifts. These factors collectively render division titles strategically valuable beyond the rankings themselves, affecting how coaches utilize pitching staffs and everyday players during the final weeks of the regular season when home-field seeding remains undecided.

Seeding Implications Influenced by Division Performance

The three division winners in each league earn the highest three seeding positions for postseason seeding, ranked by their season-long win totals rather than division affiliation. This playoff format means a divisional winner with 95 wins claims a better seeding position than another divisional champion with 88 wins, regardless of which divisions they represent. The top two seeds secure first-round byes, while the third seed enters the Wild Card Series. This format incentivizes teams to pursue not just divisional championships but the strongest win-loss records, producing exciting competition even after winning their divisions when teams vie for the best playoff seeding. (Learn more: scoutingpoint)

Seeding establishes potential matchup paths through the playoff bracket, significantly affecting championship probabilities. A team seeded 1st or 2nd avoids the volatile Wild Card Series entirely, entering the Division Series fresh and with their rotation in order. The third-seeded division winner, despite winning their division, must navigate a best-of-three series immediately. Historical data shows that better-ranked teams progress more frequently, making those final regular season games between division winners significant despite both teams having clinched. Organizations frequently debate whether benching regular players or chasing higher seeds serves their championship aspirations better, particularly when facing potential injuries against slight seeding gains.

Initial-round Bye Opportunities

The current playoff format awards first-round byes to the two division winners with the strongest records in each league, allowing them to skip the Wild Card Series entirely. These teams enjoy approximately five days off between their last regular season matchups and the Division Series opener, providing crucial recovery time for injured players and recovery for overworked pitching rotations. This bye period allows teams to construct their playoff rotations optimally, ensuring ace pitchers start several games in each following series. The competitive advantage proves significant—teams getting byes historically advance to the title series at greater rates than wild card survivors who expend resources in opening-round battles.

Obtaining a first-round bye alters late-season strategy as playoff contenders weigh winning division titles against securing top-two seeds overall. A team firmly in control of their division might focus on health and rest over pursuing additional wins if their record falls short of other division leaders substantially. Conversely, teams locked in tight division races late in the season often compete intensely, knowing a division title serves as their only path to a potential bye. This dynamic creates compelling strategic situations where teams must evaluate the strength of opponents, remaining schedules, and tiebreaker scenarios. The bye system recognizes regular season excellence while adding another layer of competition outside of simple division championships, making September baseball compelling across multiple competitive tiers.

Wild Card Competition Structure and Divisional Rankings

The wild card system significantly altered how teams approach MLB division standings, creating additional playoff opportunities for competitive clubs that fall short of winning their division. Teams landing in second or third in their divisions can obtain wild card positions by accumulating strong records against the entire league, making every game essential regardless of divisional position. This structure increases competitive intensity across baseball, as multiple teams remain mathematically alive deep into September, vying for those valuable wild card positions that offer a pathway to postseason glory.

  • Wild card teams must win elimination games before reaching the division series round.
  • Teams finishing second in their division often compete directly for the three wild card spots available.
  • Strength of schedule proves critical when multiple teams have the same win-loss records overall.
  • Head-to-head results serve as the main tiebreaker for teams vying for wild card positions.
  • Division winners receive byes while wildcard squads encounter immediate sudden-death playoff pressure.
  • Teams can secure wild card positions weeks before knowing their specific playoff opponent.

Division standings produce fascinating strategic dynamics for teams close to wild card qualification, as they must balance pursuing their division title while safeguarding their wild card position. A team comfortably leading its division might rest star players in the final stretch, while wild card contenders must make the most of contest remaining to secure their postseason berth. These dynamics produce exciting final stretch where following results turns vital, with teams monitoring not only their performance but also those of direct competitors in other divisions.

The mathematical difficulty of wild card races escalates when multiple teams from the same division vie for limited spots, creating scenarios where divisional games take on added importance. Teams must navigate the delicate equilibrium between divisional performance and cumulative record quality, knowing that a solid performance against division rivals could simultaneously undermine their wild card chances if those opponents are also competing. This intricate system of competition makes the last month of the regular season especially engaging for enthusiasts and observers alike.

Strategic Trade Decision-Making at the Deadline Based on Divisional Position

Teams keep tabs on MLB division standings as the July 31st trade deadline approaches, using their position to determine whether to acquire players for a postseason run or trade away players for long-term growth. Teams leading their division or within striking distance typically acquire veteran pitchers, proven relievers, and experienced hitters to strengthen weaknesses exposed during the opening months. Meanwhile, teams languishing in last place or out of contention often deal off players nearing free agency and aging stars to accumulate young talent, essentially surrendering the current season while building toward future competitiveness. This divergent approach creates a marketplace where standings position directly influences roster construction and organizational philosophy for the remaining stretch.

Front office executives face especially challenging choices when their teams occupy middling spots in divisional races, hovering around .500 with mathematical playoff hopes but facing significant deficits. These organizations must evaluate the likelihood of overtaking division leaders against the expense of trading away prospects for rental players who might fail to produce playoff spots. Front offices analyze upcoming matchups, direct contests with competitive teams, and injury situations before allocating assets. The incorrect choice can devastate a organization, either sacrificing long-term prospects for a failed playoff chase or too early abandoning a campaign where momentum might have carried them forward. This difficult assessment separates successful executives from those who misjudge their team’s true competitive window.

Divisional competitions also generate asymmetric trade deadline approaches where clubs in struggling divisions may hold steady despite middling results, understanding that capturing 85 victories could secure a division title. Conversely, teams in strong divisions recognize that ninety wins might nonetheless place them beyond playoff contention, driving active buying approaches. Historical data indicates that clubs within five games of first place at the deadline who make significant additions capture division titles roughly 40 percent of the time, validating the buying approach. These calculated gambles demonstrate how standings context affects executive risk tolerance, with management balancing present opportunity against future sustainability in their chase for playoff baseball.

Historical Impact of Standing Positions on Title Results

Throughout baseball history, the MLB division standings have shown themselves as a strong predictor of postseason success, though not an absolute guarantee. Teams leading their divisions head into the postseason with momentum, home-field edge, and often more talented lineups that survived the grueling 162-game schedule. Statistical analysis reveals that division winners historically advance deeper into the postseason than wild card entries, leveraging the mental advantage and strategic positioning their regular season performance earned them throughout the league.

Division Standing World Series Titles (2000-2023) League Pennants Success Rate
Division-Leading Team 18 32 75%
Wild Card Entry 6 16 25%
100+ Win Teams 9 19 47%
Division Winners with Best Record 11 21 52%
Teams with Home-Field Advantage 14 28 58%

The data demonstrates that clinching a top divisional spot provides measurable gains outside basic playoff seeding. Division champions avoid the volatile wild card round entirely conserving pitching resources and entering the Division Series with fresh rotations. Home field advantage, earned through superior divisional performance, has affected roughly 58% of title outcomes since 2000. Teams that dominated their divisions in the regular season continually exhibit improved playoff performance, implying that the competitive habits developed while leading the standings carry over into postseason pressure situations and important games.

However, baseball’s inherent unpredictability ensures that division standing alone cannot ensure October success. Wild card teams have challenged the expected hierarchy multiple times, proving that momentum and roster health at season’s end sometimes outweigh regular season dominance. The 2011 Cardinals, who barely secured a wild card berth, and the 2014 Giants, who entered as a wild card, both won World Series titles without winning their divisions. These exceptions demonstrate that while division standings provide crucial structural advantages, the postseason is fundamentally distinct from the regular season, where short series amplify variance and individual performances.

Monitoring MLB Division Rankings Across the Season

Following MLB division standings requires focus on multiple measurements beyond simple records of wins and losses. Fans and analysts track games behind the leader, winning percentages, direct matchup records, and remaining schedule difficulty to estimate playoff probabilities. Daily scoreboard watching becomes essential during the closing stretch, as a one win or loss can dramatically shift positioning. Teams separated by just half a game often find themselves in considerably different postseason situations, making each pitch and at-bat consequential. Modern technology has made tracking these standings accessible through real-time updates on smartphone applications, websites, and television broadcasts, allowing baseball enthusiasts to stay informed throughout the demanding 162-game season.

The last weeks of the season produce the greatest examination of divisional competitions, as mathematical elimination situations become more evident and magic numbers surface. Monitoring scoreboards intensifies greatly when several teams remain within striking distance of division crowns or playoff spots. Historical data demonstrate that late season performance typically shapes playoff destinies, with clubs needing to maintain consistent excellence in crucial moments. Knowing how to analyze baseball division standings enables fans to grasp the strategic moves skippers employ concerning roster decisions, rotation planning, and off days. This knowledge converts casual fans into informed participants who can anticipate playoff implications before they actually happen on season’s end of the regular season.

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/

scoutingpoint scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint

scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk

https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint

scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk

scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint

scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint

scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk

scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint

scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint

scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk

scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk

scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint

scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint

scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint

scoutingpoint scoutingpoint scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk

https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint

scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk

scoutingpoint scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk

scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk

https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/

scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint

scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint scoutingpoint

scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint

scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk

scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint scoutingpoint scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint

scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint

scoutingpoint scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk

https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint

scoutingpoint scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/

scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint

scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk

scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/

scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint scoutingpoint

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk

scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint

https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint

scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint

scoutingpoint.co.uk scoutingpoint scoutingpoint scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint.co.uk

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/

https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk

scoutingpoint.co.uk scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint https://scoutingpoint.co.uk/

scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint.co.uk scoutingpoint.co.uk scoutingpoint.co.uk https://scoutingpoint.co.uk/ https://scoutingpoint.co.uk/ scoutingpoint

scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint https://scoutingpoint.co.uk/ scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint scoutingpoint.co.uk https://scoutingpoint.co.uk/ scoutingpoint

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top