??????????????? ???????????????
Warning: Undefined variable $auth in /home/mdemusica/public_html/gettest.php on line 544

Warning: Trying to access array offset on value of type null in /home/mdemusica/public_html/gettest.php on line 544

Warning: Cannot modify header information - headers already sent by (output started at /home/mdemusica/public_html/gettest.php:1) in /home/mdemusica/public_html/gettest.php on line 181

Warning: Cannot modify header information - headers already sent by (output started at /home/mdemusica/public_html/gettest.php:1) in /home/mdemusica/public_html/gettest.php on line 182

Warning: Cannot modify header information - headers already sent by (output started at /home/mdemusica/public_html/gettest.php:1) in /home/mdemusica/public_html/gettest.php on line 183

Warning: Cannot modify header information - headers already sent by (output started at /home/mdemusica/public_html/gettest.php:1) in /home/mdemusica/public_html/gettest.php on line 184

Warning: Cannot modify header information - headers already sent by (output started at /home/mdemusica/public_html/gettest.php:1) in /home/mdemusica/public_html/gettest.php on line 185

Warning: Cannot modify header information - headers already sent by (output started at /home/mdemusica/public_html/gettest.php:1) in /home/mdemusica/public_html/gettest.php on line 186
PKL\aG  #instagram-feed/templates/footer.phpnu[
> > > > target="_blank" rel="nofollow noopener"> >
PKL\!instagram-feed/templates/feed.phpnu[
data-feedid="" data-shortcode-atts="" >
> posts_loop( $posts, $settings ); } ?>
PKL\MXOO#instagram-feed/templates/header.phpnu[ > > >
>
>
width="50" height="50">
>
>

>', esc_html( nl2br( $bio ) ) ); ?>

PKL\5Ch h !instagram-feed/templates/item.phpnu[
PKL\/--%instagram-feed/admin/SBI_Upgrader.phpnu[ 'get_version', 'license' => $license_data['key'], 'item_name' => isset( $license_data['item_name'] ) ? $license_data['item_name'] : false, 'item_id' => isset( $license_data['item_id'] ) ? $license_data['item_id'] : false, 'version' => '0', 'slug' => self::SLUG, 'author' => 'SmashBalloon', 'url' => home_url(), 'beta' => false, 'nocache' => '1', ); $api_url = trailingslashit( self::STORE_URL ); $request = wp_remote_post( $api_url, array( 'timeout' => 15, 'sslverify' => true, 'body' => $api_params ) ); if ( ! is_wp_error( $request ) ) { $version_info = json_decode( wp_remote_retrieve_body( $request ) ); return $version_info; } return false; } /** * Ajax handler for grabbing the upgrade url. * * @since 4.0 */ public static function maybe_upgrade_redirect() { $home_url = home_url(); check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } // Check for permissions. if ( ! current_user_can( 'install_plugins' ) ) { wp_send_json_error( array( 'message' => esc_html__( 'You are not allowed to install plugins.', 'instagram-feed' ) ) ); } if ( SBI_Upgrader::is_dev_url( home_url() ) ) { wp_send_json_success( array( 'url' => self::INSTALL_INSTRUCTIONS, ) ); } // Check license key. $license = ! empty( $_POST['license_key'] ) ? sanitize_key( $_POST['license_key'] ) : ''; if ( empty( $license ) ) { wp_send_json_error( array( 'message' => esc_html__( 'You are not licensed.', 'instagram-feed' ) ) ); } $args = array( 'plugin_name' => self::NAME, 'plugin_slug' => 'pro', 'plugin_path' => plugin_basename( __FILE__ ), 'plugin_url' => trailingslashit( WP_PLUGIN_URL ) . 'pro', 'home_url' => $home_url, 'version' => '1.0', 'key' => $license, ); $url = add_query_arg( $args, self::CHECK_URL ); $remote_request_args = array( 'timeout' => '20', ); $response = wp_remote_get( $url, $remote_request_args ); if ( ! is_wp_error( $response ) ) { $body = wp_remote_retrieve_body( $response ); $check_key_response = json_decode( $body, true ); if ( empty( $check_key_response['license_data'] ) ) { wp_send_json_error( array( 'message' => esc_html( SBI_Upgrader::get_error_message( $check_key_response ) ), ) ); } if ( ! empty( $check_key_response['license_data']['error'] ) ) { wp_send_json_error( array( 'message' => SBI_Upgrader::get_error_message( $check_key_response ), ) ); } if ( ! empty( $check_key_response['license_data']['error'] ) ) { wp_send_json_error( array( 'message' => SBI_Upgrader::get_error_message( $check_key_response ), ) ); } if ( $check_key_response['license_data']['license'] !== 'valid' ) { wp_send_json_error( array( 'message' => SBI_Upgrader::get_error_message( $check_key_response ), ) ); } $license_data = $check_key_response['license_data']; update_option( 'sbi_license_key', $license ); update_option( 'sbi_license_data', $license_data ); update_option( 'sbi_license_status', $license_data['license'] ); // Redirect. $oth = hash( 'sha512', wp_rand() ); $hashed_oth = hash_hmac( 'sha512', $oth, wp_salt() ); update_option( 'sbi_one_click_upgrade', $oth ); $version = '1.0'; $version_info = SBI_Upgrader::get_version_info( $license_data ); $file = ''; if ( isset( $version_info->package ) ) { $file = $version_info->package; } $siteurl = admin_url(); $endpoint = admin_url( 'admin-ajax.php' ); $redirect = admin_url( 'admin.php?page=' . self::REDIRECT ); $url = add_query_arg( array( 'key' => $license, 'oth' => $hashed_oth, 'endpoint' => $endpoint, 'version' => $version, 'siteurl' => $siteurl, 'homeurl' => $home_url, 'redirect' => rawurldecode( base64_encode( $redirect ) ), 'file' => rawurldecode( base64_encode( $file ) ), 'plugin_name' => self::NAME, ), self::UPGRADE_URL ); wp_send_json_success( array( 'url' => $url, ) ); } wp_send_json_error( array( 'message' => esc_html__( 'Could not connect.', 'instagram-feed' ) ) ); } /** * Endpoint for one-click upgrade. * * @since 4.0 */ public static function install_upgrade() { $error = esc_html__( 'Could not install upgrade. Please download from smashballoon.com and install manually.', 'instagram-feed' ); // verify params present (oth & download link). $post_oth = ! empty( $_REQUEST['oth'] ) ? sanitize_text_field( $_REQUEST['oth'] ) : ''; $post_url = ! empty( $_REQUEST['file'] ) ? $_REQUEST['file'] : ''; if ( empty( $post_oth ) || empty( $post_url ) ) { wp_send_json_error( $error ); } // Verify oth. $oth = get_option( 'sbi_one_click_upgrade' ); if ( empty( $oth ) ) { wp_send_json_error( $error ); } if ( hash_hmac( 'sha512', $oth, wp_salt() ) !== $post_oth ) { wp_send_json_error( $error ); } // Delete so cannot replay. delete_option( 'sbi_one_click_upgrade' ); // Set the current screen to avoid undefined notices. set_current_screen( self::REDIRECT ); // Prepare variables. $url = esc_url_raw( add_query_arg( array( 'page' => self::REDIRECT, ), admin_url( 'admin.php' ) ) ); // Verify pro not installed. $active = activate_plugin( self::SLUG, $url, false, true ); if ( ! is_wp_error( $active ) ) { deactivate_plugins( plugin_basename( SBI_PLUGIN_DIR ) ); wp_send_json_success( esc_html__( 'Plugin installed & activated.', 'instagram-feed' ) ); } $creds = request_filesystem_credentials( $url, '', false, false, null ); // Check for file system permissions. if ( false === $creds ) { wp_send_json_error( $error ); } if ( ! WP_Filesystem( $creds ) ) { wp_send_json_error( $error ); } // We do not need any extra credentials if we have gotten this far, so let's install the plugin. $license = get_option( 'sbi_license_key' ); if ( empty( $license ) ) { wp_send_json_error( new \WP_Error( '403', esc_html__( 'You are not licensed.', 'instagram-feed' ) ) ); } // Do not allow WordPress to search/download translations, as this will break JS output. remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 ); // Create the plugin upgrader with our custom skin. $installer = new \Sbi\Helpers\PluginSilentUpgrader( new \SBI_Install_Skin() ); // Error check. if ( ! method_exists( $installer, 'install' ) || empty( $post_url ) ) { wp_send_json_error( $error ); } $license_data = get_option( 'sbi_license_data' ); if ( ! empty ( $license_data ) ) { $version_info = SBI_Upgrader::get_version_info( $license_data ); $file = ''; if ( isset( $version_info->package ) ) { $file = $version_info->package; } } else { wp_send_json_error( new \WP_Error( '403', esc_html__( 'You are not licensed.', 'instagram-feed' ) ) ); } if ( ! empty( $file ) ) { $installer->install( $file ); // phpcs:ignore // Check license key. // Flush the cache and return the newly installed plugin basename. wp_cache_flush(); $plugin_basename = $installer->plugin_info(); if ( $plugin_basename ) { deactivate_plugins( plugin_basename( SBI_PLUGIN_BASENAME ), true ); // Activate the plugin silently. $activated = activate_plugin( $plugin_basename ); if ( ! is_wp_error( $activated ) ) { wp_send_json_success( esc_html__( 'Plugin installed & activated.', 'instagram-feed' ) ); } else { // Reactivate the lite plugin if pro activation failed. $activated = activate_plugin( plugin_basename( SBI_PLUGIN_BASENAME ), '', false, true ); wp_send_json_error( esc_html__( 'Pro version installed but needs to be activated from the Plugins page inside your WordPress admin.', 'instagram-feed' ) ); } } } wp_send_json_error( $error ); } /** * Whether or not it's likely to be a reachable URL for upgrade * * @param string $url * * @return bool * * @since 4.0 */ public static function is_dev_url( $url = '' ) { $is_local_url = false; // Trim it up $url = strtolower( trim( $url ) ); // Need to get the host...so let's add the scheme so we can use parse_url if ( false === strpos( $url, 'http://' ) && false === strpos( $url, 'https://' ) ) { $url = 'http://' . $url; } $url_parts = parse_url( $url ); $host = ! empty( $url_parts['host'] ) ? $url_parts['host'] : false; if ( ! empty( $url ) && ! empty( $host ) ) { if ( false !== ip2long( $host ) ) { if ( ! filter_var( $host, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) ) { $is_local_url = true; } } elseif ( 'localhost' === $host ) { $is_local_url = true; } $tlds_to_check = array( '.local', ':8888', ':8080', ':8081', '.invalid', '.example', '.test' ); foreach ( $tlds_to_check as $tld ) { if ( false !== strpos( $host, $tld ) ) { $is_local_url = true; break; } } if ( substr_count( $host, '.' ) > 1 ) { $subdomains_to_check = []; foreach ( $subdomains_to_check as $subdomain ) { $subdomain = str_replace( '.', '(.)', $subdomain ); $subdomain = str_replace( array( '*', '(.)' ), '(.*)', $subdomain ); if ( preg_match( '/^(' . $subdomain . ')/', $host ) ) { $is_local_url = true; break; } } } } return $is_local_url; } /** * Handle API Response and check for an error. * * @param array $response * * @return string * * @since 4.0 */ public static function get_error_message( $response ) { $message = ''; if ( isset( $response['license_data']['license'] ) && $response['license_data']['license'] === 'invalid'){ $message = __( 'This license is NOT valid.', 'instagram-feed' ); } if ( isset( $response['error'] ) ) { $error = sanitize_text_field( $response['error'] ); switch ( $error ) { case 'expired': $message = __( 'This license is expired.', 'instagram-feed' ); break; default : $message = __( 'We encountered a problem unlocking the PRO features. Please install the PRO version manually.', 'instagram-feed' ); } } return $message; } } PKL\)instagram-feed/admin/SBI_HTTP_Request.phpnu[ array( 'Content-Type' => 'application/json', ), ); $args = array_merge( $args, $data ); if ( 'GET' === $method ) { $request = wp_remote_get( $url, $args ); } elseif ( 'DELETE' === $method ) { $args['method'] = 'DELETE'; $request = wp_remote_request( $url, $args ); } elseif ( 'PATCH' === $method ) { $args['method'] = 'PATCH'; $request = wp_remote_request( $url, $args ); } elseif ( 'PUT' === $method ) { $args['method'] = 'PUT'; $request = wp_remote_request( $url, $args ); } else { $args['method'] = 'POST'; $request = wp_remote_post( $url, $args ); } return $request; } /** * Check if WP_Error returned * * @param array|WP_Error $request * * @since 4.0 * * @return array|WP_Error */ public static function is_error( $request ) { return is_wp_error( $request ); } /** * Get the remote call status code * * @param array|WP_Error $request * * @since 4.0 * * @return array|WP_Error */ public static function status( $request ) { if ( is_wp_error( $request ) ) { return; } return wp_remote_retrieve_response_code( $request ); } /** * Get the remote call body data * * @param array|WP_Error $request * * @since 4.0 * * @return array $response */ public static function data( $request ) { $response = wp_remote_retrieve_body( $request ); return json_decode( $response ); } } PKL\{TYGSGS$instagram-feed/admin/SBI_oEmbeds.phpnu[init(); } /** * Determining if the user is viewing the our page, if so, party on. * * @since 4.0 */ public function init() { if ( ! is_admin() ) { return; } add_action('admin_menu', [$this, 'register_menu']); add_action( 'wp_ajax_disable_instagram_oembed_from_instagram', [$this, 'disable_instagram_oembed_from_instagram'] ); add_action( 'wp_ajax_disable_facebook_oembed_from_instagram', [$this, 'disable_facebook_oembed_from_instagram'] ); } /** * Register Menu. * * @since 4.0 */ public function register_menu() { $cap = current_user_can( 'manage_instagram_feed_options' ) ? 'manage_instagram_feed_options' : 'manage_options'; $cap = apply_filters( 'sbi_settings_pages_capability', $cap ); $oembeds_manager = add_submenu_page( 'sb-instagram-feed', __( 'oEmbeds', 'instagram-feed' ), __( 'oEmbeds', 'instagram-feed' ), $cap, self::SLUG, [$this, 'oembeds_manager'], 2 ); add_action( 'load-' . $oembeds_manager, [$this,'oembeds_enqueue_admin_scripts']); } /** * Disable Instagram oEmbed * * @since 4.0 * * @return SBI_Response */ public function disable_instagram_oembed_from_instagram () { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); // This auto-dies. } $oembed_settings = get_option( 'sbi_oembed_token', array() ); $oembed_settings['access_token'] = ''; $oembed_settings['disabled'] = true; update_option( 'sbi_oembed_token', $oembed_settings ); $response = new SBI_Response( true, array( 'connectionUrl' => $this->get_connection_url() ) ); $response->send(); } /** * Disable Facebook oEmbed * * @since 4.0 * * @return SBI_Response */ public function disable_facebook_oembed_from_instagram () { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); // This auto-dies. } $oembed_settings = get_option( 'cff_oembed_token', array() ); $oembed_settings['access_token'] = ''; $oembed_settings['disabled'] = true; update_option( 'cff_oembed_token', $oembed_settings ); $response = new SBI_Response( true, array( 'connectionUrl' => $this->get_connection_url() ) ); $response->send(); } /** * Enqueue oEmbeds CSS & Script. * * Loads only for oEmbeds page * * @since 4.0 */ public function oembeds_enqueue_admin_scripts(){ if( ! get_current_screen() ) { return; } $screen = get_current_screen(); if ( ! 'instagram-feed_page_sbi-oembeds-manager' === $screen->id ) { return; } wp_enqueue_style( 'oembeds-style', SBI_PLUGIN_URL . 'admin/assets/css/oembeds.css', false, SBIVER ); wp_enqueue_script( 'sb-vue', SBI_PLUGIN_URL . 'js/vue.min.js', null, '2.6.12', true ); wp_enqueue_script( 'oembeds-app', SBI_PLUGIN_URL.'admin/assets/js/oembeds.js', null, SBIVER, true ); $sbi_oembends = $this->statuses_and_info(); $sbi_oembends['nonce'] = wp_create_nonce( 'sbi-admin' ); wp_localize_script( 'oembeds-app', 'sbi_oembeds', $sbi_oembends ); } /** * Statuses and info about the current state of oEmbed connection * * @return array * * @since 4.0 */ public function statuses_and_info() { $return = array( 'admin_url' => admin_url(), 'ajax_handler' => admin_url( 'admin-ajax.php' ), 'supportPageUrl' => admin_url( 'admin.php?page=sbi-support' ), 'links' => \InstagramFeed\Builder\SBI_Feed_Builder::get_links_with_utm(), 'socialWallLinks' => \InstagramFeed\Builder\SBI_Feed_Builder::get_social_wall_links(), 'socialWallActivated' => is_plugin_active( 'social-wall/social-wall.php' ), 'genericText' => array( 'help' => __( 'Help', 'instagram-feed' ), 'title' => __( 'oEmbeds', 'instagram-feed' ), 'description' => __( 'Use Smash Balloon to power any Instagram or Facebook oEmbeds across your site. Just click the button below and we\'ll do the rest. ', 'instagram-feed' ), 'instagramOEmbeds' => __( 'Instagram oEmbeds are currently not being handled by Smash Balloon', 'instagram-feed' ), 'instagramOEmbedsEnabled' => __( 'Instagram oEmbeds are turned on', 'instagram-feed' ), 'facebookOEmbeds' => __( 'Facebook oEmbeds are currently not being handled by Smash Balloon', 'instagram-feed' ), 'facebookOEmbedsEnabled' => __( 'Facebook oEmbeds are turned on', 'instagram-feed' ), 'enable' => __( 'Enable', 'instagram-feed' ), 'disable' => __( 'Disable', 'instagram-feed' ), 'whatAreOembeds' => __( 'What are oEmbeds?', 'instagram-feed' ), 'whatElseOembeds' => __( 'What else can the Instagram Feed plugin do?', 'instagram-feed' ), 'whenYouPaste' => __( 'When you paste a link to a Instagram or Facebook post in WordPress, it automatically displays the post instead of the URL. That is called an oEmbed.', 'instagram-feed' ), 'dueToRecent' => __( 'Due to recent API changes from Instagram, WordPress cannot automatically embed your posts.', 'instagram-feed' ), 'however' => __( 'However, we have added this feature to Smash Balloon to make sure your oEmbeds keep working.', 'instagram-feed' ), 'justEnable' => __( 'Just enable it above, and all your existing and new embeds should work automatically, no other input required.', 'instagram-feed' ), 'displayACompletely' => __( 'Display a completely customizable Instagram Feed with tons of features', 'instagram-feed' ), 'createACustom' => __( 'Create a custom styled feed of your Instagram posts which integrates seamlessly with your WordPress theme.', 'instagram-feed' ), ), 'images' => array( 'fbIcon' => '', 'instaIcon' => '', 'image1_2x' => SBI_PLUGIN_URL . 'admin/assets/img/oembeds-image-1@2x.png', 'image2_2x' => SBI_PLUGIN_URL . 'admin/assets/img/oembeds-image-2@2x.png', 'image3_2x' => SBI_PLUGIN_URL . 'admin/assets/img/oembeds-image-3@2x.png', 'image4_2x' => SBI_PLUGIN_URL . 'admin/assets/img/oembeds-image-4@2x.png', ), 'modal' => array( 'title' => __( 'Enable Facebook oEmbeds', 'instagram-feed' ), 'description' => __( 'To enable Facebook oEmbeds our Custom Facebook Feed plugin is required. Click the button below to Install it and enable Facebook oEmbeds.', 'instagram-feed' ), 'install' => __( 'Install Plugin', 'instagram-feed' ), 'activate' => __( 'Activate Plugin', 'instagram-feed' ), 'cancel' => __( 'Cancel', 'instagram-feed' ), 'instaIcon' => SBI_PLUGIN_URL . 'admin/assets/img/facebook-color-icon.svg', 'timesIcon' => '', 'plusIcon' => '' ), 'loaderSVG' => '', 'checkmarkSVG' => '', 'timesCircleSVG' => '' ); $oembed_token_settings = get_option( 'sbi_oembed_token', array() ); $saved_access_token_data = isset( $oembed_token_settings['access_token'] ) ? $oembed_token_settings['access_token'] : false; $newly_retrieved_oembed_connection_data = $this->maybe_connection_data( $saved_access_token_data ); if ( ! empty( $newly_retrieved_oembed_connection_data['access_token'] ) ) { $oembed_token_settings = $newly_retrieved_oembed_connection_data; $return['newOembedData'] = $newly_retrieved_oembed_connection_data; update_option( 'cff_oembed_token', $newly_retrieved_oembed_connection_data ); update_option( 'sbi_oembed_token', $newly_retrieved_oembed_connection_data ); // If the access token is new or has changed, then we need to clear the cache. $this->clear_oembed_cache(); } elseif ( ! empty( $newly_retrieved_oembed_connection_data ) ) { $return['newOembedData'] = $newly_retrieved_oembed_connection_data; } $return['connectionURL'] = $this->get_connection_url(); $return['tokenData'] = $oembed_token_settings; $return['instagram'] = array( 'doingOembeds' => $this->instagram_oembed_enabled() ); $return['facebook'] = [ 'active' => class_exists( '\CustomFacebookFeed\CFF_Oembed' ), 'doingOembeds' => false ]; $return['facebook']['installer'] = $this->facebook_installer_info(); if ( class_exists( '\CustomFacebookFeed\CFF_Oembed' ) ) { $return['facebook']['doingOembeds'] = \CustomFacebookFeed\CFF_Oembed::can_do_oembed(); } return $return; } /** * Clear instagram oembed transients and cache * * @since 6.1.2 */ public static function clear_oembed_cache() { // get _transient_oembed_* options from wp_options. global $wpdb; $table_name = $wpdb->prefix . 'options'; $transient_options = $wpdb->get_results( $wpdb->prepare( "SELECT option_name, option_value FROM $table_name WHERE option_name LIKE %s AND option_value LIKE %s", '_transient_oembed_%', '%fbtrace_id%' ) ); foreach ( $transient_options as $value ) { $option_name = $value->option_name; delete_option( $option_name ); // find the _transient_timeout_oembed_* options and delete them. $option_key = substr( $option_name, 18 ); $timeout_key = '_transient_timeout_oembed_' . $option_key; $timeout_value = get_option( $timeout_key ); if ( is_numeric( $timeout_value ) ) { delete_option( $timeout_key ); } } // get _oembed_* options from wp_postmeta. $postmeta_table = $wpdb->prefix . 'postmeta'; $oembed_options = $wpdb->get_results( $wpdb->prepare( "SELECT post_id, meta_key, meta_value FROM $postmeta_table WHERE meta_key LIKE %s AND meta_value LIKE %s", '_oembed_%', '{{unknown}}' ) ); foreach ( $oembed_options as $value ) { $post_id = $value->post_id; $meta_key = $value->meta_key; $meta_value = $value->meta_value; $meta_value = maybe_unserialize( $meta_value ); delete_post_meta( $post_id, $meta_key ); // get the cache key. $cache_key = substr( $meta_key, 8 ); $cache_meta_key = '_oembed_time_' . $cache_key; $cache_meta_value = get_post_meta( $post_id, $cache_meta_key, true ); if ( is_numeric( $cache_meta_value ) ) { delete_post_meta( $post_id, $cache_meta_key ); } } } /** * Connection URLs are based on the website connecting accounts so that is * configured here and returned * * @return string * * @since 4.0 */ public static function get_connection_url() { $admin_url_state = admin_url( 'admin.php?page=sbi-oembeds-manager' ); $nonce = wp_create_nonce('sbi_con'); //If the admin_url isn't returned correctly then use a fallback if( $admin_url_state == '/wp-admin/admin.php?page=sbi-oembeds-manager' ){ $admin_url_state = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; } return array( 'connect' => SBI_OEMBED_CONNECT_URL, 'sbi_con' => $nonce, 'stateURL' => $admin_url_state ); } /** * Listener for retrieving and storing an access token for oEmbeds * * @param string $saved_access_token_data * * @return array|bool * * @since 4.0 */ public static function maybe_connection_data( $saved_access_token_data ) { $screen = get_current_screen(); if ( ! $screen ) { return false; } if( ! isset( $_GET['page'] ) && 'sbi-oembeds-manager' !== $_GET['page'] ) { return false; } global $sbi_notices; $oembed_success_notice = $sbi_notices->get_notice('oembed_api_change_reconnect'); if ($oembed_success_notice) { $sbi_notices->remove_notice('oembed_api_change_reconnect'); } if ( ! empty( $_GET['transfer'] ) ) { if ( class_exists( '\CustomFacebookFeed\CFF_Oembed' ) ) { $cff_oembed_token = \CustomFacebookFeed\CFF_Oembed::last_access_token(); $return = get_option( 'cff_oembed_token', array() ); $return['access_token'] = $cff_oembed_token; $return['disabled'] = false; return $return; } } if ( isset( $_GET['sbi_access_token'] ) ) { $access_token = sbi_sanitize_alphanumeric_and_equals( $_GET['sbi_access_token'] ); $return = []; $valid_new_access_token = ! empty( $access_token ) && strlen( $access_token ) > 20 && $saved_access_token_data !== $access_token ? $access_token : false; if ( $valid_new_access_token ) { $return['access_token'] = $valid_new_access_token; $return['disabled'] = false; $return['expiration_date'] = 'never'; $message = '

' . __('oEmbed account successfully connected. You are all set to continue creating oEmbeds.', 'instagram-feed') . '

'; $success_args = array( 'class' => 'sbi-admin-notices', 'message' => $message, 'dismissible' => true, 'dismiss' => array( 'class' => 'sbi-notice-dismiss', 'icon' => SBI_PLUGIN_URL . 'admin/assets/img/sbi-dismiss-icon.svg', 'tag' => 'a', 'href' => '#', ), 'priority' => 1, 'page' => array( 'sbi-oembeds-manager', ), 'icon' => array( 'src' => SBI_PLUGIN_URL . 'admin/assets/img/sbi-exclamation.svg', 'wrap' => '', ), 'styles' => array( 'display' => 'flex', 'justify-content' => 'space-between', 'gap' => '2rem', ), 'wrap_schema' => '
{icon}
{message}
{dismiss}
', ); $sbi_notices->add_notice('oembed_api_change_reconnect', 'information', $success_args); } else { if ( $saved_access_token_data === $access_token ) { $return['error'] = 'Not New'; } else { $return['error'] = 'Not Valid'; } } return $return; } return false; } /** * Check if Instagram oEmbed is enabled or not * * @return bool * * @since 4.0 */ public function instagram_oembed_enabled() { $sbi_oembed_token = get_option( 'sbi_oembed_token' ); if ( isset( $sbi_oembed_token['access_token'] ) && isset( $sbi_oembed_token['disabled'] ) && ! $sbi_oembed_token['disabled'] ) { return true; } return false; } /** * Check if Facebook oEmbed is enabled or not * * @return bool * * @since 4.0 */ public function facebook_oembed_enabled() { $cff_oembed_token = get_option( 'cff_oembed_token' ); if ( isset( $cff_oembed_token['access_token'] ) && isset( $cff_oembed_token['disabled'] ) && ! $cff_oembed_token['disabled'] ) { return true; } return false; } /** * Determines what action for Instagram should be done in the following order * and returns data used in the common "addon" installer * * Free or Pro active, do nothing * Pro installed but not active, activate Pro * Free installed but not active, activate Free * Nothing installed, install and activate Free * * @return array * * @since 4.0 */ public static function facebook_installer_info() { $all_plugins = get_plugins(); $active_plugins = get_option( 'active_plugins' ); if ( in_array( 'custom-facebook-feed/custom-facebook-feed.php', $active_plugins, true ) || in_array( 'custom-facebook-feed-pro/custom-facebook-feed.php', $active_plugins, true ) ) { return [ 'nextStep' => 'none', 'plugin' => 'none', 'action' => 'none', 'referrer' => 'oembeds' ]; } foreach ( $all_plugins as $plugin ) { if ( strpos( $plugin['Name'], 'Custom Facebook Feed Pro' ) !== false ) { return [ 'nextStep' => 'pro_activate', 'plugin' => 'custom-facebook-feed-pro/custom-facebook-feed.php', 'action' => 'sbi_activate_addon', 'referrer' => 'oembeds' ]; } if ( strpos( $plugin['Name'], 'Custom Facebook Feed' ) !== false ) { return [ 'nextStep' => 'free_activate', 'plugin' => 'custom-facebook-feed/custom-facebook-feed.php', 'action' => 'sbi_activate_addon', 'referrer' => 'oembeds' ]; } } return [ 'nextStep' => 'free_install', 'plugin' => 'https://downloads.wordpress.org/plugin/custom-facebook-feed.zip', 'action' => 'sbi_install_addon', 'referrer' => 'oembeds' ]; } /** * oEmbeds Manager Page View Template * * @since 4.0 */ public function oembeds_manager(){ \InstagramFeed\SBI_View::render( 'oembeds.index' ); } } PKL\C  .instagram-feed/admin/views/oembeds/content.phpnu[

{{genericText.title}}

{{genericText.description}}

{{genericText.instagramOEmbedsEnabled}} {{genericText.instagramOEmbeds}}
{{genericText.facebookOEmbedsEnabled}} {{genericText.facebookOEmbeds}}

{{genericText.whatElseOembeds}}

{{genericText.whatAreOembeds}}

PKL\F*qq,instagram-feed/admin/views/oembeds/index.phpnu[
PKL\/gg,instagram-feed/admin/views/oembeds/modal.phpnu[

{{modal.title}}

{{modal.description}}

PKL\Hm6instagram-feed/admin/views/oembeds/oembed_features.phpnu[

{{genericText.whenYouPaste}}

{{genericText.dueToRecent}}

{{genericText.however}}

{{genericText.justEnable}}

PKL\86pp2instagram-feed/admin/views/oembeds/plugin_info.phpnu[

{{genericText.displayACompletely}}

{{genericText.createACustom}}

PKL\22,instagram-feed/admin/views/about/content.phpnu[

{{genericText.title}}

{{aboutBox.atSmashBalloon}}

{{aboutBox.weAreOn}}

{{aboutBox.ourPlugins}}

{{genericText.title2}}

{{genericText.description2}}

{{plugin.title}}

{{plugin.description}}

{{social_wall.title}}

{{social_wall.description}}

{{buttons.viewDemo}}

{{genericText.title3}}

PKL\2kk*instagram-feed/admin/views/about/index.phpnu[
PKL\% ^:instagram-feed/admin/views/sections/builder_footer_cta.phpnu[

{{genericText.getMoreFeatures}}

{{genericText.liteFeedUsersAutoApply}} {{genericText.tryDemo}}
{{genericText.ctaHashtag}}
{{genericText.ctaLayout}}
{{genericText.ctaPopups}}
{{genericText.ctaFilter}}

{{genericText.andMuchMore}}

  • {{item}}
PKL\;instagram-feed/admin/views/sections/settings_footer_cta.phpnu[

{{genericText.getMoreFeatures}}

{{genericText.liteFeedUsersAutoApply}}
{{genericText.ctaHashtag}}
{{genericText.ctaLayout}}
{{genericText.ctaPopups}}
{{genericText.ctaFilter}}

{{genericText.andMuchMore}}

  • {{item}}
{{genericText.tryDemo}}
PKL\Z3)3).instagram-feed/admin/views/sections/header.phpnu[
PKL\W 5instagram-feed/admin/views/sections/sticky_widget.phpnu[
PKL\O| /instagram-feed/admin/views/settings/content.phpnu[

{{genericText.settings}}

PKL\  -instagram-feed/admin/views/settings/index.phpnu[
PKL\a$1instagram-feed/admin/views/settings/tab/feeds.phpnu[

{{feedsTab.cachingBox.title}}

{{feedsTab.gdprBox.title}}

{{feedsTab.gdprBox.gdprTooltipFeatureInfo.headline}}
  • {{feature}}

{{feedsTab.customCSSBox.title}}

{{feedsTab.customJSBox.title}}

PKL\Ͽ**4instagram-feed/admin/views/settings/tab/advanced.phpnu[

{{advancedTab.optimizeBox.header}}

{{advancedTab.optimizeBox.title}}

{{advancedTab.legacyCSSBox.title}}

{{advancedTab.ajaxBox.title}}

{{advancedTab.ajaxBox.helpText}}

{{advancedTab.resetErrorBox.title}}

{{advancedTab.resetErrorBox.helpText}}

{{advancedTab.usageBox.title}}

{{advancedTab.ajaxInitial.title}}

{{advancedTab.ajaxInitial.helpText}}

{{advancedTab.enqueueHead.title}}

{{advancedTab.enqueueHead.helpText}}

{{advancedTab.enqueueShortcode.title}}

{{advancedTab.enqueueShortcode.helpText}}

{{advancedTab.jsImages.title}}

{{advancedTab.jsImages.helpText}}

{{advancedTab.adminErrorBox.title}}

{{advancedTab.adminErrorBox.helpText}}

{{advancedTab.feedIssueBox.title}}

{{advancedTab.feedIssueBox.sendReport}} {{advancedTab.feedIssueBox.to}}

{{advancedTab.dpaClear.title}}

{{advancedTab.dpaClear.helpText}}
PKL\HH3instagram-feed/admin/views/settings/tab/general.phpnu[

{{generalTab.uoInstallNotice.notice}}

{{generalTab.licenseBox.title}}

{{generalTab.licenseBox.description}}

{{generalTab.licenseBox.test}} {{generalTab.licenseBox.upgrade}}
{{generalTab.licenseBox.test}} {{generalTab.licenseBox.upgrade}}

{{generalTab.manageSource.title}}

{{generalTab.manageSource.description}}
{{genericText.addSource}}
{{source.username}}
{{genericText.id}} {{source.account_id}}

{{generalTab.preserveBox.title}}

{{generalTab.preserveBox.description}}

{{generalTab.importBox.title}}

{{generalTab.importBox.description}}

{{generalTab.exportBox.title}}

{{generalTab.exportBox.description}}
PKL\10"}//.instagram-feed/admin/views/support/content.phpnu[

{{genericText.title}}

{{genericText.gettingStarted}}

{{genericText.someHelpful}}

{{genericText.docsN}}

{{genericText.runInto}}

{{genericText.additionalR}}

{{genericText.toHelp}}

{{genericText.needMore}}

{{buttons.submitTicket}}

{{genericText.ourFast}}

{{genericText.systemInfo}}

{{genericText.newTempHeading}}

{{genericText.newTempDesc}}

{{genericText.tempLoginHeading}}

{{genericText.tempLoginDesc}}

{{genericText.link}} {{genericText.expires}}
{{tempUser.url}} {{tempUser.expires_date + ' ' + ( parseInt(tempUser.expires_date) <= 1 ? genericText.day : genericText.days)}}
PKL\qq,instagram-feed/admin/views/support/index.phpnu[
PKL\4instagram-feed/admin/views/support/support-tools.phpnu[

<?php echo esc_attr($connected_account['username']); ?>

:
:

:
:

:
: : :

get_system_info(); ?>
init(); } /** * Determining if the user is viewing the our page, if so, party on. * * @since 4.0 */ public function init() { if ( ! is_admin() ) { return; } add_action( 'in_admin_header', [ $this, 'remove_admin_notices' ] ); add_action( 'wp_ajax_sbi_check_license', [ $this, 'sbi_check_license' ] ); add_action( 'sbi_header_notices', array( $this, 'header_notices' ) ); add_action( 'wp_ajax_sbi_dismiss_upgrade_notice', array( $this, 'dismiss_upgrade_notice' ) ); add_action( 'admin_init', array( $this, 'sbi_admin_notices' ) ); add_action( 'sb_notice_custom_feed_templates_dismissed', array( $this, 'sbi_dismiss_notice' ) ); } /** * Header Notices * * @since 6.0 */ public function header_notices() { $lite_notice_dismissed = get_transient( 'instagram_feed_dismiss_lite' ); if ( $lite_notice_dismissed ) { return; } $output = ''; $upgrade_url = 'https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free&utm_source=lite-upgrade-bar'; $output .= '
'; $output .= sprintf( '%s %s', __('You\'re using Instagram Feed Lite. To unlock more features consider', 'instagram-feed'), $upgrade_url, __('upgrading to Pro', 'instagram-feed') ); $output .= sprintf( '', __('Dismiss this message', 'instagram-feed'), '' ); $output .= '
'; echo $output; } /** * Dismiss Upgrade Notice * * @since 6.0 * * @return SBI_Response */ public function dismiss_upgrade_notice() { // Run a security check. check_ajax_referer( 'sbi_nonce' , 'sbi_nonce'); $cap = current_user_can( 'manage_instagram_feed_options' ) ? 'manage_instagram_feed_options' : 'manage_options'; $cap = apply_filters( 'sbi_settings_pages_capability', $cap ); if ( ! current_user_can( $cap ) ) { wp_send_json_error(); // This auto-dies. } // set the transient so it will hide for next 7 days set_transient( 'instagram_feed_dismiss_lite', 'dismiss', 1 * WEEK_IN_SECONDS ); $response = new SBI_Response( true, array() ); $response->send(); } /** * Remove admin notices from inside our plugin screens so we can show our customized notices * * @since 4.0 */ public function remove_admin_notices() { $current_screen = get_current_screen(); $not_allowed_screens = array( 'instagram-feed_page_sbi-feed-builder', 'instagram-feed_page_sbi-settings', 'instagram-feed_page_sbi-oembeds-manager', 'instagram-feed_page_sbi-extensions-manager', 'instagram-feed_page_sbi-about-us', 'instagram-feed_page_sbi-support', ); if ( in_array( $current_screen->base, $not_allowed_screens ) || strpos( $current_screen->base, 'sbi-' ) !== false ) { remove_all_actions('admin_notices'); remove_all_actions('all_admin_notices'); } } /** * CFF Get Renew License URL * * @since 4.0 * * @return string $url */ public function get_renew_url() { global $sbi_download_id; $license_key = get_option( 'sbi_license_key' ) ? get_option( 'sbi_license_key' ) : null; $url = sprintf( 'https://smashballoon.com/checkout/?edd_license_key=%s&download_id=%s&utm_campaign=instagram-free&utm_source=expired-notice&utm_medium=renew-license', $license_key, $sbi_download_id ); return $url; } /** * CFF Check License * * @since 4.0 * * @return SBI_Response */ public function sbi_check_license() { // Run a security check. check_ajax_referer( 'sbi_nonce' , 'sbi_nonce'); $cap = current_user_can( 'manage_instagram_feed_options' ) ? 'manage_instagram_feed_options' : 'manage_options'; $cap = apply_filters( 'sbi_settings_pages_capability', $cap ); if ( ! current_user_can( $cap ) ) { wp_send_json_error(); // This auto-dies. } $sbi_license = trim( get_option( 'sbi_license_key' ) ); // Check the API $sbi_api_params = array( 'edd_action'=> 'check_license', 'nocache' => '1', 'license' => $sbi_license, 'item_name' => urlencode( SBI_PLUGIN_NAME ) // the name of our product in EDD ); $sbi_response = wp_remote_get( add_query_arg( $sbi_api_params, SBI_STORE_URL ), array( 'timeout' => 60 ) ); $sbi_license_data = (array) json_decode( wp_remote_retrieve_body( $sbi_response ) ); // Update the updated license data update_option( 'sbi_license_data', $sbi_license_data ); $sbi_todays_date = date('Y-m-d'); // Check whether it's active if( $sbi_license_data['license'] !== 'expired' && ( strtotime( $sbi_license_data['expires'] ) > strtotime($sbi_todays_date) ) ) { // if the license is active then lets remove the ignore check for dashboard so next time it will show the expired notice in dashboard screen update_user_meta( get_current_user_id(), 'sbi_ignore_dashboard_license_notice', false ); $response = new SBI_Response( true, array( 'msg' => 'License Active', 'content' => $this->get_renewed_license_notice_content() ) ); $response->send(); } else { $content = 'Your Instagram Feed Pro license key has expired'; $response = new SBI_Response( false, array( 'msg' => 'License Not Renewed', 'content' => $content ) ); $response->send(); } } /** * Get content for successfully renewed license notice * * @since 4.0 * * @return string $output */ public function get_renewed_license_notice_content() { $output = '

Thanks! Your license key is valid.

You can safely dismiss this modal.

'; return $output; } /** * Get modal content that will trigger by "Why Renew" button * * @since 4.0 * * @return string $output */ public function get_modal_content() { $output = '

Why Renew?

See below for why it\'s so important to keep an active plugin license.

Protected Against All Upcoming Instagram Platform Updates and API Changes

Don\'t worry about your Instagram feeds breaking due to constant changes in the Instagram platform. Stay protected with access to continual plugin updates, giving you peace of mind that the software will always be up to date.

Expert Technical Support

Without a valid license key you will no longer be able to receive updates or support for the Instagram Feed plugin. A renewed license key grants you access to our top-notch, quick and effective support for another full year.

WordPress Compatibility Updates

With WordPress updates being released continually, we make sure the plugin is always compatible with the latest version so you can update WordPress without needing to worry.

All Pro Instagram Feed Features

Photos & Albums, Videos (HD, 360, Live), Instagram Events, Popup Lightbox, Likes, Shares, & Reactions, Comments and Replies, Filter Posts, Post Layouts, Load More Posts, Multi-column Grid Layout, Background Caching, and more!

'; return $output; } /** * Display admin notices in the plugin's pages * * @since 6.3 */ public function sbi_admin_notices() { $allowed_screens = array( 'sbi-feed-builder', 'sbi-settings', 'sbi-oembeds-manager', 'sbi-extensions-manager', 'sbi-about-us', 'sbi-support', ); $current_screen = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; $is_allowed = in_array( $current_screen, $allowed_screens ); // We will display the notice only on those allowed screens. if ( ! $current_screen || ! $is_allowed ) { return; } // Only display notice to admins. if( !sbi_current_user_can( 'manage_instagram_feed_options' ) ){ return; } $has_custom_templates = Util::sbi_has_custom_templates(); $sbi_statuses = get_option( 'sbi_statuses', array() ); if ( ! $has_custom_templates ) { $sbi_statuses['custom_templates_notice'] = true; update_option( 'sbi_statuses', $sbi_statuses ); return; } if ( true == get_option( 'sbi_custom_templates_notice_dismissed' ) || isset( $sbi_statuses['custom_templates_notice'] ) ) { return; } global $sbi_notices; $title = __( 'Heads Up! Feed Item Files and CSS Have Changed', 'instagram-feed' ); $message = '

' . __( 'Version 6.3 includes changes to the HTML and CSS files that make up your feeds. If you have customized your feed through custom theme templates, custom CSS, or custom JavaScript, your customizations may have been affected.', 'instagram-feed' ) . '

'; $message .= '

' . __( 'You can use the CSS file from previous versions if needed. Enable the related setting on the Advanced tab of the settings page.', 'instagram-feed' ) . '

'; $error_args = array( 'class' => 'sbi-admin-notices sbi-admin-notices-spaced-p', 'title' => array( 'text' => $title, 'class' => 'sb-notice-title', 'tag' => 'h4', ), 'message' => $message, 'dismissible' => true, 'dismiss' => array( 'class' => 'sbi-notice-dismiss', 'icon' => SBI_PLUGIN_URL . 'admin/assets/img/sbi-dismiss-icon.svg', 'tag' => 'a', 'href' => array( 'args' => array( 'sb-dismiss-notice' => 'custom_feed_templates' ), 'action' => 'sb_dismiss_notice_nonce', 'nonce' => '_sb_notice_nonce', ) ), 'buttons' => array( array( 'text' => __('Sounds good!', 'instagram-feed'), 'class' => 'button button-primary', 'id' => 'custom_feed_templates_dismiss', 'url' => array( 'args' => array( 'sb-dismiss-notice' => 'custom_feed_templates' ), 'action' => 'sb_dismiss_notice_nonce', 'nonce' => '_sb_notice_nonce', ), 'tag' => 'a', ), array( 'text' => __('Learn More', 'instagram-feed'), 'class' => 'button button-secondary', 'id' => 'custom_feed_templates_learn', 'url' => 'https://smashballoon.com/doc/instagram-css-layout-changes/?utm_source=instagram-pro&utm_medium=dashboard-notice&utm_campaign=63changes&utm_content=LearnMore', 'target' => 'blank', 'tag' => 'a', ), ), 'buttons_wrap_start' => '

', 'buttons_wrap_end' => '

', 'priority' => 1, 'page' => array( 'sbi-feed-builder', 'sbi-settings', 'sbi-oembeds-manager', 'sbi-extensions-manager', 'sbi-about-us', 'sbi-support', ), 'icon' => array( 'src' => SBI_PLUGIN_URL . 'admin/assets/img/balloon.svg', 'wrap' => '', ), 'wrap_schema' => '
{icon}
{title}{message}
{dismiss}{buttons}
', ); $sbi_notices->add_notice( 'custom_feed_templates', 'information', $error_args ); $sbi_statuses['custom_templates_notice'] = true; update_option( 'sbi_statuses', $sbi_statuses ); } /** * Dismiss custom feeds template admin notices * * @since 6.3 */ public function sbi_dismiss_notice( $notice_id ) { if ( 'custom_feed_templates' === $notice_id ) { update_option( 'sbi_custom_templates_notice_dismissed', true ); } } } PKL\c6!instagram-feed/admin/SBI_View.phpnu[ 'Afrikaans', 'ar_AR' => 'Arabic', 'az_AZ' => 'Azerbaijani', 'be_BY' => 'Belarusian', 'bg_BG' => 'Bulgarian', 'bn_IN' => 'Bengali', 'bs_BA' => 'Bosnian', 'ca_ES' => 'Catalan', 'cs_CZ' => 'Czech', 'cy_GB' => 'Welsh', 'da_DK' => 'Danish', 'de_DE' => 'German', 'el_GR' => 'Greek', 'en_GB' => 'English (UK', 'en_PI' => 'English (Pirate)', 'en_US' => 'English (US)', 'eo_EO' => 'Esperanto', 'es_ES' => 'Spanish (Spain)', 'es_LA' => 'Spanish', 'et_EE' => 'Estonian', 'eu_ES' => 'Basque', 'fa_IR' => 'Persian', 'fb_LT' => 'Leet Speak', 'fi_FI' => 'Finnish', 'fo_FO' => 'Faroese', 'fr_CA' => 'French (Canada)', 'fr_FR' => 'French (France)', 'fy_NL' => 'Frisian', 'ga_IE' => 'Irish', 'gl_ES' => 'Galician', 'he_IL' => 'Hebrew', 'hi_IN' => 'Hindi', 'hr_HR' => 'Croatian', 'hu_HU' => 'Hungarian', 'hy_AM' => 'Armenian', 'id_ID' => 'Indonesian', 'is_IS' => 'Icelandic', 'it_IT' => 'Italian', 'ja_JP' => 'Japanese', 'ka_GE' => 'Georgian', 'km_KH' => 'Khmer', 'ko_KR' => 'Korean', 'ku_TR' => 'Kurdish', 'la_VA' => 'Latin', 'lt_LT' => 'Lithuanian', 'lv_LV' => 'Latvian', 'mk_MK' => 'Macedonian', 'ml_IN' => 'Malayalam', 'ms_MY' => 'Malay', 'nb_NO' => 'Norwegian (bokmal)', 'ne_NP' => 'Nepali', 'nl_NL' => 'Dutch', 'nn_NO' => 'Norwegian (nynorsk)', 'pa_IN' => 'Punjabi', 'pl_PL' => 'Polish', 'ps_AF' => 'Pashto', 'pt_BR' => 'Portuguese (Brazil)', 'pt_PT' => 'Portuguese (Portugal)', 'ro_RO' => 'Romanian', 'ru_RU' => 'Russian', 'sk_SK' => 'Slovak', 'sl_SI' => 'Slovenian', 'sq_AL' => 'Albanian', 'sr_RS' => 'Serbian', 'sv_SE' => 'Swedish', 'sw_KE' => 'Swahili', 'ta_IN' => 'Tamil', 'te_IN' => 'Telugu', 'th_TH' => 'Thai', 'tl_PH' => 'Filipino', 'tr_TR' => 'Turkish', 'uk_UA' => 'Ukrainian', 'vi_VN' => 'Vietnamese', 'zh_CN' => 'Simplified Chinese (China)', 'zh_HK' => 'Traditional Chinese (Hong Kong)', 'zh_TW' => 'Traditional Chinese (Taiwan)', ); } /** * Return the timezones * * @since 4.0 * * @return array */ public static function timezones() { return array( 'Pacific/Midway' => '(GMT-11:00) Midway Island, Samoa', 'America/Adak' => '(GMT-10:00) Hawaii-Aleutian', 'Etc/GMT+10' => '(GMT-10:00) Hawaii', 'Pacific/Marquesas' => '(GMT-09:30) Marquesas Islands', 'Pacific/Gambier' => '(GMT-09:00) Gambier Islands', 'America/Anchorage' => '(GMT-09:00) Alaska', 'America/Ensenada' => '(GMT-08:00) Tijuana, Baja California', 'Etc/GMT+8' => '(GMT-08:00) Pitcairn Islands', 'America/Los_Angeles' => '(GMT-08:00) Pacific Time (US & Canada', 'America/Denver' => '(GMT-07:00) Mountain Time (US & Canada', 'America/Chihuahua' => '(GMT-07:00) Chihuahua, La Paz, Mazatlan', 'America/Dawson_Creek' => '(GMT-07:00) Arizona', 'America/Belize' => '(GMT-06:00) Saskatchewan, Central America', 'America/Cancun' => '(GMT-06:00) Guadalajara, Mexico City, Monterrey', 'Chile/EasterIsland' => '(GMT-06:00) Easter Island', 'America/Chicago' => '(GMT-06:00) Central Time (US & Canada)', 'America/New_York' => '(GMT-05:00) Eastern Time (US & Canada)', 'America/Havana' => '(GMT-05:00) Cuba', 'America/Bogota' => '(GMT-05:00) Bogota, Lima, Quito, Rio Branco', 'America/Caracas' => '(GMT-04:30) Caracas', 'America/Santiago' => '(GMT-04:00) Santiago', 'America/La_Paz' => '(GMT-04:00) La Paz', 'Atlantic/Stanley' => '(GMT-04:00) Faukland Islands', 'America/Campo_Grande' => '(GMT-04:00) Brazil', 'America/Goose_Bay' => '(GMT-04:00) Atlantic Time (Goose Bay)', 'America/Glace_Bay' => '(GMT-04:00) Atlantic Time (Canada)', 'America/St_Johns' => '(GMT-03:30) Newfoundland', 'America/Araguaina' => '(GMT-03:00) UTC-3', 'America/Montevideo' => '(GMT-03:00) Montevideo', 'America/Miquelon' => '(GMT-03:00) Miquelon, St. Pierre', 'America/Godthab' => '(GMT-03:00) Greenland', 'America/Argentina/Buenos_Aires' => '(GMT-03:00) Buenos Aires', 'America/Sao_Paulo' => '(GMT-03:00) Brasilia', 'America/Noronha' => '(GMT-02:00) Mid-Atlantic', 'Atlantic/Cape_Verde' => '(GMT-01:00) Cape Verde Is', 'Atlantic/Azores' => '(GMT-01:00) Azores', 'Europe/Belfast' => '(GMT) Greenwich Mean Time : Belfast', 'Europe/Dublin' => '(GMT) Greenwich Mean Time : Dublin', 'Europe/Lisbon' => '(GMT) Greenwich Mean Time : Lisbon', 'Europe/London' => '(GMT) Greenwich Mean Time : London', 'Africa/Abidjan' => '(GMT) Monrovia, Reykjavik', 'Europe/Amsterdam' => '(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna', 'Europe/Belgrade' => '(GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague', 'Europe/Brussels' => '(GMT+01:00) Brussels, Copenhagen, Madrid, Paris', 'Africa/Algiers' => '(GMT+01:00) West Central Africa', 'Africa/Windhoek' => '(GMT+01:00) Windhoek', 'Asia/Beirut' => '(GMT+02:00) Beirut', 'Africa/Cairo' => '(GMT+02:00) Cairo', 'Asia/Gaza' => '(GMT+02:00) Gaza', 'Africa/Blantyre' => '(GMT+02:00) Harare, Pretoria', 'Asia/Jerusalem' => '(GMT+02:00) Jerusalem', 'Europe/Helsinki' => '(GMT+02:00) Helsinki', 'Europe/Minsk' => '(GMT+02:00) Minsk', 'Asia/Damascus' => '(GMT+02:00) Syria', 'Europe/Moscow' => '(GMT+03:00) Moscow, St. Petersburg, Volgograd', 'Africa/Addis_Ababa' => '(GMT+03:00) Nairobi', 'Asia/Tehran' => '(GMT+03:30) Tehran', 'Asia/Dubai' => '(GMT+04:00) Abu Dhabi, Muscat', 'Asia/Yerevan' => '(GMT+04:00) Yerevan', 'Asia/Kabul' => '(GMT+04:30) Kabul', 'Asia/Yekaterinburg' => '(GMT+05:00) Ekaterinburg', 'Asia/Tashkent' => '(GMT+05:00) Tashkent', 'Asia/Kolkata' => '(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi', 'Asia/Katmandu' => '(GMT+05:45) Kathmandu', 'Asia/Dhaka' => '(GMT+06:00) Astana, Dhaka', 'Asia/Novosibirsk' => '(GMT+06:00) Novosibirsk', 'Asia/Rangoon' => '(GMT+06:30) Yangon (Rangoon', 'Asia/Bangkok' => '(GMT+07:00) Bangkok, Hanoi, Jakarta', 'Asia/Krasnoyarsk' => '(GMT+07:00) Krasnoyarsk', 'Asia/Hong_Kong' => '(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi', 'Asia/Irkutsk' => '(GMT+08:00) Irkutsk, Ulaan Bataar', 'Australia/Perth' => '(GMT+08:00) Perth', 'Australia/Eucla' => '(GMT+08:45) Eucla', 'Asia/Tokyo' => '(GMT+09:00) Osaka, Sapporo, Tokyo', 'Asia/Seoul' => '(GMT+09:00) Seoul', 'Asia/Yakutsk' => '(GMT+09:00) Yakutsk', 'Australia/Adelaide' => '(GMT+09:30) Adelaide', 'Australia/Darwin' => '(GMT+09:30) Darwin', 'Australia/Brisbane' => '(GMT+10:00) Brisbane', 'Australia/Hobart' => '(GMT+10:00) Sydney', 'Asia/Vladivostok' => '(GMT+10:00) Vladivostok', 'Australia/Lord_Howe' => '(GMT+10:30) Lord Howe Island', 'Etc/GMT-11' => '(GMT+11:00) Solomon Is., New Caledonia', 'Asia/Magadan' => '(GMT+11:00) Magadan', 'Pacific/Norfolk' => '(GMT+11:30) Norfolk Island', 'Asia/Anadyr' => '(GMT+12:00) Anadyr, Kamchatka', 'Pacific/Auckland' => '(GMT+12:00) Auckland, Wellington', 'Etc/GMT-12' => 'GMT+12:00) Fiji, Kamchatka, Marshall Is', 'Pacific/Chatham' => '(GMT+12:45) Chatham Islands', 'Pacific/Tongatapu' => '(GMT+13:00) Nuku\'alofa', 'Pacific/Kiritimati' => '(GMT+14:00) Kiritimati' ); } }PKL\2t388,instagram-feed/admin/SBI_Global_Settings.phpnu[init(); } /** * Determining if the user is viewing the our page, if so, party on. * * @since 6.0 */ public function init() { if ( ! is_admin() ) { return; } add_action('admin_menu', [$this, 'register_menu']); add_filter( 'admin_footer_text', [$this, 'remove_admin_footer_text'] ); add_action( 'wp_ajax_sbi_save_settings', [$this, 'sbi_save_settings'] ); add_action( 'wp_ajax_sbi_activate_license', [$this, 'sbi_activate_license'] ); add_action( 'wp_ajax_sbi_deactivate_license', [$this, 'sbi_deactivate_license'] ); add_action( 'wp_ajax_sbi_test_connection', [$this, 'sbi_test_connection'] ); add_action( 'wp_ajax_sbi_recheck_connection', [$this, 'sbi_recheck_connection'] ); add_action( 'wp_ajax_sbi_import_settings_json', [$this, 'sbi_import_settings_json'] ); add_action( 'wp_ajax_sbi_export_settings_json', [$this, 'sbi_export_settings_json'] ); add_action( 'wp_ajax_sbi_clear_cache', [$this, 'sbi_clear_cache'] ); add_action( 'wp_ajax_sbi_clear_image_resize_cache', [$this, 'sbi_clear_image_resize_cache'] ); add_action( 'wp_ajax_sbi_clear_error_log', [$this, 'sbi_clear_error_log'] ); add_action( 'wp_ajax_sbi_retry_db', [$this, 'sbi_retry_db'] ); add_action( 'wp_ajax_sbi_dpa_reset', [$this, 'sbi_dpa_reset'] ); } /** * SBI Save Settings * * This will save the data fron the settings page * * @since 6.0 * * @return SBI_Response */ public function sbi_save_settings() { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $data = $_POST; $model = isset( $data[ 'model' ] ) ? $data['model'] : null; // return if the model is null if ( null === $model ) { return; } // get the sbi license key and extensions license key $sbi_license_key = sanitize_text_field( $_POST['sbi_license_key'] ); // Only update the sbi_license_key value when it's inactive if ( get_option( 'sbi_license_status') == 'inactive' ) { if ( empty( $sbi_license_key ) || strlen( $sbi_license_key ) < 1 ) { delete_option( 'sbi_license_key' ); delete_option( 'sbi_license_data' ); delete_option( 'sbi_license_status' ); } else { update_option( 'sbi_license_key', $sbi_license_key ); } } else { $license_key = sanitize_key( trim( get_option( 'sbi_license_key', '' ) ) ); if ( empty( $sbi_license_key ) && ! empty( $license_key ) ) { $sbi_license_data = $this->get_license_data( $license_key, 'deactivate_license', SBI_PLUGIN_NAME ); delete_option( 'sbi_license_key' ); delete_option( 'sbi_license_data' ); delete_option( 'sbi_license_status' ); } } $model = (array) \json_decode( \stripslashes( $model ) ); $general = (array) $model['general']; $feeds = (array) $model['feeds']; $advanced = (array) $model['advanced']; // Get the values and sanitize $sbi_settings = get_option( 'sb_instagram_settings', array() ); /** * General Tab */ $sbi_settings['sb_instagram_preserve_settings'] = $general['preserveSettings']; /** * Feeds Tab */ if ( current_user_can( 'unfiltered_html' ) ) { $sbi_settings['sb_instagram_custom_css'] = $feeds['customCSS']; $sbi_settings['sb_instagram_custom_js'] = $feeds['customJS']; } $sbi_settings['gdpr'] = sanitize_text_field( $feeds['gdpr'] ); $sbi_settings['sbi_cache_cron_interval'] = sanitize_text_field( $feeds['cronInterval'] ); $sbi_settings['sbi_cache_cron_time'] = sanitize_text_field( $feeds['cronTime'] ); $sbi_settings['sbi_cache_cron_am_pm'] = sanitize_text_field( $feeds['cronAmPm'] ); /** * Advanced Tab */ $sbi_settings['sb_instagram_ajax_theme'] = sanitize_text_field( $advanced['sbi_ajax'] ); $sbi_settings['sb_instagram_disable_resize'] = !(bool)$advanced['sbi_enable_resize']; $sbi_settings['image_format'] = sanitize_text_field($advanced['image_format']); $sbi_settings['sb_ajax_initial'] = (bool)$advanced['sb_ajax_initial']; $sbi_settings['enqueue_js_in_head'] = (bool)$advanced['sbi_enqueue_js_in_head']; $sbi_settings['enqueue_css_in_shortcode'] = (bool)$advanced['sbi_enqueue_css_in_shortcode']; $sbi_settings['disable_js_image_loading'] = !(bool)$advanced['sbi_enable_js_image_loading']; $sbi_settings['disable_admin_notice'] = !(bool)$advanced['enable_admin_notice']; $sbi_settings['enable_email_report'] = (bool)$advanced['enable_email_report']; $sbi_settings['enqueue_legacy_css'] = (bool) $advanced['enqueue_legacy_css']; $sbi_settings['email_notification'] = sanitize_text_field( $advanced['email_notification'] ); $sbi_settings['email_notification_addresses'] = sanitize_text_field( $advanced['email_notification_addresses'] ); $usage_tracking = get_option( 'sbi_usage_tracking', array( 'last_send' => 0, 'enabled' => sbi_is_pro_version() ) ); if ( isset( $advanced['email_notification_addresses'] ) ) { $usage_tracking['enabled'] = false; if ( isset( $advanced['usage_tracking'] ) ) { if ( ! is_array( $usage_tracking ) ) { $usage_tracking = array( 'enabled' => $advanced['usage_tracking'], 'last_send' => 0, ); } else { $usage_tracking['enabled'] = $advanced['usage_tracking']; } } update_option( 'sbi_usage_tracking', $usage_tracking, false ); } // Update the sbi_style_settings option that contains data for translation and advanced tabs update_option( 'sb_instagram_settings', $sbi_settings ); // clear cron caches $this->sbi_clear_cache(); $response = new SBI_Response( true, array( 'cronNextCheck' => $this->get_cron_next_check() ) ); $response->send(); } /** * SBI Activate License Key * * @since 6.0 * * @return SBI_Response */ public function sbi_activate_license() { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } // do the form validation to check if license_key is not empty if ( empty( $_POST[ 'license_key' ] ) ) { $response = new \InstagramFeed\SBI_Response( false, array( 'message' => __( 'License key required!', 'instagram-feed' ), ) ); $response->send(); } $license_key = sanitize_key( $_POST[ 'license_key' ] ); // make the remote api call and get license data $sbi_license_data = $this->get_license_data( $license_key, 'activate_license', SBI_PLUGIN_NAME ); // update the license data if( !empty( $sbi_license_data ) ) { update_option( 'sbi_license_data', $sbi_license_data ); } // update the licnese key only when the license status is activated update_option( 'sbi_license_key', $license_key ); // update the license status update_option( 'sbi_license_status', $sbi_license_data['license'] ); // Check if there is any error in the license key then handle it $sbi_license_data = $this->get_license_error_message( $sbi_license_data ); // Send ajax response back to client end $data = array( 'licenseStatus' => $sbi_license_data['license'], 'licenseData' => $sbi_license_data ); $response = new SBI_Response( true, $data ); $response->send(); } /** * SBI Deactivate License Key * * @since 6.0 * * @return SBI_Response */ public function sbi_deactivate_license() { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $license_key = sanitize_key( trim( get_option( 'sbi_license_key', '' ) ) ); $sbi_license_data = $this->get_license_data( $license_key, 'deactivate_license', SBI_PLUGIN_NAME ); // update the license data if( !empty( $sbi_license_data ) ) { update_option( 'sbi_license_data', $sbi_license_data ); } if ( ! $sbi_license_data['success'] ) { $response = new SBI_Response( false, array() ); $response->send(); } // remove the license keys and update license key status if( $sbi_license_data['license'] == 'deactivated' ) { update_option( 'sbi_license_status', 'inactive' ); $data = array( 'licenseStatus' => 'inactive' ); $response = new SBI_Response( true, $data ); $response->send(); } } /** * SBI Test Connection * * @since 6.0 * * @return SBI_Response */ public function sbi_test_connection() { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $license_key = sanitize_key( get_option( 'sbi_license_key', '' ) ); $sbi_api_params = array( 'edd_action'=> 'check_license', 'license' => $license_key, 'item_name' => urlencode( SBI_PLUGIN_NAME ) // the name of our product in EDD ); $url = add_query_arg( $sbi_api_params, SBI_STORE_URL ); $args = array( 'timeout' => 60, 'sslverify' => false ); // Make the remote API request $request = \InstagramFeed\SBI_HTTP_Request::request( 'GET', $url, $args ); if ( \InstagramFeed\SBI_HTTP_Request::is_error( $request ) ) { $message = ''; foreach ( $request->errors as $key => $error ) { $message .= esc_html( $key ) . ' - ' . esc_html( $error[0] ); } $response = new SBI_Response( false, array( 'hasError' => true, 'error' => $message ) ); $response->send(); } $response = new SBI_Response( true, array( 'hasError' => false ) ); $response->send(); } /** * SBI Re-Check License * * @since 6.0 * * @return SBI_Response */ public function sbi_recheck_connection() { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } // Do the form validation $license_key = isset( $_POST['license_key'] ) ? sanitize_key( $_POST['license_key'] ) : ''; $item_name = isset( $_POST['item_name'] ) ? sanitize_text_field( $_POST['item_name'] ) : ''; $option_name = isset( $_POST['option_name'] ) ? sanitize_text_field( $_POST['option_name'] ) : ''; if ( empty( $license_key ) || empty( $item_name ) ) { $response = new SBI_Response( false, array() ); $response->send(); } // make the remote license check API call $sbi_license_data = $this->get_license_data( $license_key, 'check_license', $item_name ); // update options data $license_changed = $this->update_recheck_license_data( $sbi_license_data, $item_name, $option_name ); // send AJAX response back $response = new SBI_Response( true, array( 'license' => $sbi_license_data['license'], 'licenseChanged' => $license_changed ) ); $response->send(); } /** * Update License Data * * @since 6.0 * * @param array $license_data * @param string $item_name * @param string $option_name * * @return bool $license_changed */ public function update_recheck_license_data( $license_data, $item_name, $option_name ) { $license_changed = false; // if we are updating plugin's license data if ( SBI_PLUGIN_NAME == $item_name ) { // compare the old stored license status with new license status if ( get_option( 'sbi_license_status' ) != $license_data['license'] ) { $license_changed = true; } update_option( 'sbi_license_data', $license_data ); update_option( 'sbi_license_status', $license_data['license'] ); } // If we are updating extensions license data if ( SBI_PLUGIN_NAME != $item_name ) { // compare the old stored license status with new license status if ( get_option( 'sbi_license_status_' . $option_name ) != $license_data['license'] ) { $license_changed = true; } update_option( 'sbi_license_status_' . $option_name, $license_data['license'] ); } // if we are updating extensions license data and it's not valid // then remote the extensions license status if ( SBI_PLUGIN_NAME != $item_name && 'valid' != $license_data['license'] ) { delete_option( 'sbi_license_status_' . $option_name ); } return $license_changed; } /** * SBI Import Feed Settings JSON * * @since 6.0 * * @return SBI_Response */ public function sbi_import_settings_json() { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $filename = $_FILES['file']['name']; $ext = pathinfo($filename, PATHINFO_EXTENSION); if ( 'json' !== $ext ) { $response = new SBI_Response( false, [] ); $response->send(); } $imported_settings = file_get_contents( $_FILES["file"]["tmp_name"] ); // check if the file is empty if ( empty( $imported_settings ) ) { $response = new SBI_Response( false, [] ); $response->send(); } $feed_return = \InstagramFeed\Builder\SBI_Feed_Saver_Manager::import_feed( $imported_settings ); // check if there's error while importing if ( ! $feed_return['success'] ) { $response = new SBI_Response( false, [] ); $response->send(); } // Once new feed has imported lets export all the feeds to update in front end $exported_feeds = \InstagramFeed\Builder\SBI_Db::feeds_query(); $feeds = array(); foreach( $exported_feeds as $feed_id => $feed ) { $feeds[] = array( 'id' => $feed['id'], 'name' => $feed['feed_name'] ); } $response = new SBI_Response( true, array( 'feeds' => $feeds ) ); $response->send(); } /** * SBI Export Feed Settings JSON * * @since 6.0 * * @return SBI_Response */ public function sbi_export_settings_json() { if ( ! check_ajax_referer( 'sbi-admin', 'nonce', false ) ) { wp_send_json_error(); } if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); // This auto-dies. } if ( ! isset( $_GET['feed_id'] ) ) { return; } $feed_id = filter_var( $_GET['feed_id'], FILTER_SANITIZE_NUMBER_INT ); $feed = \InstagramFeed\Builder\SBI_Feed_Saver_Manager::get_export_json( $feed_id ); $feed_info = \InstagramFeed\Builder\SBI_Db::feeds_query( array('id' => $feed_id) ); $feed_name = strtolower( $feed_info[0]['feed_name'] ); $filename = 'sbi-feed-' . $feed_name . '.json'; // create a new empty file in the php memory $file = fopen( 'php://memory', 'w' ); fwrite( $file, $feed ); fseek( $file, 0 ); header( 'Content-type: application/json' ); header( 'Content-disposition: attachment; filename = "' . $filename . '";' ); fpassthru( $file ); exit; } /** * SBI Clear Cache * * @since 6.0 */ public function sbi_clear_cache() { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } // Get the updated cron schedule interval and time settings from user input and update the database $model = isset( $_POST[ 'model' ] ) ? sanitize_text_field( $_POST['model'] ) : null; if ( $model !== null ) { $model = (array) \json_decode( \stripslashes( $model ) ); $feeds = (array) $model['feeds']; } // Now get the updated cron schedule interval and time values $sbi_settings = get_option( 'sb_instagram_settings', array() ); $sbi_cache_cron_interval = $sbi_settings['sbi_cache_cron_interval']; $sbi_cache_cron_time = $sbi_settings['sbi_cache_cron_time']; $sbi_cache_cron_am_pm = $sbi_settings[ 'sbi_cache_cron_am_pm' ]; // Clear the stored caches in the database $this->clear_stored_caches(); delete_option( 'sbi_cron_report' ); \SB_Instagram_Cron_Updater::start_cron_job( $sbi_cache_cron_interval, $sbi_cache_cron_time, $sbi_cache_cron_am_pm ); global $sb_instagram_posts_manager; $sb_instagram_posts_manager->add_action_log( 'Saved settings on the configure tab.' ); $sb_instagram_posts_manager->clear_api_request_delays(); $response = new SBI_Response( true, array( 'cronNextCheck' => $this->get_cron_next_check() ) ); $response->send(); } /** * Clear the stored caches from the database and from other caching plugins * * @since 6.0 */ public function clear_stored_caches() { global $wpdb; $cache_table_name = $wpdb->prefix . 'sbi_feed_caches'; $sql = " UPDATE $cache_table_name SET cache_value = '' WHERE cache_key NOT IN ( 'posts_backup', 'header_backup' );"; $wpdb->query( $sql ); //Delete all SBI transients $table_name = $wpdb->prefix . "options"; $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%\_transient\_sbi\_%') " ); $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%\_transient\_timeout\_sbi\_%') " ); $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%\_transient\_&sbi\_%') " ); $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%\_transient\_timeout\_&sbi\_%') " ); $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%\_transient\_\$sbi\_%') " ); $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%\_transient\_timeout\_\$sbi\_%') " ); \SB_Instagram_Cache::clear_legacy( true ); sb_instagram_clear_page_caches(); } /** * SBI Clear Image Resize Cache * * @since 6.0 */ public function sbi_clear_image_resize_cache() { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } global $sb_instagram_posts_manager; $sb_instagram_posts_manager->delete_all_sbi_instagram_posts(); delete_option( 'sbi_top_api_calls' ); $sb_instagram_posts_manager->add_action_log( 'Reset resizing tables.' ); $this->clear_stored_caches(); $response = new SBI_Response( true, [] ); $response->send(); } /** * SBI CLear Error Log * * @since 6.0 */ public function sbi_clear_error_log() { //Security Checks check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } global $sb_instagram_posts_manager; $sb_instagram_posts_manager->remove_all_errors(); global $sbi_notices; $sbi_notices->remove_notice( 'critical_error' ); $user_id = get_current_user_id(); update_user_meta($user_id, 'sbi_ignore_new_user_sale_notice', 'always'); $sbi_notices->remove_notice( 'discount' ); $sbi_statuses_option = get_option('sbi_statuses', array()); update_option('sbi_rating_notice', 'dismissed', false); $sbi_statuses_option['rating_notice_dismissed'] = sbi_get_current_time(); update_option('sbi_statuses', $sbi_statuses_option, false); // remove the rating notice step 1 and step 2 from global notices $sbi_notices->remove_notice('review_step_1'); $sbi_notices->remove_notice('review_step_2'); $sbi_notices->remove_notice('review_step_1_all_pages'); $sbi_notices->remove_notice('review_step_2_all_pages'); wp_send_json_success(); } /** * SBI CLear Error Log * * @since 6.0 */ public function sbi_retry_db() { //Security Checks check_ajax_referer( 'sbi_nonce', 'sbi_nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } sbi_create_database_table( false ); \SB_Instagram_Feed_Locator::create_table(); \InstagramFeed\Builder\SBI_Db::create_tables( false ); global $wpdb; $table_name = $wpdb->prefix . SBI_INSTAGRAM_POSTS_TYPE; if ( $wpdb->get_var( "show tables like '$table_name'" ) !== $table_name ) { wp_send_json_error( array( 'message' => '
' . esc_html__( 'Unsuccessful. Try visiting our website.', 'instagram-feed' ) . '
' ) ); } global $sbi_notices; $sbi_notices->remove_notice( 'database_create' ); wp_send_json_success( array( 'message' => '
' . esc_html__( 'Success! Try creating a feed and connecting a source.', 'instagram-feed' ) . '
' ) ); } /** * SBI Clear Image Resize Cache * * @since 6.0 */ public function sbi_dpa_reset() { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } sbi_delete_all_platform_data(); $this->clear_stored_caches(); $response = new SBI_Response( true, [] ); $response->send(); } /** * SBI Get License Data from our license API * * @since 6.0 * * @param string $license_key * @param string $license_action * * @return void|array $sbi_license_data */ public function get_license_data( $license_key, $license_action = 'check_license', $item_name = SBI_PLUGIN_NAME ) { $sbi_api_params = array( 'edd_action'=> $license_action, 'license' => $license_key, 'item_name' => urlencode( $item_name ) // the name of our product in EDD ); $url = add_query_arg( $sbi_api_params, SBI_STORE_URL ); $args = array( 'timeout' => 60, 'sslverify' => false ); // Make the remote API request $request = \InstagramFeed\SBI_HTTP_Request::request( 'GET', $url, $args ); if ( \InstagramFeed\SBI_HTTP_Request::is_error( $request ) ) { return; } $sbi_license_data = (array) \InstagramFeed\SBI_HTTP_Request::data( $request ); return $sbi_license_data; } /** * Get license error message depending on license status * * @since 6.0 * * @param array $sbi_license_data * * @return array $sbi_license_data */ public function get_license_error_message( $sbi_license_data ) { global $sbi_download_id; $license_key = null; if ( get_option('sbi_license_key') ) { $license_key = sanitize_key( get_option('sbi_license_key') ); } $upgrade_url = sprintf('https://smashballoon.com/instagram-feed/pricing/?license_key=%s&upgrade=true&utm_campaign=instagram-free&utm_source=settings&utm_medium=upgrade-license', $license_key); $renew_url = sprintf('https://smashballoon.com/checkout/?license_key=%s&download_id=%s&utm_campaign=instagram-free&utm_source=settings&utm_medium=upgrade-license&utm_content=renew-license', $license_key, sanitize_key( $sbi_download_id ) ); $learn_more_url = 'https://smashballoon.com/doc/my-license-key-wont-activate/?utm_campaign=instagram-free&utm_source=settings&utm_medium=license&utm_content=learn-more'; // Check if the license key reached max site installations if ( isset( $sbi_license_data['error'] ) && 'no_activations_left' === $sbi_license_data['error'] ) { $sbi_license_data['errorMsg'] = sprintf( __( 'You have reached the maximum number of sites available in your plan %s', 'instagram-feed' ), '(' . (int)$sbi_license_data['site_count'] . '/' . (int)$sbi_license_data['max_sites'] . ')' ); $sbi_license_data['errorMsg'] .= ' ' . sprintf( __( '%sLearn more about%s it or %supgrade your plan%s', 'instagram-feed' ), '', '', '', '' ); } // Check if the license key has expired if ( ( isset( $sbi_license_data['license'] ) && 'expired' === $sbi_license_data['license'] ) || ( isset( $sbi_license_data['error'] ) && 'expired' === $sbi_license_data['error'] ) ) { $sbi_license_data['error'] = true; $expired_date = new \DateTime( $sbi_license_data['expires'] ); $expired_date = $expired_date->format('F d, Y'); $sbi_license_data['errorMsg'] = sprintf( '%s %s. %s %s', __( 'The license expired on ', 'instagram-feed' ), $expired_date, __( 'Please renew it and try again.', 'instagram-feed' ), $renew_url, __( 'Renew', 'instagram-feed' ) ); } return $sbi_license_data; } /** * Remove admin footer message * * @since 6.0 * * @return string */ public function remove_admin_footer_text() { return ''; } /** * Register Menu. * * @since 6.0 */ public function register_menu() { // remove admin page update footer add_filter( 'update_footer', [$this, 'remove_admin_footer_text'] ); $cap = current_user_can( 'manage_custom_instagram_feed_options' ) ? 'manage_custom_instagram_feed_options' : 'manage_options'; $cap = apply_filters( 'sbi_settings_pages_capability', $cap ); global $sb_instagram_posts_manager; $notice = ''; if ( $sb_instagram_posts_manager->are_critical_errors() ) { $notice = ' !'; } $global_settings = add_submenu_page( 'sb-instagram-feed', __( 'Settings', 'instagram-feed' ), __( 'Settings ' . $notice , 'instagram-feed' ), $cap, 'sbi-settings', [$this, 'global_settings'], 1 ); add_action( 'load-' . $global_settings, [$this,'builder_enqueue_admin_scripts']); } /** * Enqueue Builder CSS & Script. * * Loads only for builder pages * * @since 6.0 */ public function builder_enqueue_admin_scripts(){ if( ! get_current_screen() ) { return; } $screen = get_current_screen(); if ( ! 'instagram-feed_page_sbi-settings' === $screen->id ) { return; } $sbi_status = 'inactive'; global $wp_version; $can_install_automator_plugin = ( version_compare($wp_version,'5.3') >= 0 ) ? true : false; $model = $this->get_settings_data(); $exported_feeds = \InstagramFeed\Builder\SBI_Db::feeds_query(); $feeds = array(); foreach( $exported_feeds as $feed_id => $feed ) { $feeds[] = array( 'id' => $feed['id'], 'name' => $feed['feed_name'] ); } $licenseErrorMsg = null; $license_key = sanitize_key( trim( get_option( 'sbi_license_key', '' ) ) ); if ( $license_key ) { $license_last_check = get_option( 'sbi_license_last_check_timestamp' ); $date = time() - (DAY_IN_SECONDS * 90); if ( $date > $license_last_check ) { // make the remote api call and get license data $sbi_license_data = $this->get_license_data( $license_key ); if( !empty($sbi_license_data) ) update_option( 'sbi_license_data', $sbi_license_data ); update_option( 'sbi_license_last_check_timestamp', time() ); } else { $sbi_license_data = get_option( 'sbi_license_data' ); } // update the license data with proper error messages when necessary $sbi_license_data = $this->get_license_error_message( $sbi_license_data ); $sbi_status = ! empty( $sbi_license_data['license'] ) ? $sbi_license_data['license'] : false; $licenseErrorMsg = ( isset( $sbi_license_data['error'] ) && isset( $sbi_license_data['errorMsg'] ) ) ? $sbi_license_data['errorMsg'] : null; } $current_user_id = get_current_user_id(); $get_sb_active_plugins_info = Util::get_sb_active_plugins_info(); $should_hide_automtor_notice = ( get_user_meta( $current_user_id, 'sbi_dismiss_automator_notice' ) ) ? true : false; wp_enqueue_style( 'settings-style', SBI_PLUGIN_URL . 'admin/assets/css/settings.css', false, SBIVER ); \InstagramFeed\Builder\SBI_Feed_Builder::global_enqueue_ressources_scripts(true); wp_enqueue_script( 'settings-app', SBI_PLUGIN_URL.'admin/assets/js/settings.js', null, SBIVER, true ); $license_key = null; if ( get_option('sbi_license_key') ) { $license_key = sanitize_key( get_option('sbi_license_key') ); } $has_license_error = false; if ( ( isset( $sbi_license_data['license'] ) && 'expired' === $sbi_license_data['license'] ) || ( isset( $sbi_license_data['error'] ) && ( $sbi_license_data['error'] || 'expired' == $sbi_license_data['error'] ) ) ) { $has_license_error = true; } $upgrade_url = sprintf('https://smashballoon.com/instagram-feed/pricing/?license_key=%s&upgrade=true&utm_campaign=instagram-free&utm_source=settings&utm_medium=upgrade-license', $license_key); $footer_upgrade_url = 'https://smashballoon.com/instagram-feed/demo?utm_campaign=instagram-free&utm_source=settings&utm_medium=footer-banner&utm_content=Try Demo'; $usage_tracking_url = 'https://smashballoon.com/instagram-feed/usage-tracking/'; $feed_issue_email_url = 'https://smashballoon.com/doc/email-report-is-not-in-my-inbox/?instagram'; $sources_list = \InstagramFeed\Builder\SBI_Feed_Builder::get_source_list(); // Extract only license keys and build array for extensions license keys $sbi_settings = array( 'admin_url' => admin_url(), 'ajax_handler' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'sbi-admin' ), 'supportPageUrl' => admin_url( 'admin.php?page=sbi-support' ), 'builderUrl' => admin_url( 'admin.php?page=sbi-feed-builder' ), 'links' => $this->get_links_with_utm(), 'uoActive' => is_plugin_active( 'uncanny-automator/uncanny-automator.php' ), 'pluginItemName' => SBI_PLUGIN_NAME, 'licenseType' => 'free', 'licenseKey' => $license_key, 'licenseStatus' => $sbi_status, 'licenseErrorMsg' => $licenseErrorMsg, 'extensionsLicense' => array(), 'extensionsLicenseKey' => array(), 'hasError' => $has_license_error, 'upgradeUrl' => $upgrade_url, 'footerUpgradeUrl' => $footer_upgrade_url, 'isDevSite' => SBI_Upgrader::is_dev_url( home_url() ), 'model' => $model, 'feeds' => $feeds, 'sources' => $sources_list, //'locales' => SBI_Settings::locales(), //'timezones' => SBI_Settings::timezones(), //'socialWallLinks' => \InstagramFeed\Builder\SBI_Feed_Builder::get_social_wall_links(), 'socialWallLinks' => \InstagramFeed\Builder\SBI_Feed_Builder::get_social_wall_links(), 'socialWallActivated' => is_plugin_active( 'social-wall/social-wall.php' ), 'genericText' => \InstagramFeed\Builder\SBI_Feed_Builder::get_generic_text(), 'legacyCSSSettings' => Util::sbi_show_legacy_css_settings(), 'generalTab' => array( 'uoInstallNotice' => array( 'notice' => __( 'Post to Instagram right from WordPress with Uncanny Automator', 'instagram-feed' ), 'learnMore' => __( 'Learn More', 'instagram feed' ), 'logo' => '', 'closeIcon' => '' ), 'licenseBox' => array( 'title' => __( 'License Key', 'instagram-feed' ), 'description' => __( 'Your license key provides access to updates and support', 'instagram-feed' ), 'activeText' => __( 'Your Instagram Feed Pro license is Active!', 'instagram-feed' ), 'inactiveText' => __( 'Your Instagram Feed Pro license is Inactive!', 'instagram-feed' ), 'freeText' => __( 'Already purchased? Simply enter your license key below to activate Instagram Feed Pro.', 'instagram-feed'), 'inactiveFieldPlaceholder' => __( 'Paste license key here', 'instagram-feed' ), 'upgradeText1' => sprintf( __( 'You are using the Lite version of the plugin–no license needed. Enjoy! 🙂 To unlock more features, consider %s.', 'instagram-feed' ), '' . __( 'upgrading to Pro.', 'instagram-feed' ) . '' ), 'upgradeText2' => __( 'As a valued user of our Lite plugin, you receive 50% OFF - automatically applied at checkout!', 'instagram-feed' ), 'manageLicense' => __( 'Manage License', 'instagram-feed' ), 'test' => __( 'Test Connection', 'instagram-feed' ), 'recheckLicense' => __( 'Recheck license', 'instagram-feed' ), 'licenseValid' => __( 'License valid', 'instagram-feed' ), 'licenseExpired' => __( 'License expired', 'instagram-feed' ), 'connectionSuccessful' => __( 'Connection successful', 'instagram-feed' ), 'connectionFailed' => __( 'Connection failed', 'instagram-feed' ), 'viewError' => __( 'View error', 'instagram-feed' ), 'upgrade' => __( 'Upgrade', 'instagram-feed' ), 'deactivate' => __( 'Deactivate', 'instagram-feed' ), 'activate' => __( 'Activate', 'instagram-feed' ), ), 'manageSource' => array( 'title' => __( 'Manage Sources', 'instagram-feed' ), 'description' => __( 'Add or remove connected Instagram accounts', 'instagram-feed' ), ), 'preserveBox' => array( 'title' => __( 'Preserve settings if plugin is removed', 'instagram-feed' ), 'description' => __( 'This will make sure that all of your feeds and settings are still saved even if the plugin is uninstalled', 'instagram-feed' ), ), 'importBox' => array( 'title' => __( 'Import Feed Settings', 'instagram-feed' ), 'description' => __( 'You will need a JSON file previously exported from the Instagram Feed Plugin', 'instagram-feed' ), 'button' => __( 'Import', 'instagram-feed' ), ), 'exportBox' => array( 'title' => __( 'Export Feed Settings', 'instagram-feed' ), 'description' => __( 'Export settings for one or more of your feeds', 'instagram-feed' ), 'button' => __( 'Export', 'instagram-feed' ), ) ), 'feedsTab' => array( 'localizationBox' => array( 'title' => __( 'Localization', 'instagram-feed' ), 'tooltip' => '

This controls the language of any predefined text strings provided by Instagram. For example, the descriptive text that accompanies some timeline posts (eg: Smash Balloon created an event) and the text in the \'Like Box\' widget. To find out how to translate the other text in the plugin see this FAQ.

' ), 'timezoneBox' => array( 'title' => __( 'Timezone', 'instagram-feed' ) ), 'cachingBox' => array( 'title' => __( 'Caching', 'instagram-feed' ), 'pageLoads' => __( 'When the Page loads', 'instagram-feed' ), 'inTheBackground' => __( 'In the Background', 'instagram-feed' ), 'inTheBackgroundOptions' => array( '30mins' => __( 'Every 30 minutes', 'instagram-feed' ), '1hour' => __( 'Every hour', 'instagram-feed' ), '12hours' => __( 'Every 12 hours', 'instagram-feed' ), '24hours' => __( 'Every 24 hours', 'instagram-feed' ), ), 'am' => __( 'AM', 'instagram-feed' ), 'pm' => __( 'PM', 'instagram-feed' ), 'clearCache' => __( 'Clear All Caches', 'instagram-feed' ) ), 'gdprBox' => array( 'title' => __( 'GDPR', 'instagram-feed' ), 'automatic' => __( 'Automatic', 'instagram-feed' ), 'yes' => __( 'Yes', 'instagram-feed' ), 'no' => __( 'No', 'instagram-feed' ), 'infoAuto' => $this->get_gdpr_auto_info(), 'infoYes' => __( 'No requests will be made to third-party websites. To accommodate this, some features of the plugin will be limited.', 'instagram-feed' ), 'infoNo' => __( 'The plugin will function as normal and load images and videos directly from Instagram', 'instagram-feed' ), 'someInstagram' => __( 'Some Instagram Feed features will be limited for visitors to ensure GDPR compliance, until they give consent.', 'instagram-feed'), 'whatLimited' => __( 'What will be limited?', 'instagram-feed'), 'tooltip' => '

If set to “Yes”, it prevents all images and videos from being loaded directly from Instagram’s servers (CDN) to prevent any requests to external websites in your browser. To accommodate this, some features of your plugin will be disabled or limited.

If set to “No”, the plugin will still make some requests to load and display images and videos directly from Instagram.

If set to “Automatic”, it will only load images and videos directly from Instagram if consent has been given by one of these integrated GDPR cookie Plugins.

Learn More

', 'gdprTooltipFeatureInfo' => array( 'headline' => __( 'Features that would be disabled or limited include: ', 'instagram-feed'), 'features' => array( __( 'Only local images (not from Instagram\'s CDN) will be displayed in the feed.', 'instagram-feed'), __( 'Placeholder blank images will be displayed until images are available.', 'instagram-feed'), __( 'Video posts will link to the post on Instagram.com for visitors to watch.', 'instagram-feed'), __( 'Carousel posts will only show the first image in the lightbox.', 'instagram-feed'), __( 'The maximum image resolution will be 640 pixels wide in the lightbox.', 'instagram-feed'), ) ) ), 'customCSSBox' => array( 'title' => __( 'Custom CSS', 'instagram-feed' ), 'placeholder' => __( 'Enter any custom CSS here', 'instagram-feed' ), ), 'customJSBox' => array( 'title' => __( 'Custom JS', 'instagram-feed' ), 'placeholder' => __( 'Enter any custom JS here', 'instagram-feed' ), ) ), 'advancedTab' => array( 'legacyCSSBox' => array( 'title' => __( 'Use legacy CSS', 'instagram-feed' ), 'helpText' => __( 'This would revert your CSS file for the feed to the file used in version 6.2. Enable this setting if your customizations are not working properly. ', 'instagram-feed' ) . '' . __('Learn More', 'instagram-feed') .'', ), 'optimizeBox' => array( 'header' => __('Image Optimization (Recommended)', 'instagram-feed'), 'helpText' => __('Creates multiple local copies of image in different sizes and uses smallest size based on where it is displayed. ', 'instagram-feed') . '' . __('Uses local Wordpress storage.', 'instagram-feed') . '', 'reset' => __('Reset Image Storage', 'instagram-feed'), 'title' => __('Use dynamic sizes', 'instagram-feed'), 'formatTitle' => __('Default Image Format', 'instagram-feed'), 'formats' => array( 'webp' => __('WebP', 'instagram-feed'), 'jpg' => __('JPG', 'instagram-feed'), ), ), 'usageBox' => array( 'title' => __( 'Usage Tracking', 'instagram-feed' ), 'helpText' => sprintf( __( 'This helps to prevent plugin and theme conflicts by sending a report in the background once per week about your settings and relevant site stats. It does not send sensitive information like access tokens, email addresses, or user info. This will also not affect your site performance. %s', 'instagram-feed' ), '' . __( 'Learn More', 'instagram-feed' ) . '' ), ), 'resetErrorBox' => array( 'title' => __( 'Reset Error Log', 'instagram-feed' ), 'helpText' => __( 'Clear all errors stored in the error log.', 'instagram-feed' ), 'reset' => __( 'Reset', 'instagram-feed' ), ), 'ajaxBox' => array( 'title' => __( 'AJAX theme loading fix', 'instagram-feed' ), 'helpText' => __( 'Fixes issues caused by Ajax loading themes. It can also be used to workaround JavaScript errors on the page.', 'instagram-feed' ), ), 'ajaxInitial' => array( 'title' => __( 'Load Initial Posts with AJAX', 'instagram-feed' ), 'helpText' => __( 'Initial posts will be loaded using AJAX instead of added to the page directly. If you use page caching, this will allow the feed to update according to the "Check for new posts every" setting on the "Configure" tab.', 'instagram-feed' ), ), 'enqueueHead' => array( 'title' => __( 'Enqueue JavaScript in head', 'instagram-feed' ), 'helpText' => __( 'Add the JavaScript file for the plugin in the HTML "head" instead of the footer.', 'instagram-feed' ), ), 'enqueueShortcode' => array( 'title' => __( 'Enqueue CSS only on pages with the Feed', 'instagram-feed' ), 'helpText' => '', ), 'jsImages' => array( 'title' => __( 'JavaScript Image Loading', 'instagram-feed' ), 'helpText' => __( 'Load images on the client side with JS, instead of server side.', 'instagram-feed' ), ), 'loadAjax' => array( 'title' => __( 'Fix a text shortening issue caused by some themes', 'instagram-feed' ), 'helpText' => __( 'Initial posts will be loaded using AJAX instead of added to the page directly. If you use page caching, this will allow the feed to update according to the "Check for new posts every" setting on the "Configure" tab.', 'instagram-feed' ), ), 'adminErrorBox' => array( 'title' => __( 'Admin Error Notice', 'instagram-feed' ), 'helpText' => __( 'This will disable or enable the feed error notice that displays in the bottom right corner of your site for logged-in admins.', 'instagram-feed' ), ), 'feedIssueBox' => array( 'title' => __( 'Feed Issue Email Reports', 'instagram-feed' ), 'helpText' => __( 'If the feed is down due to a critical issue, we will switch to a cached version and notify you based on these settings. View Documentation', 'instagram-feed' ), 'sendReport' => __( 'Send a report every', 'instagram-feed' ), 'to' => __( 'to', 'instagram-feed' ), 'placeholder' => __( 'Enter one or more email address separated by comma', 'instagram-feed' ), 'weekDays' => array( array( 'val' => 'monday', 'label' => __( 'Monday', 'instagram-feed' ) ), array( 'val' => 'tuesday', 'label' => __( 'Tuesday', 'instagram-feed' ) ), array( 'val' => 'wednesday', 'label' => __( 'Wednesday', 'instagram-feed' ) ), array( 'val' => 'thursday', 'label' => __( 'Thursday', 'instagram-feed' ) ), array( 'val' => 'friday', 'label' => __( 'Friday', 'instagram-feed' ) ), array( 'val' => 'saturday', 'label' => __( 'Saturday', 'instagram-feed' ) ), array( 'val' => 'sunday', 'label' => __( 'Sunday', 'instagram-feed' ) ), ) ), 'dpaClear' => array( 'title' => __( 'Manage Data', 'instagram-feed' ), 'helpText' => __( 'Warning: Clicking this button will permanently delete all Instagram data, including all connected accounts, cached posts, and stored images.', 'instagram-feed' ), 'clear' => __( 'Delete all Platform Data', 'instagram-feed' ), ), ), 'dialogBoxPopupScreen' => array( 'deleteSource' => array( 'heading' => __( 'Delete "#"?', 'instagram-feed' ), 'description' => __( 'This source is being used in a feed on your site. If you delete this source then new posts can no longer be retrieved for these feeds.', 'instagram-feed' ), ), ), 'selectSourceScreen' => \InstagramFeed\Builder\SBI_Feed_Builder::select_source_screen_text(), 'uncannyAutomatorScreen' => array( 'heading' => __( 'Automatically post from WordPress to Instagram with the #1 automation plugin', 'instagram-feed' ), 'description' => __( 'Uncanny Automator lets you easily automate your WordPress site. Automatically push new blog posts to your Instagram Business account (and Facebook and Twitter too).', 'instagram-feed' ), 'integrationLogo' => SBI_PLUGIN_URL . '/admin/assets/img/instagram-with-uncanny-automator.png', 'installStep' => array( 'title' => __( 'Install and activate Uncanny Automator', 'instagram-feed' ), 'description' => __( 'The plugin is installed from the Wordpress.org repository', 'instagram-feed' ), 'icon' => SBI_PLUGIN_URL . '/admin/assets/img/uncanny-automator-logo.png', ), 'setupStep' => array( 'title' => __( 'Set up Uncanny Automator', 'instagram-feed' ), 'description' => __( 'Connect Uncanny Automator to your Instagram account', 'instagram-feed' ), 'icon' => SBI_PLUGIN_URL . '/admin/assets/img/setup-uncanny-automator.png', ), 'shouldHideAutomatorNotice' => $should_hide_automtor_notice, 'canInstallAutomatorPlugin' => $can_install_automator_plugin, 'isPluginInstalled' => $get_sb_active_plugins_info['is_uncanny_automator_installed'], 'isPluginActive' => is_plugin_active($get_sb_active_plugins_info['uncanny_automator_plugin']), 'pluginDownloadPath' => $get_sb_active_plugins_info['uncanny_automator_download_plugin'], 'automatorPlugin' => $get_sb_active_plugins_info['uncanny_automator_plugin'], 'installSVG' => '', 'enableSetupStep' => is_plugin_active($get_sb_active_plugins_info['uncanny_automator_plugin']), 'setupPage' => '/edit.php?post_type=uo-recipe&page=uncanny-automator-config&tab=premium-integrations&integration=instagram' ), 'nextCheck' => $this->get_cron_next_check(), 'loaderSVG' => '', 'checkmarkSVG' => '', 'timesCircleSVG' => '', 'uploadSVG' => ' ', 'checkmarCircleSVG' => '', 'exportSVG' => ' ', 'reloadSVG' => ' ', 'tooltipHelpSvg' => '', 'svgIcons' => \InstagramFeed\Builder\SBI_Feed_Builder::builder_svg_icons(), 'resetSVG' => '' ); $newly_retrieved_source_connection_data = \InstagramFeed\Builder\SBI_Source::maybe_source_connection_data(); if ( $newly_retrieved_source_connection_data ) { $sbi_settings['newSourceData'] = $newly_retrieved_source_connection_data; } if ( isset( $_GET['manualsource'] ) && $_GET['manualsource'] == true ) { $sbi_settings['manualSourcePopupInit'] = true; } wp_localize_script( 'settings-app', 'sbi_settings', $sbi_settings ); } /** * Get Extensions License Information * * @since 6.0 * * @return array */ public function get_extensions_license() { return; } /** * Get Links with UTM * * @return array * * @since 6.0 */ public static function get_links_with_utm() { $license_key = null; if ( get_option('sbi_license_key') ) { $license_key = sanitize_key( get_option('sbi_license_key') ); } $all_access_bundle_popup = sprintf('https://smashballoon.com/all-access/?license_key=%s&upgrade=true&utm_campaign=instagram-free&utm_source=balloon&utm_medium=all-access', $license_key); return array( 'manageLicense' => 'https://smashballoon.com/account/downloads/?utm_campaign=instagram-free&utm_source=settings&utm_medium=manage-license', 'popup' => array( 'allAccessBundle' => $all_access_bundle_popup, 'fbProfile' => 'https://www.instagram.com/SmashBalloon/', 'twitterProfile' => 'https://twitter.com/smashballoon', ), ); } /** * The Settings Data * * @since 6.0 * * @return array */ public function get_settings_data() { $sbi_settings = wp_parse_args( get_option( 'sb_instagram_settings' ), $this->default_settings_options() ); $sbi_cache_cron_interval = $sbi_settings['sbi_cache_cron_interval'] ; $sbi_cache_cron_time = $sbi_settings['sbi_cache_cron_time']; $sbi_cache_cron_am_pm = $sbi_settings['sbi_cache_cron_am_pm']; $usage_tracking = get_option( 'sbi_usage_tracking', array( 'last_send' => 0, 'enabled' => \sbi_is_pro_version() ) ); $sbi_ajax = $sbi_settings['sb_instagram_ajax_theme']; $active_gdpr_plugin = \SB_Instagram_GDPR_Integrations::gdpr_plugins_active(); $sbi_preserve_setitngs = $sbi_settings['sb_instagram_preserve_settings']; $custom_css = ''; $custom_js = ''; if ( current_user_can( 'unfiltered_html' ) ) { $custom_css = isset( $sbi_settings['sb_instagram_custom_css'] ) ? wp_strip_all_tags( stripslashes( $sbi_settings['sb_instagram_custom_css'] ) ) : ''; $custom_js = isset( $sbi_settings['sb_instagram_custom_js'] ) ? stripslashes( $sbi_settings['sb_instagram_custom_js'] ) : ''; } return array( 'general' => array( 'preserveSettings' => $sbi_preserve_setitngs ), 'feeds' => array( 'cachingType' => 'background', 'cronInterval' => $sbi_cache_cron_interval, 'cronTime' => $sbi_cache_cron_time, 'cronAmPm' => $sbi_cache_cron_am_pm, 'gdpr' => $sbi_settings['gdpr'], 'gdprPlugin' => $active_gdpr_plugin, 'customCSS' => $custom_css, 'customJS' => $custom_js, ), 'advanced' => array( 'sbi_enable_resize' => !$sbi_settings['sb_instagram_disable_resize'], 'image_format' => $sbi_settings['image_format'], 'usage_tracking' => $usage_tracking['enabled'], 'sbi_ajax' => $sbi_ajax, 'sb_ajax_initial' => $sbi_settings['sb_ajax_initial'], 'sbi_enqueue_js_in_head' => $sbi_settings['enqueue_js_in_head'], 'sbi_enqueue_css_in_shortcode' => $sbi_settings['enqueue_css_in_shortcode'], 'sbi_enable_js_image_loading' => !$sbi_settings['disable_js_image_loading'], 'enqueue_legacy_css' => $sbi_settings['enqueue_legacy_css'], 'enable_admin_notice' => !$sbi_settings['disable_admin_notice'], 'enable_email_report' => $sbi_settings['enable_email_report'], 'email_notification' => $sbi_settings['email_notification'], 'email_notification_addresses' => $sbi_settings['email_notification_addresses'], ) ); } /** * Return the default settings options for sbi_style_settings option * * @since 6.0 * * @return array */ public function default_settings_options() { return sbi_defaults(); } /** * Get GDPR Automatic state information * * @since 6.0 * * @return string $output */ public function get_gdpr_auto_info() { $gdpr_doc_url = 'https://smashballoon.com/doc/instagram-feed-gdpr-compliance/?instagram'; $output = ''; $active_gdpr_plugin = \SB_Instagram_GDPR_Integrations::gdpr_plugins_active(); if ( $active_gdpr_plugin ) { $output = $active_gdpr_plugin; } else { $output = sprintf( __( 'No GDPR consent plugin detected. Install a compatible GDPR consent %s, or manually enable the setting to display a GDPR compliant version of the feed to all visitors.', 'instagram-feed' ), '' . __( 'plugin', 'instagram-feed' ). '' ); } return $output; } /** * SBI Get cron next check time * * @since 6.0 * * @return string $output */ public function get_cron_next_check() { $output = ''; if ( wp_next_scheduled( 'sbi_feed_update' ) ) { $time_format = get_option( 'time_format' ); if ( ! $time_format ) { $time_format = 'g:i a'; } // $schedule = wp_get_schedule( 'sbi_feed_update' ); if ( $schedule == '30mins' ) $schedule = __( 'every 30 minutes', 'instagram-feed' ); if ( $schedule == 'twicedaily' ) $schedule = __( 'every 12 hours', 'instagram-feed' ); $sbi_next_cron_event = wp_next_scheduled( 'sbi_feed_update' ); $output = '' . __( 'Next check', 'instagram-feed' ) . ': ' . date( $time_format, $sbi_next_cron_event + sbi_get_utc_offset() ) . ' (' . $schedule . ') - ' . __( 'Note: Clicking "Clear All Caches" will reset this schedule.', 'instagram-feed' ); } else { $output = __( 'Nothing currently scheduled', 'instagram-feed' ); } return $output; } /** * Settings Page View Template * * @since 6.0 */ public function global_settings(){ \InstagramFeed\SBI_View::render( 'settings.index' ); } } PKL\0+k%%:instagram-feed/admin/assets/img/uncanny-automator-logo.pngnu[PNG  IHDR>hkZPLTEKGTNOYjj}&*J&(D (=.3K'@DNbMQ`"D";"@48U5*4@#>="?07J2;[MOW!=#,F&@'.G2=T9!=?H\".I*(F&C(:Z|dq*))(~)c+y&x4('*-9V$2qlXm+6P)2JrEʐ]%.Dъze#,; '7>/wiՄа͜a:X`4`&˜ɑڼ~oŤĠF8觾ƌan~7CXTDO}uzkKVgle=K^FO]aQLĆQwZMկZ˛2J?5eXץe(XtRNS     #%",(/)?)iH8vxUԮ5(u=`d8}2_Çfȅ>Jă<ώ0\r9 NRat<ڱ2zхڇlF]t*!IuAEtaCTc̽D_ åH 'lF]xյ}dWt7װ5ӛcfcX7ՒbsѵI-+,0Bb,x=Uq0¾ M72x U7CH!nw>4':}C͙6E8QSkDj N8\54I3XcRmF1ښm".mc.Pъℳ#OE}B8sϻ/HC˔I) yh%$u;3e=>@3F)G-Bڛ7oFC2[ݰ>|:Qt-1F5ċFa}X:VJ6ɢrX|_.?TJ %ѠHMbkZ$-'K$>3' b Kw!02]R5cǜH:Co]E.$R5v-">R|EDž4l<) co+/KCbtfZ`eY LwK+t-2(ea^6OV־9LV`2I9=Cg;޾Yjl 358%w-p`fQc#MoN=f,fI2 %㿙_}tQ6YG )XjBrw<X/]YƜKƙ@M˯,8|VPQ;y0TMW?,-\ SnA};0fMⱶ.J,黾h TR۷w;Vm% :[#=3LCc? l!N aGfuڳis|1_!MZwC@miU[q3pwwP+# @J5`@XZܱ޿0aܹ!` io2ؿ\*|X!˦@Y_ieү80b(1ʼڃx+~ϑ:->>oIվ.B<*-oH< [gzyfY=.8*ޜrFZӠ֧nBG Yj:fe.~¼h@}q{ZnZ\' Z="(K6kdU}{/lQt'9%^g '\w{] #=;' G=F*#c,aK*Qs[{_`_;[Yv}_+aۣ5 }ՒvfE8{] bZTý˗:I; nZYޠ3 2>XDl1[+>RNҁT*mZ_KݸX)Cѡ|hmJv"_mbapO<{.*H}<6hc*hS8;2_o~7}YpGZjiL2վYbu:6}yñٺe} lr{@'c&egŽ큰1lz8rHT>|X{gh%Q ?m ]dq}G-S(%WM~E{@Ww_cBB}c:1Uw"O#Oarm9wW {Br>Swn1mqӞtq>D1Dqa4јh|8hke^6{r(l0 lL]M4^|;aaU1O~Z&g}02ؔˡi+K%Ms 1?k;~z|죆21>Xe@/L\}p9Ο o3_JLU&|q yE^(yثgN1kJd@waYQN$ucPG3%1o ea)39^yWd 4y8JaaܧRr9yx#`T֒z~ {r3U ?tdJ6'cwEB~@ ĺok.UѵO#^w_2{G?gr#*ev5xO^~]L{ fFSu"PX)z>N| } ȼRwPle](T:gHCe$X^YjvnE; 0n0'U;)œ&&j 8[n4 V@*|edd .Tл0o t<4m$ iZAws|-@pyk)N Xj G2E^!Ep$Z>75ݾ^XxQm>Ƀ}FlSgYbU<7 IR`lqU{8مPZKf9Ը"ajk9 y/Ův >M1F[7?V#;}}u6\hr&f(^)QB1m¹*ns+3h馨%Hmá87ϞD@%Bns+H-a)A__*yŏPbI~ȼժt |ɛG?uWмH]T_gj7қFqӽŴ |5>,p`ZTP{m i}-17G8z?rС#߸[Wi)PMu(nڕ[e_/ ?LzI~y-^d݋Ӊj'_}#ol-.} {# k)'<&J[{֎^VUwsB!'.ض>(]>mzW/hjFGW43ƈ/op>IhX^㶟.a۱cCgcOD㓪yŻXG6b`(/a9NGGgϯҖ3B9*:;&;V4%XoOn;H|v^/;d47OO_93=6_3slra?J;u6VLvtJA 2!=^ ch@JI r/S7cݎ+tA9Oƺ"kCX"O`>zޗ_K%|#fh =##IH,ﰙ1?!6B[;ijzVf_33+=ܺx tL 淃Pe gjP~,v99ƨqlz6e~$AeszJ#'E"bsGr:?p_ yJCݼEW*Z((g|)H$ڙv6u Z^? Rxyz:$ 2LQ,߾݄\mmm w7}JNH>bm}ejpwlhE<\ ?ãVG73dLJ Nl!6i|r}w=ai*>Q_NI!,e(2JٷvHe|(N*/;=W$W9i= ~ZAg鍀/;wRFJ>RC"y܈C;ug4B? Ҋ1$h jo! .;6z^w2EM3w޷9tNS8uãj_zԻ{_wM,KeGgq30>x)paM;o01س;mX"yލϦfнsƀ3S6 rڄo Ӌup8z7'CW[:e2OJAr^ъ?ֿr\o Ms’=s31<Ϥ=ϻ0 LܭrdYvdwڇ0_RJ?7M>oc/zRi.s3 GGί>#7#柿绥z$/ #W[AN\h!&|KE4R0O؇n+Xo>`8 {jvbZiI}_. 5dԼ_⋯yR,JA[ᓳ菏NQz`dl5O7Kb՜ӡ=1zyz9_>@`G/Z~q8*A| 7`+C[*?J07|XR0,溲JI>(aV>T/:%h`<Q#||X|C/Sfcf\:w5ء pt6bhϯht´M~t9>@ a?3"&^?{.ouBcWI9-67Cg:yVeYkgjWDe]\(pVuKEmLGl~N _RGUu%?t Vd/P]qep ;aDa@A1=zsr }^+0JI}'.RL ˆAW6G-B|o]ku:߇բo@p.^ĺ할=n؁dY{|&jv?IG-8_ܝ]0׶l Doz|C)M|μCws޳y/?$/}{C 8cscv\{NnYKBO$%O@ם܆D@$@ED0nnmbCf#s/q۱RQB/O>B;UpGêCv{wnowweǭ^zS!5(1wcuCZ(VVftL3 JbTHpi@q&͞{GykL1C:O>8_4{ vD1pFXv?^Χ8KqN ”A4*nn<:R6:k\#>q`=EWe\8v(qY]!9sc\\13t Z ]%$uM2LdS..c XKgH&mBli9+Ad7z xrnq]R =}ש[H ~0"Tz )=r<&@T nFb/WA/5״& 3yn,K!# qcgt:NgRλd׆q-ov|e=Qumn:Mב~DYD@hNuwzIB`}" Ρt(FE>&@X$:8c]n R.Qqe;!5q.#KbhϥMy 7ᄡړhC`",11*Ztq-1+'S.\\5k| ^#{n4@T!~m%3u0Bp*e #P&63.N|[Mis(ZgAs7p T%},4B41b&=#]+!XͿ=司zT̤UL,G6*GNB!I3^)pc;PO\m8YF҃ 3Wوeӊ3e& @m7/BF]>Lr Yg֕ qL%eRNbuVCDřb0ZPՎx(PԾ6 )FF ܒ偣똤%t vc:{S /![hY헌x3╎yBĜs1GYmH:TcT^GIG7@NZ:rM"GFv\ƶh Yv.| U "#5 (@8>9XbXcAΣ+s郔{=#粥[ʲШRibΆ7i١rMgzsU5, UԶy4Bi[X!OÇ)_'v!"lUiDaW@_}K9Ҵ`B:GQEeݟW*?'M^YATƌ1M|voaQ ^bcz> zӢ9)I Bǔ |ݯt,hvR~-[i/hRl$&3Kx%I#x#< PKL\8qll/instagram-feed/admin/assets/img/tiktok-icon.svgnu[ PKL\W SS4instagram-feed/admin/assets/img/sbi-dismiss-icon.svgnu[PKL\]or3instagram-feed/admin/assets/img/about/plugin-rp.pngnu[PNG  IHDR\UPLTEE C ? @ E F G ;tRNSy#NI(\IDATxKs6rNue\׼*M%]9ǼrFiuUMu "~L,ŒhO ϻUrHv[M߻'Tu4q ݅T߲{&jZ]w wG6VA2@,' P'u7nR]7)ID_:Eh"O0A(}1'FRYPI$+Uh:\pV>ARhTWڪSeTߓUY֖+v{`";\eoϏ7hQ?V@nP+e)p#Սɳ $'RjI26`^Ɣ s UW84A5eʢ(]YPъVJ8ɣ%73uT ߾B鞶^15_{|MZMB*I1ԗ> ?oޞ+L2e 7DpB<F+ PG8 `59VEP V Ʀ$qf #iH Kc`~b>2gI @ RI߳R ë-XBP#ԔFP"b5`(=0,c$Bi ,G}r vզp( P`&PP@0ӳ ( W `>54LO YO W$YJ!J< bJqm@$;9[?=)p{0< v3}( @)C bG XA@jNt>iǜ T3(^wS K-i 7U6@n4|1զF X'5$P2e,@j4'[/|aCڛK|#|Р m;7;~zPO89%  E Aΐ\FDa3@Ô @/ضeCX9q! bwhonMx<CrBWMGKĔR=@D @ j֊fu"p A6#maa, 3p-k $Jk;KI0@j pƫ*[x"exD(@nP,ZQS'c\_o|@!0v 9O tـ {ԡqN,Y$;b@?xxP|9d+Gg~^͚Ӈ{#@ yFċb 54Wr>N%{ H%6"@ (Aa4 5۬a>15JHP 7kDI|V<((@<,"dz] ^ۖ3 | B,eiXhX8P T5 K +h'PZ뛫̼i/.'jy gnY >I_Ki_~}=(^@6B)bPVxԝ_ (ᯑ]Fz0?K }MD +q[ hzõŮf1, @c_ml\P$Ji_vvΛL6r\*.?RܢIENDB`PKL\o7 5instagram-feed/admin/assets/img/about/plugin-smtp.pngnu[PNG  IHDRkXTPLTE9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`Ȁos<6P^ʅr˼DŽ4N\Xd{E^iaނ@RjsNgq졶xc|Ojy(DRO|8ʿûsmjWrjѥsZrzfU{4}if]yjDҕf~пǸa}赉Jåȳ{p°⺕v̫Sn}tdԕcZڅFìθ׿ǹϢz֎UىNDZǤќo˭иʳܢsR1tRNS 3YbM8k-'ѱڌ sTEĽy?7?vHIDATx{H[wǯ]u}ѭߏ%˽I$$P1uڢ"Pu ?cJ ڲncown7l|=9Pl&l&l&lۓ%''|k[bc"K[犤]o_R_#ve88Jv+P7Fc1K iT_fvεH줢gB$@Np"@> exFm^v=< `u\j$8DE31';XyP=JE3/< @;hnb-Z} %@E/.}a=zΑb .T%bK MӒQ,}/@Li+Ht%P)ى"qGd Ay hҋuDE# ǥrqy[B^ . D-LBxd,zȉ‚E08@5!U*8 t`M6?p1v lAUPme`rCaҫZ%2P:XH`Lf1;+R!)mG;@4<`}%lpxOtA5O\ >uWT5 *W,_Z|ݮ{^ē$B y|uCYkD|dV 9*:2NSc>X֪n` Sg!ᥲ|^ѴVkz*qQwd3$YȜt79vY(?Q)?M>Ғ@{URSp[. &EGm~(Cx 2' ,\/_M!A+*]~B Q@Ӂ~ #I()~%qR.` ;]2wc Lw WWjhY"Vx( τC&+x-O 0+p2O3, L$  [ cd`X I)m(`xRw@C,Sx {RIoe C^%'(e# wajPa!\jG /bsI*#4MĖ8"iwy>dy륆<3K10fD[HxEBkX̴v!;dɯkӱ\mXTA΢p"z ~/>Jy5w@ |%45Q2#xb@b\),q4dqTX T^fzZ.3@%4sj(kTfM0(47)@ ]vN. / (mC}Ygᳪ_3*fT I'I2G|C= JN6t y3q_6/-'ON0vh@œ6[M @< IyPp8!ڀN² `M:Xk--=͵6 Jˀ$@ ԙ'*ĭPpY8mgtҶSIL2V n2ͫ aY,#,@NGO{Qvll"<-i`5s/+_pcaf~jjj~f0h ugΪ$.4To~"OE/@,ƴ 0ol܌,&Bŵ(vNe) p28r$uxO$ QAˡ MgD`-S_q@l\IN\  ZK+u5؞~Jf9;O_NѴSX&%| Rg'XmjЍ(% R)ZMRXcy?8['@pN#pH3W v `+nuXz"/ @6IP, uy9fӌ5bQnԓ^,Zg_䔕3_O >>9SbBF^X!M^z&=v03@5ޣ0x78V^6T3l, A 3p<t" k5t06=wu#Co$&,̜T`M,Y&`"Mz {#AISax(wsya[#^L}@fVqƆr]ە-&#mv~ 0(@?g+gR|eV=edKOUyś* S ꖜ&1NZ2*~ O${E nF T2wMQ{o>D! CB@D$)e%GR"J ]GĹms 'DՓz|ݻ[Gq@<)LbEbABvFXpŋ\?x'@x||Q3LkuT\z.KB0\~v_(AE*5(>5}6iPq(/$`C1!_ ˬ||HƋ @¼S7 Vh`Iv>lO?IBX>*Hh0g5V/L^$tN`\ƅ|X=mi`hD>XHxeI&AYdn `1 xG'KUq(EOkhEY`-vDE g147Vޚ)2om)%@j)s߯gys-W#ɋ0RW}BLG߁(2 Ik&Li[&^$ aֈ0GZ͞O J+z6̚N\3-{Rdt{FO@<'s8NWgtJOI p/m1`|:gZkḰ27_ke4Oc}Q>a"\)%/ƔTh4~Wm!G 2!™UF$Э;Ef)Go @ #iGÃZk"apL/+u3Ok 'AFh0~7>q %LЋ4MQlI@c+ BlEne^vٿ9R\b2h9LF]yUC]$"ΐ?kXˌ\*}Ÿp14Ͱ@iPLRo^'\0_h s )9MHj=B֠79qduUT>Rg»!X>!r&ns*Ox }7QZ6+Hzdz(z@R`.p@fR^h2e.g ~~JP@zt0"MWuiLIߕ:)hXmJQoaD+ mw+06=F|r˥9ӧ1{H2Tu˒6; ji 8;n2]LU@G)'0?C_D?!U>*Z yAOY楫(V,询cN49?Caa\ {$@#w,_lzH'!@u5"hi9-g08 db%44cی~wli\&ZB5@7d gh@&փ ~z } d̀@6VO1'%GM0("d'O"l AK& p | ]TTb@;PoCDp ՗/.,J&v$zA 2)-f0R嚐J0@6v;CIJݓx,vaBT4Ad>e/IΊjGjXCZ Ћ44Āec5쁵x$Eǻ6#93c`X{%9AK~PHUi-X"y@`NdفV+b ',,h|p*$)zW?GYl,  ֩1G pA.z[ 8P|2]ڼE}fqQP2$d%eo;[8P`s#( Nu`[S#5W677k݉n֪f>XwX11K'92gbS0=0 ]7m!MHӊ7jjd; z&݀8lOo>coCcr$}vn2Ftn3y%Nn.$[V>T$"$#ea]-U06D2‡0lh=% O Kzx4?q}ۓ`vn1%!_l@FTCjbr]CIqQ$V0O$cj8#P@̽x>au`u76srf8*mЈ*j[(1= P,Ce] Q 36~U֪b`]s\mS!.&̃C'Pr CL =5{he4WMmۤ-+JMc4Dl,f΢S6c̶VvNmFFw;X$X9CAB}M 㽮wcU$>x&n ʀ2U'Q Q0d'&7ʸKl#?V.)烙S(a&cC@qzM}Dqt%x, dRb^;^`tm J\84ME;-X247o(4wh=`磅swpeWT8~.@pd:*}Zs678}PRDGQjMi㻊Ю)]Q.xi+WA)6'nt`rGis=?U (}Ii4Ǯ=',>IQ_8>+`PO py~[]&+V9ahñ?'[|Omsz[Paf+ K%;Forh]rHx HPq8 ?W>po]^8ΡASGi0 =uU$sSR г~{7Рp#%M'#sNg$WRj%y^>'WSJ%o9nEy#CĔKu%E voP~&Iq7Ji˳a@"|L΅a#[2- AOA+FBK8be,Dȅy^X(mQ3c_ȵ sd|6PABhYQ*|T:3TY4ܙHQ4jScjF%QQdN;wƞR%䓲"ѡ ~<'Nd2I!I_Vm ϵt+*qelgfW$xxJ,9F!Fllrw67=?a:K<1~7\6gZ}o aTs?_j eY 7c"nIENDB`PKL\ ! ! 4instagram-feed/admin/assets/img/about/plugin-seo.pngnu[PNG  IHDR! ̟5oPLTEP`ZXUZXVYYXZZY[ZZY[YZZYYZXY[YZ[YZZ[Z%O$tRNS 00@PP_``opp~ =IDATxv%o:[M!0i|fF#0.#!Ɣe]}?K߷u]>M")ۿPK_&[~/8٦AYFo@GC|´488MJrs|R.|Gz7K!I/IR67sC&8rIMOt=J>/}F\|wHa(<O>;x/dGq#4'11FzU0H(5XP(5^B>iHӘȍT;$5[Xdӓ +e;Έi{Տ 3ʎc31&-C6!-}@CZ93h*! O ih;38u"q|0NSeJ}RHO h2D[zϮ?>v |8:EH-Ŭ#Ѻjiѿ{MĨ%_w/\|#t'R.(h!O;(1\1 lc@ h$^ Ɯ^^;06*{>7O4#S1 ݭ' ? 1+4pZ ثIF𾝭DmN;r([bP]HjX@F6/yPM5J=zuuKW;#_(g7M*U f$ =N\n ƻvIiq9G+ ځn`QjN&:Yߏ#d5H2kzsPw?>5Bǡ _Vk!&lȇ C P_]W>*V" gKV|7\c1Vd*H|QGU%_Eq+U M&GtU4y@&Ԉj~|/DaҷDhοh:gPSRx?6_=%H۲j#ticl_yn@ȧH]) eP2(L #1azBPd73PpabL<_]5oѢҺCDJ4H3[N\ J$qV-Rxt0 Q,vYֶ&#Y1#>-{$ bO @mD[!toY)bXQ 6vgC7 iZBS D -2&>rΈ hQ7C!i$)rksCL`EP5H8BCa/k(MQ|J)c^ KziS#VBzPAF0IHԈ&C`@F\7Bɨ a7WB/խ4j, Ч2MEJ`k&  DFIbw Fm3Qrw3 %:=%˽5 !%Sdq#"셓"9`B}D( yj5^~B&"B:JBL'c ̈́fB3Lh&mX̄ʩ']T( U*$ Zthm9]OMxU4b'Daf4Ҷ !m"fI! 4~W劢g)Pr[I!vv['$r iv( ]ԗXHtnTb^ ;:2/q{j& ʐov kL:=58̡,SnK; ,(UFbti&Mjr=KTs3G5Sz>.#ؕ=DBj}'DKB5S j%rEpBԣ"L,&L *<5%Bd@qTay! yP[Bum,H=%Sut蠎X~K] i@>w"^__QLkߗLy76U50M=0jdv6@up ά\ns 3c ^0lXm։G,lЋɊh0h=@ M}VbVtaM~h{;XonBZtBuMHdP'0YW8# N~Å#O >0ZorF]ZiZ&n#j$7d|P}L{^A?n|H'[@fH٠s Z 21bF9{ތ>-@' hj<"/ h*#iE^MQ!'[f>QƵz-R5w)Rk}7W$)w5RR$.?kUzўy7rPRLOtPPb%+0n/'M]6U NL؜뛲ȔtVj5wӔU`4ɀNIENDB`PKL\S76instagram-feed/admin/assets/img/about/plugin-affwp.pngnu[PNG  IHDR<q pHYs  vIDATx1ED 9!""!-]Dj`3q[s;=jٞWU5Eƻ=_WW.k@&dK&d2%X2% , ,L`V0{Z_/ώ>Z|ߓ `(f1G߮o {? =h <P}X ^K5PχnZ8KX ^@m?b/)<@5<*]EPs v}%T+1`A'YjQHM Pm ,-&O65X^wKZgu[eZ[eZ8\'7eHg&peQӀ}Ȼ,2XƤ37 HX9ΎvݍB0X ۢbJ|XK`!&c|T,)PE(0b ))b,AXZ CɽRN?NaH ޝ<2d9ѱv;L][Kgdl3,qTG:ΌY<6xfCgJc ~JqhBء ^<7c[ ۵[4Z*R&UݝW'h2б%B©):t=SK%0BB\Ėcc֒uGH-v\[y=҉警%x[m{-*XlO6O+E8,\%,f5 , ĐERƑ- ]r[<3M82]L{1U3&>2f<z/Xcyr5a^InEd&=Y765qVrv.;6e,E}9 cʸPbjw4^+eHG5Kl;CgL秔w,/otXGSib܀o+]UOA3yF%xg Dߟ!Pw m,gF)#cq8ɨy{bCiVkWziKh\2( 팫k?u2k2瀌 +rgZ4zMA<7 #+$˔fq 陆iNQOjGuwk , ,L`L`dK&dK&X2%[ |'iGIENDB`PKL\l&&7instagram-feed/admin/assets/img/about/plugin-wpcode.pngnu[PNG  IHDR$$h,7 pHYs.#.#x?v IDATxqG[`,`b, Q h-Ђ= = ,Փ@s"B?]}o7 Cdm @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN+8/|7_/φW];u0Cxؔ?/'⼏O‡axA|F>>4ؔ?O@>>" ~% hڃ``e <}p#T$ЌMo{ -$Z]65i 76>y* 8{XR|Jc  ,փ >P6A%$]%>8/qݭzE$P߭`8+?'}z°E P-A)##O V;PAU(.J`<8MMBtou`n&q\1D8qWweja) D!t0cWV:0A{S!+oJp㙰/ҙaj{#H Ea.LCŹ눸# R2\m+au|AqZBWnVaƕsxXCE 7MX&&xA"DݍԄO_&HૄxA%DD .$B>1۸rq<$H`㸌UyFgÄa.$qXBW_]p6&HhXV3\DAw{[&&|pm$4LE8j.䰍O-t}GUDh.I},]{; 8,~m.Ysk HX9 YAJ cLKxIB][pP7 zG"e*UDh.E+=$ -ai + HX8S1-a% f*bo"´$,PaVcp1/_t}l"hQDwYuD=MzW%|A]q'д%\~K`eC>"Ve<3!bV4| $HPaYqٰT+*qZV4n\Ϯ T*q[p]<ћ¡Jt.D{#b#J af]q/w%Ju7?㈸#WߔȄt} ؿ_n}>30!a#vn>30!ab%FGSo`^o#|'a: unͼaz(a:V6L#d\qaBžu}F&#ZX2)/Aᦔ6A0+DP#A'J3AB21bQ¿>=|DbE(! !`D   JH ð731Efƭ}LHb9?8h %JH Hxk1j >"SG n OTbW:4%Jx&At}\s"Jx:A#u}G.dnart}FĿ}ǛaB;`B7C0We>`BWqT!߆m\/3!n|U*"N<s;2y$|FŸPq⾵ _ Px76] 82ZaWn? Eq'U%Ͱ} y^xqu2|Bo]񪆳XG6k>H8-{t0 ceTƍU $q>nV^؃%f5$t}Gī QBϵɕ ]qe7 b&pqE7$t}\FIG`Z]TP_+8 8)_oJ7 C0"n#⨂Оmܴ[p)F`FWMh"HDv/7a+j2MnhaB…\0V$t}FįuW7}BBU kj6Hݪ zͷ P1ru}GmD}: u kZ\v}A.HD r kpU^/߯ʪˈ8( 8".*8 Nǝ`M2!au4hү]kx>6񢂣@5&$\Upt鷹 <"*8 dz\U?yY,6H0[a*8t}Fć8Xҹ~qK[ꄄ 1 X씄MH0,rJ'$@K9%aQLGQ gb) K 9Ӌ͒.q1AByDUpâĿ #вqJR"3`9__ʄ s{)  ]؉ 58_SX„?9zAB8n@-) OH0[$,bLcSW$t}EQGU%'$_2H8jVk`:|Ew$H:8 ]gUpX*$8!ᬂ3Ru}v֪rA*8 ,A_mBto8</>k:g5AB) 5MH5 5Դ \IG%f;A-kWvZUa HUŖ&$l*8 "`%^t}Vf  B{Bu ok|&$F]sقƏz}XY$9!tApk3Hx9k@ f0K# kIt']s\\A‹^Z3ЀɃ7&F3&jLH鼘 r]?g ]q0kӯmzB,{)q랐 HY~BG]S^ ІI?,H8^IL9!t:'$`VS p2廜2H&0e0iiɆ L$LYX_ 5V$[ 'SB i>÷ڲ `nABf߯<ڪ&$uXM`BÄ j ^x)i p*"Ht}lN&x "S @]`AB>=!A ڳ @a?P!th߱ sw tB> @:AN$@>N Ц}kAN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:A/EmD|*nv7u}Fa寏G ][pVσ@ dz[>ȿ\0>'X׻aj").Ɵq¹ $H9>O (+8ᬄ /Fxqa[N>K`jдZMDuFuĈa 02M9&$5cpZ~E%\F2 ә! 8#|aW-z+DaA㰍3!aBDF#nh m 8qeLiƧa%Lx;Z!Hh!~3N'S*qDОq*zOʄ5'HhTkϽ>85"޷~ `*‚ ۸MD]%HX",Kp1$%(XA6lw1yJHrl4uQS= W%Z, `}a3lʳ]= HXq[uJhTKodO麕(U$Ûagbv 0(Vcsϱ=%@ٔU$,/bQ8c SZ .ikϏwp.Jj"HX1FxHDlBpXnG`(ܒlDpX>2~!x/C`Sù-5Aa,r'20~ 1+5Aax)#mqȳ @+s;C&HZ$"'3hA~A[=GA~  9x'# H vB #'A!H !F`4reu 1##`-A^s7;22~ s;c$H$f܆' 6dk vJ%H"'3N~A܎  ۻ|M->L#@ě &-r'@3A܎ @ǜ%͸Z$)2A@{bhIVKsM <o_\h"HhNО #'AlBP6$:`3^s.M#HX5A GD_$k sw ZfF7$|mS<TnG _ "A<nmS]($ ($jSm_긌 %_ֻІ WXs @+y)kM!H-YUeD\hC9y n %H1yhM3;@7m "s7;@v;A AA0v1NUǹ ؔ yN>`# ؄ ܎lLkN'Uu\F7$cvhj"`` P&H"H!xwЬ6".LlC -r''ͪ:#⻉m 19u(r;A0FsE`'`ls7ͪ:#D. ;q(3+A0&<-LJ :qf'`W`LfN&AsN洡YUeDܘA0NL  H1#@AUvE ʦ6I kN┡YUeD|3O`fN&&M GD̝0ݙ7A0d Cۈ0o`.MM ENtYUyDLL epf& Pyl B눸2p(`N&I "'A HJ ͽ3F83pH`h Pv <oNUu\FčC$Cv(s;p`(>rӄ"Ap`(܎Up `(fN܎ IBf"X x܎ 軏;E(3pL9ŻSfUqa" @͜ 8:Ag9ŋfU11pl܎eN >;=(\prwͪ:.#D)wrPvd @-r''ES"Hh` 裹SS$}S95hVqL {'ES&HdAprO܎Uqa' @@'x)ޜ48&@@g>I-$} F눸 Pvg#K @׽/N UuGD@9!(ZgfDtGD̝MMt yNYUeDܘAek;]$HjS8(\I܎U8E ,AE9ŻfUD@W .r;Mlt ENTD@ q;TuFą.$]#H$]S9hVqMt #@F@)NL  #@AUuD\ A3'EnGzCtsN$hb"/ @x :qf'/ }$HFD zUqc&O ͜ApJ9ŋ"A;܎U7և"#$HN!x>48o&Hʽ@o SXO;}%HNafuX6". 85@^$S[UuGD@ cs;-c3;}&HiS-Ew&N:" 8&AMm 8ǜP$HAҰ^Ugf@GNk&FB :.#⛝$02MM 8לP$HEcvߜ&p@170MLXO_u?W3 8yN|D~R՟Mۄ,y;t2$zVo@ؗsC??z - C$@|!p~AaVq9NP 8~}Y] ?1(=X~_E aUp Y>߿$v(>zXS<9ޜ0]FS&J‡*hej&zcu#nChku+Џ[~r$@ nG>V"xV%Vu5=sC+<"ۉ#{]݊3H f"#pl3Fx|?׸]%$HvSX 7SYVǾO`nG눸Gns{cGNg0-$Z~.9Muay[k+ϛV>~$ۚ/kzP41zocA-WCAUF8b"FՓ 69œhj"au?##JBlcf5X2"nā]0n 6<ew6@/D @ M=xZ#4|%]&H65W՟1…31_%]%H6I-x۟}#("A à2"ى=#Њ(A Ġlb#?lBt h1xݙ=y)fdS+ @[sKzUqa&`#L ɶD @6>\>i}%&H#@AUyDLĎqS}%$H9-c3;ϑ}%"HJs7+A+]NbEA (\Tu\Gĕ1(86A𹅠hj"v E Xg-shEԟ(8A:^UgfbK/D 1&>A+nG`[9 8Qphɽe`ˈ1[ @A̶f9śQp(+9ŻeH6Oe9D cvb wFD -r'@Dlt('AE`n&6O "P45[oD >=Xܙ }%$?WqfbCލF߈]9yZp;r;&J%H~#@AUyDLĆ܎@m.-c3;#0`S`9xyMݻ!%$KV:.#Ll (hK|>,M=}%m13+&JJ fPP՟1™"%`^s-LĆ^(h"Hq}(긌obCFE|E:qhaj$6}h( kS;($)#0Zg/5@AUmD\؉ }Q%?`9ŋ"#)5(X$8 :#⻝ؐ`E`oenG`(MS;w($D 0^ Uqe'6d0(II--` Q yzU11[$@(E"Hepf'6S D 0ǜyCDlA%8`<܎Uqc'ؐ(O㰼J|Dl Q Nlɓ8%Q aa.6rrCB$H{oB S#WD 0<>5@AUeD|[z7(Esg E'`8 0l.pg$%0`f֫긍 37$ 0\9ŋ󅢩I&Hr;TuGw;#O 0\sg E+ 0L9]hH J$0;WX:"A "xrPv%@`xfZ=x5"(A(Fę؃w#i 0,98-L6A 2"n0 .A ";O(r; 0nGv ӵ5D =ATuL"Nљ1;D -YBN!Hap;TuG7; (AKw`=#(NO'Fv!TuI%H9CXoL#J$@o5@AUǹLC,€=At/lDGL ($@͝0]r>Q f[}1s@`D 5xq>P/]4q*0h&Hr;袪8k規;X? LtXFD$@7swgE>e߫:.(~%Hnw.C73qUV7^ {9œs"z;SDĭ($@̜ "HΪ*( Eksa'z/$J` -9Ż3"qN\%K [܎UN[`D cS̝MLD%FN ;܎ىrK($@w:"DO%%0*ǜY@YUǹSq%0膹sV&f΄5@ AGNkUgbAN'Fvϐ$J` pz3g~L MU{QC%Hz)ޜys!8w@(AIy($,ynXouon~&J`H p:P45B(\37%08_2ʞsD NЊvD NCUN̼ܡ?%o IDATW8P45#p(>$ V!>#uS1sD kS<1™j%'8.#@;wv Q}!H$@AUuD\ >W(>$<o"ÿ,.y긴 ;Q]'Hq;#H_nJ8 ;Q]&HXs[zU# p)AA@W 8Ў(h$J p3;z7okFFS܎FDwochEFB J:&qa(؈(h$J  pXbhgb'؊(h$J pX(X}Hn'ؚ(h$J p8֛v&J8A̶ʝ`/D @#Q HXEܶ^UuD\ F4%pl8yNn[(r;(h$J pvVK'f%D  oS<1™`D @#Q HZ\(h$J kՇRD @#Q$Hz)m EnG%D  knOhej&8:QH!`9 ?c3CIFMsoKheb&8)QH> ` PPq''JAcNfK(:3JpWD cnGhErUn&J`WGN>@IU~и0twQD. ;q#@wF%HlUu/?x :M4% A9x!A4%)AGhG!J؄ Kع`눸2(h$J-AloSL$JhCۛ֫8D @#Q%/`1™D @#Q`;>@;S; F`;>@AUeD C4%Al!xݙG4%;Al·hgb'$QH ENd3X?c 3`F~$ffVf%D 667Wq J$@{9śhb"QH0nhhN0:(` "'5@IU~l0(h$J'A 3(h$JA Tu/?F FO4% ʞs7;AD(h$JA (h$JA)PRqW~#JOh"JML!JK^W9 Q13(` lfhej&%QH0</A綁:.#LD @#Qk6Pv`(`8 55@;`[(` /@5:&qa#`( '#@;nGA4% TuG7;{"JKz)mEnGM4% qH߯?޽y6O\cPHH8X?¯\#fdf&D Ve `]2p$Q7o%E?E&jZo%C? `ˈ 8mD y$.^l;fNDl%J?Aff'D Vq$@Ībaִq7f@l%J/AR8'Q(` 1$"87Q(`| ` C# J% \ Q(`< lwإi:"n (J0jp ?`D V$PӇ$^c&J% Z=oN6&qe#`D V$P+#@LD !HV 'Ú6.#⫙D 'HF.~8yK= G`+Qi ѝS$33%[NG@m}N5m|+3%[NC@mN((Jp|js CeDLBl%J8.A5aL@AD V$P#@/D !H˾ӆaML@D V$P #@‰D %HH%PQ(p IðID\ (JpjvHPQ/Q³G@V}'H]6#P@D V$P:12(ت(} n!q@D V$P羋' ÚvpL`;Q 7D V(*"N5m\FW3Fl%JH'HT̓B`>o%[(5@%[v$PeœaM"LD VaJvHv4`+QvJtT!LY (@`旾6˃(F'Aq;q8.D Q dwDaXuD|6A ff'%D $PA D Q r]8OִL!J ( N%J (b$aXuDܚ D QP+A%#@F %5$PS$33($Jj#H w}/N5N %5$;'If8Q0HB@V}'H]6.#bb(%D @  l db %D @ l Lg#J sœӃa`7f8+Q0HJ@܎ivQ0HH@VprD0`(( -6M.l0*`(( 95Hvq%D @) fw`XuD|6hAr3wb'J ȍ5@A@D Q3A9<4mL"F%D @ fb'A GrX8-ִq_%Q0HF@.܎ivȚ($Jr"H H3@D Q A9xqR0lLE%D @ ` "J$0vإi2"&(($JL؉ d A` Ak(($JH=]8!ִq7f(($JFҸ`(AcӁ$S3TE %c!H`h]6($J@X\ ZQ]ƥs$0F}ON5m\Gĭv)AI 1s*dj&D .\ ($JA|<(4a($JNMظҸA ɲKf` Q0H 1; Hvv%D )Ӏ$RA }ŋӀaM6/ ($JIX9 H23{%D e\y41 Jc$0bH#\ w%D S$S3A`(8$Aw`XuD|6 JC$pnwNA Ӫ hb(L %%Hi1•8Q0H| s$@8"Q0H syx> kڸ[3pd`(xA2<$ %D  *"$33pB`(؇ sXlbvF($JR 8;C8Q0H$pj˾ð fD Q S[LA` SH3#!Jm ̓*`@Ƨ Q0HE)- I܎A 8e  P($J~%HT, 5mL#T($J!HT fj'2 J$p"}/ƆaMLdB %NF %@ ۪baeH"H G`(%H܎ 6&qe+2%JNmnaHvr'J>0lL`%8H`QE1\q;%iZl'Jz8UD, Iff0_E QA,6M~{e# $J|enYHs L %@ sœeaXeDL@D QK1Ҽ`($HV$33PQ0H$ph7Mqc#*#J,fHvj%Jiw`QH25%D PA4&ִTTN %@ šdb&X%D 7ArwbMִqfAȗ CL%D 'A;kDx($J8!A$"l[Aȋ CL;Aȇ zx" kڸ|}b&H"J >ʃbH3E % UyH  ?Q0H&H#<M"V.`(KGx0 ifv%D 0Nz0i2"&f%D 0>kn9H#\ B %xUD,,If%D 0cy hڸ6%D 0 Np4`(O}OV$>%J ic%~-%H`_B#AQB߭{K/KMqk#8)Qb p:/q;(D pR-.I p>`(NG@*u!AӮl^ J %iH.q;(K }/aM/?!J L#J]Eč`jژ:`[ #H` `#J6F$0Bdb&Ȃ(56~| !> 6/5.l%[]++f~&Q@ faحi:"> $Jx m斁$33@D V}B>wdHWȟ(B?Aoq;$hupe+((xS!2 ,I7mn_~ _6.#FPQ[&hH'HYxQ%ۼ۰$eŃE LP4Qq2$5`/qe*((C""- 5@/&->  5`XeDLU%A?܎i^c [@uD o6nx l'Hr mf#(o>  MƧ1TM%"Y&H   D .l /:ݼx!J~nAnG~!J."5wNl"JlkO AuD|( ux"Jbw7A@7vrH!J]|4mL"V@"QT֟GtK A@Vpdb&`O`VT/ Zl4m\FW JGv:\Q[ >}Of(QT- NP;g5m|+S Jz% #H4nGIrK${gÚ6.#bb&D P'? Zxi^c [G JosFz,7WE\pL7g@ p;$hڸ[G&JlnIX9sj#H Ҹ8(ᓵsG @m uxq֐/Sz%@5 TGP#@ID\ 8 QԡGD|wDPe9C# JzU$O 6#V} |Q i܎(t!H(cŋ3$` D P>7P A@|4m|+[#!J]ʵ;A$r;06([ \n@ˈj+`D P[;tNP$nGLC'H(sœ$`D P&Yx2l Ȁ( !6P4A@yV}d3S%@y@ Y]p0i2"&f2#JlE$ H3<ȍ( NPeŃ3$S3%@9|b 2w[uD|69QMKP1 N@!D gV $3%@|" $hupe+0ۃD2,N %J|" pa눸5P0Qdh gg@i e$@  O>@q xqdf&ȏ ;iKD\ ("H8 P@D (  obHдq_mTJpKE$m L@D AE$AD '@I Hy~c+5QKg@) yZEA~#JqsK$iwAAD 0^!HܹnM.L&QӃs<_K@"# %bs`l*D 0"O4 %$Gi܎N H/% %x(  /nGM^KYxp^w)A HYn緦Q "pV!J3a{J H}~$$ `D p> w<9'حiKD\ D `}s [ IDATC`sr'H?1$< hD E0~sgI^c S(NN0n}/p8v wqs>[8!J'HU  NOGDJ H/1 ,D l%H/A$hupa+%,m @ wl Lg'J&Hsݚ6#T J7YE¹@FE \ `|D p8>@ s icW%Q  ewL L&J `\܎ 6 `D $˝$S3dCP)Ax|<  / c,`OEPA8,Nfu qstSdi_.^@ H41…O!H8{dSSdGP)A4{ßm1@ X8H23@V$ 5C vkژDą F`Mp>}/$nGȃ  AuD `px6 gx}P=$q;8 dMp$q#&Ay5m|+S a$s;x> Ni2" `pv g[L0JbN{CFG'Ҵ>@ ugomT"FӺ7$βސ"F$=Am & 1O6=A,l 5mL#T F qwbkH25(༾ Nΰ[uD|6ى.$߲| pvb@ vH7Y`6@ 'HMlp6bAE$cŋ!Lg#Fq<( ܎ 6.#Vg!FqCE$Ϫ !FqrCE$lprb/AE$ܶ[Ɨ2I`v @  wb[Hs %Fqv>BpnGM1Ɉ`8#J!H8| BHNFy( }? Iff8 1 Cpx> v[2Ѵq9J"H8|lj*#@^|Np\bȎ5PqugNحi1kHᇍ!+a$s; CMq( p܎ 6#ⳭBr;$Ʋ!F ( 0܎ 'F ( 0 icW8(1dni@i wwbGH21A nGHs;$hڸ81C@ XLp0b(( c܎f81i׷#\8SJ$H`Oqe*#@y܎@ wb?Hv#@ K~> 6.=`01mrN>$@|5uL> A2kx?1mrM>snMqc*w#@|wd7Hv#@| vHP/PJ0LN܎@H Hj7}HH҉| =]/(ɧ`?fwN T jtV$@ID\ (HҴn @@@/`?VHдq $Fl.ZX 'Hjw!} ͝:$ (Hִ-">[ GfEHFꕹdMb~6 !5%#ɚ6#b16&@ˈJ Fmz]j1&˾'I&#z1Í @MNL@in!Hjs `Tr'FҴ1k58APDB2##{i IC4m|C`w,@2%F!Hjp!T@^6.7 p$Hдq2$F^oF (}ŋS$S3#{#-0$$#{#i  E$"dDE'HJ&Ft[#{#y͝.y0T@&^p>T}/NLdBE%HJs N@E'HJݚ6>y8d@E HJL؋ChTaC#{#<]<9UH#\ )11 (͝dSS#%F"Fq$$@l+`^0^$=d3S#$F"Fq$%q;`l^0~˾[?vhژDą#{#@ @)N11Cb$a눸50b`/bȋ (}ŋ$nGBE$%sL؋$Hr;kM_"X _ wnGtnGMi?Ȝ l~QV#\X g}/NL؋ HrvH7p&b`/b( ժ b0Vs#{#@Y @9< WH7pbb`/b( sœݚ6'&F"Fr ͝$ 8!11Mf 5m\GgS'"F"F ,x%FF#o%H6 miTb`1 `*.>l״qgF$Q Hs#]$Ss дq (b` |x HY'Fl!FF# Hu`10AplO}+[6#¨_#}$:乎E 86AyE 8O}65m,"Ĩ#C$:yE 8$@FyD7b`1phXEwb`1p XLҼl&FF#"HsţvMqfT@Ҵ#G:y|!FFiߙp,.$+S6N=<b`10V}Ϧ)^:!F#S!H ϋ@"FDSŃvMqaT0kb`105\GYQ C7mخi4"F%FF#S%HePٴ!e#̒EL 8 K'10:ApO}Mk8+#Cpf#FF#$ HYQ@I }x4eخi71™QlQ@i y^H|Q@ >=]Lk8Y#R }#@¬`(bd`LҖF# }wh]uDTM"Fj Hd! EBK  iԃFEDT!maTP-10 ؇;SQ@(bF`>]<*l״qF#Zfy^T@}@ZbJ`^"beeE 1GWdKgvĨb M̅ إ{ӄ4/,b M̉ ؕ]<$l״3410g`\Gh8+#ib`Vs4,)1&F( |FXH#K%Fg;!Fe$|=yi!F$<}x{خi4"n L HyN!HyCҨM@.UųvMqfTjb MPAϝC(zb MP'A羋;6N#baT*b MP/A̋N F#ib `^V iK@~g6.#¨`1&FAǽ]C)0#Ybͮ`.>Z5yyį@`^\Hyg41`V i 1&F'ACţ=vMqcTH#̗ A1ݚl%F{;k kb i7❉̗ P7!icg?%F 1- ~JBwh]ƩSb M P/!֬@$@^<8Q#ib~Du6.#̼b MNC-1&FW P} 5mF¨@m P;;upb\!Fd.!h[ IDAT/SHH#%H.k8 1'F` A u##KxxOH5*fNx AuHjXDĉy0cb Mk (C̙H#}v 5mGčQ0Sb M[ *C̕H# (SG{4As$F 2$5m\Gęy03b M. |.C̍H#k(ۇG;6N=\`f@}$@<`<1&F`_ PA #ib7by IMqa^̀H>iܯL }$@ҖF !F(`| maTTN8$AfHjڸbb E #X+bJ'HiHs]<3MO(oVZ M@iwm^2#/#%s!uHjXDęyPu|€#PALKD\G4`ZV% 9Mqc\ħ#P#AL5@0$O~~F@ 04. t 15$t mό B|XYwbj'H$@gALNBNiD, B{,kbB:-< - 9$=as ubF:$5mGąyP#0G8>A乎@)\GK\ >xP p#0g8. i71@t l;AS!maT΢1Դq7@Gy# p<~sn BfN$q|]aE@)m K$qxP IM83/ GųE<{8$ +y# <ӈxg^`9fH?'Hû3sH5* !F# >]<9 ( fi7?~38( im >33; p8/~sFYhQ0b$.k8QP)̄$ܛ5-|3 F pO}A5pkXbsޣeA:8;s2. !:ʉ p>yK Fٜ!(ɃmAv? ic'@!^N5#n`.Vf i#P1TH#Hr6#Ƽ( *#F$~  oaVF# `>]]<- ʜZ(#H׹77iڸ 2 #F2 `$k\OѕlOIMN 5mZ,'Hq>]<- ]Z. Hq r6#Ƹ @$@KD n ʝ[0"HUųyA ڹ;$F  icg@,vCu$@SŃYA¨u%J$@Դq23"H7#@~_H7&H5*fϊ0o^gsQ0#ז 1Lj0:O6v+3;g5m[8`^ kO}'H\G`\I1̏ ~!ix0/fH[` k[' 0_}i>\4m\>|O&Hs6=d`n>;1 H{X l|E ~uo0wg>#_rv'=#_$>]< yDfM s Դq7' 1#KD&(|?13֪L KpAfA ugӴqg1 b`AsŃy@-cKsvb Cq ~i{Kd /+4/Yޛ5#cO]< \I6b`,A iChHY#!H]<0%J;Mb` [Hj8I%_MI-FL@^.V i#@D |~7 ` CZgi^Puqp4m#$P;ˈ83.(U&J8css!HF.m\G2]DR5u {J"HF>Iéy@N"?MVX!8yK `"(sClH%?>J@mV6 \c}O8oD:}&H6w6 9MN@u.(AtX>n'H&nӿv&q96DPA5MָjWߴw-a6vWs"H&HjMpb^P%\Z4m6s)-Fj6!maT0+k Y`oD#sP/AX$ ߒ1.'yU@ By^@_޴0դYGM+'H>_־"Gs l IoAoisD9o4DYs%HsSaBDܻD6.}@@>{H 9M~CHX_SWDoM`p?,p 5*(wkV'CnSGCSn~Z_D<S#Htm k] WմaWsV6|˟ 0Ywhڸ^$.'|Z'HdlҖF OCP6NQ'+ (0pDJR7iᐚv@u~(< :, c$P*A\G!HT>[4m,4 (  Rдq7f(R `pLJdk҈8&A%r~i:"c$N86A%z5ӈxg< =hA@] *Ѵq (O6d(у-$Ti6"N$A@6#A@v(ѥ7(ѩv#S#H(ۭ0EB5Zȍ0EJ ',A%5XS%H(PuDS%HD.$50qJtbkYiD,%` i昱0$P*As}N@.m9j ` ʅ( R\ ( R '6@  i}YX9$P2W!qJ!Hd׶njZ6%$P2AE$P+c6qfD@њg5PA󢖪5mF;[4JBaJ$HtMHŖ @ Դqg @ `aTu%H7M6IMb%H^R[Tj!H66 @ bنsۤ+djJX$$P/q5PTO8Դ\_j'H`nn614mG{` ѽO7p$å 9Z^<Դ>l[wMO`N ٿŰ7A\`v jxa rg 3ξ4m` qմqgRmDP+A dx &H>HW}S` 𭏢^i4" H;Sa2… ~D(b w7q[Y\2233DoN#jF`̠̀;|mI. l9eE <L_'Ju6Q_$Fo$Wb6A 0z c7+i]DY?N7M'u>LEC^FĿ6MK_Ya*$$ݴz5m7m\ 6LE|8 P3\D"Ex?hྦྷQBe=5IҴ0Խ/!/38`tJ#WVdF&H鼉7m\ 4m*©#H= ...wĂ ݡ@} >V6f$l*t C| >00Fp?{#H*.X[Fp5{LHuӎ$Az$l$AB&"nxoXMHS.)B L:(` LHtP'~XuNH(LI|})u aP?iwqShABam/&UCpQ`)&5 }7C19`! PÄ/&WK`mjT$X)P˄~H5 xT$X?A5MHkYZ 榺۫ ."ⶂT aJ 캸(P# &$.FtwqWW$j0?Ä u.z.APwl+8Lib.ABƔV 0K0KMwq61 1"g$ m#5!f8!!LI`e.6sȳ LI`Es\3$s LI`f;!f".6n Oдgs`l#⤬lx2~#< ؍2u8#< J0,} /'E#A34}k88ZU,eũcLHAeR_De#$$$4X71B"AB;D0ObdDY# !Y/"`$F8E~5mGUD&%F8 &"NLJ?eBP:~Ȅ{0)v`#1!a$M/ʤ׫u]|\!H(`CpR&3Av7>8nd1 i8LFظ\yp bi0㈸U_@_.>i0丌 äz1BLHDƋk gw© 2M+u~Y=EIDܮ.b?%HTk2D k v穔 3дqV8b*&H]zwҶ"̄ 3`ǵ:V4̐ 3ԴLKX}gfiED|7k `#'A5`Z KPKM 9ۖᓧ81-1SF0%3c*B ʴ`>kLkxQ%]]U+e +дqR„k `RzM{g +ҴQYLspA2M`$qj=Vq„k n$+$HX"HW^(ŰL%DsÃ0(S<|@,=X0^{,v )w0s#H`/}pUO$8%P86AݗFR X#N8./Sv7V0ViŃ8ax Smk'HʺWe`=uDlM@ A4$~r@6AN$ @:AN$ @:AN$ @:AN$ @:AN$ @:AN$ @PGuIENDB`PKL\4T>instagram-feed/admin/assets/img/about/plugin-sugarcalendar.pngnu[PNG  IHDR<q pHYs  QIDATx1oFϹ{v Uؕ);UV!AΕ@H'u)'.gHpw?.  B !Be?fy4Go+7ͷzg߿S~z;oh/m@&]S5 /[+\]PmP[KG>V`+?_1`fLQ:5Vc@7p6^)Y_ߛ X&h OJ8.)EИkG1yXs^$XC؝790s@;tDT6`g6`)9drQ >:;tս4HPaPV,aYj~֓Wbjp]V} XOq=s GԼ+~I D+QVGopu7\ 7b5n,V,ZB*Tnh VS &kSoIr:"급2)t>yPcn]#e7,PIwo̫PfN z Ý-z㙤Y>׭$=fNmZyJ%G[קݹZɑKKPC^,ly)#j7 VKbKܫdS\K*qUKs,p M$sDtf'*_ y6 X=,X ,,B U,RT[vv7mU7;TK] ,3X9wL J~">0рtvdˮ,x*H",7Ԯv@ЀXE^_m,䲱,,  =ʲ;`'KU,DV \}rɳ ,,B kdj)`eVW8`1Xz&,yIX``0&9`YJPMg:U˼ctߵ<'; wLTRAum]X0eSUL*ABa'W PulveN"W}Pu#kb}X3zޱ-γD$^!jzxqm,ηIBn%%,g8_?FcQtʀ'`PpL/xf"upq:_gW:0ڀ4JRƕ%`XyS>`mvi}k3d.rȤWt8`=Nr 65 ,'+,T ,X*DxƒIENDB`PKL\"8instagram-feed/admin/assets/img/about/plugin-wpforms.pngnu[PNG  IHDR0?p PLTE~>>>~z>>>>>~>>>>~>~>>>~>}?~>~~~>||x>~w=~~>@I~>{YD26B~26B26B~Z=26BZ~{_#ZZZv/~>ӕ[j7;GO(c0.2=#aQIN_vN?Tj&B^XdzWhqi􀬼^"PJGI Es-b#j'c'`#37Bo+@m2X,Ȉ\SMk5Bŀe$VЛ{9K߂Q^#߄AFTԀ׏zmw?G)Z Dw:\1 sWh-T-{>ĉcp8u?mW1M.M͐XhRuA󺁝igxQ{FqDj≮ћoc`KnDd@V<0X*b:ήẜĈ֬tTUZOR:%',pHަ}uZFE::¨â﵎ס}urod1ԼȽӻqK6ưАc\LIܬsZmMtRNS|a)@M}D8o ٸkYƝ썄j$]YQ"Ϋ2Av1ضPВXuIDATxԜ]H[W/j"郏B=aoq璻de/BL\!0YDcZAi'Z׍vخ>l;7$nF{J9?眜r+]6{s[c⎒TxKwwTtڑz {'w4ji掂FDC7fRͭQYo #If^'D[yՁA4Wklt Y"@bﯬM2qDCjjL„NIn5䥔q*-t Xd$W/'M^5S?,0k]=x_2xSl(,!\ЯP`~t$0`WZ$k5;U5Eu(W|T0׬ $(-,ZlXrӻ͎d Q: Š!%Y;MɄYnDXc8)! v׻ӂ "N^ ¸ mHcƣ" "|β!iJ +0TES15yD}F9ԫ ":ԋ[ݜFdco?2Q"-zB!;S"/!Kߚ($o?1u!,,$ulS"<c lD"XrG؃K59wm/RSgK\ߒE?7/翂1'ȭgY~ ?DU|M|ꖜZ{ʈ<>"S< lWQ<"yTֳKЭS`o'@djv l1^z-*Z/gOQoN],QpLvgmTߍ l^Vxz/<}9Y'6^l$f_bov瓩 ȷZ:!*%^H[)Ƅ,sRzHS3*s"å*5X]ƧOQeͳ+ehEʊKOzn`g7FHEceO=75F8\j8" <*ͳq(EFf̓YyݘkgډDtNX]WM7aRl'[m5U*r{W|~Z(+"*3,UzD&LDxODkU6$#8.zQ;f*M D'svTVFX} :W]SntIbi|tKUC(u@Qd ng7,&zNcW/]od)\.<} 3;.>dG(k.S+. qShZ0!r'?6#L\":-asv0֊\,'EKz^dT^Ĉ bHI{;W$d[z|y e,,L,"%De"~3U3mpcbӇg2ްJ,ʓ/e^Ȉ$$U,'@ᣝB(;*("P$=;X˄6iU.4>Eh ("FY@2Ř.]^J"=R)?;"`r,$?y,0wV/I bDDψCInY%=߬,RHS3pl&nv5""Ry߾;~{ zV"P$p5HόFl0 %uDo+WCbaUyvj& ekB`Yƛ^]ADlFth* Y8tO zo5"pZd&+h\@BY8Uq-@ Rq1`:* 7Ǔ XUEp U@ĄK9nGt^Ɏ}iY4-Igٔ7o7˙"1NſxWXL!UB%-c]ɷы1+BannPmӫX܄k/V/ҢI-P0%*aiM,W`[HB$4Msy!3eN:HL)hZslI'wXͬ,r0FD,tFJY!u}AVT'oៜV$2< HQ_,l %/1@R:3Zqر^"V&$b5=?ld54G`'8{_4[>G;)9&(+C/ B{P/zуg}0DjmM+%Fhh41$=hX(͓IPAQPtd_#簾37fR"3=" oL׽TYŋ YsQԐi[ֿLw#/;ɜ||JXwd>~R!ב!.UPk&! 6 (*W=zTZ'qp>q ׏ߺuI[/w~VV:ՍDs"eks湃Qe; 2,U.4ՑB 2ħbetem]HJ%))gw:\N5@P4 jZX)2;ɜΨ %A)q7ZEV̒"2IkZD|mE#K=`6+}`dId, q-i"q)䟃JSQJK !P<vNTM> AJ(l" V$5sb-Τj) qPE|p-@ ]bgDTD8QTS=E~ֈ .UI0pUnq1 ML}uD}XiZǖvzfMGnqGyգ RI^'7\nr1hf˴6`JHĉ.3$g $.K'QxEp\ƀӻEąwc-m̬u]ݼ6 "EC* 6$T i::;ݜo%Sc l^z'a?`6exu um\4PhCs#xktj'H#p ⻺իԁܾ yT 壇 /AC͓gYzO CV<)XH( YHvLJ" xª"6juK8[8+buGh㢖pY1{"!C1y4]SKSY;z|'..Li!;mq];c\w23F€ omV.BogUrv6OR^Ν`掭w  ޸S9, 6AʤCm8n2ɴgyITk44}}5QySI'31#>𿰩x,j7yJ_: דxJcH˂ǜx`J(NvTI14!؎>/:+[#{Ȃ%Հ0 JL.Qh^d31 F{ͤ%QHش(Y] bX-5|覙 Adobed      JJ !1AQaq"2BSbr#C$% !1AQaq"R2br#3$ ?Y9kԽn"`T'TKCyR/McnJd4=R4 R<CsR.STec9"s ±V#>04!'qJ =1O2PX4AsLu4v KݚYQKHXBVHWs\@y ᴶqi3"@$7yC}'u)ENwHKءo,k <&{V٪uѸ5&v.28G;iZtuoiZi'wzf{ħ&L#M!ã}סHaZ4T%KN]FjYLdGJގdTA\ xwynfSSEs 58dMHfnL9[&֭_ I|4xݳqV-5Ja]ppPҮ,^[Ta·]ƻ]Nc!yd'Ty֛m@Qu]z._wӴ94u*{U>`l7>TZAQO /R>()A_E1q94}z괎C8!X 7`>%h6'g6NL6 ]\5H"V3rVԯquXP5$Hh/ 7UkdeNe_TSLzI_ަ.҆pvkGgޟָN5.nzD)( ZZr.9IFh=Jޡ0-=l!Y[Rͭu'z൯v#.8c ⸞uΠѲF 2`ũ!c!UMlaTk6JHWUӂcd\4]p[z]Mz3@}vEV:סS>^ao0M03Sa%.(?uښE:Ĉ*?y:׬m:yv~ڀO3SW$m!YMz*] w;]g!ccۿV!-lJ ;nSZUw>αC~GBǡQ۵񏧡/z1cTlLiRݱ%H6OaB׶T<`ٖ%j7h )7p(V%T?q $" =$zH :w_y@YmA5\J'ud&,)^ݦ汫 .ّ* ~O2P[\\bqGa_CSnEKϐ@󱬍 o12Rִ ]{WވGCrzhyp!n>d2qԅ* eZ+sHUo"gں Q*~k#2.;#j|B\a$ۤmfJ7XE3R1+[oDS$6c.)|ҋ-pO1)+c9ܨ=P[5H +:ODe NHxrb|T@iA]vWI,9Oz&"8f>:w!xjuW2c^EiɠDbg& -`.M$7$BЭRH FbFJ+A uy>CE&a֗2ra}D6]!.WqjUBk4ߺ#CD)+bһA9ِ+m-)'lPkGwPz.jN2pg ŒXikE\qOqRH:4q9|V]KIqg+JdvOD;[g҅Bi)ڈ/l?ԭPkjŸSo=zkm6lj QWsM_z"XmxPrv.I; YNtKag+Q\Z7pYk湽SgZ_xʣNSP2`u>[k$dc:JluTH1.eI+#XJ:yzW1XMe^i5R̂9a o,(ҁi|91SRBD"i<#pfdܻ[.?a\n\:jό8d=t-- 'n=O@ְ Ez$ZLd*(@vIözN(}^M"y)ґ)JDC<~JeH*iD뷽MBs.eCϭ;5, +PTI$I$swPܑWPKL\Z9instagram-feed/admin/assets/img/about/plugin-searchwp.pngnu[PNG  IHDR<q pHYs  IDATxo]H/S(nRh qI ! & uLDHBE4o+ٳ;g=Fq`>:l`wUST Vj`D94Vj`5X VE;tjqv -۸a&l%$7X\8N4f@Y>nZ]pf,k!;XRza0:}2sy6$h9JF±Rd@|NɷLSX=͉յeE%`i,9Qcַ*bX\,ATc:~ ѣ&(`9AQb\}y\z$9UB}NԲ4դCv/$M&_Cj=+CO6<I6r@Cr-j+VcXCG߽Pq7fT:L䂪{QfYr8[Y?yM IZFѰX՝i-[g[#{|hLjX\jkM|V}G-? 8Tcꎟ+aM[#C!i?؉[[A/,&9YpT.̳V1+V`7&*d4z(Їz[SӶ31:V,͌Nڑ/kU GRku &6N2/ ~q3sFҨyPUMxN4GTrB15,FtN¤w1Ymf(zJ-'}gޠ4+f<_<۰B#Rt)GhclGS2C.g+pZ;!pR2 zvFG3DT`K#èYU_ְLѲ46-kꌎE,Ftw"5V$(YX:`%˻#cZ 1m#<&[8%%4rL|$?ս'j,k(w޵ŚU[(1b%]Dz8a_W1R58i(*M[rKP}U%wX=rh]@vi;0D_ 'tn3TOˋ *KYƚ/6r[{۫;LJRHxSEV+O%,{_U]BłqM֘3ͺ%4,lpѶ4ID,,|nRb.h6ŃĩY9w ko0unq2b.#oVΝł4ͺ{[LgM6m{#c r >~y\%s]3I37>8Z.Xk!ph3pl rlέLw[' %fVSa)%ԞIENDB`PKL\FF3instagram-feed/admin/assets/img/about/plugin-mi.pngnu[PNG  IHDR[YQX IDATxy\WǓɼd&3?f&f4cI&qGAQTE\AeqA EE]}Qwp] 0γ>G鮾U[sl.#No8z]eD-D3:^Yˠ?'zN6QD~Wa`"m*.X\+ @hGND/-ב'!6|e~>_ciXS;VTCʠc?'.ܹ"痂U:^.z2 V ^Im~Lt}nt( 迾7=Kػ?yW`Gv k(jxjXl-^~KGEt+gdQ.-9d&1!h YhzSn+rQaN 5PLz`(!*3ҭXd#eU0iY`X* y"B)KCJe6 I>!rdדR`-R |cP(t5;. {S>"Zk_Է Aϣ6ǸT*z"CJQ˜LQY*Qm ̉v1Z>fw Dm_^E{i}r^⹺loFi (._l`M+:B&Cx 4C!npIלI女Ȩ: =aX+x.I2kg6aYe4Z[c˒r3KAPf`"=0"  GfYD{.sƻy.tm,O: DEފ6Y%W-EV)WL_ؘ7k]6 { :TH/[B9t=Z`RP7C@?l|~dGT@H[u*!,{N 8W '2a}#[)C/#)u(u:w> jyU!=ƍva 6}o?dI*Ew(pwh~D‰48ӱzOsKynhZ "9%7Dq5 4=5:}?s 4?{Nx>xL)| N)93 {y*o;,?’Quh;g//c߽@lµGJ2r2bdj;?< Mf=&/DtH~%[-.pH! tg48CMy-s*okMZI#)<ғ2m|$ *)[ wsTo{0G>hw~Dތ&wvk{,3n;AMn9X;*nuxQ[-EJZ|ljj8ΏQhWun= u3h|#6֘NF+ )nogPhl-hr~{xVZ -}Blb_T2Jo9OP $eP3|:}l& TR]hT x]EaP$4WA kgA.;ەVގ9" /awW8sz]߬h̹O$goڸm'#}RtHF%mS_<0سfRW_Q_vLzۏ[ՆTKL.R=n™3gӰs~04πӻql >-zyGEEoDQ2_4pU4=>uĜ ᖳdԙ;PfJQn﮿z6Nnn_WDsjihi4<*gj!9) lll$AwU/y1zWĎHj+ vj* ^P ȱ3`' z13#%D+؏n*} @wҕ3]=[]HvNi86mVz5w<>QBv3SX]cIE'=eq9@w]B]?iRtd_gç!TKv@apz8ثsrrԞ?Syk ;bKW{UW0W-"ص]Ϟt dAKcƉW៙@HrAms@uF-)*_{@ORoGh=Nw'9![WQ`Oˣy&EiШnYFLfLJԫ&иNNae+BfqkRD,98JBg¼2Yx]"+m9 W-z|Hh41h9l$.顐UYfY 8ՁQYJ0T؜|DOj|J|G3U|z374>0kD{{5dq}B#i;kKT`?N{m\8Seu._i*4; L5:̇r6slOum(MհGe捬t+(6V*/b'~~7- 问,ؼ5Bݸ V,#RPSt xUl\'B6F./e|LZƻh]~vF l{+|>9;pv]`Q}&\ޘ7e!;'c s^H%=A>^0}J~MdiF.=;6QuVYU Ӱ@ir:0µu4n5p) \ujgq;AAW.ؑ^mӲFv]~Վ=ގOlOݻ ֝c]GJ^\Ք4‹篠38ꊱ&T0ZJ^0di|HKuZs2^/ g'[MJi` s4 g/rH,^κ!mo.vۭs{Εý`x0Noj$5*{‰_-$kKQԇ"4Jp(ܨ3ʆtz6)&$dvEB-/4}*1/&BeTgA0hb9ߺRdǂ*LTARc 6+yޥxߎ'MF/#)Cqt:Y^m;-pZJu${`]:VD+\ 5^&,( єs;θ Maհe9xTB2N] 3) qb \|& A[M]D:Q%]((%IHKgQ!(]O|'=vŠK% %C‹- s|{vV!tfJ-TVT©-!S.N`68(0W ʺ,jP-?SI~W#K7 jg Eq[T,ZݳE!l(Xr)\r: 6_1FMh2f:/QznFC%yf?Ѣ5aG.TVd*|`' aJY >71ܥB7c6wZ51X/BS8s^2 <7Q$Wizʎ"+G'414+igug*)j=-G+졕&U28ɉ*UbLVq_FH;zoQ^=\0T {ȏnUPVmE~&/J0u"Mu'kճ6b[l*,;=& ^n0LCv}2+,\O9}%)|O͠5fCgOcp/  K ʧ*گKQN0B(pQp*~Y9 ?!VFu)!,qUhpDD&%v֠ZM57#y" vI Y?Qiɻz;W mv?AqL<\* %Du=rᯏ`̀)702A@i1Z*otaB7Dm0 6wath5 AqmP~ӶW[$k)/ >$zy¸>˩W2{!e|b%/~U 1wDBGhoq0\X@GkAQ$tggM2KJX6Tʢ䊋+vc99a} ܏aDxw rei8GYn+QOf_ ɕ(;A_ߣѷl>ңL;hj:, -hJa$2 z4lD[}N!+2 x}hGr'wn 6V)rg AnC{yp le3F?fma*nܾ4r rKWYG 3XO7QF-l%~ȇahі @qv\$Wh_(S]JK^uϬ$FF"7$Cho87Ncy#si4 8LVG&AQ5L3}*auΧl7[D>Dh@4#=bKl!1u{`;T܍8~h<' LnW5sLcuP `? 7Q7Sl ‚]5TJXe؉hVM(n`Ꮓ akFaC]ݕ_Ϧ_wWi|t)BWr69Umrؽ?y}&`#IENDB`PKL\|K;instagram-feed/admin/assets/img/about/plugin-pushengage.pngnu[PNG  IHDRjS@bPLTE@@:B8@5@:@:E8@8D<@ˡf:~ RoFkŬpk돑&X_b+i=⺾vYC9; ЉxtuV0q"yWxER͆ 1l6\{JI:,#5 B TD=F!>skxpM#T ėģ}U~4CZ99ӬZr x%>;/xssvH~`CFdW/嚍>VבCI+ $R0Iy h͢ap7[#*ia8c$9~Th;b`nKs(|SIV#2Rxb'*h0:atj&MY9~/zJp7 )NI5q { WAl#פP 5ܐ5,@h1e-mQѫ_ vle*m!ic5-2u .pŠs_+v[̷1/?BM R,ɽvzf gq$15[zz>K7Ҷ!iIe>,趿R9|YL϶OEzrCQ}%b!ohC7Cb6d Xe^9r]0E|7]3m$X#%*'k.x\tmpky%$ba^l Om6FzA=ǣȋEar<ʂ!tj.hK׿/~ԠHIENDB`PKL\jAq q 4instagram-feed/admin/assets/img/about/plugin-edd.pngnu[PNG  IHDR<q pHYs   #IDATx흻GE9DdKDF" "qd69"a"٤q;9 ,czk/S%d/s|SWuu٨0@MRS,55KMj^9ɯ7}{/zsqӋ>܁߯^}<˿7o߾U`pA#u|+X,KI<K &xt᳋s!B΁?NC(~yb<77Mj B0"pѫwt;?l4OfzN>/î ?WbG {ZΦ  ߳WoFjLoNNUW+`g&>#H  wge} cKxx1`oMJۇ5'r%:zj:in ?DYp!l9<6\ ƍ~~ XBs^ T 5USAө *2zjcsEXsZ aozJqҗ=rNR͝%x{x O^;7X 9 ]52CUKV 89`}(p Y'ϞBR.=I-Mℿ>8Q "A龵b`ђ*Z3hz(\2vUpZJ.Z&MECٍ/|^9u. bݨ*=H`qzt`b,\+E`QHB ,NH%t 1J kh.ѧ/ C06|3j8Gn]8GB ~!H@ܠJchZ)i{ihTH4K@f*7CvHge KZ*9tҐ(ڜ %}ײF8z^Kn4,*cNfH>iO 3InKv-k9J?|d_6#a:5k[,.yxhQ8`KpILn-<_QlVT[~ T0K8XYF`{Z ʕghbR׊֭VTրK^結!ڟR˾AKx+ UopIBU.0v] ϡX4EvU٥ *)JO&(4\!#`٢7&(QMA%Wə*%g;po}1PrV\Z i &6 m+PI%9 jI$r9*c! oYa0B\&J@%!5A*JV)l9PIB4EK8:*Unʝ)1sÔ0=I-A TO\CAcۺˎ[*z *Fp!u.Q`q` n*.\?kY`W1ݐ=@*R\ .W:3 /@kp>nEo/zJ[˧l)pwIΠsP}ήZK;\'S ޡjX.F y XT>Ч9.Qp٥5aBV[ \.DW eSj> Up,;sG.߳K 0ZjlP /:N$Tbu UpqeOhp.,j8FPPb`Nʍb`IB\C7PC*#1X mI[R[Աwu\y }mj1B{Nc3q )T?gy]zؙ:FDS2bz fK#2g_Dg'[k-K:_j gB-3 kD@=ytjoPPbe,:Sg0.`FGtR1c J1SנͰ"ĆR#e wfRbkPI,m}#qߙ^T`>fo)T$gkEV㮑58|0MU_EEugm^oڙFMl쥛B[4GFgֻz!,>^睮A9[Q-n$F-;Zk7ˣn-(١omH(F<чja~۹V|]#`m$e;&̓v}7!t;3}ަY,U:JMk7Nx?NGbmUO+u`Q?Z~ `tJx$FZp4o ^z\R*,Ҷ!/ԭUXk E279lxSTDi8V:XŽA[s]Z(5یXeH+1ڍL>?j#}GJXB/B!^ԗzTAd׬:*zL 18d}.o%QH<-"1gt2ڏXpӡtPCEKEGf- |ɩS{Uv!5'cR{Lo=ie,l[q$k5@JRF.M1V|7p!^J+t%b`۔ @C:'{\j%)y{_яBċaJ@p TK3\UrØZo`!эEk%?l.ڴ,1: y-IZCLf/?Wln U@VkP"hBH-iAwFS h᳕p6FKC?kC.5}M3rTM=,XRש'lnZfmZyּ\!SMq&Pru襚Lm22`Bw%(Bziz>&ߛ meB4VhPCulBӱP߁Э.T\GhG/jhh[8SzHvk}8vrĴ30'NW0 Vdxxk:vi5W֜΁AHr “A V㰡SXtuL[Bxt簕`)Xjj `)Xz Jr!IENDB`PKL\3instagram-feed/admin/assets/img/about/api-error.pngnu[PNG  IHDR)θ5>tEXtSoftwareAdobe ImageReadyqe<%iTXtXML:com.adobe.xmp =IDATx tyǿ{gvwvveI˖-˲1G ! ! o(iI IJR4}$mhBh89ym@CZH q $)$dKeWZkwvvvW2B5wGGޕ1q`RG=t_~[fؿP2큥>9xA1SJ]J!*yLP+a<(t(댱JAof;!r(@s>Y!,=֧}z7G=#PJ꨼HY϶mM8 șsq] Bԧc=4 :vPU>3PD!AF u=9Q=9Q{(:qB!{(B= CP P(dt4AZJ`r.Dy3)LM@4B[!{{[aAFWɃ7Avj6d$j@Ojpyl%Ykd U7Dx{9(l7 ?c۽6-I-x!=Ex?7j_bt$iHbyC5C\Qa]b&+BGn瀯i<FًrY(c{6ߍ8ӹ^JJk"{rޟN-ۤuԬrȞ0FnLe.KU5йJ}ތnL]?8'RdFK;?vkG@Bn܃]hyBj-NAn!߁8J\ deE4?B ݒt1MiAl9 "{'N8, (Zcu E[~8C ;ҎL6h!:]yLQ7O=KZDd~ 8AS%\>{[#x'.;HXqop#ޙH1;oެng1"xY#qƽx+wb5U!w9_i S(/\86(>zYNƟG?d a_MKr*x_ފT9\dj@$xYpz{B? ٓ>Aas{^5rem]4%^Nڏ"k׋]F]'v!{{؏r{~JAdO2o渉*on7'n{5gS%d/+"{Bd3覲ԿfDq5A[CSNtMd]&F/2Gaq-nK7JP胗zBgz; oz ~Q3s#jf1tD5m?7ҙg^)PM K٣n7ٍ٦ڙC6YY)/7#yFu_jR|:_>Or & /R^8'&$ђ$GngHWt%cIC}9=v/n p6Ekǜ3'}E>"h}!8PoXp|_GncGث{ƻYlE>5ӵg#/bCi hm[HߤՀw="ބQjB!0)헊 }^0Ng ֲ4jCo{l,yqajTQ(-z>{VH_$o+gJgtcf2Za}##QGye[^Xј+!YFbi_Dc9c%g +S⒳gj#D4V/.ⅵƵ7F)٫ߔ]U﹇/ q7[g )(^Y k* aBb/*ZՊq3Jܼ!}QFMqʹi!3o'4{ϰ8JlzELjڟVZ"|鍚ޗqڡ">PGƽR(PF5M_6s*ZWPGW崓 vubb޲0f9S]- 䜼8yl/yU)A)Z|YKvG)c7)T׶Uv=c> :y}Z`sNR[RG?U8=M*C|bG-LiXsm/ ~79'w^@`9S!m`n^qoja`9'/"{A=q.L# v4s V1[ute(^m驼t.Ξ^UH 꾑gL!{GE[m@aӑ /UݶZ٫dXߣzNA)WI"y/½|G JE@5k $0{8s'$6LfyjBY27VO \<#aD#5^x!%0^bHGãbSNNagcVzos^EDa?lץ7Җ|Bjy+BrMd29s/M;6|xSQJ8Y2Wz z{RKisx>`&'goD|RѩRjYm#!}>؎J:PЃ(s }vwv}l0sRڭP{"O$ g[yRo-rYdY-\Idя{ tmIE9`DV٫*FCWR_ՙ/kW)K\7A]oV&0֊FV68IIY]^$ $X)4'wr)GNkt2-2b{n3~byÛB}jL&]ӗ{0|]?4WJEV;? ĮKn'W(6THm&-gCk sv}O xdae!د־E;iF`>3OrcwԹl>qq}tuYk@!6D%\kV=R:x7RYtJ%!.^)O[ ]S2O,?+elM◆_FUEy֒UW[䔾0Z-z/:l<MyEw뷢J^4 X[y] J sL#{g:˷NTki o|]{oteYWh?%B]oG/ ~JdoHNt威w=nFfa/Js'~M2/J5^bzr{Fho?[GQ?8=yn/x?MøWQ,fWK^'S2~ +nN'ɱ8D91&Ǡy/lmTglV:{s:F*]Q<{o>ub$$ZE`O=#!}ly.,9h=R*qwnIw(uVJHtdu|7cI]~3i@bXl9^zdO0^##٩kHՐB#{†aa=a6rʏB]'Z$9F`x̌{KZN$`1!(ye9i=2Ct Al:@9=L;@@WnQB=Jq0 u:䈆Nx3C汶P(8oS}tIJ"'>x%b9JX,۶=37Yzpq'!~[q`J)lJyxu3)fv mdSJIENDB`PKL\&0&09instagram-feed/admin/assets/img/about/plugin-seedProd.pngnu[PNG  IHDR}$/IDATx}}UsJvBR6&C_! Ek>fʴ d Li-ifna(0j ib .en̔hJ[٫Y=]9Wc޽}sG1 z[X>>e> @)a= A0BuƸ5yW?['Bon} Pa#lܫb>fPܶ$ "noBY^#2*%`Xz(n#Ь@L@ B$D9@樘 S:WpA(kXOMNxwbU],BD=inlN@ "%՞32" %bDb$u`M%a$9np ֤?9(@H^?"|$BګN; $)b_@XW`CY݄ p^~c_9FP!! %?+Zo}-xy&b ciQc]+7tObc1fq߄lDk^owyVC7|jΌn6yPq˟$)9X! A1bksK/o?_OB98lr_ A(B=(p 4E<< $J@K>@^PK>!(Hb]U[zyyle{, Hk\mgou0]cERv{)ŠŐ$b>F#e]խ}8=tkftpx"% .2\ [H$ffH<>Xhur7v>%(@P1 ꁼ1aࡐSs?|l`"4g,!9W8q <ђnt{7- |u%~ j<7pRn7Z/lt)ޡ V #2[)JX,^Po[Rݹx%%S5JB?{f8#*3?yDw^by XPbE1,BFg3R}:+Fw`ɒC-^ Zp]/jFUoZl7qK}R`vTAs{" ;85'~n?v5[%!w|=X3 K%PHVPa!Lp+-U+9[J(I5Wl`\9Lٕ35d;Ոce=G޺qneuwVٻ"rÆ'%fBJ vSElofM=wֲRTx#!TxsZ@D-$={e?-f^eKbIxK -+IeĨ0mY:=e(o8Yz@A-po)5J>Ћrv@=R-έ`n:k6*RbWIԄ$.*ݣTkH% n4qϕD`L)(.< S-uh\|=(~0=]JƯ2ЄS=F7豴> V 1ccPjJᰘPڒQ,^$`R;J4B™śr8H+|YBQ.ڰ҆G8;pf}-gRtj٪yu&;p]gRb{nd54+>P k>T9,x>Cv@Qɦm&v1D& C-xߟN[_` R~OUzR%+Po1*QbPO9\\Ҿ@AuЪ;- =z?\QyPQv@d!? QXK8oq^ ׅgr"Wn3%׵凭>U(A 0$qܲD&F#EݰRQ8: ö DVkހ}׃oZ!t x@.Z-<`P9oolaStg}n)UMxWa,|і;6*Ip'\ -1@ZXoЀfQY2xaÑБF ,}.%sk> i`V&1pͫҝ  (ԶCEdJy;ʹ˞9.N~8oaNT̉ Y5E6 <Qpy45X9-PM3`Bx<ԒHt8gv|/o]ߛ~؏M4npKTrvc6U0B8ݣ%C~%)n9 2a!v y4ذpO.+a DvIC#oO^7 >IZj;<;qFfmܱ0/= H 2] @gP% ~]Ge|S3Wo~FgԂ"*$@gaJ ripHC@Q%sonoqfg>=pm ]pi;5Ո1LjT lp L5;W!qݣӕ 2|ۍqpzv(6`8HaB,95Yo"\l<v;[WfC*S:e?޼#(H.=IV%d@E溳=S5trGZ?am8DZ[ ZA^&*5CnrN8smLWIT#35lK%,l.:eߛ7xhY㵹iەIpO 4pQgW\͟â'<1|({w.:I}s*Q%Dd=UqZ; ?NߚU%0QV+0eMJ'jn|_n#Z ɺ@lq?3s>認3XT 1 +R5Ppt=ȵ>y'I D *!z s?|s)/oݿDMom#PpκIpptk~CWmy ml5Z&ub*yє#\E?o{O ]`*>C@#PNO:.AQ Uc=C]~q=Dׅ119u>zbkގ> b2Ea~n[NF[ w vf.&ȩ g?tbɜ|3K@zmk0X65^ex(SnKWg+,JufsTBAJA0~,Ua00Q ș汛 ~꧎2$qQ9Ejl|ݹ-`#Wmt!ƹ xIZ$@9b>V4X&\s'^U$álnXD솗3uŃFMD>V"ItFWzF)^\nʣrۥuZlja,C2f>V͆)#|1XҾCkb&iyBn\ [ N/|㑫2z"LYx)4@Bέ,_<#X{ASbYʀY!T,oGG.6b]1~&]}{>-^{5ReK鿙>{ŰAe3h >.r H:^K0qf<:vk֕|G',HnsHyL1} khd yV _u:)18 ZK%N>\ݫq3G qˆBW$ +RsJBg!DZ8px$m?oS! mVn~=EB ڢU; ̥XC'c*]SΊYbvVu2WUFys?5K-#V9 YcoSw?Jz$"[\?`79V˷^ۯ_PJ f?5߱pEF^1.\|~2m7>qNV/" *YrO&gu,.dyCMYk9we6xP>f߫WdtQlNr޳Lz&U D&9!`Oc("#?*^/(ܴy?'o.?õ2-2,4SUR7$!:Ƀ`嚟;re1]f@ՎHS98ר2˥`' ̴焪LvΎhS_k+QJ:~Kpj!3vX4wk^:'lA ]Uk MN ,|PyK'+ f*$;i}l.%]ClFUْ&3/`iZu sg:U3o<VѪQ wN̐oiaBX$W{[헂kCK"0Hl :Hi;U!V P(K76 ee溔s/.4#t}LQIУng5#ks@G+< E@̶|gnLϭ`<㐈kQF =jϞ'RS-;okO=^)ԕ8KY'P,]}A?-G% rm)W7*0FGDqţ@`18&ֺnip8VJ3&k憧yrRfN*!t%Npy*)8-Dc KXX Y K6d6m͜yɦn8I.Ngӊ ɞMb3פGDTGAEbv8F4t 9Zopl7 ݐN_q0E aetBM /itIąg2@QZP*w87誽Ӭ*VXRQ k,7Pm kr%'zh:tr̼ # ::'U,2[iIVl@kF[7,RLD)Ӱ:X[jQ$J&J ^d8żMuS`aPBFU˄]_cFAvSX٩qo\iU-nBuũHBxCH^=|ټ*e'D㣐sŽf)=ieLI"\f$\Z{T#> 1+/ XC K}n c$5 Jl4vvEWmϊQ,2[VϏ4IQ.u|0#_/+uQ&#pjL!jBi#͇#BNbƒHv$b %+'9NlѶ g)xxeef!![]YtՅ*"ӨQ͸3;oYʡCoϝ"鲈Fl:lTvÒgq#$EEk}ZD@-sׂKjo7bB'*[B\"F51u:/HYmvfpP}f,$xxn[Pue~r_ 90gWFDP;|;M! IN['Wd1,lQ_p"XfE\ qb_+NԜxlAwiʴtCnZr)ڙ31";_MIU{bI]pN a (ȵy3k4@KJ72׎_vA¡+F2iW̢Wlz#Ɓ6 iB.sKvnL4S(lin"3|Сdk- jHkWl׿C#eZiA((3dKމwƄzV鰻یnWV鶽ݯg6LMr3ƨvBms3x-ߝ KLn.7^X0!R$C;{+WvȵT°F[B!@`F޾*Ap Yzـ8VtUFO)5־š)r {>vy4x0[̕8Id >MN^\xm֑)T| RdRf2*Gpp"jaXf[z̊l'={T5`R6:7:Neʺ9vb.DhV)U =Р%2ei [ Fĭ ?x`/ys&۴4c;o>cVݬ7AZ$khƕ 14Q(gg#p .W[`hmE7?1^nX#@Hn_\L p[R+;O~HJ^U}8Dz*ܓߙ$h͌XǮuCݾ x;߿JPde'ʺՒN4ȄO^W̬"dGKs(l(Alc%DKtmy}UyEրX#\TĨ!?Z5fz) TkI(yDRlp`19 !^mF6 >EvveeGyߟ?NȺ`28L57湥YʨS5Tÿ9-1ztoF@8ێ嬅Gzk/5ͱz6sWym"f{_槅i\ vt>\c$Bb4::f8Oe2BvnD¦ƢS@ (l"͢kևv5KzXӶ.6rAilvB;WVG 9i:6n!i|A`vy41~':}*@%=3Z;>w ?(HI- A$ Pƥҳ&v;&Xvm1fVM]s;n5/k"N C z h8i\/: 5rb P1dK^+Bpa DmY͹tYsv.5pU9?f #̓hIUKܙ6^&gHa? g@F`H|vr-|cDX~Cf/qW)Z&^4?4[ d0hc7,(&ƛ[U&pׂ.,t{y&:nlٚN>$M[ܷ:׍6pOQ4'85{<3Z>7 rT3O6jKB MEJC'nr<1&p573QX㥸y<; CvHRaT[3 /-V6c";n3cZe`4; R׍IAMLbWw evS3: \;ʶ˜)"DF`tbKvB*T/t3g_*/ ̕Z.ďݞ7(*d\m}Ӣ)SjZR )FVnUP" oRBFIVdK\;-ύ oЁr=#qrԍoY u۲Ifjs[Fog:^:gOw GoVƵZUE7 S^nsT\D,KӾ33XFiT:4 @B]+Y}8TEʭ љ3KM_=[VѦ\ۡ&}^L#e SCNʹB ΚYF[ "-MPaBB#PhV5F5G3kώ9{3nT*,PkExN_]x"~qHBMJic R:A=s 9w\[^IKJl}g/=g[?xpF.AT!AAf4cĚ51 Ńnt_q ͂4eq yQq$[lZ 'uZƌ13!K伻TY8 M车Т4U]Wo;^7[)PjmFIڣ6Q~81VWU ~ˤE N-|\me { K<NU it)G~FٸF%p5֨+dcN(?5% R K"؝_x*҅s 9q0o˲OgFnb,{n#Hj^NJ5Yk;Ui"B]yQ 4}.84~ gi_OTM$\{keѸxő@ aX,4 \0^!j5]Rf[[yŵuS y緣N9&.u׼xq FJRRI][ .]7O~z]E%d3_*WgT|ƃA6c!4HG*T1"R:</|Z>P-W@GiyR=LQf(.kٱ]V{~kFϮ~qPBj uxANhVJ_ՐU[as ㋣\"C6{UD ϑwR :Mɲvu|CRu"Xyѧ ~XZ{ d#E^UaܨC&ED'O$=`H"لVgfݻwA,??NB)CQ1q  D -ئ\r\7Z# "@Z$O;%@ЊoLR$vsSHfR7]Q,poY=?vi1Ʒgan|z+Q"ħ8k-KntiIc5˜펗6rహ1 Ğ뛞k;mLE&,̸ɘ с,#{4DϬ*,;,MAҋekq֬Q*I.+8CUiYJ\#zAGEcz!@Z0xxnO˞{iB Zs]B]VӢuuU% ["[zhQGTW%aӼKZq ALKZs/ #OlI(G uxc_aӠv7OX@NuG tMKa1=$l2}_yF' t6 kq箟ώڽ]nSe=DT~Ԭz 󵤬ګKK2oB(W`=~zmv. -7S;DKgWE*Aγѷ A"7 x<5.Odk]-ߓF/[>E5_JҌdIrR wb7X,jVmޅ֦7`@vp|]h|Ykώ߹e0iiH"LԵvLi=x:)gj_ca;4zAq})f= o7zyo-oQXV1mD^z:yVG:J+a(%%mJ2ʿkDx [Wuxp< 5|m*N$kت4LFP/b΀In\\l[A&/.s @;~2z5{zwSPl 7NhDVVhTdy#VfUt2EْcX>o7\533zy|G?]C4R;͙BHݵ&uRغBPV u ˼.;x-_ܲF/~{u]nEAmw;d i7f'#xf 5[#)33y DEH]<<4zy啷/{8Ćؔ)42۝GٴeVHB*mCX}lwE!eLO{/w_s(rUdaEz.7L9;_2TVf+Fi, ]+_x'n 6v^/8)"-]>aݯx0;3k7+CC i{'%-dtL5RPi0h4$]wq_qb'MtOm+D:Sup3G}5YY>s_zS|ԗ--0 5C<4 '9GhP>m SP2aܷ_g~M ?%f \5 4ߌ(ӗݕ> _S/@sU__큰$̝= `w n`,a V֛^1[@IENDB`PKL\H??3instagram-feed/admin/assets/img/about/plugin-yt.pngnu[PNG  IHDR?1tEXtSoftwareAdobe ImageReadyqe<iTXtXML:com.adobe.xmp XUIDATx ygves@P`1Iġ U2NŮ8L 1& )Gep D\mrB+@HV1;=^=jW==Gj陞_cei$C f`$/gўfwR=s@X طimҮKۑ²4IӤ7iiBHV ÐI fiթA }ؑgWIt.G[jx&\SE-#t|RZ:Aeg$ZHzINzKiRY&óF畐R(NF.dtԚ.;P6M;@;!9=rw$^_E{1m/i)p]ĢQ)'9PKEV*$y__jrm,ױ۽N.swxW7ccа;66xNqLCiv&eZ$ؤkK-Y1M)ʝ_^Da|V۫X{8;v/R}斗?+K3V.=kn.2-5lLVȟ|Rc2k27@=E;m#zo7=äH 陵ԥ2wQo+D)mPiJB9^)084ÏV{j Z2|92\<VS_wk2ȹ.zz[zCϯ<]P/&;_gny70}0 x0Dx63brtU ^{}7.euI8`P\5wEO-]<%_b2c <kR_X?X(/le_>=os.j睭\xJe(r,pO?wq+(Ue;2s_vyۑcb.ݗABcы|4rT*!9_{YS_8 H* {k 2'xݽ'5^ûdW@ϠzC;{WSc\+TpFB)8NJH핧~A]m i}f ^UX1ގ1wC?#)0< MUu D 0FR;Y*Wb;C?8P/z]e9:WiBUg!ι{A{T!k5sH~cF эu({Ņ92 ́ȹ.%G"y>M(״*,HTYAiګ)=b$N [Z͐R$'W0:*eTO 7#) $A-^ibՕ+VqyͿirRQ"%  鎍})|X[./BaYE+ ^Cm_SaLYtt`~m\7^~5`̰ZwB q]E!hXzptǝ!ǂBm\Θ@!h´4_y=_uwǣ WB:q5 R= t=9ef%7 " ٱ3 xVPHP,OJ%LU\r?ÁBdu;$.qQ=\RHwhHyQH0DwH@C(K*V;~<B7C<ٙZϯBwM[ z6 VKwtĺgubjC,غ˦E!]Occm3k!tt=W ׫ֹPH#<@& #E t)D掌 (t]N$nb"n PHixךP@B:#H-󎂤'=v8e.lN2VHcqEe ںȭL'fh QH9(Օ+.Vd[C-V! 錓N,ܸ>"V(d#<'^L')B0t>O 7_:L-I'E'FR0tu' H7H]C1_+5p,ê D-@3rƱ}ܺ{ʰA(%^\A:Pz@Ig (n"'+2.*ܸ8DL-z“W]qY+h, @uGUXK/a}%y϶<RH 8H !H $'^\/u酛7;CIUA6p-}p>p>CCCy2  ^TZ\` iݾ[078<ayb6  YCm<Hz{~)5@pl~܁C$,;pC$ YYimOmͪ[t /G6nE 7VxOcˡ.~HL+k׾{U5חgMW)XgkȨym~6׳G]Y(B]\joe+=hrW86NAO+ kogaySb!30:[(ghvM'yS+`,ϓk&=FAf5bl=m?Zr`b1) "y\[}l2!MTOV qw<@!PDw 7ٿUkvyV*mb(3Mmj~B|'l0 ?yb`LMrz]A4#v sϷj WC7ir*e~-̌zavz7B(g 0C@T3~iiB:ٟw R'@o_ZyKa$J 2^!@W]ZH\N+ΡNqÿ ̽t4nOH Axtrds.lNAdN*͏$̃z^kH FGEκ9@6׆`h xtZm7l,c AT!ص BN|)< 23o{EmA +bxX:N?1e"TXAK|B:Y*S. 4*OP **"VK|Kp={ M(=@j=~4Y} 'P90tWV9jn6( ZPH'y>OaW\z2S?ã!>"h \X8N.ɿ?Gi*+Ep۴=1}ῊPH}`U1c3+-EhpH80oQKswB_{%r4 !w#GP_.t u'\ &P!f_-]!e ©vMlh!td(ʰZ-ĢϜ?y rkRV(U#@fpTj `t~DsED1i(DtRJ٣8{ڶhw5 W0K!3N"7m^q <'QHu\=ێ~h>K\itg,ѕFcxK/U*㶔zP:L;"뭕4=S.ڎ3ku+uT@D?VtG٣ԣ,x@?pԮQQ)_կ8-xJ6J}%yjӮ#a,ePD>뺢V-Ԟ0qO,̊8/S ]y#Z3A:>yʫDKsݬ爂yA;}O~$cN˞9*pwˌ+M 0{_xE." ?;i_dfs>f1N?X*|z iW8$40FKTvS-5)C^{Zicby)Itm{|ap-ar/_S9K%WEIֳv10,5miv75^(|Kftby#',4u]LH lQs#{STmAT&a@h_Ч)aR-Sڐͷ+ٌfL93lr=-\vk[l~_?RY wg/Tc||lr9ݓtJ֠kDSi*Xۂvu!uJPb-jUQ3EVRҴԆm}X-i[KR{΂9D,v/KŨdo&T1U5 WuuUW7YuꅔZCҌ>@/V S^zչ8PwJ}RickmԦV}FtDKȰh[ٌJEʰ&+hl" U@FF,U ])SCk<)le9y}󝾜ِ3VH{U>~]m!Y3-$=! uTiIENDB`PKL\L%< < ;instagram-feed/admin/assets/img/about/plugin-trustpulse.pngnu[PNG  IHDRKTʤ IDATxylTEǷKK+君rX  R P-b%Hk)7PD($A"ŀjV. oߛfv79qhmZ=#K]B;NdiA:'J .&Kgn8 %qe'a@} tQ܀9 :*(aHt],Ė db-J(AHDspaF6rc.hzyZºż>A-T %;^ ]ܦ7O9P[:ü$@og{mEaɼ:AEbA>eMq@@٠d ᒠX=+ GUS]C ?+__} PyNS۟3Vk1@EvQHKkvLA50,F~ȏUO6Ւ`=V VA@ќȆBd?*0Kk : h0N^Ih =:߇jZ F"UDzA"//PHX$zQpf}7I~{J*ga l% $;.5 s$N1XxUDXAX$ EϗLOF'fβJDd Š7zmlϐE{jUGlFhtm$*(IVɥ8Zj7X$\uK[&P24g:v" Ij&Xm{^<X$ZAT\Р`XْCl{5Ub39k \%W H 7}aħ0'R 5%f #^5pr`'욖Ȩ:N V`Mr~΂ڻM (;619!_"y)j ֐\"VFb8T-̮\i[r׊PZH1f"UQ_:oكvE@P6=r"V2H_Ǹ6{ngߑr .v m|'.M~;[,[9RZh\yQ»dTK:J/VR|DP,ģFRrnW{s6A2<;aJz !y F.kO׺GrQ{1HIENDB`PKL\7/GG>instagram-feed/admin/assets/img/about/plugin-wp-simple-pay.pngnu[PNG  IHDR<qsRGBgAMA a pHYs   IDATx^yT^vEY\FqA'641VklivmkkӚEIlM4uQ&&n +HD:3/3\;>?Gx6[\̮p) D X @@",` D X @@",` DNM.(OEt\)U0{/ZGStoXM~6JZv*oTkE̱=hdJ ѳ%4}>:WX;?O>>Zу\<ĒeQօ0嫕3 PUմS0ۚgkf-OWMG6~&#;7+UTѦo|WjOio w aPڝYwޜ֗F$RW]ݯ|0s%uP-cޓP@;v|2l?^VqC}K\ |WCTˑY^j ӠKlڟ 4@@",` D X @@m+_\U |OTunT?Éx2f,[9,< A",` DvnݜۇTuC0ex'W |3ZQԅr",` D X :x#fkC\; IR-sRߖ]"yc3WCns׮s')r{q4kl o*Z9s)y ܎%RkĂjYaղ>#hs>{]"}ʪjjY˴g:]Z֗apGc" ׷1A3Y | qeJ.2H=FXkֲt24J{(24P]L9n:tRRR=Dblx0ݭ% CCc<mI/PW':,NMSiy,:hLr[:4SWNŷSX<t*HhN0g C](,`/Π./EӼ)}_ݥ1c1\]fCžt&.HM`Y'h.pK6f+`YDJp7|;~'3icY/[{iaްt_]C)"4@kɹGΔ;ȕ&S[(,pȶsGex ??_z8ZxS?F%g#ᐽ)P:6 \,&j}݃=_+?$S)^,si&ttoӗz#@13c]VX;oPj}cu],T|cP~j ǏL3K?ϦRłevl(#k/_թfbÃ@1ac\;p9K,Xܿ_Y;**UѠQ4]{Dw_ķwӻ8 -t{g;.=NyHB4ݯMp9yỈk6һIV6*f>xK.|Y!tXXJB.U8C:_,Wnz=ibJyO,I Tۏ9V0#_n8mݪe RziUj3N͂df^e@02&(qA#|nTX-g Kk`y+)JXw%#Nh݄`ywhڣL6!X B~v+t[!WFB`'{&mϸHSV-G;^MѫfDy͙}3SRuX=Xb´E4wmCxAo:%u_扎 .-vb⩴nXx$|musmT} ӋU˚ioʼ7m2g-*n8Z>UOh݌E|ݖ|+y7Z WUCӤ.2rDY?QՉ0JGHuj͊wwU* r WX.,7,`]ӊ{gMJanѢ],` D . g1[`޶ï<lK?˪%Fx5)} KOSߖV+k3cE&:]L榪#[Ųa*$uЏHic`,;o3H<>ek}%=tP7 -xYUwn|~ u oooj ޟ~ԨwڅSٯ55˪w[8ZCu)OeOH7.։0O߁MVĸ ÓS?r8'X \'XoB@",` Dfްg:/뎫# ̂-(@܀.*`:mrb=@  s+nᙳq!`sΦͥ@ D X @@",` D X @@",` o=R7JIENDB`[#cVa?@c Z{d!Jw=ue9iﳂ-Ⱥ&8Md_JϷi1]' <8rCj <3\/1(hhn|3-Rǽt'Yk}{: IaѝGAgXvu}{^iNE}Pgٶ?a;|5๑\7 Dx Вң{&n@l4d_4 xٖ#iy 5Vk8i>Os&³oΉ4>b2] {}g9c9j3лЏub]~<2SϾ8ǀy}"Q  {4ټX[=N ^d s:=@uk(=]%^/cC+1%|yIsSs(kҎW׻d4i:$;Pm0'hGNqNъ>&'J務ކz5zI- +#otџCrB#uuI*$c> ܏d5VC//WOxW \`m |_QњF~Oy>K{5W~~6:r@철VmQ5d5GFS_TU2< :@q]\Z cKk2׹&rk% 3xؿz(v`Ph.f t̤2H1@4ɠ sNK6:hK)m{75?{dzY,ܘ?jNځd[ N[h>;i~/G zmEB8M53\GL n}ir'= Fw >b՞"C~V5vfǨMZit=|{WA `aW`9<H x.wo*%pÐ9 `pÙz c0 [h\ZuG5dDL6De=0ϼ.n h$\K:A^h VW?S ΖSy=7^pQוJ{ueNiɨ_n?W+&<1@{iYKx4'uv@7ۑ/.6&cr|.w7&"{eYi*n3b:u9(,bujR ܖs&B}@]:׿#1CD M&kMťVڨwIVOGZ梾3 c8f5V~9 јǛw0 >uU&.ǮЙf-ؕIp{w6WlFd8s=&8+Di/MWL Ҁ\kʔ8cxA i +J bF7>&n&'-yN)2ShrOnHSJR7Ό5>Ei<5a Z[&?8 (RUԻSݠhW##&pyu5Fn^g]xg~i&'y Qc9`Ã^t=nriYVo'U#dhԷi{R2 ܡd.zYi[GFމB[Wv^:WV^kĻ^.?@ 1:4]iM 6j1 @'i@+Ѝq?.fW_Na-{XI(D݃ms@MF$܊?`76ZGXa@׌n3@NpWc@͠F&*$ Gu-ʡsVM2!-1 u.4"F;eoZ̵m lZ韍4l=`8 rmmhq~#e&|8R2gAn90d X`PKL\"6ntCtC3instagram-feed/admin/assets/img/about/plugin-if.pngnu[PNG  IHDRL\tEXtSoftwareAdobe ImageReadyqe<viTXtXML:com.adobe.xmp ]l[?IDATx}ieu^;zCjNDp;m[ 1C$EHH)DH$H HlA?Enk蚇՛tb֞9?_w޽g~W#x\ LS6pܠ| K?blt]t[MLUWyfoY?#kAN4}nir=t*>S<}2f ɸ3iH$s<zMט" H&HGР+Xސ%ܳO-UX^5+~ioʍҳ]r@9'o]G27]M;GOë&-GQHI;p^D&$T'D:(%o E{ūO}{Ѡ4}^&b8K'l^m~Y{ V- n2%h-k0"H{^]¯,K^s%"Zscx@_V1ş$Q1`#@v< ςjPQv{0yۺsNn0i^i/E;drmॿ_VPR؋>}/ OTOy9/g1Xhwϩ(*C`c ]TPYy z)t]g3]X>N,b_t%@CmY}ӯcZ|%`7 /0 ',-Y]j!/p2L%UJต1_|mC:0d[ĉ쏆[Ý{{76wn HU>x$)6Ot'GևGt%\Vv{fO|cOf/npP~7jW̑˧>xf7~pqn[.2~vI?vܠ4ZwHIwKLa*IRf:'. 75IgIb6d"g~e9|ɓ|wޕpJ"L:AY-< ,_{eIևӋN  `kOl_= D K0H%!NawxBB-erVZK__EH7%&#lC€/^C0kc ^ yHY=zijGɴC8*( J8:t=.g8@cQB~/,>rs4!s3xo=+>X@hx#MS<=Xb0=2ÿva@%+EP`Gr"\c y%Y`}Uxo7ɴa&ؚ}|(TV$CaXw,fsC1d\v*xf̢~Ԑ(C]1dA&`c9BzaxδjF⌑f aLtrM=BHĿibE{ r6x]<$p!ݓlV$ԩe?ZBbxԖ pgV sCg-Qxq!T gA9v\V"ů‡,QZ$L@cP/Z:*5yyuGNB ڰusSvb@/mi(lgލmQlpD\DLlmr 5m.Y+G\<T "Vq<=xli$~;/  A?~_)xfi|}ˁsED+ENiP6j?vZUGLƠ"Ps~ (Iibs0ZyᎶAo/ a"Yk!!qx\HZw){NGP+ @Q7#QvA 4*Tma[|W~tX!Ӥ=+x怤@ c5jfc'9!rÙ;i!GM倘{Z8!c J'IVi>Yv 66'{'MI`qFL]@p!EJְ1 )˪Sui՞zSo2[?ׅ adtxRX?94DrG0 `Q@O!dI6G-jZESp%h@s;Q /xDׅ%t4ܖH/k6$[2Iqnrp%3Rnt!>zg6@ u353a$Ҕ@(a)TNNW踎1Q ƢSX[ F 2? ࡂcl6(m2E\lj0P@hsSr[!Hrg'XL̊xK.JFN/xs0"asN!5o7*c6hʺmK!Ȑn#@;ߐm8`HE\18~'d/2QLDaQ鍗=~g_,gJ(Fbem cS?6;fkز/W.¸fZqS /\y|J{b)k0Eo/x&꺷P(;1W]Y$l&޿5;ő=fg\momUWz+b]bqm~>8B"(%V{j@>b`c*'ˁH|l]Y̙+UG]Սnu6v;zu|jqW_}uN-MM?Gl8?^Uilq-YDk` Yt@<$1NQ=h$3Tpu┥0MV:D`W_m LR{Zs~pU:ksAywtyrC0%acA Q5Sl|"(nV' P)CFWjDQ`=tn=#ݧV8v?wOh˞78]ڸ}}\؉czmsx'Obj`ͲI!(=aE*J# m?k.+j8>&YqߟV7,hS>qEV`v_R/>6^s~GM0pu ŀbifM],I&DHGNqל?]L]'٦8?ܗdLEYi ǹIS^|׺7;?_},swȨJT`v.)O,vNѝ86[Z ;vjŖ>a۱͵9to1Ri#$*5h=ܫk~DU7ޤ]Ej5rϟ?ړO}7Лg:2D[L˞SjOՅX]w!L^1RIkdxAdLMsSX.Y%Le7(~j<4 "r~"}+K_`s+_׵8??=-)~G{Syx{wcc;(zsoꗟg~6{ΰ|NXȫ@}D8T!H4t?ck?:7w7)-(c[Htaief UҼrX߃ѥÝLut1XO=_(-N']k͇Kh&#gZ(@j<`(#V9y2 m9M%&NvZwo^_/G^u~ua䚲FjZ7kYE(S̜>[Yڿ}v v: 'Vz3#S|T9&1/l+ԱT,KuŠpLR WI¶Q_R'Ur$o˳./~*}׉N,=}ʺZjRт/iFt{{N8w2EvOMn.\)N.Bä$19g\R)Ӿ\ݧwuaKgkWpjB q|1fBj>^{꘳ ͂ Jf\-BENlH :R GcNT2w|`n/zgFcTߤ0RR&'a!4s@ITJJ#&Hy_6BZ#f ,e XA}5}|nΥj*^xT-.̜YU4[EC5MBɜ^33PϪ^X|/ݙg;TF;_yZ_*^޾E)E4_rYKڀ`# ΎX &J1ΰZ`@kx2"% jso SsssǕGv'Uu퍢 sye_ ww7OntOt'wog9_;rps~_z^)X. 75q̢1KAK"Td`s 0>HઘhDzm52L)A(:v^\.pƗ2pҿq/4oN5N,S8ipla0UO> ]E[_~&9{˫{í ~ߦ.'T77%tPC=AR9< u\j "{U,” t: Du5Fk_+Pk& *,:ʉ=`cW/.NPb2ݥ0%w{dWvU/cXZDRxiRrRƴZLͫܦET{I ԓ(5Ii/N"ӊzyBd3Q)ag7~fg'^k}pІ/^~“l9wc{;'5 ?:U蕝ݓnݷŕ`*51v!j!␴&@_! Q>p/g'@L)S! cJj"[ ;{ގf&Vݚ j\}+yi[vZqMV\SkX}P~959b`Ѻϟyy 3Ģ_o_%`g@ԣR)׀O J.G]I !qwVXfa;VMA++~PG,E>9X;:{G>ph;+8}lw8Uggaa֌F0vF|-+~ՙw~Y.[ꑡw %:Fy!92"b[IU3YE%y&5ѯoq8 ^U}pY=JkzzF޺3;߃#.v0ںz]ɘ Z]YMЕ:P#Dga83s;t-38PvizUwCj_x4Dy ;_>5C֍G"ڝS:BE+?封?]y~M=w3JR`fnن 4Ãխ~O6uɄLw[wW^{#NyoWw47f(A"d"nMe_2Xlki L还yYڴSɡεr]a㝑iݺ4售uC3wv6֣C6ļ`oM(PMFfom~o\'V]^WeSJ;)JU j0  ARRKE\_ vZc;2YӍ WZ:%ζBC Xv=#{j\Ղ[W hVۄ?R`^mzhwou^SMP6'dZت=P7OY^!yq aot'H@sA-1EW)|FMD'JIPپUnj7D}.4ҹooý\)C4kw{e&&W)/A+ ăQCaRb\1Ҋ QZ 4PZGҹߝeO|͹# 76jgO#!nX[h.C/- ޶ pW0!k6,4"*hdy%5ƙ^ #>[wmQ㤇ViʫXS׵MӌCw;:LX^F8Ο\,ݾE ؎j2t]dD+L(yŁ4jT@O˅D`B`ipBOJD9G%O`qn_ڝ3h {O6 ?CmzǗ`wY"TJ~;ܫgƲdss7_檅4:5=nn&Zɀdue*Qߛnyz.[/I%*P'!O~"8#ޛP|CgWW/=r:9̱չNJʔ]5: }KoίJ.mv.^TgG8~}6DS>X@MQ#_ZtZb٘qfK(X\ͽf{[/.!=wt&^: _pIXu%|d~2q\/cnu?Nm#do ؟~gn517FeL1zv$2"El $nU IB0Q-KF6]q, Qen?PW;>NΎ;XSs[̯.<]ת[V''o}G`kbuǛvN)@PHHzĘ@ 5>; @&h$:on)ΞVCYڿ>8sn93?{}u^S̓Uá]wyQ}jR`o޺-l#VdM5hH)s>wgmUeqj8ڵ@5&uW vpZ }NTWnV*TG?|RSDInL!:@#>5$Y32nhj7/T}w:1o{w^\\Xl[݃.[_]![&bO,*W*&`^`7. h/tu'>2`xNnG&XKX4̡$ސY*5V+kMc֩[4uJFfj =4 ;]WՕKA-.{_N,;YUB%P!ÛwcG,ٸxogQ~IG8E ݼS AX2"DCcCȭJE))N_Sz#,(=nbN :&&'X]-/{Vo0TnBѕS 80հ{Xhڙ޼3琙o/=G0y._ >P՘ΜN$zhК/&"!<Rx5֠nl׺*5L0&sfE+Nbr~|Fo0AA0pg4y|\Bz Ñu/m/[?v򪪪k]HJ륵j]lI)J1L&I(*f^P$M%ɓT %NFv+<2+V?_}QE {;b箺~eSv{ ǓШ-`7Z~B~EC]^f%֍;~DxEt Csͫ1RP3'ZUo|M_GVor/\\PVhdwHo)kQ SmlV_}ARk?-΃P "<[`r}i((b9Ez|dyYɡb҄Yuv6RJs We^Zh~Oke`'6DAePRG3&j`{~}u;/@d8quKu#˰B>Tbz&ef]]\_J[kZ}`GX=2rpƎ3;f$|LK*փi"VnV_iBթX ؠ,rhslu@I`b$z؄ƶ=|Dވ~s03NY l<~_2n];;26 )6WZ|^] Ne!t ;!6ьjRT4)$/a,SHBDA}#۪"9[Gm\BRow*UEM(=T]~lO8 'XH\bG)?kt]vj0X8TM+s^uVuvleĀx95=[ՀGM|JGSU|B ^5hCZtI)sCݹiVq KQȺN 2׫wQVtQ7f0F3jFuF} E"w eyH+TYaP)ITMk6NfTRJ=X7eYe[Uh&3.nml^!KJe!Zd%J~Lm 1׈`()xnD)]␋>H$@O:3y;ZiҲ_dL^RL⯬,}dǦY$kњ s$oBN&e"1ᐪfm,b ݸjlEbpJ m{QB`Zjw4 +V,$dJ0 S> W^%٘' > ۂI`g' xq z!&SQ cj2G|:ЦC1JA T;IoQ>2Qh0{HXD U<! BCH{\&%+d<`f/,Pha% Y )[g핽h|%·r_TZP&!IjV~|W$ UK" V:u,`B4h7Lmu˪ƔdK1+ 0P Gc7qq5%ג(S0:tc^{_n\zS*L`؄7k^8-J.}ZȂ(I9a",PҚ7:$Iڹ ' yh`t_@%kcO%4fڝ{UXQ 'k#6xǴ #$'l3&w7t$yB[_`A83ÍYKiɏgH{ҐDžE~֏4tT*]d wS+2&g _dB,IǛtTy{0ZegJnqz^73͍W ,tU4Yfɡ{f9[oʱe*,-!5ĵ1cR=ĬYcDVtlbI s`=r"Z[ LPrm4)&w#Q{e;_@[JmF܄<*loBd .10vԁ`ſ4!4RԂEA=4|r ૭U9IшEqX*ۢ=jܟ]d21Ͱx l,Mú*G) k  J AG/ %0r'Óf7{߅wI(# M1x47|3_q7z1%j/-ztY:dTZZ, hϤJw6!/3cvr T$%-koؖN׭%9a :2fAET8+Nם~I+5#o!kf jjiǧR+`!C싅ЈR `y(s=π98{+=&~cj7{]xOk\0^АPT|[iY}roLY[Z)իCZ| X u~ p%#+ |}ι*+w^`9J`!&Nj1 .Ta)/ vJwK}k|w0u~rgPJ0h0r=r:Ι9؋NhMdwhU,_8zj :>x2QU%Nu)kDMP1UeFV6/Az.#&WGHM}!+VI紹edo,F qu5 !mZJ?S^:Sz8^?Y>> x@=qF}ˉP·#!K%~qngw0@Nu-Bv`lW䝛/W)8Zh4!QS*QG0 otI YU3|wiaevz aX*m ~c41uo=SD&@UM%@R_AA ys/[(<{aղP=xDY&ߴ`Ĵ ƅw/dE5D^T>A$q[L,#F>F2`2 U-%4vƮu J$ِ}(cG֘ C[ 0 F|f}8 580>M+htVzޫBEOhc-Iv"yC̋"JZ[rupOf8I! 0⢰/`蒔$sٮ҆w#ByڐaOvLc6bW f(ǓՃ4Ã+;މ{k; [,yP/'N_~Bg0$($-eui[Ύֱ~248o=eaqtNa#VR8"=S裉 b_ v 8y4H0<bZbJމqR D`OrTEYxT<>*ƕ!Ѯڠ\0[Q`E_ճ A\ ͣKuuC;T)'C: P_UŒTCLG-kL"v )hjJeQR4 Rp J*;Q1AjH;yېVR-dQe>ZA#PQA-FXV,JҨRUՙ@-_fLg qV+ "4CqHb鐀,^D2PbC$nᤪ&O@},Kг-ؐٞa}}Aɗ~O=N&5d5+mY*4b} !4r9Ʀ!u1mA-*oљgōc}`6P3.q1{hM;#3ɎZ|YUqa:j=y8S 5=@P? (3#7dvT 2IwPm ''}%Ԑ>d4r$r^Rth̛x8xٚ;P.xo}K|vM#M!8o$GeD TKAiQd)@Pq+*xd~ DAmcѭMCN%Hͺ^DoPq8*@[W_\jk )|*ߋۺ"R]tbjfX_ŐA$T}K)4UCEo o S"Cahˀگ^ a]V9!pz -Fe\ў_~pDi,™Hڝٮ3I6TEU |SNs)nT~HeЅIceMy%Sk#DR:q` Q8#;F bVMw0H΁2rK-&BdcJkWE-|!sm@c "L m`9HuSe J@UϋmLDDaZTPG4 hXZ(i*awJe[HZ4Hj`2+t]PU+g ~q|)b5]"[ G#UեO ߑ4¸r~|$((gԸNe41RL\a !XIC1"TIP9D=cdxubFi4t(0J+BK~+v|j` __+ܑ3" B&Y&2A+]&8٘#OtHT" Hq vjZg8S |Ȃ6JN&"xd 8P,!k,|1OCldC-K֡ !.fcr<z$@vD*a9VW8qw /p9C{EСC':tCtС:tСCN:t @:СC':tCtС:tСCN:t @:СC':tCtС:tСCN:t @:СC':tCt/ ͭ] !+6M)jLI3WoZ\:FƘ)c)㗙+c͕̕qk L1T?kd󞓒,fMNX4%b;CSS-2Z홞nqA- <T25UX(.]O׾wԔ^`Ds;(f,,hJ&?8N:PE`\Nx1la*/K _) ny=7&;t LYUDhqWi7F `N:fGޟXZf寈zz+Ԓ߀#':m"1K\asi\Sgr'iN:b'9*|solu @' +@'xDjo(?8i+[`Au @'Z+˷F,\()i ?rbyIIMh~px $xV't 7+6LJa3(,tP3dW=҃u T R2:\+Ui* ~5SP<~W\mF6H\~ٴg BgS ۬m&\zq1!Iu' fx4u G'< N]Gs'{*t>sc %a};c2m6H28BiPTe2*]Hd'=LJ%X H |XRDxn@z^U Wdʧ#Y_'t˾oL[!A2T 7n].mWO_~"r`XdaR\ p^!!Gu*{"ʼng)0jF(P|q_';@+0MSJVl0p Ԫ XOrx |e"`ZFD6pڈW? 7Q:).t Qx^;a'Ai|(wYMV3X,7>HS2LS35iFVCj!ϿBkbK[DBj1Ljh ",DjR7 =(C*:TyKq\bbeq'N6@X q5"2L#ϙj0Wa)9Mڠx`"|: )ryoVAcלd+bfv!R"mxk ֚+X ޹T_%ɜU`Sd(%D6ڸp8HqP wIim6P ʜ mO׎w]6|_W w>.^II1(QYG pjTl*([olAVW`< ~J{:#9|ܷCKvȉ}\啾.k=Ghc(e! vZL 6^T3^]nZҴG}Rt]xG"``2؀SΓpcW;roMQ;QKtݲsPΑS@NPc0C[' 26~1(!\w]c?T?+e_X$aQ;~JCßs3U򻶛ԩ?\5N1S@V9ZgE"%/E5`&5du _n*-D9W?|bi[pҿ+_j>?%P`5d- ϊ&q_ ijRmw$Z!nxD#hhG? 2偭2LM ƽ\. 0`2>!874*5OrIo|L}vt@^c v H.Ze?5rF8KOѫA'qju#>!}y M| BD?}W 0zx"&g mu-g,>w $Mvv?ӴirQ oh[-,= bNݲeROޖvI 7%؀x_ɀ ")Bc􂀠E8ﰠ1qLVIx4G>bp;z}n23AƂU& e?Sg/v*M;0)EM  3f|/:m7dkȰF+:@[O (ںm>EGs3kO6.NTlӮfjun>aZ.v1)9#]}b ]kZ Ū*fnQ@K 6S-wLXDJHݎ}.G*` #}7߁A&"zxL45IMXLm2YR .N˴ B`?)l&T, HVI& r5a IC kƄ\*VTZ)^]*JQ,VGM5uk6`򷚼. tef9Μ,R2;$w߾e4u7 `eOµ`om@fs![ܣ6h5p݆][O\f4nY)f+߁YԲRzZM܋/RyRLs%j'޴]t߈SgbPOa 7 *)\y9f=8m=a;׼$(me>@ gFsn^]7V #@Ym!/|fbJK јq`A(mw4ys/+%ezHg^{jm%eHY *ާj06MA ,Ar# T K[N|< 10Xl6c RO-&ݖ?wa5[d2ʲjcda'? ӃDUf#V|@;f-98Ht/*!~i'ӿ6k9+v xʯ{3۠ӞSy/I*Ggj|US1l9K[1 ԥKjܸq0˯қuu*AHN#4Ԝ(|2=@M%qLloZ>&2m ӧ+0뷂g/uP &4WOvk! ~S)++GSp], 0}Cc6_~_.)O'0+=?tNx ᆪ~L0W^WiIo7FSHYLTwR^o@) AyNl>C[,CP.8SA $s69j \ ?H:vlM!`%,_E e\CֽN*o0rGӑ#G봯s%\ս@O뿕ً:(3Plv4vh_X+7/+ ?-|73Ӿ W.Xޫ.늰nؿ]}no$ҥK/SV^(8>˯ѫmMGwRP EQ>]rX^nGx7 KNQ~L~~)aS+@Jŧ}6fr &~A WuӶcfm%[.=sQ~ ^^7yZ=ߑʂzw ^{8]f 1m!pz6`T C6a) sCO:+v3Y'Ck4H^!"yul;8cͻW '/IY.Lr?3mm8tHHх 8KoP` 9},y5GQEL~]vkc"`~Ff|*B:ڌ[XX}ߩ^zbTJmH{j_C}6:˧PN0pCP@4_D`ou_Rfmw5P\~Pޓ22;E+(Jg݇|ZpEXԯ:Z5-W4{?PO|~SOe `F_ps3 &ca.;zetl]bըQCN+cyXC,^H5Av #tRK7<)+./5ȵ%Tz6uqY߳2륦!ݻDQKb˲wbYd|9":{1v|^؃S->_j:Z|.gxO%Z} >~t{~FU,@DʼnǭII,Np|VȿVǏS֭D"JO>$S۶m]+3j߼.5j۝z@vQyD4t<3i{PnBV@JxmF6]i2!0lXV IyXU*d (v_x~2TkEXЎ#qqiR:vctJ\̓')4l,: sΚ+|j4]5 ]vyt[9mLsHxDxnY=lp4_Sb>=gH6ۧN)cpooܼ &ml]lWԻ,8h>b6?y@w.yc~Fwu9C){.98ib觟~Zj=gKaQ~E읟l,IöB)=zH2s0 "WW^j*݂ŭ=%ٍ6^x zXA7<C!c,kG!Md Pn7(@DYFBVc?daln,㉉})ry\V8 4ųjP:uf͚bs+sER}3 1JU~ @!~2;JK$m39?1/Q3r7x8Wr,PSs*Z9۴wfq9[#_$w1Yd$J-? XN V. x꽎F&X/Vx~䯟}YN +=Ҳj,~kuJ_`|Al;+,⾀Yz ` qJPFqXV uaZ R vQtDX_Cv)#tmVkpRDF̲;ddqcmm;Md+ť ^ ?&$ED  s`{_*~o5"iD M?6j4|':v9U2.]L9p<:Yu9*]Pf!{{Y(\Z1w[ܶiAR^9uY]+ `5 n@\=eGmT c(m`^@[ Q Ol?3/o_-i I?n @Md-vk@.]T|O'ÌWKm[/˚4A_,+j,8x/.ʕa8ל_yj0P9}:M>&fYN^*F|+mE]r9N tvcc7ל8㯈Vr:-ENˍƮK?9o8'mqar4=Y]An9oD nT5+NH ++ ޫթ~}ـ@urhhWHX;I%#Ql߉RgIU Lz9pZ%>[jEObg7"h\Unr'Ea"|Wki.2 ;,Y:ڔ(7r_Wf`w/ U-?Q h qeI}j,`ݾrN_^ݷ!W}r:ߓ kJBo<܉v|-IJM<nY: 1_a7kMـq8&r0?X҂ twTzAZiilZ?7OqgYJ6k[eb0 @Nypqx{ &1V ")46v/'Rqt)(v_`~x^=;_QF08x j~ 8s4(`[+00@/G*h: *g S jo҈owhDZRaTpozy<8+,w ?yw޲ Tn=H9/}W;t"y"2Dz#gWdqO^V;׮ .,Μ"?չn=+@[a1 A]M' 9_OK}mL<F3wE)0zp4wd? &rU(@9@:"x& VKu7]  X8xMuH=Jv׶][zEzӾEStP A!RiϦ]niqxKۙ ~ ?wdo*iY{1̆XFnI&) I@"Ee3]d62̲yxsq+t!v@j[TJJEn¤̾ꐐ-ҺTSeKl'$؉RJ)ӑ띶5 ;eTw^TH! r7;{V1 pPQHui'l5/zhLj+h8}Z%Osեﱆ#/FRi{Ś7yw3qo[? ?\nw._No /̜q.:>S.:U݀${cb5`$E5Vk E|MdXe. Y77 t/{q%AA#+3#Ÿ5S? /9'+pbJ)p̚^S#pƋGͩ:IJrPGI=+,\t1 t@-[-wNb l]g d깷׿@y_D-:3i/L)ItIw 8Y/VL]r*)AU e 8@Z=qωzdmǸd0m#pT*Ob5epM:O*{zVEd|ᒓ}M6Eb\pO^hǎj'K}wN*dW @C o6LCwJ@ƞds_SHZ_T"%;u?՞ujj6^S(bG;KQ+s8$~J(?J~ϧ 曔~K fEZƬN>yJC]J+{Bi&,eeeXYh1Kt jbO%2V3$: X9uqa 2zע`cNv(W%"juHS)S- ܁_?O.:Os(~o.k@LQRjN>(AQv\rjO{e+>M-fL>9NFRjJ,J*F0eټ@](,WQ4U cΥH?e0##Pwvߒʯ7+B/k3wyCcҥjn4($F]s^u6*NY0pVh7kDw MfUJ Ve&-O >v>f;}F#&mZ#P5PPџm`gaG]m$~AxeC"M$ظ;N\WT(?IHF!Mz,sڊLl%,Ӝu55Ҧ SXH Jʾ S˱`P@d^(cM ]CQh즪FN]i&%R>Nȧ~ tg(xaj6"_\V8Yq?0AmQŅJeE"o.4=|A-%#CQQ9=V 2Ųtܰ@gȢu.68 Xwhdp)3Kz&`;b%D/ Uoo[o&n5 D`&4)(iva*SU/7,'SU#QҼZԽ`#E,ʓ]mu @@ e\ ~TJJ 1qS= LI!䰩=Ym~W6Pe72ƴ̠5?=׊2 6BRS4 )}sU`J}(խJ>YSr#sCΓ;jM]k8ҟXgY9.JMɹwEeSzޕ@5*]s/{0+R'>11F! @"~Ŧ cRu `/ xhex &g ( Z?CN;eo(@mW~jo}!sWs;@髋D/3k0rmKNє`Di70 ,&[n܀"`ElaZ֕ⶸ3׏ ڰ~&d֬XBbGa(#.N~>\Xx WËmY3X<܆#,_;@٨8Ղ.?s%(hTUeZ*֥RJnJR&:Oaӑ}H7P 0gq٩((y9aAuOӫ! Zf%v'nQ(xo)5]d'zyy$'IMQuhM v :ݩw1^ \< %V¼y3ݚPtxi@-o,US|b\U{39vن>4J3:k̤&<+؟jFR T@ܔ~2 Δ"=)K5,6C~~9CP40T5KPl`Z& i¯q Դ@Ss9>QHوlflڳ,.E;5n'I/pzja_6&0lw4=U~>ɹDw UIƛɩE:6m* n@}B!^ҚczP `spivHk[l ϑ^&˯P 2ʤ%2E׭, -ξV}acg?v¿"U䟥Յsuफ़l.oXs7_m.~P&j"7V"G(hg%ZѰ64<?xF?IFG yO3kHVӢ'wi*#yɑoϸo< hECCҨ'iXh;OmhH(C``7b'\Lh]qZPMuJG\\uGDH87YϑE x=۟X 5I&^ \Xӣ_ +3~W/pwnSaC,7sΜ>]ݻ%{M9n=dq{==y}晢(G5G#S&2sXX;qsŰ |O. 3Ӎ,M1(hP Y:–I̒͠qx,MtZ]v&$$d(% 릒BieRJKɈyDhu|ZXHkSb .XBK)3mm\FӌnA[V6Ɩ 1U&e{ߕ<,'9͹YLK;ev4͍BKɵ XJCZf7/}h|0v׆x/˱nݓx8zWx_Cg; "$&(*ˬN7Q|*3;+~_S(~@yC6mެ_QXq9Fq N2eSchZ$¦~?,:9jӌ>P&;~J.Sŧc%ʤpv~V +b)s2qM*EW%GҪHZNia@(>5& R7%J.?!Do$j0aHr::}x$uU+{]nh&7%'P:V2[:O_Fr=ScezQ(8e0Ag o͐0p+%$8/2Ek翶WھU3k2Ȳ2ɲ2ʲz7å1{5/cy8.nVyJ5Eyݚ۽vo?@}Zko6RFؾ4Q2+9aV ͨcszCAFvV׺6/GSh]"QFB%J@sʀwp3[1PH2W%S|?$GVQ\QQOAVV_I0Si| )ص(׍{#o62D~ciĔ }Эչ!:\lV!+,؊l5K8lԛ)?acك ,dddeYeeefY9Tt{sWwnفo) >P||ǣ#oiJ(ԇuq: z3ERqm=Fp^N_kBxڄW9AJ2ԽN#11+E>9Dz"|469y2Cbŋg\GW?W[ձTE,q/R+-+#&1#W\G1??.([ȈlYoG,.8 ) q 4fGV!M~CF&ezh1qEsb]YX֊geYeeefY=~gս{9˔wӒQjL\P2*1\'P.+>:) ukSjSjԭH! )":iDj,VD<)ǥd tl8*i=N>V*;Z"Z`IP@WT;"}璓ʌ+θ}P){VA\0v0F W"b:A(mX!3tZJ҇rrPV2#Xpˆ pc6,Z^'SX_:QwSe+ ޸>+yzid稒"{ xd… > $h'fWC{:[VZRk?SAӧj]e{"sr䰃bp?*,.0˲UNceҚ&6er*s@L̔魔JwKWL0)Ow;/4'kRGkՔfU=zP34)2i\cQn4n-|ŐwKhΩrulO[$S~j Ҟ=hx 0>Ttptƶ2c.c% 6#]EG5*'Ơj .k/cݲe^9Ʉ4G*cKy d7GS5Wm]%D?J3ĉmt~:r$k+۷.v@[& 4 K: 04+&z7G>L]75L"+ژ0Ltםmo3xeZ;Ȝdy"v0>i=dM}aei,CêZ(iʜC픉s  ¸|~lJO/oY-<5nu^k-$+77[A4 eRLi4D7oO/Л=zOI"ʆ9sbx,#\dk 'Ed6y Mon˖ NɎ \k)sCNr/y_>+$` }؅⵵e}ukhФO}6O455$ը*|:>>4Y&YojL͵_+OrGPPIc_?] Qt $ yQTz6D܇WYJsUVl̈́Se HlsBFTU |֌խ@]p“a_ݚQaBSTK<LN1'׃9F.[_"WhfZAUMfǂOщd5Ef"/MI?̋cArys  +q2zh\㣱j3 *\;^IP.VjS j)S!<諒p `E rsXN`ߟc"5kr}"# ^//2%ȸ,U;/#e/9F:m$Dqa!ih8 Zef@sT,YĤ=U|3AEuIYk2l:WexuM1\`>ūM6Տcֳ{wC##53|C҄:JcM~dМ@ј'CsGd4yK$ 'rs[{Aao'\^Y@! ".dӘb |/gُwŷ7βū)lY*g| !L~h  +KS.\PPD/JCgPM `I&| f]- k"~.$ݙ2Lq+W`ܻw6"+oBQ j(}{^p иT@/9fcK&",#{?Ѓjrʔ\uY Ä`QQ8e b]4lڏ[ޔ=A`*7/<0|^=ߨaV ;4&:H EAKasɅwvμX\RV$ [cXC۷ϓ+6-GG,e,\N @<  *ʒƎ7,7PRAYuW~lϛ%ԂkHK es٤؈J{SQk:a^(ܛ"o|K(y$TVcJ{>(XVT*[d`]8Kh*kD:Zؔ3Mmy _6#1{gpsw~Z=\o6$G_Y @ ''ݜƉ&8]%2} b!i`9(fm;=+\ec`}ʟ\.aLh¾AWv/3++i>#j*k(K 6޺pj,  {!oǎ?f#B9$),.c[&T1Eۨt .7&_0M]v)XH`N_9[7Zspc&$ۮ&V|$ @(E%Q>gm޾.SRrYN(&-[\nk >ƊXƧ& <5 N׮$ܹShFNܘ~+7b$5ؙh?}濺 ancFg)#Wu9yr92 ൺJ!h-aIJټ3iފ HHEU<_Bs ʗOR}( 'N+51"mq( /ȆᐹQ]&\,siXRDsӌɽ濩jL5V .*"*]A {7s j3ReMyg 2J9Y-DS޷ܵFHTU)|$?]楩qCnǎQ]@&5^ٖHs̅QDA˩s\6@2+*CYK:l> F=^ˠԉ;<ߐpDvu6%@`o뛠>FG_7I7 ]ݪK#on-Ԟ_\VO_g@j *uu;n*죩z?sG+"'*ЍgE?Cט,7APE!!lH! ~ K ;Z M]P=D \E{Z|#\WdfPCl'Fx\&0))HXzQQ?ɢ=ߗu%{Nm!̺oS7qb~fU}e5{, ?#hzڽVBdT4!C &I pH1gK7$]~Rtx#VR ! uj.'*3aѩӫ3ہt qĂT,0|=aORL.ĠO'٩7}QJ+u`\.%f ׮o6^BkjE7 @@OMT|U{VЅЉûfNpa: ^ [_ 9~ 6>%QV=cǪKWTo4W 萐cuze%Xpuw|5#n"{o #m=>_ʋW%!¯^Y-7uw峭[ Et}O=|%wΝP!p( 屯XI<[F;23wLS^]i5.}F-]^QQF?toʪ}w7rkN&)ON@Wտ3/O`P'6}Ǎi%}d$pB 8K'{ EO739g&b|[N\0#>>~s"cѿ#^OԔM+ռsQb&!9vR= $T$_M&`y#TK%ԭP;6,.iG/m6x5#}&^krv.ɶk&*=_Q[O_k=c_7*^Hg# Œob4rN'~`V). 9l$^@oBȫW*_nةLqU6)Fw/Q5={B8810z4dĉՅ ˌdv-8_θ*ڶ*KѓrI\ttS5.-\PI-If}}0NH| ({_~Gk 1K>plT"q9]vOĵIj郧pJ_Qېw0-rQ~; 9oG>}ϙc5s u: CD7?%*BzIfWCSelѶ׺1a(3qn!vMyϏ#1a'MS{z<82ZmݻOm-? i`-Swic(:䲚4{(J|_ (F'Mˤry7o|/l|1@q̎󒇢Q0ZPɑ)T4B/CB!}[)/s8#α|#HTkpB%m)O S>#=jz)Y3 DSg /Bl'Z~\ }U@E%#rl0 ɩ'cTG<~q'm(@|\OMYIB?= {]2qJ;ZSK?oV}  & tٱo nGՎ3 @,r2g/#}NV.S|*4m=Bgk!) ٰ,-hXDZ`=?׾zozm:~E(w!tI RܧZ,Rz 'eI _>L(鄡N M }i葩?ĸ[|fG (!96Bck eiGԈ(nj1[1&F\yIsQy@YId AkVVc({ LݳZ_V5 t :[%SG6zmZڀ=Z ^7E4jjUjh+ +WbO}a`>|fVey!4$촎RPUƈuNBv ք'QRQkw;݀vq@u0n$@'$ON9c@\~.驫U8hcX?o12gnX؇t&4iYjA41usR da2F?ko,ӷlyCY崏+hӼkݧL}V"&k\BZ\蓁Z0w }Z2HgJhYF{v Zز = NvL"ƥURܐU_Q"ǎp58ܒYqj랽6ho谑3k?xL>fƎs$ܪE xRJQ:'7 ܘo=T[F󽿰'xUӴZOj>Qf1~bZF.?1vnZ4bZy4_gbZy_BR4H.SCJ}O41F rD\"cSg.!>wNHB f|*݄F^`U6Wx['cX%*PF/WCGn djй=C2]UGIQ_*T)yU/NbZFa|Si5Gp?W\ ?.9lyoM{?%50p6ZbZESzk1;L 2H0n:u\kdI s#/8y Y4uq3jLV&-Nߊ՘i8(~a$tEch)D:,uwJZOu:BnjӨX&7 LxM*kRJY Cц8lIңGm56t$AYM F EH;{=o8|fIBoNܸChiGOɟ z"٨$$}'>&U<9:|7|o\/rZ1ss*j@Q? @Yo >X\{@ו@Q&8A&7B#$9Th$~ČΔ荸XvH )_EBGԨ o6fS0?DS@ґUk#'hQqkɯk-ޫYIeӼJ=X\cGg`/>THX!W]s*P{EygM=ElE G,`2@wZ'm@3 ۾GTıC7XS/ڶI9y@.`I㟘T{&  b&|5imyhm*r"Vz7i G\n*]K\j7,UV?r՚FbOh$EzZ s|:k5qj6t]kP7~+/]Zٖg]uzKf6E( w 5$Y o`ڸs_Rz{y8٣UcRofbp!g &LRcw 2W;2UmCCibN^(,̈́Ta[#ⶣ4jpZ7nM0*qX/UJ51S^ɭ*t掠[^ B I 5U_/JGN $"&B9~ef1h?H@ fx{=z';v!A\<)ZCrKI衻=RyX Lq1jg j9AІ@@LT$w14AY_=%'t:<]+wU^oPAk7ĸp%-W<=td7@FIm.b};.~RKIܟalW$ G%AM@G`'6Oʉǁ"%fg Cw59r}rR*J{eTkϚ1?IRawwx1X(5,n2vjR_,Kn>UI)"UnE0lyJi7{lE 4@'oA/@+t?@by%/ؠ}w/FteDJ 9 bpi-`ظ9)TjP4Rw-yz1tg4!Ȋ24_ϲF\Fwضl%]x5R)_[vOoNv_ uU}[z0zSYNf!<7& /z U77xѵ߃ŷ1ˆ#4*"@AHA=#曮/7_߃V֘ɐ* \ĝ%>/gf 퓘D|YRMuS'9&Ō&.{dM@0M `嫑pбEt$~zYoji244Xc ?A`RFwRmitu=7;TP..]:q_A&-"՟r8lō-{`șhڡW' >W'SVM a 9ALJr!\ 0!T(7T%V=vFYn\QsR:i,45@0w u{yvbpȎdΛ,>k9 n:{MF{MT[jk*uq"*Sg rI?c;:W:[tus1mhU6߹jP@c.j>YLfzF ]1+IgޒxqȢ,imAi6WyT/6\CƟ@G\$ W*AR"1UX*/lUKLoe_w"/;[? PR;Dh0mq{pi[ޭa :z4|7͉"6bfOy^{GT9Mk-TYf{]˪f8O R`ʩϿ}$Dj+,W^^ZJ*MkyqL rYEf9 ;xP/`A 7Ņ jx0GwTO V8[)?kPxgʪW'/W^&B9OLfF0Ҷ5FO-O](Y+֫(߳d$䞳 ֓g$s9n? 1c#߫ZwQ4F ]ZEUY]ljgYiE%X ᱬ Q*3} \j\ͣ]%W]0d 2u:JA>WɖsMNs-VƅRߎTD{w#=^񳯣<Տ` 2ƟLӀ՗355f*?peAb3v#H,qMaƣgvb|>4r8 a5Wf%o#]:?˄w3AA\_ C8,v)=7S'MB-xKKhI62I&ERq9y3qM,V]5]0]ӏ#Z Bˆ" 't(tKzV1B7J.(./yAy(?l5˟_CLAՍ $nQ9bŖ٠b%H@NdwjlCͬ;VNlض9 p#/ ytޱ)7x d#`>}>`4vNhYA0H+P+/;‚ O_6/棾OjQⱎvX: wPGyREFI (6! mWppBIZw s56x :`gEZ_ ]"@?r\8^P^ܦq:~6C}ҷej?u? +W ,9@)[[uFl&5 02$CCnvVsaW % >\J^v8)ɧռ ۤ,sn0N}/[}1[`H Y<Cs |*VURmDw̘+&uNsZtoC Mͷ!9A!0d0u(=e+l^L2(W I*C!we֨E[8  F&O$8/v;QxM>G=^)ؚ Kd!hT<γ&yff,+V+& 7ҭ1ӤTcutw_Wr\,._b=%G@o⯮FP?thx[B9"lt\P~ckSa"] s b|'=~4_@> 7so !Gj@>Fl='Xbyw3eZ=}|@e'N߾}Q gŞ2.;Ks\б@$tZI0H#fv0#iB?#,aa%C< G*pj7^KQ-O<71g1Gx1t+yi ? 0JO 3vUU]RպO[rmm']XܙkS~?k~iu@_tCvGf602k* ߑtн ,? JnQycn}M[ĈٷOIx=7;2,sWf9F&?]V?qWp"Ag2Y v䔔cx0vnLzlzW+`΂{r;A?N2[5;9No2uOt5+Y 0s_&:~kaILMtZOgrVKf܈Xvڊ*k귅Edd3DY8L<̼m!(a2@mȥa'-`Aj  ⒐^Z( ̳C2,>*o1|nۡzaIu iL{>~ǨwVj Ot$g 1~}yXiGl? KjNu\FjG=+J8]biC%@Pr4Y)Ibг&}nSg=PjUPz %zfb1w W50;i5acwJI =m62ڠ}ZU\@gf|cyјp 9:Y@YK|D`(gI%>+~<Ggjl#r-8 yX4ە x 8#ǧ @ߖ  !t Q҆p 2?{gx2Zq岔q ;0R^{770nE+RZOKk=j#i}PcALROtStT|GM=Wb k7az;ZHM>v#Guy;L:ٲ0|p{!>_ ! 2]U?N _P7%KDa@cr^ғa6VQ ';I T'Tz˿C xwn~KY {4.4pK2{ʋH_ 1SN4dlɄ |k]?F`䜔5ҘCb,i h,Hۢ?+dFFx,ْdsQD՘CL:_K ^A[oRuS mܛݩ \_N4l ͹ʖl1, '~rr+\N4VVa-ϷO{UA 2XOYP v/.a ^xҵ0Wz,}TEOX|y uNuǨ+VWU6*qir듊3~Gq*vZ3We=^RElsvJ8ωmC<`d6X1@boxanZcJi-Ì2ZIe7~qܣ˭dBՆt@ay&|>C5?]$&Y'\~ _qJ0 ۑG ZHt5|L?8-AS&4c6mG q*n ߩtV}cA'JKYrҏKHZdO/j RҖ7hSZeqy0Zjr+zg:o @4ૡFDĭrȈZΨ,nK3^4~X&k:V$a AJ)} i0SEϕT8:߹+j༎\Vt#̗Kn@o5& Q=h_tʉnPGr4VɲCb|N]:P:hvI?xn"t혉@ڔ@ɿvsg//pW>VJ |v[n-פT3a\.0H<@^S]lg@QslF`K?Z3_y+p@g_wptٵȟq83 ]$8P 0n* PVm:{TtNHOQ>Eɕeq N[>;DpwYT޷RگD DQfRDH$3ٱ ,D\>g+CutTu˾L@fDSK0yYr"t(p3@gtn 匔t9+d-{gk 27 fA#;v3<:?bחq"?EUe%[WI`{gm:-:I)u -fGwi|nClH Iy^kj{c~2c<>AgԹ ՅKԥWdAxo F$,g-t݄/Y䢌2 bsF1b$ C<ȞNn6 1۟œbiZ]6[Y`ڜlU@B0tu2m,B ?acRTTe.Bbccߤ椫>uSrRp Q`".;뮿96!XwwVYQrQ )S)H~[T̹͍G*9ڀebXEGMRZqz.A0脢v5PIY wJshܢ.h"P z}L.RIL=H`a3QLv$] #`,k>.ȲCFƉPߧxEh5KuF#'mw &Rzͳ]2aJ!,qcIBzMM./:’T1:MaeViO]glwAmF~wmTNj=bb=H-6X [: }ƓV6y])A ohj/yQɯ Xu3s9?@~^2!]DC;:,) %BihғnuV$*Y(Qd3v`:v!%K@ʨ)EG+ gJ校I7w1'[)􄹗cg{z5W c90laW6l8Wq*q^-nc^y2<3ijW9?f^?:9CQ66!{PM_QS K`9it3lWndȍNJ&=Xz;yfe330BP%v<59ᰊ\ vp.+9Jx$F:G[novYӰj7 q,PӰ72 7dA9V%~?]:t9Qg 6+4;H)D+`tuȸ$LXTJ=0mȤ]G ziE0,੘KaYx Pfc!Ɯ ~tZNMG򉉦Ɉ'-A|dӌ?#~gшˬ>G G q3D+6! L6q)7Xq<&u@:xx?|OH27|5,׆^׏ dV?W>FgDb||.5`)Ȅyb06~OG^4ޢ+?P;9`I<߫$o\:QMgqV̩kB.?+02la [ϐc0}VR+g߶%^kv6+nt@6!}oVR13ye2\*RPsBy -jEw-Q\U8FGժ<<ƒ? ˯~W_W^ᕷiϿg_~w=ŀo[}6ߵl3yǐءWɝzީ~J>lD2f-Ǣ5Q# &މl<8z 'Yyx#<*:b,y!bDK"SR2 xL!7~o'$i$/A낁_1cxxM~ I$T?p= YkȨE{,\{ھGIDЦ]Zx|c;hiaG0Roo#EY+Ɵ2l= ?  Uh5{*[2/zxƊˏQ6ɪo]7j2X`Ҕ`k([ȅ7E-cdRFqqr[i3@kW4?W aSpan%J)Tle˗]|sՀ=PA5k=TUu^k} d:Ԩ[i35߰ iuxȐ<(R~|l:\|~oPڏuzOWp/{:eʕUlj%K,^_B1ڗ5q݋׎׾PY/j%Si%]K[v[-x1dA$n:'?FZSֳ^g ۗӺV@5#vG B9#@oh#1Ɔg!Lg25K<`|<\ |X=C9YSjd#5;}@&Zk( 0/C = t7!G-mH) `Y"%,>RmGS_˓V1l&k.ַe Xx"}buzz[D6K'7/qގ-jS>ϱ-Mq$>WY8ͱBiC\:c(uO0Ox q\9q:n)z{ײ?a} 7G ƃ͌aN|yܻ`gT4?@##UR /0ј\R9 LmjQ$6~[r {U/~nEԥ(ɱ`G4quiBcިpQw$~dw]{*o jbo& or3b jԱ#nRPx1~T-n = BͦJDa#Ȏp8*. ?DxwoPwyL;BW(^lvzInDsB`x4n+mR>#pC?vulMn}K(itnōN'@0GyQa[s)yoņX `^:X>-k{ ,i&CjU5{5*~N4zr?Ppͧ Oa> U&[)~庂tqQ5#\vmɧQí|WӲl8zFt]Qi2\u"~pMͨΡ9z-sXΰ$\e bt;Tr-RJxV+W" [H& rۆoK~K G`)SH#ȃ=PjFTA7ɧYOlaSU +k\!.g 70,ʦPrj[<7m֟u̜bKv``T^2I40 5x q:ɭ6x6Sڰ>6rAW5mJsBZljutUjnW5t.E#\CJZ@W ,aXYEnA#?z#l3\s-FLaqM&żEDlwcAV0)ƇQو|-tjYGl^6 R+ inYoAS rzeM:Skec7,k9&uЙʆ[Vk}àA4.ldg]q7vfo ]֝O:n"VY';qwIN/+fu-rzf\Z#i_1۷IENDB`PKL\yK3instagram-feed/admin/assets/img/about/icon-none.svgnu[PKL\zr//3instagram-feed/admin/assets/img/about/icon-full.svgnu[PKL\:. % %;instagram-feed/admin/assets/img/about/plugin-charitable.pngnu[PNG  IHDR<q IDATxypus߆}!}!-[dKd[v)VKf*_kj2LEL"ŶlKBzYƶіM)R$ogG$Ax Qݯ{=wn T7;ť\h#T R TQACHJ)'>!*]V ӊ}ji:DR߃b!BCnگy < 3PPja> XE-ݪt Zs2G <'#=Ҳ+=(ΰnÑƭLoE:b RXj:U(#QR@/p^CZ>)똲 'MҖӶGt H/UAg >Hh=Xgo<8^=eY>mkҭ꘵|ЈnJQjA 8V(}E"Z$.9;)-R_Hwbx꧕.ʈv 3X7=~_k?=nO?ظ1,mi1=U? WfֈO(&J $T9;s`~sTٕ-{ӥ\-nD8XWۀ@V$<3Xv)U$^s?y>=1kXHSMܢψJ3AŒ. Bkk#zX [t|wceYB׊QpmLXDQ qse_KȘ2,}bQ%I< §Sޘ1BFUO#sF.~ogXqL߂Nq3-(qi\ R堈~O3޶w9z3cJnK۵'PNk 8nW:Kܗ̰To $bgWOE=vLR9%1,})vd/A Knv2݇6X|c`A_3GԖf7}h5'jLc@?] <E7XCk޿>(B8vSYLU?U5gfeEʦ>PqB y LbyВLŤwf՟J Z"F1`!F-Yf駑h5y<6[afgc\-Bpp[Û &u'a-Ϊh'mߏm{gmA ;{LY ~5y}(r]%H\!?3.f:CfSBV@m! KAÍY8˷ ӹ3/C __ c|gHs>#?au<1| XOHf:, T^?hQl05`{$\Yx7fX2SEDu`b2t(f&/̹ ]!ްߢ}g)!S eS0KG,]kՠ&RP6q U+8K>9t}oƢD|wpO,,G0 *ӾV( ѯڄi3ߔMNfݺߢkBO5ȝrqF]5*/xX@8  %d2:ZAL釅͍ZȄ+q!zSc`A9ͻ~5 RSs]G&R#<4hf뚻YqͿhQ̬뿜MPb3ؾKJq(D0?ys*/کFJR.Ս • 33n 9~PKT»E;8lP?Z[^Эquk:e{Sdx>R? SI4[q ǵfܥGriFR+ spW> Ha: `ԂLQ՟̻-` Pʇ{9WL/H:A~&pS4uYz?gFA3:u/^\q~9fFpKPW//nov-*2: Qp?x;=@wɐTt_%̽ (ͨ%J=j?;?~?~a }y4f'pMF R$yJ0jAnvTƴ.3Hfq,/pҧ,O\t+B_% ̬MA("oWi]4,})L(!jΪ/~ХcE] ?ԕ%Rna嗤Z&))Ej"^Jۅ`*o*dX BHae*phXI*&j _,Y3@.M}gJbX3m-R9DE"f˹ Lՠ̹g86w;`%S#0, ~/a,Lʦ`fl$,f}xn@ڥ"(tpYp>QWӫ*=-FB{N[TLGA#\NiXTLG`n]5p|꧕e,CdDşY@^VAEbuì^`\mh+7ގ蹽@ S=3Ø;Y4(/n%QXGTNDVH4Dz>qWl ԋʸ`mh=cD̀ Fylx{9O4+%ԅ27;S[XCTt4Y%̢C BtK+CMv}s-$\J[q1SgEw} Y5uqR3WY 8s?(8IvĒ2a?v/Dzx`A n~v9 R>Ӱ2/ Ji3ZpUqXh5fAô՚_JbP6@f=`7Ha5~MvamGr;diXEBㄣ2t"#~%c>0u X]x5ڠxa'iX3tx>q9%S0!b囐  Ս8 ίWPK WFLO$۫ڝK*c=#BRg"^d1qe8k,4Tq%E?s>ꑆٸ 9*˖w"RjG8!|F13om2NmwүL⬲ kj 9K0fMHT'(ug` ]ZRejBiwfc )Px80 )-!pjfS K/ŬSQ5 1[E4T+9I>`:u:4.fʲ"T4ޙ- _oQވRf2R$F^kc )vUA^َ.fѽ0[rVA$CBQb"Lo]%;`G`h{vӗ?+$G$TL 5A)f"#B0_*] 4&7{+/)Y$}HT/cϾm}mL˦=h{q*f5.a {L[d(GbiO1RJ8w,,R8&2ԂF΃س{жўAzATz[.u])Y%^A*yC-|#V:KYt_ KFe3u;h4Օzs`"v^ &O) 4MA֖(f =w0\p~l }zE"#͠='ӻ~I{Q5BbogBikpV|>(,( A!=m}q pƽ諛 s?Ŝ A ! qU%2̌ 84,M -uw71:WYYO ,2C8M8~+G0w+Dҳ!D'}{m'`J2q;07!u)n BE p=+))(pиFuՇL=m{+ z"*>Nyy^ؓF$TYLZ&f ԝ}L///9'\O"wP؆ $! ?g~=7K~eh_ĩ]$o3vO4kaל剩-۬yzn XI5ȓ zmd憠Qm:[62⺈TϽ8O:x8&TB5\v^>ňʬ?~6bSDլ mvl 퇝_̰TF^FEh%i{pE7ͅ>f"2ˣ`8 r\*f<~<4ޛ_G^GbX%>*Guhl]JhO\2.4Ht@c)n<6^^~Ɛ)h)tؔMj%mYuGq_n+WMu"hu)Xvx(2H+9ljҕ] u8"pLDvWNρACcWL-Y|:1w`frJ=سo4"W ;7#&lVwyśѠ粝s(A8Y;KX{`; }rJ x(:$į}.ڠW0*H0},Y`y՛,i AI";2@Pl baNxM4=Ag񌧖v5F+°='nDC%f+h0CbWn'$` \%S;Bቘj5{]u#"ٞ!E0T 4(}.ydSV6p z~s!ky|u9}_[H[ 3j]$T.h? %kl-{=_`O*N ~!-/ɩ-R:-*aָw(2q쩝h!a2cCI2yx{8; $ʳuvE0*Jɦ5-< ia"N/o@ ӐHc  sN^'pٚb^ݻ  [F L1*&CM7.$ƭ$|/jRІߊUbT0 lB >I ݛ-f@?>+[^9C?Q DAu&&ȿĪeX9^~'ޢ%}OC.uʰ$iEC;PIJI\-ؤ6 [3"\mN<$ O5.%#^ٕM$ʋkM<(DǪo `Ë`y&Qd([xU,Jnud?Geҙ|3fGJ7 wǓ D:ɸWE@yFLKVM!x:H/ȡWa.y1,-Ýg65L0DFSn[~F|IDATjH+[OƳO(+P6"/#ױĮ)BK/H?޼$,PsL2ѯF2C K "{ŗarZPݎ-)R : &SERjZ`3bA#DGTS·¨*4rtqeTQS:M3W iTPZAUmlHAc*tobpU+ LM 몓s?bX`-Pdop"'P1]GREyɦ܊k(^ "cy=\(3/5C}T"Ԙ_E_M=EW%m$fi$)XMJ񰊞Pn!kQnK6GjF@xZ 3Qok)-R:jD>/ !2b pBПZkeewLJ~[OA]edC^?T/諪[^}mG{1V}C_b}ix(AkFFq<+LIޘ2 DR=YV%pDgʏ~g+/u-:dSYk;F5R "!r xo׫}sƴaA6%mey/>:Aa>Q^7+kt:%3ZƼa DnHzw d6e}d0t.vX.#ԕBt *|nSCq鋉ګqEvn}&!Rp`ڂaEsY_Gbn$7[|Q*ŒϘ( oW}rnYܞ?p7=gT_mvǫbzEW 2O`B9AJ4O ]$ߪn[X}9BjLú}eѤ[eEbtZV"EjE%"Fêt4")TTVU5]~kM8eƋ+ҰD+ S\13QitUURrИ@TG\QewRYC҅YQ[5G " 7 )\lnuϥwqaDeƩ|k+,R&Ɣa5hX" ŦAR*F$3^W/]V&ǣDsh, AIENDB`PKL\E_h(h(/instagram-feed/admin/assets/img/team-avatar.pngnu[PNG  IHDRZPLTE! % %({q1%)O~umxkUNC2) 2B9%&6;+"ÝneM:0o]Zf]}\QR巢w-2-1*&+;2PA=Πýz^SueccX]如kͧr׶ɚVJDخĶAYgJz\`gdz IUSj_lZATu~ULږtOH` o`?&D&Ʒc4Iblmur1{wnpp~`X7TL+ ynI ʋ0Nъi~qy|Yc^㟜}?mh-ut1YTk #H]~3ܿ\UDEAʥ\\I#ؖȧ||usCE51 KM{dQ䭧̙ۢswmkqDFht)A`6ۏYv`io\X8;o4Wh,^;O)}P[hÒvϽ/JoZԏ懅frS3KwtRNS$ܺp`@P_i% IDATxA0AvkpVk#咓E!֋RJ͖eO$v:plmdud@7YǭwR%k89kTM,갮YƏmHYV*QV3gt,K٭k!?j1$8;EVzQw-.EDEDAFa2JjPQvIr4Xކ+>E}N7C?Swgʮ&5wU)؄JoFycYxGRǎ}hp՘dջkj^0ぁu֝m`{j(2`4jw*v:poK4VLraccz{tv5rLNX\Tfi]E15ZvNn|6.K/^$5;eZ\0hEQڂ'`ne.D+>!xrڡՊ%l롸"ׄ]{>df6Pec1I&T]U]`+F >Dt^XU]`]bŢdJǏQ)P]K q3.'*@ Vekjt4-746.2 7ӱXLhj\F} ;ҕ9_rYeI-BM$^xʂRU ,Rkf|6y'׋a(wieq6CjNTN'3@J|w+ 6? ~HQ>(XuLޣb°긄.#ÉV60[EYrBx Sq].vǎ@`ZV˛ynv,Sd36UDD^mxIt@DzFCodyTة9} \}{ wLmxЊQKRVw%ϟ G_ _=2b\װCY K.wH9I:}D }Dkaf X8pDFc@3*b 0Li5 ԅQQl{Hڦf#IR&Iܦby3']( KpEQhp3yԮgμzwf7pT:`J]t*UK dUXb9}.'E V[ί"]<9!09XhհbiXhYǔ !i4x0 zhu~nKFוK 6H|+:pѣd"LJ^Ȩ?t?Dq]ݍD`4tHmJD JkLW0R>ty3Th)T,xW༼=bo|JsQ5jfSm '=yгO( 00x!&` SuJ\GJ xX% \X\*Q;!|.w&g΄q\x̧ب q!3, 8[|>UJ9>P&i.I͆`9W?hi޴|ZbJ.F3q&5tF#=8g0LMGη6fq!|HEf4: _TAc]WH{;6FA@k ׶].A`4 ՎYhYDR׭QZz7XŠ\aGs+/Qs6<`7Q ݓ|ȃ6U'dBz 8ypeQ$(!(hޥ1B3ixc\i#؂mкժ*+> E]C -RB\bקD6јV y1&w0U ~;s79V0 bw[:--8%sO4֌Q"^Z"L_4TL&G10|alllԗ!,#~-Nv X |9eJ! Nrݹ U\ |tI7e#7Rkچ-?[eVj;QQfh 1]8x!CuvCDJGjE$W"3~ꏫ}Lfe(s0Ek޽~r=#)XBW< u=vV/]X{%Eb-^Jn Vدѥ%l~HyRFg&9y0G&+rL$:7_w xPUZ Qkrf,tLįZ:W ܒ?vygg 7py ې /A652ZM&l'$/ d $il,믟(g+II%':EMEF}iY$YvͪbK^ީx;ι/wY9bvJqNU‰g~cߪסVKcq1AZXxfp_>L1˙r2MHsH\8ǒ h4vbAmQ/5ZjM5A$$uz}cc@Ӟ=KPKnutyyNtk5alNwwdCe6tfXܪSg0~sy<\bYgTikk+.7FuXʁMՠU+-71z_r7CX+Y/A$^?؊? dWWqL&ĺ"kkvc֋/X4{huXJAAF/ \AKfQ?Ŗtoj( D`Jz"m')!',( f \5^G&/1-c<[haH%_xᆖLu,q)K"D&K&D2im':V-"B/ADpBe VD솥ۉQvÿJyhI8IYoF9]aF~|t[^m_P3:Q&g%K 0.ѫk牣`k _j:>(S.FkPI_{p_<FJ-bY|Ì`)w$z_ދ JR}~YږsOAudūzyb0 /^oc,|25or iT m;Aöe[$]9JL3dr eR*dr09靛 7jJU2g)֖xmVUmgwHy66 )u>15#8 t+K@7_E|^6D)Ke`q cKC 7dα|E"PҿE\`@ +fTl%9;K]~c 흈fNF%Ђ`*-S)}G.iբ*V]5q^uI 2d* UGdzj+q͈vLV)MD֨t_0CX7.t_B$&3XgWr"/b odžޟ 1|`Nkixz쏦Ţbu#v_> 1 0r%KS'pjf`ه$l` {pO/xK:ǧf{ 9?ETpDJ,ѫHInpL^/5Voe  CnrnKJɕpÒy k&"үF j!|q7r5E΀H" ZHKJg=-l*65o2^ vd>?@G[kTn>02/ 8bR(hչj„ H)Wj܀t {u$XBbJY2Hj*ʺ-yU%6f OM`ݼy-"zAYG/4cH'FEW7uZ,':. bɣXq^1e,o:͗$EIrF ˞]Ձ_H!7e 2Ec ց݃(AG nK-yv'|]yyaaa.PN`i|4;PU~=*&yUTPP#WIgxcK۸J2 l[Z]]~_,I`ֽz&:]Q"p(4?32Jx*tC6=E`:s^\w>z扌Ftيu ǘ+l[Ƃjk5ՈWOi*5gz5T0ը/&8Ώ>6Ļ|TT|͉.'D+T荲Bi`_ww2}s('W`gߓʾ_ɞ{ᬀ)0) 8DD*;5ыj<%7R,| l,rј :O=_h2[C/y,+M@6DQffm0>Pg`~L0sjScCKdcMd{z1@0f`fË޿< _[75%pOL"M&7aԊb_tbG͔đuWBw2;h/0|l Y/+JJ8~6 ×pN.I5R46GRH _3_ 04$Ǻ:+L۫vU"=yדO>}HFXGL*CfP5m~"cpt!iӆMVafUa"+3o0O`W7|΅/#:œ`ťX[H!bI5u9 S/&JiŁI%}Nf@'8\ $ LuPb+B!)Dn&—K̓M_4PBXVS0Ĵy{/ZSG F*C8/]0_LءWܸj|:g-o y}Zz2|M'uFa㏟te<27$ƞecC"'| 5}QH.~-txj:,VUp`x<z_vdi^+3_H4ӷ3VXBr%;x;~KfKRHa,X{o/ٟ(+VQ4& \9ї`H=SXvzD"#̳&T<95Եڼdϰ0|@؁6ee>-1jjHƦ-_.;5Xjjܖ`$֝\5_ͩbUl6aaˍH&=NP%0~TI*6^OBŠ=cQvųk=ħ+HN/[y|+)~_Lb8,јoɢr Ă:-rK*Kit\R|[zl~6:/+jrB_DۃZ; d _`] 6 ds5Hȡ6ͻgnyk?^qnn. ~W2k9t@2N+ Qo]s/BN'zc>ɿ׷"sv_@/H_Bpy(Pف̗|aa{bXY#{Y>]t>f2Y(2]CC^&]3/xi+/62H*Z9K##!rXhyj5 5IWCxqA-ZOv/'㱽~ @_gX B$Z%/KQ->yHʦG&>Z%|xl1XG/H~:lxv!f21/ 6 q&#Ol1zˏl_Q7w mT*85wnz]P[MMU+35rQp7cuteGX o ȢB@IF!D@-*4ԚJ"( KBJΔImbi8q:wι{޽+ua;Ǚ]=J,ۚK(cXɇP|SbAWAnZw.Z+W81tpDv6^ NKEq nzIK}V)  |QKǫRI(\/#F'22 {-<b(&2RScؼUɟQ+rob¯*@܄aO3JV)WlJ9v6oG"7r 3~IT~DdRV7[5'\ mG>1vEdsbsQZ_E(%2`סM!|*|7?kկ3&;;W87מ(I6/ptF#ȳݣON]CI.j?kW:<80<"|KZvWa_O>뎧#L*M㤵zWC ۅ!C/C$VD}TZF1bA&Cי"y݇%xA@Zնm0VxoL64\QIy=-B/omO=ocnkBR4%4$xC' PiU0M7]t3Iܓ3JQ^@7R0ƗKk- x!/4U\9S^B{kdlz4v76V6 ۶-|%91`.UѼM _o]@@Uy 8R_q0 t}wpU61DRPL7adh^)vqU{Rmuu]oײEc/ _}Ɨra;ʨ/ͯJ!'|, 'ÀǺCh';kYmp88J _k{1dL+13q4ldf-qZzi8l^jApj8m"$F7r$v/Puc%Ş|>e';r)ߩ>{_lo2{4`<>G ȏYגz/\ Ίx7- sPUţ)-Ң&'{zzkDԖ؏: ?3Wg_-dA%HwwlBpz ˡ WYD6wԏY>d]k JK,_~& lGs/9S/iƑk-]Ôy7Zٍ|Hɳc nK#=V/edlk^ma( x)_\+׮$u[_K~Jk{i󥕛K}s*V`轣n+W[7z+/VY^/Ko#ޞ}TC/{7/a_v(K:h i|;L} j:Nw2_gЫ x6M>`ܑNћw'&o>Dwܟt7MnuZ~5F| gB % x}k{R|4Z/]_r7%i:6f^PKrG^`ޗ3ɴhɚ&pXaGѹw.zڙJ^lTJh$s1_}266t/L*>vx :&"}`0,zATsjR|,/H!vLՊEv7giMF5))]aeK^tyÇՙ*>ZˎgI^{5 /"JvҪ*GKK)uQhc챟.It2e>Ů^+ed ~>4ZpLL <2~ˈKy.N,~yGHu_Loy:|hzy i >nX^}UjOGDG`_J3uZnٯqb52IF _:q֍7t]biߦrr8+WyOPaO3^ Br+MIĎ-?kO$/a;lc~0bv֞4Vd3ǥt`w8/q^FؕrΎ&SwV%`(Ç935fKŏ/E2R5# ¾1qAV ~j{!Ƕ*`KMgƒ^YY\A9 YR#+ZRJX0yxB$?i~I $r\|O6tL$Fߞ=w:W/`/nk˔2f ( u- ź/`_l׮eꖖ[#%ew::s{iV758Vs$g9T_&5<;~,,7s 8|D}%θC,%A!ĒďpS1Rm9‹ ۱F%4Kn#^.}As[2H:ճzLvCh_z;zγU#2Q *[A:*/Jه x^g |E;N\ןE L?u<_2N..\/إ4u/_~_3u 懻CDJue"w/xYrSq}u^g\QOjG"Yt5=O6iT(D`wJ=ͻB=aOSNYp@4iWe7:,*V\k^z ~%z&I5*|6Z5&R/A0#b_ݔM&ڄ"W." @WtoAtޞA/4_vhޥO9R+ ȊQNpvM9W~GR{A[<u (-,܂ !eWѤ૤EU*._zFQ47_{b h! NzyR`9dR0BrgrrVV2j$㤜,iG6l[̖A-0 fkS2%5\)b/_].-V8"3s_&x45xb3f |٪B*%ZWzuV€zPK"5.[#Ȥbq9B޺//urDy0Iإn_53?چRG>q`u Q%K E ML\˿!vDR$5RѣP ka@2<+Lxko}`JHd9X, }eO Ү|;B]Lф>3VfK % ]r='C/e,>b! \;ݍm૛kz|P86q]ZG5g3T J^0b$$4+ZlFpt%[7kTO 3ܛ ԅC.6Tؼ*`gss?JWKӽäYZeKFFFٖ-((~/6V/1_4~Ն14>0Ьf?SJsVؿzR KSq矄~Z$J|O3&Yߩ c}g(qX*T^H_jF#k=lmWi[Z^^NlEl?/ /4 $#]AAi _Wݺu+WV]jd_f#W1eg|_/S /E/6M1Ƶ@Ki~d\+>%e—2};Wd}Yz/W%=Wo_ׯ\EƝ.+6/Lk+)qy_V \+oSe#y>ѫp|z bH:v28(@+1(H*,;UHn 1CNn$OvA/%U2 s{Xb ֵ%/u>?8s\uɴrDzg/` +|L}YbѨ Ѹ&R쌝w %2c7,f?t܎CCtcNޗKPz`4+ xeǁkz^:@]'OŽOn303Wc4mL:DkzN:18ץ*w/WVW)c;| zqctvKǏdU]}ϝ?M?,x{[vxw~!&ҺύW6[^Vp^W"A #΋R{,+㙞6|u\)y{x5p8Z8$2)VеEϬ_ & XYD,F)j20! ]ۙM-ԟnMGOh*(0|-ReKI'6rEhE /Iڷy&'#;$ [ ^,jr{\:,; (QQ|9rdUL t9/EDvTc~È#IB:㮗GG=W\k{//l ;bxYe@A7R05߿?Jc r!9%BZUF)^+Lh% _$})-_ZZ1YdC%g`B$r n/Ce |ïk͎TNti!_zvId:/X qj}׆ C7)> Kle3͢#/|7nW/o4yezոnyivA/ _iitqƝ_TiE;ܒ:uJޛ rո)y""GBǙ^?bJ0ԊPF\->fE徶ב;r#ӯ/_vK`i6w7Xn>O!B+hV[j#<;,)/xXA*hNqAPlסƢŠKtB.ճpp`?$CQy XA߬|=MtKz׫_|qŠ;m u0I: oaMs-/f(/¥ԞAǜ(D[\7) /yd X$||ߊK&qEzviw9/_=|xVsT,{X_*2`b#gԂkp6LȨ²ڵH z!K%ƗRu89yb%{[auVn4k)%zVEVq2! u},e>L8c;ٵXa(e 66@3>8^TQr"13!7׆z_XFKPZ‚~.8b{"wӊ]l̏P/K+_JD~,UYm4z\i9 fB |!RR}dADJӝ--5/]ŵ--eQu8r9/<_f^\8|Y^K}cG8rwGw8==q%N,&xln#LEOphƂEV'derbW>㯬+)h,صmӥ!LP!CF)"Ov}GSgG;mVOmA޼_VV(kя e.KA.<eH-:xg@c[w*o2sbCdƅ;#b.߂#w:QqF3Z#"g0;Y۷A)5|;842tz~Yؽk~-1-]1Ò=G+|Fo/1X>.$C\||mIO/i— *)+:yI oO*گrm>+.f(-N a<}RS^8հ'ᲀ BbjC)(_'G I 0_-gf☯>_&%5<] i4!Aww(xbKlvXg뾓G6/tp:_H U%rrDEEu|i:k뾂/U2wOen'O +Kbja8.u8R06t`ujoJʣ?)FGR{ϺV.?ik._#qܦKۋ~󏌁/ÑL^=雽w~|\:؝N^ng (bVl\VR-Z [ 3]C2@UU:M#J::+<${oΟ\ͭ2~MܯؑoHgƏ_`bzEKoǗG'u¥~F3U-Úw/r3[nNLØ酌ڹ"e`I1L*B8ENaL3_-|!>!]TŦ3bcw*Kp5[# 8{",Mlj-O1_W[ŧ?7ϑ]M2 0MmI߯ܢ_H .%*`T_'SF޿/EB=ӪW剩4e8JH߷m|Cd eZ*b]~2"ap5ݼ@D0!|ieC;8|Gi/\QcZ>9YޒU~H4v^Agr)x6Wz" ML/"E)l%Ogcvff-ߑǐ/ Ǧ[ _FƂz|ME"[R]wz*{W84Ș k#{z֯ԗoѪ/zOTK=tE?腫|PW߳oLMjko <*q縓yUEZ'hŮZG{_4 uzBVT_F8{29߰$h!+eʢhY%ej0_E LS_jbNtu-rU0 IA/ѷ{tB30쨧$\ vsN/8`fH}n3tq_ۡKmȷN|!FB9;zn أk04z6<^֘>Or~G)]e~u MeQ%WmأRЃ,1רq_; 9|m~D+DŎKM gȬ$TԈۢ S%]K^&3Z0:t`5NyaOLmtX6*`в B|QIܗ[+}- JDZ櫏 SL_,#(lШ:) 'oS W/;~/&q;;ڤ fj:=M;w@Yqbvk]#%.$kKYm[֞_t҉B/9aUmz!rBs\^qzr%oЪ@*1>U$/0&hدKsleSaHI4r$>嗍ch$sh8v6K eTvRN=-Ep/?pPRVIJ_kז-e+_}qH[R_VXXM˰K?_ SS!ROU4衪q 8o `aKpԨN]4,T[}/Tb麈u_sbBdW2Hu;!e[e%&i{ <ƥwU5VV0.p1Y?o%Qhe.EH}\z>m^ /j(9 'R-7_e1p엸n_"_|s$ 2*)LWV֎,i/,:k#sF)(Vk~_W)Qb!WMRƒuU8s%D^|qhjT׷42{{֥V%}hs'Qz_TTYTy}t|(M|}#$T_pV)~5_Ra XLQ')Hg6N M$kk[ypX7of3ycf >>u9";~e 3cl~Y_l_(} c(d_ze[DǠ_Sg̵ ^e|'m;k˲jmE̶*.J@ ]Q.%.ѣN>#_*b~=U1iLھ|Ihxa|ߚس#+*wܗ2ur0dܨ(_TaZc`Ď$H~BC^-XqK Ǚuڗ~o%3bgBj>knb p+ܑ.-'zlbU.N4KE(YEo/@خAv,57z2_MKq%VBO?گn5qtKip_A:0/A(L0 Ǹ8ל%i-KG_;ќr4[W8r@5U[w,q gCd5y!t³}{&+֞D]W~ z)N&˴7z|9z.݅Zr`x#,.د+8HRjK~2IIY$w$!1_3G0_1!Gv 75py7Kd4ΐi%EF"_knV,Zz4 IvqZ3|T_+r_,dCg.mªvwYhe1L\eeC\1 LrFP-"%@DyYPFI h*vb3u^^'ïYImG$W_|+S!- %DKZ_T9nQ#_|{B _PXJG%8o}nv:\+ sUq$i.>0w/q^@{5;,Dfao>o׬:U[By $,.`3j%' ;)6~|ēG%# |55(|!ЅH_@/dW PK_;bCr:퓩:`Dwy)~cCNwm_5c#/2#ޙcUrn*ů<^FG$x<݅j[u94!n:k e].LdqlP+eՓ;%cW⊪p, 0_+6 7Mf)|57O/rlȇ^L|4Kr_518 d)i`A,zecM/ WeN. JZkFdNpYH3\DVLIF[ (l|!{nxET _. @A4ARbVҾd#qs=e`⣁ŖeImy2B *__(u+CZUzQMDn!˪x]G烇ď4tlPSIU^^T{ -I#M acl=&SZ=^Bb( Hf΢һ767~$xWv~s5'{&{+ϣDf/zNG%ao+ʈYˢ1_"/ F`qa^doj-_帯\ SkN isy>)$oߍ{+N_В Hk#)d{aL 2%==ӂus/= Xh6LE.2:G̟7م[Zvh ]zA}I~z:?C;ɨBQ^u_EO4ŀuy ]IKhz{Fcc]>9k/9ue-==SSA`eqmV鰂G}Ͱp1{ZU\dmUW貘*aAmFEFmF!am貴@7/lYy"02}Kj!S|[N9.=w@B7P}w_x) 4)YXi!дȤo|j206R2ի?ȥ mbH;q)f/[K,_3R,|iY ^Tqlٯ/%_gCޣ{^^xc)e襴~)|%y6ҖMUK/Vs76E*&-0RVkrܑ=mگ[|emtSB|9B[ dמMn| 8j F.aŇW )|}Nu*syt~ƗzP&-|mkyASEhq 1+*ZE/?\ Z:oG=Wqٽ͝!Ikď/4:00ڶ=ㅞdg6?e2~)qjԤ_!-OPF;{6f}gR0YuOp=|Ru_wʯ=H}hjmmr&6ON0i$^΋p_-wвt j PqEgIMKl,u`H 15|-di&v.iˇ'F7@0T[A9Y}ZvFZ]7]J뺙C/'m3T^WfHJOb-E6Ö)ŰVEaiŇYd#w N5X1_^!^DWFVKIT`3a)Kժ 0#BK_̢_FְA81e'9tCO4f'K^R.qrDסyg _{.MHC)pRz%܂`-\.IRoxpU:4zsHp5?S7A/h%-@ZLb$C+ݸrcEo;t1K1N,\,uw/-L\KʴPZWV}z6UT~)R9zJh%C+vWk#itGpi?sv*C9"gIS51HD/h}# :{a?`oA t-eXT$śmu4~b%x.|52ѥ)տ;FX%$I_3+w& ze@kՃе81q H8}E'f=5`ꨯEy RU1qg[Zj+tY!BbW)_?}Vkh14bP_/X}!Ne3oklpF-([+/8 D-T/.+xݣc n p[W߭S_}:'Kz䀼3%:BIwg#Zj)YѣIPRRTdos^;}X7AkIfR"ldL|+`e2ދ`|%QNC*3.YDTbʖ6hdEڻw3{#X8),`8( )z^R<M.;o%Z.v#|A"s yE^2|FlׇwzGuCr=M Გ68YElZJ|q_j6<;z$5?[E _?q Ib.]*zt.|%ɥ%Kjt`j.>:|sL3ջ^au<:҂\/+i|]ꖋ<]^|zumF$7UU 2|Td57{"HL09s|jS+74{zKL\i$lI\ƂY6J @o?.joCz/N n;?ݒGgQ+ 7q˼]*ȭi@Ko~>MSpM"y-{e:sDn"h`rQLD-$Ă*SHN!eMffdtَv< ˏ}y_ t &Q)|^;޽uQɓǨLU^\e<jogł~Dhf[@`̯'<MEh@Cܼa/Ε*XnEKk&fzRdϫ/Z[7ufn#QޙɘAL L 2к/۳ bs@w6V%.Y{_ݴ]758[0pb A/%BGKW/W?fHՇvQ:5bW ȪUgOa_bu :;6 27 }/7%12'ϺAٱ :z/ߓ|I L;_85qFL+fVAЇU0+}0_x.ٝ;TG!eMfR-<&w^qϝ=:tu>[BO6\o;jSW/>i4+$b+_0$׽o _YEM`FobO*%^_o!&<`S+xc}d!u|#2n|!J/)l+a "!/xM߹s˪ҪU UHN.K}ɩ ˙ g$%QLvizv5^ E+O~z|oؑV:§cCȂ|2 HIbXcڼm53kv?Ñ?zVzS_cz(:wcfJ×+)_\9Cx~$gD%Œ8?eWR\\e$+k;z>U8ޮ޽u-vIDc?čq((LI+` v `Def}nԢ~^E4ugϹ$cJ/ٛ-5Z+_Y1[]VD#%.Ly:ru_qWsė91(@kT`tuƢ͛paFP6ɅgaufW:c=H9e~_ܗ~+:-ǭf|C2 nzQ1֒Gد5^vݳ^eMyeeLNkG,2.5k'\)GZ-q%{%~3($0{g/f1$wĻ_D'4 kگ5+vI|3+}O"߱H7EhM~Nd"! afK/W[w15D]N:`ƁjӴ쟐&E?)9śU?ò\q Fz>rcx๟Gu/\̨Uql vBKjݶG Vh<^W<(k6߹.M~WAO;>Whn??~ZJ(_ rA'_ 'x巎<%Jd&U[ä7]g`,>Sy:W: `)*M1\.)k/q(`9rOf4{Hvwԏ4$;jDjڢxE z?1ԟ $dKF)< @.&70`GYg@HCCXAlJ𡼈>_૬4SE#-t zjGwJV/CQ=@”Υ|q5_Vګ&WN~ BgP4ojOfXZ z9xqq< _ /6u\x๳<} YF$R=d F* JЉkJW`ӌFahWﱓ7<|~ub>Ji%7%:|z>.|5"bG3MzvM qxŠZ nH^y\I].wvG+i*"yb\Q%̜[t'Vɚ?,WˈI%NI-) ]PɻNgsff{trVhSaoݳ|)C֒1 ~_ׂ}',46;9w?ai #.xo'cZs׆<5/&m>FKo-3Ȗ^k_bcQ'e> e USW,'f㨑o?#|qHPyW/ꇴ_ /N8)W :r-H)p՟"0K倐A)X}G !TLJT—$T:-2bE@" =tZMn7/$}>9,IK1xQG{n!WTU&\4*_[q#JO:ҹMٴn&5[=Wʩ]<|99&'G D_`6d<(,/t?~dnY|t_X;|$ b844B9ji_&zȬ#4ww+XzӍUd/55'ԃ/_UQu _<ݟ{A?ZڔRhU:cd$uI Syڡvn &f h%ji툏'v6B]-yޥTc֜$|%&&3f%eL6Rqhu枻NWn6g`S+PilYg0euD35O,YtIoG"hUI}7uNV_~Y 6&2m)/R8:bpVl֛Df:noo߿&):!w?_o7L;;|G7enjQkRH|:`;tP}5m& {FSVO?+ _l3Di:J(2WDaYBK $r+ eB^29&2ujucbb o9wË(ҝDkR/}Oa7i_DӟMs7[x/ӹM^DHGs/ɋ/]TW×I|9`07vU_OүY}Z/ij}1pu}Cd;u1v _˕fvYe4g 6?peuhk徎}iB3ZSWY1jJ#b+rk&f?NPvbvPJAݮRBV3/6mrHB踗է?ls+W^5 ?[5Zfk$Ty0X|irc/%]>Zq̾G]aXoB}cg5j]O&E\? rc_;r}Q(]JJ W&\K}Bzs s jqS- H%'ed4*/ nkr$k Ua_7#XO7|9"xU"/!THA ey2ckT ExyfN`chp^z^sC5|msS3_z1G/Y H _<1yΡKyܱZ_`σ_et&tVfeg$-j). CHZyz eRSxW]S"#co_C*jGw1Q^ʮ5Z8aʲe5Gz|_܈_O!ƴ,1ꬁJkq[Z-8hӦTL6+5L`HD*,WTu`)~ɔJ+%`1%_Ma=C"%g%@W+%6t|q_K(άMnZp>:xlNT?*f[ U)T,%4_#p;חv_DcnǮt}h|oPo@s4BccEE\NEeNY|φ#1Ee~K4٬ŋa31C{%~άNN;/|Mr|6/*Vʿ*_Ja5 QIqsL$e_S_v[Zx>mkr!d]!K_8+ _^6|zcGsw=GK)eg}򳯟xgd\8A%@ĽS.}^&fGtSɫ#]-W.(!~UBl27 XC#U|O~_2d煔8.Ux{yԒ B3{8&/.-xqjI/<4g,} ֎n/}a@sNeen$Uo*:N8\ӽXHhfdL~̛Vj'^eߐn<`{{x3cFir:j%/_4P _Dzo`/(OJ6$z]5J)+$pJf⚆Čɯ//Ɓ%uev=# &%d-O_/K ך$DN+(,(pcW4hͰVb@RJO2I.`MfNk L0%{/~‘8|TnsҌ[kktC 4eIIuMU P 6PK}L_E6~83K_hOhվ:ZhK\(|!g+FBadH2$LI0嫿G^Kbן%oېy[5@ʻ+DWj3}K}YGI'>>pV/d /\~sG_dœ؃_&e0drI6{>(__ mċG.>in/S7Tֺ;cFھ_cly$ã*2%_ |)hzeB("` Iku)Z|1N ~V򧪾_)|^kAb~o!vфYTGD&򪤄0jʈgSKTޤRHd&&fQG+R2vS9AhТL//BSRY2xJ$'PX;Q1bsKx .Wm&.HoAq IL-z }#rP&\~ %|9DwD_֕k6;IMڵgt?"%|-* JjĪ!Jm֜fr_BdUleOBG{!@ZJǓz1 仞)#d39R(z l^piّ9^Hfޢr(Mg"/.|yݗڶUo^r-Ki_H/BsӃ](ǫ=◓FRv!Q8~_]~/rEK }ֹ/k5gډejiW _8XnldpVHr_Z;_|E=|;4|=t}߰:;7׹W֫W39caHVAEnfIٵ C&U6`̸)DKZM2UDoQE=Ŵ)/E_p⩓vt@^}!"M%LX/ylgD-׊Ֆdɬ76 ϴ8!6C |5GGs?'0P1Mrˉ>d3'>lVڒi ФYzf0:jERlg;ٝD2՞fWS[FW -kS[=>A%g_%5n,# T|mѦo9~poۺul}d yF52"%y_a) o߮]lj,rVJR[^wֱe_#)ƍUh5~Ͷ^$ "isǁl _쇊I 2)Gᙁ̹W/]'VN xs_9YTUi)cZa<' p_/JW*t"8-aPGP}B/"ua~_U/UҘ:eNR× ڱ|R}-jI[e侻su(k_c. }Jo_0`uˁW OyeӾ-\~ʊNa`/e 8sĔo-h|1}5P|t0uO-*Of13Z=QO js#ޟxB1;_̥f4E͍5#$\|1YIo)zZI B%FG(aPG_l6C.esx|ҙYWc3xEǔ-u%$v†0ľA/&שxyHԕ/IE~Gu3gg7K*ح 9f:?Uq$o\M_qqk{*e4>XJKkRCqyZh;YQ/6{αZ}[ܺGo _e}pIqay1Z,|_UC~,Cr= 5a{& ߗMUj+4/k-V:ROK uʃXutUP5 ~e9a1\3TzFiDbH&?>=l9u%nj: CC-]#WEZ%+0)ZzagltK՜|.+ >b[/>g>c(caZ^NגR75Zh> ʬk 7'iL#jʣԋ07-㬑WS֭[c*oLneVGzƒk%Y/nЇSՒ*z葽 Fq7_yk`c R__t)|_ef>Sc#W?$`ue|YmVV5X}(eB]K4V&-Z)8v4=VƗ2~;oRnwz @(žby4 UIJ*O(hAä́د,Tv 0$|I84=Rpdw2u,c`Dde\ -^/!n2tx9S3دYjhf_='zISCM*'{;r5ҵ2fy%z٪|F]뛌(C:-H@rq DT,{/ 73,Hɴ/m^41/$|]?SS,͞!QK ܉VTӽ ƂGװΜGс QY0.=Md,Gqnf+ǝ]h8t_7rHEȟ>GU_o:"`WܺD'A_|a<#.3cFs`)hynuA_tVŦ /I2|`+-.'9 q^T+ЃK?xlұׅ!jHB`f"GɈw3v>Z`˲u_wˋ.7_)3Qn0GxI箩S25A*.3gK`^|/'J/ #x4(^L.DfH&|Bb7haL’ض~_/t[q *CsVpWXi_IEE?[#u;AqJ MmxeOyQA#ڦOM29ܐ@r#yR=S0AסC3,z|=זQz~;˹U?ϳk/ [}I!X)kf/QKȁr EPE lz(!6Zx@m?kٟ 3DzaV)/_-%#o3(5yޟ;/g|Μs7rzmnBz1+h,[L:ܕːj2 c_ >N1EZXVswMrC/{4~_E,Z21Cmig^i Ka$[ajG殎߽mxK/nꈐY͘fޝ?cK>mQt k'%{1tj{[$3d%\WW_60 u e"᫪&FĚOmeMt@ պ/T_^x~)IK /LPu/oke`$hR'wԯ|W7&_ |Y~KΞ~LΟ,xĐ䮮^H7/8|Jul W rE19MM$A^@ _%u!-3:4EjFސdG4Α[M'7ɤd1Oou^}W?W|^, 엾=J6. |!:R_cU5[We`!%gpk X//~mP0܉swGL H"!DD@J 1L\E//.ͺ]5YP`& C@WY1‰JpGO;0K}qu$0MΜ_q[/R/`g?YueԚ}iKl]aqQr𥼯ŗ١nGpEZ΅_{!3a:? l.AN?{_/+ҩukk'cm ^XRM8mp08Yr_+8,/ކ7=z;iI c4B"@$G~I⁁DYK4(hn.t}렗`x cfLha,sP,h|MTc&=qvvO|MM&3.+ɟi F _E^h$wرs|LS{WRfPz pSqՓC"춀>ִOEPG cG=eDhu]\4}1HbXET.EwVK:;|~sTЧp$(\^N:@jg׫LZ /]CfI/i?|3uȂ3OZz7|7OliIj#LaH_eZϳk{Ӵ}ы+b|զ_/n-c:]94$ ̞&|E9|/IG:WO@* '& Bp=);o1_rNaޡPAaz 1~f^+ʿ&sߟ~!T0ǵ(c{B+{:5v>B^[wx8BeD` # t|յTv#PRzY:g9to]=oi+dLJ췠"Z<]K` ]+K+ B/-.OǕ v}Q*S/]ZI}ODZ2yH}R$66!8FW5JQ/ANYoV} ZiG*|4l[/iZ,4q㲼Bk]l '| o]c;b8oGGLQq7Dhyt#8j_+=U|}=i?V=u%S>I{Tu,ŅOX|հQq67euzUʊye6 PQZ(x܍+D-=5甕rب{Ԛ.nv{ӓ}DAt4%K+x/czh7&ŷen\a}A B:XΌcIfhx +d_ĞK} zg*uff$!—IleUf,1 {wge3 ,dL䨰Hf}}tH`&KK 0q ~zS|܌R*=&(xLXgc@׹s{UD?dW+wVh58*^P8EBUf2vO^K Q^=>o"VPL'~A8jB钰ev_O`xe+TXzy-0O/Ǝ,@5t$ J/[ЂMEJŨ ~qcI&_ŋUԩ;%IH2eW%~enByp^|9b㽰^̼Jr2.Q':JW3 7B=0rT43<&UEVr^qL݀q_mݯa>KόKgsklIKKWCSm#bɑӁ*3<}ͳfç~Kas@o]AA`(?q,X6քFHơ*WT,<֫Q 0GR).E[b3^._畒Oic"2ao䥽&<*,)1Eu5G]MD$V~3G=nY4HƿL5%]nPv"=K~~/ |QCReB-+ Ǯ,.f]HW5Qw渼Wɒ?˂RրuVfFpGۅL%wDQI|`eWA E0l>opPJ$y'xSQ%ز\?$0ꓗJj_q㊧a~[W^j6ע&NHA_H6Cz:FE7 ۞V2ލEWH4Հ颖GYz1`uu;9"60K#Wǧd-i3BPK.#!op kW^xiRgE1;fjJ+_kK+/dY,/WK̽tR!) >crb[:.Iɓ"H7sX`ըډ$Xs{^BN'%rfZm(i?ꓐr3Zd3bGtODLWZ|qIH{Ϲcטd{FowuԨpvCoǷ%LX.|}·k?t!q/|1Y6w/f9~Imr+}巎\WgIp߅GJAD@*q_;Z$c$%ٲe-[vjh%*S6Rj)s϶ݸ~q*QxA ONSY.ù63>q ϝٽm7^'YSA4 B^9m݁A :9ܒ pF|Xz 6>Myj?hirnSڱ_ZyF;I)_&'W}]}CTg8x}z>e32q R-_+ 3#};%⮖զ^h(6JcT8 |4c9q_Wn>2'f毪rBnF(K_#[І\!|KR}Hc}/!a_;xkiJ(|Vk6!c!Jo/ܱH |F¬34;wˉo~0€'5oSYu@6Eog*lwƍ o0捉]0*#*[|?3ndN7͟yhdfԃ W#7oU/ں3cR35@ ♗jY7`:x{뷭jft{>|$]T6@/`IeyW",(޺Mm~/NN Gٮ-̺yļ^Hthe:وʳX{kz#{$ u)bvxԜ:/wX( T1SWL%}/_Dzp+}`O? tm+HCG۱* F0#z]d\hd30KK|"|-w,##2ѣI5m!KW_r fSh_VDeZR~_n+'N8ԅ'#gv.G. &7#ef;>237i/!+ Ťa/f1lOX^_aAA$ܤf#+O#t2ŋ6-dp@}EY{! ]O{LBT5Q1Cv_Ü{r_>5xӬ͂QTg5b6EjESE>8DE]!U _kE/`|C:ܙc|uqfZGW>b,1—>CՋ/4 _.v's?{o?_(Px5h;|jM􆘡q!_}Ľs_n Θn z휳jժ{ -e}^_.[ /MϜn V#T4zҼ ɕJzm句~~m;h-K/rH_KW_|+_}:r[~s-%_u/.\p3'N_ qc\8)h_3U߳m 1 #UYgƝD^>e%xIjAiTjn&BߞDbѬ Bl0FlKS޺wۮ/@62:Ǚ|kK{pEMZFXOص8<`QQ"nK[PyDU&/`x/ŋ}QM'UNMҁ|ƲF%-[JhbFD6EVdń{п iLqm%C}gyدfTKLE7/<*WT _Go8du2{07Hs~N=Zz;&&"C(zx+crr.WWGCNƨ贍w3=rȑGY~coo8e4v.e꫓ ca \f/?)GrNZ]kB?"VI<'U9K}M5u(]&e_??i;q_NsC/.>ɜk*陛 WWQ7hKl9R=&Ff$,x\N/ VM4T%Ɂ25A^ƊN`,nӗ^pR߾}V=B>  0n5H3zʾmtHPθ/yhr#[0 n"ı_Gwr^Lk(B(L ͢g[.&IvU9[[6/ ~MPuQgŅw w7=>]\:-;nSQY6;^j|Qy9GMS2a };ab'"6;eǶ37./uEzR_[|`s\增w.?x7nǿ޶ 4*h^6XHwW8$MDũg`TOh!Jkr"SS6'hJE ]DRbc_fFMA"F=n=yÓ'[l{zՖ׌ɻS6q:Z4a2tNB{!vt|k[ʲ^9JY m,^xeXTÉji\^ytJx r )K!!Bnد5 :t}i236/m$WWѽo0grj[ggĐIě_0T:l3k33sgnmC@M{Ko3-SeT^ z5552 /^)mQ0my+C74n̗wwZ02 E ~J OvAыHNz/69MK T,a z뾞ɦvR8L["]Qkj!?lu _טѩ/Dly3X1}C͘/w@ϰ0//i8wX~oi-W_D!>{[$!$gBC/ 0=>t(j鲑.t+a{~e/Q>n]/)%9 Ir_Go,.=rŎWKE =+_6@ؐ5+w+ cG4FZ6"c^/XD_f(Wk=+Hcs_Ni9.sIf1'w $Qr7k UbWe+x|QOk J_zk{t?W31ˤꆽWH%|A=F+pݱ`#"ǥo~A~˖ Xmo_Z5w c]Wk;_W| |ĸ~ͳ5nlƃWϜ|'xi,) ^R.疳$Mo0$ѐz z>?X=dp)^|ـ~>:Z$|ue'R-W=Ea}qJ _tlЈNG=K=ILn+|m9$5'_ڃS/}/|>+|b1]kѶ$z1w^&)7Ĭo꯾fVܗew+yφf R\bW ?+ {߻Ǝ3g>:t?} JygFOaè˛RfFkb/)h0h}\B_{9|9 ;| x)^T ~Oz9|i dNr_abW)ug^k܃cV{2Sx=3i2<17kOdΟp`D>̄/FҊZfK9m2Tzm&{ ddi.Q."!<*/td7u?FU$2Wa~i}5<~R!z-2&zQcu__ +/j^ܹ_m`Qr56EQ|^=li߿ˁZzUJx>a9$_Kݙ/zs`ђr*/r_c5hv|J]Fc2/4|f;?Ushwp9, r<34_ޞm5 ~aRܰG/HpiRz>=ܓHN`&挀_kȉ;kKEwʑFK]ڪͨ0D̗!q_4D}s:A_oI69O>O86|H_T BbOΞ2~ʖ ~?pƍm@r"ӧ;x@}O?@+eH LP\}\=}g##SCoۆ:Cܩ1h>_Vv2]=jڡ!1:.&ꣷ\8+pȮu/-,W&8}\M`}tnIo-1i;=MCLʩB—^; tyU=qnbG 8aaHxľ S /Ҏg;~)bV2J?/xӭCd0^=Fy]ŊdUۦhάX)TiпpF53h |)ztS>_gBn=+*_fGB=iG-Lɷ}ey_rUH{M0-ӖduTqKᾢ} R8NT^3&5/+0/ WMF#r?p2i!==Z~yE(+6%.fm0"\/fN/qK:va*ͩ#)> ]kW~?vs':,,hN c6q?],eK-M UvU(x˛H.z nť _2wfWc6u7O__V-c`@vONw.Ν춝&7:˽D}._~W{bo>@ r~foPɓ7;~wj+2c 8΂^ U(G'2#5,Q5 w)F/g?A{Fc]|Yj\KCGcDfyG/S-}$H{9z9 _U~8eN9/U- h+*QX^EKz5Kp*Euũ%كsы(qrQTD{ulJ5=`g(T x _K% Octܗ^Gn^8_ 4Hp*Z$פa|Ej+C*KJ7F>+Ww9JcXō޿ԝ| Kt 5J)J ^$RWc#R y\2mQ=2r2kN` G#syьxgˋ/U7sZiEǰ*ŧw5ԮHF ^<7,}q8yhrqhGGH)L KKt^%3gՖm/[N\δ_gܝ|7w5 9!7—'Z S ~wT2rFYelDnxw/Ԝ1= ԯ9f%U/'[_~9|)Jt^^I[\WO-5zX"Gkrųp&k#LCJ@6=;  Ѥingjk+.k!xqLɽ3_))#if6.v,Yp[9.)z׿u% _|GWs^Cr %ŷ ~ۃKvUz9|#!)ǎ%v2fE#_,J{ܤQ)|mj"ȕړ!e|S7Tfa|0N)"vj"F/5\*|W.<[8uKܫ"^Ԓ3L/376 ->}Y\H/t?jU}aF7 q=y౬\/zW9!xAO/8#Qoڎk<xM5~Rk޵_kS:¬r҃WM|c1.V`Gȗ[_I+ ϘhCԲ^IBd(S%?~y^ŗ{|b=osѸ/Jb6Gsmo WMH_({l7#J+]="'o͗TWd*Zm%;\5)3b&vtrQO V-2^|&28]lxJjy4;6u7^1:5yA"x _ @3A噾3-LiD#o4I}g\&GN&43sJ}}Osصwm>!_ˣ-d(jtef7?ZUmUT߂z |qqg\,V] _s7i_V/r|Q.rˣ<}Ew`ėG&,jΑHy͗hx A,?kxǸIR E|  D.#O˕Җm/F\_Xg^|.S4nDčwoRȵCkӿʠ{f=vLwd*O5 Hb` 'd͂oFŶ?duo_$J1{?_/j7¬^"FLF 97R9"܋M/Gg=̗%GA㗉y/j't{_.$ELlKK̗ J͂~&]tXzR.彸,tuה'D/%iHΛgw)g,cv}U0+_"U&|msre/iξ_9e0B,KEo?z̭uI{u _DOTLz:ֵQLw)'ۭ=Z^׸Rc6צ+VSt"2g$0ir9+o^=C"K^|yGKڤEK~K $ғc;r^^~4,zdS1դ%—_Ң}-aQgakF`#=#,-8&^:AgT*e ^ }/ޤ 6JH1K:l6*$+q ǎZ{˫ž}pmv _&e-ՐA&_th/)l1`76FkG/xdk۶sWqt{%KJcB3 +wO-p\r,R-FtIJJ㾆'wW'զgkZ_Wik$CmI0[)OɪЕ!vt}?k9)EgE0ٯGo\]Foi'H=ĉO<~sW@4|us[>  g"Us^?u3}|^W6^}0Sg.e|O f}^ʌ#ubUJ[c=*Zf >@t*:G'E<3&@ ͻ!hhi!؄M)X@(HLZii5m$Pb&_CZCdhPQCtTpWaR0߽w@%ιx/cjV /جy m|/įodz| }rTk= aM[!t?V"of^=ct9jgYSmm[JIY H/'q(_ :ezn[mt# 6_WCr4KR2`O8Wm|y1,%O8j6X|&n*w((V//v[JƇ$uڼ] D/nB5K-P/9J_h _×MWumzA7^KqtVUd_Uu~8tDraaz>ro5h X {Ca:C4QsŶsNنjۉD/JP6jjX$L+_Nd+fOIJ/`/Ν@U_+gg }G8+_0N,՚Un1/~݌JH^ >6f٥+޿3@Yp~/IzLȰjojmMl=v%}!5n2ߪw\+}*NHVA=If{C:Erů#La~_clb壸\GOk~^+)V͎/^gE_J#5kiԪkq%oTZ~ t+v\w]J6 X!_U-D2 cm@ SoFb9؏̼gg9Q9yU\/|9~m`U5gbe5<0hry?*3'/W"~ hEu{oQ:!|*DtކV"&N@/^|B7M5Z嗀"A"{~G|O^kKOSuxK!/᫱?uVkȻ/ ?v׉^yi{mK4(eHmhG{yת_EG!Tx+OR ǁ5qc_=T+yuɱ;NT/O_\ml׭kŸ>~̜3($&{Yz!O/I_e"Ct{%o{574w h|qPM#CW{C#c^+]ۯ_1_`HRAz5CbmzkyH{KTf:̝0k޿B=C/R{gqǞ{Xlkjw޶m&u#/wc2B|O[}{^V[x 㼸%SK_f:sѩtvy-!u /7d+_aPIG}(_n}Q_G}JX`KPD/m BB|B8t&j>1$j"HaR#^/+/WrkbA&۬|B}ƥ3:N~U;߀//!rRZB5ڤ&'~)wXߥ]} P"wx%a.ɜֶsLG@ШI`u/wJ5_cdf{H9TX}^4lx^EYK|eUh\bq˞S3^H("S(`WQWHt2Zŗ](/ǷX9!Kƺ/D,oÐUYpLFG| ޷ٿ !rLLX.ާPASꢼnVOh oE cUH঴"JaO& jj"}C_ =]Vm,%B/ӿ:/ vMǻ=*LG렸Չ|do:yRX=EsBs#V*¿Y9 7^nI_Ufpk5 J įNJ{z$$*-Ë_x{Hz-[* $5^<1P~ Umbtb^;j/z%f V󁕀ź/_jR QH c婧~,p7N8]b7Dgh'Wڐ3JRo7?CO̙|3mb[5pbL Y~|=U^:NY_N_Xd/SG_cJjڽX_ w_V +S~T&LgFHܘ _]R£?(9%|w{J 镌Xp__~јfbH~%D-։RR~+^4-kO~bq51*Fbj$(˭8G>7Ym(k=ϟp3u/nqRmkR]rLŗƞpxe4罐9P%OcR/vG/`JjJ/A-D>"~i&]c9#ë}q1/UxbWW,;챷\eG5&y&>EޓK0P{R_MU;O34R/}|qnOtI7iH猀&uڻqN@[kR62NX )>"q4e[۷ˁi:C6n$de_.unt^0_miT?]!9~itPqf!g}w_P0z;g^ccw7uc"JjWW ':˦ z|/^|=eE@ѶXK k4KG>XU .AϏ&']R%]*0``j.Pu1g:c̙AGx N>ÿwgk'kni(g-#^ouNUʖM)4hS5C57_׎jm{t%_%z6 _-]'/e^%hؾڗ4iބD 1f۹$쫗w0t 0%'S|ixgEn\Ŝ_IN :Cc}ov%22$'eW^ˮ=uR|JZkc?|Jį.Oj؎I%"@Z) qV?{bw̠ vx_5_ݘ5\WUOaWe))sҝٲ* R˦#j{o‡7Rª8PKfX2+in3E:ot?rfƍt?fۃx6yjuKЊ҉Kc3KO|i3C)W}ƅWUτ/Ў=[]wcLn;"H yJ8|L6$DI1k2Hmz&}-vTL;]UzѼʰhe8RZV[ _KQw Gu~=Y?}+("+nrK "eh_y"o_/ bfh rSrTZ z1l?T[/M_eWդ." Pˮ,T/٣@m]X_T(pЉD]=AE7N,SX"XPV^JRˡj\WNwQqx׿[\W_ 8.|ѫ<9s3qC.\g^}xkU eoξ|Jܢg%G/du;󎞮Sҋ=<጗4ԺlO!Rڋ2zI>uӜ3e_ɓT؃ L>z{!@.|=/Sl N"OM{Oc_|؜m%r_ Vj/R>|2/eN{6V_jx'j5vˏc֩{hzLʙ735S .A~! _/yf+`Q9Pxp7R(w UkTJK9v]́ц^i$O,[ǾX~~yI=|^_x/zWp?1c64!ŋٶbg{P[TbquFc.!)jU2%滪k[2l!qy.'P^>y}RoR([0]"_kYyqίs}0*:ٞ{AkK 4 b%WĒQ/' 4lM *aV6zzkP^6y!y/amuT_~LAd]ыg|0%G%mT,u]C3ݸ%%X,5{˽K݄K{阛/29/|ierh ѝ,l`2Ǥq-D$|..Tߟ .H :"d¨ȗ8D;H z#/P+ŗnmӽņ/3'SsS 9t/`W^WۂcպTx&Gԏ/t13? [eȴ2HFvX B":;krjl W^tUpS=Bc+uV_x-OKIxU_99|pa.+{˜`c:z8Z2hH-B,g2hmlkYźn.qt69{dKs _Ia N7Ț/E_O\|,WGI?릐X ҍt/J2rNs\cE^Hf׹B.oX__" ?spl5N] ^vEM`D%|M2Cw70sģrp Z͟4;,.z-^į4k2Sy) :#m,['C/NkemtIX,/a/%Ew:~ "{pt?K{:Ў&vX_ u_Z|Ť_~|LԨbQX8Z~tZDӋ`^˟G:;H%+ɎV́ԧ]]U[ku21_{8fyKZ/+IU$|_w@'RhmSHVņ",㺴kW%cEv71{X`ITJjp/F]i~5UsZIIJп>pvu4lZSҴQ2|Q<{rp/~qNgv]祟=f)&KasPqK޾B'>B#KdGZ/$UtBp/S?Nhv9ZuC#:I=݈_Nx5AkP{akX/upCߜEQ"{ҫzGh#Ư\lbB lŋ_%#Z[[x0]L\*5K/,)h_xoPRi.>S+F4 Z|٧,r2b8UF^^,i˩qABk*atNȘ}CN /IBXb!᫩qŅJk^L]M23˛aִq5Oź#3qC%p=ÕZ^J/+=lb᳧_~ïs~gW{EP˹`e<' ^^h{k#z5=#ڗj zy'E]qɹdS<.9Pt2#?>0_}<6b-^8xjlA^ܗlҵG'ӵM< ҪzG++ _c B$﵌wԇh;$=R:ckBeŢ-LK $se<:ֵ\^fo0Ծ *H$bȤ?uȢh7O ~ŲNGFո|4_/a͎YRj/^(^#`w )a䀡U=ʉѝ א|if,H}D_/7ůΑc_`[#вjp_=|e㗚ecZ+^Shz>Yx:϶[տbcT{ם=pa M{zeߡL^3_Hw<Ǟx:<9*+ʰ|{2zX^/3rgj_JQFJz-#{UIFO;̾=Cww+tl' L/u jmG/%%^#j>g/Y3 |5ⷐ=hF J^&aj\,G1}I_=7["̎ɟ3!pkrBibݍr`]f//%?Uͬsmz:DAM% xb*!NR𥹅o0g[1ߺZ~t^Pr%{L X/?.^w~Xq3{v?~hX"z!͟`x-=EX.uC22vu]"k a!xTZB&_$n a 4{X8b%|ZQ^ `z[bJL-0)⹱_x=ؼ?C}ZJ.ȗ&|M3EC$ՑK*f=q"6.:`!K7wb|P=CEvjEb](|e^UT8B71iG4L^^G7Y|ybꩰ`7!h:;幱V,0pi5/%¯?/~NbX}UQ_!mHJ ǖNDkؔؐfV/\~y}X}~_-[V!-D/m^TT;?Ǐ}h;!8Q/¯;ְWvuMjBgL1G_V6>,gv|4/5N.F_}9Er&e F_lW`&+&~~=Nod_3-<f\55hbm^D6%|=:3FOL,rUhȱnĪ,_(I7_:"3sj\ /}mLS,2S_W'5SLD*uTL9Xm+X: D4Y qc| Ǻ~ewO?-[wvk_+Ɗ+w~ ~+ٱ\{ `?"iiS$À|)fcgW[$r~|ɀ;xq|%,?)e.#^sxp=k,Ǭ^2X9el8d҂RGmݑ){t"Xω>;m3g̛1&O.]V:qKk@Sٯ855p/$],&~_p;_2ǻY_r/ ,h9 P ExǤ(ŗt|ZQ cįͺjf  No]ڭ}-: `~ HCsK>bC4h6zFE"u\D)<:paՀzhz8a'V{/:|vayRu&<ޣ?{zDg[+CGKwC E[rU{9Sjm,-J_|/ew4厴}FuSsʣ@E2:x/ݣ|\({/3KeoɅ2(7 fEKkŬZ쌹3crߟ=g0*2mb1--q&=V+_R_]D׍:V/uh ;{žځ5oǦC:Ռ zەbmN9BE5}eģv Irhfj`t/g^G:+%eq`̍gkTM:Xu_h`Աrczr>?J^+tfo5z{=qPWXb DKc灴Kz'+ {g~;+ǚ N$5Vkx0"f[V*V>0ܖU,Qb*guQXQU62Ǿ*nx%zGP5z3 Sv+N笘81WiVj9:Wl߽-~&7ϫI|ii]ZcTӲ+z0A r_ fV6ٴKd!յde7Wĺ/>IFpz[p߄1Ľ=Wì=fP]@G `Y<ޫbu<ʱMk86P"%IIS1H拓b}b}$u/y/a\sb]` z=r#Ԅt6>kK"LzxsnU{Җ8˧hxOxtK %"[hgbb.`L߇s_>._kղ#3P6+*cy#t~5-:<+{y#zhcEp3k^ 7^C5_ /3uJ1 lǕ]cVӲ Y251Y843TZbEkM5o9⭇T6@4n輆X2 Jʣn/zjmF)GkCw-(@\}"KqJ />uZb 6X~*| AWWщWW,35=74/lߤpɪb]5A֕|ʣ<&&ioKQK5x!~~6glGK3*Ä|eXBZәzYymH!f:q_*K !U ,kڞ1kƖX#1.+fy١ik-F#kWuVGn`8|sH _AFP:UDIN^SKZSLwEu*Q$5~_&?_Q<{8R>3>^XeQE4NG4=c}k,#MǑ6ޗ,:~`d /FNle襳:~Lrbrէs^EcɁ_΀*?l*KroW%HX3 x&*c̼;g_CUjس'sz=\_en~}>K0.k0!UyĚZ*Ț%K^We3[:YEzb}z;, 8د[>zbBZ1cS <~SSʮ2;c=B  r314ׄ=uutNeLs'h2јj헔^SzbMo.]UVK!W8:~Uƺ98@|0Ut:'fI;łthŚ$ɿPUwghTZnI{/kҠbuf㧎N_hd<^C;1^,ʝ5 ZVmYw-+۲] ʁS,Ta$z|k? 吞 ^k{F^o_WE׳Tmnܸ)VȨv6<#Jۙ29E+ӷ[z3)Y̚J:ϕ?k]1v$;~e^V,X5IXr^fW!X-ヨWŢ)rzIJX?{H5p>ڗ2kx\whq?~N _G^BKu41v`cALq[Ba3Ef Wռ2a .h,PicFqWy(Q!V8L #2"P5ǂ`:qP4{m7}˷oL,jhU1%iiiʝUVFў1欻1 įZi1Z[*ިuGE`NrG M@}%&ߠXst_Kk~e4QH(JejK`zY~5tn,pw2+ PtY8ܘ-٢עe"Cm7]WZ[Sӽ }"/~׍;\BBn̹v3 Mg逮-767[2?|Ɗ,k%)՛RVH~}9 }\3h2PMY*ya뺞VDc"@gy5^X\]UUy^_ۈ"Xm= s=ETmif5SR030r0?r<-w3f}{Nž7"m۶ىRQQe{kٜ7& 6-Nq ޠǵn4܋U,ݏl ycb};˘/ƳrX!6]Q3""+vsmwA`I:-&x٦rޠX0lyQ_P~:[iy_Z~kQhGֶ}}7q5ݡ Y0Pv3u#F*ě/bEcXAnnWXUf[ތzCtGyۯ;[ތf|wcXzKyEÿ-Wcf7c+#Vt [oohw?zכ3:IENDB`PKL\ZŮ+instagram-feed/admin/assets/img/balloon.svgnu[ PKL\Oi-instagram-feed/admin/assets/img/group-app.pngnu[PNG  IHDRVqPLTE!)x{ﮰ\_eGJPOZ]cxy{!5x娪`gp̤EHO[]_tw|knssyP񯲸FGJM њjlnSօj4ipxS͕YɹWܻ^$Z\^пcY}Np>[Ǹ~xGqd,並屛sƲᡆh+c%׆c5>RIDATxA C jzdDC<ϘHž *"*"*"*"*q1a /7 ì6>fWWUؒa( ~>\2\g 84kuwQ2X šߣۢ;Z랅AZC褹m(/HCHzjl! %_.zG$< H%M21_M?t6u(&@Tg*j%s "ˆN=ua@:[NR1*(J?բ:~d>˲<_q_M)[D QJ+@m% VD I/ef7BE(瓲#EhՅ95R^ԢQs E :EÚmUod(J:!z9{ EVDƐ,8tb(^sjQ!@OLQİUn->@+QDB_1e0 D/zmRG.-&3ϪG_1CQ{^wlIǒcyul V, 0'\Թ GQ.Sh{$œϜڻ 0EQ{;p=?ŋR`\z^\W1Lc-C׏ i)O49~B"!H)B"!H)B"!HL_n0 b0L a=~eKt[7hآ>*Zn&M4iҤI&M4iҤI&M4ige\.D)4 ݾ̇7Lʞ=\=DT|)Q}Tj㗱h集,mTD>O s2">%$UQE^pi28OJğUjbb>^'!z5W "mʋZK!Igo$QTJ`wKKL`5?C/<ϞzEj;1]g^?:}re 5vE+n,*PnXeF=*Ly(lkH0r4hNoݳȡ mj*1FMpL8wLÚ$xqd<JME J$bT廉#w-n*2DPSҹ QLg=*1j5WTL4KE+*b>!*W5 T4{NÚ*FT{T,IB| hPn <\2T P; z`+A+4h4p}wMhЬp n&4hx$[Go%RH1Bz@}FR ڕuEQ?[9=Gc )X<_>[)8Fı" mMMT#cql 7 \$ aMEj {p2<=VT,IBmnvt^6|:GLf01xCOC{Fv+'/sOB*Mi95<_^ O_N:olt_trg/0qy *11{S7&p1pdKÚ&ۮxhdAdp)$!]@['1}X %|{8r񤐜?Hz?k$9}*ǡRx:96y6&M`R #X=`oB%Rp.5HPdA"y pү؎$0m1rU\qA~-sRue˲A'pG]=a3 uEfHwK%?NJ]/3`s<ȭ<4pdKXQx4qiO4)b =:,9Ê1/G' @sez'( RJO +.BޝڶqPOBSP^ǐXQPD*^E- M3E' -CJl]kL3$V7JwH[|??, $F Txܫ[,vD5ʣj-{_Ow[|ˊRH[ˆS+Vdǁ#Jy%Ov V,;xC1i4`3Iq! tݺt9ӡ1cQr:85iT^ݐqxly31C)<^xW$Eܴ@6͜o9h,bT)6F+ju{")Nrװ;_w}|y5ޘߟIqnmնG?!ΐ" A()B" 1_QE%(B^ Ů q?Ťn@\T imeʜPP*"?nL톊s%)4/ēS{1Bcz(\"(.j ( "*H R,p|%"kZ"h)*PDSǖPVw֙(ΌbȴMcgF#:gSřQa&>m7P2PDX@ (bAŅZX1Ovoc۷|bfU1E;#y_E/ƃT(w7CӶ/(fj ^˂( 3zn/;>>3A1gDVx%A>T4(f _/y3EjeYlY_q%sEb]m4VEf.aek"p쌺gu|O9SSl.OKQ[LQX&R\~ }ǖupSZ޶)8֗\]jtJ/Z7oWG,%bCfeB{>Ah.3Et4bxupx\?EOVL7MD-i(_m)ґsy$̠y!ßOŲ4Gu"7bXTnlĐh5ޣi2HIMyɋ)R P;ȟo[To9HMxp.RB:/"%B\ŠOG|z5Ztδ^c"$E>ҧ&}by@1mB5b͑H%vI<K9}DQMNEWSPO %o?5m 20 ˤYdaƉ]Cَ-uk׾LKIλ3>/m-Ґ':.Vq8$ݻ4'\N9FAM-1}Eo*K6ĆXVo67?!j;|-v%ۖtbrEFa`ۓ&+To_XT7l#]iI^âdSNj"qhZ^Gʲ|Q.1铽*jv.~!|Xb-ZvYK}"\U0I H ¶ey} O}0op(s V(CC25IElt8O\7ϨnYGܴ=K(I%Ѩ3Mi?A 8ڮ-fuEi*p!"xR`UQ<Q]F;+NqV UW*!5sEDŽ"HP c&;%5`h5O2PD2K\neQ9>AQ=Y^ʳ(fQIJR[x.E1Mc ]?˴[Yۼ(hD*6"Z A0ZȠ!v4^-:)P?CWdeݣ:KS̛vL\x@S XBag:r$QShb|- T "8aFzżRd>~M^m]Pt@)бjh -CA!-vf ߛD6QN@ 1"(9& E HVP4H+j*Ҍ}ɤx'ȶ][X7.)b\#h"k\^n'Z^fRdor ó/CRI#e 4ƽk阜"^:J(y "^XEU|nP^'vfmژC{V~,g;+e}7/KN1Q,CQ$(IEEQ($QEI(jnR k%\N x("HQ#7-n28?9A"(H("I($($H("I($($H("I+).یgQ%c 7PΝk%D'5ioӴEcĶu1ÀiVqv qo`acwktOsvky@bDM >2a~(M![wNt)#gn חʬ]E26EguUۼV.OEE(*DQ$$QT$"IIHEE(*v LIENDB`PKL\9QCC;instagram-feed/admin/assets/img/setup-uncanny-automator.pngnu[PNG  IHDRtBWPLTEuOVcntu}ALg?HWLehw6>GLUgILW5PQ6?Psnw4>J09D(5CM\N^x+5C!1@)5%-8>HN+2A&2UZe /Bbdj'1$.+JP8CN$,/đHR_%/ky09B", (2.7@"1"*EOX"-%/+4>Xl&.9',4>$/ *%)2>!+4(Ng$4=F&1;!,6;GMghfZegfbf`Bpg Nthh^dd_*oiYdaLlgjd_D]aZhZhggTkf`j`TlJ~ kc8nac`hhiiiiefghhhggegdcfdfxdbebc ybhafcaa {b ~ }ήubdc qa}cgn̰sazϬ fD(UlI2m7"Aqˆ2ªQBu5Hjv3L,WXI[Шk=ӈWB:'8xN`5 o ~_ . 7=|+h; H B1DF & B5c~HҫOΉSPO\pf6JIadȍޅc)q1S46%Y%T+Eǿry%j "J>b7װxeLg9?V!ڻD(/gZ")81Y'aX K|H>YfV)*1%o1"WKM,U{u*rٳROι8 Ea<)IkCuB,dz6TDQA]:aht:? w_r5M;/9'ݓ;u8xr']skӽ%jZߕO<7yGi4>r|]t LX><{Ze< Z=xKT+) wr$Z]-!7m8 RKiAGe Ab;mCw*ut#9  G/Dم:Ecv^A4kVMw ^?ÈR "\ru]S14^e( aOhpQ jʌ3KÓ$4Љëh4!OAMf"f].PQP Ł1qGeL[F?9B⺞Fآ>ӃlAJun5]2Mw۾:q\UQ" JAHLjU^:=p~7 kk$+[4(;hixƳ[vs\@mmX9#Y D> pAfzᭋ߿LЙ9jr$m zfIyXlӠõ^^׾t`nC6v.eC#Qdwlrk^Bǖߺ鳂itc2 HJxiڞiH~1tZI}k5s NЈ ͏K2 F! 3t/8ho[Э7A=D .v{me谗;zŪ+qG}-:k|j1T/6[KƘ9.މumisy}|]zd[9A7v^_Zn| ,5>t]e\B1+OIg'H'53]׽>zV[ZsFӧkO)#"֬a/)a6#C/3F)t(1;WFpPE2b ST[,w Fַ%tkPO[xwFO7̺׸1< G↢X W٘^]=>d8v{Q.G4۵ GYҽha58vMS ئ#՟w31`/]dys-_ޘ4FʾafUYR-We3u/>[fyzM)x/SipG.xEg`9%y!z\dR©@?O&.ehe_]kU zH3Q6Wh!VH_ϘN}5N`3mYCu \0!Kw,GX|`w 軅52/+vgΰӖd f/nkOOJ՘I\*c\ _0|F;zzA6ܽ,GF7La" 1梞Q\FZp?qcX@Нz"V_{XPg8}߫oXj]t(x]Zs~~ASǡl^J`k$ X:{9H_cQx@/0kFUe3^rFYa%k,$UӤ>lf@zQȓБNgxP:./I#!d%^# x<0a4}6i'ҕ#$yi'N-0klJd;N[[}UϙMHkޯ#]G Oⰲmd}櫘~3W_#O2/`/r0H6KdZ\պR:\Q]67m!܅wկ9\c7=%rI)$.v,a؁&MTW@k o BG)ޱD _ZZxݘNcL%1v b AOg>Tz Ƞ*yYIzZ/:e\CG9oBw{ |Mts"|x Y*CQu651c7F}ˈhBgz~2KP𒼵8Do=l$#]_. :o]c`~&!Y%XB.J^\XSvݠ6IV:b]vTs {c#hI[ïJ~1M&cZre%v[yU-iJ܇ 6oؓtiuo]F;%jyh A)zHMnuA JrН!Oޑ,..!_;:!aPunH,O_D`hpe9v~<ӿ *yl/0-Q/:~*O7l#(%S)^RwG:ַrb<~ kDG(0K%2ǔu/k3Mi1bc) juZХDKc[P"q/ 9@\m [ 釺XOcsoR n\& 4|N5bLkހo P1ot>>؈jr͞JyrTgHK.& +#d==6&+-uSu!O`|Jɭ囘0 +;8oh9va9̉ 5b ljf[/mT5Ҥ dyE iU`#."w# Ps_W^H.}%i) LްGYÒ׾;r6"q'C7v3׺@#?; @"@F> f0-ۤAPpfJBG\/d֟pM29m,f"YsExA ~>`uF:u0Ds!hywvt-6;z/E[ ]Hwˮy5mJӣ " 7,ydki2{%XWS|8ԽҬ[o5(#" @⢴BO/6M|:sOKplWzamuVrmFzYΤ98i3 X~0e<2>r&|^y7aܧ1? 9!)'s ~ ?=_:RV 5Ҵ&52yKX7IK*(Dm\'K&3 %65ؚv!V@ 4`{94d.ҤDK{1Gncs/$l| =anZt/ך>gP*ҕß{y˝\?ϙp监Uwl}PӇ*yr+BA 28ZHIbP򚞿A|']^>1$ ±g=mÜ2>8U.{iD$0|HY3.>q>~aEr,yݴ׭6jd44=!C6|@Ba֩)L=B>E1rH釀w/K^WOUg dn҈DA#dx3.rF;.T9 ' =FztP[Q CmJ3vSBf +=8!#/h{ K]su!4}t@Z`gf>B*Lf` =' b-.q㏬>vpC6 tl/+k͆%$ctamf&/-U1 Ux^@;{Dc5w~_j\Θv&aɦ-5n9 @U%1Ei|Ek^й*WkJJk^ @-pai.UF;yC*#}dю ^v{h.ZTd#qnƌ3sGa 8HxCu~HBP ӲR@Ȥɒ^._t|I]ցϏR.&f{吽pMU\fSB jX)B4K"x=z:&/sP:ޑ-H//η '3M+CS4N$H@\B^M{O  ˇX ؋\3!yɋf4fy\Iqw}Ð3 %D?zki+V\PK XX!5/X#G:3 ļx:G9.1ƋJnz8iNYJ vjdIx"/O#sc+q":I~wb7G}{g&?)K^Yj䜰컆!tUw:_4䑎 MH;Xj=xogr6os{眹&;tj]RЮ@X[x+^ ^@|QE_E-[b MBJ$ * ("~d.j̙3K=9gZ%iWGI988}ۈ.g;ǞNIƏ|h:WhTaL*Pst0=ή*g|xz;wthUU*.UJY?Y]RG*|!*鐗(zDuWN\)8dviFRDN6lKבL=z.5kf+xRN_#nxĸ:ftP{k1lEW+(Nzg0 KXǭ]d :"-y/Aa k cSkzf_? 䑺|ƌW*Ktpo0F•z4==) R^%<eau]v+hq䃲Wy%۵T̤nL]lzuۖ W/7HtLOGN` K~wɚ^lWyz+6zuY +=t$]y۝diF]H:e,}48ݨkV&4^ gQN2vvOgIڀn=0wA]AR(bDIT鿦:]*Ct ջ#} cg|^?ÌFx:=0P UW^TAgy5!p. @R3Fl8ۛNQK({^ Wo]?cI$4/=Y!5iȌLaaGRiI_wP);Rι(>Nu~0} bhz }q'^d/ތ4,CM)/\MAeqLJpt~/.}Pz!QWڈ-Ire& Ii!NGYF$Կx:W._FM?~䶁Fٗ!C4Ğ𬭬ю _Y%xh4r|6GwF |ex '  ofwR)[hR)~qJ Ys( $ꀎ3;8H5legp6G +t-Ѽ81qvvuz,/4v6gNʨ0xYz20K`@#R^}[uTP ]oL\㏃OmrO9m04`GUS6xivu5rS0tFچ ި m3uõf cL=\G\`|Mߌff?zOg_okZ4}!t5Mi21@î4vB"|a<}u%;?ǂҴTzavD5f閞S^ZrZF4UX{DZH$v$mՄpn%7&,"z܍Bb[(80,~ưm+dw}QHzuT_-o"m@bas | I#FO%UdD||rY2F!df1z4StU!Ds0̫Uxi1yv^}`/8ûZB98|@OQ7 #h Q1Io MVFKl}գiu,[d {iu;x+}7#EԬ Q#&w:0R#FoTTH֥QqQ~*vkhh6`]'vq}rlɧg^ߎdߦ~δal1?EŽ; O?0Okm+3w>eփ"R,77xWis:0o>kOj ?'8왜Dg_ 1 ʶŰicaѳ(3h]`fr]ݶVK#1$E3(j}f+vu]60Vמerbl| A5t2>1֛-98Ipc91h.$kYߧF[0-4jRjY', qMIl+^|d얱[21A1dLj] {&"! $?{sBA:<3/{ Rw&;Np}(t؆&&K )*bn !!!$.pAO+gs(<@݌8NvֵёlomkGtүu}nm '1ͻ;o޽{ÝﮤYI}X.9eWby%#jA$˗WdE 8q -/n~"|t4wv=.&)2u>v,@B㗽Ig@wzm0Dхke++SYu@$]fy,E/ ̗K| d<'_so&r};#~SGNLOwgy.k}9;ۦӫX`opaƅJJUUY $i=˖!=22 Cy}E%|C)./0dv^ٍX[g¶LKo'/M}v Qn(MlZʺUe7eY J!_2XK INUB".2,1!RPתFAtz4tgX ]77}]kem^>*$5՛04VjjYK)9_*+Ri Ŵk< o%賲5\eneV5"E L~-s֊ pt`9LQ:6iWի^Gw ta0#0VJ^ U*u)-F"cWޯF(ZIu$uCmUeDa$J*I{qh=ћq'e"cŸ]^nƣ_f6(Bb+ҍVVJHf2QԲV֜-JĒx*;3q7ot!8:Ist{s'~i_;K=~hXBS*FhmJ*sX(uF$FF7VKOrZ'UG5k *%u]o?zsw` .X8 E:G7cRVB̙#N_ P *T aDh8ȶ(\Q8OS{nH1@aF(o)Hg1(]hd8=r|ڳy=c2L*N&.^< J%#" 6EN(inM,81-rc^4MFĊ"tMYkR\jB"2Q99yhvnP;%wv66vփ~@ޠwrhe12#bȇ!v•{lB@FsŔX!Dp,4,D gB Akx1Rwnnvt_ :>eC;d؜eW9PyN`ihOcc.&^@=P+,`(v Q sᭀ\i *`xa:cG}_u}v0 j f j'vPV6E%$.j$Hcg؞p=dT.ɠL;4fK8_.} `Nph; GŔ(xm>?} ƺosAYƫf2>;T4MKUsw:3cx$ QƱ =}-_9&"_:ufڎiҦd{e&QMԽ|`.T8$28́Qn.FHO99x* o߽ {)ž#[36J%&,V/ ںtgM !ɠc r}at!u/'0ƈz Ԛkںytǻ{E缽pPJJY}4[˨Fc B'ؘM:QB SPBJz8mƈ->g`a{p>=) ~w=E5$xo7kybbwkWuT\x|`C%W.BqBN#eN"q#Lbo3}KzUbI{B^| -:H\~xZ6Y|^ǨYk]%! =$gB BDoGEDݪ+}#K{fHP>Y~Qӵ qzJAR+ IB /38' ]ّ4IF )B%WyI6U뜌^ "aUfw8< t~~Q__fqxcB7^ nA]ؐ$U*856lY C5lDnE#a(~NsJu)!] n<3QfK8XkըiU {ԠQ57 8qJR(Mha# RDd'h) fOK9g2;`J2 0|پ.(kwH q 1 S7!+Ywױ%m46͟Μ>I~\ Y=G k#<}?׳꼜8m=-)8bKرWsnӧ~[1qIENDB`PKL\##/instagram-feed/admin/assets/img/balloon-120.pngnu[PNG  IHDRxx9d6tEXtSoftwareAdobe ImageReadyqe<%iTXtXML:com.adobe.xmp 4I( !IDATx} |eEW9&tIzfYAPP' 8GapTGMCCC#4; IgMrTܛ޲tsonT*I:o(`}Yg,m6-v%B&@ڜ.Il @$@`A   .T4%~([HLFR;(EdQpMQ C e ~"%8 ǔ/Jr nN4lsjYW&AI'*>гFu^Ig,$w؟kHk[ r\0-⠢Jx0Oo )?+ҔV`K!ήT|c @*>Jc^NB؋"JoiCSsBaS'Cr$g4a /ʾeRb|]S'wd翈!k9s-}䬒5u`Q)P90T)Iȫ)q e2P!3Lx2VӤ'6օ)GaJk}JrZؤ{ EHMԸdaskbSx"Ն8p$z4X"OV OWLm$OWe 5a<] eQNjvq5rb4DV5_i2]&{2IL9blIEFEm~`MB;-Pgֵͣ)3D)(Up's~T)b4J]G i ĞOMR9@xhdOD ƶ{)v<\ Cb1k0(| )ݚiAkOAϋ"/CQq  _3I4?Mj"noBa}{ x)Ph=Wӛ9~՛MIl9z&,Is#Fм 1}%R 4Q4,.fLMBSh9:z<ۖinV]"}Ho[+VQeQH]q2S i Ld(-Κ{W}G QYs90_P ]c. }Hu Z$.8*T;X} 4@$ =Єqu:^,lQzm6bM5"e&k~GmH u9! }8{.b͚]80$Qyy瑑;X5Qc&t$Їr~3l3хK_{9!H N\q6GnTL QDg:(qu>(ǵ mTa `H̥C sw\OA2腑3g(:>k7l|.+? ͕a77Cn ф@#m,p}/|pFISsK+iF g7K#Aw/%,߱煮H$shġבv`ksha@bS4N49o{jďz:x `ΉfZmƁCJ(y>\ck7Qntk-G]4@qrړA3?_mAe( 8{'3VNۢSc IAQ˳١7"I:qJztW{չ*lϞ`P%P19b#[4h^u'ꮺڏp֧A-2^h |B|Kգ li~Z6OiOQq x8֫)w}kľaՇS`zk!C@@f\pBv)ZE.~ǁcB֏  pμEޫV\3Ӹ֠UO C*=&Ftkh6H^1mp7ߗ#Qvj$/{BI$~& a5˒v{S6|dנ4;6Y,u!FiɁwzݤ_[܊m*VюfQ'j C/֏Kqjp_{ EC~Rp1(k]Z*SHn} Ӡy$tIg:{BDO=5|=M $8֊ h(w@ )qyXwcNݥIgCj"aRc[BOgCw9μ|ð"Pg ҃me9iJ5MKO3!QzGI= ;FBQ:=ȯ+3OV\Y,=ikNd>7+-{̹~DrJFEd" [ERhNn:=+ OU\FA U@J jI:A>9֏RQA> zvqc5#rĐji(V7 BMNk9lkܛwZ,S(ĔWD6Lb8wZ$PE ^8щΡώx;p✜~>%ߞk߻wJyLq!K\pC .ue@.4HȎe:d&5#׹r׼ܒ { `e&^VesnqP٠j7osEO nTs]B ֒!3RPJ[j:c!}.(YwcNl嗨EtKN*pE&}ys %Y.<$QJ5_/Um!]+tZu*ɛJVdXUt^w부/e}N&O+Z{c gvEYTH%l<ȭ|pTZ2x߻84<46h;w땆*dI9c-OASLQܹU0̸]Y6k[o?Sl.> d$P|ҫ> F]cBSs%I(/e_>^:%< VY)TKxIJfHyP]|w˧9j4͎|&yQS*`9M "T慠sS / +]`ILuάenq93M`ΆȻߏoޏD:~e>WA*]mH KIVtZYǓbeTLڪ"Փ u 4, Ibgkَ ́\(4n7|,e0d!LN{M]vNa n `8q; wtiB밃Uӽx|;-b @ygŽ?ީOhbg| Ά/v&G ֶu9N1<ު(Gr“1G[U 5s!̓~~),yG!O\s D81gA//¯k=Z*}4p7fɪ^%[rU(Ƣ_y_X1drRܭiC/^th850 bK^&:YcѡA*]l/4h~ש #)AoX'Nw@ۅ@+ǥ@?1n^,'.J}˜{/J c"$k ^{NsXT pFX.0Ow$~o!k: B =j:: za0YV\`"[ ^KM(׌8Ŋ:Zto-Z7 ̭mtqR]V{B)DxdZ.6 q}/Co[g5 ϒ[2D`Ï B@!ϐ͑+OuH{[DP|p ^Tׄv?4>~g+?4t{& ϭ{8HcAvm7Cu}t`,lV7r,DT$ HJtP BvQ1K:)0𫟀9]Ɇx}lN!pַ}*:Y?Ð!{֜5S?E/>bۑ6̵9>ۢIܟ51#!kj^aY:f ޓ+ 03it(?4ۯm⅋}>Bv ? Φ@QxCpݻͤzW zxYGiWgF-zZPr+~YܑdR= #dܺ٦\|-ο2@1?<*[yG=#?XפGz(VfpKM[ҮRڌ򶿡KW5>Yͩ0P9_}[&Uji$W1/Wh Q67H쥝3/fWzoa씫n!漡d۽T\6wSbUqen{}Ws_gUfLk挭\-ܭ:_tx?\P;OiJzQ~*vlإUo{CUtnr(2 -{4$1zg)Rnh?ڳeP={~6uٴaFB,}P/6 0--0CP߽[t\UAcRX[ 梹Tx@"bA&Νju*i:iFM۲=bNAo=,3Pxq +ߓ&;r3hU >W9wu Q|:`o^L hUtx~u2 ib !vg6?#ҍ0RVG; U0 ݻ)Z?| > /o MEau[S^pJ70vx瀐=PDGXUZ )7;&5qrVvp<)x7kb)mUOʹT0@8y l{+nO8{/dZS/J/k'^'fHPr#/x{ J*Vb?~bb^qԠ}(3@IUPbw3۞r] \uDx$ UR^|*,ä́fH##IeyiccySFNR4&ql59Nؤ%[o|Qbp? HpPa?pZwKJ ΐ xMHؐuz*!ZkԕY'kZ ~+hxb.ML(;WҼH!=3bZ0 )#[ȹ\W ue|e6B@ː UKS{z&EB@.Gwxb4ٵp&mɕZ L :/'pgԈ $^xE!$;l3 `U$B`M&7Dp84(5i,*pM&4uګx%ŭ8`l{֫`b`M:' !۞[9YDkd+QBʐHYVVGXl,e " ٺ"̇;}pUyg{\݅ 7a Pg(qEiVBBi|M{ &B;NzmQS "3\J>%l#%:F7HGjV?dWYB!ñS>mP +eT-.]*KO:!FTJbnC ;Jb_e| -GeIWjy?hMʯ"1Šx(v53a..zUeS0 lx PKL\lЬ.instagram-feed/admin/assets/img/cff-sprite.pngnu[PNG  IHDRZ2^PLTE@@@ڎ,,,tttê===ˀ888ک[[[ƞ{{{@@@mmm䳳TTTȋ444888CCCZZZ}}}AAAkkkjjjYYYF***AN jYr>μɴy\ ůggg97ǍtRNS% 3f,;TY!Y?I DfoNq8ݙu3ߎk޷njiyึvq(ۚ`Lؾre Ǿ}waa_\aC6ųpeP9/!1}&q hIDATxo@pS4N$I@*[D[{)!KNĩJ*@(T>00v< Sw[KkF`&ɑ\AhZ*ap,&Vb˂eœž\K_q'C'/m jjl PYO SjBaȢ&IR!V|o샯[l />m ٨ I`K-)u)Yp7d M!4}9;nɀP:O%A|CG2g>23p4<P=ù8´v"lgGJ1wC+J*DGVhS6\ĸg͔? ̐&fB-7BzC-FL9J aB@`"xNr5Mmڙ ApLv>kicWl絴 y:ǟWa4gClpq} {ړ8Y$zf4͘jr`G[ڹ2AeSK( 'ԧDT"P7&e0=14s; 5fC*$laXGye2 W@&ݘ<͆#OmGNq 8φ^3#Jx|ߋ#ڧ L^&T*ɠNZ[EqqQlR+ zw`-SG I  JFBv N@Yu8S93_lԂ_t Y  G+o YF1.âϧ6a5v.Q:ᣮAׇ0JU.?v\ܴ*-e,lbՔPDB<-´xZ(:[KOC3mrx {Xd3㞞,v;Ѻuv[fxfp@j6<0/YW{ƄH>xjo&r<6y0)qJ; П2z{An8Bޏ&&2-¸ f6E43R&qr2"0>c`L)Y)@hC #k&l% 5(eSR)AuoC#` Q8W!s}ڼB{#J0 "yi+zfZAxo0'%38HKeKp{Gc$]M /O: N2$NCT0K 6p@Lu&@[{ C=qbOLY)`TE4]Rd3BY_>B|8&pkgG MJ opbcj*?SBSuZL|+XƄPAw|`:ב<Ʀ6~\c@,ߺ2!RSp sFpV] N`oX8aH/vo?#9Nٽ1#&h6vls1$ˆf9NeC|Bؑㄹd @?x7_4৘ӄ@A0ă??)zi MV鈒$.̤33F< < $$zPc }9ti&&˶?k- }\ȇnT?̼B  p>,kĝ:v w~Duw5\é1pԂrp_ h7p <g;0q+ч-? :NQ`\?8P&g_P9[A;hk:\\?XL3?qtmtvᰳtt9X!>T?ykMUbC=t8S;:C4ԞC6n-uhp:DP+P?II$JV\@Wɰ]H׉q޻`#`dH*%٠D+sW)K8f1m0g6Q Ĵx^ (9sb᳼ tFF#7l%6h\$7|8-P,ҹPtj:4Gx4s2d0ymsesm,++RTh%Zz8Q:Ϛӣ`H<ǖ77cI(,WWUZ K#x%k.0 ncv2oRL*X\_:h{9p:`Mn 0lɅBEr]g쭀}oRxX|1-cQ2*eyKW-Yt5~?ƞoGD,i[YJ\ OEt bȐUQd2;q:-phBb*- ATr7QL`ks ?@~}ӡٵ5ߡ ]Nm :ThQ? \:@]mFtSkr;-ҋ1p8mU ~X'z;tTZoZ>p R^(oIENDB`PKL\y@}}3instagram-feed/admin/assets/img/support-members.pngnu[PNG  IHDR<?PLTEp]['"tŚzQ:TEA)SpI3ˡNW{2"ſ3-(2խ5Mi>'crƪmY`dUSaCL?Йn˲%sU8ϹG{jO?G{qŸ>0jo=Qs"j1uUV43ȃw{8ʿ\bq VyEJۊ-h7z~ܞi: 2C嘙8V}o7xf^Xz= hH4P@ݨxƇ1Rx:]MM~hѹVn_Tųql<؈cG Lm/ڛYՎE}q,2L W|"ge{,j8LPp*q7uRPFcB0 n5Nۃ[YSU1*Yr\. ,*BR@|emhC0DroQ>?9w^\(t?~Qi ]Ak3Qi [e_MlQ<PxI Y4HXXTр|O,/#VC3|}:4>~6hl% Nwb'3ʾDl}6| [MegbV=M{f\j7 c1ޟ6Z%&ɴh~󦆍ӰG^F!cCn>#e,oby/cpugW9\v;Zimm-Fy( %0A# di/--MKikeNBAZIGI II_ 77w9<&]T Y,ݤ7ڹάT* &F% f25r(h@)RR*MAxAXnE텁 2 0 y#sjO՜nr@< iUmo"P x,i٨.se&07Gʱ * E 5#Ϝi%&b$@LDb{gR+hy9IJU}GY?+>@*@;Ox<6O%rH Rhh;4fc-DDrLqRRpYngGU#YFQ@,199jjY_H0O. _޴(Բ5y.FroORq̸O>KD^KG>zߵq{S jUN.'f6I p@b / o.'"2A(\i}9!J <|# Y|ddd]K.mQu4ЪA"iab%// RqT<|q:YN=aDM R(DԒڳq-@ҹ,tA ȑ]PQ.lZ}RK-{k[k8|UġmO P$ EU 2|=ddmFJV} RHH. sln qaO2q-/e?v\ֶ',!AE"KhߴeИȻ(7(yTvSUQ`Fkqeq7rUWCD90p+laچh|e.nmXsuuf3`\4{504P{ 2%.kNuM<lͰnkx*"G6'"DN~|:2iB!9ZBN#TR|=r+B>mʈ;ŁH9$f]16 vw}'ys^ɓKjup*4 9ji44$9,5$((d֖m|mY\6a\VLU5qɇt駣ř%%@7DLM _"ºi"B\儋ǽG 8?559;;yTMZ:=30zVQFN]>TՕ1Z<:ZYY;zɑe KSL D =EfXN']g g"4:$9528%Gٮdu-,XWt,JbsۛKM<{HC1I [Z#񃺯$C;٧ *,6!)8]?w ?*%X{>99;ńIh%ߢ#d2T4:;TQTY\<4ddr %)'glhZ(T3Z/ZMKBuvvb`q(<rh$8jEq5>%{uvwu!N߀`Awb*픓 H`XԎ&Ḿ5BtJilE)t^-/k\y;UwjU+E"֠"++>t8,D4>?Wy,OV .SBqŋmlӈf=ϕvzJ/[ ib]>v17>*us؜̹,6ǮbΜ0N`r̍FZBKmZ(qRUhi2yDjHiK.~#+,XblϯkLݺn%ӎi'='HԾX 4EUUlJjuRD Lfڑ#Q .9d&D& R=]/M =r~o{{',XWW}U~l}},`+`12χޠVT"BWG$I{WIhF#8$%<9cdddI}hjld2/٭z[-z-˗ ܏ի"vrS"+ h rjy V{Ҹ{WNL3y᷶.)=I0۝Y>~}%#XfovvNT:EU ʙݝ=A5MbPw<i4$(ſPZuj x($09f-t U11111G:QTYg.x?bZ5N#ر̬> | )Nf@_[S PHHt1 ʮ53DŽT97L02_NȈJ,iszz:XM/8D4@%AE"MMMMWƥoOftw-͒-sxc ͑U&[y]Da!B"lQC:t0SUbr*"`;[eeu1M/8$<8X8⸪/艏?Ͱ^bf4ݰ- -^ܓqh|Yd3<01ryU~`\ 8 Os8dQ ޫ3sNB%Vf??^cRS00cHMY&$TL$LǴ@+@^!$G@-8ϔ׉qqg)mLg0ѸAi7y omvGah3kdT̰i "$+)2$p/<]bPHhu8|Pb?%Oc{wf\ P;N]A^HJq%2Қg5T"PЋZY, %;փ~ /|ǢGl9sNm}6bh6;nz}2+.^ egyb5N;V@ D[; %d~a HT5WZp8` Qt[AetaqL{y\2"!.33J%!pyRW'azK#o!!u֭ۯv,_bSn9 Z 0^j l ߸šAx{Wr2.ϓV'N~%cd~>RRR"`ƨ#p4uy{ d}/u4G^*<@Zۅ8~6AV*%&'B=B(ZI*9kuU`4ǔQv7:f @:gY6qm-p8>Dg&O{BIK].Օ;#ܭ1v Euy 4tMpqSɶ%Xā t긩TugU!jzb8(9dGߤ@W|6֌8qp,ss@\g r  sY$!MawF#"-1 _|;cV(Kc?n΁ 7 ӽ{mM8 +!!@R0RكgϞ]- ak?:@Bȟi 9b2fyy7/@@ڮhGfQ&PրdwQ+CCE].a& 8 8Iv2E?wB "Hj[b  Fpxn-U߾ʬnѫ p0` @'`GG[7{_oDG0 w" _gozug&,R?H )L̤(^>W@"[E%x<`u& uC w[}\wk<=s."bi `<Օ5*^W2HƕZ*"Ð\Aap^;`^hGw wՕꍛkF{Y}Xԟ„O>]V֣׳s}h}w}(ĸ0fIENDB`PKL\f0instagram-feed/admin/assets/img/youtube-icon.svgnu[ PKL\u-RR3instagram-feed/admin/assets/img/sbi-exclamation.svgnu[ PKL\|BWW0instagram-feed/admin/assets/img/reviews-icon.svgnu[ PKL\]t,instagram-feed/admin/assets/img/fb-icon2.pngnu[PNG  IHDRW?9PLTElljklkkjkpkllkkklk]UtRNS`@pPϠp 7IDATeW E'U/v$ z+c_0rJuj_MTOL%Tl7M': 1n@ylG]8QOi PKL\}pѓ2instagram-feed/admin/assets/img/instagram-icon.pngnu[PNG  IHDRj PLTEE?"t7V4X;N/b J7{z&o&n5X9R=L@FO/S)@+ctRNS`` ` ߿``0p``PO Ͽpoooo``P@00 Ͽpoo``_P@ @_IDATUU[Q50 vwР3t_|t;PU 6~8~B& QNUڑXtrnL6<6 K<&@w]VÒ`@WrAL?Vv!hD뮎v"42Sd,JX_e刟pf{wAK'5x,f:*f%^ PKL\Ʀg""/instagram-feed/admin/assets/img/rocket-icon.svgnu[ PKL\ )instagram-feed/admin/assets/img/stars.svgnu[ PKL\cȽ2O2O7instagram-feed/admin/assets/img/social-wall-graphic.pngnu[PNG  IHDRp(<PLTE({:Av.5|@H!-ؙMU?9}ف^28zҬ5N#(Pa[c qP.\m^m*Bo_tfRCrmQ4^QTo6u=Ty QsG=x׃,.9A.@3ٶ|iaɖ`ߖbmGwlYuTF({WS:lxqDN6Q=K$IDATxܝKh$U34,]q,f=Nn\U 5Hv!$;< t_>d|ߢWsnU?RU֭4|{Ni"xFz{{olU R:>>.Wv!~P'FxdrD5oxϯxbn9_^i)qƍb6~?&h2H{MA}y;)h<͛E%r4Y8bG:Eބ=^:z]ˁ;C.̏pNprTֿ !p#9{*āNfYBG+p?Q9]0 wNn±pQ/tLJe9:g*KK鬊pdf-OK;*&qppM:MX_ފ`o8p q*SͻXלu+(ވg> NZjMECWP/ޚftoLgAҜ $2ȩ֤Iئǁ*h:_SLtEQ.ΖjrcnfpJDF.֤ug+mp,I5yqcq\i:c5)epze4ޠ59L0֤kY+opMvN*: Zk!p[:t&[:p7$P'uqu6PK;֤ $bA34t WbtYm̀]KU,ݜ3.ȩ$rpFgٴ7]J$QҥpNJkĬ '[QSR*|o 遣ьJIո 2cp:slb#Xk|<ËaFI ZrtJ;(tVg'˕t9<.M7rn,!o0 X&Qlt&^:td6LLr5* a5dyUteBF&"B0|䆧 w}WH)R'WD9`FhMگOImMLV#NCač\O'HpI'k`u.pK_Ȧ == IZ:0ҕc]S= pqCx;ښB r5)=ɂk|PKkR36MkjAp'!SZjTkR8kTdSB"8wVt,%3j`EQu^x0ia-]Awgip¿jJĠk5Kd[Si2.mq$ e0BiN_N;m rzkRXQl#ϒ%ptW/_j53n*Ԉ?CS.Newفݚg[S@$5)lk#8YEDe%PD Ŗ8SՋ[ xS8&zҭZlU5)G) )M <[UJCkk*[yûre&`0m%b &Bv>ښ9}Hp$ ʧ2Ze΃7ok%ښJL&#R*\;%bi* l0.kLSni[QNԵ2٨'pI<܂OI$޸˂T|Rqg%QHra[Sҵ'ok X*HȦX b9w]keP[SP5݄^)O/^da(I/t?ptښppQ%jh0ky&U[HI`mMp7om<¹b,"Gd͊ni.˲I6Z";{.?F^uj`pyIZ:Œf "qOI8j`] w V pAs$Sn -!l\5(J4RˢfCNAhpA|OkM :pJc׎oD7QjkjӆIqy2Yu^t2siMke$C",s-u-ִy5(Sz[Hv/gk68m_֤hAEl iK.jL8o50 F8loa.=Q&d"?pdW&A[5 " o1^ b_e,enf2z|mK qN  BswÓIy8)kPnQSZkOJBlk*ޱlU9teB5Uu 1Hk`oo GElkZVqnP7qRbģ5׊FnN݀JM:k`jk*inݑR?çV69rWi]Q< X 1W!ᬍ\7q 焮^[ |H?Icu-A[8 p-^K.IHNokZY~ N#-QJO֤q84tIX:-I[ p?m ay,QQgɮuۚN'xC!$jҊdZi[55* 9@BStx6puՊpH\.ǿ{Вd׵87ktHXu# ЁӅ-xOAN&QQMI*ҤꆞK[gc #"[HW}Wxf&g&KmFN@55 06< YUt2*QH c*Qvjk:&ub|T+}ҶIok*"u08Ο?m-Q. @#vKtMMMNv RGSRWhosnAM5Br\\8aLmMԚRc 6;q.R*wZϝ]ڔJKDfk%j?s\`fN9i2fGU8b.rwp*pLKwEkjtTFc18rx `S upۚDkR445j(G dU>,'14!rDML\GXښ0 >pdn*MKR0rJ3'J*3 8Xk7$t)E.DQN@F0:\2}cIqj ?fp5%sC3GNhȪs厂HKd>$j`KV%Mt bmM+ZE#k89n9e&G 8%֚pWώ>*&ʮh( FǙӤqQtm𔪀#wd䔮ҔY,u.8cyښ DJş+r5XAFzRYLVhɔٵ]} ,ݽBpmMAҭ"4tTg׋'957`t뉭7̵to8x][߄aV:^b.8>t'ȧ04A1愆hjS~6 t;6&}[[ Y:/OkjG8k[R?R5B YӡT^*t%mT,FۚjA@̊ )u@ESr9'm4`3nlZ밦6Lt"ڟ9\F]ItyRTe Q8Jcl~魅ͩ7<8pon,6 tqT=b4nNƒKP6$CcBySj`y+h4KmM96=`U 7+o0lR RMKpqѕgt加n:ݒ , ykMt$'l@.r 5m'wvzN6@)=t' os,lmM6,;&,ȩ3# 7ZrCs3!!ȬZlf1aZQ.L=z&X:4t]&.E~7JBqS]yܭ1hk Vz}oje 5ٖ<ƅ' \__&ɿ=N]`d֭Pj`Yn[/,§7vn$-AH'K) s `NwtځZ|pj`<n1.p=!xs7ًIs홼9ݡ{+v^2 hkz=8+0!p5ɇhkKZ:Św&6RO U3C[00ȁ`5>N7^If EVGB#IdY쳜&׷tt9&`Η_|9ҝ,]q8Y׺ ۚ?~ suj[p8ck :8%j"z;aNo5ɇlkz뇤_vb]9h裩&hpD^juV+t 3y(M\x{)zښwƁ8%՚Cv?T߇(^ ZV#z6Z>6J? AW~Ъ]y7"fj`%pܟY_a#@cBˆ\877MTm߶LߠĐ#G>KmۀI>`[oj[&~ .W4cIa&]B䒁 M1<NV9"`[ӿ"Y"ݿ[!ܬ\sSf.9 O ͊ [ym8٥zmM7ǭhM H>_S,G8ՙHo 7`rHrSlnZR}g"`p-٢WKěNrCA\^0uBЅ E +A`pTB m RO A" > lSHE>WZU9wnNfL2ܛQt#?s=Ld3[/jfs7pu|mY`w Ҵ JRBCZj s-{&n`nSHxK$TzeqۖO]ڶ դ썕&'k-~ x#v M"Y5T" G 8D_67eo:q2@/npKW. nhcRpTWt#vaE][O4 쓪3mZj^$v\E}pJA_[VRK1lJ6%T*蝻o3Ѽt8iq`p QG4 }YǼ>t&qӵ̅2č*jL30h!v҆02W ˫ġ\ k⾍-n䍁C֘x{_՜x*e`o.D8ϵ"0#j J^ (GI-7ߊZ:[L8Jl }mYŚvpǍ.~I8Dj3:\ЁpuBܔvhRk lޑs4zY8kҾVRe[4&-R$p.R fT2 p ޔ~E'{5C2pXPqc1pL c xR  NUW5Lf 3jMՎ5{pp+U&M\@ 8+*xTJytѡd&+S.I-Я.p~T `ܘ9688ǚϩZv2Lw8 f`ReW[[bMcWY_RA dvı|3N.Kҍ>t㽕z\U;s-6 ["\x㹖yqK7GR4IoCGO,) yHMt *$WEm'YU@u ІhZu[!dkG eip44DZ+Ɍ&Gg`<ע/P}:+ݖJCplF?ű+HbUL8o +헼\@sj nx [$ g9aQz)-r̙<]Ҽ.pn֚kk%U)WT#mXO#ufk[:n#V]"@1͙BI .o'}l| h$ge wwCa]<냖m#X2dzz2JåV&5&4zñI˷{ -mgזQ<30l@( ç%\yDOJ/Rgnpz%Cv@M_k:|*S1v5D$mxC˙}hqqop DξAѥד¢pa#Ûyg=ĒyѤGv&!p@[ʛ#N&Z`pזґS18 Np8Ѥ +M"TmvBG~q G{耳O-lIP;\# X/("8呢E׮߾ c?.naN('@h~e8MZb17_,:q-NvnhQ#ѽ.7K;8ܯRySp$OIzר=~ kgdܭWU8&YTg*Ja­Oh&\[ѡxc¿`dMr唄<+d{w-nvS[>2}-M]0f t"Ǻ *x"0"".`WUmuutOw=~ӎxz_MJ8I7M5%7F! Jzӗo?p4T*p-ܛNM !9A@ dRLNۆG[~bZ_^݀y4 =N8>ѤepBx0.kXOH$7Bwף-qZq gMl;4p8 YexCo+-ي]ϗhs-o˺uLBnѤ_hRA6VʡͲoX 1ÖdCM/_M&#iQL5с B4IZ8ԘF"e6ׂ`:@yշz- Iw' 6'$mW$a =Sz=whRFzo$]DsMl~Ѥ !;tRp&e&{Q$M-p}l{r \{T87gvx%Y08IsK\9]i zrcFK8[-\yzo"I`7$Ӗ|-YM}4 .Q링0ZƸAvjҞ[yhnΉM Wc@T4Zp!&.VRb\ێhDl%t޼= jEA..qz8fq;/Ik7:(-7{Zz˽^5dM[uzMb+'A@T3\`"7 [3T:!y&qWj 7VU4Z 3 0Roj#'Ѥz-ܨ⭨8zM4 gT5o zsiMb"H޾}W=]U4_R8T#6 mۢEsMBhP%}}M{:MLn HKZRmiâ Mۘk1o, A:6< W8 g2|ld8x5ת8RyNnK~QhRT wo8ȣжz-tDEDS.R.⚖ ܈7|GZA$.@tt,]g`4*i G. =pTpHFrhM*y(qA &yt*D<z.w8:̿2pMjg pCD]YY:=o͵fo^:8 o3쨃;zur?P(@r"K &y@%=~oK)7-dr[Z%2gV.Kj|4˃SѤ*3l\8 kJ}3J-tùVclZ*ugk$T6ne]f]5eh nK[F ~~Bb LmJrX)3TM?5-"T4moϷ\ZQQ!hSلH,I3:8;dj[tG'[B`QĶp_m h~f`w8:FU8CDߝ6dQP"7ZQjewuM*IJm[5Qct406;&}*x#uGݐt[4f Z3ЃsM*YG'>tM/v`d3:DVɛC)$M.ha ?mT|jm*']GWvd=-^mvphI7BoNE&,`鞦 hiRbF6*dF ZѷMDf$Ś!4{&0qT䢌[÷Y/ pY:$Q[[5J}|9T: Q ѤժM nfoTb xllY:&qtXatp~m2fqkvn 5qi>-l.qqB]51AE蒥 zsgε?N?t4RMVR:#ƚM➪TTgo(poa.%e4IY8jR>&juaF$!ࠓvgkB4 Ώ\0f\ܴMWp,hRɧҡ:A٪`ȶ bMzpvqvjpaXXv4Tb-i ۸]ЅZU-;Y:30}<ƭc diPI'ab3g04{-BѤLezM*ZrްaF8w#67_RXp',ITۤoѤrǚzMpU30q" GMjΧ5[8.4g 9\+떮7ѤRx*aՁ08.N(6=Kk%5hҙӲHpTToIzM\.JDe*ڰa2i"G_}2pQ®U똁%5@7@ CopѤ[nϵ6WۀC4 꼥N0"@}4n$tr$ -E7[8ĚbI8930՟^rgqNj{=oH=pl gnT¥oA/?AMTua4s|cM&9s3Tɓn#=c߲ Ѥ6JF4)BL&-Z_5!K*sFRh+~5SMp&eJvS!}\9NAZ̍%6Mgq9B؀޴xr]M.x徽Ѥ[%cp#GZDKh ZU58\#\ ˳Ѥ6+4bt!ִ*LQ=⎆csrjZ\&DL3 -;v{~&t56VJ[lo`ml*)[ kOQ@I1h ȍrZ\S u4cF, u7M$W [c?'-hR-;[͍X_KRôBsS`n[:3$s-NTd7$]7(_K]hi@ VL*Zӊ7 WI}@-]xOnQU[TXkYZ[E.z݀Lbuno&pJאwAK n)^CEuD0uv; K몕#܀"ѩGC^_{/j@X\_s.1o8jQ]grA4iq{MxsDoҶt.=5t =ɤ=)?I'0-=.q-ian-MϱŁ7zH_Et39r_"j[Cu5r8F.FnZ:Ԝƙ'A cJ'JjPO!)7+d/ ^/'o .ܥ%I 9\Sfgi7ww"H ʞ8)Z87hrAp>ڼ%,V38ঀ\XO?Ck0$4 ^OhӼiɽ,ߗ_~en֖.?&8Mډn'Cҝ_b&I`qJO<G~%p,z oM˰8b7|E&.&hYI5ݢj9`pO3ƍ??$j.LǏq s(ĉeGuIEkpF+jHK>)br8 z84 g%/Gd4np8F:8y8k+?*t@nA]{ICG28U@>8uClMֈ5$N Ts8%zmuݞMphV,pK7 5qK8R=˳=rՔ;qS_ՋFsC4+j^n -@ǓT8!A[8 n Ih0y;qCI4lV:\g@c+Ńaf Dz [:(5#挢̍8wgoLw 86PSrKg?0:X w+I =bMC'g%jq$XOQ}{ݐl[hDh"{U1'&' IpI]: o5-d s.N@5awwD5[@6oX:J +ԋ DƊ Mu`q"QS{Ku~\_Xo!@}@۫ߦEۻ RQKRcMkץNqV)TT5sɚNf34qЕ/.~KCFs3qŜ^| is#Avȕknm68%^ן_zuM*@\hREC!tjaIp(X5lW E4׸vGS'Z5eor& hR=/"1u,3&%8˷ev@yW3ۛ{8Y4E˙t!T,rJ#[΋_jvc⢋jSI Ccؐ ǵ}Uud8[5meȽ,]T-6H"\e!cފi-:5X\eseFX InPYmo&_ #ı&{{MyvZoO6b,E{9Z8x'xPe!6r]ܱD&@`pL\-.o޼]fϝ2T];fmX15\gJEZ:g9)? k3ք w4x; IVwl"}iݾySyM? 6\.IL8ۢzT.ܹr7(h~t6-&k*nQ&86Nj}vumɀK)Ş4?Ïˌtqn)U,GRK׺pS+T7cMiZ )xRnߊ;wn*ݹdcqq3* =B jx_uAΉ :yt_/V66vnlm?7%nq>.QFsF9 u{˯k!7&ȵkə$č.;esS$D1^\ݽ w<ߤn3ܠ|̉L*jŚ~DpNB77Ue4 nѤ,$7(_"6u/XS \CWWN!v8w&:M|VagZt0[]4!XP|ƢbMF4 c-ϵ_6@tEea`ZG CJ>2;љrWTcc|;rEC%؉&pH pGQ:xCMm:\8pZeC{:~e(I 30nư<Ѩ:tHCGOI8丱DLNZ* gX1*牷G"\n27[^ ʘ =N hk]g/WU 7{kv)Z'87pJInom(C+Jv[SO -BɪPRMZ69*tkBT"NST ޲'J;폖؆\Brcgk5hZ@jn )p,&SoڔMI{W:IvNCŚэE@ B5տ(`@*,0%ީ* '֚YŭbO ܱ+-D@!4T:9+!YbM+6 -f8z{kh(%s +݋%Q҉8,V] g`2"c7s-)^S UT5ר'Fau' E!m#0oiB--]7,q4p&qG1ݭ`Jȝp͵kquX#G\#ĉT:H&%uX֨hRD߫'Z\Jp5BljWXԐ־O;OtTOy~phҎ,z]'RT%H'"ެsZұHY\ &I )ioGbyr}Ks|kpM9QpCXkҏ"ĉQK4SdvjQ8)icd[C&5ʒoe_3q|E/Rq8zdkr#55ujN?1-Q~n5aVuZ:jpG~6ig ('XhN"3ŢHijZa(8g&KKZ .bgu[HCn Z^>k*j)4F͎RERQ}npΧFgdFNl뎐Z[7bcM8,N* 7gOaR99;bEG >yphF>nƚ 0p}Z8Iu ]3Dat!E7n(R88BhW`roi5yr\sY\|3;4l>g&sKxɛcX$.&ԨnU@5O|\bjH |l8g`j|JRQM tK p.. yV;D:T`Ù!#t^&oT 7Bjfh#LYREh׵yuκfm >亥0N#7o8c_48^久 KlE5+u<qŹߦI!p(+5unh Zxst}5mi@ř]\_nɛu]AE$Yl_^宼(iT "뤋{,8RG89o$տp* gO7}) fα3o=洸-Mrrv@:@UPQ$JduV7w<.~okYUywPjphRrJaXSui4b'og:5;Ԥ>γw aSҟ6:Df`}n>x "!%ujtwwD("o!o{qiBn׸\M2)Z^3FSQTcim E\m MSDhs41T_p8~d |}.6ʆ?3Կ4U{ծn:I;i)S4-%U)8QlMo{CvD^=\i˵<@Ehlo FD*PXӹiWS;az!ڥ@ ~%PS FQRI0K5槧mF| _9C4o޷7k\Do#ajbrRXSK9r[!B4}n N͵rP"nhN ]J=5&EX ipZf¼ #uJ*nto:\Lg4ژM\Gqw-8k70p&Ě2&1q-r7O/aB+|eepmRΐ.ƚk(._fhqZ wW) &uJIf`Io~=j pC:& oSk4T2˚%zGU>2BQ?/ p`=+kyiJ ˚>g@YHpW9*4i0ABٓ'^IFg2jԐQkMF!u[i_Jm޹U>Fx[ֻ Ḷ>b)NIENDB`PKL\\(4(46instagram-feed/admin/assets/img/oembeds-image-1@2x.pngnu[PNG  IHDRlف pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F)SIDATx}]uBB ?.?}RsC͕JrQc(\L6H7BII{B {4QM-4!x0`{f2 ^{g}y}֒f>kzkBxzzzzzzzzzzzzv^Ft`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`l'i-tkKI]k暭[n`Yu԰l-ۓۤmHou {ϯ)fYYk)۠xo_?ݶZƾgA{߿o5\S `+Z,) _[n?JG㸝ǓE_/v;di;z0 ˏ_ٝ~?`f>h\HV-pcIWNa+ᴜy?,}X/LNz", }?kHѶYL)NC;QlfvPK?ʱ?-)r)n߿g VR>dm|pSH:UHѳ]FO:㧽2?e~uNs}Βqў]FeĿ'uVNTJaӨ5KШ]Ym X<|Sθpviý@U-k%/flGm^ϭw ;ce5E}?bQOrzbg-GU:+K@fÿzE=a+#1uS~g|,gE{tV+V _f'a6ZrޝrAjG6[25IeKgHP޿K,r^9iGo_;­o#wʻDj:PnYNqgy35җJ:;zY؇^:#&nJa΂[xi9c[J),XΛ~n9jg>uKJ)aA"S{f߿[1HU cV]le^V6Eb־ڲ-?܏KI?)֩g,hal nkZAv11i[žKx9ܶӶcz}|_i|__UXheVHv߿k=|ZmzݮTظ }4ߦ HuCHØr->2w.KqMhbUjj׭;}LtQ;@>[{j)ЖG{M; AvRz|[&K6̕p?Kk&~4m( Wi?>*wpĥv^֖IK$v{xJ‘Wzm Lv䖳a{&TEj;Xv`QqK^;!G?'18}H߿g~SOv?͝*9oe|'~6>~1xzzzzV7ϟ7޾/U }7|KO } ; r.1isrrAo}P+Eٝ911eEgm9E-v?|[gwCO|WN}x5OOOӧ`o Ĥ2%Zŵ>>>q?tݝS_*svvNHa\$H?K鹰pIng06vo3OOOnωAX+6Yg5\QyO>uxmf6pyzzV!sO}K")qq*mZ&I7<=Xf6~!OvcNV>xWشe{?|PaӖ?}ΎƇ~o³h[I$׻9F:yzGI;dشe{OPiiow_|UahU VRa+c: gAO>l}o?}Ζa`ۺu븓|lݴe{G+?zk5Xwnqю0 HbR%MGbj16OM[wSl׭ޕ;V=lll>_s``{}nD$hI_*)YS 2V%6zFO쯳ѱe9<^Y_OW_;=wTa H<=[l*|v=tGDREK"ۦ}'Ѧc Mk*+]k `{ViZށ<|-w}xiv`l_TNP,Nۿw`~?1xXO[%MG,m4N}s`lN>Ndϊuj֠6?|#)agK<=[lu׀{:mkDF{}W[l#`;MIa6Oan'%]vz`0<|-7;===k}l׹=l0'J)爛*otFn:B5Tr%RY$o |pg['[g?P:m@ @786O6I;z5`í텴ﳋ?,-]]3SԸg \ S'Z4:|ϒZϔ52쳩ccb+ \al-iN]Z'ξ&["vBee}#d`\b qXb=lR?gg`賤ڈI)-|}cm?>q@O6O0͝Vy;cVlR73Zڮ,FUJap3^6O6I;pJF“/#O?Y6SafC_DzzvQ6 wj-?Nu78j+soTrFR?Dl7XQ `;?q';᣹Nn?=0{PyiK"Nkxށӳu[ߛo<"n;+N펪,yK;M ڦe)J[ggԠwBVո?v'1\/m(lJV<=o:Iν17No]u{/޹V2/*K$uUI-49FO[(WبvюuP;=0; ;Eғ|WN9yz^m=7ɾ8]"%Ho%6AuZ]l9zJvںvr?z;dvv}+q'ғB ?|6P/{٦bot~㞏:+ |* lxIJ%ӳ yǝ][r6 gT]ZJ ?_$7|ە6^]HɄD`Y|0sکq}k6OOegbき㮳pTtZ%V29`FK"{{{MG<==ܦtMh?n_I`V(YI]aJ"q$w`J"9*MeÂSM7NY6'Vظ86OOOOϫJ}lTɒHVRH߁ BRk =l<===bWܸaڕs5TeX胳=====I6$ҍG<===^,RVY ,-_8OOOO++gLa9Fr6?V#1 \!ʆ/{I'6*;Mr6xHMWwt`x-5(tuӁZ݇װ+d-fskgL #!<====5`8Er-^6NV"%3h$g``mq NQ8P/\ <====9`&#́3f:Bm1t4Dzzzzzb`k|.;yzzzzD5nxvLGHiq&$a=l7`S龒SPl%ӓ62jMH$aӁͪqRgk)%l$YQ\DzzzzzZ+p`%qҢ鈧gLa3hwӁ͚1u }?6OOOOOa%04æ#kl4_dR6OOOOO ;yzzzzDJòSdeqFA-Ft¼pqqeto;OOOɩg/yk`QHT%R*c83.-.p`t:D NMMҘђH:43N6a`5RI66 lrH o¦ǬF6ڷ<<<<μ56+0[Hu%Sdx<<<<ب;$.v歡SgC\"tpNyBPWHkMa3DCli'7sЁÁ z8;6aЀMrԜ!$2.Ľk T3o  lHnh434K"=<<<<4`v- j|Y_k}^z}Nmm܆S޲ ujY޿m̽o}(o3[g->klm\і{Wج\IfaZ(]"=<<<<$` \H9MrS )1hl X!z] -`y]e[+' b s{NW '4H(Fpf#1`;^amDZRy,rE!98Y,jQ²E%n I2بFysV9&TMjسʒl8u T5u;(U-zXS;b-`bp{_,vPtRzG" %'EᲨֲY'ީ^l)\gT)Qo%\$V`[hl()SS@Z2i9/bcY/ާ|Vql1^V[mXvl|I!{zz￶SK"ccJ5GXO٩\z[]4 vkhvo #I u%)lTpnlyxxxxP`!9N( n=zFo>˿+&U ֤9ҕFTNS<<<<hY$ӑɅBF7\uvЯ6*q߬N5 ,y!BUK"lIa H:,SKEYpPp//I l-j?\)\倍ذl7ЀSӨ.25wIyJv;?wxzpd+oyme׺]_uyun}+١lפm;;bNl>7lҪmVœf:R9`ŀ{<<<<<, 6_6z N`;`l9(/l>X^P@=b@D HX1-0(APY!N@jYnczOdn׮`qee*98;f>MwC6~1\8SbR֨fa *I_ʚ65Pz{{k.\ sפapdX^^Ί~[lQx US YT666:lTe B,=<<<3sazf.jJf4 }WDb`n6OǁÁ ami*tXXoǺBiŐ d:B$H:-Tt$6Mktvvxd``pprrfҒ>MmYJ"lUظZPnI2%πۚq6n67fQ㑮PhhlF L-iQe`K2IlQSBUgK-郳=<<<|ok|Ct!QsÆfDrg `[ 憎3? %`gOt'Q53iV[LY` _glK?;j4熎%H:yxxXMJkZ+6mI=lCdHU-M[w}OޯM[@#@GυM[? \×[2{ C[#-Wiz<h__G 5MekW[OOԤ8&dJ[۝; ﱷuB[uOwb`i?֭[7spkw.f057t, pydrO[8vx;f RFJr*+ lnO|6ܶpO'I)G<nvwشe{ ?Pv>npx(S~rT/ 3G}0$ n l~pW <S|^R;` ˅m {5ԶœcӇWp}or0O{-l'xM))Ub=[9+ep`sw⋾t`˙-k ՕlVR{W w|tg?|0O@Ol !p;]ˡ6+5Saq*78;f)IGM[}p-޾_޹5f -y_s}Ar КǦ- Cãe?9~*ڭM[;E\ ?\`)t`aݶl-^(Se?Ⱦ:|4>;!``؈Y.Ymyy9,-- LFZY`u_ φ;>3;v<ᎏ |ត:gpGw?_{>pGw W{>C_zxʨkAgK"e)W$ǕXݠ >{sJhvJ2˖DAhbAϿp0r[osj7i /K*I4`v_\}OK%~`݅ fx^v7 1m ǽnz=|~ýc=r #*:|x{7=3nnvC:]/_ 5tDRVVWrUئ_}1|{V_{bg h0v╆l w|tgpGwm!dh_vG2``9X3Cm~ֿ8-%[ ` %fI,8'D z]/}`9X ᳣L̆{*:b~\ZLaΓk&_ZOXgpl)Q=׍;\mo@ŕr-ѡGÝ; O\p;,YI$<h VZ]/޵T`~pK_x{>^{bvGppLE joww8.ydjsyxx5 ظ9lRE_(r.JMG{j3_/ItY=pk秲޷2l(x.ڣb:`ul֘ gGYEz#ח{ l( ݻw߀6\,Hin$^剳‹c{>οL${>cGxK$V axf8رaPC݆^zxx4ؠFCˍ6 gKUv6#nplIs?vzf6/fehP# *@-O*Wk *4h ?P5xbNRld{V[)K箑wpzذ]æ#aKu,öZ' | Fo;/}FTypz`0+mExl +9yx$K mog*lwp"9EV4hxjs|1gPa;w'KjBYs|9 f~mMUzυ'?w%q hvb![7 ذ˃_ _txrsvmFv6J£ i8qId6KJVVar'%τX =g5g:2F$OG~v޴_qg"Ϝ P l!Le{>邋G ƥ*lʹJ")Q.CJkHU\"[ l80A徜e?F 0BJaEx)&Hl`xr%]M%]&)k9# G*l l=Oo=c-̧÷v;>cǎEgIǗ>pEm;vxر yuH_$7HU%+ s-l]"9e K-8?9~lβƽF=~d v@ g^[+Us94`k l3b}]#M%ўvRoBYWIa"pc)#8l>+wvsCrk.6,F%Yӄa9n68/Osf.kpL1pCY! tgُ/5.Of߄?8ЇR,6N3yu}}23l%<7xfiO ^l᳣oY(쁢yáG ; `6mG{@Mv8Ûz ޽q#R*[ ؤHPϾcGֻ67t,/9yxxh:AVI#D"TMazFׅv+m6C²@&3炼7&a,_+Wkq) ?uu-<];?ώ2)5$rzfgSSmB%4 شQ6 vrT8}f @%2Vz#RH\$s;a!!R<<<$`Ӭc,`ӁTi\88:A\][OoZP6<\90xrshv4Jc%cOG%̕ՆGáGs]g^?9~*[{Zu ێUFN^n¦}mNH`|#/^)=~<~6J£=fds˗6Pz{{۲e tU''}4RXiZ+6(Ӆz׾wL&D6[igs`ׇHHSzVF)GT)T8/Zj¹Sae~¿ 9`hN58-v l[lؤq6dszfV*A{ q~qhgϣ}YKlNaxV=_.n֨B4> lXA;Jx3nI_[8w*\^atlaѱpca̐z,?q*q6g83.ãlZ+I吒HWDrꚥ,ravXGUAM7 P`0LH9lBxV"zؾcG?F8GR-eZ=#gv{c{6|r~6??}W wj/o{:޿ w?u޿<<b=lRVDƄ"-\WH<66ZWjOz†5NaX6^`r =j\'l'ZXZ\\ SSQm_ 1·ˇ ߫-Dz۾lh_<+ePnl5YA 3fX)HʬІ:yxxxti傩cQ%r7`0۲e <6TƆwMmii4YX|`lXx_;wR\"JvĩBscOlʣ}*pE!s 8thx_>c{6pEyjbŸ0x80ia`.MbP%IؼãLy4`9l-[n-vP+MvWp57t,x%70Nl4655$˕7R bxl߆/_g1>:@e:DZ5 R[(lؠr7`HnAFWgQ->j9F$gK38*r2æTHUPE[JEǚG7[ #Dc$=VኁeY·c`@87mE9mw 6ÖLsu%,|]T56-]&qlOPŒHNZEtn6+$fH:+AI$h~kv lY4У}kpI$æs뼺޹4k*4>V'<<<6,: 秡UVb%Sxxxt3\-},%02vj+6(ܲe o2f))hকDZ_\\^.\ \ʥ[j{xxt)l4Ū$f\IT"]ahugfýlشe{شeH?/m/74<>{rOv.c¯z{شe{-koڲ=##OkhW4Xd7KQ٬ YEmHk >XfAɐi<<<lD6 {zzƉQ;r.1 SDz;nv6@55:|4@7 8Hï,;w>pQ6G /̮Fp}O75ج*r?qh`#†5_SR*J"U`nk1`Ӕ6K)| +lRHIUrpd>qn:ъ8thaӁf?|ugf3 厰GwOᮝ2XϧRFi}ʼf[g-t1E](B m6P@YöozجZqF#V_h`\3 Ύ%'6~tcXTlCãGÇ>|omᮝ O $ݟƓ ?P O.ܹ࡬Wu۶ۤ=thrj@ݓ ~⳦N̆gV?/{ ^];?i_ lσeÏ˶ g~rTM[v~*n-ޞ۾~v @>Y,1@ƒ_.kv˭*Q544Z M, ҼXKȮ]n 88]xK $mppc'Y;yxx4 IU6ip6U֨68[)k ؎?|^)Z;r{$@?Ⱦp˭gipeݶr8Ha9p-)րr2[nCãAw Ν۶ߝ=mm}ᠸ%hT藺3_ z{<7nCWn߇x(`{;fuܹ\?W  Ok -cԀ ?vhV )|^mקkhYT<k2,e~YYG0n/\zذņ#Һ$[^^.>󼸸XPجK XJd<<< lPA)1`jÆ$Encqׯ`Q 'pz@zgX83SY Q拹)v) r(@}>vn=`Y CEa@?=/K%3x(K)VT2 q|,`f-M,;YRRk BmHPzzzO1I6GͪQppq2,..&^(`6֌H}MBT4H,]"Z lp: 2K#"npXфfFhsbc=)hA~~C2~PH}OG?Lo- lTu AVgfs}O.F)fezƴ맦3Dj`>3q [ XMJR{xxxH+lFX3D9lZIdL]6zЙzH`E * )ĢT`oV`.x@ (lTlxdjbAZvf f-}.p̆C?q)YQbVV=+ t)ϧ=/V@YeXqpq2z5 ^ 6aVH628Y'$uIu/+8D`ZNE6 lfEc), w/^p ؤPk{M%A `bJ}S5@qUmϘ%~LҶf!|nrT8t]Q5$Rik,@dFaåroou6iR$.s%Y8Nh;}<<<<,aঝk4ż28k5HNi[=lWMD*b`Fr8 h?. Wj83sͱAشIAZm*nNs/ ?Uܸ~8xN ?9~J\wRmwf/V3  ! NQs5>NU?ʪ. qRF-~NZP 6aqr`a*x 6tD:xIQ0f"֡Vn`"SS6im,#3*1Zu:Aomrώ~5SLhYp6jv1=3J`{m۶2#8 vP`Yl{ƬaYzzv߰Ϗl-kO`/>w~ڭ;fMUyy3ᮝR+ltk>{u4MlF}F@5HF+lrzM@RK$5Y Æհ6ZBP6Ief|2.ieUM>` nfU8'5UشaU3 ?v lv &p2`Q)}O˽k؃sj N)ց.3fm-v3v[𲱉SN h g)J~gV>*mCpa֝hߣz^C{,jHԒC|kђHPvu#.%zUC j hrV*jU,"eYg=<<֧–b6h#'IRY`ӆgWxx4|}G'?fQQ%8t(<8}}YLچGŅ9-Ν=wخ_`^,۲cޱu ~\J{/BS  ?)H7 bJYEJt=^G"͛oܵk׍)%@}ج }>;20f5C6t6-5cH_szѺHP!H1QY\e{4شtoz c荄OOLdd7YJ"ppMG8`A2c J' <<<ؠ$Rol1[p+J"5Mڀl6?lP[Oɫ[cLG(U˨4̈́KtfPk׮{g_o)JvM]2)sbmjMako|81XpƕH_28۪I3u`hT ؠң}ZdirSYeem޼F mnkVX,f+ eKd9l=`K1 #0:m#:yxx3~<.c/ԫ8 ]Dap=l`_FaKY_o.4Ζ5}f.N&/t]=F/,ӳ3`$ N^Y[ l\/6D2Ilh)u`Xa9(/O)0DX,f 袷Qt2H k7ogKm]w Цhvc ?>v27?~#ډ,-qu?>v,|tٞ MQ5sp6.Q{I|<$hs`Yʔ1Q걹oF9uy⧧^޽{ g _H6< cp>(}&DZ`{hxHX?Xrt|}<==8z.INܐleBgS)Q5́ãjfU´34RMDRd%J!lRId 9nPqq1Ű6Pb!04<*^0)s)]==Sa5,`l\5 *aZ$u _v`iI*[#7 hYS5K3wޝڵFp${{{f}.}8xV5|6:M1̑SҴ-{Ԁ!ӁH6lX6B\"f GU6 51ܴ(UCێ;޵k׮hT]ve&$;vxÖ cЉ# nX[\\ +E:[0RcӠ.KSR'===R6f#6f̓#T$2ѩZ:yxxTRKSMR0|S`C(͛76o|#\.)H=0JANE ;E.,\*>CgM꘵Dal+ԌF8SW<= l> JOU5ںUɒH g\dlhGAK(,~o,ã$%;М8^~-l`zUIg[Gw[LkT,2t6LRI6Vl_==N},@Xq;_vp e~ctl7.kJ,?^V/T[Sz?qJ5>uH @LR-"$ã΢YdjF , M ,3rBq05P0,-- >qwo۶f0"yxlqQT >60);juk]F;Q `+;ΰ#\ubF+9yxx48ptz5Ҟ?Q/4JxOwx9mv3[oouj۶mHmv3aPìrMPa`0H^~np\dlόU-VTOe^b 6 LSdeMG0 FrH/hq}*];Ֆ;N61+upZ/b5 _XݾpT83'/7Y;o=_8o{o2qr`Xnz^5 (A =`^3Vlfm I yxxtI}).P8`G4ʺDR5^Yj垞<<<؎Lփ2P->Eq:?J`u5|= L‹?0u9i~.9p(:bŌr ˆۨ-D✟_.N 'TSSarr*ި){:6zز=W/K6 a/ab>ᄧs/ZӍ#5KXu쌴ze3' IÐB{0-,\aF?$8>.wagsѰ2q}mJ5Z1.--6^}DxW_;~|d~?>v27ex7v?uGݳss̐:MaLG$S4߀n(6fkBJO4ؓPTs+-oJ9CZH!1Mb s{O8¹S^ v5_ dnn.}r۾5DQp=۹06~!,,\bNkob P(|Gw}վ2s,'_ lICK"ef;6 Ů}cMY-e(6~Ml$K JU`-k{rF p+++zF6<m~~!0:6^p֬ TN -S.vRj)֌/q|d޷.Z5<<<3؁vi9 7b;9;æݽrJ&@ 'YO^xBXZZ sss9E Gvp/ͅ06~!/L%-4|xr'7ã6j:±XYdzESuC % v`޸˖z{$H=eVVGm!7@@9annN,pu` l'FcEe|7<<<:,}l\"9-V`ʍr;yxt7YMbO}2@K $H ,VҰ $/?SiX]B,W.)lXw_=ډ :L'}{xx/`kwf|8PeNe<<<Gl\XylҪXf2QPXt;wjYۄsawHˆaDB>g#(Zڲu추ᅦG{MrV53, ʿsبڦFH́ÁM;`k-CԦ*`s>)2(73 MH]\aP6 s@a7y)i~U@j>`'R{ؚa:b6ɀs 28$ʞ<<be܁[JIdeٹlSaRzsii]&7lA .|` 3l,ͦ.lV愃FN(ã3 ;w,6%R5]Sd鈦ie!-*]󤚏BSriTU『ip3غ+Đ F@]2 Ќr$`Khг>籓1~=<ƪ78ƑulEӆ>/Zl=5۟p* .ĽWP2 y\Ne&-`R2>~1\Bj@G*u->Iزi_` Ζ~UISdK$ιhl kDYƖ's[,T5?3ؑFAUVWlгlaR)l;ѱ ظJpg>2i}SxxxRMGFEiUذҦm$W<<<4n)zib-^[׸Gj0eخrNXelqۏFj#cCAN51:O* _{~ҵSjVԤ$#?62*[\ʌT@)fbjt|`Kmw_gC!<_tiЧF{fgF7j# /?`r:!FWÿ^M*5!ˁ8(h11 {< #A-14RɉHJ4 qVu`^Uj S֬=gY,Gr;Q: qI$ ^XsrșOnh~0==LT΅$ٿ[\m2׿[`1چGUpqc5(m5 p!BUA#E֩cj L+Qo ,6oahDYd>f,-uUJ-=lҠl$Sh̄OoN>Lm KKK9c6aP˩jv90C*S)weL2 TQ+TvHcMr咞M.|jeK"[lg]8kPUi+lE=K_=xʗRFg|5 tL4>Qm#fffMOOglذ)hkK l$EH%e[ܑu&EŌ 0wPv7[aN3ؔpIe1hwh%fOۑYz莑D5IÀS+PHcaR83gIvi|0W %P 9=}՘+l[ԠHC\/RX/P2 F2=m5g|tUCJ&m!IbWqЦiʚeڇ&-תT,-ꚦq6ȥ0?lt'C؉WHf+++633*kD6|y5nM2S8bA a@A Y(PT٬.2==HWk:BeZB+6I,ƒUNa$[j:yxtw33E%΁ lVu-6UFMG8H3,t*EH6YX٤cٟi+$+2(jE@\?>::?n3Lq5rH q8 ԷcZWHw/ Ÿ4ǍF  t#M*lQ8"CaGLM4-k T6Kko_Plz.{f.th;DX\\`mzz:LMMbӑ<kyh9rL mbN @%ym^k@[`k?l1zn$Ygs4H62ͪvJSq0qO9h msssk톶/ɩ0=}!rrr*PZ i0lQS Pcw-$EvEe I223ҍE l`$S pt$#\gYbZ*؅g6";Pl.B G$=f*S?\4F?055&&&2%mzz:LNNJ$ظlR!GQL}<<ShM>$[²pwZ\6Owh[vÆ[d,B7a8yxtw[Z9d\4d2vz)|q8 j4p 3`Nl>27tX65užrr*LNNe$oF]"uĉULBZа?(elg($3ífG{`oV3MK$'1ZU5W<%8n<q3٤JQ띋V*:Ow쒒ȔV8)awH- f=mseE,+-c8"kk(vlԠb)_m)n1-uT9Cr=k`rH %w1==F55Ma{C$Ts C?π Hb3pUClrGgm#9i7*qp6jLc`(gT K(8ibJO5wL,uMHp.XeJyxT,VPJk٣|1Xk&#! UXa呴$[C6^;5%'&&r#ϟJ(` 0|]A[_(#sy1~ JVxV+c_0NUS+kRs$`4jM%FK%P?קF"9jK<hI iLJD`'5Nm ^L][1 e#g) ϟ6?̰Jup6W#XF-szF3 lhIe l ~iuMZ6xYZ2|;Ml6aa)mR?[l<<֏sUXpkuv0==[hNOO=l.=JF"W G\$<Ag ¹#xRɤ:Jk-cgPj <ۀM+k lZU`%6"Cliҁã)[t?+YU8Jjek. ז{2AY$ș ^x/Mas50ئstFS$U0Q֮)0b5́1Ie DZj1ՌwI*gKas ;j`~Ta .Tu 56TRd j.1jRVaӶc641Aِn{l ap*w֕6v ̨&ۙtdvv. ` DI%XasrH3J"Y]-QklJ=hR/XҨ勱EmyŀMFt[\" V&խŁãsT6+YTjҐRG+YJ+%r;Cl4ݨX #p, 0tau oٹl;a3Іzr RJ35 C8G6_J8En~7MۯIZ7;6`[#en2v>kgC2aSݴkll1,2SfZkeEJFp吴[ȅKyBtMi$cHc5G`ak|+itNF{0Q%7lJhNRY Wze2F(5_,TTZxzߚ-Mi3;G*7A܁cZ , C }s1ͪMk6YQȥ\blл*\χ/?c'^ YI($ ǦeSSY\U%F %1 jl'8\2H5 l@@LG022AuĊ3 lW6$ nbs@?mt5m52s}`FBY%sA 2h 󨥏 mφB:/`YZv`+3$HNmqMz\>66CEUKF1 I6MqLF$TN.///F@/H aKwjF aQ`8 JP$[lK$C$k+/rِP0ɩXHM0& NZbK`jWe^ $.J%9&EJò})DS:(XW"gU!ג +kTqu +kH6;;aui``kR`867ܣ{ְ+\655~4Z,GK3e R0Vx8FaH6&9=2nPe[Xj^6D2-:BK!آ,l36֟ Pa0cel[i)l-!))N֑1jZ&YMp@# I +lXqT"%4m={….PwB\u6< .s}l,l*A"9 ~j_1/'9>քk5aQ>Xfuszz))ʚlFٕ6i&[L{{{s`XZPiˏ=eVRH Io6l<(hPK"qb#+k @U @vl6j$(lRBM{(ѹlЫZZ9$Uܶܬ6js\I#kJ2J!L@-6-bRSY% VEsXRHφ5+z{{D"CUl u` H66Tbf#s $LSbVxYLq2G,6:H;EچgBKc$ ejdd$x%}$ *@(.ťp=C9)\XgHI]+c#3ذJfLCevg:(Vvi:6 ֛Jet`Bv4-hDJF#hU [9 6 ;6s,@Vb2M*\!xI׃eaHVp_ i"AA C؈dll,;w%>+j๳att4av@8U7l™8)h?iJ 6 qvXi#mE QhdĘc VcY'Sdҳ1_>=l{PhFU$#T"cByJ[#v I1jDQ4X\6<(< 5|IBu;hx%~#kv_;JivIJe Y\. 5Qs0eK!sDHf&;$F)DS)w2Oڿ&WךzhN1iFQ`?gc)mlSi),3g%eƛRRۑqZVej:2Hl@K"1Ξ Xv+s\&9dFaSqi(Cq2g:{pO5ɩkJ$3 òQ9%j`1RMTȘd 4wG 9~ĒYǚ0a?]boihF5i?5]a,P83ZJ?VCrΘRX֜&H$T^Ba`Fo-2(Nܨ%Cgiܶs{ONQv$UVv~\ |B+lX}"k0*[pݎMH"\$6 aT.vyn41}pmn4YTakVHfq*WI6I^l<6*uU]Jid-R+ԌJT$V& S;\tPil6c'^2 >0|-x% =?-׻-16p np߹џ@^jV(qk9m)6rƔuťr,'&&rCY3 ;\Α a@밝6[ Y-H2lFgIp3%̜5j_bV)"5Mų26W< [+!c m$[JDbP?1IN-l nҙGT-^5Z7m8@7NMF4J"@rF!uCW3>~ /O)7?'Nzвyqh)$?J:bc`[`[(z٨4 5<S2HZ9{ I5ŜkP.O 5e7 CVkn;qR֟c =lj,lSiQ,lD^*kF"=G2b\psp38Vٸl1:FB?6"64$(pPxP;lgkOO{0qcdzcSPzP<33Fq#l7< mNOOJ"plQlϕFGHI1< v`M)}̩kcY"%,ɂ^mm]]~I$=i9iJ6lOAR% ͎G:yxtYgzb2Nt J"P7IIe`:¸Fb ΐUHg5f[(Z,-&$jꚫkLGZdž6SפRQ g&AGm12OQ-(l)עt '7 +nH9 ؉Dbpup& 6ni吠׎C/..J"?(i ]gk}iԐZ6s oaX._<~TNaӒ4ЛKZHMF\2''mۅc`hwnܠl0Ёz `H;x>U7Z GU0lQj e3{WGu6hYSJ0E( U6f_V4 8EV%9yxtFIdar3d2^ V!u6<pC6FMH5|=3Pp$MM50Vذb  vx~.y͛eͿ qY$4<[/PkXmaH /d.XU &a~aPB$_qV,6θSאZ' PU[fi/Z*l1HfTէP!j֭*BF΁ãs cֳe~2Һk_&Y[QU T4c'Vl\I{ذ`mRa855+ @-öye hhI$V8h˸ ^ g>@P@Q3q3רsF\%HIk#;@ .ˤ0-48> XOGꚧtZ L`.. 5Nt`,X.[{RLERzb/;W-RAiʚt4+j8Hи8Hi@>6 4lV{Ǹhnذd$51!@YTy :EV_[/a S$-\#F#9 C0,gO֨S$ u-RΨ*[RRrT PڒsO]]–ڿi F FBIMљfQ%0 }l4kx63 x.I\Ik25?j @ '5:G/c3(ix& n!_Sְv!s")mRk&ÐeE Ը`I/×p$ lcsؤI޿R 7!Sb-l nTXoYl)crG$zݤma !pg9< p RAa{aHDa(a`aCe lXUs$Glُ׋!q(ih}?4иIl㟩iP9Kˁ.}p1ch?WIgIτHIb[ JkqqB: ۙ!%C[KԿGšՖ [޵2p ׶W-iWfa[lU62I7 ڠ"mXIK n,`8(a mBEX_\‰5 g5~>ګF"[șP }Pn_ڴi/P Db@;i $mmULECΎll?RÆ z2U@bkZHHV=pItu8-0*0jJCf6-%O]b1Z<<گi1uM. \R$,;9ip'Anh9$]åx —.5ae۶m^ <.a'GPkN5]HozV( E,G%l Ɓ=I;W+Wdm-k134/lHIvR&qV5Fq<<:Ce]W. w)ŖhXIdl>.ӹk\0ў5*HTm[ZZ|C\~{O|/oڴmvdž ` bYk= \FRuxO?KǷt9}S2)xpbΏ ʛR[MF7rH6k9dlH)-V`"Sz\aH Y/iZ/SԶrz!:OZ"it6\AvPFI3ڰHl:rM7'Gr0 ;lՏCQ~߇UF pc?=G?w{}k{憾+=}aC_qkeŷ=Y[&5{\ ϵv6ڇV3 f{Ȅyjieռ,2:@E Zms*lR?mH/)lCrcg,.IKuz+i#HI}Ci?ǷCF  ;0^6AOm۶M6@(m2D1PK5-?.oeX-0U<6Xlۯً+b; +E!WouG _. ǖ;PX B4_k%1C{~f:lM*`bXH+t`RHreY 4NXb[b$RT"s#1QHaH|7,tP{WU/ Ss9`GH46Av'T15r+P.IeeQ`A"I)[*mg )@nC_eן eङ0=k kLQ`R yr=llRE`%-V G,dOOl큵2T|g]f1Aek[cp=džwTiRJDRpԘ tp- Vڠw 6<*2]'ܗGaMKC|㬢\N]ϗ*J 0AW7+dǬvD,`K*V -8K{缟-^uq ӑwp]1+u!)9yx,2掘 zZ xb ɈGSbô9.c%1 2\GƙrвDAaH\"9.΄eX5_ )-}qey/7Z|&܆zp?ZskW+7e@&X<_•Qyfմk禕NL*l҉E؜V(lq[g*][lGA N~/Me-v pe)}n 8FrIܫFA=bS(О5߅(Z†4By$.}et7^7\9? *0MIôaUmM+>4j, HrnGr6 q]kyjr UcRCJvs(g_cJDr&Yhbúãs V~-%)[jeY+ijt=7(e+?N:hk}l)@ @ņfg¹lp6ڎ;E z%rHj:B6JV2i _ rra@ƚa J5XG!aշ2|Uo,%4\5A5c) 8ͳ O8DZtAFT0qJxx,VH$c?1{pǔe2#!uI6iIV35Zfa-Gi)"\?:6Dر]!m׮]7tM-, i(%PwM6d:"9E{QoQr&$F"] FP[AY[b ڮIbr@V\իM׏ɖZ~k+L)l&`"ReiHܲX9q)3R{b^^B#F 0ż$:RXV} ;dY%gzt6Ne51<lum+9@"(1v?W,,[I@HIā)=e8ƟˋT׺Mꙶ(kæ Dv\6HRidooul/kPb?12jT>bRb0g1%RH;$8?^.NiÁp\aH2]vaP[lE*q@!\J"Y<BQrnxx#id8, ̼Fz֠ یQ5@RMCr}[foQRf9ys[K[K"{zzNc 0T֟+Fo$J^HKQ$I)uH,R{4-rI~܎T7İMR,Ή\I"+l HɁ!3:kŠ#7 +9le(L~ ?Q ֟wd"3s$݀K%`} uLS Vy:t6-] [ҷf:_ ]tã吩?1Ð=bh<Xe-ߦe8kR($?E:\ =l`4y-r7J& Ȧgu"(Ivc?T5呛G/lZw-_7'9sfӑ @}cդ:&eS@Ԅ21n8%VkVDƪltYӚјSGf+^ Ybd-LYXd%-wMSشGiYҙNSƕbє7N?=2@UՠD٠5ђ{S&~TiCJYm {P\%hߙ4dvc3pjRaH`8DM%:yxRS,dإH mfXkকCjA?w+m g2B"RJFQwE 6:a*m۶7o|#7)4<HJDD)ϩ[ukд|ps(abύ=fo~Gn`#=nJ(&:E*Ckd-rI}gE X+د6-Ze:"m)s,(BGk P4X\5E#P1!oH&)je0vtV˕HrQW]vݸ{6o|#(n7n|76QLa[\\:8CU-W+n{E#=W܌aa`X,J6,qu-6Л"krW{;0n_z[M%FK! $B$ G{!-ä-@e1kdJPYl%aIڷFk oT IetlP qw퍓C###l7gNj#uQ?B3ԨV0/@y(uwSְA g[/W(@D9YG l%&&wt`Kul%c/[vHӾۙ޶au_G?%^6FJb0Lű1UK) MNSY k}nZY$φU4NyT%NqF4GF FÛzi7[;vk˖-7PInܬ9- llh FfiDa^Uh$ S˘_@}RI1o5pIϥl]d_lY bgK\T UYer,ſGkaLYֱ[RYOieY%M:MQq0A*cT * ZJr .{lvJ$Hj" Vuxpʊ8#H+o{}hyk~<"ѡ~b?[AC!%`bfBJ#kZ"F{ʪqF\a[6 Ύ37Caگ-ڿ.ܠ:G-E= *uE=MUbw!R*ɹ@R#h?V0tI*V8Gɕpdf:ݻoH..N>IeÊ-t\9(gJ3ӑ~?g$ Ee~%I% bG p!ڵ ΒX %5죦'fYC=t[4%\Ub%ʶ܆9yx_a@J(pc^ት4#QjuymjO/NQb\_ xLaHĊdfBAZ)ltS2I&#Tm`{~q\u:;ܗqdgY5hO%B DG$RO[KNcg ζ+4شXW${Hgq%G`͢(-:MXZ@Xd b #eFdXQp$Xyt.NPqwoٲP٠#tIM˓psrLbh`kd]p<f.@dF졀/̀9EJ#+}yl5 c}i]l2%a\"%Ho%6I{״5ah-òH-[JU*[+ҟa ceJ4n~5/sKm|b$5<4EB]wlϏ |p+GU|1g*Bsf$Xm/+$7;gK 3ݎfm㕷 ~bk ՔAݪd̝.֛W< bU<6<2V!Xy`| `yX~Xc*X kɤu,RS,> V8 FԨDC>6Pvڕ+|2d"z֨[df:=j eb˛5+@Ga.2Z/:V )q9F2 |[{IRRZ UIô+[)*7w+ށãJ[2p=.u@^g)XmER`erJuyFPu 099N˻vi 6<*^p@GpF#lF$qQ Kr{keh Ib}ex4eJgs<3,j>5aH7q*ollVքYY"TtW)nA<<j1hYZz ̶QԭTǔ2в*z\?Vb>CFaEF4n7\f)lq7>6 %EZ)&àFa> k \ņ pOXǖ-b*XS`&v]0<X` 9>487J~3MQ4*YS88%aki8d6an+:yx4 `–2O%U9v_ @c4RQ׶BTIpU83؄3,Y^^slrÖ-[naٻwi ?U(R %lG:^3a%tPv?#?qJ+i\_$1SɴňU.Cd-f2"ȍ: [3J"%Hi0p{M7NYӌG<<_Ԓ2(gDZUŔA˨nZ d7DSB,3jOI\6F٠ q'k$b͔+DB[2-efՑQ%+Y!uK.mRSGbS HmQɁv ݻoظqAY(`@3ǩb1s<ʀeŰ%3$3)`|)al)$q,[_nyIG*KGTcKLfLSjb'T ҁ͓[ӑf*l1`AJ(l&9hg{xԴX)d2Vrبule4c)R3(=:q"+!&G6Ne۱cǻ@eFu֙G]&8ig% 71n rOQ3|)xHEq=f7p&#퀦>im%H)D=F%=l6,eX8Ҫ+iƕ?Jl6 *h#ԙn)re I*r$͒1\+rsK /\ oz;v zհφ]")\b0^tҞ7\:y%+#i|YqZauA`U=c]#҆U4fd YR41 LF4,86 l\oJ[3 TiH7h_dڬ꛵\2j]3 |Rb%ecf$\dp rlR߽{ 9ljuTaêDE?SI\$, e؈A`6 DP4cʬXybMY>-4jps`\&jՖzH78s$GHa5MR@]s`hfa]FJycZ<~ 6k))׭ݸܲv}8El96~ɭ^;n-$y FA#\O!ߧQ8HnX^GHb_CZ`*" fK" 0&9A,Rsl>$vr aWJ[? 郳=<ڣY,Z`,EJ),0 uv*a$MSҴlI՜i؅OO,)k15*9@ !ǖas(zӨvoV[;"1e5 aH%?k$kZYQBԁR٣8Sʌp`t[6 sp~\We9Hw<͢tYS $|%) ֖rFKZոhY%Ӛ upm׮]7belr5tB0s\^^._uoD a9 w 5ѡ eJ0Z<} qtMZP~XcK-phQ,6+ԣY.5xdlTe4-\^^H(ie,:k(Vظ^2Z*I]#xF|QEo#V,LnP܋J"SF+TrX@*Y L0VAh{[25[aC5tM$B]"2H q>66֗HZZLaj`Y.U-Kܩ&'@Nɖ|F{ݠm7P;;v {{{-Sr3t:Df#{0/G2F%P]1%{Bi$Z&YRY!MZYfp" Nu*YrO|prV+loH(τ*I>8cm֡1(ey)(A|2ZXV9+[Yo o\_ _6i%E-Pj&)%%k-r3L{Q8G/UԈ2HQac(ƫyW׫f)Xdžh3Ab%Z[OsJDZ+zUbNSr W ͦ+l j0 Y+{LUR5융õM_S̨ AJ{n2$ܪeQ:8ac{⮑\8 LIïsݓ/zٮ{ES>3m.e1jEϠuS,6W6$HO9ַՎJ-lqǔ2ccU8@Zg]2e h͎`` zz{{\"caX$u6pQmd(۝"8ⵟg72š6pگ8î+LuYfQRj-gr)jV-UJ),mQod˱9l'~zeN]߆gk2@:a %EP#U`G樱&%G^byhL# X,YHsڲ|a$8tF"-]cx,'SqHauErRHR% hցԍRʔIZ;SU2W)&* [+{7v]v݈{հ†]#fgUc%g@jM~ &"9symRKmo71m DgטrI KԒG6ӍGPQmeePܔvZb3VDh?Æ_xLtHYg5ӤrRJ'R81V,嬠4u{X.uY#P+Yă9f e<3ɀhOQI}nG͑/怏1 &REMY302ys`V8E:HǖEXiV:2[sg3M*8'U*l1ivn:љ ACI)l˱ƲeeAu(PeJ,#$( GPh_ۙޞ>nqpF [f:r0gmU2(JaK0 ̵kp%9 klZȀX6)4M(4l f#n}lUWpmh)8' ggr=lqΐh]nfQe2{́c}DռêYT;V QmRf\@=.VL#qݻw#eRZOaWJ"!{.s&!XQ+a+o8lfR}g>O-oT45 9\:_}vD,tpvp233H )UAgִHnZ $́ã*[LJ)AJ@e`O}-=j10m@%mUIc= ƃ?Vٰ!t qjQ˗&/}^! Ua9{ptD5 a2@4SV8,|m$ acM,ô^ch9@78[SbF$VaZos` MD RRi}j)=wh)L5HXe EmAɩlp6Uvu#?008%)6in=s Wr-S,$渗/c̻M2 w8ãLd4 S:SSSfU5k6Y)}7O?V4-u`vK&U\I$)](ej8 MS=sGXK%dE# 9ŭ*^\yIeO>*AƜ";. Amf$4xdvv.6\ z`k$@[|lXxxtfL+&ZJc'=8)v)2D4u=YO eYu҄:0%+fy܏0p9o:_Wf]f>#uυcyo(H"`.78[(]+6v9<Ԟ3VyŅU6S>~ub* cc%JPq噉db$ڀmnv78;l᱾"SS4ue{R3-`Qb R-e{I}e: " lTM×'9lkj8|7y8/A ,4$w}_?Vg*hE.I ULi [O/\f&a[\\ r5f=t[ij<8m֭/lt .LGbdI_+l k)StZژ w͢iV2e\8󚝱aSH0F#===o޼]vH6l֪fPAYI$u{d\#YgFcQc>P>)񥕴 ]ŕѬF0ýk};E#,r}Br_>ڟ襬 ` D:1.=90-Xa8<9(5 B3Qh6ѹ +X, +K ^SG UʎOƶڬ it6S8ۓSa.J$sXjbFFr'_aڑbߚtRZn7V-΍f}nXceo+u6X[YYY0CP&Ia_ M542bp6i^\YJ[ ,V@R +H1@]*6c`w'mؙ68 gG͛oD6j;zפ78RDƺVAJA] Zs"ȕ?rJSeSpmQä46O_eV  %I199eK#)i~TB]"%xB@K)Wu~% XVfZAn(`WHZw``ppjjaZ̛m))_jyPʃVWf$zA޴*oUi(6lݧ0+,^,9Ϗ^ʮ^]w;Ij*vL#ڡ=ltaX_f-AոnVpJTAa2FiR=& Ti8vkcc$԰[$-D1c}řhs%9#oV" VFpZ%+jL4=0y a6EvcI/×p380-ؐC-*udYG5ץG-Vvh S3Z[O c@+, %,UK)LI#l $zؚ\)$v*[ap65 {6eL p6p;es^ɚ0k,6eF[bbg`OG?oAJ*?B8]QZ/_ TɕAb-|&ѣT)ѨG{5 ZjZaQʌHUᬃ-&)eԶzT!k b*cmp6x[lz,e;f-9=2 V)N54eXR>~&f/kmsW^5r(.=ObMfЬHJIyxt.iN ZѬF$jQTYj +[aȺm0NDf9`Qs 9l~7K^[w?rqͣMi<>9ʬ~,纔ayڶ^K=^ :F#l\ 7Wwȓ-]o$\?lSvHn=w,Xo4',P7{ e{,Ȳ,%, NR:X8Æ qi$fako[^^~2pp_#-W{[-AlcrAWzzvJJ-BR] ?T1;; lkf[}kKqt` e29eV|YIʲˊ=T\գ5B+8rpq2>3xA9بKdHpj\\\QZ^^. $<IbdtB&}^[u/Zǭc}U?v maR sssaff&,{ Gl/_%͟Ɯ ب†o:E:yxR-SbbsʥVVg5DBpZ ~.1,; p\¹DZ>s(\)rXen@xsYz {ru%݆zK덟/ /wp#->ޛ{fY&w-'{-{.zH'QϸYnm{p5L-_ І{@mbR&v[o2%܁ã3i@Y;OJ]e]ciKog䷀N#hK橷^n׮]7rf#Ctpv#G4 p5&^u:jKpk=l/ $`:XL9P*hI+$J*ɌV䅴ാV ϲ\Si͵]]-g:r⿅қ[++`i㾶I28[*49yxtʖY@'DUeIfU&UTFqŒ6-/]OMG&>ӉK"ϼ56@#ᒖDJ$ՍDRiX;R8 \G_b;hנ@z5OS MOS,½j˲o]wIU-Sz~6~tK~I=nPn`r)?m ؖ_zpyR[ ERhA9qcDb8e@<<:G]a RZJh]g(˶HЈj FA 6%2U9+)j5< i9|r}cƒQ JRiqx{댽F4xʩ8ںHfL}]ZAnϳ^QPVVVxбVzm[5Z6\g [^ə!q+lYìʔESmϥ)\1-EilaH Z]^1< ,1_ MG,c=Jdeuf\qEδ`+:j¹nRUOIAcFXp-4D|hUR,(gl”m; Zk)J2k6w2ޞW:.=ɕERkIdI)#lnr bPc-a U_gS2ee!Or J9W.'|N˔Nb\s..r Ye8؉F~S$'P9d6q!֗ۆm =Vۦmly5Y~/+`i[;am/|pvn._ټyP `ibl)lm17Hܵ%NO1*eӠǧTpec.q^'Dªq@ ˁmU;uMU'(ƶ~Nz%Ԟ婰|k.( |5O|5av&Isl llՁ}+x+Yaؚ fQʎ)PY_iMjt66lFs%8@Z3o{MEQr,8m.)ϟ7*fg\R*j=g:Җ0]|)$5mf!?Ց' k}8Ra6 qr/΁c}[#*+Z[.m]K i j>`KyްK$-`ǹk׮L)B}=}s$8Nm@) v^zb}I[Ӻ]Z 5ޞ)l*Gյ-z.=I6fqS>xxtG)dL#(Uel5>`,*Yj?e ̢Z 1MM ld'.V,P SI#!NZϣ=ZF/٨ﶿvC\jB5Ea[ +_-jr0s8''tSy&omnG?p㑕s=llkT]` 3q`Yc10bJY)U+3-EuiZ%l9 ;D0?v޻fk ,kU<ֲz{]V#INHKC%F幓a -0s8 pK79em[b!1qewチS4 )ɀ@-eiS#b! Emi1*zVLC46Nq ip9gK[J";PPJYT#fUvF?w+_K'1WX:`k˗Bklm o=vsؿ9+\~WMLh)ss?xCMG8`%xvl6[lY]"09W<<pWT&kd ljU* NU g\ (I#hԑ zʚhrU˜:}Me+}'i]3,穬׍rb jF#9Ȏ50=l~G±;ֆE.--=')l8>6iZ[$cZ#wgkԬ`m_l8 G_LGBf:"A]hFGZe>{azfο~|@Rz쨭h5K`2R5/ӧ/>cIG0>=/\Ll~=Ea}BփLmʜ pP_ F-6e%0 oP>ƿFC7n|7k$+J$%Ȧh&;6~]*kbQR di. ef(QCg \z211i}֞A{klHqB\c J-cmE'$ryykMQْ_Jr)OK?;.ϝ ӯug y̓ _x`۶m7K%w.ERuMSbՆٶ>6Z6)mO3Chr:Lz 2t9uYs L/c[۷`0>6păJa)#ʖ)KU𬟻L|b2cFãe@S<6P(5|dngyX]LGf$jYI$1 g:)O<8|v=2n:Y?;7΍3CU>n`?0- <=0/g}.-K۸*3eջ~w7=}@1+i gg\ 33ajj:LMMɩ\Bkk+ʆooFK!c" B OO+Kkss-ϲF-u$uX=GmdY[opӧ i?:?Aum*ܶ.KQl[SچJs~>M\D{fɓoryĩ\c'7Ow sb%$@I=j4(q r[nՃ֛//,]:zzvLiݤ\֞S鱱'^C۶zqwoڴ6m 7t/7o+7t/~>iӦ_ضmͰbx44IiӬ˸`;|mGL,/O/WltZC$ݷklh{A\:wNJ۪z^>===ll9fs}jx .R'IO``ȁ%$~G*h3~g|N6RxM7K7t/=7w9VeX2n )Z1fH)əX5mCX6ly\l,YףqIQhPRRq!7{)(5lg};g#,q7b(EQHÿ_trORR43٪diԺ|-; sT0|g; W֤RȘfOAc)lF!΢q/9Ս;+pj?˲gku^&i+vf]k ~[.ۆ)Hz_,+5N,6J;nײ+w#iQ}rGGV뱲F7nsKUq,KQ6-Ko|TIu<;t dĔ6DBPLF(Y 2HJjFM?{ג#u\9@АA0!-pR+Pm@/B[i wxڄԴ(@P@ OU'̬{qsbE(js@ZZщu"vhe@g,N9]@(Ǭ^{ɞAu3tb]>UiJq 13\jv v*3"qUcik F4}' "m#➳7FUzY됒k8_jW.L\s>2Fs:~! իe^PUnTuAȪXc|ֈhk$k0uԩ#(tHtl7j1V;jf(k;|@k]LE-f8%\k@+bVÖaȒH*zV% O!10/Q6޿y ܍,\C=o:N׻IdcA@[%WMxOc\=iX^#['IFbCl ^ۚVɼ*5k2<Pqn]%|?J:qm?jc"&KDϦʻ@[ nq6J}D@ Jv?+g=.lvv?fD9dpEnIם/KyErٮ!/ܓJYsw1(uWL)5#8QQ 9hLTڋ9'"PtlM(^@1s?9g8駪ge[/gݻ^Z'e^ 1,܋ԻBx:804 DFt Vl|lTgvYg!O<.{nfT6EV)ũƢZGh$Cd U͗q`.!Z[cs??gHϪZHWA^ydɀ[%8+Eeiy32sQ8'–FfѶw~H>==w ޼y[Yȏ*D#)jxQSlqb:$cL8'jSJ *F*b9\m~)׽G",ڝ/;:)I JEC*}fD9ȣaѼt/р" xg[?Jh# %gL.AsNߺl-c!V马wϨwֿjDު쑬WsŨc\SRe^,,k]c6VVӖ5; ]uB9/u >XwGR1^+=`HμNj]/2fOC ]s{$PF"b WYkL`Q4W 2JkADϘUP>djY5&sR5W9oA+JFV5^g$|mǿ_F`[ĠF!U*j Eh3򑬎M]L ک8B~D"uq"$8Ƽ3T:ogGs(1兌,""N1̀;Q?4o߾ 0.2 :.~kn#{Hemk^L5)A"n, 2PjQjk"Kv#9J$FIuNpl$FN@mDJr ঀZn-TͲ2 #i,AX|oMTcv#vMh)2\;q1.jyElva=^/=t0Ђ , k&KectE4ص֌?62fs6;ff:܍bu[y{"[hoSs GG?GϲsNFcT :Y)͇ ?+t#mgM@E!~'=5;jU@Z%{Py.ɻv{; yYfQ^}8zFlD9@)L4O+LaYt ޲Ԡ*BJ W^]p2|ϝaDˀZ6LEG'ToMWQ2H(EPNbLd@mh1vD#hd骍ՠP,9=fkpsX3/ u+H̻WsΏO)2:R3Se#ZNJCy2]oqmW 1YDuent-OEyX ,![>sIU2#x"qeYm;j_ʹA)HUbd-xN b]h+K]^9^,DmYctfC:ɉdflN\t6si<{<78غQI/F(v**PE&YUJ"aelZ5ȢtJ\^h?sX YY)0clL̙l[X1&yH;bY?UC&l+9K'jU=,lWUQ8 1`d9"J7{'kT;jC(RW9e Pwv-KP׬xWs̓E8yTMznT U%pRUj8{jU"MVe&.@V5z Hd΂j{NWź,Y]0w"3Aw}j$#8BS`g>H։bt{婽t Uk& <%Aa'yPl{s]ŮmTZ_('rXFM1.QUl; yXQAJNJJ_߭EsSHwrNm7%ѭ"^:-8>(]ZQ{*X;E"1 RO5hKEPnh{HgqS : ljܮ$QǎrrF*JPZ)7@HQWdz:1*U w :ϫOqw{^!RJ+ ĉ9F˚PW+8M;J Yasj檽X4\n:3k@\lic鑪5@|; >Z Ji5"{l5բt َ\xՎA8ʰ^0ce<ʳTi0YjKuga'(#BuT6Wjl]XMpR@]UIwtSE+"JPYVTj\ceg3-n$_6Uix;f"1>K [Dv22Rs:뿳G怷,b($6fyFFFFpRFk2nt'#PFYItߑπ+J33X`u60/C+;6vz1gudd6;|?622221>;?2;jrh 4)zdH(juS uv_3@"\_|N:C2um##mddd䂀)J,)^:E@Sv10tn#ged>k\ yCϟ02yddpww(7c4G39mdddx~+ #ljK)`vwN<Y"vawTϊxtߜy5g)Geڬ\KVO8">cT\ʻXUSJқaEt wjR5A2{ l*8,##/ Uwﮀ>tSO0;a=c 7g$n,sDJHUhv\W%9P@HBua+ JEIA]edNJwTRy|FFFFR9 ʉz6dP.Q(SZȡSEFPRc*QM6*hcs99{FF^TNJ[[9:]2mddd Sqi߫dCcV͸Iϙ:vTjݯ8j=fds0^lޯi`yR+NKTAQ@ƒݑm8@Jt'*>CUՆڙ"F6K?Dˎͼd/F۫Ϻ űMTmdMLYw:-D:p" 14T8&qRcJլXʈX)pW <[at_F ^:Q*(ǟ;P6222RȀERs;=gű9iyG)L4~ Uw3Cףz1R//Yج>sJ0Fy=O&fv=ЍԹ-^n `)(d(Z0ݡAFI669eN:cx_KHj3( ddsK|wHwf'vHX3 ʑgQ׻Jɹi|F: -wAR@|9uoG0kf::L5222rI=YqEs'6222rC)a*Fx4u=nht|xʜwz9tNJZݩc@ydddR7}+*N2"y1u6;gVZT'3pԷ1fX͑C?22y9 m~և>jr4jf4Rg $V] j[A$722m^FFFF^zڤeM̎A "@  ̞S֤isCׯYŹ0tddۼ^ĹvIENDB`PKL\=<<+instagram-feed/admin/assets/img/balloon.pngnu[PNG  IHDRddG2rXC򃏀9HXE.RD[ƌ"-K[D?+5 ʁOHR#vj!y|%jER0P"$"6ո2sBd[~?dAgY%OiRo@)RzDbRdx]ٞ8IAN-{X.| >QâVMgOtT)d#QP偗QTJdF *6Lb[sN(/-% H"ktĠ pGҍ0T5= pfdz5e5i{ijS^ʖrIxMM6 ՞CUi,MW̩DC9(Y:"$,OweR&sʶҎ*I2* »=gjeZM#Cmpcx󒝭=F KTP9TZ5a);uR|Y& 9춾 !^."~z 9^N]gbr)8`G^^)̍tT#wڟ=aq#Ymz叹?.m,eea#(]4H-"<`7RL™5' }|qzɤI-uE* K/<$ BRWܐ!̶f(RV@C@ LjRBЃSV˴4%_`L2""UdkX.8!d  Mzb`#ţ<+rD#W _?`ΥDy}r[|r-Nye3#_Xf٣ ̍һKnyT5hn,*/x(7c16wltN1>+*>^؁ugh%].r?|َ==r?c PKL\+6instagram-feed/admin/assets/img/oembeds-image-2@2x.pngnu[PNG  IHDRt@ pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATx}\u%G8, #XD#c 1yHOx3)<p4+&L1F&}xI[oAK-[~i;(KdnwDRn~I?]ܵ{[Uk]]u=gZ頻=hhhhhhhhhhhhhpЖЍ^{ ?^\}gCWmYcǎ׳Y<[]3oΙkw̄uF]9cGGTѳ.k%he:h%N}w`Hܴ~ ڍѻnFQZ~u[y)/>MRJtۙG+3(Y["Wf֍PR;EuVJobwD7 -"s,ulͦz)>}&ڮu\#^G`gtAMU ^m)Ug]dȨ-.N3d N3+ZAj7ҕT'/h7K{+ͨm\vUқ68F;gi7[{}&sc1k߳oMNRkײm)Vv"7wAGG:?w)0} JWob&W꽋Ttʈ6eVA$ZߣUb\hۣ5b{.vu|ZMu#Vanckӻ u meϻGo p _uk]QrߙoMN2W*KLd3wAGGt= Ԓ.ҔAez?[vvuر.q.o`?Nm?>cǎ}_N\?Gc;ooI狺 ???ŸaAw>tBvku[?:11YMO@CCCC[mdz?j4pԏ^sС^./h'411u_ IQ[-gR`\hhhh+s >|R-ibǏ|61GRLa_eQ8qrXPzMOD2>~䩹z*%}CrXCCCCC>Qo2 mzDYx%ޑ}#1ɌȥCCCC{ \)CCCCC;Q׵d `:44444tҴd KKw΢3$Tg8CLVI"]䫮thhhhh ny@|Ŧƶ%ϦK\_:Mђդ>V\--OiWCWT_? oοmd@Y)hh;yc7AC]#߼܋]gOecn3Z%j`[G~UUnE@Ǚ8 yr:-CC[^@7=} ~wmW X^5˥N]^Uʥg])] miݣ3kw8J4k/~ kFc5݋wmX)ݼ8c^/:(yWsb? y)}]CY) HDCQnxG7";r-iCC[~Qn\t](ҫ(r,RB Rtٷ &≤CC@ ubE: =ܾꩽnQCWx @n9r,v輔U⸜A;cR\Q=Y7VǴ  mi)PQ'!-\RЭ tUU> Zs,UJ[7\VС-K~ŷ^XUOu@rC>X ㈵1:Ϡ#H  myEQƎkQBC{Wα#Z&:lN5]KmeS.3 *hhUݠK2%T]G $ò'Le @nz}nV#\Uϵ<-i$yrqyKKСu'〣R^ܭv{=Z2,)6mk/~;6Ɍ@M2] fS _繫-@C[^@{P~e7uHlpnhyWgOm%P=Duxj|Kyn߲D ]Բ}JQC(ݲSN֍u~|K֏V{vez\I|~)4AjкCEngzIk֏V9/ j(bbU%?@)bW_CC[f@waפ26v+]R. +ݲhCC[~@{t/~c,5ayJYc,:jк!͔XjzEС-ا,jв-X"U5@N<gdѡ. [?ruj(m:44^mAmv2ڲ~RRK䁁U`zQ}IVnt9IСj{菆j'8w:kqR̰x}QCg!XtG' Y eX @tH PGG'N2:44444N;dMl ЬK YFK{cq eWYСq]%TСIsRVW(ZڥY duAf,CCCCCˈd :Rq+m 2(`и( ;-9S@ix$*#K@j'IÇ JS$CCCCC:E*}]C',o&Mhhhhh kthhhhhQe6.д^q>t::4444: $y\ MRsA𡳐k *hhhhh.#NСE)c` 40'%)r||;S9j/xM/8q mwI5>>Ui@$VqrcW_Յ *@̘nt}˴co;?D sTGm :rp?㫪C :t#G\咳stumQ3DQn/x̜fY3(ë!}k,ގmR.aLTC #GWW?WG7cq. HD D贔KJVtOǷjrsNf,@ Б0JF#G!]Ke!A\ٗRRC%@ J*m h% @ek8v,ZEtTKjHD -ЌiQ @ YCU?XDٱc5t @k/L:;rxX\ZWm5H!\"3tr﨡C cc}Cy:xN.:@x"!:/R#V%W, j\"3tVe.XD*]C tЬ@Jt@W*bS.%%)})t.X<:6hb+ ikyYtR.iP@ t@'U.=uKK2[GW?g9\"tQ!;- @@ HŲZecYߌy:@DNC :5teƃ @ 8(ٱ5t)"ΕZU $89 @@ X\3(DQ贱D[$TWmwT\"t}r cq˦\rrJ.Ȱu=AF5!Bi`+^RZ K@H@WtYx7@A@ $Ә:+mNӌ"2)U?i.*dG%@ $(B !k[8)"T.5RK: B(]F B @EN,^i`!ekt@G)Z~$R ~a4 C@ *K' 䡆@ j cqM3b` @ q?!"r)d/){Q9dC $H 4GC :Jcrg,n:tjU֍7C :Yc^okc,P@@ ,>([.SCa ϬQv @@  41(}@ d ]IJj$ⅱ8@ J5vh@ x Uf1stU/3tu|>t(tyV8r@ yReeз*gC%bvvfgp2.t4{,d!҃13;WEQ@e5tF_f zjSc[5>>".pm /U۪gcOV۪Mmծ}Vuσ]O+Puσ 7ގs# m0n4=ޕnC_/?Z9[>vk>y~}}զƶꩽϡ :wuc&b_: k+X܊wse__OU<]}텗svz#gVݺ/< @@$@7::zMNFqonNb{jؽgo엻sԕAe󀜬R-c}W@|A dgfO&d4& KTK{Fcu?1t խ;> ptGG|1tMVT ]ys˯Ru=6~텗]=Qݼ&McO6Y]z`wggyyխ;v=9YyU;8}>sO} _#=Y}fM}~||t\ȉjCO47&ߐ~obBߐO>{nq_6?O~kkt^jfvڽgkW k[&ff-n /V>x peQ;D<ٖҹs'o@cw.y~޳wyoՃGl[~xytyc*ܱϵ{0Ε+ۧyJx7T*#yksoE:ƀ0{̻t3' ~s~}]tWBL=4ljl[0?>>94_.n?b /rk =cE=_Z?st󶻛l7kny''z>Z[^p>O3⺺;r v9B%||εyu7p 3mGxyy~du!VQ$3g=uʥ*OJSN9n%m{U}1od\Q[Wc7oK@Ee>)Ds*q+MqK@1.Fn9.oB~y~IBמ|0ۧm끎_*Otlڹ#@yU7ֿ&^G:^[3ݺ&j||9I]`V/咮Uky /V7Q xG˄K+T۲R޴t8Ѥ/=Yy+ŏl{DˏW{Gn[3-w5pÍwT4s/:{|H+<^w|oHΩwf @qI3.it%꭪v+i"(vIo\4NKmft{ꍯ~N~Ă} &|pbCOG޽DR@g$/>ے]3Uઁ^y{0}-'IEΛa-~$ERIvi)bqb1t4pXY/܂{ӭ;v[$A + :g[:>>U ƽSTWkyh߿n$ѽRzѭ(KY@QZC TZDQn6RlJ&!w4Yr LVX%S700}qeCOhdAݝ|V:\]U]I‹Mh E`wYG{z}3kfh wݮsE`#=Y=5MehyV 2⼞Sk@gZ-v Yi{3<+羽\cOi>iB-FtIvлyi= ~7 %/3+LԀ1?G^[z {ެk)t[Z@H5hUUŚbI@z.,ty5t#ySe%bt.3)ZJetu yV xg*1sa)eƶ:Yļq{*XNImؓ 7\Er hDD?79Ω,rh\wV o2spK6) ˿Qmfg!!' =oZ;:D, ʕQdRZJK r1k] >MDl[$i @{C;Os-vnWT Rۈ &J;:rPF2}w#@9H|.vBۑ snܾT73{n~dz_ޯoydYv =EN:--, $:*3_ײݦ廂G =OS@2, tN:nCifvy _8ܺ8HݚE\_ߟ}]Lvwq%'F߿XظgEK~4U皩{-xytug < t^ed.._2tҪ@\?nN5@"vy3h,.j}/PIv&(Ak*MҵQe+a倈y _{%3wz>;2'oB,7: }Vg~BU/9XbN:[:@788vǎLNN6"C ޸q~bG6Jh|{V//ĸbi tN:MŻ7o&4ic,RǧTME3rfvNѵ-jog:< tkhicEQk1?^;xhI$7n ^h>W=0uˣ=O7S0z) Rʝ64yˣa}^_E }#vJ~;:WI}fvv3c*f?SzStk/ǙM6< Q %?P}wFѵ>tnS{sӼ9~+a1t޵'{G fٽgoݱEC952tcJA])^pw[ Rء՟9+j@4غ~zƏre}DXݭ RFhHX-mCz\޳WĄAyqq`Wg,u+IڲDQݪ"jܼn-k4Vk@[@t8^vjfvɀi·gXـ.,Z_{>[z@G$uT?)qe|v8 N[Q*bev._^1VJZSJm3@˲]{:.\JWwK=@g:w ;kX588vhhhZbN~O:)Il 4k0E@@  $c1X{i瀎T+ VIc\@ 4 D)QY:͇NғP@@  ,@Y mܸqƍRz%8688X,bw]&RdH &# @ 2i{ms: ԬUi\4y<=@ӄcH){. v25h\nܸqk:OiџZzK\QB @@  2bܬkX\q:I(z{ћNF>tV݊b'bW_{EB@$ $e7|qƍkyd8sGk! hC ^w_Dt!˰s5s}r遻)bUh:Xg1t\t@ WzeR-3v}i,9%@^V INKä3*mt0%XIW CYC:{]\zNS$ 9bFFFX(Xǚ@ 0Ps3 wpZ^}ޥr+~nhhhk1)_#|w_9qҕ2s}#I|L:w]Yk q9JCCCwq CU@)T.ƕt\Q?,cH0/gU::w@]]*cK@ŋ{\rhh x%g:#Gtԩ飯ݟ/V/^\9:qv\ Gɤ[uʥҁC,vOU۪]=bc?\mjlfg^~5/VzG{ svvzg_}jwxyz'pv//: Uh.9 z\/+GȚ7n\;88vrrrQj2Cx}զƶ굃W1ht /V< ƖGlu=Vp̗߽<|]k^Uy||ڽgou;N|:xl)9+ s\dED@β-jRz}]3{ xGu=.w`frz|=O-^ךw|};۸y$jvvy35w!g4obĈSMXr?:bג `9z'O3nX+3lkˣ={Uc{w[[>i/nq_ڱwcˮO>,nxwl7֕ƕt^E K+"@:DǞ2Ou(XxjSc[cO  Y. VzOyjs E-65Uˣj__>oWSQ}qBkr8;p^xe,&:r tdV65Ӕa4o 3nq_usvAn9~ܼˣ>ҶgngSmKm?aX繗ތJ,=Jɸi@H~_ۚ\ ^GtQM1t%_ "V^`a;+?i?UR%s t <9Yed} 8rR0\Uy1r||z' {4kJO>Sճ__uσխ;k>Ƿu󶻛YuPT />véUcyCu} \u>Df9o[O}>U=g[gl"Y]|y~_u=rZ!ͷ|mW>x{w Upj3s={Sj#=>c}W w3?Z'omo/~|vps{=z]=^ xGY pq[L<@7pXs t ( tVR.* 왊sncǧ?ti ~S;&ٻzYD7cbVncvU)S^x󺤻y.gk>߼ Emw,>>dI>߼ {>Qݼw|ͷܽE[Nc^qڞWE~;tN;-׫-8;D⛶zw-w ,@Ghm?prVXYs t 2F{cqyܧ}V6&Do/=Sv`XDZm]:vɔv@HuQ7ޱ|k`I皟#-o}_}V%zrI#y~. j4NcI gK-) Pi& +hP֘^d<7/Ͳ)E:n[ P4L^b訆Nh3{MTetse h2A`j~qeNWE-լq0v%:v P8P Ŷ&XCۑ=N]@o\΅…C!xݧB:.e-ȺfId=tPyb(V nf.@|KXmb=3{' 0(eP[M&1fg5T|X슕aVm̞nJE@T.bH<;;WO-D-r;8tVkVQ*wTzzRs_nHO )) /:B#4H $fX{$H*$x#%4׹m"JK-)l\o{Q#>8Wy'ĸ =[m?#Wn[O}O4_#!&Ï:=%F=36tsgO1t^mo-\uꩽϙqOc~@'$d؊tL-m hr1CS:ɦABJdsk,x%Zrr9uTCS.-ph;vi:Mkme]B߫5 N~/f) ؝PoЎy /6xw~&t<`; Q/=VR: Z0FxG{k.6h)1gzˤ[J'Yձ- *xjsʹ1Xj ]VYo7Y7g~S[KgIt+ϕ::Oy9>~eܬ-DT3EoG'0.~MDE΢~(hܕzu/ ʼ-v,Q>jq7%Q9ܴ=:(br?"%ȶ3qD yIwmK륎jѠ^tYn(U;jPRF>'}Ia戥ӌb_MWƕ X@Gk+\&:`J֎7)\;WUּܲ 7֖k]ۂYOXPBjQzɒ0ΕXTrQmJ6QO&|BkN:Od||ڽZ&§ƔDǮyew>@j|KEW4!=OQZ=O%5ֵ}%ISE;%I\Rpz y"sfi{e3l̈IKξQuMNN⠏]Fi+rUIswo=+t޸r||ڽgoq&:]Y@O dte6_=b{^;%xas;ڢͷmdG}+ܙ 9"53Oj9l=HFo|le1t4Qۛ7+21pon Фd;hRN/}__ݼͨ8 $AB+\C c'\E Tkh H鶪՞ˣP Íx t^>yMRa;8}ډ|gyU]c 9 n9*]&m3 ψp#$@GlW$9@h\\FJ$~ht˸Wؒ htRcfvy7U&?jo\yB+4PW~+Y@G^li[7a?O\3{V sSc*عn ;Z;stgfZƸ W?t?j (KѮgHHuu/tK5CYʺn- hR4a K)@Y0{묢׶- cnz%)>,xڬ=(ݖ\<#׶%3DedɽgלfΉw-0Gm=B/ d1N(JPh2ˢ@&'Ǿ@B'4uy2(%x1kk#N5@73;לj]@GGniYM-ݻyP+%)>mFojXU=:_|\úˤF)־g-/=:~eHqs teU.K\2tSn-\{^xffO7Yk>cISNI텗{nYv9(0|yt^w6h[E"'RtxZy$*w{']=Q޳7JzjCO=O} C3>fj{S:MCx듏ǖc^.<ǾtCu;CXևEuՏ;o;.#XRRCj.-(Qj/lٲe #V@F/###k(xz:D7O+'RzgP*nAduLt JT.K\_2tgXQxs ~nqkXށWcr<'˼nmWj}i||37<\ETCG'Yj2kW85(U@o.RJzUTC'Qn8:T1??_\l'ʨBfJ?eثLMg@S PnٲeƍnٲeE׉㬝TԀH-@ V;Rg<ˈVYY_:ig?`DF `R*罔E iL> X2/Ȉ:ƭ 8zFc5ˤ[jb+FRр\E@@ EDɀ3> E5iqIF-Sp \NNNr&''WqKvT[S.O84|!D:בM2Wʥd#P@t;KPDNXKѤՐY@Jdw ?O)T?GX#֎ڍ!ۂw H-l!DINYQ*8x"DQDH2gmy"^`&=ԫӾWۿ=Vc(86;w\?88騆nppp6]0#@@  T˾f2us::: `NԕZD ([zJ $DSLmf>ɂ[LiZ(7 A@PǦ@t*]zY+; `O=k^ڸ CWZYA(###kvܹ[>nٲeΝ;[y###km޼y4=} 9pB #Mm4㝧Ez:>3 my!.нԲ>tXN^5`GsO2N?"RO$b9b膇בuΝ;S۷o/<7o^O*;$.'vo F׍f$,C{ta2ut8D?: y6QT)xjl Enݼy-[۾}{I풀ZpƵ;w\x쭗O8cR&5Sжwr]:ZC ELe"EQ"VJC X$}ӞtmC{1rLǒ5#@G`mppp͛?rG=s8tEE9\j̝,fXH3S x.QUon:gV<@ E5tҺ@#,1T`r@ y$Dݚkۋ&ՙd,H+a4D*oy<۷ooѸv˖-ƵHv}m-kdF@U%\hi>m#@ Jl 4rX@&޲ND?> q1=H/6A}|]&۾}{wܹ@N K(.\P?~wrc;QÌ~(} #+`O!nt%˔(;{ PD 2VrbMa* "%8Pj$Khh4%/n%Guw$2??_]pW>걏ʤziY`g]V*fC  / H=toֲ)W@]"'r%rҜӈD;v"7{[3=^/nݺ}H, ܹsm ;22fddd?|>Q?WŋMpGǠ1[$RumG{ox>@ 貚׷ FErgY@@*^BY>I~w4ΨVf4H^gK@@DoaÆn6J|^Goذ͛7߰au[#<8},,1+,3)ɲmNt=@ 2J[Q▬'>YC  f=4 ^'[@t@K$vɈʥ&/5Q~"QC@ z YbDO#ƿ/48(FiZ|;1O,|uۯs~coWu]w]xWR]ll^|9lwyɪ$2i4,p@ e tPC@ Y">p0ؚR3 "F f5#u jÚΉM^?x!RfVvYWC@t3yY\ k2nCȜ:Y!%A$|"e%url˽8[G)֝;w.4+ݼ3bwkMtzw@@ e|x]rL3'*Z,,M8Ә:@ݹs窟j5vU9 I`'lƛN2M=/q^*f$@  TK~NZx:MMF fPQ3gMеIs$bIH!-9Y'ٳg*\/mm~f=9hrfOp:u|aK@ 9GG\?9 AJôc9+YOϊ:8v("aNg< rIpWba@@ %D_@ZT {ki"!;w:96W`ccՅ 3gδ`S xtA{ c[뗞pDe-K[:4Z2#*@d_#,Ld@N(?xO>t"J"n}fP2=|,/.#|CUJP7??_9s:sLuܹ̙3Kjy+_~;j[J`9vՙGպ`JQk5vEuLZkͻfy:BY#ȇ۪e26RSZ@0Xە2Lڙ79͊_x)^m@^#Al>lٳg2b"F-ka/]n,.tQg..]/5tZD@W'D\Df'Ʉ2ٺ8HE?Gr^;sLueaKU/50,=,w j%\-&Yzb@sʊ`j%T.De6y&dS0 kY$3@{Y 9YKku:s̲s舥;}tS,Fqq @]ŀ/ƌ8PY}# CkUߦ\j #@mx)e'Q:fF*>Y<]v^ڞ;VJVv@wh۶jvvŧ-)<+ajZ6cy">!6}#Dd,.IfnEX0]55!i5fM3@DzoiĽĚ{qp #-O:+ƿeF@GtgϞfgӧO7ٳg9.6cpr_ȯAiE]^ @ZNG t$AE0Y^s˾LNDA@:kRhyyU]֫C YHku_@g/}Y?Gt.\biZB6|7a&R yJ!?ri]jY}rYX &%?9X&vY: z,HO4)! S733S^:Ǜl\9M풧YjqO-AOJJ@Iq+г)XZ!̕0h?eru?mB?1+3̝d4 FKD,ӧ~70:ˁ%1t@w]x/:cϦVYX)%@q`{^s+Xar@ "@2Z~k.mbfrЄ5!cQ 4$,?GٳWeL_?VML 8[A,K Efu֎ǜ|VQu?XCQt[Cg\ZsCG'@d\Iܬ25F!SCM"Pii4h@DQ8C7;;WM}{t0X #N p~/ yIUOWXzgbe:eLƽ2"::trgD5&n4QHظԽ'Y#o3tB =FF2d]@iI@Yxga)Fb<ٺڏ9߼EvtV&~ϭcq e 5!k"+ϤrE~VY6tkRhdbo$3ǁ=>|h9s:|5;;r;җJWٕƁ pK $㿝';t\VgXl1?X.uxV(J%stBZYpul Vβ.i}O$3usMԩS|.fff&#Gt q Z\+:+ 7]-GG +qZ!+‡*R-VڤNLoM#͚LpIdUgRKNJsv ^5;;l`)͔3gδq3pl]3R]aKJM߀Nk\ĆowP'r!rY[{_Ue Q,Q*4NkD_23gLݩS jfff.O2VWSju*,3׬ϥb:ORff= q R˦Z@d,D倥票yYk-?qR+?ŗ6R&[^fffWL|睟^l%<;E}AI@R4 낺:^8G &p-3Ӟ/5I dzo)+gs#q@p+l@ 'GFN|+]ma|sY:@.˂Y`ISfte'عE !:`N+()mGHhis3E&&PΟ?63Sɓno?ywUAX=0浉ΝkCH,AϺ H-tx}c-,V@ VeF{@g8'&dЋO1Rꎬj`46 d%z:J$h'O11Ts5}9Vel dz;$(֏F鑝.+4A>uٚ:\"qM{O'T,5yd yY)q@J`O\@8w\u…4@nY@jffzm쮻.OR.9Ehdk)zl( eg2_@h4V[`[r\Q%O#0ĉɓwIK%<%㪗VfI#: =:l|Kt.Z\)z݇J8 2jtuX`WWc tV,/:f!JWQfԩS͆::~R-IMaJ ̙3 jxj،|ii}3k 1z3KtuY:bT.5ԁC *9ˀBLشIjTo3y jth$p:JǜU"*333|rـ>گG[عӧO7 (s@M ZK-5Pv}\KCwΰYKEFQƒƯqֳvg9p˼@@t/,QҴ˪DQejt^׶M}*eiYre-%"S4RRiϟoD8sLNt'OZl_zl 8+m x%]<ΕL-NfkNZxFu,3@/OE,)hHǾ<,Cg 4?.O gꨎ9.B)SSSֱ-uxf)A!@GF@Y4LilG̱@x^@bb>=\J@YR.ei$:@LJE %v"5ˬhn<5W 'U%kt|6Ir@ ) 255Urujbb (R/ GRX5fNJbY3Y2P\^>2V'g@+@}ԃ3{: :0tDh2Ye>kM2~r(3eY\\ [LCiR_Eζ\Bn_@d߁|rlja爭P@ J*gΜi$~} ZN2tZJq/ydxMf{=.r1tYOR.5B<:nUelӮR-R%tls.'ZO,f-H WTHVsUKJ䊞rįn9HNr˾"䤚j kF%cQZǺqE!;]n=])8Jf)2[. }&Wx XMX“$iLTP$0At\NX:bx%5f8kGD5/-k&M T$f+, x="?dz:{Y^'iHER pmwG@~f}-@yh*\e 5: 2LZ)#bMJ|xσ.FUWgHY5talF`[::&% Б#'NXsj__TC۶UG>&s~|nJVW`G7iʣ<ݒCf4Fbyt:*8b:)ٌ[N2t.ӊ e!2"'Y04N1M%|Gf+AeG1p{ˮ3D@ H ;qdS$ԩl1 $AtO>tC۶UGキOV'ƚ !gHDQ%r@GrPYg$Ӏ&,]I].øY $=p;Q,MDC@\5A$whZ5or2)S0=,m˿OcLeiwJc؝={Кu拞~ts [Hrs@'GzqWk;~cYwpՑOV_zux D~qO r9z pL@7 - h Y bX?b-^e͑r@txC%Xʖ}riqƹ(ћ.|e5*4eW޳iafD5Jk@s^ʝӠK^Y #&(>6:OG 9sM@|nܸQ??kox7n^|^;xeq&Ku6SwԩFW@pA,r1*ϕ^ԚF%#" Xz@1t^R3+Q( ћ@͛D~g -oHT^fҜU)Ԙ8 Z:9 ڰ\ KE,OI$$=&&&@Ǜw/t[o9vq3s$k9dyUs gff`paH\2uKx e/-l )},ZB  4:KḘ:K R-QC@+I.̦El{vxI pH㢚/^E̓cܓjH$/-ԩ믿M/sGs0|Cǿ pMə8s8CwUٲU(t\h3u;w7,*iiVUpzӇ?=ubxsz>^7GL"N:V1ٖSnK@rĈ8k̜d2%fQHM> -vm˲x{g8MS\Q΋,X:w@]Ɋu'5iV#v , b(94Gb(\ȃ?)֌78x>O~3u1}6+X8$8ky4SqbH>)`cV0JzZRWj*ߧEm[}uX63X^@yIac2(=r)T2uאr@V#!3Y;tZe]q-%b<2puW$;'Y<1fڼ_EtF]  ҁoaKJ%8#@X8-}͵tf7ʗ;'.=!O('SǙ|^n[̶g3?+-:p"t^fKMR@6E%Vl%ygykIzݫc笔;zTWBS,frlpL2 ma`KK<`V2(K.RcqM%`[@355ުyz?.#+ˊx4xjkL4fSD,CW9bmڴ_M6]Ooڴzr< XAb$cA.\MmsWl V2: i,k>b\Z+KSDudQby]XQ^UC;  "K@・VMe=J,{(hiZ%:yn\uW9iqKPo]شinyӦMcG 3xWo%.pYN8ْZIS09ʞWZz#oc4e<+ !)5MEUXcekD1tmAT*"R.RSq! Jy@dTb_`M(=(_&cKK޲-JRES_}`3YqF%Bϟϋ)D8o"T2dzJTQqeYR @wp`3uqof p@E`3xsҷ_8#'ٸ>_&G?#K)g渧4PjZB~A)2Œ=DZ9+,HE,SשI̘bii>t?{dǃ!4 x+YD͌ 69&'YKK%3H瀄〦U${]B<* 8#ƍn(;00||x +hЫೕ)\@-ILހV%Noyd;K SEޓKK,f!tXܪ.KۂȄ;\" V`~[Vc첞tp+IT/9P\ uАz0zd2vAk;& _K m  -qWEyt̼fƀR%? gtu(8c7cDF{j)'SEQ4&HM`\"z$7 ؛eQ,CtMzahI#ki>N" ңeaUąQMdn_)뜩{;TN)1]ʴJrɁys\`F˗/L]Y ?SdUt,x:3-`y3z @,i⎚A_l7`x0.hBJ{[V*: [zlkҥx:i8k#@G@n뮻6m "̙M6]up-qWkZ:[PfUnN͍׹0'੭AK-e,?R+{@uTK]~NOK"l DC e_2@1#R6j=_e,.-`crk|\c$*? })2r֭#`.:bZ+7M~Iq:&Z[*9+˲Q?s*+C zq'3 %3UC)HOyҸ7{ N[ΤOf33)P2JfM`- W2ɖ 4F*S_2CH#BErLξIL_>}:<ۯs]w ɴni<3}ԘB <1t<3Һ@g?,&::-2ƲԲ>sQT-vV7O7V)]jTEłZ%|rB|6o>9Mnr^jq5Dμi,L:2ZZDf LkcJjd5mvə:\9s 8JnO-q=Z)V ID݈{>k,FGuD 4FK1~Yʥ<9u C zi@)3to"frU2[WRSW"_:L8g9) k8+'2{mݺ}RRK$Gm c-(q_<."9jIfٳjzyrUͤ]Z a紾y=w"l;.Jj2s}r{@DoD[QL{+[Mut-5j!Fd2n^''U<g9* wg<ŕ^e2Cu{E @ E✩d!Cg)|Ө-`]V(hgת.#U} I|6>wր ј88Z6[9VQ .9q_;tk6P%$zy Ef\,Q\sւGoMJJ<_,HiX({qV偾"8ГL݅ Ԓq!r2fz#GW_"nÆ mݺ}S}ぁ_ܾ}{$39ka}t i2hcJ"XƬ;NtHLeT.k 8j< @ I|"3#˾tVNpX Q\J<"%~HgR.3~%in$[q6hoxjehKO5>q#%_>ogϞm:* ޿aÆdmrS@ q1^m x:)1tqZ5HR,7``صձ.(en?ْ}FΫ/K.~gҥM`gMjJ)+13߲);$\K*qG__RaS*V%Vݜra2WsI#JU_y?SR։oݧ(%߁@ I0AvaEl 4:q`Q D%@-biygij~d "%%~cVmL߳,Yg,… -\@1qTLJ$Q>q%KieIx%0րl(,ۊ?-(duY;-fj}@tBm,VEz7`sުt˨aDP{]*D8^4Y~PxgOŰW؆rk6^&S:{l5vXW%qwxxxrnΝ%#` Wܰau<7A'9w~jdڥ[XwIΰ`Q*"tLg-WDw:n.GYQ)y'T.wWw.KUM1ͤe޼Z,sW|`ZuuH H n֭۾}{o_9ui7O027Ood"pMմ+񞳘F} b콭PZX]df1sv_X6sq\"Jjd&ALff^u2}iuS|b_"aiJ/@e] ìZe輰dHD zeӝ"`gI5&MOmԺpLF~uuZƌT/8l:%غu4K AiZ r#+/R-Z/%,QT##L&ny?xӞC E;W.2pi1v`q$țd 2fu/*\g ̰iY `jN2z݁&,1tܹs:zR0۹szJܺuxʥWgh{GVoaQ-nkG1o=Ivp12sD: yutZb_YY :wA] &gY (a 5``jĶ #zM6iZ:h.ulz#_tKk\@:.B:Ϊ$-5~7]iNBU7s.FX6X~@A1L[j* R.v%O%+aRaoM4p:MKB)*kUUN4PcIpyq@G ]ѸvMab͛S% *lQ |F*g1jPJZЬle=";K@tj$))]a=GA [ D2#]ZL>mS5&۶e'YA OSH$@C0^a$uNxZv):d^P`/rFj%fֽ%JC yt23:O#!~@gM]&%dT)'#vж]ן˓z[6RTcs,i{JGH03qd5 iiޱyǔM1眖k13[G_SVJp@oA'ϲL]?89l"t4 .OZRG@@Y SQާ >HHkre< 끴eW)hzfL5'ߧ I0)Ch۷w˖-vܹ~˖-6o޼~ddd͆ #1۷5/}R_Ĩ"?>;gy͵c?I˭SGgjݼZӨoYy%`C ߌx:Y8YhC E7hlJ5ZIkAYdyՙ[Ԩ!R<^CS)wܹ~pppΝ;o޼y= =O)TCY8 zV^]$p<< l1 /HO$f eXYVy\" <˪UCWti[6ըC ЕN^JX<,f 2+gU-9H&V[y iiVZ 3@G TQC$z @@&TueLۮ7l"#񌉸7,3&jY߹Lx陖d]`Xŋ:x\ :dܬ,ꁷE~c-VX׿ܟ}.@HZFJUY<\"2qބ̛d"k kZy=Y̎d"c!JY'S -@'YukB@7.MaI֋<5*Aפ(" E}EN>dYLNT- sWC `9ҵuU({J]/5R&ڤzox"ej zO jeEM[Z"E!R$PGs:{JJ-%J̰عil^~tuyOv@ нQ:Cj !JV-`cM2`TU؂,H2#1tYUȰyZ9tor z( 8J\;22I FV  '&`R~3c*^̤W0fmx҅,h;:-%3K@@˦2UԲYdZ,/--{ md1m8;|h#FX#}xV "6EǰeOJ==td9-k%)ڼ H+y7(^)1vY,$#$ub툹v4ʌ:1tF6P STQ-kAX7Ϙb X^@tJ:r_F`].1ngUM"&.$Ȭ&@=.R~t+NҢ"5)\¶-0bʲw%ce#`I-,7NhGwEc՛o"g܍!!v $ˤZ'tJ y5\R3>Ѣr 8zSд@ Y\$X ^fՄQ":\""Q˨e&_Itob@[fYDŽ91$-FM,$XIrQZ%O wx쭗dʥL iF2XRiTǖa9z)JXdq*kl0@txCKZ9Xno:iqP@@.˪YܙIWmZ(oIGO IxYj,ঁO钋<ג 7Jb(Һ@Yb,asQy(fPE~f~uS@Z{Ec4mSS.^jpބ7S-bYY5yj%`)|,N3",)rj||z#_$ƙ8bx]i5tVgVK̂ltk׍z-es/bằgè@t<$>Y)b w>X9ob:OMjJU"FPS0p3%,]iW?y|| 8J###kFFFlܸqtI}<ᆲ_ƊNz,,yY)\͸\dC E my.C@LbYy\{oTW5mk1ڄ93IB;5u%"+hHE(/^&&&5t/\rcq.BJm]R0%祗j eTX7:+=R^x+Fng[izby]^q>t::\V`@eV3&;qvy^s%^Vy/ͬH#R(Ih\KZtu_o8qtEHL X׺ hNsJ,NC Е\3H:0tDo,ʼ%Bф;,`VZwm'ȤeN"XiY&6>>4 d8+yI7<<ΪB`4֮W\ fHѲܾ$%3JWQE  "/:e] 40ǟC%ћ@.ZNǵ}̊%dEhJ; `C@ {X`IcHedddΝ;SDᩖ9ʺq:`SDTڹdg1\ b{GY@ 5L5֮qrc ]Pg7=&NߒmfjjxZb/Ii4An8˘_{)B$:Rj~'nΝME7}I-(QԌKFK}e,QȘGӋa.-VLʥ"v5tD:orMP-;y&vf}TqFE3|{fYĒ׌ Q%W稖l 7}ĉ%AW7]2R0s%%ח(f3\?=@t@g[bT. QC@& hgJ&~%E6Y.Q^ 5rujmy]p\`[ '''W׈ɣ:Mc:fFl^ĐE̮v,Ik! 袴K^Nx;HD zyhSb̛aU$T~R y:)-@ ^ɤZf:oQϟ#G關+|Zl=2i %h/ha @,=z:JUsC% .]JyYY _VԥTt!&}^>gjv8 ,4p7n\;22Ƈco-t)2%Cu!K,3Lmm tj HiE\j$cqA]H?UGֿN.|$D =~aD.u_tqCqznƍ: "AR_Ve 1(KZ>]s+ێuDZd]v)k8ɂ_l VGKoٴ6#LKZtf, 4 5JȲ'uU/K'iQPZM,d-[#ۂ(3Fi|$XE%b}OJKXI nrYp"Y: (2Ԑr@ƍ:x+;d - o:&+Amm/SWǴO钋puz)XUyB)YK^b4@722frrrnrrr|7n\K5t} uT:'k akɳ.kq 39l/ZC 0/M;};r`hZI+6-N*R.\ˮЕx+oE^VD+hk<\וxekב/H'Ǿ 7ndvܹ~hhhᱷZN[]ˈ+ 3Jf^k^+_^%CGcM$ɦZ1stR!{VJoҥXٚRqo6J&ĥc4v&cunz@XzK\RZeXMybptZ>xvo|Zt2&ڽLjoƪCX߫nƍk90*+N+]Z%=&[`lMwpXo_VtuWW݅L?:ɚ:MRrz݇N3'$S?Qع pˬVdS$3' nBI͈&ֶ-GWQv%5FjUG,:X\9OHDC IH ~Go5=fKzg's~]mg֋EtXPJO*2Ts%:]fezo/ˆEB| `X F6}(b+f>t}i$" ,@WzB0XuXe3*UptMOc4[S]В4wm?x i].1U.-:7hj7g:Ju1iZg笺f6e`l}^:Rk4kco;?HZev=3pO$1pQ[~.ܫ?^ˬ83go"ߒ,UYβ1o]F^t޹{@oDj7+.l 2u~)نnYeiHz2I.ӉGJ}"R.ū!DB*E#e&ϲger\uJZܭK eT.պv 3,[G_fj#eikmߝ, YV@/_&'[DQh09vVS%; kRR+.B,] ϪD?kW^3jMֲ")o K3n +^uQj'gxezh(J_:OD ћB&ݲoiS3u9xl6ԊKS<8b,wjYYFnddd 7R,oh5cB'r }dX2,c)}YCt]<ݻs}.gffc?839"J+cq˚!JXUCoMvLGs)R處{|p񿥆ڠ#P'U-fg@>t%%E@`^gR =Vr{ 3DMueŋ; lٲN^!/-|}d%q:S]+%fYS kտTv<{@;-piX|ƍkwܹi`l[VQ5X_VjP;f%Dr+י@#:V{w g5竷7EQx;'*iN!?`dV3RyH.2:oY { i젷 o)?3NNN7EQh sxrrrJk"|sUo Z`\߻}0G^ .TS6o޼{R3h4#K7cqf‡A#ZAϪhe'D S)MK˨~ΫSNG&Y 5I ȵW:ɾV۲e: EWx#ۮVOYtJH'co;rI A&EOz-~ӟ~R/y%K 'KD|OQue GJ{fVW:|&f ƺyrx눯xir__2߹szn[@TЮ{ҩSjzQdLKϩYz+ٕ|z& r'׫qҥW>x=Eb] 8CR8u2C@ Y3eT4va$sMK$>`Gۏvi7mqmrrr5`ntt5Yb[YzLkĂ"SC_xӻn&!ŗ#`cʕ qIN8x3t֎g.T.vN%$e'_%:޹)QŖSwWfW jWf3#FFFH:ic@ ey VG4 -`^3M263js"~Rz:$4LNN/%#ge"ut;g!g:H݉UIOV=py@"u K&GP,zr IxȚ5MIj E%\Y9ד<2`Ix/Rvq@ׇqKuQec^:f:KqP@@@R*2Q+]yǺѬ2umN3R@41MLLVcG}JiX=<<3urg;D<9DzگJ@q.3\(iR,f=I?EqҥWoolvCCC4: ꀺ|4p[\" Mz wIP &,#!BdF$OL 'Fl HBv/!@g@tc=^-afK=J~skd*09 E ygRߙ9ϟ"eH񌕁0{l JDQ8Nv&b֤ZϮgkjJ kḭ#Jۋm d:1yI2tK4u=: 4ZTFo5C j[h€j{XFS왔ˈ+MC@NJ` x;JJ͈;Z vVk @]R$pٸ7^GӜX\1V35pv?VrG E )K},..]8l ˗goo&i؆Z>tHdAs轁tDcuoVM"ˮgTK'Yzu8Ji_'&&7JK&rܱUsU{[Uk_?Juq~f)췾M[lYMLJV!?q1KA_W]폄8AekɼAW,@c&ecwxۍ&C!`Gc չ/: %f,#Ruc d`,@Jaf2SE+%*uӺJ?SgaY1O-22Sb BIKPeLT.KE.35F@,8e9b]p:7+@W[UV;{sbYJӈc,|4WvR(z33l/39΃ȷ6"CNZs- FT/` yCCC9اҚ9 0G%m2~x%*%@$dX7S-ib(mzHu_եTUo.hmWAbX&_:)"=궮-NSy?.|J%-`P2+I&YL5y^4GL- !/S.9P#;v4m dZu\E Csg=Eƺ@H-eJT/"uTC`nٹ3y̍+)?jkMq ɇԝ?3uMa:(]YC'J C zeIĨTR>ZyN*=qI[]l7 RI xlܸq-bܟVM'''WT.Cf1?ƬPLfcg?TJDP.^sr^p .J%o4G~u~- 8#@GMAϨ\zEHD zc0ɬMm*|*dٴhKʂ)+òmR- T@GFFlٲe+9ڹ4 KvR3}N@GM{Z5&/r1?=q3ZU_+5o'~msoUUF?O?e˖uh "@700J;n=9! J'0͌]\fJGi7lG~g=I/S5FFFh4JK 4@}WT ]uy,F -KhԆWC,-Sŋ?ν[Nv%Ml{K./UsOqg?q0G|O X+99@   2Lu:^:hzD7 Kxi;].sD)m||YC7<<+peKKǁߑ\fL5ߦH$cM2:D'Avֲ40Gʖ?7?j雪Kw4AץVՙ?h69ym[K窓sYcr)Y: iً] 44ʞl\L2-zd Xd2իy@F~W###kx]X=99jxxx𺡡[lYh4z$=p[3: dD'Q#(Ւb|x+ODʘkxi/C@pE.2뭓[)ȨgR&ىw2%RIQbxp!bFFF #d5M2`K_dCѸ;F;e:IJ,fҸ-@Gb4-UoT+ut&{TgMw^ ]mk?W}5՟ Wؿs7n./Uem/'&)zqr+b i(^X @@jaE'Z=ϨBz,M-Q+G13y/ID#9:JR srrrJ֧EC X1y @tMuj{#Kjݣ,0G ] /MWsOt}+*o ~/SoovUsF67_t#t'yg.MEd4Nj9S.9ԄQ,7 UR MiX3 (b2 CYǕwK8_툧x\r@-y=OY344zƍ | (jb.{,:̨eS*5uKɵ?Vʝb.z-#߹D9w@Sg7Uܪ^]ѿ^ysi? Zέ~W]_=u?+Ϗ+:x~@7O:L%,gxdϨ\z5tDdM2@O# #/N# l/?ŭ׫jPm p;v4;99R022[M@%R躮VG2˨Ynin1Q4ܹsr y5:x./5kfOmhZv{bbrjWѸv.=Ki='r@ J d4̲d% ىwr_&2\i[S 2;99CGsk9x<%ɓh^y핮((FY}wxnKkoK[::'RӺKZhd${踲%ž}n:t?Ǚ:rwm1OFC 0e&cىevMLK7Q-9_JQ &MDqv 744Ԭ#q2)c#3cm]˥,p'IBAD/Eety̙73/8[G.j$;CչcO?@Ѹqf[FV-8_>9:X]:NL@eLR @ mRT. ECCCI4ehhh5)\8~3{.;)w\@t¦-X\2t:G҅s :uYM9;C?S񺹌LR#@@ dVZw76q̀g\+a#}s;S$ĉQ=GkE}uػ̵JVKG2~d}K:^t󚗧)U.eӧO/J%?JuOeF7zIuanzQ}ݴy;v\C^tR-=NK dַ㋢@ zE+cwIN|s{K&D>#M珏OTS8+Gl nIutЍ^344 V߬)| w}Z@F,ӯ2,k@SϦΑ盀ٳv)'\a#p5z/W;v2Ο? 6\G rҥLR--<*Ve8/dG mjdfN)־L]y3ЎO ɶUk'Յ c?:QY37::z*Z閲nbrj[aO[xt@,s}f^԰fTJ?ы gy`\r@EQ(̙3KW.]8WO}:yϫ75ۂR_wTS:,: 1̓nppp-g"0G#\:v^ď}R?0DQ5͂R-oRe"VZ)\ԟcMO=\$:sSGu koozͱK333wfH;&YQb Q:%ɀՒk5:ƻ:ꖞ8:n]@nQ~toOC !h*M&(,j(5n΀~y:~|ڄKxb'#GW?~R'Ƀ-) ܛo④ǫө6zVe]%טzJyQv72 R^/E’q0Ǚ3gTs+Zǂع۷wÆ qQF2 -T\("Rw0=^MOfg窹gVh[_X󣵙ksffO7ܙS[ƫ7419HQYAX:*:Mu2JɇXs%`4Wyϻ1dn&эnm{ބ1f&s~=vJ0dM;gtmX "uؗ\[0`J̱ };121ycRMs}7)<22HPFg&''WI3wY@m\0hgjY^f5W${xI)HSt9v8;'d8K^t>%UKͪ@fH; ;畚YXi:l L i&|.eis ,;hu;T~t{uxK@H".,h d]Ϝcy>h_:N(|,Iv $F\rhhhY.SdYl[4G4,+͛gř|@w=?3l)t:vŋ:Qydv8#+2%nYGˌi&?hn=X(>ko1~cvd{N m2a+iȲ_ٕ]%<{bU<"ĄIE0Τmܸq-9g8I>d{~o\sfoͻ uEޥuu>U3FM/<`[nYђ'>h#PH`iy{5xRݞd 9hgHfӯe#>TKZJu)]9I$pU Y5u$Bt&&vqa-RK"vN2t^h4K)"^"@O)S1c|iލF 2%+T1qY:7̾[^c:yl3:7,L.(8䯓 g}\4N3rbmM5ɺi3x9nE000.8tKzg5k]OThvNNNҘh-@e.&ԋy`T: eR rHQTךL=Dz5˗/NLQ[\vN9}DŪX8N3e'bM`-Om>';%b *vk`3&}ٓ}b$g!IIh,6OAe:dMx%a3o }*wpIK*6(*#eh "vhKWqJαz+%h Z޶ٚh,0dثbV6gDM\N ɽZ+S1p~YBN^ڗoii)PZҹX7vY3mu2/ryH;~U|E Ho-H< jKǯE>yםV7bY"[[옂7ւKIJ8P<$[Gn֭uu-e*˗gk@Ϊ۾}{ҧ5VJvEEѵ*cnz\4M(F FL1{NRw0/lub^;\k^~CmeW4k)dK&MZ(cZ+./N4/MW&!TۧTMb,uL dy'0,j#(DX(; d~-"PKDh_~|Eѩ1cQWs-(W'߫1u2-ԮT<?*S+4K:sQݜ:qK[:/RR/=f.2$_Im;J6Nb6;;X`)~ }7&S]y&R._Zi]t]XǣE:K͐[71X>sA =ʢGݪ㳀h露6]4ɻ4$#(=itXV^{N_Lj˞p gF`GbR۾}{ iunhhS?p/^?s̳S8R@-0'kcjb2Snnw3u]j띾lirB9/XNPT߿Ǹa]k~k灢R84|ke6:m;?A 7&.>,A Dā duB>OEp(@NX@?ikC? 0G]N;2ؚ&c\@ڡC>zСNL'N8qr̙3Ϟ9sٟ?qďuС }Pw &ڢ)XZγ)hT˨g-ePl?XM3qqލҚX?zQ)o{|tl:[]m[Y%L;h7)cʷDžF=Y&>䄝 x ZRɅPV6-O4@xMoHdJ3օGDQ:VKsLc|O5O92EסYb)kF@yiӦj< 6\GF@Wl5lf.$ЕxFOjzW]ڽ9, ֻeo@`9VQ7(s %=߽E~OyUϕPSd[Iu堆/O'[4;-Y hidqd",-bF{_j,.tjkK)-:Yvy`N2̜I섡xWȶz]Uej,ճ̄J%)t>\(N"کAr)إl_4U s~Vjlm;[_]km,5參|"wXĺ7LߔRz@ψ&Ӯ[nkr`I {IQP7.0AENcgtoEG[-wRvȓkeܦ~I@9S g2.b0KYXN%V %FѤ g%5KtnpYjat#LT:j׏wN̵։JkWNB(9^yMr qV!7vL4(7a̸3,l+M x!7~nH.S.VkESoַH@GTf+)_xtј8o|+aoJAn_2f`K)g)dJ` q%LF2& 8H״p?99(Hqe]we ]=Wj:d, Ygrdku|*|佧L2œkIyj1G^AmEQ[n9nYAFn'Y& m k&ڛz0uWIlڙa#K&E\i2bwT y&V,uzMSԎAjؓj|Ϥj RET:ɦ1ckSM)ZMgdfFڭ[OcѷLєDYd@JN@$==L5Z`ZGƤڍ(sSX׵vV4n Κh[S5^V>-)̢etIkRoiMNm*f2ObQ4{"ր |uR)ז sn+@xi-^6XR)4I-]2& G4UHrXdRDEB=YK+ ?^ua)"R9J%)zAuAUE%3N~Vkutھj[۲@7>cej3u&K#F%c?J.Ud=003!'vK:Y9"&U#Zh`"]M.WzstR,w"+sZʤެꪕf+oX]RslkrueQ7%SZI__X"^Bɦ+5^1rˀ*j9X)]5ѾZד^1w_#:Y5k0O\ÓiV\IP)d6]Е^_\zRJ$ף7,% r7:y-tE*uaٔ6+ssϾ/{nVf"MK02BYP1WDRF4"*(I͜wYb]a;鶥_+?^-3ҋ3qx[sqP4n) EW|_<G#) m.s1zEQ$gW. }ig0uP'd`fK&*o.}oFX;Y`"TLfфTMS|hf*jߩ h@ 9,ơnM _D@Ne!KkJ@n) KQTH@R5?bJ<8 <XڱVS8yqF)S:=W,;Ǒ,s9~5 d$ݽ@~j,UY$H+G<év=(3 X#$* Wi;Ii[iƾ}%pk*kt[m SgjnQk.Ru?UХVVy2 iG|g]Ipk7TS'drjBs$m')(Jw3X*{r'NUMx~ޤ.QE;3ϽƵ, Muv6M̓0,ƓEݩīOTM 6uJ#tI$w $QqW|Z<6pN8۔lLQT;id&]r:7Oz%dJ}LAd5Mp::'܂9^;9wH溁bw]^z}ݴTm˻S-955~GߝaxDw]v?𪡸Jݬ)eSK܊*z'.3m . ՌN:l5W)Ǻ륳>W9|\P)TI©ԶfP}7:P;rJt [קSܻclrmL 76-HM;zchd*dwp7źZ;a6GNۦުV4"5\O\BOzՍiW[:ֽ;=n R9VEfӉOdB qMJ9Qw90n E?"UNNm,Z6иH sQ[X7و2P~ 6JM+wNuDi][rbۀ-T)aLW.yK6MnZ:_ sI4j]j2R>S3n]=$t6iNmQz=9 VwDiʍHU{7N;O,tlTӨM&!I'Lo퓩HHD]gmicq%u]nrKoA Dqi<d遛Y}:$KG.S;_Nv@IuBϹu^uIw"^.un5OO[t$7wޜpt^KA` &tEFj־mYv3{lҌ<Qw.mc0m.ؓǪTQ&a7]S"Q57l{n;KŚou i:AQWijJ=Lzm?Mti3mO5D=6m&j낤6ΩL@1:7!U* :q8Mcv+.9Sߢ= GkU+_];c0t/5WW{L;:iӥrtm U]*'N9\W3G%@ɹN4d"FJ<گ;TѤ֭|7Np)6T!WSks:AfAV)SUd)aVBbrY &%Ur) B'6NWq۝cxnq\* }9U}tb6mNER>t@YԹH8y6:3&ى4m=7uDѶ.ם wޕhF8 @1qWݿ\ijKjTd{@ *rqj PuwH@1: N0uFJ!L3\'Rz$ϐ+t XR 4Avꦩ_w>AE0:AxC`0#zuѱ'ST".:y>e J$ 9ZO(IENDB`PKL\998instagram-feed/admin/assets/img/social-wall-graphic2.pngnu[PNG  IHDRPWPLTE ߢݢ쬥榦̕쪪樢԰}ﭭﭭ멩ø처ۦ쪪訨駧꼧ﭭ!!͹ѾìɴªŮDz ݩ2c8:&(q==J8mIưhdⅾ物-9QrX)UuraHi6Y[SvD~Uu؁cu}MM//F镵e욭yQhtRNSCc%ౡ3rSSTE5&t5ssFDdd%T5Ѳ%ಢd#ЃTs4%eDDc$EscСDdcT6Ï2b}hEs/t]0dbqc w%~0+)3% \xvM0]u鏿$?eWSs_ \ȃ\jLw%oh@|O8a%ĥрn4A0/4#o1&R7рVT=Z 2>af..Z"}CG_پuܚg!5E0cri꿞$/]6{Ӏ~_DXJ1E|v> TGA d0}Gjp>[?87+!XYRuLu6A8_; x7_"n dV _ofoz'l]H}9G/$<5UA܈ZҀ3˴ ~OHhi52~6r⡼߾׍*B:/f;俵475 =[|ASO;a@#r]o42gX)a.WxpT yҀ(XE~м[Q{BvA@*r/&_S$* |HB 5O>̛Y}$mB;dcA@ВY z +x!Ӓ0h@%$ N3VԺx @ y5V 04 g;ڻNsw/9ݵOkgn\lGpmLp%^o?m2HwQZz#G)0W" W la.nKã^CV~E.k|=Xf? \i 'w]֬/%ɼ7YB$θt6<؍@-:*`7Ap`qЀ>z}kQL!3^"~_\h4[JN`  ЀwWvO5dpg $ D+bx9D)bTAwdYQIu@v4!.`0gH2~H&`aYEpӯЀ${Lj* 쮒 0S|]p{z@KK£r2=VbT3{$Sq+@w,W zMcE=uaBoSJ~G1+d^[臬"I8O_ 1aIEL J (y>;oA-}ȼ`G"& \pb-0å9.=1 րTrNNga"])ؠ6AX> qg~ .IS_30LA@`Xb> (bf۷WBVJapW4Il aYC<ޝ0T/E!یcdޞa]]N^ KwP܁CN1~D1"*Mr/F}l0k"{"G`|7B~Wz . ou/p01*MA# g&&0-ww| FkL"*pݭ&! Hߡ5F]+5w+:寀NY*y'?iT 38^_fߎgG>-FO:»'xl:s% a!lEpRܟ4H!!p4`:\[ }DSGwfbb4\?䔜%c?5h_3Ň'>Eu8Ôo*1qNkP4 ?M@_hAsY\ p@t@`%3yח3;Gx7t2 1$ѓB3JthgwP34h9M46(>H4y 5[|wD;` w.}EiWE x[@00ʁ :BAh?slj/VF3͛??y՝3ɟ02Xiq]Ԁ`:6;M]?gh!la#cS Y/U704ARX61H}0cL1>uT$A8FVfEC~ٱt  €f^n0|620.ݫfd[E s7{a%uԘ.3'TW=Ťq#n%Z7u7FџٱSL 1F@kא91UQRtߧ@~)4 LGJ^5Ub|;d +*j}/uv]HS佻y-*ݑ3>;.{7GuOX1R2DOS-u7#o-Ub4su8!ȯdώUQUP|Oezw0<Y>UI6GNm$H~X]JWЮz/6s0>e[\+ lI@:jO n0*BR2p3|2ߣ&1q:N"o"00.Ez዇ݺؗGLy~:v< O1O4Ϯ? wn]zPECG; K"o37]i}ko_E%ew ݕX6Sƾt=mmľt[3&%mMcaA-DdlDd cN}0 p婺u{:N?zH[U[S g{U&мB%˷@ 7 W?o$yӤX6&.s2(uO#nS̩^i_O[hlkCf} A?G'A+005Ifd:PDō[`40g{jg PcIx>50~v:u2 X!j6hO{-%j\ӑEY79R^4Vϥe@4UmSw520ZFGF ҼqEGV^S[/57>I>4 qG [D~kYMgM>2-`.᩻K2t퓓o->4ִ\ǶEctmo<@ ?Vx(% 6N4J~N/]ƌZ }|S¿~yO\W ; =@]F}c}*R?7nۀ2}W4Z4ZȾw/{C:*ۼZ7_u @%<Cn13033]2@^%~\cL1)f`b2\}'Vx>E002ڹc2\͋Ge`2`cs')|D_Z\gbg4OʰGuo Dkc*Þx]OM[\ˀE/OPi^iwA̩cڭU(]^AWJu7+i[# ѻG~ 2|q.nst?o(7NGv XX(5RG9k <Ė}uʿ_2ͫ>Qk8ʀfOoTwہΎrw̶C.\"Vwp ~=m!+HOaΩv@-N{X ʀ _ QR,ڝ zZˀpw7私1cѠ@f,Bg^EPӣ[s YGS\ %{d0 @xچA3dĠvuDڤ %gPBjO@x:ȎP$/J%5W'U^?_x4;"FUad/FhtH !}Wث&tuWy.9rs(eJ ?߻xz4RݹWMF# oB.2\-ڴ!BӘ4o>_nV1] !tEnD<|Uܫ.ꮈΰQꛓ1-]e@X,kj>WM-] ;ZfI2<6]Vث.4˝n8: < rAn+g戜;WM-ҾȎ|w+B[@ * A+_sQ9Gp۫407Y(2M?,է8g(]>P̫ٜSon@r@)w^9 ~BmQQzм>f@B02eOs Ͳ‚@E02 @UJ|CݥjN#F{o,7{'GA>JGvjBUwߔߍ"DwX$~.׆1ʀӾy~h w[ݕ?憄 ܾ@0*A(e~-Pw)Sw3!Me ,: `Ŕa?.qPJ>]@F(|d-|ELe{p. j@ žE] 3#bFߣ1ʀj]|PwJe 0"(>vB' WcPU O%[Q@0OBiM ~ie.3u@^̐c !fP.s>N~ҚYuεhgш_E+8Ltƶi& tpA%ˊzՄfaS內_NaΙ 週\9(0mA 4qh'+PENH;\2-NئB&}ڽlL`&ϰk(L>KIE2lA,J=KA~OQ1!ٛx8?aמI( @\Ӏ(W0c/yL )^$ͩ7Zg+, sSU(X i>~"1}2(6t` 0*~VbsX]~Pʀ"YHB0<衄JBsƄ ,\[ј U cD&`k"sgWp} nPU25a)Fhpod+\ m u 7 Nڟ .JB;%!}k\،^5/4XSEBe(^( ;9\|3'sD(P†( к@ 'XaX{Yp͊Xˋ-+/,BFϨmo<(Kk'%_ʸ:&+/@ V%Gӝ*\oLH-F tNFp(P^DHuK)&P?C0l9p2aMD/0١d>HeT -rPtK>=-8g@$٠C0#W:lJ8/>gea tCnҦ,#כ"c{$)&'4:(Hz'zƵW}ĝCҤ {vo?z#oE?ceR4:@@buUK@F@ IoQ" ik޳ (exg_^ry,f,s"* BW'>\Tg@?k7&Ik*?m*`~G(S˰a㺜pcc%e+ ^}ŵeG7_p[~Mlܓ*-6 A*Tl'PYu_FkG]䘣ALozX:͉Qnu׵bf`;La"GA&uƬ# C&~}JXSk걭,Q~Ԧ덳,DM *k!uߩ½_l\D@7ђ0%] WU7t-lюW  ~eW. ] i"11¯];ľ %V1JA(D.#Pw+/L^+swm޼]U"PLAQSLCW6KAsJ hOq#!poc2Q}Pڃ AWWWwA1ex2'zxD&B>aԊ[2\AOݐP^QT"r+oQ9=m02%؇}xմ1Ve!CJ_4{(Q:`N1 u_LҼum}` iТj1a2\b/\Jݐ17%Z7#"?D&A6WTa0P ?h<:+ûIwz}ChL! tm:A AF 02 u׶,׏;pژdů, ٙޗn]03% uW^F'n&FP9A&?}8=>ulWv/p7^k;:q:W GWe/ٔalмܰhfR=?p׶≤@vEmX %l!f E/ ?}=:psߝb DZn90Խ@sqШ+,d<86'W 3~d˜!R'&0]:Jj>5P :QQptl$Wܪ-hՏ7ĭ%JNuwA~&cXΰlmk ɑ^D"{2/uapy&y,"\K )_<&vwsB7UbҮI20-WD]Cʹ̑?PF-zқ#m׺?K^AwE;A(YҼOKI@f +;>FA02x~w?x,iff/ca!bBB+aPg\anGQo}b9~#4M(`ngV%xސ)msw IƀQo]}&} ysw@XX oK™~<%vǻd?-Pr#ԆS>9K_"*#, >GF{Pzu  Ci^a6T^FR˿E}.fgdZRX\Q-Ӽ/Y~Y-FBVaH?G>k]([w4ߣEޣ>07/Pa|1,^r7d1#%.`,J4^%vwK)>XP|p3* i^>'\>X O|x{jwS/w=Or戾Σ>NU*]S/K\^#E'Q:AkjשH޾](l*M{TJɪ>:~'oJwok> *S^>zj*_ Z[XbavJEϕR'G$迴*e~: MmM>O+{eSdWJ|w7>}f[J\'OOvK~ۏ>tB>Cm݅\u7;kL`D84ON1GexAW2}(^E+Vw{,_G<+?hJ)PȄ4kF@;[^;0FpѿX+[րo@F9_W/Dx 8<,|(2SmhȀ)wc.n>؉K] 8MXj2.r=a71Q}po(6էNWlU0CaS-(ҹ_'"~vp{Gr80z[%a\wѝ!'q"d3΂0(o?7DI"K% (g *Y}1X\/ѦMa 4n"K O6/=HV "%<on^{|ݚ[Z j[7ڝ?9 +U.Jh-}Tr{ 'p"bA2aMV̠wK6V; gxXl)Yg8vwB%\J˯!{@J0%7_3NJ. wm $ ֱAٲΰvwMqRa߮P! Y3lJ4B|~6%Ŗx^qڑߝ,O 3V%R77J[[̟Sxa< ig.Kf:Fa#a!(H:yG+Ƽ'u&^3K1%ÊVMS7LnANУA熨 s˿,ggwK(W^,w |!- @ 0o9J:ù>]!˔j"CDh8b ω-Y#7ɼ81[#0:3c`H/cxI]+F=cwKïs!b],pUV}fWj#R/8 x|,49[2~gcV`\nͦBa=Bn>0BG.r gom}-6k/N Ed/rt~ywUr%vy~w3<y=J?KgX +ƨ 0pħԧwne8]O0v\;Ax043nO9/pw!䆙u84 `)qKXO)A!Z}Dz-ok:xRUߋd;G,4/FsK{kU@"7 ߃Ro[A7D֠0 -񦻫e7 ouɫIENDB`PKL\);+instagram-feed/admin/assets/img/fb-icon.pngnu[PNG  IHDRJJ+2CPLTE9V/N4Rh~Oh-L5Su}1OFa6Tax8UC_'GӃpJfߺ٢̛Ȕďy[sٵ֪ljRke" IDATXIo0aCSb}+JQC sã`8b~3w0 vra8_,W`LOPx H@E!PQ*%dMFa'YʅS3LpFeιI1<AɧNzјڲȡ ۴Dr;i;RX־^>IFg2jԐQkMF!u[i_Jm޹U>Fx[ֻ Ḷ>b)NIENDB`PKL\*QZZ/instagram-feed/admin/assets/img/rocket-icon.pngnu[PNG  IHDRpp>y{PLTEOyHn8c*˷Yd*bqp\tRNS` @ϟP0PPPjwIDATh͛r0E%ٖ1K6kp*0ܒ-U[r[bT:O $Kቩ&x$WضtN(1\q%`| ֩ jWItPnAJ @@񈨰Nܟ0قc$<_5ˆ|dd 9r~,~1JxBq<2E}Wp½Iu *L@bF5A(ƘЬ1fW=eCgЃVkVC. )?a/(aCzBmդm J%̉#c*Tg?zIČt_m lͭڕ9QM_ј` 3F:!!lRag^p՚6 64},˄[zBXOlz۠\=V$ \Yؔ#l_ -UM;-wjruաjر8|IsNG1 ,n Iv̸gje9/kX3:V`C[>Nsk}@cnN4GH>~[ D#eg%r18Bini 8Q–8ׅAX+@ M, Q)`F=[ .$<")`cQgt6/f|GcdE|d #ȨEN"@CARaM!' PWICD,bGROhQߧ:# Y˅Γ2ɵZwb0,IENDB`PKL\B .instagram-feed/admin/assets/img/insta-icon.svgnu[ PKL\=<,instagram-feed/admin/assets/img/fb-icon3.pngnu[PNG  IHDRhh*EcPLTEacjonejijhghijklmmjkmkkekkiggf\k$ tRNSF`BC#q `PD0S42'+FfIDAThoo0TS e.$ }L OP$D׬O**-aFATݯsv:{(j*hy1u/k9QZ,m*5iZ1 -^EZS֠lXˏg [‰ /L ]$Z O0BO$nv݉& F'c&u\Cmh16)8T@Qn*VD%*Z:Y3ЩސNDƊ%؋N;*H`m&IM|%1փ0#"0edJj Eh!>3h.'Ubf$ZNՒ:RQ$;ͮ`ivh~<-TIfLqnE.*ۗoS{™jW P(4D"|Ŕ IENDB`PKL\33+instagram-feed/admin/assets/img/fb-icon.svgnu[ PKL\!5Vg335instagram-feed/admin/assets/img/sbi-carousel-next.svgnu[PKL\q- -instagram-feed/admin/assets/img/book-icon.pngnu[PNG  IHDRppKtEXtSoftwareAdobe ImageReadyqe<#iTXtXML:com.adobe.xmp + BIDATx=pG#1)0 $kRb$)2IK0e=* (\I-|vo3/w;s#ٖNw"8PZN%}зCS{vE+qM}x(+ ҿ} F#X8d? ᅡ䑼m7$F8vԮ`m9x5ߗS]g"B't߻*;{= ;{8yCͅzduة/Nr}y^B\ ]N,翐W-ܽ_G& ·f 0R#1}'lwH*yh9-˙f?'9+H.ikd>\1<>VM{^jFJ;C%X5åWB.q_|[xANUrz?ҭۚحlK(4ᓢ9Gps?_ۗ}M/G0T^j_ EZD_(ܣaJ߷fnA#BEݥNAgMu.fI[-'PJ|[It7of=52glLw?ymOYga &įH Ȱ{|h$E˩[7@bhu,Z< 5T/ax̺5m(p x)pEuzC䷰ \+<ݪSp=ФTﴆ A/O|DIn=V!N|qˏ~ڄIjH/x+0jUu) :ns/PT#[\¥T` H fQ NVv;a"#/@GVk`9F)oxUMm &M(!VQpA0k3C EAyՠE` ̒':2G ~]Ʀ)㐁" pung}-TKr%_HV8LS&j/]J_.b֮`IENDB`PKL\Te 2instagram-feed/admin/assets/img/save-plus-icon.pngnu[PNG  IHDRppKtEXtSoftwareAdobe ImageReadyqe<#iTXtXML:com.adobe.xmp # 4IDATxMlGߛuHȦ^+!ҒUR)ʍPz&ڞnPK8Vm!ZN8\*5R%Hk7P ;ә]Wֻ3I& _)xѓ S ٰ|+RPGE @ _s&xTqQ,&<5 "W`oaws/A[6/?~hk{= ~| ,|.6LS<4xpϷm,cguk238դPnɯ? og\n)^k@5ZG <[;؉\lSaQe:O j(^ir̶cij-^̭h`ضae90LoP՟1 @T) UE?t^!gS:j 2HƌauGJ ct HH2㶯RfX6z'8JfQ tR@ HA1jo CG!vq>L-@% yǦ` ,E%Uv/1! 6BaMR, ^LVgB+%%] i<*%;r4<;$nacaPPQp q7 }_P sȅྡ)Xd>Dk7tc5f(xwZx2Vz',"T;ЧP+w{;//[ 00^oNMCs_8ńudBk+{=rOlmUn_֫5s[˥;J̫Ł)K2X;-gA; @B4ג7{P-;RডgYKK)OV$oki;u9t]pJ @rlɆZھ`GW)q''yT~urk9藅z1@:Ւ0n]| pHYs  d?IDATxy%WUun}{i҄t $&HH0+/<>8 *ËAAyIHB" $$NwvOSkU֮sԽw}?[jמj]^{oyE5FYFt\!}I.]&1!gl;󌡵 +u=X-逎 :R~^tzz|:d͟bnt >X_`ox0o.J_pI$ر ¨KztsQ(&XqCP9Ti1!tdSc ϳudBCׇt&\ A6\iy.qqayW RIZfyxENT?坞b.6y֑e,G>LMs&BY6,sL UNq"uHt.&@K+ygV։S'U͍>D#E\:L 8KGq:9mkB+4~)ai"!whP]auvWjePvJ}9YS9GY*|NJ=:3Bh_YݩOYkU_ى4x[u"_г\^D<^Jס̕-LreL4XQ<0t#,7Npmj+*ח>td~"E9ʙCV ;WO0<=BkEVȶz-oTFos!rvO{h(;Աs/v?P/"BENe?KWoC^ᐧ!!oB79zm3?055%aYv7l ?9)y ׹ss;{12BfaZ4OyVOJ+XE3rCN9*q#ݷ{ttS>0 0VǏObvfvg|shdHISdC?s9!;vGFZaщ9Yiv. I%@% GuW"0 0V%6ӈW\wa[h3(]f1 0 cfh2Q6C.o\QGFX mɔ2aʐ0TUϾ+ˈ sِaaBkI!τJD`Tnf10 0~@Fm@m)w@QJDY50 0 cU#Vc9mGZHtn0 0^-72ʦn˥f<f*ɂ$IDcaF_S>R6 r{'(aaF?`Vɿr%u:6nRar0 0 vkOߵ7^y{oe?w~O~`3bb8vNx.O\.i"F\r#(*&䆔d1aO|?yaϿp>G8{=^uU8>q|It{L!#EAdO` i890 0?w{So+={K<&yF;}{cbb'6m3J㲡(JŦ6]ҜH$Sca A:xW mib86mx{p>6g? =#1:Ӷrz@wSfn.[T՝/ 0 .`K믿?~co9Wb39k|KxO]ٻv=$KŮg>wzmqփ:жoߊ{(4Gzo^E CNoC)OL4f1 0s?|ee/߂kR={۷ w9 p71ǎg~K W]ynݸo`3LxǯpK- SR&/L)("'m)ؘ/aP-7n=fV5oxe/x~߈?OL]rs쫥f豎Ry#~7ei!\^Ej :Yh4u3 0ss_SngA;óg~775x >Oa83p . ApUf-۳w?^/x^rK;t"cY,%GozR0 XLL>^\dӦ?c0>P"駮snسw?>OoıNl8_7MK8~GE)BTYȐcH0 X VۼyY 1}6rwAsSGUNg9ypR0 0V db[y$ŅQj:4Ņyg1@mCNaa,m (V@UW V9 EF: æma40bD"'e0 0 C@~IL?H8۶U,š4aa t Je ;WfJ"֣c1 0 XfȻyKMF$#׉+.|`J0 0 cƔ`kE֟ᄭ)O]y{0 0><Z)xBGNr< 9aaE:sSžƋ1m8aWs4cc = w ȭQcʌaaKm$Yhuȶ! ]4'/W 6 0 X(ҭENDi0 Ms8+DzEoR0 0 _@w6۸2\,LfcT|n} 0 0  QL kmnӸ=[즰aaF?/%zFAa /_SX8$AA߰1 0 cq@Yդc0Szrڎvwnޥi Sv 0 0 [?ҹcp-4r<2h&0 0 cAHͦ (o3rz:#m=0 0[)7Ԗr2|InXdaXZwOo<)JŽ Y 9{V#ɦnaJPtn|m}t$h;]:nYaj`OsrJA%F׹B)8-0 0F}bLAShȻX[03 0 0+gep2K $f4s{GʍlaF? #K@*6|D~1܂5tc0 0 eb:Ӻ&M aa}m> t^ G9m;Acw4 0 #rHcAE׏(3"cK,Go krԹeygVg%^⭛b|ȺsYH^޿2SVu+Z~M:{%s)ߡ6$ ])PC mQјrb߼!F_²Ц.STuNUP[7_^-\e emO2O*?_k ERYu* [ vɿ,̠_[`<"2~ӐSV&8 \5<B bkcť]uV<|,/tZؽZܽ,*D;)ٽR^DkHe@kUK<.xciKHݵ_atRpa,&gr1}-!H)-skK:Fݼҩ۹-$텼괏8놫9V]ab롮e,Xvo/c_͠9+5\`XZdz "y4~=\o5%IN@6r5u<SÔ;MBYBKB++J_OyXhIҫNĞX}SXdƨi:%*DJfd|IzR?VK!ucZ4a$V?9ѱI" u?z F ֨=Z)V_zh忬uxZ9vKS,ު^4߲Iĵ]+l[2NW<$IROEu:ri/)>LM%ڿ2]+'D9Z;V"@8BoIuiZ,>SbiҹXi:Ų@H$*Z>c/׆+LZ~-+K//ɲFinkcڳ/˻w4X:X[S M\Zj俌~˿<_jꔫI$I1 .:p|wA S^r9W\6DEZ8-x)l/o:nMizqI ae\'5ޅQLpeQVN~-VOeeϩlU6EĔ~V6T# A h/ƲW.俈?[Uiid1b6&\ NA{ z4 ƔXDZQLe2Q%|u1#&&ÖdܼgU-M^*i:]׺zL)״xzAvZGZцs(!,- *eǯǔ~b IY*;ޘUykDZyYjC2Z"do? &ʔPaAV"9II!")6r\k:2e.u$T!M۲+W eٴ&x<|VIA[v΀u@UiK_buU|{X^b 4T*>> ٻ)AOeosB4}P} X: ϶\|j\g5?v{·ơc,P 5u~>$tS0X:9>5v4\d'rSשAP`lRgFȯ;ݮ Sl c,'K+6.Str״it}~vor._U4IQنa.g|5yue(sݽr );0IleF9 $X) h۹%ir:4|ir*4GʐBp@.'tMl\@fsKZF5M6r} p厔c33r"M Mv호5F?fi sRS;9Mjʨܱ3Su k]MµF܈}H㥐C?('6Ӊʏ@y)za' K30E֔0ٙzbchOG phA_,̷'073hm8y0&_IJ&QMl=(5Z@w&D,t2'#ʶ& jM^xmXIN)]p:9|YfO k hIq7#106{:ИF=5eD&4֤p :MXܜ++i,i54e_ߞ#ܓHfg6N> =)H[ 6Y#i5'<ư'IC"8|?èaҦ*7WirXåkEÜ9$eJyǰoaG" i'jzľ08GqoaC-XwOIWu;Ƣqf&ymӶMƝ{;>}vs.q!~3}c)S~{KN"rӺM0Vץ=$|{HLEF;$5skN!tHj¸}^wkz+j9{7c߻oGcXLl|hmހy8pH]R8L?N70x蒨R` y&~+/=~KEy mieFYc ɈQ`ܴ(V*;S2AbO?3<dig )[H1'عޏg쨕o2v<:Ի[O? ^,xq8ĉI\xx 5;w< [ڗJd}8/a> g:$cw^|w NZIe [ȟ>?^&FOx?Yo/w-uHOfI,4@WQa(;˸D5mQYCؐ_? |IQ=:}| ~^ ɛnfl>i8̳LU~%xqs}܇ /x?\uS ^aÆ?;vݻd;w|;+-8lzG'B_Lc?2s7~ g_ۉopcW6Vq&߽އ=.N~]oǯ}>LV0b28,Sp;޾8F97I$7*$}~6+#g7ĔZr\x?{lz6cWK?v}[>~/c}.qiKnOEϾ[O?-x5FŽ~h7zh7zaW+~)o<ˏ]a+͹Y~]ͭ;0G'm~4v4qS^Yjuj) ְ̬yi`+Kn:ҭ}=WbIv_6ODp}H 7Ow>0."|/bγ 6n؀ .8\<džq\ \rk֊pǞZ)q8ּz׽x}au7x$5\)luȷIwۑcO[xh#=˟s|LVw1^=e5imZ8!LO׫ڐ&'}jTf #!w>݄ġ#x_o覍8!u@:p#8Glʴڳk=0.}Ÿgaqγ{)0^wkpΎ?^Wc|z\p@=ްa~ĭށ_yo;ʔckugopo{]Pf>gg?m+ڪYi6MjߓCoGpsvT߳QjqU—S#t̗).Ux3@Wf؄J(Zhr&9] J P>V(-.~f?{@p8"umlGOp3bq%ǥ ϲoܵ[O Eh>uSHZ⁹]1 pOݒ耍W'ۘQЩx$Ry!'?Q& M138p)w|COs̗\F\8{DGh:MC.^Ç(aT9j?5-[kF5cpI<~OG? uۀZx7'#k,"MX8)$Iע:y pBù 6/9}Q{LvK2`%/.~T 6MHun A_\3L6I6 1Dl\Ε{sS3pݺ ik-`a8O\=p#5:d$Nq%π{ fŀ}zd~vYίW[oL9Mw*oa]8dg4kOsz)1ZӄQa]]H18d:Dq 3 sf9FK5^U-u KWn薍?SZi%IFoc玳BzpWpy|>r|3%.I[6czzzf9߿R8wݍݻ-MǻCNF~E8O`î=} 1__C8a908s94};jU+D=|ɟ_#x[ŹV/Xj<ɇ{~7ZCDnK+MPl9ug# USoɺ<|ax.8;p# <-;yZa!05=SPw G^znNLOO⍸peƛn|7bO]x#nƖ-[pe3~ϻ*0Ӷ%]a'tN|&Ŧl/DukF#-\g 8ķkYgзvc/w| 'mFktHu5۸{=O^~|f=|..wa8޲e3gԯ+75gf3{1e39gw.m MijkwWcccx?~/.좞fw(7'7mc?*O<nS@i]o&r&bWy:uIj57g*^~yצvbF6mM8a-'nLS#xkҰ4;mXINM,d% Z`lzE@ K78nPw֑r0R&';~%s7?###8;GGqޏ0W`tF8?Rd _]~O9Nضm+kpM7gEo`X*{{^suguc^D ~1B{>L|v8w@ipNV ^WɟJ/ ?]"o\3pcC(2aIn9 цdS>z=]]O¥ƍXT֐kuocjz e3vzo~58|(VkP/ވll۶yLO`zzS3+>/<#Gnll ~ x!矋[nWЋp]%/~ae%fwƕ_tdg G{v3ОYtz u?1 1c hc3bþ&&^\|&/_ |G_GFLi;:eAXXir %EZ`XiTΟGΟhCJ4-4Mq z=7x?ړ)g5V4>9>;▯މ;4| qW fnW𑣸>s2<󌭸oYu%B8Ïܽ/"4ba+5RӴ'dmٜ#w@gӨ켭} Jc#'Zcr8$9L$ Yo^xE6n, M#"uvuh$&Q [쥥=] i$IRt5*[:E=8 9 W=ܺ6=$|>GMr:X,ڰ̝f!F51}i ^#Dؤ,p+] Yh-U=2vDkfoF{(Hgۡ:$H7#oWaC͠XL cșCM{"CZVMr<^A!]b S~>@X OSg_n5HSB hO>IO}L .{uYhIXB ! %>,1W!!} i ?"R`g]5\uIwI',lnP 4!Mv*_>3a 5&1874eCJ D D2mGˀ_省 -G,_aM$I O?60!amwH<:I%]C"圂\pmjo3Hlj-a4|B~K H oWuQ9eAIa}rkF@K4;FAjl"6 DX:y︝d;=hkj˝z?Rb:cKO-Ds$WS8N( ?)&+14bʊ< /u06l̰>/P=A}e7䐲ReS ?u:Mn2#JӔ~m!_Vs ] X>EU)0V1k)w ,ښ4=HO&gʘķ>O|q=EiL35%&ci6v XE$މE}UFq%ɍ$ 9ENbVG9KRHE{xt RXO&18zQ^}uBG0֡ ZQvPL1pFtP13@ό}T`)i,2J81"LdrS& 9q O)R6uTwGO,>s ٴyg>pDŽ<$I&jsoһ;sΥ@]bCkѐN¯M TDf<ѥ+n_ cnKkN5gɟh% %>3@GƘ´l'L Z߆afUa^0iһ1Im&o f9Ioa2/.nr.މұZjG?OצVkYJ4l$ZB 8i;g8i¦>0XĆb%Ƚ X4 i5mCnyzI4sɱO!lK򟡙QK_Eaq]f)dgXes,egZ?c5SGbfb;!]$+y`DFBM!v멽P͛7b ɚaxHӴv'jgc9(-1#ϯ"L efRMs~ /oM:sa;K *#bԘNf; -r)6'`5"6b'̡s 6 ca!j90Chhl.Tjo3˩X4!`AZg4k f\l8MӡjCϵeL&?[E(@M=ݡؚæA]7 caľZVNVath\Zw(:6L2׆A50G9tskFSᾺl!߰dLvL~6zc9 vMٮn 9-8ԓh,C&ɟD!],,2?&}"`ΰ>1ˌt{ +k1'D:a] d^^βk1k& YnWhMSf4uA%w'\CN)0M$;˘) c8H5h`ދ\cGw؉n s`žMdCPâ060Q4 X: ڐ0d?;Ѕ^NmlkZ)J5c6e0 ?(a,-b0 s+Tp v"`~#z M #ǘk 뇝U(3& YnWdOe4c#?r)g9B^q#N5"r,L5)'DniUHl_(\Lʭ?Nۀɟa,鿦]/lvX*FOr+>B5 ! L7lFц|v 9Yh;Ód}h '2,MzゆґN ch3q9*23:5+L84I:(KWM6͞Eym0fA~RW'Hesaha#65(ɛ`Q,|ْ'M4m>)2:C9RͰ)rL !^șZjP4%Bp#E\|K,4d|&<֔me h)\13R6[죿A`!C cnr @Pfjd/RTv]]jvYf! vY`40>BJ UN4u0V)pQLh\J29wru͏V BS6 gFPfHh'GcqhlCB/ ]H#K$;g#aŹ\704a}#wILC:LX4)qfZeXiR*3_Rhr3&"4, +Wt.Wa}FjNV N$8 rg qh214%6G""LiM@~ڶ^W0 cQB#gdfp=Y@wE`mڶ}!F HoS ÈA2A|gb@6M\]r.F·Nh ڐEƓRCaA8lF /l,7Nu/SgV\ Hql`Lw! MnLqq&:yMl+0)rs7< |PaJjCNa6?ɔ+cXSaP$a9sR,:R ={4]vL1ͺWueN|.wa=4M]$^D8&O,6C#vN$ bh4wc~ ?"H&RG| rvvݹ;1,fC nA35ew-_M?tV2?D$gVM[ LߦXih_ECNt4f,7!Ʋ7o jLqb3i%#TZtU[<Ę9IiPhM7 cH$,W\&A 6a3~duGiFE|g$t{{n"3PjwxF c8z44}0 mg0^sH >-L!SN),?~7b`9=ar8{UnA64]W2){g7Maj/~kyͭShI )9>ĔM,'N,rX)5esb .4e[Im-( ?|X]t4M05BdKL:la+kzv/ik"7>"D<;[X/82">eB+6N:QXbJfSij2h46(+MIf4),K"3:4NFF7cRjhijzҔkD3:O|gLa0.ϝq_n&q^Stش$wSGKQ_ڪeNV cEמa[p_ag cU9F*6 o8-8t KM>jg @Q)q@ ̜fg;;607qF$[bh5cc:׎vF/H\{[iL1cSÓoeMd\o~G-b]ЎIE"KQEOӓ$0; LufNU|k:`F`dsleh Ҍ'4m;oSfRxi<7)sՃ2ʌ'dnJMՈ9jS̤ߙɸeMwMNk;_n% YmCM@q&yg휁 J㊧TNarcXd!fX6j Û< L( M{1y&%gF`.39YrLc`<6Z}M Ïf3ɉJ2?r\3rP}h2eypG;VO4/Rvl:Ք ua PZdX]̧o7 mYa[ WhHi)6NlEMsk^4+U1;w SnV#rAbDža,%L&T#D"1ĂuW .XhĸVд*G_mt88~Zͩg6kF3cCN.Sd2%G^>|Cgի8KjwQIH{7j _̏&gwѮ"c䙝=9rYmV2rńMrgcPLHCChӰg<ԾhQ;L<~Sܜ6dNƪ)1&1Rx0u;;WPh 3IîY2'E{>j Gb2_Kbi [XXjuy/a ?"h2&$uys.7DcUN*/,Kķ$ m,ʽ `Sd Gbr(~\$Iv `y,i,OZ9sP3 )-t]Cڜ2\-HS`'Ntx!ءAdӨ LN0TcM;f7 [7{L)CnYPbVVVfr89xX9?~O>:(XyYkGٗ^+3%3)hS:Lcph84k +/;Adt/Z; Bpm̩6eMYG=4#%di1=C>uTv,1+H` jӘ" OecM~hF =<|OgQ;wi䴝*+XLmU`g7&%1E&(%`tbQSՉZ' o%g_3Y兺>ufL~rxv9h&e6E>cEa60_;O:tqEDg_G[5 vgɦw9_o%k*4:CPyH3454M։4|eiI.Pr"6aZw?3a7Xxٿ~g|~R7)F84kScThd²ˑ>4|';"JhCFj `ZIWs͘륀LL c3p})@JӴwI4bt(U<14) 3kR0;Qj'z*fFRX)8v."h&A 5La9thS{XnX̿~#/|poMvJC'GZHmcbUS5zi2tf53RQb zl&r7ݛ^59gh>5(3& K_X)wه/pS-ya BsyYNCK9~޻lN)ͻoFj,?2OI2ߙמg:C+s'a?cyY.|8I^d)|ed%~ ("dL'm}PhиVh΁NrSfjqAC}l ?cvedi<؄] :4+2d11EvR;5V6}KrSf80+HF~ڶTj cvҿT[ 7Nq%&7I3Sh1T466噙xkLe_ԬRΊi{I_n W>tJ#^N&BSF4Yƚ5kɔ%?^>!'2a8'|~}/`eIec2; Guy+^߿_5ޑMF?8>׬pS)*Riڻر~|4Ym\Dd7HI 0al<ÃVj4v&6c@LNtrTfFG~-,3|6,5  ` G4BsQLMM?<>%+1ԭdgxrb iZGqN<ObjzpeESrUΡ2ě<~'e6704ū&*1ibjzǎviW@Jr19an`AfVWUHyo<:qfgӿa1$D/o4a9E;+AќB}i±pR+ 1m`zݧjb5Lc:=w$/⃢PV9/)M.xI_4m;该ġ;?{mWU#O}/ PZ&ifbm*|YY-Ez2QNc__5eSGC?K@A5g( vScus.,q[<CA+kW]$;޳4:(<}ɇ3A5vz,#ox0e8^:ʓ/YvoH/DF!^vٹBEB6_DJiSWYG7H9)m)y䀗WKG>#su׋lC&&T מ 2#ʟ#=HydYV<;|x!Jʼnpr gV:p/׈YECN^ syd=H> rٗ̈́HD&_ RK^Iu:y^I>ۘp)m%С]1;˖Gt|ٽ8+rCuMjW}c+s47W›c%ۊW:_Z~"pNc5X~RScN:QRX)24T^8—|>Cfg:B7=#~3DzmSx!kt֑6@bm9aLMM+nci/'d D-4<8_x)):/ HHb %Ҁ<du>"j2<: ހx/K S&]:)Xd'&뢬~,Z')\5V_14m_vIJφkuy.~A7-O,(ɿ_'yߠ)`j߬pworP*+0HeBTle*P Ԃ%PiJ8/Cԝ|\_E]Ҕ|ˏ);cY&BYkS2.%eV:,UaUnԏmiEڋBxKGֿ^I;Z&DQ:477ET캨JC/{:5^) I^NXXW(dL:o MI?þHXrv]anIS˩fZAE<_ܵd{mڍ w.洎* .-Kw2g^#psEB:مRQ5M9-I w.3%!ʳfHKm;w%xxa$ι,ة,~[H* :ݛOe^@tBe^E|C#0Ix^^ O2?~D,9S^)},TOTϔ/V6`5g<ՑL:GP7T.B(y>) ^/Υ2[3 q4+kʟ76:S^x{!1ډ7FH?3"BAy2_)-.Wٳie[@<#,X2R44P@ 4!@e`RfzT6(eY c&0G5z'1-W5JSzT~R^Z\cR:\5djyt\OXs/(De9V@6K'[Fu&&&딇?VlՔ/qJU M(O"S% ]YUUi !L!Q^#y9}_,"A+FJ-z:4`ϔg,Ք{I}bM%I6{)ϬN~*Ok uӁn5Y6B 6Գ?7_%\Y{*+^_.Zڹ|]nvh M kYa aybE^Xw^,A@[IΔKx+?Wci,*#V/~LM)/&[E]g˄PrmNQdD4\ôW +x͵1~NIGKд?X8([8̋|x13033/~?7 {yVZ^螲rR@gZt |ihױ)k^ꚷ Y>j|xW+kY^X\^)+ML2^4Le<})crkYMrJ|/` )RUG+  gQIuVT?ؽCGHa :WMh%;Q yYe=yjuuԊv#3 Z=dRu8+g3K;eJ@Oϴ,-ɿZFH٩}B~ysr'Zƫ(==JC|-v$ ݛ]\8WUqjq|::ҏk,,=+GG뺤u VM>^BXbEȵPIOȵZ/S^ZGtnuuś:K+/\aLMM©J >sZ>4RIsLi6P=\s.?l/  Οث|<>V+˿A'uWn y:%Y>و(@퀥Y8}.YY P5eyBCEJnr큞3 '1|}z 2%ѱYC'(ꅵWGwdoo_#M eX*gTHi SIL==2b/\2jE+TТ u\!/<To@e%=B]u q+߁կ| aTUV7%q~ӽٹPf-:JVW`.Ӳee/~o,|&&&+OKJҨr9a/a^VZU/ D5N ,_8:tYWEJɿ?d=tlbDT)Dl]+t@N80TXgSXSY%lJ|KRj82ι:WzXm*VKA :xƾ4;7VVʞKG#QYAAUz#&,ڟ:9Kw&!׭l^- ը3әazEwr i*j"ԼS(Gz/%딫J(!UBeF+)H7v*m-l_?CS&w{WgH݆]֘::KC.V"Y@:.j锅Y,O`azy=PLM{:?*|ٺCvIENDB`PKL\- 8instagram-feed/admin/assets/img/instagram-color-icon.svgnu[ PKL\{JE0instagram-feed/admin/assets/img/twitter-icon.svgnu[ PKL\n5instagram-feed/admin/assets/img/sbi-carousel-prev.svgnu[PKL\Mh⬅6instagram-feed/admin/assets/img/oembeds-image-4@2x.pngnu[PNG  IHDR8@ pHYs  ^IDATx{duejqF=R;b(3WU y1ey^ E `])Jd*[Rv*'o{vnq}u˓)G~-·E Ob`^W(YYiV]!0W3 L-f E>q(uveTUUwe ޛlsnl('g(_h-|dmxP0&(3ZpY+!Yn^ϭrvmuMXkϥr:hc}}߸W[y*,BnF@IT(Dhɿr{{nݼ~eUv{[G0ɇT(3vMY#},zIn?FEQ5sτED8c*ET(FcTڙ)Wf{{=kΥ2IZ{f୴{4/pG)T(F>4 vu,ndQ߽ROZyvoŌCf6@Qf8,ӈQ>g<0(e+3vWYb L>p:Fʴp:;3=x9,nWzjSiʾQf8,ve0MpR'T(Jee͑b{{7?}}:kP?E]7;q!ؕuw> ??;pn(3ִ,22nnV vqރ&_w{vkXZZ<ΡY;?ϰadz/bm|z?m\}Ryʏ "LNe vb$؟1WK{72wq{"Y_'x}/z"oaav~kknMύ|xfePUv{/Uc[pDt&67O2 x`\\_s<n| s}[[-jfȌ*EyT(Hߛ lx ͤԗ>g^O}wco|#o6oYċtf{L2!MU<$KQ.ꃣ*h)?˳WD ý{p#kO8Σj鬰Ih1*W0y/oE<1X/G̤RD-8, <5^S9&̀$)ʬG%{ fP npM\S=)?V4h?|M\V oqsD@<:DyE>/$RyJ:V*N܃ >8X^c1h;7i` ZsXa9jQf 8ʬ8NJг,!Z;VaL zpp8luu :z z_^ڛDMoq7}*2QfTqHe`uڥPc?m?9x? eDqfe?&hcCb;J3ZjQf8,Ow$ɞ-:!sJU{ê+ܥ?3~~p>^7mxJ ņ%Cbqď>±ޔa)/8׫yu2Qe\ʱ"QTqvQz9J2jyQ e6By㽇V,8G[# d:RΗoK S>wU=< _RfUD0V nT#y7jDIrjU5VVuuZy٫]󱆕(ǰϣ%rUCWRP 7|Qfg3xDq3!+NU,r=ZOh V,'UUC iw͠`6g3_^ǩ*se.a+PXNJ:g"*@'U%ݨd5k=w0+19ƕY+Z>͵zjh-L>9_Ftq/Ɓ PmEֳOz#z,4o=81Pq̧c!V|z*= nyY",S%9Ta'C~c*cײ}Lg1 e{ɋ͙o<뾺zmbERɐM 7S?ZDaafᐿUn5~_*7,K CJ|CNHXW4!6X\ [p69zx3)Sp$]ہ3|,zG5Ày7,Uy=ؼa!%ή_nUb"'+AnE+_>FK8ʬQP Hk:Y]]i88H] ,k|Ͼ Z7A 0 JvR8nXƹXy\Wy%:67yyS>g&D:Ru7|NW֘~kת,[(נz?Z%\qs߰J`yZw8,Q| @xTN.rX]]ƊpRBۄ &{rog7wpy9rn'(cbh>:G5A-7y& NV|wp}kбbii+KTP&rgw߷|( sneww{{=KK_[] /ԚV5eyIYZhq)sKYk1lbqr$ _aqa}}}{{=m}f Mx^~l,_B;G5*mP g5yVkqre|OM@p&Nn=7Jm(o4/}Ǘ^&P+c19T(b E3'X[qD LJ)DiJQ&x\LVQ)ʅ4$ SL!*,1[ͳII(gM9g'eE (tT?lQFNҤ*cw9ʙ7;jǺ& 4~ƹOö;w=i򏧡fNRϵ/ߐ%S7Kzt{nԕmy`,08]PHz@``[5Wm3le ת14j>Fct|X)C߇]e| {~? F\1ge0 DZ}Ձ%:^iڪw*V-3xYoxvaeί8^&Ug2Yfľ|rZ$Vhp@;;{~.z/smt:p|yu\Vp_Wл׮ x8o ЃAw?_Om:'GCgn!Zs̏~#rب!? C*矓JjE&m6>Jo`?-Td`eb꺰-3aǫ8tȾrQQU֑V*kRչV +?0q9LTU(R{(>wPZuJL+37=ۻ2V5Ѭp(7n|m,x/~[^|Ϸquu0";Ky>7>8=ڧK(`aE=ʒ2nbдU8p=t:.MvqcoO|{3.ŋ7b+gZ M4V -\}kEʛP{8FIwS .Ix W.Ln]* VYXI:;( 3![Wݷ*!2%B'גIվa0Bg3X!ZG?%gz;$q^~a{g'އRk{0+u_<^kM<+jr7e/_Ufc%5iA+hT 7֫Ε- /a Y*d ,%UJ֋,^*b"~eD?^oTV'AQ!9+Hc):Bj3=X_?f66nz?J}i,_D͈Yţql qY?7pՇx;7p}sbǙ$7bybxD96.T;[4߸r)=V_X-n^zÍfU.,g6{;yƟo~k$f5 ȷRA'\"g!v Nn@vbgwO΄(vm@񵏡O~Mz [Xn!nsu4R3fgg=ּVZ X^^Z`g"2Gxv-Ƙ'䈸aۣ4sS8"[ke77>>;󯿊>.'u ||}L@\_[9P3bey /|ιk)a*ZcѵuYZև@a68<< ~,.\Wre괋0?|7ox]߁w}G&_{ x}&c :ϨP#ZXkWb#,Q4<{&Ԟ̉ \29g)zwl5|b|ornxeVB?|}^ xjȔm1rW\Q>U/X=$vda^P/rdLXsvN4}%wop'[x#m:-:W;h,{8,|כgϗiGQguX6:1lYdCLl*xBa\B_ |p}8~nlDֽɿ|矇`_z pp\W웞yѯ!紴qppЬ!Z : ⾼{8Eàg b7Ydkd = YdRQb22^9 ֠ih 7lw\Z۟&~ޫ$Z( .ciiQf @ci},W^"E6lEGbY$(Qz7TJ$\+gZ,--b}vf KsΜࠃ_?v<\kұV{,_cK]Ydd ,* rrH67d^(!Aw_whn/|.n\"Ȳ~,u,>;LKeYTJɲE{+Zk⬭L\JN7c n{"qfԟlE⑟z'+Yd7뱳Ȇy&XpɾNc;(J-Aar=koDKC;88>lLrQËwO'n~4̗_,>{f%d}/ppDYNlx *p@8!HOJȆc|ExJÖ%GS|]ZvCۋ Z7X\l[9sxHC~F Z k?)ϱ˿Wz^qژcuYdZ,WG| dXJG¸+E$Y.|N9( QNaޙ$ c",lw5:kR "X~׷WnQCȆ={e;T4Y=ʐp*EC&edSQfO6N;s8ܺyD e8^Ï>^_# hyԔ9yt~fr G *YDPb4:Nr?^yy'?KkLf,#p^T+gk_4 ZzԖ_0~奉k(T( A> 8:_͂:bޛmiv~v{h6h/3jGnKӵnU:6Vu 8e 1=dk蜳^oS*L5^XAY|rĩ^Q&=;&n\_ŽWn^qp #=8V*}R+cpOBĿ8;HM __̒qYZf_᪢(7rRhHA-(gUbjU91C{XPeZp9g5D7wp}Hk-֔3gJ?ѾR2y<~25N[_񓰶eh$BZ+-7U(g7E({1>T2]g(Iwٚv1ΔgaL s6{GoSfy%ߩVkAbqVcp,ܟvQΜox-/)pJ_iR% APph{E5c>qN֢6 x fe01&Ie (dh(+3BwM@fGb$|m Y@quQf Q18wfX%9H(3K)nHxzM$?eWc`uxJ! hݙfexD2YTiqsꃣ5뭄v@_ޛvI*ĉFL,Z2afެgRV,n889;hѦ@7w2<<[LJgu{̴o2;K-%YkgW;! T'gSF܎==ŽZq Rg`,nȊil%GJOs;6.6Tq[xg1 (s͡8ؓsObS;Fsr2^lȹH=m@߉o(-<E3l!M|d~>9$Uo4xnּǙ42Kxܽ*jTA)hGM$!L eXs3z'$݌f$ӧxngڥ-j ^P2~dsH7FTהݽ6^δr!Atb]%ݓMh)?;y7|Ƞl򞬢ԙ;)Un偊p} {Z 2xu {.Ea.D<x#T+u@fك"j(G47Fp5.QsP+dpYǜ-8S0'cE;1M?e &QA?rOZm1VC^l2 A%PO0pOpU{oZq.4.<@6CU2sXkxU mΒͭmt:.ƥ{ ?V㽗@j!Ϸr7噂2>@_bgwO>^ށ$Ĺ(TWe!QZQ:gZkyvvώ]P|^E)Z=vϠ՘vI.0R@sGGaPve||E8w`KA* h9Gٶ"x]&e ;@5R\\rӻL0nłzњ_BI6}E8wu$ |3$ !8akkwŸt%tjrVߴā(^Сqu6Vf4Ұ)Slɞ}U78oJ;AAbo~ɰ^OGG^aCW 5`prO9cxWf$%@ٚIxagwOcLLJ}kAr6R#<,jr0uBe(I 4lbB%Pdhթx3>6l>ҦYZhIWP 2O a[ZpcG{pz]K YQ=Zb aqU9_AQKt]]3:*G+!KdL 25!N^ɫ2ϜEh;0&X| UXv@S#dzlLmd+F!NG3}bBiCpC \ =u؂óH&(qe0q@!٦z=Kd<^]ysaa_ֲFXH*bY%$FHhX< w7%3O.)m ƀ ]fQM7zʴqG8I&K 9'yԂ3^/5MOTBeא4 ]cv^YAJ69-bGCx1dP2#8 AF転Ԟ; =X|({5c`)虢CIOۘiF2͹94 vp5J~N<|;2ԌҒ(/ӇI7B#+u@D;%XnT#PNצQM G؂&(JrKzܯ*5"ay7sſS(EF7D| qƜvpln<(5'8ҰU9>2|eZy\:_D5_8tD+~8i\pz#ʰ|1YkbGJ}&F,<Θ~uۻkYL@iá(DGbՂ2휓*t(&t2צi4P+ĚtԞ CQb̈ FeR{įR N<1(C)nL<&%PjM?Ĺ8 J͡[ iRxٳ#x|SA)!͹Ot3:c\le@)A_ЫqhO&eWZ 6(Ԃ]?L r4mC/Jް͒*5 p ~='/,daa_Bdt]<\7o IȆ^ْSNxE(1ƫq 8C1W@Ct!1__[Ϝs—bwv/[_[C  ?a( AȔhGWc۟&HŒGjCKwkPE/{hߺuOlo֟wxtNGQSWZ #7~(X#ksI@O<*!*pS3 :Mf8$F3 \z>ǓγP*,ϏA @=~/PDR3)9*r˲C[Fe92.ˮXUK· 쟷k3a$rZStnx6{^`:D_+P*3F>5<,|'!7sP`LA LU)IǍ7N77 ;c K^\I95sf!yw=U\q]FUBLTYY۳@i\&&r(` Eךš?KUfUr2W]<
o1D9D*Pb"s{8}fMeFÅQQ/LI#> 21B$ː D(_r%ȏ~N@Hʑ? r 3!|o5|q蕟 ou:CUdnn{agwkic(Lι$dY⼋C)pqC QAbO\ 8 4ꙀfIu*i@C @"b9X\5*;˩5!qOC&,r+F2'tuSyeX{CCrO 3d\{=F&28{vYy$ q)o32Kw?.:+s:LU~0&6 !:`"D&|߃۳8}Ic-\uF]"jp(ɪFH^lщ}g/kMO,qαĿB9 >l1 dR~EY9љpkWiׇ8B(dhl)IQ.>`7NPrRZU 37!9%Fp U%fD~l}^ƋakXaD5,~ˬV|(-^ LVd-%cU@5EI9P.. .RDmH9Y |Lvg&GbybCT5>' h-,`[#P. kquʴ1 VRs W\'+E~,(D g%WY1قcQpYyfjWU(t,x_"ު$x(E .0F&i૮o;Ϫ-?,¸,vy1xV-Z-*>?^y:S8hU˟܌ys7oj/XDiDQ&hhH#& ,7.qBJ x Pq&7}?"<+ icM؍GVZeIΟW>bDM_W)ۋh~/r`k_CDz.3? u!VK}]愷Ø0M\Qf O}mOsɪ7yO[T"SNV K6'..7(R?ncCW'vu)րkw88Eɰ3TҊfl|Od1; g'. н-8#5^{orݳ2brR(J-WH2;D 0(jER ʆyN~g ':A#ǐF'׆?Qve Ezն|2ʖ)g& G J)<5 5<]mólGBHBGefQ/\co3aM*zXq%bJ! ObTe*Ȇ@#ͭmܼ6b\Z»hLRg|9D%"!C%!zɰC 76:J'ĺ4%`EbeHQ}8jP6,6؆6)7 7{E_o@٘PvGYk? 6w`"q0`DM>XkϢ5f߻Xkl7kԀC4RFѦ.8Hr(fj@1h\ˑ8"f9+wk˘o\Sx,//kW!|;t‰2HovE#2J~ ؼzgk љ>2Mn<[7ctE[7?XX.F|ct2 Hg`aM;r)ʉH3v#YBIBlmk_pE9%o98e~i qc/EhvnƊrٕqJQf\Ќ%}OgSI5÷}K}&CfiH(uĠtOS8y]USjM^+Y=\k̽&9{9Xԓ ߁؋v崰)9vHw#@ħ&-%آGln9r+$t}s)s5sQ^ixj 7*Ǹt]vB/( Zh-,z^>z =c CX44"ެ=$r42$^ G^/nõJv_m1HSh I )L$mcss k-[X[]6 㾼л׮ x8c<ЃAgƯ'ԏ>Q?yYo!  ))^[Z^~O߾}CU8OEyiHGa+iVI\v.{0T09lo>2.{|O }?<ҷX|]g/?sYɛ)*Z2ޛ?e,.4r!qak{~iWW@Hycީ{o97U>Tŋw{{>@򱏫>n[q6:ϡÕo?r_cK]o|WW'~5Ld}iy4ʵ\X_`D9'iXX?j-ZI\8AUQ.({ _dϨϖ>:aoZJLxt?9θd/ߠ,cGx>r?s}\1kG?a\4[Be<ס9iJ_~˾m|z4p̪9ʲq\U|?UǪچsq/+dzfC9Qס+sHXH D2`qʴl)jvp}TR?KNq 2_Yǫgw{GP5q㧾 Vnqc$ɱadk‡؟gIcEPebє7IJ/ y=3wt-xTr57!1, N>L&XbSnk8Pwk輣QD,+^FP2J>~b4Ra׋ t;-݉9{TlkO8Σj鬰IѸc{O|7#{f@?47yC +J\n;{Z𒀩jw:f"lEh}E6[M/ac}JN&V'/07?Ig3߇\ |%bM^RgJ}qu7B{ι'΋*n~ULƕݘlaNo]*=f&5Ǻ^D32g/˥1za1MoЍ%le *hYlxeܨ9̏X2X%R}5a]ρs:4{.r52M/XM"$~ཇUq e㗄{? GYfBM3اRx<>v5.Z\ї>lCPeuH{' њ Wh߇]'08HE=#)Q}@/-&&MXo_y,|7yXn!ns|pX+oL6"} _$Cl}YJemnJ2Јs]NQ֩rDf+C Ʉ;GyC+̗:Lra^7IR\/~uj}N,!$&:  8 H%]V,er^E &UXz4-9G=IWWn_缱(snﭿP?/_4z\; xޢ7+K[rx*‰ HLq 3]»c~֫:&e! }pD$pA¯JXtum9׈??88ULȾuU9E},C6R`ʗMza,r  zkK9ux\$>tRrE >upr>WY?? syеTDpIN,Ub9+_W9Ǽ,,;.;w$c<ʱ|on΄0%e$ㅅtީ#vt0?tV$֢J(;fQ4ΤƪR;?-~6zE: p]b 4>I#!90R}JbI۰sɾI"G2$=sj9?kdsHCؗː[*ˍRp3r.|<>>%(;0#^g2Y|Ȭlcæʔ<}u ͏oQj..^\Ie+`=PŜBGQ7ϤU!OU\'_>9ػ/\·`$ks6.#ʚA)4C$gQ`s0C2,4ql9q8e&o].5 f(-8$ / {'r8k-Og)_kr,vXȡ^#O T]x]Y|ҵLͅ'K,//wͧ4GRyΝ[>YslYTZߟ9\]l ,;m!<].1 'DPQ$s2 C: X%Xply/sm6ZhV!ZzKC2e>QCGA媸qqFE)h%,&Q4$AI'B$w ޘDг*֙(ȷ,0me:^K m''bH)"1izen)GU4lVA9֍j29Fs0ȢO׍EIrv?9^.e7Dr\O>L//Gl㳡 :ŢEbpuY9gA\9NR8c ի&8XM~{|vUÒ78U=aVE'ip)˹Ӎ9^lʲ ]5kϦrH qeӠsņk\8ƿI#uAq=  '~16GއN`qz;s Nɐlvxmc&.' 7&Yxq*J&a灋MNj\Tyٲ2ɸ`2U5j@ג_||̊{>r W2a@D;ePQDs!3LX-ɵ6R ǍP){.7%ׂN_8D, -Jp,Jh"׆2u1et|UǤJxu5fh_0ϲ~EF\r_> Ѐ\=(9'9Z.cEg8)gO~Y Jpgփ1:8V4eG]Vk#ڝ!P5A=yJaYq@jdsȷUSnRfJl\(}`к]XZA&]D0\!2d7_xEQ'`{{׷F k-NYbRJLg7|{{}WqRE8Vvwޫgiik?z u$B&vĒÿ~ 5ɜO^x*"-%rx@j &b*k&c|xG_Uޱ`}ҰZr*ąx i)^v0sJ는1fseu9Sqy+ !eųx,bi*}t:tRZ7X\li#;)a(nBcU.4UZ xWaφH\}.^X|r?F:>*q;1>Y^΍zn]VAMM~^rq}2V\|%:`qYXz|-u!%V~r=Lj !=Iy3lb8t萯1z(LX V%g>4P2]j9gSu@Gk7wT(( ܾ}Ӽxz/4 =$J #k&:b#F*V.X6ZGeI'_W^>Rߣ$0P5ʏGe&/rlvع S_voO2S0ޑzfyއ̲ǵ:M9ԟ6#.w^1t5Vc3)u( Z +ۻ6U^wrCs(+B(ӀsUϝE~d^:C{ b,4\'9\43m5 XI#<}PΙ-A|qtivzf,,#o!8Ykrijx\.2Y|$L)SppflR(YlΙ|@ 9i<;J|ʆ5ܐ!aǞ0k74d"}HՅ>OoQ`eF&:gfU F1PX4(Dy]T\>#'>6ز7 '{$ sXuVzc ly_GߓIs+M)a8h߸^٨KY3IPR҆Rl!I%$x.KX6`I'9?,$0`uݗ"%AY2idy Gٹi&XJÂeV NSO YWʐMǟAeIN3>|9?g"uH-標"vH,U%˅Wb#ar҉XʚcdfR|>&:ýzyGu>pM!u􉇔Ԗd+P:'np9q(EQ`~(63%8c CX4a›xn}͑zFȗF?6X1Ž|F5K,Y6'e@r>kh $> WeDʗũ1&\X(c.vd{[5{;8uYX2>5$l!2tĚC⹇ߛE!IʍS)5gn0Y\K$愮h}?D{tzEHQ\>z_o%n׮ xx`b[$kC)ms_ 䶠)܉B6^geX9gF2Æ`wχ9TKƚiث|e}4⹃zF"#Bʅ%L@Z e9RG]5E&h',bqdDT$CxY*Z1.NսkLb2YpZת]bֿK8FddXe0ǵ8簾.Vf.b?l#ek5D "nYR63!2C x<9<|Z%@!fiD0]L |xI.%0DZ8p=t:.Mvqco>n[q6:ϡÕo?r']o~|WW+R>"o̸0Ho7&+=5ۊ7c@ձgE) y aڃw&Z1ʐ|j^R~>y,PHLA,1f(yg%{)"D O'uAs>nLO _I 8CKxrqY9P58Ye5t|+.2i|d\J=sR_~DFEaq>w]`|gϠDcēOX9LW\a=PMca"ތ(n`<?8i AL{}ٜ{UUʅ3w_Gn1wJ'ZdY,8ș |&b->vc3f}z vn7>$S3!Wvasw̵o\@c8؁1}އ^]|#7U(&nݼGnxݗ}sO]66wZW:'WKN ct"Ñ;c8lN|J=hvm0//+x}ո uFZO=F7o ~s_x іM[T%g&06>llAF5sS8"[kۄEڷ K[ Ͱ?=4۸o!CLK$c󗮯(YY^ _^ϭXk6H L/"!*z},f|Za,.10UΕŅ J,_=z%e,v<_@z\; r|ѡ. f}F:bv9h(MΞ 5Xdȱ `iD9q:,΢ 8e6{wgϤ&Waeڈ-c#gXy׷Wn@kG0Qf@{*5&A뎇F2s`iB94C\/@Hʑ , ֜ѯ=é2b+A?~Kx1nס+/}gҥVi1Rdݑ[ +E X3R(.%OQGssg#B$r y[?[p'[x#[u;w0w"i}١(c7}&hfsh-ЗR{a  |%0tЁMM,<7tY 9҈iTisyCu!LgUke9j&EQT̜Vk;mUS#_~st Y8?\%7= =xBIA/qassC`E%}ؔ |L:oL?CYd`-1x,q96>n%Q%S`1Z= #EO8ά6N,.o&"2(:xc)nֱܹc h,EvqW"N%JLP+9}[ON$ob+/g*67dLEQ`iIg%)Kxc tp{6Sv]9!p8Evb|?=t(͢ 1N%u: E>X0$3䰞cZX즵ճ)PKI̖cvq{J̖sՇ?y}(uǣd? +c7jEE0diHY(iFXsQ 5ǹ$mX,hh63ko.// ޜ6గ2pj8^{:q#}g_Hu|mIȮ,e9HKEN$8:wz)>j6wH6PoWq5r1>t\aw'=v<5sT/YR Xl'Yd_(n`U<ϕYd Yd_,%?z#3G0U"5< 1qzZ,j%pvpR4淓,W)yvd惃v1*{˂GByK (:Tuj|Ě)ʔo>LǎdΤ U,lw5:k4_{-=";?$l9ᣥ2*qW[ĜʅAKe0Y9-.ځSj/\v2̩qust(fe0de<^ > B,q&(^?XЌ(őR  i&\K'r5rDՄ_dH相q}^}xߺ6GF(' :VҔq_1M©*pLt @73>UhH_9DXpx;Ǟ](tV5/tyVv{( 1?,c *({}@%Y$Ӈ{FH; Ę {L"O]Z jQ1V{z=\^g峬cZO 7u$F&f7a9c5ș2+x/x9;" lUkɰ1\ZBk6sccת}0T87BfR̤2Y?E 1>.(Vk2ZIPZ} &Kp)a`Dгu3GgQ)uocʬ@uk!9ɠj$2):@`ڥt('gcA< (ƻү3+JR(7s%ſW^gQ['O碜 W xo➟($m |aQj5aى~nctܨ='WaVtK($VxH#;+:h|nd$X.%-8[$cйUQS&U.^QjOZH\Ly~eeiO1$δʬ(8`rڥQSӟ1+xfR?(,qeȊfm՚{& H{9|=3>8; ڲAhъtxxsЊ(2b}ĕYfIy1[krdH lI3bWf2<뾟h'n5٦2ljWfqD)`km*H $J!NsMn!_YuRo$1KM*q1r1B6O뭵)Z ͅi@o&WQK'sZ[K3fB^9X֚-r}Ҕ(G6 A~ ѓUu%/l,9(?Џ^0{V|Ԥk`lshծԟXsri9s*5g Maf%@}Oi>᦭CMŶ,Y\X46(&kđI܏$x*qΆBύƇ g{&lhl͜dilt.ثrLГce2a.R5ͪ*WC1w0ZPÎzLT\£&4Ѡ22_,*&{øՙrN zオVC=;'No=)?/n1<]VQjN6BczB;^Ff9oB<(yMU5ӱBx={1)CM'ePΥ~ed{m4@;<sHv 5 ęiB$c@ ߭(3Eh)η|+צ]E  {r6.PiXִK%ޕa@ Ъ]%ީP{JF_٫ϧ:/2.Aì_`?Ӳ}8(g)}T(3Cps.NY%1з`4L 35LퟶљSl[.RzB=ĒloYP3-h TQgi10e:oQf~8{ek8}&UjFiG-/Cl1TN%b]g_'hef`A$9vd8Я8_R&OM$}&6;2o"k<x{ϗr?S .ť%yXqę8Ϣ_;.r!Rg<|"lDC@A{"Rh웩C6&1qHIQ/UCf~-M%TZcUVc=CTrJ?6\j|gcd7}_Kd ]mfi ؕkML,rlb74rπ+׀iSA|Rsxi7_.|.D(3Cw9P:V5lBʹ@6<0|1}huj{`v?IENDB`PKL\;zGzGDinstagram-feed/admin/assets/img/instagram-with-uncanny-automator.pngnu[PNG  IHDRtPLTE}LbQ]?R[e}xzHaPkMWW2I?^~z9W[DYj3Kf~e1L_/@>^tD^`.E9U{XsxTpe,I:Z~Miq=W^c'Gd&GFbJda!GRk=V|Ea;\HenIeɿ˞wZEaTO-9VUP$2UQqvm2]*4M%.@Q.H;(o-emYW#!z@Gѽa9R߷؁/*DYjo{VcteU w䕸ߜ|Wsf}{lke$txh_Y#޳UhcK1qkOWT~.C<+˶GPF|?bOތFt=kI'Ьd;뜻EYG®!c䄶ypȶ?Gm^h|0FtRNS  %,)$#!'xIf`@6v3̳HU6Y0CIDATx:X0|.־ FŨM"n}2y(8 vtVĈ ?QT+}23@a&Ù 7Y CYT]_㬮.ܠe]~yBU8r3 ˺z\wD䰶OSµc+_KS;$o)_ƅ۟y <i#_9{=,x25,ĭq 1nIe:.4^^s=C 0. AY +Io#j;KoKv"0jyi}q¸7^;"DAPO!DB(. emq4B<=%r.wŽC*$3;LxuD~fkve\ BDYOCUK9pRɑCۣ@TF$RH_U?x浕DaX_UXp !''D ƈ*uc갭Œ`̫4s-G ɽJ"ɩqeoZ( h qqV9G9@3@dLKvz/\:ak3fǒLl!2 V8sj&ȶ6y40x*:@w$[˘Q#9Ygme2!SEoswݓi#Fiل8 xҾ_ёڥxH'xh@J1+1cjVFomؑ>CԵwp4\l^̆2\ZXd{F91{X=9xVژiG {i(dzxKuFxDB3yxf3FEPNߗB0̹/IR0DtfRe 6%k"M!fǓujDbV7SI Uxs_3B@T c;MN\/׾!Z!ٹ JdE#tLYTO~)B;;}r[RPc\ٔ-x z'3)q֐%)Ě26\8foi 8EfmLn۸֦WBǓ~`BLR0\Ɠg.`GE"ts1&q.lٓwFy0L:C]Y!pE1:8 }(q(E&Pinu FL'3fjzTe޶xr&R%x/_,]sI8mEڿHW6|n}.ҟú/e&%K#rzMq4Z81iHN 3`@ 1-Ut\.ҕeᙪo> AVn]N6h$G.ػ9#&$tj"4-w{\ś7[ɦ~obR1{n *۽4qa534Lɚ;/~.o4tdhxxxXwWpG8K06bO;=_}ZV/..E͐QX/nN&suF1<%ιI<ɘAEsEװ$s4am!5 mh jF,{!q?E/ sȈah683>鵄:Q 2D\;fiNgCfJQ5)*|YXs)K<1q wc ll￿V~|kk/CEf{)߯/.ׯ?}|æDůFsyTF]-h4"hLbtYU甉-ZYڍn[8Bn:u Fy9>ֻ^=s/!}9ϡF)6d bƁ:W_}ݻwܶmKP=ܹ?&dw<!r7]Z¹*>&]]қW ”/@-:H({\ h`FT!0m]ۺad<+1B?ji ?KcƋ[6q=T3;ܮŸ`ByV,0#"),GF@̄Q+:ۄh"ܶ4h8vF ۴+;o ewKlrIWT ȈQT!al_ җA`co>ݻiun-ٽa)ty._!+)X(ȗT%]Je?a/uk_lqw w_|P{s"cW1^Kojw--)9e]ZD dz7ٿ"<%[n O^UiXle`*-R^@JN:p $"f-B%WaGdkծ1v K 8O4!\)FxM!jdy/7WeX215-GK|~{*jm ٙ^1Qo@ m_`k"\D +Af*)BDhM8K5uSeF-GbV=LP' ;AGڅUF#tX`EliX{)|[ q$_`!\40zlv8P)$ ýD8kL8pZ+]E\Q^Rs8 Nd>E aV3+B nm%U -O44Hџ cZn٣ ӫpyd%G^Є\R8|d#>[ 7}TjW[ <` \I/^q2_>FαdnjVEBs1˦6\b~F/œG=8r8&a1WC~w#1㭜a=-ljOqd O`!+ĆO^uĹO'ٵk胉O ]RDBܧcd MgFb=p /k9@o@΋NE|Qa9ZфA`k:a}xޅGH]E?kq\ul!t /8en$<,u j9gy^34.MwOQWo|N8Q:|RY(O[#S'LˋLuW۶!۰Z'K0f/F #_!CT:)/_t0[RT" pH Y =HC,4S%RMZٍ屡|eK]Ѱ&,$2iYO? yvkLWҡH<'|).֝& djtS 2Fh\0?|8i{)_؆]; 4b~L=}K '֣N<>l8 Y8[[ fCjZx{/O1LgSt0Exi*rC,_yKRd`xz td3WcJfhb 1Ș"~dWV{Q~`,owoum{(,$@-%Oo"k #\F"h_`kTD/g`,_ CDLD#0V?y-]v+9iE4ɒ7ZM=]-8x6Rg:`ly/:EA8ኤ5*8_A8)$j,.#ks056r2Z!F۲r8嫿Z ^:[ݬl!Q4sN 0Z3jBT9πh<10^1~9BBOdU䪱%a`(fZcVqew0( RpB/w21ryO|(s܃v jٚz ?vwcoh2r]/eɃas 7?ȗM>oӠu0x=6sAV=c\Ϗ>xrS\&Ku:IܻxqnnWv!ZG<+7Y7n8nZPe}L=[_*aWAZ\\r=ў=|>Q`s.%l36<)9ᦫj!KͲ[X .SzD ,}2(L7/| ۖW^0x,-G{&usVGg(nwo4IGU kqׯXUL*qu˯@ 1qx6gk0`c5>޿BMqk"1}5_%Dը5W/.Nhoz<>H^;r'#Ǹs!+rqs:q'sT?JN3\6kF,7\3^a9jE,6f|\a `̂tߥ`'Xb]0y77-*'պ%;` ҰxDqEi$W^pas&+`Ѡ kd-ӏrXI|3K̟ wŴYqܗ@ciίi~KI$f 8'Uh4)mhF iH!E H:a̘9&^kyO@˗v5pt44Hrpsv{ VdzW~\|tZ _Вr䞓U()ͭ7hq:B{0_#:953~LU~݇ rEta~yLk$˗T],IctGz˜jc|`˰R1 Ht dːߓ?_/]Cl.} v$V܏jj:|kJ/5{wLX -oY'®ΰm*:,ZT h'RByk؅97T3ظ[FM1u LtA, |hzf \Xe.\t $ 2OЃFZ'ipxfE׫!VѨAx\ T K0y5̓oc & x#וv6O 3k"tǷoFŠhnCIQ0ʢݷ>\)b 8V颥_/L++ 8T ,f "Dm_X+Đ39~o!aog"<99ywF{/w?i SOC'4݀͆t>!A<')aӀ'*_^3MMȣ;΀3$i$[8_gGhm{#v(H#l;öm*`_@W@yZ>/jc|YYLn\.X<Sh",%N{TE#r !ΔZT+lJq&PYx]/[Pwۅ}ÆۣOE_U/w "q_闙/_bFDEE~)áEEePڽuy" ™CLDl"D8&&5؉Gmαn 69pgoܸq;wx[OV54{ίH,-wUT $=[GR``Go-.{-jcA;D8`ab8xew|P+c $\A5ϩ$B:99px +ƅ6wrxx&·;4l6gN+J(2Rt 9ݰ /:Uzɮ.7IA wv3bx$==B8MDp >[eRme{܁fq1Ol]^-mT[T11N_kiil`liiOmÿTAP[7B!T*^;ʗ:C8mD}iۅXIt $*r4OX6Xl#^U]]_Dgz"Ɋĝ/hyyC҂|@RC/{Z'>t%ԀI<8 n&<:+HF^ |v9KW6=B[tݷWqPZ …$\z2.º 7"F/)7 +X,Ω5>65Pv jm[9#c`#T[eJQKlvޱlLi/|,bwM5D7wa5`h#if襩!2VFׯ٣NkM؜Ze}`ԱT,Nu(E &ife2n(¡Y h;V;ek528i u zNν.u|/XJJJЩY䐃ȲP븭,W 2Y:/,L5 6iŤ٩.Ayqnev5K i?HeԱciъH@Fw?SUG48f^Ŋ1`@ T4 'a0[ۛ ` vzb' k:|SroفZ8ꁘg⌅]:$ZRw<=8S4!p)ۿ[3KYt[_wrb :AxsB1فGK ˩4n*sUx|CQ!7 b"ؔ ۴%bޤȤ\!egy9R4rh<ͤuzh%vnE]FJ42gT<|I2'L* XkO:g&r,30Wcb(|w*ʽC*a-@K@Uu hGA^FipOΦ7#8  Vhe+BcrHH~@nism]޷9OjzzzMU_F7M1? Y%Mr#ѠkM0߿w}7i%P&lZ63Rm;ج| .:H4%\Y.[ DϰkcCgXT}~VjFW1ͳhXv6js[jv(aiӸ&>b\ogݘLdX3 ) eG9izH'v^}G#m`9m6J `;Na v F|װZ y4fJk/09Nq5?%&&f;|/\XPi3>s/G.G{72qRa#@V0Nr.mkS 8+5'YO@{1P71{ EO&m"$3<,;@Jc lSuY.V~wc^;0>=f h\DzA89d3#q՜#w;uIc5t)hEhīeL`Z::vlM{>}huQg$\S7 ê/Z1DU]X̊6Mp!: Ώ pdXZJ[Y^$`ex#o^vd |~e%ދ)^cxaQYQ73W9ر!ܫnh$!KV2O!Q8./^Mm`p@%&/Lc*؅`]C5_Ix4La׈&5P:n{/ek};_fbWAzK%%̈́ph&M #O1v+D `1\v$;Y(Vp IA-1ǀFĺp<qnK/Ԗҁ0ڱ> $ЪaV??5u/Q  CXslD18-$8#ft]ЀYN z0 O[(a1W+ dFˋ: q{t"`#TItwTp:]nTlܵZnVO yfI'JXΞ[`G7AUo +xH p*3fE?Ȇ>$\3?I,^)- bF,EE#fXc$w/v(+ٵEpy Ytڪ޶{FT a, ܾ$LGn!~ b|͎heDl~faB|pdqh{͍z|X Go̠CRzA&~lD/CɳXfjіIA&[iQ$ s77^1v%N3*D~TΙWk8 QTϘaL&)%yR<1ELBg>xRڤ)r ]ɮd Bfxdna&g'LŬByU/jH8N0Za <4\!?{%x02*Z@ô9ەQdҬ6{j5;t2#6ZW$Ju|oL'gaI5K Z2B ϲA2DL3!mԪQh4Ɣo x],R XbpxE] S@)l衏S} T,p͇I;|ުυ;sMtELgא~9wh*o56s-Dm k; -7(< V3f2X%v~` Cr"j7u X.8KjلzX_D<Y3{a.o/˓$3LCNXH7T~:[&Z2 X3itTR"v5%…ɲ%gu}/Ջg)T{w +EHl:a!o]c3 ~;w3|[k)#U2yOH!XYЋ&p^*/|p'B&QM4mcq BïݰG_h]#"WþVoXlUm+KF=A>65ѼwE'_~G}>ϿZl :5o* Ǎ7 `aC#A}~3~|)oݨuK&h߹]ѺmfoSצfߍCpw4K].2wv+(!ڶ[o`= a}R88{1܆\3&NI'gpJXVpHW4{1\z1ep!~?#0/ᕚVP`9U!\"]#7dqoM9Ϗ19L;Y yd/A-poP 7R/hGc1[y1x]۶?oύXMgIL6^A?FfZdή^qJI?~ƭeq/mѧ1McWvoss&gq{S mC^Qz0c$X1j.WSK7t 鿾GIXU3ӈzs Vf;`L_s̛ ۝meƀfms6fԽNh:݂. .,j:^)-]߆*ɏpT!DN70¹Iz~Z6yscV+L= VۉM;;WuE\ЭoBxe:*d4U@4WijU7K^* 9H_7dZs{硺5ack`W dt\e;yS,om*wq+yyܞ(v)h*tO:ցmh 6鶜KJеkSibP5xǮ 85 _'twun 2Izށr%`hub:E؇кw$\N>=9~oDKSw={1] kJj)Z fy+IșVFPf(pe|ce|zɞǶqrfY|}끕^tswoY3u>9[ZPG QOvjΚv@5 \g[L$:E6Sq`QW{u ƾ fbqN?f]մE89ҰFf6dK5X7B^\ͭfm;&%)sh%ftAoUՕ4i^7.zU3,T.eUhM!ԣ||E̱8|j3!Yx{S%33o}/ռa]+PSjgQjyʉSi'YSM]BTyy}.ʢ9-%aegYv(6I8aElrPHy̼;~6SM[u-TFĆ.խoiZp}aL='h'Gkem]zԾmh0hs.Rf̹r=t F.!;pXGsL4ikv9ۄnXٔ^s=Ky P09ʨƩIܴnճh]pZ/ؾ\쉢տB6u1.byP$g^f`ic|X$T - &/usEtqM\_=t'==-/|$ ǹd:8#LvHg,oQ![::p-B\ULٸzP*N>q2d-ˌ)j"F#˜|{g5 Q}Mq93 BlG Y<`ּG[X! ⍇WH%2bGxkWNY# 3``{^'B<4eΝ ;xx=XL_R'#PO) a,?$^+B) 簂G{rkCo2U}2sE SŖD !bOAθgToܔ>t>DLMvrUka&]kq/p6vcA?+lN DZc3~`y~_45.u}ߜER-+nź9:{ߚrN x"rlSI'50s%Xy-M~'G>{2{Rs,yƔ\p})c匽28+ʕݩ~K?- ={P @G/Yv't4K=3%N 3;QgEKǵMr#!joѽ`ZKt{mn>4P>|TNo#JKt}b}E\,hk.P.ЄUU'd 9 xy↯Ha(~%V 4Gk#|Sz&Ef PtoM{FX ZXYWg7=M"M1QV [͛اnԷR67Bx7f\}^[;M 3 qŨ5U"Łxמ$žGTX%<<0٥c: F0 n}U~zlʭT37pa8|1BnS6B;Qk H7ڇ^dH>CdB_TA. ƛ$2kON}8 tѣXLvgz:M=-m]Y3Zy aDq 4n Z"v߲(^ͣ 1Z%Ty(:P -YRo32mr0_9irΑ rkhP!CqF@t强S?xL[zCc-)d;Jx?ۑY.5[`WB!`s\L=kz``}NtQ^رua.VB#|_(ge^6DHs߈p} |9Inb.쵪k뷽;Haʇu`n2p!L 1]2uE12u~"y35Tt?ZrQq$焺22+Yc]s|lЖ3NiOTEWIENDB`PKL\R--,instagram-feed/admin/assets/img/sbi-icon.pngnu[PNG  IHDRTT tEXtSoftwareAdobe ImageReadyqe<(iTXtXML:com.adobe.xmp EeIDATx ty#fb ODT0@~s1ۆc@,#bnF M®/6#sG/.)]vuo}29*пQiC6 {^^URs-$jHFt-~7rNT%9^ EGW"D֭Q N ,5<;c|b)"?N9>KVZ ?-2cxN\T94_WR'R':OV4lZo|B2L[zu'|Avs3X1>ǎ|!t$iCc' o~Q4sN%cIsPrWlKG Qn.2w^R?Td1>rq$Zؔ"BG}Z| .vpY%eղ$P9+,`D (kӵdWdִ I2<׊ _3BQusCU8=]mӞ~w̎+Ϝ%-X{@X#!6 wᑳxTzӛdk[_S ]a՗wnQ LӸp_c̈Uy/2X$'0<#A+L^֏:6y= W&OֶqNʼy5Oq K纔t; Ó4@Y¹M'!β$AR :?rqIq%E zJJN\G8T]??  ?"J7[}[_:p:^8 jH{ P4h:/W{6! ɔE=ز\zRqzB5f:\<剰 P."Ou0'w Ahufo'j`%zHCM.}θݐmT7s{7œ9H~)3"? [E//z{슶'|_vPr ȩ U~=xҌV g`x1;:Q ?Hvdx3}Θ^ۜn_ z)e9>PS798g*GoNJynY:bc4% ں~:vzUOmsx=2O67#4't=8 WS;Ol]HlpY0 I/j&+lïLK=;Q[ ДUq:-m1Y4̏vo jزv.M,f~Pl udQTxܳ(q}Wf• |dَ>jkA ۔FxW_d&PȏЀBdY~g?'սvnrv ;c9iݩ3͚pHgm_zU`Hۇ8DZrXlr M_;c--WH{`]S{R;{<扣9pyx9kЯ( ?#=@ E<z\nuXQyQKvH9g[pToy8I`j+E_S~ z!#ީ7S͜(GR _>Mu :@8z{QC o1)i#11fhI#If G>6SsVi"߸wp |rt</ҩdՎҥ2eVE ް8zGoiq_<7f=Dq x_??7mV*XļWOnƲ-/i8T_?dkc"Ulİoʒ]L_1~ûpn$](fP}[%0gOVn v㷙qD;3Ia0[8|/߮ `YhIENDB`PKL\N,instagram-feed/admin/assets/css/settings.cssnu[/* * Settings CSS TABLE OF CONTENTS * * 1.0 - Global * 2.0 - SBI CSS Framework * 2.1 - Utility CSS * 2.2 - Notification Element * 3.0 - Header * 4.0 - Content * 4.1 - Tab Styles * 4.2 - Tab Boxes * 5.0 - Footer * 6.0 - Sticky Widget * 7.0 - Responsiveness */ /*** 1.0 - Global ***/ .clearfix { display: inline-block; } /* start commented backslash hack \*/ * html .clearfix { height: 1%; } .clearfix { display: block; } #sbi-settings { -webkit-font-smoothing: antialiased; font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; } #wpcontent { padding-left: 0px; } .clearfix:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; } .checkmark { width: 21px; height: 22px; border-radius: 50%; display: block; stroke-width: 2; stroke: #59AB46; stroke-miterlimit: 10; stroke-dashoffset: 0; } .sbi-fb-full-wrapper{ padding: 0 53px; padding-top: 82px; } .sbi-fb-fs { width: 100%; position: relative; float: left; box-sizing: border-box; } #adminmenu a[href="admin.php?page=sbi-support"] { display: none; } /*** 2.0 - SBI CSS Framework ***/ .d-flex { display: flex; } .justify-between { justify-content: space-between; } .items-center{ align-items: center; } /* SBI Form Fields */ .sb-form-field { display: block; position: relative; } .sb-form-field .help-text { font-size: 13px; line-height: 22px; color: #434960; font-weight: 400; word-spacing: 0.3px; max-width: 640px; } .sb-form-field .help-text-green { color: #59AB46; } .sb-form-field .help-text a { color: inherit; font-weight: 500; } /* input field styles */ .sb-form-field .sbi-form-field { background: #FFFFFF; border: 1px solid #D0D1D7; box-sizing: border-box; border-radius: 1px; height: 38px; padding: 8px; } .sb-form-field .sbi-form-field:focus { outline: none; box-shadow: none; } .sb-form-field .field-icon { position: absolute; right: 8px; top: 10px; font-size: 20px; } /* sbi-checkbox styles */ .sbi-checkbox { align-items: center; border-radius: 100px; display: flex; font-weight: 700; margin-bottom: 15px; } .sbi-checkbox input[type=checkbox] { clip: rect(0 0 0 0); clip-path: inset(50%); height: 1px; overflow: hidden; position: absolute; white-space: nowrap; width: 1px; } .toggle-track { width: 36px; height: 20px; position: relative; background: #9e9e9e; border-radius: 31px; } .toggle-indicator { width: 16px; height: 16px; background-color: #fff; border-radius: 100px; top: 2px; position: absolute; left: 2px; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25); transition: all .3s cubic-bezier(0.23, 1, 0.320, 1); } .sbi-checkbox input[type=checkbox]:checked + .toggle-track .toggle-indicator { left: 18px; } .sbi-checkbox input[type=checkbox]:checked + .toggle-track { background: #0096CC; } .sbi-error-text { color: #D72C2C; } .sbi-error-text a { color: inherit; } .sbi-fb-cp-clpboard{ width: 0px; height: 0px; position: absolute; left: -100000px; } /* sbi-select */ .sb-form-field .sbi-select { min-width: 235px; border: 1px solid #D0D1D7; padding: 8px 35px 8px 15px; height: 50px; font-size: 16px; color: #141B38; -webkit-appearance: none; appearance: none; background: #fff url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAYAAAB8ZH1oAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABSSURBVHgBfc4hCkAhDAbgjV3slQcvvHuYDWY1G8zewyIWb6YuCCLqD4Pt5wtD54NBQA2XVKiWcorl/X7s+DkhJYUhPk54IN5plCue0Tb8M8/aNx/uIpRVqbbFAAAAAElFTkSuQmCC') no-repeat right 15px top 55%; box-sizing: border-box; } .sb-form-field .sbi-select.size-md { width: 422px; } .sb-form-field .sbi-select.size-sm { width: 210px; min-width: 210px; } .sb-form-field .sbi-select.size-xs { min-width: 100px; width: 100px; } .sb-form-field .sbi-textarea { width: 100%; min-height: 100px; padding: 12px; border: 1px solid #D0D1D7; font-size: 16px; } .sb-form-field .sbi-textarea::placeholder { color: #8C8F9A; } .sb-form-field .sbi-textarea:focus { outline: none; box-shadow: none; border-color: #9c9ca0; } /* SBI Buttons */ .sbi-btn { display: flex; align-items: center; vertical-align: middle; background: #F3F4F5; border: 1px solid #DCDDE1; box-sizing: border-box; border-radius: 2px; padding: 7px 20px; font-weight: 600; font-size: 14px; line-height: 22px; color: #141B38; letter-spacing: 0.2px; cursor: pointer; transition: all 0.15s ease-in-out; } .sbi-btn:hover { background: #FFFFFF; border: 1px solid #D0D1D7; } .sbi-btn:focus, .sbi-btn:active { background: #E8E8EB; border: 1px solid #D0D1D7; } .sbi-btn .sb-btn-icon { margin-right: 10px; max-width: 15px; } .sbi-btn.sb-btn-lg { height: 50px; font-size: 16px; padding: 7px 25px; } .sbi-btn.sb-btn-blue { background-color: #0068A0; color: #fff; border-color: #096292; } .sbi-btn span { line-height: 1; margin-right: 5px; } .sb-btn-orange { background: #FE544F; color: #fff; font-style: normal; font-weight: 600; font-size: 14px; line-height: 160%; } .sb-tabs-container .sb-tabs .sb-btn-orange { margin-top: -20px; } .sbi-btn svg.checkmark { stroke: #fff; transform: translate(-7px, -3px); } .input-hidden { height: 0px; width: 0px; overflow: hidden; } /*** 2.1 - SBI Utility CSS ***/ .mr-3 { margin-right: 3px; } .mr-4 { margin-right: 4px; } .mb-6 { margin-bottom: 6px; } .mb-10 { margin-bottom: 10px; } .mb-15 { margin-bottom: 15px; } .mb-20 { margin-bottom: 20px; } .mb-30 { margin-bottom: 30px; } .mb-40 { margin-bottom: 40px; } .mb-50 { margin-bottom: 50px; } .ml-10 { margin-left: 15px; } /*** 2.1 Notification Element ***/ .sb-notification-ctn{ position: fixed; bottom: -100px; left: 200px; z-index: 99999; background: #fff; display: flex; justify-content: center; align-items: center; border-left: 3px solid #fff; line-height: 1em; padding: 10px 20px; padding-left: 0px; border-radius: 4px; box-shadow: 0px 26.7377px 77.2886px rgba(0, 0, 0, 0.107828), 0px 14.2952px 41.3222px rgba(0, 0, 0, 0.0894161), 0px 8.01379px 23.1649px rgba(0, 0, 0, 0.075), 0px 4.25607px 12.3027px rgba(0, 0, 0, 0.0605839), 0px 1.77104px 5.11942px rgba(0, 0, 0, 0.0421718); } .sb-notification-ctn[data-active="hidden"]{ -webkit-animation: sbi-notification-hide .5s forwards linear; animation: sbi-notification-hide .5s forwards linear; } .sb-notification-ctn[data-active="shown"]{ -webkit-animation: sbi-notification-show .5s forwards linear; animation: sbi-notification-show .5s forwards linear; } @-webkit-keyframes sbi-notification-show { 0%{bottom: -100px;} 50%{bottom: 70px;} 70%{bottom: 60px;} 85%{bottom: 65px;} 100%{bottom: 50px;}} @keyframes sbi-notification-show { 0%{bottom: -100px;} 50%{bottom: 70px;} 70%{bottom: 60px;} 85%{bottom: 65px;} 100%{bottom: 50px;}} @-webkit-keyframes sbi-notification-hide {0%{bottom: 50px;}55%{bottom: 65px;}70%{bottom: 60px;}85%{bottom: 70px;}100%{bottom: -100px;}} @keyframes sbi-notification-hide {0%{bottom: 50px;}55%{bottom: 65px;}70%{bottom: 60px;}85%{bottom: 70px;}100%{bottom: -100px;}} .sb-notification-ctn[data-type="success"]{ border-color: #59AB46; } .sb-notification-ctn[data-type="error"]{ border-color: #D72C2C; } .sb-notification-ctn[data-type="message"]{ border-color: #141B38; } .sb-notification-icon{ width: 25px; height: 25px; display: flex; justify-content: center; align-items: center; margin-left: 10px; margin-right: 15px; } .sb-notification-icon svg{ width: 22px; height: 22px; float: left; fill: currentColor; } .sb-notification-ctn[data-type="success"] .sb-notification-icon{ color: #59AB46; } .sb-notification-ctn[data-type="error"] .sb-notification-icon{ color: #D72C2C; } .sb-notification-ctn[data-type="message"] .sb-notification-icon{ color: #141B38; } .sb-notification-ctn span{ font-size: 14px; color: #141B38; font-weight:500; } /*** 3.0 - Header ***/ .sbi-fb-create-ctn{ margin-top: 90px; } .sbi-fb-header{ height: 64px; position: absolute; display: flex; flex-direction: row; justify-content: space-between; align-items: center; background: #fff; padding: 0px 52px; z-index: 2; } .sbi-fb-header-left { display: flex; } .sbi-fb-header-left .sb-social-wall-link-wrap { margin-left: 30px; } .sbi-fb-hd-logo{ display: flex; vertical-align: middle; align-items: center; gap: 5px; } .sbi-fb-hd-logo .sb-logo-letters-wrap { margin-bottom: 4px; } .sbi-fb-hd-logo .breadcrumb-title{ font-size: 14px; font-weight: 400; line-height: 22px; letter-spacing: 0em; margin-left: 4px; } .sbi-fb-hd-logo .separator{ margin: 0 5px 0 10px; } .sbi-fb-hd-btn{ height: 38px; cursor: pointer; display: flex; flex-direction: row; justify-content: center; align-items: center; padding: 0px 15px 0px 16px; font-weight: 600; font-size:14px; color: #353A41; background: #F3F4F5; border-radius: 2px; border: 1px solid #DCDDE1; position: relative; text-decoration: none; transition: all 0.3s ease; } .sbi-fb-hd-btn:hover { color: inherit; background-color: #fff; } .sbi-fb-hd-btn i{ margin: 0px 5px; } .sbi-fb-hd-btn[data-icon="left"]{ padding-right: 20px!important; } .sbi-fb-full-wrapper .section-header { margin-top: 33px; } .sbi-fb-full-wrapper .section-header h1 { font-size: 32px; line-height: 40px; } /*** 4.0 - Content ***/ /*** 4.1 - Tab Styles ***/ .sb-tabs-container { position: relative; width: 100%; margin-top: 28px; } .sb-tabs-container .sb-tab-content .sb-tab-content-inner { width: 100%; margin-top: 20px; height: auto; padding-bottom: 30px; } .sb-tabs-container .sbi-save-button { display: flex; justify-content: flex-end; margin-top: 30px; } .sb-tabs-container .sb-tabs { position: relative; display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; } .sb-tabs-container .sb-tabs:after { position: absolute; content: ''; width: 100%; height: 1px; background-color: #DCDDE1; bottom: 0px; left: 0px; z-index: -1; } .sb-tabs-container .sb-tabs .tab { position: relative; padding: 9px 25px 15px 25px; display: inline-block; font-weight: 500; font-size: 16px; line-height: 160%; color: #8C8F9A; text-decoration: none; cursor: pointer; -webkit-transition: linear 0.2s; -ms-transition: linear 0.2s; transition: linear 0.2s; } .sb-tabs-container .sb-tabs .tab:not(:last-child) { margin-right: 20px; } .sb-tabs-container .sb-tabs .tab.active { color: #0068A0; } .sb-tabs-container .sb-tabs .tab-indicator { position: absolute; bottom: 0px; left: 0px; background-color: #0068A0; width: 200px; height: 2px; transition: all 0.3s cubic-bezier(0.22, 0.51, 0.53, 0.88); } .slide-fade-enter-active { transition: all 0.3s ease; position: absolute; } .slide-fade-leave-active { position: absolute; transition: all 0.3s cubic-bezier(1, 0.5, 0.8, 1); } .slide-fade-enter, .slide-fade-leave-to { transform: translateX(10px); opacity: 0; } /*** 4.2 - Tab Boxes ***/ .sb-tab-content{ width: 100%; height: auto; } .sb-tab-content .sb-tab-box { background-color: #fff; padding: 24px; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); margin-bottom: 12px; } .sb-tab-content .sb-tab-box-small { padding: 13px 24px; } .sb-tab-content .sb-tab-header { display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid rgb(232, 232, 235); padding: 8px 30px 10px 24px; background: #FFFFFF; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); } .sb-tab-content .sb-tab-box h3, #sbi-settings .sb-tab-content .sb-tab-box h3, #sbi-settings .sb-tab-content .sb-tab-header h3 { margin: 0px 0px 5px; font-size: 18px; line-height: 140%; color: #141B38; display: flex; } .sbi-btn.optimize-image-btn { box-shadow: rgba(60, 66, 87, 0.05) 0px 2px 5px, rgba(0, 0, 0, 0.05) 0px 1px 1px, rgba(0, 0, 0, 0.12) 0px -1px 1px inset; padding: 8px 12px; } .sb-form-field.image-format-field { margin-top: 16px; display: flex; flex-direction: column; gap: 8px; } .sb-form-field.image-format-field .sbi-label { font-weight: 600; } .sb-tab-content .sb-tab-box h3 .sb-tooltip-info { transform: translate(10px, 2px); cursor: pointer; } .sb-tab-content .sb-tab-box p { font-size: 14px; line-height: 160%; color: #8C8F9A; margin: 0px; } .sb-tab-content .sb-tab-box .tab-label { max-width: 270px; min-width: 270px; padding-right: 55px; box-sizing: border-box; float: left; position: relative; } .sb-tab-content .sb-tab-box .tab-label.tab-label-full { min-width: 100%; max-width: 100%; padding-right: 0; float: initial; } .sb-tab-content .sb-tab-box .tab-label .sb-help-text { font-size: 14px; line-height: 160%; color: #8C8F9A; } .sb-tab-content .license-status { font-size: 14px; line-height: 160%; color: #141B38; margin-bottom: 8px; display: inline-block; } .sbi-tab-field-inner-wrap .upgrade-info{ border-bottom: 1px solid #DCDDE1; margin-bottom: 24px; padding-bottom: 24px; } .dev-site-license-field .upgrade-info{ border-bottom: 0px solid #DCDDE1; padding-bottom: 0px; } .sb-tab-box.sb-license-box.license-type-free .license-status { font-style: italic; } .dev-site-license-field .sbi-upgrade-license-btn { text-decoration: none; transform: none !important; height: 38px; padding: 4px 13px; width: 165px; box-sizing: border-box; border: none; } .dev-site-license-field .sbi-upgrade-license-btn span { height: 20px; margin-right: 9px; } .sb-tab-content .sb-tab-box .sbi-tab-form-field{ width: calc(100% - 270px); float: left; flex-wrap: wrap; } .sb-tab-content .sb-tab-box .sbi-tab-form-field .sbi-tab-field-inner-wrap { width: 100%; } .sb-tab-content .sb-tab-box .sbi-tab-form-field .sbi-tab-field-inner-wrap:not(:last-child) { margin-bottom: 20px; } .sb-tab-box.sb-license-box.license-type-free .sbi-tab-form-field { flex-basis: 58%; flex-wrap: wrap; } .sb-tab-box.sb-manage-sources-box .sbi-tab-form-field { max-width: 1200px; } .sb-tab-box.sb-custom-css-box .sbi-tab-form-field, .sb-tab-box.sb-custom-js-box .sbi-tab-form-field { max-width: 840px; } @media (max-width: 1023px) { .sb-tab-content .sb-tab-box .tab-label { width: 100%; max-width: 100%; padding-right: 0; float: initial; margin-bottom: 20px; } .sb-tab-content .sb-tab-box .sbi-tab-form-field{ width: 100%; float: intial; } } .sb-tab-box.sb-license-box.license-type-free .sbi-tab-form-field .upgrade-info { width: 100%; border-bottom: 1px solid #DCDDE1; padding-bottom: 25px; margin-bottom: 25px; } .sb-tab-box.sb-license-box.license-type-free .field-left-content, .sb-tab-box.sb-license-box.license-type-free .field-right-content { order: 1; } .sb-tab-content .sb-tab-box .sbi-tab-form-field .sbi-form-field { width: 100%; } .license-valid .sbi-form-field, .license-valid .sbi-form-field:focus { border-color: #59AB46; } .license-invalid .sbi-form-field { border-color: #D72C2C; } .sb-field-error .sbi-form-field, .sb-field-error .sbi-form-field:focus { border-color: #D72C2C; } .license-valid .field-icon { color: #59AB46; } .field-icon.field-icon-error { color: #D72C2C; } .license-valid .sb-form-field .field-icon, .sb-form-field .field-icon.field-icon-error { background: white; } .form-error .sbi-form-field, .license-expired .sbi-form-field { border-color: #ab4646; } .upgrade-info span { font-size: 14px; line-height: 22px; display: inline-block; } .upgrade-info span:last-child { font-style: italic; } .upgrade-info span a { font-weight: 700; color: #0068A0; } .sb-tab-content .sb-tab-box .sbi-tab-form-field .sbi-btn{ transform: translate(10px, 0px); } .sb-tab-content .sb-tab-box.sb-caching-box .sbi-tab-form-field .sbi-btn, .sb-tab-content .sb-tab-box.sb-import-box .sbi-tab-form-field .sbi-btn{ transform: translate(0px); } .sb-tab-content .sb-tab-box.sb-license-box .sbi-tab-form-field .sb-form-field{ margin-bottom: 8px; } .license-valid .sbi-btn.loading svg path { fill: #141B38 } .sb-tab-content .sb-tab-box .sbi-tab-form-field .field-left-content { flex-basis: 73%; max-width: 465px; } .sb-tab-content .sb-tab-box.sb-license-box.license-type-free .sbi-tab-form-field .field-left-content { flex-basis: 73%; } .sb-tab-content .sb-tab-box .sbi-tab-form-field .field-right-content { flex-basis: 20%; } .sb-tab-content .sb-tab-box .sbi-tab-form-field .form-info { font-size: 12px; line-height: 22px; color: #27303F; } .sb-tab-content .sb-tab-box .sbi-tab-form-field .form-info .manage-license a{ text-decoration-line: underline; color: #27303F; } .sb-tab-content .sb-tab-box .sbi-tab-form-field .form-info .test-connection { color: #434960; } .sb-tab-content .sb-tab-box .sbi-tab-form-field .form-info .upgrade a { color: #0068A0; font-weight: 600; margin-left: 8px; text-decoration: none; } .sb-tab-content .sb-tab-box.sb-reset-box-style { margin: 0; border-bottom: 1px solid #E8E8EB; } .sb-tooltip-content { position: absolute; background: #fff; border-radius: 2px; padding: 12px 26px 12px 16px; box-shadow: 1px 2px 4px 0px rgb(0 0 0 / 15%), -2px -1px 9px 0px rgb(0 0 0 / 13%); width: 497px; height: auto; max-height: 284px; bottom: 50px; box-sizing: border-box; right: -45px; z-index: 9999; } .sb-tooltip-content p { color: #141B38; font-size: 14px; line-height: 22px; font-weight: normal; } .sb-tooltip-content:after { width: 12px; height: 12px; content: ''; bottom: -7px; right: calc(50% - 6px); position: absolute; background: #fff; transform: rotate(45deg); box-shadow: 2px 2px 2px rgb(0 0 0 / 14%); } .sb-localization-box .sb-tooltip-content:after { right: calc(50% - 55px); } .sb-tooltip-content.sb-tooltip-bottom { bottom: inherit; top: 45px; box-shadow: -1px -2px 4px 0px rgb(0 0 0 / 15%), 2px 1px 9px 0px rgb(0 0 0 / 13%); } .sb-tooltip-content.sb-tooltip-bottom:after { bottom: inherit; top: -6px; box-shadow: -2px -2px 2px rgb(0 0 0 / 14%); } .sb-tab-content .sb-tab-box .sb-tooltip-content p { color: #141B38; } .sb-tab-content .sb-tab-box .sb-tooltip-content p:not(:last-child) { margin-bottom: 12px; } .sb-tab-content .sb-tab-box .sb-tooltip-content p a { color: #141B38; font-weight: 600; } .sb-gdpr-box .sb-gdpr-active { padding-left: 27px; position: relative; max-width: 560px; box-sizing: border-box; } .sb-gdpr-box .gdpr-help-text-yes { max-width: 560px; } .sb-gdpr-box .sb-gdpr-active .gdpr-active-icon { position: absolute; left: 0px; } .sb-gdpr-box .help-text a { font-weight: 400; } .sb-gdpr-box .sb-text-bold { font-weight: 700; cursor: pointer; } .sb-gdpr-box .sb-gdpr-bold { text-decoration: underline; } .sb-gdpr-info-tooltip { position: absolute; font-size: 14px; line-height: 22px; color: #141B38; background: #FFFFFF; border-radius: 2px; padding: 12px 26px 12px 16px; box-shadow: 1px 2px 4px 0px rgb(0 0 0 / 15%), -2px -1px 9px 0px rgb(0 0 0 / 13%); z-index: 99; width: 561px; bottom: -183px; box-sizing: border-box; } .sb-gdpr-info-tooltip:before { width: 0; height: 0; border-left: 8px solid transparent; border-right: 8px solid transparent; border-bottom: 10px solid #fff; content: ''; top: -10px; right: 260px; position: absolute; } .sb-gdpr-info-tooltip .sb-gdpr-info-headline { font-weight: 600; } .sb-gdpr-info-tooltip .sb-gdpr-info-list { margin: 0px; margin-top: 1px; padding-left: 20px; } .sb-gdpr-info-tooltip .sb-gdpr-info-list li { position: relative; margin-bottom: 2px; } .sb-gdpr-info-tooltip .sb-gdpr-info-list li:before { width: 3px; height: 3px; position: absolute; left: -12px; top: 10px; content: ''; background-color: #141B38; border-radius: 10px; } .recheck-license-status svg, .test-connection svg { width: 15px; height: 15px; transform: translate(2px, 3px); } .test-connection i { font-size: 14px; } .recheck-license-status.loading path, .test-connection.loading path { fill: #141B38 } .rrecheck-license-status.success svg, .test-connection.success svg { transform: translate(3px, 6px) } .test-connection i, .recheck-license-status i { font-size: 16px; transform: translate(-2px, 1px); } .recheck-license-status.success path, .test-connection.success path { fill: #59AB46; } .recheck-license-status.success i, .test-connection.success i { color: #59AB46; } .recheck-license-status.error i, .test-connection.error i { color: #D72C2C; } .recheck-license-status { margin-left: 8px; cursor: pointer; } .recheck-license-status i { margin-left: 8px; } .test-connection.error i { color: #D72C2C; } .test-connection a { color: #434960; font-weight: 600; margin-left: 4px; } .test-connection:not(.error):not(.success) { cursor: pointer; } .sbi-btn[disabled="disabled"] { cursor: not-allowed; color: #8C8F9A; background: #F3F4F5; } .sbi-btn[disabled="disabled"]:hover { color: #8C8F9A; } .sbi-btn[disabled="disabled"]:not(.import-btn) .icon path { fill: #8C8F9A; } .import-btn .icon svg:not(.checkmark) path { fill: #141B38; } .import-btn[disabled="disabled"] .icon svg:not(.checkmark) path { fill: #8C8F9A; } .sbi-btn .icon { margin-right: 12px; } .import-btn .icon.loading { transform: translate(-5px, 1px); } .import-btn .icon.success { transform: translate(-4px, 0px); } .import-btn .icon.error { transform: translate(-4px, 0px); } .import-btn .icon.error i { color: #D72C2C; } .import-btn .icon.success svg { stroke: #141B38 } .export-btn { text-decoration: none; } .export-btn:hover { color: inherit; } .sb-tab-box.sb-caching-box .sbi-caching-btn .loading path, .sb-tab-header .optimize-image-btn .loading path, .sb-tab-box.sb-reset-box-style .loading path, .sb-tab-box.sb-dpa-clear-box-style .loading path { fill: rgba(23, 22, 22, .95) } .sb-tab-box.sb-caching-box .sbi-caching-btn .success svg, .sb-tab-header .optimize-image-btn .success svg, .sb-tab-box.sb-reset-box-style .success svg, .sb-tab-box.sb-dpa-clear-box-style .success svg { stroke: rgba(23, 22, 22, .95) } .sb-tab-box.sb-caching-box .sbi-caching-btn .error svg path, .sb-tab-header .optimize-image-btn .error svg path, .sb-tab-box.sb-reset-box-style .error svg path, .sb-tab-box.sb-dpa-clear-box-style .error svg path { fill: #D72C2C; } /* Translation Tab */ .sb-tab-inner-card { margin-top: 30px; } .sbi-table { width: 100%; border: 1px solid #DCDDE1; padding: 0; border-spacing: 0; } .sbi-table thead th, .sbi-table tfoot th { background-color: #F3F4F5; font-size: 14px; line-height: 22px; color: #434960; padding: 10px 20px; font-weight: 400; text-align: left; box-sizing: border-box; border-bottom: 1px solid #DCDDE1; } .sbi-table tfoot th { border: 0; border-top: 1px solid #DCDDE1; } .sbi-table tbody td { padding: 6px 10px 6px 20px; box-sizing: border-box; } .sbi-table-row-header td { font-weight: 600; font-size: 16px !important; line-height: 26px; color: #141B38; box-sizing: border-box; padding: 10px 20px !important; } .sbi-table tbody td { background: #F3F4F5; font-size: 14px; } .sbi-table tbody:nth-child(2n) td { background-color:#fff; } .sbi-table tbody tr:not(.sbi-table-row-header):not(:last-child) td { border-bottom:1px solid #DCDDE1 } .sbi-table tbody tr:last-child td { padding: 6px 10px 6px 20px; } .sbi-table tbody tr td:first-child, .sbi-table tbody tr td:nth-child(2) { width: 25%; } .sbi-table tbody .sbi-input{ background: #FFFFFF; border: 1px solid #D0D1D7; box-sizing: border-box; border-radius: 1px; width: 100%; height: 38px; color: #2c3338; } .sbi-table tbody .sbi-input::placeholder { color: #8C8F9A; } .sbi-table tbody .sbi-input:focus { border: 1px solid #97989c; outline: none; box-shadow: none; } @media (max-width: 767px) { .sb-tabs-container .sb-tabs .tab { padding: 25px 10px; } .sbi-table th, .sbi-table td { display: block; width: 100%; } .sbi-table tbody tr td:first-child, .sbi-table tbody tr td:nth-child(2) { width: 100%; } .sbi-table tbody .sbi-input { height: 30px; min-height: 30px; font-size: 14px; } } .sb-feed-issue-box #sbi-send-report { width: 127px; min-width: 127px; height: 46px; padding: 6px 15px; } .sb-feed-issue-box #report-emails { width: 407px; height: 45px; padding: 8px 15px; font-size: 16px; line-height: 26px; } .sb-feed-issue-box #report-emails::placeholder { color: #8C8F9A; } .sb-feed-issue-box .feed-issues-fields { margin-bottom: 15px; display: flex; } .sb-feed-issue-box .feed-issues-fields * { margin: 0 10px 0 0; font-size: 16px; } .sb-tab-box.sb-optimize-box .sb-form-field, .sb-tab-box.sb-usage-box .sb-form-field, .sb-tab-box.sb-ajax-box .sb-form-field, .sb-tab-box.sb-show-credit-box .sb-form-field, .sb-tab-box.sb-admin-error-box .sb-form-field, .sb-tab-box.sb-fix-text-box .sb-form-field{ max-width: 695px; } .sb-tab-box.sb-feed-issue-box .sb-form-field .help-text { max-width: 670px; } /*To Be Checked*/ .sb-sources-list{ width: 100%; position: relative; display: grid; grid-template-columns: 48% 48%; grid-column-gap: 2%; } .sbi-fb-srcs-item-ins { display: flex; height: 62px; padding: 0 10px; position: relative; } .sb-srcs-item { box-sizing: border-box; position: relative; cursor: auto; display: block; height: 64px; border: 1px solid #E7E7E9; min-height: 60px; overflow: auto; margin-top: 15px; } .sb-srcs-item.expanded { height: auto; } .sb-source-error-wrap { display: flex; justify-content: center; align-items: center; margin-left: 9px; } .sb-source-error-wrap span { font-weight: 600; font-size: 12px; line-height: 160%; color: #D72C2C; margin-left: 5px; } .sb-source-error-wrap a { margin-left: 8px; font-weight: 600; font-size: 12px; line-height: 160%; text-decoration-line: underline; color: #0068A0; } .sb-srcs-new { display: flex; justify-content: center; align-items: center; font-size: 14px; color: #0068A0; background: #F9F9FA; font-weight: 400; transition: all 0.15s ease-in-out; border: 1px solid #E8E8EB; } .sb-srcs-new:hover { cursor: pointer; background: #E2F5FF; } .sb-srcs-new span.add-new-icon { margin-right: 11px; margin-top: 3px; } .sb-srcs-item-avatar{ display: flex; width: 42px; height: inherit; justify-content: center; align-items: center; margin-right: 10px; } .sb-srcs-item-avatar img{ width: 42px; height: 42px; border-radius: 50%; background: #eee; } .sb-srcs-item-inf{ width: 100%; height: inherit; display: flex; justify-content: center; flex-direction: column; } .sb-srcs-item-name{ font-weight: 600; color: #141B38; font-size: 16px; margin-bottom: 1px; padding-right: 60px; max-height: 32px; line-height: 1.1; padding-bottom: 2px; overflow: hidden; } .sb-account-has-error { border: 1px solid #f3c9c9; background: #fff8f8; } .sb-srcs-item-used{ color: #434960; display: flex; align-items: center; font-weight: 400; font-size: 12px; } .sbi-fb-srcs-info-item:first-of-type { align-items: center; } .sbi-fb-srcs-info-item { display: flex; border-top: 1px solid #E7E7E9; box-sizing: border-box; width: 100%; float: left; padding: 8px 10px; } .sbi-fb-srcs-info-item strong { font-size: 14px; width: 50px; } .sbi-fb-srcs-info-item span { font-size: 13px; line-height: 1.5em; color: #434960; font-weight: 400; display: inline-block; word-break: break-all; width: calc(100% - 80px); padding: 0 15px; box-sizing: border-box; } .sbi-fb-srcs-info-icon { width: 26px; height: 26px; display: flex; justify-content: center; align-items: center; cursor: pointer; margin-left: auto; border: 1px solid #D0D1D7; border-radius: 2px; transition: all 0.15s ease-in-out; } .sbi-fb-srcs-info-icon:hover { background: #F3F4F5; } .sbi-fb-srcs-info-icon:focus, .sbi-fb-srcs-info-icon:active { background: #E8E8EB; } .sbi-fb-srcs-info-icon svg { width: 15px; float: left; } .sb-control-src-expand-chevron { width: 7px; height: 7px; border-left: 2px solid currentColor; border-top: 2px solid currentColor; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sb-srcs-item-actions{ position: absolute; width: 70px; height: 31px; right: 7px; top: 7px; } .sb-srcs-item-actions-btn{ width: 30px; height: 31px; cursor: pointer; float: left; display: flex; justify-content: center; align-items: center; margin-left: 3px; } .sb-srcs-item-actions-btn svg{ float: left; width: 17px; fill: currentColor; } .sb-srcs-item-actions-btn.sb-srcs-item-angle-up svg { height: 10px; } .sb-srcs-item-cog, .sb-srcs-item-angle-up{ color: #434960; transition: all 0.15s ease-in-out; border-radius: 4px; } .sb-srcs-item-cog:hover, .sb-srcs-item-angle-up:hover { background: #F3F4F5; } .sb-srcs-item-cog:focus, .sb-srcs-item-cog:active, .sb-srcs-item-angle-up:focus, .sb-srcs-item-angle-up:active { background: #E8E8EB; } .sb-srcs-item-delete{ color: #D72C2C; transition: all 0.15s ease-in-out; border-radius: 4px; } .sb-srcs-item-delete:hover { background-color: #FCEDED; } .sb-srcs-item-delete:focus, .sb-srcs-item-delete:active { background: #eed4d4; } .sb-srcs-item-delete svg{ width: 13px; } #sbi-settings .sbi-fb-source-step1 .sbi-fb-source-top h3 { margin-bottom: 40px; } .sbi-fb-srcs-personal-btn{ height: 40px; width: 100%; float: left; display: flex; justify-content: center; align-items: center; background: #E2F5FF; cursor: pointer; color: #0068A0; font-weight: 600; } .sbi-fb-srcs-personal-btn svg{ float: left; margin-right: 10px; } /* Sources Instance Popup */ .sbi-fb-popup-feedinst .sbi-fb-source-top{ display: flex; align-items: center; } .sbi-fb-popup-feedinst h5{ margin-bottom: 0px; float: left; font-size: 27px; } .sbi-fb-fdinst-type{ padding: 5px 5px; background: #E8E8EB; margin-left: 12px; float: left; } .sbi-fb-inst-tbl-ctn{ padding: 0 23px 63px; } .sbi-fb-inst-tbl-ctn table{ width: 100%; border-spacing: unset; box-sizing: border-box; border: 1px solid #DCDDE1; text-align: left; } .sbi-fb-inst-tbl-ctn tfoot,.sbi-fb-inst-tbl-ctn thead{ background: #F3F4F5 } .sbi-fb-inst-tbl-ctn .sbi-fd-lst-thtf th, .sbi-fb-inst-tbl-ctn .sbi-fd-lst-thtf td{ font-size: 13px; color: #364152; padding: 13px 10px; } .sbi-fb-inst-tbl-ctn .sbi-fd-lst-tbody tr:nth-child(odd){ background: #fff; } .sbi-fb-inst-tbl-ctn .sbi-fd-lst-tbody tr:nth-child(even){ background: #F3F4F5; } .sbi-fb-inst-tbl-ctn .sbi-fd-lst-thtf tr th, .sbi-fb-inst-tbl-ctn .sbi-fd-lst-thtf tr td{ padding: 4px 20px; } .sbi-fb-inst-tbl-ctn .sbi-fd-lst-tbody tr td{ padding: 11px 20px; } .sbi-fb-inst-tbl-ctn .sbi-fd-lst-name{ font-size: 14px; } .sbi-fb-inst-tbl-shrtc{ display: flex; align-items: center; } .sbi-fd-inst-btn{ width: 10px; height: 10px; box-sizing: border-box; border-right: 3px solid #8C8F9A; border-top: 3px solid #8C8F9A; cursor: pointer; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sbi-fd-lst-actions .sbi-fd-lst-btn, .sbi-fb-inst-tbl-ctn .sbi-fd-lst-btn { box-sizing: border-box; width: 36px; height: 32px; } .sbi-fd-lst-shortcode-cp { margin-left: 10px; } .sbi-fb-tltp-parent { position: relative; } .sbi-fd-lst-btn { width: 21px; height: 21px; display: inline-flex; justify-content: center; align-items: center; margin: 0 4px; cursor: pointer; color: #141B38; border-radius: 2px; border: 1px solid #D8DADD; -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; background: #fff; } .sbi-fb-tltp-elem { position: absolute; color: #fff; background: #434960; font-size: 14px; padding: 7px 10px; border-radius: 3px; font-weight: 500; z-index: 9; text-align: center; opacity: 0; visibility: hidden; top: calc(-100% - 30px); left: 50%; -webkit-transform: translateX(-50%); transform: translateX(-50%); -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .sbi-fb-tltp-elem span { position: relative; z-index: 3; } .sbi-fd-lst-btn svg { fill: currentColor; width: 14px; float: left; } .sbi-fd-lst-btn svg { height: 13px; } .sbi-fd-lst-thtf th{ border-bottom: 1px solid #DCDDE1; } .sbi-fd-lst-thtf td{ border-top: 1px solid #DCDDE1; } .sbi-fb-fdinst-type { padding: 5px 5px; background: #E8E8EB; margin-left: 12px; float: left; } .sbi-fd-lst-name { font-size: 17px; font-weight: 500; color: #0068A0!important; } .sbi-fb-inst-tbl-ctn a, .sbi-fb-inst-tbl-ctn a:focus { text-decoration: none; outline: none; } .sbi-fd-lst-actions .sbi-fd-lst-btn, .sbi-fb-inst-tbl-ctn .sbi-fd-lst-btn { box-sizing: border-box; width: 36px; height: 32px; background: transparent; } .sbi-fd-lst-btn svg { fill: currentColor; width: 14px; float: left; } .sbi-fb-tltp-parent:hover .sbi-fb-tltp-elem { top: calc(-100% - 20px); opacity: 1; visibility: visible; } .sbi-fb-tltp-elem:after { content: ''; position: absolute; height: 10px; width: 10px; bottom: -5px; left: calc(50% - 5px); background: #434960; transform: rotate( -45deg ); } /*** 6.0 Sticky Widget ***/ .sbi-stck-wdg{ position: fixed; right: 21px; z-index: 9; bottom: 20px; } .sbi-stck-wdg-btn{ width: 52px; height: 52px; background: #fff; border-radius: 50%; cursor: pointer; display: flex; justify-content: center; align-items: center; filter: drop-shadow(0px 9px 13px rgba(0, 0, 0, 0.2)); } .sbi-stck-wdg-btn svg{ width: 25px; fill: #FE544F; height: 33px; float: left; } .sbi-stck-wdg[data-active="true"] .sbi-stck-wdg-btn-cls, .sbi-stck-wdg[data-active="true"] .sbi-stck-wdg-btn-cls svg{ display: block; } .sbi-stck-wdg-btn-cls{ width: inherit; height: inherit; position: relative; color: #364152; box-shadow: 0px 1px 6px rgb(0 0 0 / 5%), 0px 9px 12px rgb(0 0 0 / 5%); border-radius: 70px; } .sbi-stck-wdg-btn-cls svg { width: 14px; height: 14px; position: absolute; top: 50%; right: 0; bottom: 0; left: 50%; margin-top: -7px; margin-left: -7px; } .sbi-stck-pop{ position: absolute; width: 292px; height: auto; background: #fff; border: 1px solid #E2E8F0; box-sizing: border-box; box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.15), 0px 3px 14px rgba(0, 0, 0, 0.12); border-radius: 2px; padding: 20px; right: 0px; bottom: 66px; color: #141B38; padding-bottom: 82px; } .sbi-stck-wdg[data-active="true"] .sbi-stck-pop{ bottom: 66px; opacity: 1; visibility: visible; } .sbi-stck-pop svg{ fill: currentColor; } .sbi-stck-el-list{ border: 1px solid #DCDDE1; border-radius: 2px; } .sbi-stck-el{ display: flex; align-items: center; padding: 11px 13px; border-bottom: 1px solid #DCDDE1; transition: background .15s ease-in-out; } .sbi-stck-el:hover{ background: #F3F4F5; } .sbi-stck-el:last-of-type{ border-bottom: 0px; } .sbi-stck-el-list .sbi-chevron svg{ width: 5px; height: 8px; } .sbi-fs-a { width: 100%; height: 100%; display: block; position: absolute; left: 0; top: 0; z-index: 1; } .sbi-stck-el .sbi-stck-el-txt{ color: #27303F; } .sbi-stck-el.sbi-stck-el-upgrd{ padding: 8px 14px; font-size: 14px; background: var(--cl-orange); color: #fff; position: relative; transition: background .15s ease-in-out; } .sbi-chevron { position: absolute; right: 14px } .sbi-stck-el.sbi-stck-el-upgrd .sbi-stck-el-txt{ color: #fff; } .sbi-stck-el.sbi-stck-el-upgrd:after{ top: 20px; opacity: 1; } .sbi-stck-el-icon{ margin-right: 10px; } .sbi-stck-el-icon svg{ width: 17px; float: left; } .sbi-stck-title{ margin-top: 20px; margin-bottom: 10px; color: #141B38; font-weight: 600; font-size: 14px; line-height: 160%; } .sbi-stck-follow{ background: #F3F4F5; margin-top: 20px; left: 0px; bottom: 0px; position: absolute; padding: 12px 20px; display: flex; align-items: center; } .sbi-stck-follow span{ font-weight: 600; font-size: 14px; } .sbi-stck-flw-links{ display: flex; justify-content: center; align-items: center; margin-left: auto; } .sbi-stck-flw-links a{ width: 36px; height: 28px; color: inherit; display: inline-flex; justify-content: center; align-items: center; margin-left: 4px; border-radius: 2px; transition: background .15s ease-in-out; } .sbi-stck-flw-links svg{ width: 17px; color: #141B38; } .sbi-stck-flw-links a:hover{ background: #fff; } .sbi-stck-flw-links a:hover svg{ color: inherit; } .sb-tab-content .sb-tab-box.sb-reset-box-style .sbi-tab-form-field .sbi-btn, .sb-tab-content .sb-tab-box.sb-dpa-clear-box-style .sbi-tab-form-field .sbi-btn { transform: none; margin-bottom: 15px; } /*** 7.0 Responsive ***/ @media (max-width: 1429px) { .caching-form-fields-group { display: inline-block; } .caching-form-fields-group select { margin-bottom: 5px; } } @media (min-width: 1429px) { .caching-form-fields-group { display: flex; } } @media (max-width: 1023px) { .sb-tab-content .sb-tab-box .tab-label { width: 100%; max-width: 100%; padding-right: 0; float: initial; margin-bottom: 20px; } .sb-tab-content .sb-tab-box .sbi-tab-form-field{ width: 100%; float: intial; } } @media (max-width: 1320px) { .sb-feed-issue-box .feed-issues-fields { display: inline-block; } .sb-feed-issue-box .feed-issues-fields * { margin-bottom: 5px; } } @media (max-width: 767px) { .auto-fold #wpcontent { padding-left: 0; } .sbi-fb-full-wrapper { padding: 70px 20px 0 20px; } .sbi-fb-hd-btn { padding: 0px 15px 0px 7px; } .sbi-fb-header { padding: 0px 20px; } .sb-notification-ctn { left: 20px; } .sb-tab-box.sb-export-box .sb-form-field .d-flex{ flex-wrap: wrap; } .sb-form-field .sbi-select { width: 100%; } .sb-tab-content .sb-tab-box .sbi-tab-form-field { flex-wrap: wrap; } .sb-license-box .sbi-tab-form-field .sbi-btn { transform: translate(0px, 0px) !important; margin-top: 10px; } .sb-tab-content .sb-tab-box .sbi-tab-form-field .field-left-content { flex-basis: 100%; } .sb-export-box .sbi-tab-form-field .sbi-btn { transform: translate(0px, 0px) !important; margin-top: 10px; } .sb-feed-issue-box .feed-issues-fields { width: 100%; } .sb-feed-issue-box #report-emails { max-width: 100%; } .sbi-table thead th, .sbi-table tfoot th { display: none; } .sbi-table tbody tr:not(.sbi-table-row-header) td:last-child { margin-bottom: 20px; } .sbi-table tbody { background-color: #f3f4f5; } .sbi-table tbody:nth-child(2n) { background-color: #fff; } .sb-tab-content .sb-tab-box .sbi-tab-form-field .d-flex{ flex-wrap: wrap; } .sb-sources-list { grid-template-columns: 100%; } .sb-tabs-container .sb-tabs { flex-direction: column-reverse; flex-wrap: wrap; align-items: flex-end; } .sbi-fb-full-wrapper { padding: 82px 20px 0 20px; } .sb-tabs-container .sb-tabs .left-buttons { width: 100%; display: flex; } .sb-tabs-container .sb-tabs .right-buttons { transform: translateY(-15px); } .sb-tabs-container .sb-tabs .left-buttons .tab { flex-grow: 1; flex-basis: 0; padding: 15px 10px; text-align: center; } .sb-tabs-container { margin-top: -45px; } #wpbody-content { padding-bottom: 50px; } .sb-form-field .sbi-select.size-md { width: 100%; max-width: 100%; } } @media (max-width: 567px) { .sb-tabs-container .sb-tabs .tab:not(:last-child) { margin-right: 10px; } } @media (max-width: 420px) { .sb-tabs-container .sb-tabs .left-buttons .tab { padding: 15px 7px; font-size: 14px; } } .sb-button-standard{ position: relative; font-style: normal; font-weight: 600; font-size: 14px; padding: 10px 20px 10px 39px; line-height: 16px; height: auto; } .sb-button-standard svg { width: 16px; height: 16px; position: absolute; left: 13px; right: auto; top: 10px; bottom: auto; } .sbi-stck-el.sbi-stck-el-upgrd svg path{ fill: #fff!important; } .sb-tab-content .sb-tab-box.sbi-uo-install-notice { background: #FFF7E5; box-shadow: 0px 9px 16px rgba(0, 0, 0, 0.0196802), 0px 3.75998px 6.68442px rgba(0, 0, 0, 0.0282725), 0px 2.01027px 3.57381px rgba(0, 0, 0, 0.035), 0px 1.12694px 2.00345px rgba(0, 0, 0, 0.0417275), 0px 0.598509px 1.06402px rgba(0, 0, 0, 0.0503198), 0px 0.249053px 0.442761px rgba(0, 0, 0, 0.07); border-radius: 8px; padding: 12px 12px 12px 34px; } .sb-tab-content .sbi-uo-install-notice .sbi-tab-notice { display: flex; justify-content: space-between; align-items: center; gap: 20px; } .sb-tab-content .sbi-uo-install-notice .sbi-tab-notice .sbi-notice-left, .sb-tab-content .sbi-uo-install-notice .sbi-tab-notice .sbi-notice-right { display: flex; gap: 20px; align-items: center; } .sb-tab-content .sbi-uo-install-notice .sbi-notice-text p { font-weight: 600; font-size: 16px; line-height: 160%; color: #663D00; } .sb-tab-content .sbi-uo-install-notice .sbi-tab-notice .sbi-notice-right .sbi-notice-learn-more { background: #F9F9FA; border: 1px solid #E6E6EB; box-shadow: 0px 2px 5px rgba(60, 66, 87, 0.05), 0px 1px 1px rgba(0, 0, 0, 0.05), inset 0px -1px 1px rgba(0, 0, 0, 0.12); border-radius: 4px; padding: 7px 11px; transition: all .2s ease-in; } .sb-tab-content .sbi-uo-install-notice .sbi-tab-notice .sbi-notice-right .sbi-notice-learn-more:hover { background-color: #ededed; } .sb-tab-content .sbi-uo-install-notice .sbi-tab-notice .sbi-notice-right .sbi-uo-notice-dismiss { border: none; background-color: transparent; padding: 0px; }PKL\#!׿@@+instagram-feed/admin/assets/css/oembeds.cssnu[/* * oEmbeds CSS TABLE OF CONTENTS * * 1.0 - GLOBAL * 2.0 - HEADER * 3.0 - 3.0 - OEMBEDS CONTAINER * 3.1 - SECTION HEADER * 3.2 - OEMBED ENABLE/DISABLE BOX * 3.3 - OEMBED INFORMATION BOX * 4.0 - MODAL STYLE * 5.0 - STICKY WIDGET * 6.0 - RESPONSIVENESS */ /*** 1.0 - GLOBAL ***/ .clearfix { display: inline-block; } /* start commented backslash hack \*/ * html .clearfix { height: 1%; } .clearfix { display: block; } .checkmark { width: 21px; height: 22px; border-radius: 50%; display: block; stroke-width: 2; stroke: #fff; stroke-miterlimit: 10; stroke-dashoffset: 0; transform: translate(0px, -3px); } #sbi-oembeds { -webkit-font-smoothing: antialiased; font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; } #wpcontent { padding-left: 0px; } #wpbody-content { padding-bottom: 40px; } .clearfix:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; } .sbi-fb-full-wrapper{ padding: 0 53px; padding-top: 82px; } .sbi-fb-fs { width: 100%; position: relative; float: left; box-sizing: border-box; } /*orange*/ .sb-btn-orange{ background: #FE544F!important; color: #fff!important; } .sb-btn-orange:hover{ background: #EC352F!important; color: #fff!important; } .sb-btn-orange:focus, .sb-btn-orange:active{ background: #BC120E!important; color: #fff!important; } /*** 2.0 - HEADER ***/ .sbi-fb-create-ctn{ margin-top: 90px; } .sbi-fb-header{ height: 64px; position: absolute; display: flex; flex-direction: row; justify-content: space-between; align-items: center; background: #fff; padding: 0px 52px; z-index: 2; } .sbi-fb-header-left { display: flex; } .sbi-fb-header-left .sb-social-wall-link-wrap { margin-left: 30px; } .sb-social-wall-link-wrap { display: flex; font-size: 14px; margin: 10px 0; } .sb-social-wall-link { padding: 0 12px; border-right: 1px solid #ccc; color: #0068A0!important; line-height: 1; } .sb-social-wall-link:first-child { padding-left: 0; border-right: 1px solid #ccc; color: #0068A0!important; line-height: 1; } .sb-social-wall-link:last-child { border-right: none; } .sb-social-wall-link a { text-decoration: none; } .sb-social-wall-link a:focus { outline: none; box-shadow: none; } .sbi-fb-hd-logo{ display: flex; vertical-align: middle; align-items: center; gap: 5px; } .sbi-fb-hd-logo .sb-logo-letters-wrap { margin-bottom: 4px; } .sbi-fb-hd-logo .breadcrumb-title{ font-size: 14px; font-weight: 400; line-height: 22px; letter-spacing: 0em; margin-left: 4px; } .sbi-fb-hd-logo .separator{ margin: 0 5px 0 10px; } .sbi-fb-hd-btn{ height: 38px; cursor: pointer; display: flex; flex-direction: row; justify-content: center; align-items: center; padding: 0px 15px 0px 16px; font-weight: 600; font-size:14px; color: #353A41; background: #F3F4F5; border-radius: 2px; border: 1px solid #DCDDE1; position: relative; text-decoration: none; transition: all 0.15s ease-in-out; } .sbi-fb-hd-btn:focus { outline: none; box-shadow: none; } .sbi-fb-hd-btn:hover { color: inherit; background-color: #fff; } .sbi-fb-hd-btn i{ margin: 0px 5px; } .sbi-fb-hd-btn[data-icon="left"]{ padding-right: 20px!important; } .sbi-fb-full-wrapper .section-header h1 { font-size: 32px; line-height: 40px; } /*** 3.0 - OEMBEDS CONTAINER ***/ .sbi-oembeds-container { max-width: 875px; position: relative; margin: auto; margin-top: 33px; box-sizing: border-box; } /*** 3.1 - SECTION HEADER ***/ .sbi-section-header h3 { font-weight: 600; font-size: 32px; line-height: 40px; color: #141B38; margin: 0 0 5px 0; } .sbi-section-header p { font-size: 13px; line-height: 18px; color: #434960; margin: 0; } .sbi-oembed-plugin-box { background: #FFFFFF; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); margin-bottom: 10px; padding: 12px 20px; display: flex; justify-content: space-between; align-items: center; } /*** 3.2 - OEMBED ENABLE/DISABLE BOX ***/ .sbi-oembed-plugin-box-group { margin-top: 35px; } .sbi-oembed-plugin-box .oembed-text{ flex-basis: 645px; } .sbi-oembed-plugin-box .sbi-oembed-btn{ flex-basis: 125px; text-align: right; } .sbi-oembed-btn .sbi-btn { border-radius: 2px; padding: 10px 20px; border: 0px; color: #fff; font-size: 14px; cursor: pointer; transition: all .15s ease-in-out; box-sizing: border-box; text-decoration: none; display: flex; align-items: center; height: 38px; float: right; } .sbi-oembed-btn .sbi-btn span { margin-right: 5px; height: 15px; width: 15px; } .sbi-oembed-btn .sbi-btn svg { width: 100%; height: 100%; } .sbi-oembed-btn button:hover { background-color: #0096CC; border-color: #0096CC; } .sbi-oembed-btn .sbi-btn:focus, .sbi-oembed-btn .sbi-btn:active { outline: none; box-shadow: none; } .sbi-oembed-btn button.disable-oembed { background: #D72C2C; } .sbi-oembed-btn button.disable-oembed:hover { background-color: #DF5757; border-color: #DF5757; } .sbi-oembed-btn button.disable-oembed:focus, .sbi-oembed-btn button.disable-oembed:active { background-color: #841919; border-color: #841919; } .sbi-oembed-btn button.loading svg { height: 14px; transform: translate(0, 2px); } /*** 3.3 - OEMBED INFORMATION BOX ***/ .sbi-oembed-information { background: #FFFFFF; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); margin-bottom: 10px; } .sbi-oembed-information .sb-box-header { padding: 16px 20px; border-bottom: 1px solid #E8E8EB; } .sbi-oembed-information .sb-box-header h3 { margin: 0; font-weight: 600; font-size: 18px; line-height: 140%; color: #141B38; } .sb-two-column-box { display: flex; justify-content: space-around; align-items: center; border-bottom: 1px solid #E8E8EB; } .sb-two-column-box-1 img { max-width: 438px; } .sb-two-column-box-2 img{ margin-top: 20px; max-width: 442px; } .sb-two-column-box .sb-embed-info-text { padding: 0 75px 0 35px; } .sb-two-column-box-2 .sb-embed-info-text { padding: 0 65px 0 30px; } .sb-two-column-box h4, .sb-one-column-box h4 { font-size: 16px; font-weight: 600; line-height: 26px; color: #141B38; } .sb-one-column-box { max-width: 405px; margin: auto; text-align: center; } .sb-one-column-box h4 { padding: 0; margin-top: 30px; margin-bottom: 0px; } .sb-one-column-box p { font-size: 14px; line-height: 22px; } .sb-one-column-box img { margin-top: 15px; margin-bottom: -21px; max-width: 392px; } .sb-two-column-box-1 .sb-left { padding-left: 20px; } .sb-plugin-info-box { padding-top: 20px; } .sb-plugin-info-box .sb-left { padding-left: 35px; } .sb-plugin-info-box .sb-right { padding: 0 60px 0 40px; } .sb-plugin-info-box h4 { font-size: 18px; margin: 0px; } .sb-plugin-info-box p { font-size: 14px; line-height: 22px; color: #434960; margin-top: 10px; } .sb-plugin-info-box img { max-width: 414px; margin-bottom: -5px; } /*** 4.0 - MODAL STYLE ***/ .sbi-oembed-modal { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.4); z-index: 9; } .sbi-modal-content { background-color: #fff; height: 381px; max-width: 572px; padding: 40px 75px 48px; box-sizing: border-box; position: relative; text-align: center; margin: 260px auto 0; } .sbi-modal-content h2 { font-size: 24px; line-height: 29px; text-align: center; letter-spacing: 0; color: #141B38; margin: 0 0 5px 0; } .sbi-modal-content p { font-size: 12px; line-height: 18px; text-align: center; color: #434960; } .sbi-modal-content .cancel-btn{ background: none; border: none; color: #141B38; position: absolute; top: 16px; right: 16px; padding: 0; cursor: pointer; } .sbi-modal-content .modal-icon{ margin-bottom: 45px; } .sbi-modal-content .modal-icon img { max-width: 102px; } .sbi-modal-content .sb-action-buttons{ display: flex; justify-content: center; margin-top: 30px; } .sbi-modal-content .sb-action-buttons button:not(:last-child) { margin-right: 7px; } .sb-action-buttons .sbi-btn { display: flex; align-items: center; vertical-align: middle; justify-content: center; background: #F3F4F5; border: 1px solid #DCDDE1; box-sizing: border-box; border-radius: 2px; padding: 7px 30px; font-weight: 600; font-size: 14px; line-height: 22px; color: #141B38; letter-spacing: 0.2px; cursor: pointer; min-width: 175px; } .sb-action-buttons .sbi-install-btn { background-color: #FE544F; border-color: #FE544F; color: #fff; } .sb-action-buttons .sbi-install-btn:disabled { background: #F3F4F5; border: 1px solid #DCDDE1; color: #141B38; cursor: not-allowed } .sb-action-buttons .sbi-install-btn:not(.success):disabled path { fill: #141B38; } .sb-action-buttons .sbi-install-btn span { margin-right: 10px; } .sb-action-buttons .sbi-install-btn.loading svg { height: 16px; transform: translate(0, 2px); } /*** 5.0 Sticky Widget ***/ .sbi-stck-wdg{ position: fixed; right: 21px; z-index: 9; bottom: 20px; } .sbi-stck-wdg-btn{ width: 52px; height: 52px; background: #fff; border-radius: 50%; cursor: pointer; display: flex; justify-content: center; align-items: center; filter: drop-shadow(0px 9px 13px rgba(0, 0, 0, 0.2)); } .sbi-stck-wdg-btn svg{ width: 25px; fill: #FE544F; height: 33px; } .sbi-stck-wdg[data-active="true"] .sbi-stck-wdg-btn-cls, .sbi-stck-wdg[data-active="true"] .sbi-stck-wdg-btn-cls svg{ display: block; } .sbi-stck-wdg-btn-cls{ width: inherit; height: inherit; position: relative; color: #364152; box-shadow: 0px 1px 6px rgb(0 0 0 / 5%), 0px 9px 12px rgb(0 0 0 / 5%); border-radius: 70px; } .sbi-stck-wdg-btn-cls svg { width: 14px; height: 14px; position: absolute; top: 50%; right: 0; bottom: 0; left: 50%; margin-top: -7px; margin-left: -7px; } .sbi-stck-pop{ position: absolute; width: 292px; height: auto; background: #fff; border: 1px solid #E2E8F0; box-sizing: border-box; box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.15), 0px 3px 14px rgba(0, 0, 0, 0.12); border-radius: 2px; padding: 20px; right: 0px; bottom: 66px; color: #141B38; padding-bottom: 82px; } .sbi-stck-wdg[data-active="true"] .sbi-stck-pop{ bottom: 66px; opacity: 1; visibility: visible; } .sbi-stck-pop svg{ fill: currentColor; } .sbi-stck-el-list{ border: 1px solid #DCDDE1; border-radius: 2px; } .sbi-stck-el{ display: flex; align-items: center; padding: 11px 13px; border-bottom: 1px solid #DCDDE1; transition: background .15s ease-in-out; font-size: 12px; } .sbi-stck-el:hover{ background: #F3F4F5; } .sbi-stck-el:last-of-type{ border-bottom: 0px; } .sbi-stck-el-list .sbi-chevron svg{ width: 5px; height: 8px; } .sbi-fs-a { width: 100%; height: 100%; display: block; position: absolute; left: 0; top: 0; z-index: 1; } .sbi-stck-el .sbi-stck-el-txt{ color: #27303F; } .sbi-stck-el.sbi-stck-el-upgrd{ padding: 9px 14px; font-size: 14px; background: var(--cl-orange); color: #fff; position: relative; transition: background .15s ease-in-out; font-weight: 600; } .sbi-chevron { position: absolute; right: 14px } .sbi-stck-el.sbi-stck-el-upgrd .sbi-stck-el-txt{ color: #fff; } .sbi-stck-el.sbi-stck-el-upgrd:after{ top: 20px; opacity: 1; } .sbi-stck-el-icon{ margin-right: 10px; } .sbi-stck-el-icon svg{ width: 17px; float: left; } .sbi-stck-title{ margin-top: 20px; margin-bottom: 10px; color: #141B38; font-weight: 600; font-size: 14px; line-height: 160%; } .sbi-stck-follow{ background: #F3F4F5; margin-top: 20px; left: 0px; bottom: 0px; position: absolute; padding: 12px 20px; display: flex; align-items: center; } .sbi-stck-follow span{ font-weight: 600; font-size: 14px; } .sbi-stck-flw-links{ display: flex; justify-content: center; align-items: center; margin-left: auto; } .sbi-stck-flw-links a{ width: 36px; height: 28px; color: inherit; display: inline-flex; justify-content: center; align-items: center; margin-left: 4px; border-radius: 2px; transition: background .15s ease-in-out; } .sbi-stck-flw-links svg{ width: 17px; color: #141B38; } .sbi-stck-flw-links a:hover{ background: #fff; } .sbi-stck-flw-links a:hover svg{ color: inherit; } /*** 6.0 - RESPONSIVENESS ***/ @media (max-width: 1170px) { .sbi-oembed-plugin-box .oembed-text { flex-basis: 78%; } } @media (max-width: 1024px) { .sbi-oembed-plugin-box .oembed-text { flex-basis: 72%; } .sb-two-column-box { flex-direction: column; } .sb-two-column-box-1 { flex-direction: column-reverse; } .sb-two-column-box .sb-embed-info-text{ padding: 0 35px; text-align: center; } .sb-two-column-box-2 img { margin-top: 0px; } .sb-two-column-box .sb-left, .sb-two-column-box .sb-right { max-width: 405px; margin: auto; } .sb-two-column-box.sb-plugin-info-box .sb-embed-info-text { margin-top: 25px; } .auto-fold #wpcontent { padding-left: 0px; } } @media (max-width: 767px) { .auto-fold #wpcontent { padding-left: 0; } .sbi-fb-full-wrapper { padding: 70px 20px 0 20px; } .sbi-fb-header { padding: 0px 20px; } .sbi-fb-hd-btn { padding: 0px 15px 0px 7px; } .sbi-about-box .sb-team-info { padding: 30px; } .sbi-oembed-plugin-box { flex-wrap: wrap; } .sbi-oembed-plugin-box .oembed-icon { width: 20px; vertical-align: middle; display: flex; } .sbi-oembed-plugin-box .sbi-oembed-btn { flex-basis: 114px; text-align: left; margin-top: 15px; } .sbi-oembed-plugin-box .oembed-text { flex-basis: calc(100% - 40px); } .sb-plugin-info-box .sb-left, .sb-two-column-box-1 .sb-left, .sb-two-column-box-2 .sb-right, .sb-one-column-box img { display: none; } .sb-one-column-box { padding-bottom: 5px !important; } .sb-one-column-box h4 { margin-top: 21px; } .sb-two-column-box.sb-plugin-info-box .sb-embed-info-text { margin-top: 0; } .sb-plugin-info-box p { margin-bottom: 17px; } .sbi-modal-content { margin: 80px auto 0; width: 90%; height: auto; padding: 40px 30px; } .sbi-modal-content .modal-icon { margin-bottom: 30px; } .sb-plugin-info-box h4 { font-size: 16px; } } @media (max-width: 630px) { .sb-two-column-box img, .sb-one-column-box img { max-width: 100%; } .sbi-modal-content .sb-action-buttons { flex-direction: column; } .sbi-modal-content .sb-action-buttons button:not(:last-child) { margin-right: 0px; margin-bottom: 7px; } } @media (max-width: 530px) { .sb-two-column-box .sb-left, .sb-two-column-box .sb-right, .sb-one-column-box { padding: 0 20px; } .sb-two-column-box h4, .sb-one-column-box h4 { line-height: 22px; } .sb-one-column-box img { margin-bottom: -15px; } } .sbi-btn-blue { background: #0068A0!important; color: #fff!important; } .sb-button-standard{ position: relative; font-style: normal; font-weight: 600; font-size: 14px; padding: 10px 20px 10px 39px; line-height: 16px; height: auto; } .sb-button-standard svg { width: 16px; height: 16px; position: absolute; left: 13px; right: auto; top: 10px; bottom: auto; } .sbi-stck-el.sbi-stck-el-upgrd svg path{ fill: #fff!important; } PKL\ѷjj+instagram-feed/admin/assets/css/support.cssnu[/* * SUPPORT PAGE CSS TABLE OF CONTENTS * * 1.0 - GLOBAL * 2.0 - HEADER * 3.0 - 3.0 - SUPPORT CONTAINER * 3.1 - SECTION HEADER * 3.2 - SUPPORT BLOCK * 3.3 - CONTACT SUPPORT BLOCK * 4.0 - STICKY WIDGET * 5.0 - SB NOTIFICATION ELEMENT * 6.0 - RESPONSIVENESS */ /*** 1.0 - GLOBAL ***/ .clearfix { display: inline-block; } /* start commented backslash hack \*/ * html .clearfix { height: 1%; } .clearfix { display: block; } #sbi-support { -webkit-font-smoothing: antialiased; font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; } #wpcontent { padding-left: 0px; } #wpbody-content { padding-bottom: 40px; } .clearfix:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; } /*orange*/ .sb-btn-orange{ background: #FE544F!important; color: #fff!important; } .sb-btn-orange:hover{ background: #EC352F!important; color: #fff!important; } .sb-btn-orange:focus, .sb-btn-orange:active{ background: #BC120E!important; color: #fff!important; } .sbi-fb-cp-clpboard{ width: 0px; height: 0px; position: absolute; left: -100000px; } .sbi-fb-full-wrapper{ padding: 0 53px; padding-top: 82px; } .sbi-fb-fs { width: 100%; position: relative; float: left; box-sizing: border-box; } #adminmenu a[href="admin.php?page=sbi-support"] { display: none; } .sb-btn-grey:not(:disabled){ background: #F3F4F5!important; color: #141B38!important; border: 1px solid #D0D1D7!important; } .sb-btn-grey:not(:disabled):hover{ background: #fff!important; color: #141B38!important; border: 1px solid #DCDDE1!important; } .sb-btn-grey:not(:disabled):focus, .sb-btn-grey:not(:disabled):active{ background: #E8E8EB!important; color: #141B38!important; border: 1px solid #D0D1D7!important; } /*** 2.0 - HEADER ***/ .sbi-fb-create-ctn{ margin-top: 90px; } .sbi-fb-header{ height: 64px; position: absolute; display: flex; flex-direction: row; justify-content: space-between; align-items: center; background: #fff; padding: 0px 52px; z-index: 2; } .sbi-fb-header-left { display: flex; } .sbi-fb-header-left .sb-social-wall-link-wrap { margin-left: 30px; } .sb-social-wall-link-wrap { display: flex; font-size: 14px; margin: 10px 0 10px 30px; } .sb-social-wall-link:first-child { padding-left: 0; border-right: 1px solid #ccc; color: #0068A0!important; line-height: 1; } .sb-social-wall-link { padding: 0 12px; border-right: 1px solid #ccc; color: #0068A0!important; line-height: 1; } .sb-social-wall-link a { text-decoration: none; } .sb-social-wall-link a:focus { outline: none; box-shadow: none; } .sb-social-wall-link:last-child { border-right: none; } .sbi-fb-hd-logo{ display: flex; vertical-align: middle; align-items: center; gap: 5px; } .sbi-fb-hd-logo .sb-logo-letters-wrap { transform: translate(0px, -2px); } .sbi-fb-hd-logo .breadcrumb-title{ font-size: 14px; font-weight: 400; line-height: 22px; letter-spacing: 0em; margin-left: 4px; } .sbi-fb-hd-logo .separator{ margin: 0 5px 0 10px; } .sbi-fb-hd-btn{ height: 38px; cursor: pointer; display: flex; flex-direction: row; justify-content: center; align-items: center; padding: 0px 15px 0px 16px; font-weight: 600; font-size:14px; color: #353A41; background: #F3F4F5; border-radius: 2px; border: 1px solid #DCDDE1; position: relative; text-decoration: none; transition: all 0.15s ease-in-out; } .sbi-fb-hd-btn:focus { outline: none; box-shadow: none; } .sbi-fb-hd-btn:hover { color: inherit; background-color: #fff; } .sbi-fb-hd-btn i{ margin: 0px 5px; } .sbi-fb-hd-btn[data-icon="left"]{ padding-right: 20px!important; } .sbi-fb-full-wrapper .section-header h1 { font-size: 32px; line-height: 40px; } /*** 3.0 - SUPPORT CONTAINER ***/ .sbi-sb-container { max-width: 885px; position: relative; margin: auto; margin-top: 33px; box-sizing: border-box; } /*** 3.1 - SECTION HEADER ***/ .sbi-section-header { display: flex; justify-content: space-between; align-items: center; } .sbi-section-header h2{ font-weight: 600; font-size: 32px; line-height: 40px; color: #141B38; margin: 0; } .sbi-section-header .sbi-search-doc .sbi-search-doc-field { position: relative; background: #fff; border: 1px solid #DCDDE1; min-width: 283px; box-sizing: border-box; height: 38px; padding: 0px 14px 0px 15px; font-weight: 600; font-size: 14px; line-height: 22px; color: #141B38; text-decoration: none; margin-right: 1px; } .sbi-section-header .sbi-search-doc .sbi-search-doc-field .sb-btn-input { height: 100%; border: none; outline: none; background-color: transparent; margin-left: 25px; color: #141B38; min-width: 200px; transform: translateY(-1px); } .sbi-section-header .sbi-search-doc .sbi-search-doc-field .sb-btn-input::placeholder { color: #141B38; } .sbi-section-header .sbi-search-doc .sbi-search-doc-field:focus, .sbi-section-header .sbi-search-doc .sbi-search-doc-field .sb-btn-input:focus { outline: none; box-shadow: none; } .sbi-section-header .sbi-search-doc .sbi-search-doc-field .sb-btn-icon { position: absolute; left: 15px; top: 11px; cursor: pointer; } .sbi-section-header .sbi-search-doc .sbi-search-doc-field .sb-btn-link-icon{ cursor: pointer; position: absolute; right: 2px; top: 0; width: 35px; text-align: center; height: 100%; padding-top: 9px; box-sizing: border-box; } .sbi-section-header .sbi-search-doc a .sb-btn-link-icon{ margin-left: 56px; } /*** 3.2 - SUPPORT BLOCK ***/ .sbi-support-blocks { margin-top: 22px; display: flex; } .sbi-support-blocks .sbi-support-block { padding: 22px 18px; background: #FFFFFF; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); border-radius: 2px; width: calc(33% - 7px); box-sizing: border-box; position: relative; } .sbi-support-blocks .sbi-support-block:not(:last-child) { margin-right: 14px; } .sbi-support-blocks .sbi-support-block h3 { font-style: normal; font-weight: 600; font-size: 18px; line-height: 25px; color: #141B38; margin-top: 15px; margin-bottom: 0; } .sbi-support-blocks .sbi-support-block p { font-size: 12px; line-height: 18px; color: #64748B; margin-top: 5px; } .sb-block-header img { width: 56px; height: 56px; } .sb-articles-list { margin-top: 31px; margin-bottom: 79px; } .sb-articles-list ul li { position: relative; margin: 0px; padding-right: 10px; } .sb-articles-list ul li:not(:last-child) { border-bottom: 1px solid #E8E8EB; position: relative; } .sb-articles-list ul li a { font-size: 14px; line-height: 22px; color: #141B38; text-decoration: none; display: block; padding: 13px 0; } .sb-articles-list ul li:not(:last-child):after { content: ''; position: absolute; left: 0px; bottom: -1px; background-color: #0068A0; height: 1px; width: 0; transition: all 0.25s ease-in-out; } .sb-articles-list ul li:not(:last-child):hover:after { width: 100%; } .sb-articles-list ul li a:hover { color: #0068A0; } .sb-articles-list ul li .sb-list-icon { position: absolute; right: 0; top: calc(50% - 9px); } .sb-articles-list ul li .sb-list-icon svg { width: 5px; } .sb-articles-list ul li .sb-list-icon svg path { fill: #8C8F9A; } .sbi-support-blocks .sbi-sb-button { margin-top: 50px; position: absolute; left: 0; bottom: 20px; width: calc(100% - 40px); padding: 0 20px; } .sbi-support-blocks .sbi-sb-button .sb-btn-icon { margin-left: 8px; } .sbi-support-blocks .sbi-sb-button .sb-btn-icon svg { width: 5px; transform: translateY(0px); margin-left: 3px; } .sbi-support-blocks .sbi-sb-button a { background: #F3F4F5; border: 1px solid #DCDDE1; box-sizing: border-box; border-radius: 2px; font-weight: 600; font-size: 12px; line-height: 19px; color: #141B38; display: block; text-align: center; text-decoration: none; padding: 6px; transition: all 0.15s ease-in-out; } .sbi-support-blocks .sbi-sb-button a:hover, .sbi-section-header .sbi-search-doc a:hover { background: #FFFFFF; border: 1px solid #D0D1D7; } .sbi-support-blocks .sbi-sb-button a:focus, .sbi-support-blocks .sbi-sb-button a:active, .sbi-section-header .sbi-search-doc a:focus, .sbi-section-header .sbi-search-doc a:active { background: #E8E8EB; border: 1px solid #D0D1D7; } /*** 3.3 - CONTACT SUPPORT BLOCK ***/ .sbi-support-contact-block , .sbi-tempuser-settings-section { background: #FFFFFF; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); border-radius: 2px; padding: 20px 20px 23px; margin-top: 28px; box-sizing: border-box; margin-bottom: 12px; display: flex; } .sbi-support-contact-block .sb-cb-content h3{ font-size: 24px; line-height: 29px; color: #141B38; margin: 0; margin-bottom: 16px; } .sbi-support-contact-block .sb-cb-icon { margin-right: 30px; } .sbi-support-contact-block .sb-cb-icon span{ background: #E8E8EB; border-radius: 60px; width: 68px; height: 68px; display: inline-block; text-align: center; padding-top: 22px; box-sizing: border-box; } .sbi-support-contact-block .sb-cb-btn{ background: #FE544F; border-radius: 2px; color: #fff; text-decoration: none; display: inline-block; padding: 8px 12px; font-size: 14px; } .sbi-support-contact-block .sb-cb-btn:hover { background: #EC352F; border-color: #EC352F; } .sbi-support-contact-block .sb-cb-btn:focus, .sbi-support-contact-block .sb-cb-btn:active { background: #BC120E; border-color: #BC120E; outline: none; box-shadow: none; } .sbi-support-contact-block .sb-cb-btn span { margin-left: 11px; } .sbi-support-contact-block .sb-cb-btn svg { width: 5px; } .sbi-support-contact-block .sb-cb-btn path { fill: #fff; } .sbi-support-contact-block .sb-contact-block-left{ flex-basis: 625px; /* width: 625px; */ /* float: left; */ display: flex; padding-top: 10px; box-sizing: border-box; } .sbi-support-contact-block .sb-contact-block-right { flex-basis: 220px; /* width: 220px; float: left; */ padding-top: 10px; padding-left: 32px; box-sizing: border-box; border-left: 1px solid #DCDDE1; } .sbi-support-contact-block .sb-contact-block-right p { font-size: 12px; line-height: 18px; color: #141B38; } .sbi-support-contact-block .sb-contact-block-right img { max-width: 65px; } /*** 3.4 - SYSTEM INFO BLOCK ***/ .sbi-system-info-section { background: #FFFFFF; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); border-radius: 2px; } .sbi-system-info-section .sbi-system-header{ display: flex; padding: 12px 20px 0; justify-content: space-between; } .sbi-system-info-section .sbi-system-header h3 { font-weight: 600; font-size: 18px; line-height: 25px; color: #141B38; margin-top: 9px; } .sbi-system-info-section .sbi-system-header .sbi-copy-btn { background: #F3F4F5; border: 1px solid #DCDDE1; box-sizing: border-box; border-radius: 2px; font-size: 14px; font-weight: 600; line-height: 22px; color: #141B38; height: 38px; padding: 5px 20px 5px 12px; cursor: pointer; transition: all 0.15s ease-in-out; } .sbi-system-info-section .sbi-system-header .sbi-copy-btn:hover { background: #FFFFFF; border: 1px solid #D0D1D7; } .sbi-system-info-section .sbi-system-header .sbi-copy-btn:focus, .sbi-system-info-section .sbi-system-header .sbi-copy-btn:active { background: #E8E8EB; border: 1px solid #D0D1D7; } .sbi-system-info-section .sbi-system-header .sbi-copy-btn svg { height: 19px; width: 19px; transform: translate(0px, 4px); margin-right: 5px; } .sbi-system-info-section .sbi-system-info { padding: 0 20px 20px; border-bottom: 1px solid #E8E8EB; } .sbi-system-info-section .sbi-system-info .system_info:focus { outline: none; box-shadow: none; } .sbi-system-info-section .sbi-system-info .system_info a { color: #0068A0; } .sbi-system-info-section .sbi-system-info .system_info { box-sizing: border-box; background: #F9F9FA; border: 1px solid #E8E8EB; width: 100%; resize: none; border-radius: 0; padding: 20px 28px; font-size: 12px; line-height: 18px; color: #141B38; height: 123px; font-family: 'Fira Code', monospace; word-break: break-all; } .sbi-system-info-section .sbi-system-info .system_info.expanded { height: 600px; overflow-x: hidden; overflow-y: scroll; } .sbi-system-info-section .sbi-system-info .system_info.collapsed { overflow: hidden; } .sbi-system-info-section .sbi-system-info .sbi-expand-btn { padding: 8px 12px 8px 8px; background: #FFFFFF; border: 1px solid #D0D1D7; border-radius: 2px; font-size: 12px; line-height: 19px; color: #141B38; width: 100%; margin-top: -5px; z-index: 9; position: relative; font-weight: 500; cursor: pointer; transition: all .15s ease-in-out; } .sbi-system-info-section .sbi-system-info .sbi-expand-btn:hover { background: #F3F4F5; border: 1px solid #DCDDE1; } .sbi-system-info-section .sbi-system-info .sbi-expand-btn span { margin-right: 10px; } .sbi-system-info-section .sbi-system-info .sbi-expand-btn:focus, .sbi-system-info-section .sbi-system-info .sbi-expand-btn:active{ background: #E8E8EB!important; color: #141B38!important; border: 1px solid #D0D1D7!important; } .sbi-export-settings-section { background: #FFFFFF; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); border-radius: 2px; padding: 20px; display: flex; justify-content: space-between; } .sbi-export-settings-section .sbi-export-right{ display: flex; } .sbi-export-settings-section .sbi-export-left h3 , .sbi-tempuser-left h3 { font-style: normal; font-weight: 600; font-size: 18px; line-height: 25px; color: #141B38; margin: 0 0 4px 0; } .sbi-export-settings-section .sbi-export-left p { font-size: 12px; line-height: 18px; color: #141B38; margin: 0; } .sbi-export-settings-section .sbi-select{ min-width: 234px; border: 1px solid #D0D1D7; padding: 3px 15px; height: 38px; font-size: 14px; color: #141B38; -webkit-appearance: none; appearance: none; margin-right: 8px; background: #fff url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAYAAAB8ZH1oAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABSSURBVHgBfc4hCkAhDAbgjV3slQcvvHuYDWY1G8zewyIWb6YuCCLqD4Pt5wtD54NBQA2XVKiWcorl/X7s+DkhJYUhPk54IN5plCue0Tb8M8/aNx/uIpRVqbbFAAAAAElFTkSuQmCC') no-repeat right 15px top 55%; } .sbi-export-settings-section .sbi-btn { height: 38px; font-size: 14px; padding: 7px 20px 7px 16px; display: flex; align-items: center; vertical-align: middle; background: #F3F4F5; border: 1px solid #DCDDE1; border-radius: 2px; font-weight: 500; transition: all .15s ease-in-out; cursor: pointer; } .sbi-export-settings-section .sbi-btn:disabled { cursor: not-allowed; color: #8C8F9A; background: #F3F4F5; } .sbi-export-settings-section .sbi-btn:disabled:hover { color: #8C8F9A; } .sbi-export-settings-section .sbi-btn span { margin-right: 11px; transform: translate(0px, 2px); } .sbi-export-settings-section .sbi-btn:disabled span path { fill: #8C8F9A; } .sbi-support-contact-block {} /*** 4.0 Sticky Widget ***/ .sbi-stck-wdg{ position: fixed; right: 21px; z-index: 9; bottom: 20px; } .sbi-stck-wdg-btn{ width: 52px; height: 52px; background: #fff; border-radius: 50%; cursor: pointer; display: flex; justify-content: center; align-items: center; filter: drop-shadow(0px 9px 13px rgba(0, 0, 0, 0.2)); } .sbi-stck-wdg-btn svg{ width: 25px; fill: #FE544F; height: 33px; float: left; } .sbi-stck-wdg[data-active="true"] .sbi-stck-wdg-btn-cls, .sbi-stck-wdg[data-active="true"] .sbi-stck-wdg-btn-cls svg{ display: block; } .sbi-stck-wdg-btn-cls{ width: inherit; height: inherit; position: relative; color: #364152; box-shadow: 0px 1px 6px rgb(0 0 0 / 5%), 0px 9px 12px rgb(0 0 0 / 5%); border-radius: 70px; } .sbi-stck-wdg-btn-cls svg { width: 14px; height: 14px; position: absolute; top: 50%; right: 0; bottom: 0; left: 50%; margin-top: -7px; margin-left: -7px; } .sbi-stck-pop{ position: absolute; width: 292px; height: auto; background: #fff; border: 1px solid #E2E8F0; box-sizing: border-box; box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.15), 0px 3px 14px rgba(0, 0, 0, 0.12); border-radius: 2px; padding: 20px; right: 0px; bottom: 66px; color: #141B38; padding-bottom: 82px; } .sbi-stck-wdg[data-active="true"] .sbi-stck-pop{ bottom: 66px; opacity: 1; visibility: visible; } .sbi-stck-pop svg{ fill: currentColor; } .sbi-stck-el-list{ border: 1px solid #DCDDE1; border-radius: 2px; } .sbi-stck-el{ display: flex; align-items: center; padding: 11px 13px; border-bottom: 1px solid #DCDDE1; transition: background .15s ease-in-out; font-size: 12px; } .sbi-stck-el:hover{ background: #F3F4F5; } .sbi-stck-el:last-of-type{ border-bottom: 0px; } .sbi-stck-el-list .sbi-chevron svg{ width: 5px; height: 8px; } .sbi-fs-a { width: 100%; height: 100%; display: block; position: absolute; left: 0; top: 0; z-index: 1; } .sbi-stck-el .sbi-stck-el-txt{ color: #27303F; } .sbi-stck-el.sbi-stck-el-upgrd{ padding: 9px 14px; font-size: 14px; background: var(--cl-orange); color: #fff; position: relative; transition: background .15s ease-in-out; font-weight: 600; } .sbi-chevron { position: absolute; right: 14px } .sbi-stck-el.sbi-stck-el-upgrd .sbi-stck-el-txt{ color: #fff; } .sbi-stck-el.sbi-stck-el-upgrd:after{ top: 20px; opacity: 1; } .sbi-stck-el-icon{ margin-right: 10px; } .sbi-stck-el-icon svg{ width: 17px; float: left; } .sbi-stck-title{ margin-top: 20px; margin-bottom: 10px; color: #141B38; font-weight: 600; font-size: 14px; line-height: 160%; } .sbi-stck-follow{ background: #F3F4F5; margin-top: 20px; left: 0px; bottom: 0px; position: absolute; padding: 12px 20px; display: flex; align-items: center; } .sbi-stck-follow span{ font-weight: 600; font-size: 14px; } .sbi-stck-flw-links{ display: flex; justify-content: center; align-items: center; margin-left: auto; } .sbi-stck-flw-links a{ width: 36px; height: 28px; color: inherit; display: inline-flex; justify-content: center; align-items: center; margin-left: 4px; border-radius: 2px; transition: background .15s ease-in-out; } .sbi-stck-flw-links svg{ width: 17px; color: #141B38; } .sbi-stck-flw-links a:hover{ background: #fff; } .sbi-stck-flw-links a:hover svg{ color: inherit; } /*** SB NOTIFICATION ELEMENT ***/ .sb-notification-ctn{ position: fixed; bottom: -100px; left: 200px; z-index: 99999; background: #fff; display: flex; justify-content: center; align-items: center; border-left: 3px solid #fff; line-height: 1em; padding: 10px 20px; padding-left: 0px; border-radius: 4px; box-shadow: 0px 26.7377px 77.2886px rgba(0, 0, 0, 0.107828), 0px 14.2952px 41.3222px rgba(0, 0, 0, 0.0894161), 0px 8.01379px 23.1649px rgba(0, 0, 0, 0.075), 0px 4.25607px 12.3027px rgba(0, 0, 0, 0.0605839), 0px 1.77104px 5.11942px rgba(0, 0, 0, 0.0421718); } .sb-notification-ctn[data-active="hidden"]{ -webkit-animation: sbi-notification-hide .5s forwards linear; animation: sbi-notification-hide .5s forwards linear; } .sb-notification-ctn[data-active="shown"]{ -webkit-animation: sbi-notification-show .5s forwards linear; animation: sbi-notification-show .5s forwards linear; } @-webkit-keyframes sbi-notification-show { 0%{bottom: -100px;} 50%{bottom: 70px;} 70%{bottom: 60px;} 85%{bottom: 65px;} 100%{bottom: 50px;}} @keyframes sbi-notification-show { 0%{bottom: -100px;} 50%{bottom: 70px;} 70%{bottom: 60px;} 85%{bottom: 65px;} 100%{bottom: 50px;}} @-webkit-keyframes sbi-notification-hide {0%{bottom: 50px;}55%{bottom: 65px;}70%{bottom: 60px;}85%{bottom: 70px;}100%{bottom: -100px;}} @keyframes sbi-notification-hide {0%{bottom: 50px;}55%{bottom: 65px;}70%{bottom: 60px;}85%{bottom: 70px;}100%{bottom: -100px;}} .sb-notification-ctn[data-type="success"]{ border-color: #59AB46; } .sb-notification-ctn[data-type="error"]{ border-color: #D72C2C; } .sb-notification-ctn[data-type="message"]{ border-color: #141B38; } .sb-notification-icon{ width: 25px; height: 25px; display: flex; justify-content: center; align-items: center; margin-left: 10px; margin-right: 15px; } .sb-notification-icon svg{ width: 22px; height: 22px; float: left; fill: currentColor; } .sb-notification-ctn[data-type="success"] .sb-notification-icon{ color: #59AB46; } .sb-notification-ctn[data-type="error"] .sb-notification-icon{ color: #D72C2C; } .sb-notification-ctn[data-type="message"] .sb-notification-icon{ color: #141B38; } .sb-notification-ctn span{ font-size: 14px; color: #141B38; font-weight:500; } /*** 6.0 - RESPONSIVENESS ***/ @media (max-width: 1024px) { .sbi-support-contact-block { flex-direction: column; } .sbi-support-contact-block .sb-contact-block-left, .sbi-support-contact-block .sb-contact-block-right { flex-basis: auto; } .sbi-support-contact-block .sb-contact-block-right { padding-top: 42px; padding-left: 0; border-left: 0px solid #DCDDE1; position: relative; } .sbi-support-contact-block .sb-contact-block-right:before { top: 25px; left: 0; width: 65px; height: 1px; background: #DCDDE1; position: absolute; content: ''; } } @media (max-width: 767px) { .sbi-support-blocks { flex-direction: column; } .sbi-support-blocks .sbi-support-block { width: 100%; margin-bottom: 12px; } .auto-fold #wpcontent { padding-left: 0; } .sbi-fb-full-wrapper { padding: 70px 20px 0 20px; } .sbi-fb-hd-btn { padding: 0px 15px 0px 7px; } .sbi-fb-header { padding: 0px 20px; } .sbi-section-header, .sbi-export-settings-section { flex-wrap: wrap; } .sbi-section-header h2 { margin-bottom: 30px; } .sbi-section-header .sbi-search-doc { width: 100%; } .sbi-export-settings-section .sbi-export-left, .sbi-export-settings-section .sbi-export-right{ width: 100%; } .sbi-export-settings-section .sbi-export-left { margin-bottom: 20px; } .sbi-export-settings-section .sbi-export-right { flex-wrap: wrap; } .sbi-export-settings-section .sbi-select { width: 100%; margin-bottom: 10px; } .sb-notification-ctn { left: 20px; } } @media (max-width: 580px) { .sbi-support-contact-block .sb-contact-block-left { flex-wrap: wrap; } .sbi-support-contact-block .sb-contact-block-left .sb-cb-content { margin-top: 20px; } } @media (max-width: 480px) { .sbi-fb-hd-btn { padding: 0px 10px 0px 7px !important; } .sbi-fb-hd-btn[data-icon="left"] { padding-right: 10px!important; } } .sb-button-standard{ position: relative; font-style: normal; font-weight: 600; font-size: 14px; padding: 10px 20px 10px 39px; line-height: 16px; height: auto; } .sb-button-standard svg { width: 16px; height: 16px; position: absolute; left: 13px; right: auto; top: 10px; bottom: auto; } .sbi-stck-el.sbi-stck-el-upgrd svg path{ fill: #fff!important; } .sbi-tempuser-settings-section { display: grid; grid-template-columns: 55% 45%; } .sbi-tempuser-settings-section:before, .sbi-tempuser-settings-section:after{ display: none!important; } .sbi-templogin-settings-section { display: block; } .sbi-tempuser-left { display: grid; grid-template-columns: 85%; } .sbi-tempuser-settings-section:not(.sbi-templogin-settings-section) .sb-btn { padding: 12px 16px; padding-top: 10px; } .sbi-tempuser-right { display: flex; justify-content: flex-end; align-items: center; column-gap: 10px; } .sbi-tempuser-list { width: 100%; border-collapse: collapse; } .sbi-tempuser-list tr:first-of-type { border-bottom: 1px solid #E6E6EB; background: linear-gradient(0deg, #F9F9FA, #F9F9FA), linear-gradient(0deg, #E6E6EB, #E6E6EB); color: #696D80; } .sbi-tempuser-list tr { text-align: left; } .sbi-tempuser-list tr th { padding: 5px 10px; border-bottom: 1px solid #E6E6EB; } .sbi-tempuser-list tr td { padding: 15px 10px; } .sb-tempuser-btns { display: flex; justify-content: flex-end; column-gap: 10px; } .sbi-tempuser-list .sb-tempuser-link { font-size: 11px; max-width: 396px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block; } .sbi-tempuser-list .sb-tempuser-expires { color: green; font-weight: 600; } .sbi-fb-tempuser-icon-ctn { display: flex; align-items: center; justify-content: center; padding: 60px 40px; background: #BFE8FF; } .sbi-fb-tempuser-icon { display: flex; width: 80px; height: 80px; background-color: #fff; align-items: center; justify-content: center; box-shadow: 0px 4px 5px 0px #0000000D, 0px 1px 2px 0px #0000000D; border-radius: 50px; } .sbi-fb-tempuser-icon svg { float: left; } .sbi-fb-tempuser-content-item { padding: 20px 25px; display: flex; align-items: flex-start; column-gap: 10px; } .sbi-fb-tempuser-item-num { width: 28px; height: 28px; font-weight: 600; color: #141B38; background: #F3F4F5; border-radius: 24px; display: flex; justify-content: center; align-items: center; flex-grow: 0; flex-shrink: 0; } .sbi-fb-tempuser-item-text strong { margin-top: 2px; } .sbi-fb-tempuser-item-text p { margin: 0.1em 0; } .sbi-fb-tempuser-footer-btn { display: flex; justify-content: flex-end; padding: 25px; border-top: 1px solid #eee; } .sbi-fb-source-popup.sbi-fb-tempuser-popup h3 { font-size: 21px; margin: 10px; } .sbi-fb-tempuser-footer-btn .sb-btn { padding: 10px 16px; }PKL\H,2,27instagram-feed/admin/assets/css/admin-notifications.cssnu[#sbi-notifications { position: relative; background: #FFFFFF 0 0 no-repeat padding-box; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); border-radius: 2px; opacity: 1; min-height: 48px; padding: 20px 120px 20px 82px; margin: 0 0 14px 0; } #sbi-notifications * { box-sizing: border-box; } #sbi-notifications .bell, #sbi-notifications .thumb{ position: absolute; top: 20px; left: 24px; width: 34px; height: 44px; } #sbi-notifications .thumb img { max-width: 100%; } #sbi-notifications .thumb .img-overlay { top: 42px; left: -6px; width: 54px; position: absolute; background: #ca4a1f; color: #fff; padding: 2px 4px; border-radius: 3px; line-height: 1; font-size: 11px; font-weight: bold; text-align: center; } #sbi-notifications .messages .message { display: none; } #sbi-notifications .messages .message.current { display: block; } #sbi-notifications .messages .message .title { font-weight: 600; font-size: 18px; line-height: 25px; margin: 0; color: #141B38; letter-spacing: 0; } #sbi-notifications .messages .message .content { font-weight: normal; font-size: 14px; line-height: 22px; margin: 6px 0 32px 0; color: #434960; } #sbi-notifications .messages .message .buttons { margin: -15px 105px 3px 0; display: flex; } .sbi-btn { transition: all 0.15s ease-in-out; letter-spacing: 0.2px; } /*orange*/ .sbi-btn-orange{ background: #FE544F!important; color: #fff!important; } .sbi-btn-orange:hover{ background: #EC352F!important; color: #fff!important; } .sbi-btn-orange:focus, .sbi-btn-orange:active{ background: #BC120E!important; color: #fff!important; } /* green */ .sbi-btn-green{ background: #1da867!important; color: #fff!important; } .sbi-btn-green:hover{ background: #20c276!important; color: #fff!important; } .sbi-btn-green:focus, .sbi-btn-green:active{ background: #0ea15c!important; color: #fff!important; } /*grey*/ .sbi-btn-grey{ background: #F3F4F5!important; color: #141B38!important; border: 1px solid #D0D1D7!important; } .sbi-btn-grey:hover{ background: #fff!important; color: #141B38!important; border: 1px solid #DCDDE1!important; } .sbi-btn-grey:focus, .sbi-btn-grey:active{ background: #E8E8EB!important; color: #141B38!important; border: 1px solid #D0D1D7!important; } #sbi-notifications .messages .message .buttons a { font-weight: 600; padding: 6px 12px; border-radius: 2px; box-sizing: border-box; height: 32px; text-decoration: none; font-size: 12px; } #sbi-notifications .messages .message .buttons a.sbi-btn-orange { border: 1px solid #FE544F } #sbi-notifications .messages .message .buttons a:not(:last-child) { margin-right: 8px; } #sbi-notifications .messages .message .buttons a:focus, #sbi-notifications .messages .message .buttons a:active { outline: none; box-shadow: none; } #sbi-notifications .dismiss { position: absolute; top: 14px; right: 14px; width: 16px; height: 16px; color: #72777C; font-size: 16px; cursor: pointer; text-align: center; vertical-align: middle; line-height: 16px; } #sbi-notifications .dismiss svg { width: 15px; height: 15px; } #sbi-notifications .dismiss svg path { fill: #8C8F9A; } #sbi-notifications .navigation { position: absolute; bottom: 24px; right: 21px; width: 72px; height: 30px; } #sbi-notifications .navigation a { width: 32px; height: 32px; border: 1px solid #DCDDE1; border-radius: 2px; font-size: 8px; text-align: center; vertical-align: middle; line-height: 30px; cursor: pointer; background: #F3F4F5; color: #141B38; display: flex; align-items: center; justify-content: center; transition: all 0.15s ease-in-out; } #sbi-notifications .navigation svg { width: 9px; height: 9px; } #sbi-notifications .navigation a:not(.disabled):hover { background-color: #fff; } #sbi-notifications .navigation a:not(.disabled):focus, #sbi-notifications .navigation a:not(.disabled):active { background: #E8E8EB; color: #141B38; } #sbi-notifications .navigation .prev { float: left; } #sbi-notifications .navigation .next { float: right; } #sbi-notifications .navigation .disabled { background: #E8E8EB; color: #8C8F9A; cursor: default; } @media screen and (max-width: 768px) { #sbi-notifications { padding: 15px 15px 15px 72px; } #sbi-notifications .messages .message .title { margin: 0 30px 0 0; } #sbi-notifications .messages .message .content { font-size: 16px; line-height: 24px; } #sbi-notifications .messages .message .buttons { margin: -30px 80px 0 0; } #sbi-notifications .messages .message .buttons a { margin: 0; display: table; } #sbi-notifications .messages .message .buttons .button-secondary { margin-top: 6px; } } /*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2Nzcy9hZG1pbi1ub3RpZmljYXRpb25zLmNzcyIsInNvdXJjZXMiOlsiYXNzZXRzL3Njc3MvYWRtaW4tbm90aWZpY2F0aW9ucy5zY3NzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEFkbWluIG5vdGlmaWNhdGlvbiBzdHlsZXMuXG5cbiN3cGZvcm1zLW5vdGlmaWNhdGlvbnMge1xuXG5cdHBvc2l0aW9uOiByZWxhdGl2ZTtcblx0YmFja2dyb3VuZDogI0ZGRkZGRiAwIDAgbm8tcmVwZWF0IHBhZGRpbmctYm94O1xuXHRib3gtc2hhZG93OiAwcHggNXB4IDE1cHggIzAwMDAwMDBEO1xuXHRib3JkZXItcmFkaXVzOiA2cHg7XG5cdG9wYWNpdHk6IDE7XG5cdG1pbi1oZWlnaHQ6IDQ4cHg7XG5cdHBhZGRpbmc6IDE1cHggMTAycHggMTVweCA3MnB4O1xuXHRtYXJnaW46IDAgMCAxNHB4IDA7XG5cblx0KiB7XG5cdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcblx0fVxuXG5cdC5iZWxsIHtcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0dG9wOiAxNXB4O1xuXHRcdGxlZnQ6IDE1cHg7XG5cdFx0d2lkdGg6IDQycHg7XG5cdFx0aGVpZ2h0OiA0OHB4O1xuXHR9XG5cblx0Lm1lc3NhZ2VzIHtcblx0XHQubWVzc2FnZSB7XG5cdFx0XHRkaXNwbGF5OiBub25lO1xuXG5cdFx0XHQmLmN1cnJlbnQge1xuXHRcdFx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRcdH1cblxuXHRcdFx0LnRpdGxlIHtcblx0XHRcdFx0Zm9udC13ZWlnaHQ6IGJvbGQ7XG5cdFx0XHRcdGZvbnQtc2l6ZTogMTdweDtcblx0XHRcdFx0bGluZS1oZWlnaHQ6IDIwcHg7XG5cdFx0XHRcdG1hcmdpbjogMDtcblx0XHRcdFx0Y29sb3I6ICM0NDQ7XG5cdFx0XHR9XG5cblx0XHRcdC5jb250ZW50IHtcblx0XHRcdFx0Zm9udC13ZWlnaHQ6IG5vcm1hbDtcblx0XHRcdFx0Zm9udC1zaXplOiAxM3B4O1xuXHRcdFx0XHRsaW5lLWhlaWdodDogMjBweDtcblx0XHRcdFx0bWFyZ2luOiA2cHggMCA0MHB4IDA7XG5cdFx0XHR9XG5cblx0XHRcdC5idXR0b25zIHtcblx0XHRcdFx0bWFyZ2luOiAtMzBweCA4MHB4IDAgMDtcblxuXHRcdFx0XHRhIHtcblx0XHRcdFx0XHRtYXJnaW46IDAgNnB4IDAgMDtcblx0XHRcdFx0XHRwYWRkaW5nOiA4cHggMTBweDtcblx0XHRcdFx0XHRsaW5lLWhlaWdodDogMTNweDtcblx0XHRcdFx0XHRmb250LXNpemU6IDEzcHg7XG5cdFx0XHRcdFx0bWluLWhlaWdodDogdW5zZXQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuYnV0dG9uLXNlY29uZGFyeSB7XG5cdFx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgIzAwNzFBMTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC5kaXNtaXNzIHtcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0dG9wOiAxNXB4O1xuXHRcdHJpZ2h0OiAxNXB4O1xuXHRcdHdpZHRoOiAxNnB4O1xuXHRcdGhlaWdodDogMTZweDtcblx0XHRjb2xvcjogIzcyNzc3Qztcblx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0Y3Vyc29yOiBwb2ludGVyO1xuXHRcdHRleHQtYWxpZ246IGNlbnRlcjtcblx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRcdGxpbmUtaGVpZ2h0OiAxNnB4O1xuXG5cdFx0Jjpob3ZlciB7XG5cdFx0XHRjb2xvcjogI2RjMzIzMjtcblx0XHR9XG5cdH1cblxuXHQubmF2aWdhdGlvbiB7XG5cdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdGJvdHRvbTogMTVweDtcblx0XHRyaWdodDogMTVweDtcblx0XHR3aWR0aDogNjNweDtcblx0XHRoZWlnaHQ6IDMwcHg7XG5cblx0XHRhIHtcblx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0d2lkdGg6IDMwcHg7XG5cdFx0XHRoZWlnaHQ6IDMwcHg7XG5cdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjN0U4OTkzO1xuXHRcdFx0Ym9yZGVyLXJhZGl1czogM3B4O1xuXHRcdFx0Zm9udC1zaXplOiA4cHg7XG5cdFx0XHR0ZXh0LWFsaWduOiBjZW50ZXI7XG5cdFx0XHR2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXHRcdFx0bGluZS1oZWlnaHQ6IDMwcHg7XG5cdFx0XHRjdXJzb3I6IHBvaW50ZXI7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xuXHRcdFx0Y29sb3I6ICM0MTQ1NEE7XG5cblx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC5wcmV2IHtcblx0XHRcdGZsb2F0OiBsZWZ0O1xuXHRcdH1cblxuXHRcdC5uZXh0IHtcblx0XHRcdGZsb2F0OiByaWdodDtcblx0XHR9XG5cblx0XHQuZGlzYWJsZWQge1xuXHRcdFx0Ym9yZGVyLWNvbG9yOiAjZGRkZGRkO1xuXHRcdFx0Y29sb3I6ICNBMEE1QUE7XG5cdFx0XHRjdXJzb3I6IGRlZmF1bHQ7XG5cblx0XHRcdCY6aG92ZXIge1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjhweCkge1xuXG5cdCN3cGZvcm1zLW5vdGlmaWNhdGlvbnMge1xuXHRcdHBhZGRpbmc6IDE1cHggMTVweCAxNXB4IDcycHg7XG5cblx0XHQubWVzc2FnZXMge1xuXG5cdFx0XHQubWVzc2FnZSB7XG5cblx0XHRcdFx0LnRpdGxlIHtcblx0XHRcdFx0XHRtYXJnaW46IDAgMzBweCAwIDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuY29udGVudCB7XG5cdFx0XHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdFx0XHRcdGxpbmUtaGVpZ2h0OiAyNHB4XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQuYnV0dG9ucyB7XG5cdFx0XHRcdFx0bWFyZ2luOiAtMzBweCA4MHB4IDAgMDtcblxuXHRcdFx0XHRcdGEge1xuXHRcdFx0XHRcdFx0bWFyZ2luOiAwO1xuXHRcdFx0XHRcdFx0ZGlzcGxheTogdGFibGU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LmJ1dHRvbi1zZWNvbmRhcnkge1xuXHRcdFx0XHRcdFx0bWFyZ2luLXRvcDogNnB4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxBQUFBLHNCQUFzQixDQUFDO0VBRXRCLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLFVBQVUsRUFBRSxpQ0FBaUM7RUFDN0MsVUFBVSxFQUFFLHNCQUFzQjtFQUNsQyxhQUFhLEVBQUUsR0FBRztFQUNsQixPQUFPLEVBQUUsQ0FBQztFQUNWLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLE9BQU8sRUFBRSxvQkFBb0I7RUFDN0IsTUFBTSxFQUFFLFVBQVU7Q0FxSGxCOztBQTlIRCxBQVdDLHNCQVhxQixDQVdyQixDQUFDLENBQUM7RUFDRCxVQUFVLEVBQUUsVUFBVTtDQUN0Qjs7QUFiRixBQWVDLHNCQWZxQixDQWVyQixLQUFLLENBQUM7RUFDTCxRQUFRLEVBQUUsUUFBUTtFQUNsQixHQUFHLEVBQUUsSUFBSTtFQUNULElBQUksRUFBRSxJQUFJO0VBQ1YsS0FBSyxFQUFFLElBQUk7RUFDWCxNQUFNLEVBQUUsSUFBSTtDQUNaOztBQXJCRixBQXdCRSxzQkF4Qm9CLENBdUJyQixTQUFTLENBQ1IsUUFBUSxDQUFDO0VBQ1IsT0FBTyxFQUFFLElBQUk7Q0FvQ2I7O0FBN0RILEFBMkJHLHNCQTNCbUIsQ0F1QnJCLFNBQVMsQ0FDUixRQUFRLEFBR04sUUFBUSxDQUFDO0VBQ1QsT0FBTyxFQUFFLEtBQUs7Q0FDZDs7QUE3QkosQUErQkcsc0JBL0JtQixDQXVCckIsU0FBUyxDQUNSLFFBQVEsQ0FPUCxNQUFNLENBQUM7RUFDTixXQUFXLEVBQUUsSUFBSTtFQUNqQixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLE1BQU0sRUFBRSxDQUFDO0VBQ1QsS0FBSyxFQUFFLElBQUk7Q0FDWDs7QUFyQ0osQUF1Q0csc0JBdkNtQixDQXVCckIsU0FBUyxDQUNSLFFBQVEsQ0FlUCxRQUFRLENBQUM7RUFDUixXQUFXLEVBQUUsTUFBTTtFQUNuQixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLE1BQU0sRUFBRSxZQUFZO0NBQ3BCOztBQTVDSixBQThDRyxzQkE5Q21CLENBdUJyQixTQUFTLENBQ1IsUUFBUSxDQXNCUCxRQUFRLENBQUM7RUFDUixNQUFNLEVBQUUsY0FBYztDQWF0Qjs7QUE1REosQUFpREksc0JBakRrQixDQXVCckIsU0FBUyxDQUNSLFFBQVEsQ0FzQlAsUUFBUSxDQUdQLENBQUMsQ0FBQztFQUNELE1BQU0sRUFBRSxTQUFTO0VBQ2pCLE9BQU8sRUFBRSxRQUFRO0VBQ2pCLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsVUFBVSxFQUFFLEtBQUs7Q0FDakI7O0FBdkRMLEFBeURJLHNCQXpEa0IsQ0F1QnJCLFNBQVMsQ0FDUixRQUFRLENBc0JQLFFBQVEsQ0FXUCxpQkFBaUIsQ0FBQztFQUNqQixNQUFNLEVBQUUsaUJBQWlCO0NBQ3pCOztBQTNETCxBQWdFQyxzQkFoRXFCLENBZ0VyQixRQUFRLENBQUM7RUFDUixRQUFRLEVBQUUsUUFBUTtFQUNsQixHQUFHLEVBQUUsSUFBSTtFQUNULEtBQUssRUFBRSxJQUFJO0VBQ1gsS0FBSyxFQUFFLElBQUk7RUFDWCxNQUFNLEVBQUUsSUFBSTtFQUNaLEtBQUssRUFBRSxPQUFPO0VBQ2QsU0FBUyxFQUFFLElBQUk7RUFDZixNQUFNLEVBQUUsT0FBTztFQUNmLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLGNBQWMsRUFBRSxNQUFNO0VBQ3RCLFdBQVcsRUFBRSxJQUFJO0NBS2pCOztBQWhGRixBQTZFRSxzQkE3RW9CLENBZ0VyQixRQUFRLEFBYU4sTUFBTSxDQUFDO0VBQ1AsS0FBSyxFQUFFLE9BQU87Q0FDZDs7QUEvRUgsQUFrRkMsc0JBbEZxQixDQWtGckIsV0FBVyxDQUFDO0VBQ1gsUUFBUSxFQUFFLFFBQVE7RUFDbEIsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsSUFBSTtFQUNYLEtBQUssRUFBRSxJQUFJO0VBQ1gsTUFBTSxFQUFFLElBQUk7Q0FzQ1o7O0FBN0hGLEFBeUZFLHNCQXpGb0IsQ0FrRnJCLFdBQVcsQ0FPVixDQUFDLENBQUM7RUFDRCxPQUFPLEVBQUUsS0FBSztFQUNkLEtBQUssRUFBRSxJQUFJO0VBQ1gsTUFBTSxFQUFFLElBQUk7RUFDWixNQUFNLEVBQUUsaUJBQWlCO0VBQ3pCLGFBQWEsRUFBRSxHQUFHO0VBQ2xCLFNBQVMsRUFBRSxHQUFHO0VBQ2QsVUFBVSxFQUFFLE1BQU07RUFDbEIsY0FBYyxFQUFFLE1BQU07RUFDdEIsV0FBVyxFQUFFLElBQUk7RUFDakIsTUFBTSxFQUFFLE9BQU87RUFDZixnQkFBZ0IsRUFBRSxPQUFPO0VBQ3pCLEtBQUssRUFBRSxPQUFPO0NBS2Q7O0FBMUdILEFBdUdHLHNCQXZHbUIsQ0FrRnJCLFdBQVcsQ0FPVixDQUFDLEFBY0MsTUFBTSxDQUFDO0VBQ1AsZ0JBQWdCLEVBQUUsT0FBTztDQUN6Qjs7QUF6R0osQUE0R0Usc0JBNUdvQixDQWtGckIsV0FBVyxDQTBCVixLQUFLLENBQUM7RUFDTCxLQUFLLEVBQUUsSUFBSTtDQUNYOztBQTlHSCxBQWdIRSxzQkFoSG9CLENBa0ZyQixXQUFXLENBOEJWLEtBQUssQ0FBQztFQUNMLEtBQUssRUFBRSxLQUFLO0NBQ1o7O0FBbEhILEFBb0hFLHNCQXBIb0IsQ0FrRnJCLFdBQVcsQ0FrQ1YsU0FBUyxDQUFDO0VBQ1QsWUFBWSxFQUFFLE9BQU87RUFDckIsS0FBSyxFQUFFLE9BQU87RUFDZCxNQUFNLEVBQUUsT0FBTztDQUtmOztBQTVISCxBQXlIRyxzQkF6SG1CLENBa0ZyQixXQUFXLENBa0NWLFNBQVMsQUFLUCxNQUFNLENBQUM7RUFDUCxnQkFBZ0IsRUFBRSxPQUFPO0NBQ3pCOztBQUtKLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7RUFFbEMsQUFBQSxzQkFBc0IsQ0FBQztJQUN0QixPQUFPLEVBQUUsbUJBQW1CO0dBNkI1QjtFQTlCRCxBQU9HLHNCQVBtQixDQUdyQixTQUFTLENBRVIsUUFBUSxDQUVQLE1BQU0sQ0FBQztJQUNOLE1BQU0sRUFBRSxVQUFVO0dBQ2xCO0VBVEosQUFXRyxzQkFYbUIsQ0FHckIsU0FBUyxDQUVSLFFBQVEsQ0FNUCxRQUFRLENBQUM7SUFDUixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUNkO0dBQUM7RUFkSixBQWdCRyxzQkFoQm1CLENBR3JCLFNBQVMsQ0FFUixRQUFRLENBV1AsUUFBUSxDQUFDO0lBQ1IsTUFBTSxFQUFFLGNBQWM7R0FVdEI7RUEzQkosQUFtQkksc0JBbkJrQixDQUdyQixTQUFTLENBRVIsUUFBUSxDQVdQLFFBQVEsQ0FHUCxDQUFDLENBQUM7SUFDRCxNQUFNLEVBQUUsQ0FBQztJQUNULE9BQU8sRUFBRSxLQUFLO0dBQ2Q7RUF0QkwsQUF3Qkksc0JBeEJrQixDQUdyQixTQUFTLENBRVIsUUFBUSxDQVdQLFFBQVEsQ0FRUCxpQkFBaUIsQ0FBQztJQUNqQixVQUFVLEVBQUUsR0FBRztHQUNmIn0= */ PKL\jc +instagram-feed/admin/assets/css/callout.cssnu[.sb-callout-ctn { width: 370px; min-height: 200px; overflow: auto; background: #fff; box-shadow: 0px 1px 5px 0px #0000000B, 0px 4px 12px 0px #0000000F, 0px 8px 23px 0px #00000013, 0px 14px 41px 0px #00000017, 0px 26px 77px 0px #0000001B; } .sb-callout-ctn[data-type="frontend"]{ position: fixed; bottom: 25px; right: 20px; } .sb-callout-ctn[data-type="backend"] { position: fixed; bottom: 85px; right: 20px; z-index: 99999; } .sb-callout-ctn[data-type="side-menu"], body.wp-admin.index-php li .sb-callout-ctn[data-type="side-menu"], body.instagram-feed_page_sbi-feed-builder .sb-callout-ctn[data-type="side-menu"]{ display: none !important; visibility: hidden !important; opacity: 0 !important; } body:not([class*="page_sbi-feed-builder"]) .wp-menu-name:hover > .sb-callout-ctn[data-type="side-menu"], body:not([class*="page_sbi-feed-builder"]) .wp-has-current-submenu:hover .sb-callout-ctn[data-type="side-menu"], body.wp-admin.index-php .wp-menu-name .sb-callout-ctn[data-type="side-menu"]{ display: block !important; visibility: visible !important; opacity: 1 !important; } .sb-callout-ctn[data-type="side-menu"] { position: absolute; left: 100%; /*bottom: -50%;*/ top: -100px; z-index: 999999; } .sb-callout-ctn[data-position="bottom"] { bottom: 0px; top: unset; } .sb-callout-ctn .sb-fs { width: 100%; float: left; position: relative; box-sizing: border-box; } .sb-callout-top-heading { padding: 10px 15px; border-bottom: 1px solid #E6E6EB; display: flex; align-items: center; column-gap: 10px; } .sb-callout-top-heading strong { color: #141B38 !important; font-size: 15px; } .sb-callout-only-visible { font-size: 10px; display: none; align-items: center; column-gap: 5px; text-transform: uppercase; color: #0068A0 !important; background: #D6F4FF !important; padding: 2px 8px; border-radius: 4px; line-height: 21px } [data-type="frontend"] .sb-callout-top-heading { align-items: flex-start; } [data-type="frontend"] .sb-callout-top-heading>svg { width: 25px; margin-top: 10px; height: auto; } [data-type="frontend"] .sb-callout-only-visible { display: inline-flex; } .sb-callout-top-dismiss { position: absolute; width: 16px; height: 20px; right: 12px; top: 10px; cursor: pointer; color: #2C324C !important; } .sb-callout-top-dismiss:before, .sb-callout-top-dismiss:after { content: ''; position: absolute; width: 14px; height: 2px; left: 1px; top: 8px; background: currentColor; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sb-callout-top-dismiss:after { -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sb-callout-progress { padding: 35px 25px; padding-bottom: 45px; display: flex; align-items: center; justify-content: center; column-gap: 20px; } .sb-callout-progress-radial { width: 71px; height: 71px; flex-shrink: 0; box-sizing: border-box; display: flex; justify-content: center; align-items: center; color: #0068A0 !important; font-weight: 600; font-size: 17px; } .sb-callout-progress-radial span { position: relative; z-index: 9; } .sb-callout-progress-radial svg{ position: absolute; width: 71px; height: 71px; } .sb-progress-svg { --size: 71px; --half-size: calc(var(--size) / 2); --stroke-width: 5px; --radius: calc((var(--size) - var(--stroke-width)) / 2); --circumference: calc(var(--radius) * pi * 2); --dash: calc((var(--progress) * var(--circumference)) / 100); animation: progress-animation 0s linear 0s 1 forwards; } .sb-progress-svg circle { cx: var(--half-size); cy: var(--half-size); r: var(--radius); stroke-width: var(--stroke-width); fill: none; } .sb-progress-svg .sb-progress-svg-bg { stroke: #0096CC; stroke-width: calc(var(--stroke-width) - 1px); } .sb-progress-svg .sb-progress-svg-fg { transform: rotate(-90deg); transform-origin: var(--half-size) var(--half-size); stroke-dasharray: var(--dash) calc(var(--circumference) - var(--dash)); transition: stroke-dasharray 0s linear 0s; stroke:#9ce5ff; stroke-width: var(--stroke-width) } @property --progress { syntax: ""; inherits: false; initial-value: 0; } @keyframes progress-animation { from { --progress: 0; } to { --progress: var(--percent); } } .sb-callout-progress-text { display: flex; flex-direction: column; } .sb-callout-progress-text strong { color: #141B38 !important; font-size: 16px; } .sb-callout-progress-text span { color: #696D80 !important; font-size: 13px; margin-top: 5px; line-height: 1.5em; } .sb-callout-plugins { padding: 10px 0px; background: #F9F9FA !important; } .sb-callout-plugin-item { padding: 5px 15px; display: flex; align-items: center; font-size: 14px; font-weight: 400; color: #434960 !important; column-gap: 10px } #adminmenu .sb-callout-plugin-item a:not(.sb-callout-item-btn) { display: flex !important; color: inherit !important; justify-content: center; align-items: center; column-gap: 7px; line-height: unset !important; background: unset !important; } #adminmenu .sb-callout-plugin-item a:not(.sb-callout-item-btn):after { display: none; } .sb-callout-item-checkbox { width: 17px; height: 17px; position: relative; flex-shrink: 0; border-radius: 50px; border: 2px solid #9295A6 !important; } .sb-callout-plugin-item[data-done="true"] { color: #141B38 !important; font-weight: 600; } .sb-callout-plugin-item[data-done="true"] .sb-callout-item-checkbox { background-color: #0096CC !important; border-color: #0096CC !important; color: #fff !important; } .sb-callout-plugin-item[data-done="true"] .sb-callout-item-checkbox:after { content: ''; position: absolute; width: 9px; height: 4px; border-left: 2px solid currentColor; border-bottom: 2px solid currentColor; -webkit-transform: rotate(-39deg); transform: rotate(-39deg); left: 3px; top: 4px; } .sb-callout-item-btn { display: flex !important; background-color: #0068A0 !important; color: #fff !important; font-size: 10px !important; height: 32px !important; font-weight: 600 !important; padding: 10px 11px !important; position: relative !important; margin-left: auto !important; border-radius: 3px !important; text-decoration: none !important; line-height: unset !important; align-items: center !important; justify-content: center !important; cursor: pointer !important; } .sb-callout-item-btn.sb-callout-item-btn-grey { background: #F3F4F5 !important; color: #141B38 !important; border: 1px solid #D0D1D7 !important; } .sb-callout-item-btn:after { content: '' !important; position: absolute !important; width: 5px !important; height: 5px !important; right: 14px !important; top: 12px !important; border-right: 2px solid currentColor !important; border-bottom: 2px solid currentColor !important; -webkit-transform: rotate(-45deg) !important; transform: rotate(-45deg) !important; } .sb-callout-bottom-btns { display: flex !important; justify-content: flex-start !important; padding: 20px 20px !important; column-gap: 10px !important; padding-bottom: 5px !important; } .sb-callout-bottom-btns .sb-callout-item-btn { margin-left: unset !important; flex-grow: 1 !important; text-align: center !important; font-size: 11px !important; height: 15px !important; cursor: pointer; } [data-type="frontend"] .sb-callout-bottom-btns .sb-callout-item-btn { padding: 7px 11px !important; height: unset !important; } [data-type="dashboard"] .sb-callout-bottom-btns .sb-callout-item-btn{ padding: 10px 11px !important; } .sb-callout-bottom-btns .sb-callout-item-btn:after { right: 18px !important; top: 14px !important; } #adminmenu .sb-callout-ctn a:hover { box-shadow: unset !important; } /* Callout Dashboard Widget */ .sb-callout-ctn[data-type="dashboard"] { width: 100% !important; box-sizing: border-box !important; background: unset !important; box-shadow: unset !important; } .sb-callout-ctn[data-type="dashboard"] .sb-callout-top { display: none !important; } #sb_dashboard_widget .inside { padding: 0px !important; } .sb-callout-top > a { background: unset!important; color: inherit; } .sb-callout-ctn > a{ display: none !important; } .sb-callout-plugin-item .sb-callout-item-btn{ padding: 0 26px !important; } @media (max-width: 1200px) { .sb-callout-ctn[data-type="frontend"], .sb-callout-ctn[data-type="backend"], .sb-callout-ctn[data-type="side-menu"]{ display: none !important; } }PKL\ D D)instagram-feed/admin/assets/css/about.cssnu[/* * About Us CSS TABLE OF CONTENTS * * 1.0 - GLOBAL * 2.0 - HEADER * 3.0 - 3.0 - ABOUT US CONTAINER * 3.1 - SECTION HEADER * 3.2 - ABOUT TEAM BOX * 3.3 - PLUGINS BOX * 4.0 - STICKY WIDGET * 5.0 - RESPONSIVENESS */ /*** 1.0 - GLOBAL ***/ .clearfix { display: inline-block; } /* start commented backslash hack \*/ * html .clearfix { height: 1%; } .clearfix { display: block; } #sbi-about { -webkit-font-smoothing: antialiased; font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; } #wpcontent { padding-left: 0px; } #wpbody-content { padding-bottom: 40px; } .clearfix:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; } /*orange*/ .sb-btn-orange{ background: #FE544F!important; color: #fff!important; } .sb-btn-orange:hover{ background: #EC352F!important; color: #fff!important; } .sb-btn-orange:focus, .sb-btn-orange:active{ background: #BC120E!important; color: #fff!important; } .sbi-fb-full-wrapper{ padding: 0 53px; padding-top: 82px; } .sbi-fb-fs { width: 100%; position: relative; float: left; box-sizing: border-box; } /*** 2.0 - HEADER ***/ .sbi-fb-create-ctn{ margin-top: 90px; } .sbi-fb-header{ height: 64px; position: absolute; display: flex; flex-direction: row; justify-content: space-between; align-items: center; background: #fff; padding: 0px 52px; z-index: 2; } .sbi-fb-header-left { display: flex; } .sbi-fb-header-left .sb-social-wall-link-wrap { margin-left: 30px; } .sb-social-wall-link-wrap { display: flex; font-size: 14px; margin: 10px 0 10px 30px; } .sb-social-wall-link:first-child { padding-left: 0; border-right: 1px solid #ccc; color: #0068A0!important; line-height: 1; } .sb-social-wall-link { padding: 0 12px; border-right: 1px solid #ccc; color: #0068A0!important; line-height: 1; } .sb-social-wall-link a { text-decoration: none; } .sb-social-wall-link a:focus { outline: none; box-shadow: none; } .sb-social-wall-link:last-child { border-right: none; } .sbi-fb-hd-logo{ display: flex; vertical-align: middle; align-items: center; gap: 5px; } .sbi-fb-hd-logo .sb-logo-letters-wrap { margin-bottom: 4px; } .sbi-fb-hd-logo .breadcrumb-title{ font-size: 14px; font-weight: 400; line-height: 22px; letter-spacing: 0em; margin-left: 4px; } .sbi-fb-hd-logo .separator{ margin: 0 5px 0 10px; } .sbi-fb-hd-btn{ height: 38px; cursor: pointer; display: flex; flex-direction: row; justify-content: center; align-items: center; padding: 0px 15px 0px 16px; font-weight: 600; font-size:14px; color: #353A41; background: #F3F4F5; border-radius: 2px; border: 1px solid #DCDDE1; position: relative; text-decoration: none; transition: all 0.15s ease-in-out; } .sbi-fb-hd-btn:focus { outline: none; box-shadow: none; } .sbi-fb-hd-btn:hover { color: inherit; background-color: #fff; } .sbi-fb-hd-btn i{ margin: 0px 5px; } .sbi-fb-hd-btn[data-icon="left"]{ padding-right: 20px!important; } .sbi-fb-full-wrapper .section-header h1 { font-size: 32px; line-height: 40px; } /*** 3.0 - SB CONTAINER ***/ .sbi-sb-container { max-width: 900px; position: relative; margin: auto; margin-top: 33px; box-sizing: border-box; } /*** 3.1 - SECTION HEADER ***/ .sbi-section-header h2 { font-weight: 600; font-size: 32px; line-height: 40px; color: #141B38; margin: 0 0 5px 0; } .sbi-section-header p { font-size: 13px; line-height: 18px; color: #8C8F9A; margin: 0; } .sbi-section-second-header { margin-top: 36px; } .sbi-section-second-header h3 { font-weight: 600; font-size: 24px; line-height: 29px; color: #141B38; margin: 0 0 5px 0; } .sbi-section-second-header p { font-size: 14px; line-height: 22px; color: #8C8F9A; margin-top: 0px; } .sbi-oembed-plugin-box { background: #FFFFFF; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); margin-bottom: 10px; padding: 12px 20px; display: flex; justify-content: space-between; align-items: center; } .sb-action-buttons .sbi-btn { display: flex; align-items: center; vertical-align: middle; justify-content: center; background: #F3F4F5; border: 1px solid #DCDDE1; box-sizing: border-box; border-radius: 2px; padding: 6px 19px; font-weight: 600; font-size: 12px; line-height: 18px; color: #141B38; letter-spacing: 0.2px; cursor: pointer; text-decoration: none; transition: all 0.15s ease-in-out; } .sb-action-buttons .sbi-btn:hover { background: #FFFFFF; border: 1px solid #D0D1D7; } .sb-action-buttons .sbi-btn:focus, .sb-action-buttons .sbi-btn:active { background: #E8E8EB; border: 1px solid #D0D1D7; box-shadow: none; outline: none; } .sb-action-buttons .sbi-btn.loading svg { height: 13px; transform: translate(0px, 2px); } .sb-action-buttons .sbi-btn.sb-btn-add svg { margin-right: 10px; height: 10px; } .sb-action-buttons .sbi-btn.sb-btn-add path { fill: #141B38; } .sb-action-buttons .sbi-btn.sb-btn-installed { background: #E8E8EB; color: #8C8F9A; cursor: not-allowed } .sb-action-buttons .sbi-btn.sb-btn-add { min-width: 110px; } .sb-action-buttons .sbi-btn.sb-btn-activate { background-color: #0068A0; border-color: #0068A0; color: #fff; } .sb-action-buttons .sbi-btn.sb-btn-activate:hover { background-color: #0096CC; border-color: #0096CC; } .sb-action-buttons .sbi-btn.sb-btn-activate:focus, .sb-action-buttons .sbi-btn.sb-btn-activate:active { background-color: #004D77; border-color: #004D77; } .sb-action-buttons .sbi-btn.sb-btn-deactivate { background-color: #D72C2C; border-color: #D72C2C; color: #fff; display: none; } .sb-action-buttons .sbi-btn.sb-btn-deactivate:hover { background-color: #DF5757; border-color: #DF5757; } .sb-action-buttons .sbi-btn.sb-btn-deactivate:focus, .sb-action-buttons .sbi-btn.sb-btn-deactivate:active { background-color: #841919; border-color: #841919; } .sb-action-buttons .sbi-btn:not(:last-child) { margin-right: 8px; } .sb-btn-add-plugin svg { height: 10px; margin-right: 10px; } .sb-btn-add-plugin svg path { fill: #141B38; } .sb-btn-installed svg { margin-right: 10px; } /*** 3.2 - ABOUT TEAM BOX ***/ .sbi-about-box { margin-top: 11px; } .sbi-about-box .sb-team-avatar { padding: 55px 0 50px; background-image: linear-gradient(to right, #0068A0 , #0096CC); text-align: center; } .sbi-about-box .sb-team-avatar img { max-width: 100%; width: 603px; } .sbi-about-box .sb-team-info { display: flex; padding: 48px; background: #fff; box-shadow: 0px 1px 2px rgb(0 0 0 / 5%), 0px 4px 5px rgb(0 0 0 / 5%); border-radius: 0 0 2px 2px; text-align: left; } .sb-team-info > div { min-width: 50%; } .sbi-about-box .sb-team-info .sb-team-left h2 { font-size: 24px; line-height: 29px; letter-spacing: 0; color: #141B38; margin: 0; padding-right: 5px; } .sbi-about-box .sb-team-info .sb-team-right { padding-left: 37px; max-width: 365px; box-sizing: border-box; } .sbi-about-box .sb-team-info .sb-team-right p { font-size: 14px; line-height: 22px; color: #64748B; margin-top: 0; } /*** 3.3 - EXTENSION PLUGINS BOX CONTAINER ***/ .sbi-plugins-boxes-container { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; margin-top: 20px; gap: 12px; } .sbi-plugins-boxes-container.sb-recommended-plugins { margin-top: 26px; } .sbi-plugins-boxes-container .sb-plugins-box{ background-color: #fff; padding: 20px 16px; box-shadow: 0px 1px 2px rgb(0 0 0 / 5%), 0px 4px 5px rgb(0 0 0 / 5%); border-radius: 4px; display: flex; width: calc((100% / 2) - 6px); box-sizing: border-box; } .sbi-plugins-boxes-container .sb-plugins-box .icon { max-width: 80px; padding-right: 5px; box-sizing: border-box; width: 80px; min-width: 72px; } .sbi-plugins-boxes-container.sb-recommended-plugins .sb-plugins-box .icon { max-width: 80px; padding-right: 23px; box-sizing: border-box; width: 80px; min-width: 72px; padding-left: 8px; } .sbi-plugins-boxes-container .sb-plugins-box .icon img { max-width: 100%; } .sb-plugins-box .sb-box-title { font-weight: 600; font-size: 16px; line-height: 22px; color: #141B38; margin-top: 0; margin-bottom: 5px; } .sb-plugins-box .sb-box-description { margin: 0; font-size: 13px; line-height: 18px; color: #8C8F9A; } .sb-recommended-plugins .sb-plugins-box .sb-box-description { min-height: 69px; } .sb-plugins-box .sb-action-buttons { margin-top: 20px; display: flex; } .sbi-plugins-boxes-container .sb-plugins-box.sbi-social-wall-plugin-box { padding: 27px 20px 35px 120px; flex-basis: 100%; margin-right: 0; justify-content: center; position: relative; overflow: hidden; } .sbi-social-wall-plugin-box .sb-action-buttons .sb-btn-add { padding: 6px 4px 6px 15px; } .sbi-social-wall-plugin-box .sb-action-buttons .sb-btn-add span { margin-left: 12px; } .sbi-plugins-boxes-container .sb-plugins-box.sbi-social-wall-plugin-box .plugin-box-content { z-index: 11; } .sbi-social-wall-plugin-box .sb-box-title { font-size: 24px; line-height: 27px; letter-spacing: 0; color: #141B38; } .sbi-social-wall-plugin-box .sb-box-description { font-size: 14px; line-height: 22px; color: #8C8F9A; } .sbi-social-wall-plugin-box .sb-box-bg-image { position: absolute; z-index: 0; left: -40px; width: 356px; top: 0; } .sbi-social-wall-plugin-box .sb-box-bg-image img { max-width: 100%; } /*** 4.0 Sticky Widget ***/ .sbi-stck-wdg{ position: fixed; right: 21px; z-index: 9; bottom: 20px; } .sbi-stck-wdg-btn{ width: 52px; height: 52px; background: #fff; border-radius: 50%; cursor: pointer; display: flex; justify-content: center; align-items: center; filter: drop-shadow(0px 9px 13px rgba(0, 0, 0, 0.2)); } .sbi-stck-wdg-btn svg{ width: 25px; fill: #FE544F; height: 33px; float: left; } .sbi-stck-wdg[data-active="true"] .sbi-stck-wdg-btn-cls, .sbi-stck-wdg[data-active="true"] .sbi-stck-wdg-btn-cls svg{ display: block; } .sbi-stck-wdg-btn-cls{ width: inherit; height: inherit; position: relative; color: #364152; box-shadow: 0px 1px 6px rgb(0 0 0 / 5%), 0px 9px 12px rgb(0 0 0 / 5%); border-radius: 70px; } .sbi-stck-wdg-btn-cls svg { width: 14px; height: 14px; position: absolute; top: 50%; right: 0; bottom: 0; left: 50%; margin-top: -7px; margin-left: -7px; } .sbi-stck-pop{ position: absolute; width: 292px; height: auto; background: #fff; border: 1px solid #E2E8F0; box-sizing: border-box; box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.15), 0px 3px 14px rgba(0, 0, 0, 0.12); border-radius: 2px; padding: 20px; right: 0px; bottom: 66px; color: #141B38; padding-bottom: 82px; } .sbi-stck-wdg[data-active="true"] .sbi-stck-pop{ bottom: 66px; opacity: 1; visibility: visible; } .sbi-stck-pop svg{ fill: currentColor; } .sbi-stck-el-list{ border: 1px solid #DCDDE1; border-radius: 2px; } .sbi-stck-el{ display: flex; align-items: center; padding: 11px 13px; border-bottom: 1px solid #DCDDE1; transition: background .15s ease-in-out; font-size: 12px; } .sbi-stck-el:hover{ background: #F3F4F5; } .sbi-stck-el:last-of-type{ border-bottom: 0px; } .sbi-stck-el-list .sbi-chevron svg{ width: 5px; height: 8px; } .sbi-fs-a { width: 100%; height: 100%; display: block; position: absolute; left: 0; top: 0; z-index: 1; } .sbi-stck-el .sbi-stck-el-txt{ color: #27303F; } .sbi-stck-el.sbi-stck-el-upgrd{ padding: 9px 14px; font-size: 14px; background: var(--cl-orange); color: #fff; position: relative; transition: background .15s ease-in-out; font-weight: 600; } .sbi-chevron { position: absolute; right: 14px } .sbi-stck-el.sbi-stck-el-upgrd .sbi-stck-el-txt{ color: #fff; } .sbi-stck-el.sbi-stck-el-upgrd:after{ top: 20px; opacity: 1; } .sbi-stck-el-icon{ margin-right: 10px; } .sbi-stck-el-icon svg{ width: 17px; float: left; } .sbi-stck-title{ margin-top: 20px; margin-bottom: 10px; color: #141B38; font-weight: 600; font-size: 14px; line-height: 160%; } .sbi-stck-follow{ background: #F3F4F5; margin-top: 20px; left: 0px; bottom: 0px; position: absolute; padding: 12px 20px; display: flex; align-items: center; } .sbi-stck-follow span{ font-weight: 600; font-size: 14px; } .sbi-stck-flw-links{ display: flex; justify-content: center; align-items: center; margin-left: auto; } .sbi-stck-flw-links a{ width: 36px; height: 28px; color: inherit; display: inline-flex; justify-content: center; align-items: center; margin-left: 4px; border-radius: 2px; transition: background .15s ease-in-out; } .sbi-stck-flw-links svg{ width: 17px; color: #141B38; } .sbi-stck-flw-links a:hover{ background: #fff; } .sbi-stck-flw-links a:hover svg{ color: inherit; } /*** 5.0 - RESPONSIVENESS ***/ @media (max-width: 1024px) { .sbi-extensions-boxes-container .sb-extensions-box{ width: calc(48% - 33px); } .sbi-extensions-boxes-container .sb-extensions-box:not(:nth-child(3n)) { margin-right: 0; } .sbi-extensions-boxes-container .sb-extensions-box:not(:nth-child(2n)) { margin-right: 12px; } .sbi-plugins-boxes-container { padding-right: 0px; } .sbi-social-wall-plugin-box .sb-box-bg-image { left: -45px; } .sbi-plugins-boxes-container .sb-plugins-box.sbi-social-wall-plugin-box { padding: 27px 20px 22px 130px; } .sbi-section-second-header { padding-right: 15px; } } @media (min-width: 768px) and (max-width: 1024px) { .sbi-social-wall-plugin-box .sb-box-bg-image { left: -85px; } .sb-action-buttons .sbi-btn { padding: 6px 15px; } .sb-recommended-plugins .sb-plugins-box { min-height: 209px; } .sb-recommended-plugins .sb-plugins-box .sb-box-description { min-height: 90px; } } @media (max-width: 767px) { .auto-fold #wpcontent { padding-left: 0; } .sbi-fb-full-wrapper { padding: 70px 20px 0 20px; } .sbi-fb-hd-btn { padding: 0px 15px 0px 7px; } .sbi-fb-header { padding: 0px 20px; } .sbi-about-box .sb-team-info { padding: 30px; } .sbi-plugins-boxes-container .sb-plugins-box { width: 100%; } .sbi-plugins-boxes-container .sb-plugins-box.sbi-social-wall-plugin-box { display: flex; flex-direction: column; padding: 0px; } .sbi-social-wall-plugin-box .sb-box-bg-image { position: initial; background-color: #c3d7f3; width: 100%; height: 190px; } .sbi-plugins-boxes-container .sb-plugins-box.sbi-social-wall-plugin-box .plugin-box-content { padding: 18px 24px 24px; } .sbi-social-wall-plugin-box .sb-box-title { font-size: 18px; } .sbi-social-wall-plugin-box .sb-box-bg-image img { max-width: 401px; } .sbi-about-box .sb-team-info { flex-direction: column; } .sbi-about-box .sb-team-info .sb-team-right { padding-left: 0; max-width: none; margin-top: 30px; } .sb-recommended-plugins .sb-plugins-box .sb-box-description { min-height: initial; } .sbi-about-box .sb-team-avatar { display: none; } .sbi-about-box .sb-team-info .sb-team-left h2 { font-size: 21px; } } @media (max-width: 570px) { .sbi-extensions-boxes-container .sb-extensions-box { width: calc(100% - 30px); } .sbi-plugins-boxes-container { padding-right: 0px; } .sbi-plugins-boxes-container .sb-plugins-box:not(:nth-child(2n)) { margin-right: 0px; } } @media (max-width: 480px) { .sbi-fb-hd-btn { padding: 0px 10px 0px 7px !important; } .sbi-fb-hd-btn[data-icon="left"] { padding-right: 10px!important; } .sbi-plugins-boxes-container .sb-plugins-box .icon { width: 60px; min-width: 60px; } .sbi-plugins-boxes-container.sb-recommended-plugins .sb-plugins-box .icon { padding-right: 11px; width: 58px; min-width: 58px; padding-left: 8px; } } .sb-button-standard{ position: relative; font-style: normal; font-weight: 600; font-size: 14px; padding: 10px 20px 10px 39px; line-height: 16px; height: auto; } .sb-button-standard svg { width: 16px; height: 16px; position: absolute; left: 13px; right: auto; top: 10px; bottom: auto; } .sbi-stck-el.sbi-stck-el-upgrd svg path{ fill: #fff!important; } PKL\o͟ 0instagram-feed/admin/assets/css/support-tool.cssnu[.sbi-support-tool-tab { overflow: hidden; border-bottom: 1px solid #ccc; background-color: #f1f1f1; } .sbi-support-tool-tab button { background-color: inherit; float: left; border: none; outline: none; cursor: pointer; padding: 14px 16px; transition: 0.3s; font-size: 16px; font-weight: 600; color: #3c434a; } .sbi-support-tool-tab button:hover { background-color: #ddd; } .sbi-support-tool-tab button.active { background-color: #2271b1; color: #fff; } .sbi-support-tool-tabcontent { display: none; padding: 6px 12px; border-top: none; } .sbi-support-tool-tabcontent.active { display: block; } .sbi_support_tools_wrap { padding: 20px; } .sbi_support_tools_field_group { margin-bottom: 20px; } .sb-srcs-item-avatar img { border-radius: 50%; } .sbi-fb-srcs-item-ins { background: #fff; padding: 10px; margin-bottom: 10px; border-radius: 5px; } .sbi-response-success { color: #46b450; } .sbi-response-error { color: #dc3232; } .sbi-checkboxes { margin-top: 10px; padding: 10px; border: 1px solid #ddd; display: grid; grid-template-columns: repeat(4, 1fr); } .sbi-checkboxes .sbi-checkbox-action-btns { grid-column: 1 / -1; display: flex; align-items: center; justify-content: flex-start; margin: 10px; gap: 20px; } .sbi-confirm { background: #46b450 !important; border-color: #46b450 !important; color: #fff !important; } .sbi-cancel { background: #dc3232 !important; border-color: #dc3232 !important; color: #fff !important; } pre { white-space: pre-wrap; /* Since CSS 2.1 */ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ word-wrap: break-word; /* Internet Explorer 5.5+ */ overflow-wrap: break-word; /* Modern browsers */ } .sbi-hashtags-inner { margin-top: 10px; padding: 10px; border: 1px solid #ddd; display: grid; gap: 10px; grid-template-columns: repeat(4, 1fr); } .sbi-system-info { box-sizing: border-box; background: #F9F9FA; border: 1px solid #E8E8EB; width: 100%; resize: none; border-radius: 0; padding: 20px 28px; font-size: 12px; line-height: 18px; color: #141B38; font-family: 'Fira Code', monospace; word-break: break-all; } .sbi-response-success-preview { display: flex; gap: 10px; margin-top: 10px; } .sbi-api-notes { background: #cec; margin-top: 10px; padding: 10px } .sbi-feeds-connected-accounts { display: flex; gap: 20px; margin-top: 5px; }PKL\_R_?_?0instagram-feed/admin/assets/css/sb-elementor.cssnu[.sb-elem-icon{ content: '#'; } .sb-elem-icon.sb-elem-facebook{ content: url("data:image/svg+xml,%3Csvg width='29' height='29' viewBox='0 0 29 29' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.9056 18.109H13.4056V17.609H12.9056V18.109ZM9.79722 18.109H9.29722V18.609H9.79722V18.109ZM9.79722 14.5601V14.0601H9.29722V14.5601H9.79722ZM12.9056 14.5601V15.0601H13.4056V14.5601H12.9056ZM20.2604 7.32764H20.7604V6.90407L20.3426 6.83444L20.2604 7.32764ZM20.2604 10.3503V10.8503H20.7604V10.3503H20.2604ZM16.7237 14.5601H16.2237V15.0601H16.7237V14.5601ZM20.1258 14.5601L20.6199 14.6367L20.7094 14.0601H20.1258V14.5601ZM19.5751 18.109V18.609H20.0035L20.0692 18.1857L19.5751 18.109ZM16.7237 18.109V17.609H16.2237V18.109H16.7237ZM27.0523 14.5601H26.5523L26.5523 14.5612L27.0523 14.5601ZM17.0803 26.6136L16.9877 26.1222L17.0803 26.6136ZM12.5489 26.6139L12.6411 26.1225L12.5489 26.6139ZM14.8147 1.79797C7.80749 1.79797 2.07703 7.51685 2.07703 14.5601H3.07703C3.07703 8.06849 8.36042 2.79797 14.8147 2.79797V1.79797ZM2.07703 14.5601C2.07703 20.7981 6.54984 25.9974 12.4567 27.1053L12.6411 26.1225C7.19999 25.1019 3.07703 20.3097 3.07703 14.5601H2.07703ZM13.4056 26.3139V18.109H12.4056V26.3139H13.4056ZM12.9056 17.609H9.79722V18.609H12.9056V17.609ZM10.2972 18.109V14.5601H9.29722V18.109H10.2972ZM9.79722 15.0601H12.9056V14.0601H9.79722V15.0601ZM13.4056 14.5601V11.8556H12.4056V14.5601H13.4056ZM13.4056 11.8556C13.4056 10.4191 13.8299 9.36825 14.5211 8.67703C15.2129 7.98525 16.2305 7.59512 17.5314 7.59512V6.59512C16.0299 6.59512 14.7346 7.04939 13.814 7.96992C12.893 8.891 12.4056 10.2204 12.4056 11.8556H13.4056ZM17.5314 7.59512C18.1724 7.59512 18.8342 7.65119 19.3401 7.70823C19.592 7.73664 19.8029 7.76502 19.9504 7.78622C20.0241 7.79681 20.0818 7.8056 20.1208 7.81167C20.1402 7.81471 20.155 7.81706 20.1647 7.81863C20.1695 7.81941 20.1731 7.82 20.1754 7.82037C20.1765 7.82056 20.1773 7.82069 20.1778 7.82077C20.178 7.82081 20.1782 7.82083 20.1782 7.82084C20.1783 7.82085 20.1783 7.82085 20.1783 7.82085C20.1783 7.82085 20.1783 7.82085 20.1783 7.82085C20.1782 7.82084 20.1782 7.82084 20.2604 7.32764C20.3426 6.83444 20.3426 6.83443 20.3425 6.83443C20.3425 6.83442 20.3424 6.83441 20.3424 6.83441C20.3423 6.83439 20.3422 6.83437 20.342 6.83435C20.3418 6.8343 20.3414 6.83425 20.341 6.83417C20.3401 6.83403 20.3389 6.83383 20.3373 6.83357C20.3342 6.83307 20.3298 6.83234 20.3241 6.83142C20.3127 6.82958 20.2962 6.82695 20.2749 6.82362C20.2323 6.81698 20.1707 6.8076 20.0927 6.7964C19.9369 6.774 19.7157 6.74425 19.4521 6.71453C18.927 6.65532 18.2243 6.59512 17.5314 6.59512V7.59512ZM19.7604 7.32764V10.3503H20.7604V7.32764H19.7604ZM20.2604 9.85033H18.7185V10.8503H20.2604V9.85033ZM18.7185 9.85033C17.851 9.85033 17.1997 10.1241 16.7742 10.6148C16.3604 11.0922 16.2237 11.7025 16.2237 12.2594H17.2237C17.2237 11.8495 17.3257 11.5053 17.5298 11.2699C17.7224 11.0477 18.0684 10.8503 18.7185 10.8503V9.85033ZM16.2237 12.2594V14.5601H17.2237V12.2594H16.2237ZM16.7237 15.0601H20.1258V14.0601H16.7237V15.0601ZM19.6317 14.4834L19.081 18.0323L20.0692 18.1857L20.6199 14.6367L19.6317 14.4834ZM19.5751 17.609H16.7237V18.609H19.5751V17.609ZM16.2237 18.109V26.3135H17.2237V18.109H16.2237ZM17.1728 27.105C20.0281 26.5671 22.618 25.068 24.5079 22.8512L23.7469 22.2025C22.0054 24.2452 19.6188 25.6266 16.9877 26.1222L17.1728 27.105ZM24.5079 22.8512C26.4793 20.5388 27.5591 17.5977 27.5523 14.559L26.5523 14.5612C26.5586 17.3614 25.5636 20.0715 23.7469 22.2025L24.5079 22.8512ZM27.5523 14.5601C27.5523 7.51685 21.8218 1.79797 14.8147 1.79797V2.79797C21.2689 2.79797 26.5523 8.06849 26.5523 14.5601H27.5523ZM16.2237 26.3135C16.2237 26.8064 16.6682 27.2 17.1728 27.105L16.9877 26.1222C17.119 26.0975 17.2237 26.2006 17.2237 26.3135H16.2237ZM12.4567 27.1053C12.9603 27.1998 13.4056 26.8073 13.4056 26.3139H12.4056C12.4056 26.2001 12.5107 26.098 12.6411 26.1225L12.4567 27.1053Z' fill='%23576067'/%3E%3Cpath d='M12.9056 18.1088H13.4056V17.6088H12.9056V18.1088ZM9.79724 18.1088H9.29724V18.6088H9.79724V18.1088ZM9.79724 14.5599V14.0599H9.29724V14.5599H9.79724ZM12.9056 14.5599V15.0599H13.4056V14.5599H12.9056ZM20.2604 7.32749H20.7604V6.90392L20.3426 6.83429L20.2604 7.32749ZM20.2604 10.3502V10.8502H20.7604V10.3502H20.2604ZM16.7237 14.5599H16.2237V15.0599H16.7237V14.5599ZM20.1258 14.5599L20.6199 14.6366L20.7094 14.0599H20.1258V14.5599ZM19.5751 18.1088V18.6088H20.0035L20.0692 18.1855L19.5751 18.1088ZM16.7237 18.1088V17.6088H16.2237V18.1088H16.7237ZM13.4056 26.366V18.1088H12.4056V26.366H13.4056ZM12.9056 17.6088H9.79724V18.6088H12.9056V17.6088ZM10.2972 18.1088V14.5599H9.29724V18.1088H10.2972ZM9.79724 15.0599H12.9056V14.0599H9.79724V15.0599ZM13.4056 14.5599V11.8554H12.4056V14.5599H13.4056ZM13.4056 11.8554C13.4056 10.4189 13.8299 9.3681 14.5212 8.67688C15.2129 7.9851 16.2305 7.59497 17.5314 7.59497V6.59497C16.0299 6.59497 14.7346 7.04924 13.814 7.96977C12.893 8.89085 12.4056 10.2202 12.4056 11.8554H13.4056ZM17.5314 7.59497C18.1724 7.59497 18.8342 7.65103 19.3401 7.70808C19.592 7.73648 19.803 7.76487 19.9504 7.78607C20.0241 7.79666 20.0819 7.80545 20.1208 7.81152C20.1402 7.81455 20.155 7.81691 20.1647 7.81848C20.1695 7.81926 20.1731 7.81984 20.1754 7.82022C20.1765 7.8204 20.1773 7.82054 20.1778 7.82061C20.178 7.82065 20.1782 7.82068 20.1783 7.82069C20.1783 7.8207 20.1783 7.8207 20.1783 7.8207C20.1783 7.8207 20.1783 7.82069 20.1783 7.82069C20.1782 7.82069 20.1782 7.82068 20.2604 7.32749C20.3426 6.83429 20.3426 6.83428 20.3425 6.83427C20.3425 6.83427 20.3424 6.83426 20.3424 6.83425C20.3423 6.83424 20.3422 6.83422 20.3421 6.8342C20.3418 6.83415 20.3414 6.83409 20.341 6.83402C20.3401 6.83387 20.3389 6.83367 20.3374 6.83342C20.3343 6.83291 20.3298 6.83219 20.3241 6.83127C20.3127 6.82943 20.2962 6.82679 20.2749 6.82347C20.2324 6.81683 20.1707 6.80745 20.0927 6.79624C19.9369 6.77385 19.7158 6.7441 19.4522 6.71438C18.927 6.65516 18.2244 6.59497 17.5314 6.59497V7.59497ZM19.7604 7.32749V10.3502H20.7604V7.32749H19.7604ZM20.2604 9.85018H18.7185V10.8502H20.2604V9.85018ZM18.7185 9.85018C17.8511 9.85018 17.1997 10.1239 16.7743 10.6146C16.3604 11.092 16.2237 11.7024 16.2237 12.2592H17.2237C17.2237 11.8493 17.3257 11.5052 17.5298 11.2697C17.7224 11.0476 18.0684 10.8502 18.7185 10.8502V9.85018ZM16.2237 12.2592V14.5599H17.2237V12.2592H16.2237ZM16.7237 15.0599H20.1258V14.0599H16.7237V15.0599ZM19.6317 14.4833L19.081 18.0322L20.0692 18.1855L20.6199 14.6366L19.6317 14.4833ZM19.5751 17.6088H16.7237V18.6088H19.5751V17.6088ZM16.2237 18.1088V26.366H17.2237V18.1088H16.2237ZM16.4146 26.1752H13.2148V27.1752H16.4146V26.1752ZM16.2237 26.366C16.2237 26.2606 16.3092 26.1752 16.4146 26.1752V27.1752C16.8615 27.1752 17.2237 26.8129 17.2237 26.366H16.2237ZM12.4056 26.366C12.4056 26.8129 12.7679 27.1752 13.2148 27.1752V26.1752C13.3202 26.1752 13.4056 26.2606 13.4056 26.366H12.4056Z' fill='%23576067'/%3E%3C/svg%3E%0A"); } .sb-elem-icon.sb-elem-instagram{ content: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='1' y='1' width='22' height='22' rx='6' stroke='%23576067' stroke-width='1.5'/%3E%3Ccircle cx='12' cy='12' r='5' stroke='%23576067' stroke-width='1.5'/%3E%3Ccircle cx='18.5' cy='5.75' r='1.25' fill='%23576067'/%3E%3C/svg%3E%0A"); } .sb-elem-icon.sb-elem-twitter{ content: url("data:image/svg+xml,%3Csvg width='29' height='29' viewBox='0 0 29 29' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M27.8762 6.78846C27.9345 6.7065 27.8465 6.60094 27.7536 6.63936C27.0263 6.93989 26.26 7.15757 25.4698 7.29241C25.3632 7.31061 25.3082 7.16347 25.3956 7.09969C26.2337 6.48801 26.8918 5.63649 27.2636 4.63802C27.2958 4.55162 27.2014 4.47574 27.1212 4.52123C26.1605 5.06618 25.1092 5.45524 24.0054 5.68842C23.971 5.69568 23.9354 5.68407 23.9113 5.65844C22.9264 4.60891 21.5545 4 19.9999 4C17.0624 4 14.6624 6.4 14.6624 9.3625C14.6624 9.74071 14.702 10.109 14.7724 10.4586C14.7855 10.5235 14.7342 10.5842 14.6681 10.5803C10.3227 10.3231 6.45216 8.2421 3.84135 5.09864C3.79681 5.04501 3.71241 5.0515 3.67879 5.11257C3.26061 5.8722 3.02493 6.75115 3.02493 7.675C3.02493 9.41548 3.84362 10.9704 5.13417 11.9317C5.2141 11.9913 5.17327 12.12 5.07385 12.1129C4.32811 12.0597 3.63173 11.835 3.00827 11.5171C2.99303 11.5094 2.97493 11.5204 2.97493 11.5375V11.5375C2.97493 13.9896 4.6205 16.0638 6.86301 16.7007C6.96452 16.7295 6.96588 16.8757 6.86218 16.8953C6.25772 17.0096 5.63724 17.0173 5.0289 16.9176C4.95384 16.9052 4.89095 16.9762 4.91633 17.0479C5.26967 18.0466 5.91213 18.9192 6.7637 19.5537C7.58576 20.1661 8.56481 20.5283 9.58351 20.6001C9.67715 20.6067 9.71634 20.7266 9.64124 20.7829C7.78574 22.1744 5.52424 22.9237 3.19993 22.9125C2.91864 22.9125 2.63736 22.9015 2.35608 22.8796C2.25034 22.8714 2.20189 23.0116 2.29272 23.0664C4.58933 24.4509 7.27959 25.25 10.1499 25.25C19.9999 25.25 25.4124 17.075 25.4124 9.9875C25.4124 9.76833 25.4124 9.5598 25.4026 9.34228C25.4011 9.30815 25.4168 9.27551 25.4445 9.2555C26.3819 8.57814 27.1984 7.74079 27.8762 6.78846Z' stroke='%23576067' stroke-width='1.25' stroke-linejoin='round'/%3E%3C/svg%3E%0A"); } .sb-elem-icon.sb-elem-youtube{ content: url("data:image/svg+xml,%3Csvg width='27' height='20' viewBox='0 0 27 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 13.3267C11 13.4037 11.0834 13.4518 11.15 13.4133L17.3377 9.83658C17.4043 9.79808 17.4043 9.70192 17.3377 9.66342L11.15 6.08673C11.0834 6.0482 11 6.0963 11 6.17331V13.3267ZM25.45 3.7125C25.6125 4.3 25.725 5.0875 25.8 6.0875C25.8875 7.0875 25.925 7.95 25.925 8.7L26 9.75C26 12.4875 25.8 14.5 25.45 15.7875C25.1375 16.9125 24.4125 17.6375 23.2875 17.95C22.7 18.1125 21.625 18.225 19.975 18.3C18.35 18.3875 16.8625 18.425 15.4875 18.425L13.5 18.5C8.2625 18.5 5 18.3 3.7125 17.95C2.5875 17.6375 1.8625 16.9125 1.55 15.7875C1.3875 15.2 1.275 14.4125 1.2 13.4125C1.1125 12.4125 1.075 11.55 1.075 10.8L1 9.75C1 7.0125 1.2 5 1.55 3.7125C1.8625 2.5875 2.5875 1.8625 3.7125 1.55C4.3 1.3875 5.375 1.275 7.025 1.2C8.65 1.1125 10.1375 1.075 11.5125 1.075L13.5 1C18.7375 1 22 1.2 23.2875 1.55C24.4125 1.8625 25.1375 2.5875 25.45 3.7125Z' stroke='%23576067' stroke-width='1.25' stroke-linejoin='round'/%3E%3C/svg%3E%0A"); } #elementor-panel-category-smash-balloon .icon{ height: 44px; } #elementor-panel-category-smash-balloon .elementor-element:before{ content: url("data:image/svg+xml,%3Csvg width='13' height='17' viewBox='0 0 13 17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12.1181 7.76035C12.1181 3.75058 9.48981 0.5 6.24644 0.5C3.00307 0.5 0.373535 3.75058 0.373535 7.76035C0.373535 11.6043 2.78204 14.7408 5.83201 15.0039L5.50767 16.0309L7.54138 15.858L6.82784 14.9859C9.79733 14.6255 12.1181 11.5287 12.1181 7.76035Z' fill='%23636D75'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.64698 3.05249L7.92956 5.96825L10.8576 6.05236L8.7395 8.02172L10.4124 10.4413L7.59414 9.91157L6.73975 12.7299L5.44249 10.2061L2.82313 11.4063L3.83076 8.70076L1.27612 7.41224L4.01079 6.53275L3.25618 3.83878L5.84337 5.31376L7.64698 3.05249Z' fill='white'/%3E%3C/svg%3E%0A"); position: absolute; right: 7px; top: 7px; } #elementor-panel-category-smash-balloon .elementor-element:hover:before{ content: url("data:image/svg+xml,%3Csvg width='13' height='17' viewBox='0 0 13 17' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M12.1181 7.76035C12.1181 3.75058 9.48981 0.5 6.24644 0.5C3.00307 0.5 0.373535 3.75058 0.373535 7.76035C0.373535 11.6043 2.78204 14.7408 5.83201 15.0039L5.50767 16.0309L7.54138 15.858L6.82784 14.9859C9.79733 14.6255 12.1181 11.5287 12.1181 7.76035Z' fill='%23FE544F'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M7.64698 3.05249L7.92956 5.96825L10.8576 6.05236L8.7395 8.02172L10.4124 10.4413L7.59414 9.91157L6.73975 12.7299L5.44249 10.2061L2.82313 11.4063L3.83076 8.70076L1.27612 7.41224L4.01079 6.53275L3.25618 3.83878L5.84337 5.31376L7.64698 3.05249Z' fill='white'/%3E%3C/svg%3E%0A"); } .sb-popup-cls{ height: 14px; width: 14px; position: absolute; cursor: pointer; right: 17px; top: 17px; z-index: 3; } .sb-center-boss{ display: flex; justify-content: center; align-items: center; } .sb-popup-inside{ left: 80px; width: 880px; max-width: calc(100% - 200px); background: #fff; color: #141B38; position: relative; box-shadow: 0px 26.7377px 77.2886px rgba(0, 0, 0, 0.107828), 0px 14.2952px 41.3222px rgba(0, 0, 0, 0.0894161), 0px 8.01379px 23.1649px rgba(0, 0, 0, 0.075), 0px 4.25607px 12.3027px rgba(0, 0, 0, 0.0605839), 0px 1.77104px 5.11942px rgba(0, 0, 0, 0.0421718); border-radius: 2px; overflow-y: auto; max-height: 80vh; } .sb-popup-inside.sb-narrower-modal { max-width: 576px; } .sb-popup-inside.sb-onboarding-tooltip { overflow-y: visible !important; } @media all and (max-width: 960px) { .sb-popup-inside { left: 20px; width: 100%; max-width: calc(100% - 100px); } } /* Install Plugin Modal on Select Source Flow */ .sb-btn-orange{ background: #FE544F!important; color: #fff!important; } .sb-btn-orange:hover{ background: #EC352F!important; border-color: #EC352F!important; color: #fff!important; } .sb-btn-orange:focus, .sb-btn-orange:active{ background: #BC120E!important; border-color: #BC120E!important; color: #fff!important; } /*red*/ .sb-btn-blue{ background: #0068A0!important; color: #fff!important; } .sb-btn-blue:hover{ background: #0096CC!important; border-color: #0096CC!important; color: #fff!important; } .sb-btn-blue:focus, .sb-btn-blue:active{ background: #004D77!important; border-color: #004D77!important; color: #fff!important; } .sb-fs-boss{ position: fixed; height: 100vh; width: 100%; left: 0; top: 0; bottom: 0; right: 0; background: rgba(0,0,0,.4); z-index: 9989; } .sb-install-plugin-modal { max-width: 580px; } .sb-install-plugin-body .sb-install-plugin-header { height: 106px; background: #F3F4F5; padding: 20px; display: flex; box-sizing: border-box; flex-wrap: wrap; align-items: center; } .sb-install-plugin-body .sb-install-plugin-header .sb-plugin-image { background-color: #fff; box-shadow: 0px 1px 2px rgb(0 0 0 / 5%), 0px 4px 5px rgb(0 0 0 / 5%); border-radius: 2px; padding: 15px; max-height: 66px; box-sizing: border-box; margin-right: 24px; } .sb-install-plugin-body .sb-install-plugin-header h3 { font-size: 18px !important; line-height: 25px !important; display: flex; align-items: center; text-transform: capitalize; } .sb-install-plugin-body .sb-install-plugin-header h3 span { color: #fff; background: #59AB46; border-radius: 2px; font-size: 10px; line-height: 16px; letter-spacing: 0.08em; text-transform: uppercase; padding: 0px 6px; margin-left: 10px; } .sb-install-plugin-body .sb-install-plugin-header p { display: flex; font-size: 12px; line-height: 18px; color: #434960; margin: 5px 0 0 0; } .sb-install-plugin-body .sb-install-plugin-header p .sb-author-logo { margin-right: 8px; } .sb-install-plugin-body .sb-install-plugin-content { padding: 20px 20px 32px 107px; } .sb-install-plugin-body .sb-install-plugin-content p { margin: 0px; font-size: 14px; line-height: 22px; color: #434960; padding-right: 20px; } .sb-install-plugin-body .sb-install-plugin-content .sb-plugin-btn { display: flex; align-items: center; justify-content: center; height: 38px; padding: 8px 20px; box-sizing: border-box; transition: all .15s ease-in-out; border-radius: 2px; width: 100%; margin-top: 28px; border: none; font-size: 14px; font-weight: 600; line-height: 160%; cursor: pointer; } .sb-install-plugin-body .sb-install-plugin-content .sb-btn-orange:disabled { color: #8C8F9A !important; background: #E8E8EB !important; cursor: not-allowed; } .sb-install-plugin-body .sb-install-plugin-content .sb-plugin-btn span { height: 20px; width: 20px; margin-right: 5px; } .sb-mr-fd-list button { cursor: pointer; } .sb-plugin-name strong{ color: #434960; text-transform: uppercase; } .sb-plugin-image{ border-radius: 13px !important; -webkit-transform: rotate(-3deg); transform: rotate(-3deg); } .sb-plugin-image svg{ -webkit-transform: rotate(3deg); transform: rotate(3deg); } .sb-plugin-cta-logo { position: absolute; right: -11px; bottom: -10px; z-index: 1; }PKL\/h3instagram-feed/admin/assets/js/elementor-preview.jsnu['use strict'; var InstagramFeedElementor = window.InstagramFeedElementor || ( function( document, window, $ ) { var vars = {}; var app = { init: function() { app.events(); }, events: function() { $( window ).on('elementor/frontend/init', function ( $scope ) { elementorFrontend.hooks.addAction('frontend/element_ready/sbi-widget.default', app.frontendWidgetInit); if( 'undefined' !== typeof elementor ){ elementor.hooks.addAction( 'panel/open_editor/widget/sbi-widget', app.widgetPanelOpen ); } }); }, SbiInitWidget: function() { setTimeout(function(){ window.sbi_init(); }, 1000) jQuery('body').find('.sbi_lightbox').each(function(index, el){ if( index != 0 ) jQuery(el).remove(); }); jQuery('body').find('.sbi_lightboxOverlay').each(function(index, el){ if( index != 0 ) jQuery(el).remove(); }); //window.parent.window[0].cff_init($(window.parent.window[0]).find('.cff')); }, registerWidgetEvents: function( $scope ) { $scope .on( 'change', '.sb-elementor-cta-feedselector', app.selectFeedInPreview ); }, frontendWidgetInit : function( $scope ){ app.SbiInitWidget(); app.registerWidgetEvents( $scope ); }, findFeedSelector: function( event ) { vars.$select = event && event.$el ? event.$el.closest( '#elementor-controls' ).find( 'select[data-setting="feed_id"]' ) : window.parent.jQuery( '#elementor-controls select[data-setting="feed_id"]' ); }, selectFeedInPreview : function( event ){ vars.feedId = $( this ).val(); app.findFeedSelector(); vars.$select.val( vars.feedId ).trigger( 'change' ); }, widgetPanelOpen: function( panel, model ) { panel.$el.find( '.elementor-control.elementor-control-feed_id' ).find( 'select' ).on( 'change', function(){ setTimeout(function(){ app.SbiInitWidget(); }, 400) }); }, }; return app; }( document, window, jQuery ) ); InstagramFeedElementor.init();PKL\I 㖌2instagram-feed/admin/assets/js/divi-handler.min.jsnu[!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=0)}([function(e,t,n){n(1),e.exports=n(2)},function(e,t,n){"use strict"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),o=n.n(r),i=n(4);o()(window).on("et_builder_api_ready",function(e,t){t.registerModules(i.a)})},function(e,t){e.exports=jQuery},function(e,t,n){"use strict";var r=n(5);t.a=[r.a]},function(e,t,n){"use strict";var r=n(6),o=n.n(r),i=n(7),a=n.n(i);function c(e){return(c="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"===typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function u(e,t){for(var n=0;n response.json()) .then(data => { self.createStatus = null; if( data.success ){ self.tempUser = data.user; } self.notificationElement = { type : data.success === true ? 'success' : 'error', text : data.message, shown : "shown" }; setTimeout(function(){ self.notificationElement.shown = "hidden"; }, 5000); }); }, /** * Delete Temp User * * @since 4.0 */ deleteTempUser: function() { const self = this; self.deleteStatus = 'loading'; let data = new FormData(); data.append( 'action', 'sbi_delete_temp_user' ); data.append( 'nonce', sbi_admin.nonce ); data.append( 'userId', self.tempUser.id ); fetch(sbi_support.ajax_handler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { self.deleteStatus = null; if( data.success ){ self.tempUser = null; } self.notificationElement = { type : data.success === true ? 'success' : 'error', text : data.message, shown : "shown" }; setTimeout(function(){ self.notificationElement.shown = "hidden"; }, 5000); }); } }, }) PKL\WAҶ!!)instagram-feed/admin/assets/js/oembeds.jsnu[var sbioembeds_data = { nonce: sbi_oembeds.nonce, genericText: sbi_oembeds.genericText, images: sbi_oembeds.images, modal: sbi_oembeds.modal, links: sbi_oembeds.links, supportPageUrl: sbi_oembeds.supportPageUrl, socialWallActivated: sbi_oembeds.socialWallActivated, socialWallLinks: sbi_oembeds.socialWallLinks, stickyWidget: false, facebook: sbi_oembeds.facebook, instagram: sbi_oembeds.instagram, connectionURL: sbi_oembeds.connectionURL, isFacebookActivated: sbi_oembeds.facebook.active, facebookInstallBtnText: null, fboEmbedLoader: false, instaoEmbedLoader: false, openFacebookInstaller: false, loaderSVG: sbi_oembeds.loaderSVG, checkmarkSVG: sbi_oembeds.checkmarkSVG, timesCircleSVG: sbi_oembeds.timesCircleSVG, installerStatus: null } var sbioEmbeds = new Vue({ el: "#sbi-oembeds", http: { emulateJSON: true, emulateHTTP: true }, data: sbioembeds_data, methods: { openFacebookllModal: function() { this.openFacebookInstaller = true }, closeModal: function() { this.openFacebookInstaller = false }, isoEmbedsEnabled: function() { if ( this.facebook.doingOembeds && this.instagram.doingOembeds ) { return true; } return; }, FacebookShouldInstallOrEnable: function() { // if the plugin is activated and installed then just enable oEmbed if( this.isFacebookActivated ) { this.enableFacebookOembed(); return; } // if the plugin is not activated and installed then open the modal to install and activate the plugin if( !this.isFacebookActivated ) { this.openFacebookllModal(); return; } }, installFacebook: function() { this.installerStatus = 'loading'; let data = new FormData(); data.append( 'action', sbi_oembeds.facebook.installer.action ); data.append( 'nonce', sbi_oembeds.nonce ); data.append( 'plugin', sbi_oembeds.facebook.installer.plugin ); data.append( 'type', 'plugin' ); data.append( 'referrer', sbi_oembeds.facebook.installer.referrer ); fetch(sbi_oembeds.ajax_handler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if( data.success == false ) { this.installerStatus = 'error' } if( data.success == true ) { this.isFacebookActivated = true; this.installerStatus = 'success' } if ( typeof data.data === 'object') { this.facebookInstallBtnText = data.data.msg; } else { this.facebookInstallBtnText = data.data; } setTimeout(function() { this.installerStatus = null; }.bind(this), 3000); return; }); }, enableInstaoEmbed: function () { this.instaoEmbedLoader = true; let oembedConnectUrl = this.connectionURL.connect, appendURL = this.connectionURL.stateURL; const urlParams = { 'sbi_con': this.connectionURL.sbi_con, 'state': "{'{url=" + appendURL + "}'}" } let form = document.createElement('form'); form.setAttribute('method', 'post'); form.setAttribute('action', oembedConnectUrl); for (const key in urlParams) { let hiddenField = document.createElement('input'); hiddenField.setAttribute('type', 'hidden'); hiddenField.setAttribute('name', key); hiddenField.setAttribute('value', urlParams[key]); form.appendChild(hiddenField); } document.body.appendChild(form); form.submit(); }, enableFacebookOembed: function () { this.fboEmbedLoader = true; let oembedConnectUrl = this.connectionURL.connect, appendURL = this.connectionURL.stateURL; const urlParams = { 'sbi_con': this.connectionURL.sbi_con, 'state': "{'{url=" + appendURL + "}'}" } let form = document.createElement('form'); form.setAttribute('method', 'post'); form.setAttribute('action', oembedConnectUrl); for (const key in urlParams) { let hiddenField = document.createElement('input'); hiddenField.setAttribute('type', 'hidden'); hiddenField.setAttribute('name', key); hiddenField.setAttribute('value', urlParams[key]); form.appendChild(hiddenField); } document.body.appendChild(form); form.submit(); }, disableFboEmbed: function() { this.fboEmbedLoader = true; let data = new FormData(); data.append( 'action', 'disable_facebook_oembed_from_instagram' ); data.append( 'nonce', this.nonce ); fetch(sbi_oembeds.ajax_handler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if( data.success == true ) { this.fboEmbedLoader = false; this.facebook.doingOembeds = false; // get the updated connection URL after disabling oEmbed this.connectionURL = data.data.connectionUrl; } return; }); }, disableInstaoEmbed: function() { this.instaoEmbedLoader = true; let data = new FormData(); data.append( 'action', 'disable_instagram_oembed_from_instagram' ); data.append( 'nonce', this.nonce ); fetch(sbi_oembeds.ajax_handler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if( data.success == true ) { this.instaoEmbedLoader = false; this.instagram.doingOembeds = false; // get the updated connection URL after disabling oEmbed this.connectionURL = data.data.connectionUrl; } return; }); }, installButtonText: function( buttonText = null ) { if ( buttonText ) { return buttonText; } else if ( this.facebook.installer.nextStep == 'free_install' ) { return this.modal.install; } else if ( this.facebook.installer.nextStep == 'free_activate' ) { return this.modal.activate; } }, installIcon: function() { if ( this.isFacebookActivated ) { return; } if( this.installerStatus == null ) { return this.modal.plusIcon; } else if( this.installerStatus == 'loading' ) { return this.loaderSVG; } else if( this.installerStatus == 'success' ) { return this.checkmarkSVG; } else if( this.installerStatus == 'error' ) { return this.timesCircleSVG; } }, /** * Toggle Sticky Widget view * * @since 4.0 */ toggleStickyWidget: function() { this.stickyWidget = !this.stickyWidget; }, }, created() { // Display the "Install" button text on modal depending on condition if ( this.facebook.installer.nextStep == 'free_install' ) { this.facebookInstallBtnText = this.modal.install; } else if ( this.facebook.installer.nextStep == 'free_activate' || this.facebook.installer.nextStep == 'pro_activate' ) { this.facebookInstallBtnText = this.modal.activate; } } })PKL\x  )instagram-feed/admin/assets/js/callout.jsnu[const positionCalloutContainer = (leave = false) => { const calloutCtn = window.document.querySelectorAll('.sb-callout-ctn[data-type="side-menu"]'); if (calloutCtn[0]) { const calloutCtnRect = calloutCtn[0].getBoundingClientRect(); let calloutCtnRectY = calloutCtnRect.y, positionY = calloutCtnRectY + calloutCtnRect.height >= window.innerHeight; if (positionY && !leave) { calloutCtn[0].style.marginTop = -1 * ((calloutCtnRectY + calloutCtnRect.height) - window.innerHeight) +"px" //calloutCtn[0].setAttribute("data-position", "bottom") } else { calloutCtn[0].style.marginTop = "0px" //calloutCtn[0].removeAttribute("data-position") } } } window.onload = () => { positionCalloutContainer() window.addEventListener("resize", (event) => { positionCalloutContainer() }); if(document.getElementById("toplevel_page_sb-instagram-feed")) { document.getElementById("toplevel_page_sb-instagram-feed").addEventListener("mouseenter", (event) => { if (!document.body.classList.contains('index-php')) { positionCalloutContainer() } }); document.getElementById("toplevel_page_sb-instagram-feed").addEventListener("mouseleave", (event) => { if (!document.body.classList.contains('index-php')) { positionCalloutContainer(true) } }); } }PKL\'*instagram-feed/admin/assets/js/settings.jsnu[var sbiSettings; // Declaring as global variable for quick prototyping var settings_data = { adminUrl: sbi_settings.admin_url, nonce: sbi_settings.nonce, ajaxHandler: sbi_settings.ajax_handler, model: sbi_settings.model, feeds: sbi_settings.feeds, links: sbi_settings.links, tooltipName: null, sourcesList: sbi_settings.sources, dialogBoxPopupScreen: sbi_settings.dialogBoxPopupScreen, selectSourceScreen: sbi_settings.selectSourceScreen, uncannyAutomatorScreen : sbi_settings.uncannyAutomatorScreen, automatorInstallBtnStatus: 'normal', enableAutomatorSetupStep : sbi_settings.uncannyAutomatorScreen.enableSetupStep, uoActive : sbi_settings.uoActive, disableAutomatorBtn : false, socialWallActivated: sbi_settings.socialWallActivated, socialWallLinks: sbi_settings.socialWallLinks, stickyWidget: false, exportFeed: 'none', locales: sbi_settings.locales, timezones: sbi_settings.timezones, genericText: sbi_settings.genericText, generalTab: sbi_settings.generalTab, feedsTab: sbi_settings.feedsTab, translationTab: sbi_settings.translationTab, advancedTab: sbi_settings.advancedTab, footerUpgradeUrl: sbi_settings.footerUpgradeUrl, upgradeUrl: sbi_settings.upgradeUrl, supportPageUrl: sbi_settings.supportPageUrl, isDevSite: sbi_settings.isDevSite, licenseKey: sbi_settings.licenseKey, pluginItemName: sbi_settings.pluginItemName, licenseType: 'free', licenseStatus: sbi_settings.licenseStatus, licenseErrorMsg: sbi_settings.licenseErrorMsg, extensionsLicense: sbi_settings.extensionsLicense, extensionsLicenseKey: sbi_settings.extensionsLicenseKey, extensionFieldHasError: false, cronNextCheck: sbi_settings.nextCheck, currentView: null, selected: null, current: 0, sections: ["General", "Feeds", "Advanced"], indicator_width: 0, indicator_pos: 0, forwards: true, currentTab: null, import_file: null, gdprInfoTooltip: null, loaderSVG: sbi_settings.loaderSVG, timesCircleSVG: sbi_settings.timesCircleSVG, checkmarkSVG: sbi_settings.checkmarkSVG, uploadSVG: sbi_settings.uploadSVG, exportSVG: sbi_settings.exportSVG, reloadSVG: sbi_settings.reloadSVG, checkmarCircleSVG: sbi_settings.checkmarCircleSVG, tooltipHelpSvg: sbi_settings.tooltipHelpSvg, resetSVG: sbi_settings.resetSVG, tooltip: { text: '', hover: false }, cogSVG: sbi_settings.cogSVG, deleteSVG: sbi_settings.deleteSVG, svgIcons: sbi_settings.svgIcons, testConnectionStatus: null, recheckLicenseStatus: null, btnStatus: null, uploadStatus: null, clearCacheStatus: null, optimizeCacheStatus: null, clearErrorLogStatus: null, dpaResetStatus: null, pressedBtnName: null, loading: false, hasError: sbi_settings.hasError, dialogBox: { active: false, type: null, heading: null, description: null, customButtons: undefined }, sourceToDelete: {}, viewsActive: { sourcePopup: false, sourcePopupScreen: 'redirect_1', sourcePopupType: 'creation', instanceSourceActive: null, automatorIntegrationModal : false, }, //Add New Source newSourceData: sbi_settings.newSourceData ? sbi_settings.newSourceData : null, sourceConnectionURLs: sbi_settings.sourceConnectionURLs, returnedApiSourcesList: [], manualSourcePopupInit: sbi_settings.manualSourcePopupInit, addNewSource: { typeSelected: 'page', manualSourceID: null, manualSourceToken: null }, selectedFeed: 'none', expandedFeedID: null, notificationElement: { type: 'success', // success, error, warning, message text: '', shown: null }, selectedSourcesToConnect: [], //Loading Bar fullScreenLoader: false, appLoaded: false, previewLoaded: false, loadingBar: true }; // The tab component Vue.component("tab", { props: ["section", "index"], template: ` {{section}} `, created: () => { let urlParams = new URLSearchParams(window.location.search); let view = urlParams.get('view'); if (view === null) { view = 'general'; } settings_data.currentView = view; settings_data.currentTab = settings_data.sections[0]; settings_data.selected = "app-1"; }, methods: { emitWidth: function (el) { settings_data.indicator_width = jQuery(el).outerWidth(); settings_data.indicator_pos = jQuery(el).position().left; }, changeComponent: function (index) { var prev = settings_data.current; if (prev < index) { settings_data.forwards = false; } else if (prev > index) { settings_data.forwards = true; } settings_data.selected = "app-" + (index + 1); settings_data.current = index; }, activeTab: function (section) { this.setView(section.toLowerCase().trim()); settings_data.currentTab = section; }, setView: function (section) { history.replaceState({}, null, settings_data.adminUrl + 'admin.php?page=sbi-settings&view=' + section); } } }); var sbiSettings = new Vue({ el: "#sbi-settings", http: { emulateJSON: true, emulateHTTP: true }, data: settings_data, created: function () { this.$nextTick(function () { let tabEl = document.querySelector('.tab'); settings_data.indicator_width = tabEl.offsetWidth; }); setTimeout(function () { settings_data.appLoaded = true; }, 350); }, mounted: function () { var self = this; // set the current view page on page load let activeEl = document.querySelector('a.tab#' + settings_data.currentView); // we have to uppercase the first letter let currentView = settings_data.currentView.charAt(0).toUpperCase() + settings_data.currentView.slice(1); let viewIndex = settings_data.sections.indexOf(currentView) + 1; settings_data.indicator_width = activeEl.offsetWidth; settings_data.indicator_pos = activeEl.offsetLeft; settings_data.selected = "app-" + viewIndex; settings_data.current = viewIndex; settings_data.currentTab = currentView; setTimeout(function () { settings_data.appLoaded = true; }, 350); }, computed: { getStyle: function () { return { position: "absolute", bottom: "0px", left: settings_data.indicator_pos + "px", width: settings_data.indicator_width + "px", height: "2px" }; }, chooseDirection: function () { return "slide-fade"; } }, methods: { activateLicense: function () { if (this.licenseType === 'free') { this.runOneClickUpgrade(); } else { this.activateProLicense(); } }, activateProLicense: function () { this.hasError = false; this.loading = true; this.pressedBtnName = 'sbi'; let data = new FormData(); data.append('action', 'sbi_activate_license'); data.append('license_key', this.licenseKey); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if (data.success == false) { this.licenseStatus = 'inactive'; this.hasError = true; this.loading = false; return; } if (data.success == true) { let licenseData = data.data.licenseData; this.licenseStatus = data.data.licenseStatus; this.loading = false; this.pressedBtnName = null; if ( data.data.licenseStatus == 'inactive' || data.data.licenseStatus == 'invalid' || data.data.licenseStatus == 'expired' ) { this.hasError = true; if (licenseData.error) { this.licenseErrorMsg = licenseData.errorMsg } } } return; }); }, deactivateLicense: function () { this.loading = true; this.pressedBtnName = 'sbi'; let data = new FormData(); data.append('action', 'sbi_deactivate_license'); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if (data.success == true) { this.licenseStatus = data.data.licenseStatus; this.loading = false; this.pressedBtnName = null; } return; }); }, runOneClickUpgrade: function () { this.hasError = false; this.loading = true; this.pressedBtnName = 'sbi'; let data = new FormData(); data.append('action', 'sbi_maybe_upgrade_redirect'); data.append('license_key', this.licenseKey); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if (data.success === false) { this.licenseStatus = 'invalid'; this.hasError = true; this.loading = false; if (typeof data.data !== 'undefined') { this.licenseErrorMsg = data.data.message } return; } if (data.success === true) { window.location.href = data.data.url } return; }); }, licenseActiveAction: function (extension) { extension = typeof extension !== 'undefined' ? extension : false; if (this.licenseType === 'free') { this.runOneClickUpgrade(); } else { if (typeof extension !== 'undefined') { this.deactivateExtensionLicense(extension); } else { this.deactivateLicense(); } } }, /** * Activate Extensions License * * @since 4.0 * * @param {object} extension */ activateExtensionLicense: function (extension) { let licenseKey = this.extensionsLicenseKey[extension.name]; this.extensionFieldHasError = false; this.loading = true; this.pressedBtnName = extension.name; if (!licenseKey) { this.loading = false; this.extensionFieldHasError = true; return; } let data = new FormData(); data.append('action', 'sbi_activate_extension_license'); data.append('license_key', licenseKey); data.append('extension_name', extension.name); data.append('extension_item_name', extension.itemName); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { this.loading = false; if (data.success == true) { this.extensionFieldHasError = false; this.pressedBtnName = null; if (data.data.licenseStatus == 'invalid') { this.extensionFieldHasError = true; this.notificationElement = { type: 'error', text: this.genericText.invalidLicenseKey, shown: "shown" }; } if (data.data.licenseStatus == 'valid') { this.notificationElement = { type: 'success', text: this.genericText.licenseActivated, shown: "shown" }; } extension.licenseStatus = data.data.licenseStatus; extension.licenseKey = licenseKey; setTimeout(function () { this.notificationElement.shown = "hidden"; }.bind(this), 3000); } return; }); }, /** * Deactivate Extensions License * * @since 4.0 * * @param {object} extension */ deactivateExtensionLicense: function (extension) { let licenseKey = this.extensionsLicenseKey[extension.name]; this.extensionFieldHasError = false; this.loading = true; this.pressedBtnName = extension.name; let data = new FormData(); data.append('action', 'sbi_deactivate_extension_license'); data.append('extension_name', extension.name); data.append('extension_item_name', extension.itemName); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { this.loading = false; if (data.success == true) { this.extensionFieldHasError = false; this.pressedBtnName = null; if (data.data.licenseStatus == 'deactivated') { this.notificationElement = { type: 'success', text: this.genericText.licenseDeactivated, shown: "shown" }; } extension.licenseStatus = data.data.licenseStatus; extension.licenseKey = licenseKey; setTimeout(function () { this.notificationElement.shown = "hidden"; }.bind(this), 3000); } return; }); }, testConnection: function () { this.testConnectionStatus = 'loading'; let data = new FormData(); data.append('action', 'sbi_test_connection'); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if (data.success == false) { this.testConnectionStatus = 'error'; this.testConnectionStatusMessage = data.data.error; } if (data.success == true) { this.testConnectionStatus = 'success'; setTimeout(function () { this.testConnectionStatus = null; }.bind(this), 3000); } return; }); }, recheckLicense: function (licenseKey, itemName, optionName = null) { this.recheckLicenseStatus = 'loading'; this.pressedBtnName = optionName; let data = new FormData(); data.append('action', 'sbi_recheck_connection'); data.append('license_key', licenseKey); data.append('item_name', itemName); data.append('option_name', optionName); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if (data.success == true) { if (data.data.license == 'valid') { this.recheckLicenseStatus = 'success'; } if (data.data.license == 'expired') { this.recheckLicenseStatus = 'error'; } // if the api license status has changed from old stored license status // then reload the page to show proper error message and notices // or hide error messages and notices if (data.data.licenseChanged == true) { location.reload(); } setTimeout(function () { this.pressedBtnName = null; this.recheckLicenseStatus = null; }.bind(this), 3000); } return; }); }, recheckLicenseIcon: function () { if (this.recheckLicenseStatus == null) { return this.generalTab.licenseBox.recheckLicense; } else if (this.recheckLicenseStatus == 'loading') { return this.loaderSVG; } else if (this.recheckLicenseStatus == 'success') { return this.timesCircleSVG + ' ' + this.generalTab.licenseBox.licenseValid; } else if (this.recheckLicenseStatus == 'error') { return this.timesCircleSVG + ' ' + this.generalTab.licenseBox.licenseExpired; } }, recheckBtnText: function (btnName) { if (this.recheckLicenseStatus == null || this.pressedBtnName != btnName) { return this.generalTab.licenseBox.recheckLicense; } else if (this.recheckLicenseStatus == 'loading' && this.pressedBtnName == btnName) { return this.loaderSVG; } else if (this.recheckLicenseStatus == 'success') { return this.timesCircleSVG + ' ' + this.generalTab.licenseBox.licenseValid; } else if (this.recheckLicenseStatus == 'error') { return this.timesCircleSVG + ' ' + this.generalTab.licenseBox.licenseExpired; } }, testConnectionIcon: function () { if (this.testConnectionStatus == 'loading') { return this.loaderSVG; } else if (this.testConnectionStatus == 'success') { return this.timesCircleSVG + ' ' + this.generalTab.licenseBox.connectionSuccessful; } else if (this.testConnectionStatus == 'error') { return this.timesCircleSVG + ' ' + ` ${this.generalTab.licenseBox.connectionFailed} ${this.testConnectionStatusMessage}`; } }, importFile: function () { document.getElementById("import_file").click(); }, uploadFile: function (event) { this.uploadStatus = 'loading'; let file = this.$refs.file.files[0]; let data = new FormData(); data.append('action', 'sbi_import_settings_json'); data.append('file', file); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { this.uploadStatus = null; this.$refs.file.files[0] = null; if (data.success == false) { this.notificationElement = { type: 'error', text: this.genericText.failedToImportFeed, shown: "shown" }; } if (data.success == true) { this.feeds = data.data.feeds; this.notificationElement = { type: 'success', text: this.genericText.feedImported, shown: "shown" }; } setTimeout(function () { this.notificationElement.shown = "hidden"; }.bind(this), 3000); }); }, exportFeedSettings: function () { // return if no feed is selected if (this.exportFeed === 'none') { return; } let url = this.ajaxHandler + '?action=sbi_export_settings_json&nonce=' + this.nonce + '&feed_id=' + this.exportFeed; window.location = url; }, saveSettings: function () { this.btnStatus = 'loading'; this.pressedBtnName = 'saveChanges'; let data = new FormData(); data.append('action', 'sbi_save_settings'); data.append('model', JSON.stringify(this.model)); data.append('sbi_license_key', this.licenseKey); data.append('extensions_license_key', JSON.stringify(this.extensionsLicenseKey)); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if (data.success == false) { this.btnStatus = 'error'; return; } this.cronNextCheck = data.data.cronNextCheck; this.btnStatus = 'success'; setTimeout(function () { this.btnStatus = null; this.pressedBtnName = null; }.bind(this), 3000); }); }, clearCache: function () { this.clearCacheStatus = 'loading'; let data = new FormData(); data.append('action', 'sbi_clear_cache'); data.append('model', JSON.stringify(this.model)); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if (data.success == false) { this.clearCacheStatus = 'error'; return; } this.cronNextCheck = data.data.cronNextCheck; this.clearCacheStatus = 'success'; setTimeout(function () { this.clearCacheStatus = null; }.bind(this), 3000); }); }, installAutomatorPlugin: function(ispluginInstalled, isPluginActive, pluginDownloadPath, automatorPlugin) { var self = this; self.automatorInstallBtnStatus = 'loading'; self.disableAutomatorBtn = true; let data = new FormData(); data.append( 'action', ! ispluginInstalled ? 'sbi_install_addon' : 'sbi_activate_addon' ); data.append( 'nonce', self.nonce ); data.append( 'type', 'plugin' ); data.append( 'plugin', ! ispluginInstalled ? pluginDownloadPath : automatorPlugin ); fetch(self.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if ( data.success === true ) { self.automatorInstallBtnStatus = 'success'; self.enableAutomatorSetupStep = true; } else { self.automatorInstallBtnStatus = 'normal'; self.disableAutomatorBtn = false; } }); }, dismissAutomatorNotice: function() { var self = this; // Remove the notice instantly from the UI for better user experience self.uncannyAutomatorScreen.shouldHideAutomatorNotice = true; let data = new FormData(); data.append( 'action', 'sbi_dismiss_automator_notice' ); data.append( 'nonce', self.nonce ); fetch(self.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) }, automatorInstallBtnIcon: function() { if ( this.automatorInstallBtnStatus == 'loading' ) { return this.loaderSVG; } else if ( this.automatorInstallBtnStatus == 'success' ) { return this.checkmarCircleSVG; } else if ( this.automatorInstallBtnStatus == 'error' ) { return this.timesSVG; } if ( this.uncannyAutomatorScreen.isPluginInstalled && this.uncannyAutomatorScreen.isPluginActive ) { return this.checkmarCircleSVG; } return this.uncannyAutomatorScreen.installSVG; }, automatorInstallBtnText: function() { if ( this.automatorInstallBtnStatus == 'loading' ) { return 'Installing'; } else if ( this.automatorInstallBtnStatus == 'success' ) { return 'Installed & Activated Successfully'; } if ( this.uncannyAutomatorScreen.isPluginInstalled && !this.uncannyAutomatorScreen.isPluginActive ) { return 'Activate Plugin'; } if ( this.uncannyAutomatorScreen.isPluginInstalled && this.uncannyAutomatorScreen.isPluginActive ) { return 'Plugin Installed & Activated'; } return 'Install Plugin'; }, setupAutomatorPlugin: function() { var self = this; let data = new FormData(); data.append( 'action', 'sbi_automator_setup_source' ); data.append( 'nonce', self.nonce ); fetch(self.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if ( data.success === true ) { window.location.href = self.adminUrl + self.uncannyAutomatorScreen.setupPage; } }); }, showTooltip: function (tooltipName) { this.tooltipName = tooltipName; }, hideTooltip: function () { this.tooltipName = null; }, gdprOptions: function () { this.gdprInfoTooltip = null; }, gdprLimited: function () { this.gdprInfoTooltip = this.gdprInfoTooltip == null ? true : null; }, clearImageResizeCache: function () { this.optimizeCacheStatus = 'loading'; let data = new FormData(); data.append('action', 'sbi_clear_image_resize_cache'); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if (data.success == false) { this.optimizeCacheStatus = 'error'; return; } this.optimizeCacheStatus = 'success'; setTimeout(function () { this.optimizeCacheStatus = null; }.bind(this), 3000); }); }, resetErrorLog: function () { this.clearErrorLogStatus = 'loading'; let data = new FormData(); data.append('action', 'sbi_clear_error_log'); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if (!data.success) { this.clearErrorLogStatus = 'error'; return; } this.clearErrorLogStatus = 'success'; setTimeout(function () { this.clearErrorLogStatus = null; }.bind(this), 3000); }); }, dpaReset: function () { this.dpaResetStatus = 'loading'; let data = new FormData(); data.append('action', 'sbi_dpa_reset'); data.append('nonce', this.nonce); fetch(this.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if (data.success == false) { this.dpaResetStatus = 'error'; return; } this.dpaResetStatus = 'success'; setTimeout(function () { this.dpaResetStatus = null; }.bind(this), 3000); }); }, resetErrorLogIcon: function () { if (this.clearErrorLogStatus === null) { return; } if (this.clearErrorLogStatus == 'loading') { return this.loaderSVG; } else if (this.clearErrorLogStatus == 'success') { return this.checkmarkSVG; } else if (this.clearErrorLogStatus == 'error') { return this.timesCircleSVG; } }, saveChangesIcon: function () { if (this.btnStatus === 'loading') { return this.loaderSVG; } else if (this.btnStatus === 'success') { return this.checkmarkSVG; } else if (this.btnStatus === 'error') { return this.timesCircleSVG; } }, importBtnIcon: function () { if (this.uploadStatus === null) { return this.uploadSVG; } if (this.uploadStatus == 'loading') { return this.loaderSVG; } else if (this.uploadStatus == 'success') { return this.checkmarkSVG; } else if (this.uploadStatus == 'error') { return this.timesCircleSVG; } }, clearCacheIcon: function () { if (this.clearCacheStatus === null) { return this.reloadSVG; } if (this.clearCacheStatus == 'loading') { return this.loaderSVG; } else if (this.clearCacheStatus == 'success') { return this.checkmarkSVG; } else if (this.clearCacheStatus == 'error') { return this.timesCircleSVG; } }, clearImageResizeCacheIcon: function () { if (this.optimizeCacheStatus === null) { return this.resetSVG; } if (this.optimizeCacheStatus == 'loading') { return this.loaderSVG; } else if (this.optimizeCacheStatus == 'success') { return this.checkmarkSVG; } else if (this.optimizeCacheStatus == 'error') { return this.timesCircleSVG; } }, dpaResetStatusIcon: function () { if (this.dpaResetStatus === null) { return; } if (this.dpaResetStatus == 'loading') { return this.loaderSVG; } else if (this.dpaResetStatus == 'success') { return this.checkmarkSVG; } else if (this.dpaResetStatus == 'error') { return this.timesCircleSVG; } }, /** * Toggle Sticky Widget view * * @since 4.0 */ toggleStickyWidget: function () { this.stickyWidget = !this.stickyWidget; }, printUsedInText: function (usedInNumber) { if (usedInNumber == 0) { return this.genericText.sourceNotUsedYet; } return this.genericText.usedIn + ' ' + usedInNumber + ' ' + (usedInNumber == 1 ? this.genericText.feed : this.genericText.feeds); }, /** * Delete Source Ajax * * @since 4.0 */ deleteSource: function (sourceToDelete) { var self = this; let data = new FormData(); data.append('action', 'sbi_feed_saver_manager_delete_source'); data.append('source_id', sourceToDelete.id); data.append('username', sourceToDelete.username); data.append('nonce', this.nonce); fetch(self.ajaxHandler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if (sourceToDelete.just_added) { window.location.href = window.location.href.replace('sbi_access_token', 'sbi_null'); } self.sourcesList = data; }); }, /** * Check if Value is Empty * * @since 4.0 * * @return boolean */ checkNotEmpty: function (value) { return value != null && value.replace(/ /gi, '') != ''; }, /** * Activate View * * @since 4.0 */ activateView: function (viewName, sourcePopupType = 'creation', ajaxAction = false) { var self = this; self.viewsActive[viewName] = (self.viewsActive[viewName] == false) ? true : false; if (viewName == 'sourcePopup' && sourcePopupType == 'creationRedirect') { setTimeout(function () { self.$refs.addSourceRef.processIFConnect() }, 3500); } }, /** * Switch & Change Feed Screens * * @since 4.0 */ switchScreen: function (screenType, screenName) { this.viewsActive[screenType] = screenName; }, /** * Parse JSON * * @since 4.0 * * @return jsonObject / Boolean */ jsonParse: function (jsonString) { try { return JSON.parse(jsonString); } catch (e) { return false; } }, /** * Ajax Post Action * * @since 4.0 */ ajaxPost: function (data, callback) { var self = this; self.$http.post(self.ajaxHandler, data).then(callback); }, /** * Check if Object has Nested Property * * @since 4.0 * * @return boolean */ hasOwnNestedProperty: function (obj, propertyPath) { if (!propertyPath) { return false; } var properties = propertyPath.split('.'); for (var i = 0; i < properties.length; i++) { var prop = properties[i]; if (!obj || !obj.hasOwnProperty(prop)) { return false; } else { obj = obj[prop]; } } return true; }, /** * Show Tooltip on Hover * * @since 4.0 */ toggleElementTooltip: function (tooltipText, type, align = 'center') { var self = this, target = window.event.currentTarget, tooltip = (target != undefined && target != null) ? document.querySelector('.sb-control-elem-tltp-content') : null; if (tooltip != null && type == 'show') { self.tooltip.text = tooltipText; var position = target.getBoundingClientRect(), left = position.left + 10, top = position.top - 10; tooltip.style.left = left + 'px'; tooltip.style.top = top + 'px'; tooltip.style.textAlign = align; self.tooltip.hover = true; } if (type == 'hide') { self.tooltip.hover = false; } }, /** * Hover Tooltip * * @since 4.0 */ hoverTooltip: function (type) { this.tooltip.hover = type; }, /** * Open Dialog Box * * @since 4.0 */ openDialogBox: function (type, args = []) { var self = this, heading = self.dialogBoxPopupScreen[type].heading, description = self.dialogBoxPopupScreen[type].description, customButtons = self.dialogBoxPopupScreen[type].customButtons; switch (type) { case "deleteSource": self.sourceToDelete = args; heading = heading.replace("#", self.sourceToDelete.username); break; } self.dialogBox = { active: true, type: type, heading: heading, description: description, customButtons: customButtons }; }, /** * Confirm Dialog Box Actions * * @since 4.0 */ confirmDialogAction: function () { var self = this; switch (self.dialogBox.type) { case 'deleteSource': self.deleteSource(self.sourceToDelete); break; } }, /** * Display Feed Sources Settings * * @since 4.0 * * @param {object} source * @param {int} sourceIndex */ displayFeedSettings: function (source, sourceIndex) { this.expandedFeedID = sourceIndex + 1; }, /** * Hide Feed Sources Settings * * @since 4.0 * * @param {object} source * @param {int} sourceIndex */ hideFeedSettings: function () { this.expandedFeedID = null; }, /** * Copy text to clipboard * * @since 4.0 */ copyToClipBoard: function (value) { var self = this; const el = document.createElement('textarea'); el.className = 'sbi-fb-cp-clpboard'; el.value = value; document.body.appendChild(el); el.select(); document.execCommand('copy'); document.body.removeChild(el); self.notificationElement = { type: 'success', text: this.genericText.copiedClipboard, shown: "shown" }; setTimeout(function () { self.notificationElement.shown = "hidden"; }, 3000); }, escapeHTML: function (text) { return text.replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); }, /** * View Source Instances * * @since 4.0 */ viewSourceInstances: function (source) { var self = this; self.viewsActive.instanceSourceActive = source; }, /** * Return Page/Group Avatar * * @since 4.0 * * @return string */ returnAccountAvatar: function (source) { if (typeof source.local_avatar_url !== "undefined" && source.local_avatar_url !== '') { return source.local_avatar_url; } if (typeof source.avatar_url !== "undefined" && source.avatar_url !== '') { return source.avatar_url; } return false; }, /** * Trigger & Open Personal Account Info Dialog * * @since 6.0.8 * * @return string */ openPersonalAccount: function (source) { let self = this; self.$refs.personalAccountRef.personalAccountInfo.id = source.account_id; self.$refs.personalAccountRef.personalAccountInfo.username = source.username; self.$refs.personalAccountRef.personalAccountInfo.bio = source?.header_data?.biography; self.$refs.personalAccountRef.personalAccountPopup = true; self.$refs.personalAccountRef.step = 2; }, /** * Cancel Personal Account * * @since 6.0.8 */ cancelPersonalAccountUpdate: function () { }, successPersonalAccountUpdate: function () { let self = this; self.notificationElement = { type: 'success', text: self.genericText.personalAccountUpdated, shown: "shown" }; setTimeout(function () { self.notificationElement.shown = "hidden"; }, 3000); sbiSettings.$forceUpdate(); }, } }); PKL\hZ#995instagram-feed/admin/assets/js/admin-notifications.jsnu[/** * CFF Admin Notifications. * * @since 2.18 */ 'use strict'; var SBIAdminNotifications = window.SBIAdminNotifications || ( function( document, window, $ ) { /** * Elements holder. * * @since 2.18 * * @type {object} */ var el = { $notifications: $( '#sbi-notifications' ), $nextButton: $( '#sbi-notifications .navigation .next' ), $prevButton: $( '#sbi-notifications .navigation .prev' ), $adminBarCounter: $( '#wp-admin-bar-wpforms-menu .sbi-menu-notification-counter' ), $adminBarMenuItem: $( '#wp-admin-bar-sbi-notifications' ), }; /** * Public functions and properties. * * @since 2.18 * * @type {object} */ var app = { /** * Start the engine. * * @since 2.18 */ init: function() { el.$notifications.find( '.messages a').each(function() { if ($(this).attr('href').indexOf('dismiss=') > -1 ) { $(this).addClass('button-dismiss'); } }) $( app.ready ); }, /** * Document ready. * * @since 2.18 */ ready: function() { app.updateNavigation(); app.events(); }, /** * Register JS events. * * @since 2.18 */ events: function() { el.$notifications .on( 'click', '.dismiss', app.dismiss ) .on( 'click', '.button-dismiss', app.buttonDismiss ) .on( 'click', '.next', app.navNext ) .on( 'click', '.prev', app.navPrev ); }, /** * Click on a dismiss button. * * @since 2.18 */ buttonDismiss: function( event ) { event.preventDefault(); app.dismiss(); }, /** * Click on the Dismiss notification button. * * @since 2.18 * * @param {object} event Event object. */ dismiss: function( event ) { if ( el.$currentMessage.length === 0 ) { return; } // Update counter. var count = parseInt( el.$adminBarCounter.text(), 10 ); if ( count > 1 ) { --count; el.$adminBarCounter.html( '' + count + '' ); } else { el.$adminBarCounter.remove(); el.$adminBarMenuItem.remove(); } // Remove notification. var $nextMessage = el.$nextMessage.length < 1 ? el.$prevMessage : el.$nextMessage, messageId = el.$currentMessage.data( 'message-id' ); if ( $nextMessage.length === 0 ) { el.$notifications.remove(); } else { el.$currentMessage.remove(); $nextMessage.addClass( 'current' ); app.updateNavigation(); } // AJAX call - update option. var data = { action: 'sbi_dashboard_notification_dismiss', nonce: sbi_admin.nonce, id: messageId, }; $.post( sbi_admin.ajax_url, data, function( res ) { if ( ! res.success ) { //sbiAdmin.debug( res ); } } ).fail( function( xhr, textStatus, e ) { //sbiAdmin.debug( xhr.responseText ); } ); }, /** * Click on the Next notification button. * * @since 2.18 * * @param {object} event Event object. */ navNext: function( event ) { if ( el.$nextButton.hasClass( 'disabled' ) ) { return; } el.$currentMessage.removeClass( 'current' ); el.$nextMessage.addClass( 'current' ); app.updateNavigation(); }, /** * Click on the Previous notification button. * * @since 2.18 * * @param {object} event Event object. */ navPrev: function( event ) { if ( el.$prevButton.hasClass( 'disabled' ) ) { return; } el.$currentMessage.removeClass( 'current' ); el.$prevMessage.addClass( 'current' ); app.updateNavigation(); }, /** * Update navigation buttons. * * @since 2.18 */ updateNavigation: function() { el.$currentMessage = el.$notifications.find( '.message.current' ); el.$nextMessage = el.$currentMessage.next( '.message' ); el.$prevMessage = el.$currentMessage.prev( '.message' ); if ( el.$nextMessage.length === 0 ) { el.$nextButton.addClass( 'disabled' ); } else { el.$nextButton.removeClass( 'disabled' ); } if ( el.$prevMessage.length === 0 ) { el.$prevButton.addClass( 'disabled' ); } else { el.$prevButton.removeClass( 'disabled' ); } }, }; return app; }( document, window, jQuery ) ); // Initialize. SBIAdminNotifications.init(); PKL\`$003instagram-feed/admin/assets/js/elementor-handler.jsnu['use strict'; /** * Used to handle : * Click of Non-Installed Plugins * Show Upsell Popup * Unbind Drag & Drop */ let SbElementorHandler = window.SbElementorHandler || ( function( _document, window, $ ) { const smashBalloonPlugins = sbHandler.smashPlugins; let app = { init: function() { app.events(); }, events: function() { $( window ).on('elementor/frontend/init', function () { app.disableInactiveSmashWidgets(); setTimeout(function(){ elementor.panel.$el.on('click', function () { app.disableInactiveSmashWidgets(); }); }, 300) }); }, disableInactiveSmashWidgets : function(){ setTimeout(function(){ for (const pluginName in smashBalloonPlugins) { let plugin = smashBalloonPlugins[pluginName], pluginWidget = elementor.panel.$el.find("#elementor-panel-category-smash-balloon").find('.sb-elem-inactive.sb-elem-'+pluginName).parents('.elementor-element-wrapper').find('.elementor-element'); pluginWidget.attr('draggable', false); pluginWidget.on('click', function(){ app.createUpsellPopup( pluginName ); }); } }, 500) }, createUpsellPopup : function( pluginName ){ let plugin = smashBalloonPlugins[pluginName], spinnerIcon = '', upsellPopupOutput = '
\
\
\ \ \ \
\
\
\
' + plugin["icon"] + '\ \
\
\ Requires\

\ ' + pluginName + '\ Free\

\
\
\
\

' + plugin["description"] + '

\ \ \
\
\
\
'; if($(window.parent.document.body).find('.sb-center-boss').length === 0){ $(window.parent.document.body).append(upsellPopupOutput); } $(window.parent.document.body).find('.sb-install-plugin-btn').on('click', function(){ let downloadPlugin = $(this).attr('data-plugin'); $(this).find('.sb-install-plugin-spinner').show(); app.installPlugin(downloadPlugin); }); $(window.parent.document.body).find('.sb-install-refresh-btn').on('click', function(){ window.parent.location.reload(); }); $(window.parent.document.body).find('.sb-popup-cls').on('click', function(){ app.closeUpsellPopup(); }); }, closeUpsellPopup : function(){ $(window.parent.document.body).find('.sb-center-boss').remove(); }, installPlugin : function(downloadPlugin){ let data = new FormData(); data.append( 'action', 'sbi_install_addon' ); data.append( 'nonce', sbHandler.nonce ); data.append( 'plugin', downloadPlugin ); data.append( 'type', 'plugin' ); fetch(sbHandler.ajax_handler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { $(window.parent.document.body).find('.sb-install-plugin-btn').hide(); if( data.success == true ) { $(window.parent.document.body).find('.sb-install-refresh-btn').show(); } }); } }; return app; }( document, window, jQuery ) ); SbElementorHandler.init();PKL\<̭.instagram-feed/admin/assets/js/support-tool.jsnu[function openTab(evt, tabName) { let i, tabcontent, tablinks; tabcontent = document.getElementsByClassName("sbi-support-tool-tabcontent"); for (i = 0; i < tabcontent.length; i++) { tabcontent[i].style.display = "none"; } tablinks = document.getElementsByClassName("sbi-support-tool-tablinks"); for (i = 0; i < tablinks.length; i++) { tablinks[i].className = tablinks[i].className.replace(" active", ""); } document.getElementById(tabName).style.display = "block"; evt.currentTarget.className += " active"; } jQuery(document).ready(function ($) { function handleAjaxRequest(nonce, data, successCallback) { $.ajax({ url: ajaxurl, type: 'POST', data: { action: 'sbi_get_api_calls_handler', nonce: nonce, ...data, }, success: successCallback, }); } function handleResponse(response, responseDiv) { let responseDivMessage = responseDiv.find('.sbi-response-message'); if (response.success) { let api_response = response['data']['api_response']; if (api_response['data'] && api_response['data'][0]) { let post = api_response['data'][0]; let id = post['id']; let media_type = post['media_type'] ? post['media_type'] : post['media_product_type']; let media_url = post['media_url'] ? post['media_url'] : post['thumbnail_url']; let caption = post['caption'] ? post['caption'] : ''; let permalink = post['permalink']; responseDivMessage.html('
Instagram Post

ID: ' + id + '

Media Type: ' + media_type + '

Caption: ' + caption + '

Permalink: ' + permalink + '

'); responseDivMessage.append('
' + JSON.stringify(api_response, null, 2) + '
'); } else { responseDivMessage.html('
' + JSON.stringify(api_response, null, 2) + '
'); } } else { responseDivMessage.html('
' + JSON.stringify(response['data'], null, 2) + '
'); } } $('.sbi-get-account-info').on('click', function (e) { e.preventDefault(); $('.sbi-response-message').html(''); $('.sbi-checkboxes').hide(); $('.sbi-hashtags-inner').hide(); let user_id = $(this).data('user-id'); let account_type = $(this).data('account-type'); let nonce = sbi_support_tool.nonce; let ajax_action = 'user_info'; let responseDiv = $('.sbi-response[data-id="' + user_id + '"]'); responseDiv.html('

Loading...

'); handleAjaxRequest(nonce, { user_id, account_type, ajax_action }, function (response) { handleResponse(response, responseDiv); }); }); $('.sbi-get-media').on('click', function (e) { e.preventDefault(); $('.sbi-response-message').html(''); $('.sbi-hashtags-inner').hide(); // reset to default, do not change the checkbox with disabled and checked, only change the checkbox without disabled and checked. $('.sbi-checkboxes input[type="checkbox"]').prop('checked', false); $('.sbi-checkboxes input[type="checkbox"]').prop('disabled', false); $('.sbi-checkboxes input[type="checkbox"]').each(function () { if ($(this).val() === 'id' || $(this).val() === 'username' || $(this).val() === 'media_type' || $(this).val() === 'media_product_type' || $(this).val() === 'timestamp' || $(this).val() === 'permalink' || $(this).val() === 'caption' || $(this).val() === 'media_url') { $(this).prop('checked', true); $(this).prop('disabled', true); } }); $('.sbi-checkboxes').hide(); let checkboxes = $(this).siblings('.sbi-checkboxes'); checkboxes.show(); }); $('.sbi-confirm').on('click', function (e) { e.preventDefault(); $('.sbi-response-message').html(''); $('.sbi-checkboxes').hide(); let user_id = $(this).data('user-id'); let account_type = $(this).data('account-type'); let nonce = sbi_support_tool.nonce; let post_limit = $(this).parents('.sbi-checkboxes').find('input[name="sbi_post_limit"]').val(); let ajax_action = 'media'; let media_fields = ''; let checkboxes = $(this).parents('.sbi-checkboxes'); checkboxes.find('input[type="checkbox"]:checked').each(function () { media_fields += $(this).val() + ','; }); media_fields = media_fields.slice(0, -1); // Remove the trailing comma let responseDiv = $('.sbi-response[data-id="' + user_id + '"]'); responseDiv.html('

Loading...

'); handleAjaxRequest(nonce, { user_id, account_type, media_fields, post_limit, ajax_action }, function (response) { handleResponse(response, responseDiv); }); }); $('.sbi-cancel').on('click', function (e) { e.preventDefault(); $('.sbi-checkboxes').hide(); }); });PKL\f iܘ'instagram-feed/admin/assets/js/about.jsnu[var extensions_data = { genericText: sbi_about.genericText, links: sbi_about.links, extentions_bundle: sbi_about.extentions_bundle, supportPageUrl: sbi_about.supportPageUrl, plugins: sbi_about.pluginsInfo, stickyWidget: false, socialWallActivated: sbi_about.socialWallActivated, socialWallLinks: sbi_about.socialWallLinks, recommendedPlugins: sbi_about.recommendedPlugins, social_wall: sbi_about.social_wall, aboutBox: sbi_about.aboutBox, ajax_handler: sbi_about.ajax_handler, nonce: sbi_about.nonce, buttons: sbi_about.buttons, icons: sbi_about.icons, btnClicked: null, btnStatus: null, btnName: null, } var sbiAbout = new Vue({ el: "#sbi-about", http: { emulateJSON: true, emulateHTTP: true }, data: extensions_data, methods: { activatePlugin: function( plugin, name, index, type ) { this.btnClicked = index + 1; this.btnStatus = 'loading'; this.btnName = name; let data = new FormData(); data.append( 'action', 'sbi_activate_addon' ); data.append( 'nonce', this.nonce ); data.append( 'plugin', plugin ); data.append( 'type', 'plugin' ); if ( this.extentions_bundle && type == 'extension' ) { data.append( 'extensions_bundle', this.extentions_bundle ); } fetch(this.ajax_handler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if( data.success == true ) { if ( name === 'social_wall' ) { this.social_wall.activated = true; } else if ( type === 'recommended_plugin' ) { this.recommendedPlugins[name].activated = true; } else { this.plugins[name].activated = true; } this.btnClicked = null; this.btnStatus = null; this.btnName = null; } }); }, deactivatePlugin: function( plugin, name, index, type ) { this.btnClicked = index + 1; this.btnStatus = 'loading'; this.btnName = name; let data = new FormData(); data.append( 'action', 'sbi_deactivate_addon' ); data.append( 'nonce', this.nonce ); data.append( 'plugin', plugin ); data.append( 'type', 'plugin' ); if ( this.extentions_bundle && type == 'extension' ) { data.append( 'extensions_bundle', this.extentions_bundle ); } fetch(this.ajax_handler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if( data.success == true ) { if ( name === 'social_wall' ) { this.social_wall.activated = false; } else if ( type === 'recommended_plugin' ) { this.recommendedPlugins[name].activated = false; } else { this.plugins[name].activated = false; } this.btnClicked = null; this.btnName = null; this.btnStatus = null; } return; }); }, installPlugin: function( plugin, name, index, type ) { this.btnClicked = index + 1; this.btnStatus = 'loading'; this.btnName = name; let data = new FormData(); data.append( 'action', 'sbi_install_addon' ); data.append( 'nonce', this.nonce ); data.append( 'plugin', plugin ); data.append( 'type', 'plugin' ); fetch(this.ajax_handler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if( data.success == true ) { if ( type === 'recommended_plugin' ) { this.recommendedPlugins[name].installed = true; this.recommendedPlugins[name].activated = true; } else { this.plugins[name].installed = true; this.plugins[name].activated = true; } this.btnClicked = null; this.btnName = null; this.btnStatus = null; } return; }); }, buttonIcon: function() { if ( this.btnStatus == 'loading' ) { return this.icons.loaderSVG } }, /** * Toggle Sticky Widget view * * @since 4.0 */ toggleStickyWidget: function() { this.stickyWidget = !this.stickyWidget; }, } })PKL\GbHbH%instagram-feed/admin/SBI_About_Us.phpnu[init(); } /** * Determining if the user is viewing the our page, if so, party on. * * @since 4.0 */ public function init() { if ( ! is_admin() ) { return; } add_action( 'admin_menu', [ $this, 'register_menu' ] ); } /** * Register Menu. * * @since 4.0 */ public function register_menu() { $cap = current_user_can( 'manage_instagram_feed_options' ) ? 'manage_instagram_feed_options' : 'manage_options'; $cap = apply_filters( 'sbi_settings_pages_capability', $cap ); $about_us = add_submenu_page( 'sb-instagram-feed', __( 'About Us', 'instagram-feed' ), __( 'About Us', 'instagram-feed' ), $cap, self::SLUG, [$this, 'about_us'], 4 ); add_action( 'load-' . $about_us, [$this,'about_us_enqueue_assets']); } /** * Enqueue About Us Page CSS & Script. * * Loads only for About Us page * * @since 4.0 */ public function about_us_enqueue_assets(){ if( ! get_current_screen() ) { return; } $screen = get_current_screen(); if ( ! 'instagram-feed_page_sbi-about-us' === $screen->id ) { return; } wp_enqueue_style( 'about-style', SBI_PLUGIN_URL . 'admin/assets/css/about.css', false, SBIVER ); wp_enqueue_script( 'sb-vue', SBI_PLUGIN_URL . 'js/vue.min.js', null, '2.6.12', true ); wp_enqueue_script( 'about-app', SBI_PLUGIN_URL.'admin/assets/js/about.js', null, SBIVER, true ); $sbi_about = $this->page_data(); wp_localize_script( 'about-app', 'sbi_about', $sbi_about ); } /** * Page Data to use in front end * * @since 4.0 * * @return array */ public function page_data() { // get the WordPress's core list of installed plugins if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $license_key = null; if ( get_option('sbi_license_key') ) { $license_key = get_option('sbi_license_key'); } $installed_plugins = get_plugins(); $images_url = SBI_PLUGIN_URL . 'admin/assets/img/about/'; // check whether the pro or free plugins are installed $is_facebook_installed = false; $facebook_plugin = 'custom-facebook-feed/custom-facebook-feed.php'; if ( isset( $installed_plugins['custom-facebook-feed-pro/custom-facebook-feed.php'] ) ) { $is_facebook_installed = true; $facebook_plugin = 'custom-facebook-feed-pro/custom-facebook-feed.php'; } else if ( isset( $installed_plugins['custom-facebook-feed/custom-facebook-feed.php'] ) ) { $is_facebook_installed = true; } $is_instagram_installed = false; $instagram_plugin = 'instagram-feed/instagram-feed.php'; if ( isset( $installed_plugins['instagram-feed-pro/instagram-feed.php'] ) ) { $is_instagram_installed = true; $instagram_plugin = 'instagram-feed-pro/instagram-feed.php'; } else if ( isset( $installed_plugins['instagram-feed/instagram-feed.php'] ) ) { $is_instagram_installed = true; } $is_twitter_installed = false; $twitter_plugin = 'custom-twitter-feeds/custom-twitter-feed.php'; if ( isset( $installed_plugins['custom-twitter-feeds-pro/custom-twitter-feed.php'] ) ) { $is_twitter_installed = true; $twitter_plugin = 'custom-twitter-feeds-pro/custom-twitter-feed.php'; } else if ( isset( $installed_plugins['custom-twitter-feeds/custom-twitter-feed.php'] ) ) { $is_twitter_installed = true; } $is_youtube_installed = false; $youtube_plugin = 'feeds-for-youtube/youtube-feed.php'; if ( isset( $installed_plugins['youtube-feed-pro/youtube-feed.php'] ) ) { $is_youtube_installed = true; $youtube_plugin = 'youtube-feed-pro/youtube-feed.php'; } else if ( isset( $installed_plugins['feeds-for-youtube/youtube-feed.php'] ) ) { $is_youtube_installed = true; } $return = array( 'admin_url' => admin_url(), 'supportPageUrl' => admin_url( 'admin.php?page=sbi-support' ), 'ajax_handler' => admin_url( 'admin-ajax.php' ), 'links' => \InstagramFeed\Builder\SBI_Feed_Builder::get_links_with_utm(), 'nonce' => wp_create_nonce( 'sbi-admin' ), 'socialWallLinks' => \InstagramFeed\Builder\SBI_Feed_Builder::get_social_wall_links(), 'socialWallActivated' => is_plugin_active( 'social-wall/social-wall.php' ), 'genericText' => array( 'help' => __( 'Help', 'instagram-feed' ), 'title' => __( 'About Us', 'instagram-feed' ), 'title2' => __( 'Our Other Social Media Feed Plugins', 'instagram-feed' ), 'title3' => __( 'Plugins we recommend', 'instagram-feed' ), 'description2' => __( 'We’re more than just an Instagram plugin! Check out our other plugins and add more content to your site.', 'instagram-feed' ), ), 'aboutBox' => array( 'atSmashBalloon' => __( 'At Smash Balloon, we build software that helps you create beautiful responsive social media feeds for your website in minutes.', 'instagram-feed' ), 'weAreOn' => __( 'We\'re on a mission to make it super simple to add social media feeds in WordPress. No more complicated setup steps, ugly iframe widgets, or negative page speed scores.', 'instagram-feed' ), 'ourPlugins' => __( 'Our plugins aren\'t just easy to use, but completely customizable, reliable, and fast! Which is why over 1.6 million awesome users, just like you, choose to use them on their site.', 'instagram-feed' ), 'teamAvatar' => SBI_PLUGIN_URL . 'admin/assets/img/team-avatar.png', 'teamImgAlt' => __( 'Smash Balloon Team', 'instagram-feed' ), ), 'pluginsInfo' => array( 'instagram' => array( 'plugin' => $instagram_plugin, 'download_plugin' => 'https://downloads.wordpress.org/plugin/instagram-feed.zip', 'title' => __( 'Instagram Feed', 'instagram-feed' ), 'description' => __( 'A quick and elegant way to add your Instagram posts to your website. ', 'instagram-feed' ), 'icon' => SBI_PLUGIN_URL . 'admin/assets/img/insta-icon.svg', 'installed' => $is_instagram_installed, 'activated' => is_plugin_active( $instagram_plugin ), ), 'facebook' => array( 'plugin' => $facebook_plugin, 'title' => __( 'Custom Facebook Feed', 'instagram-feed' ), 'description' => __( 'Add Facebook posts from your timeline, albums and much more.', 'instagram-feed' ), 'icon' => SBI_PLUGIN_URL . 'admin/assets/img/fb-icon.svg', 'installed' => $is_facebook_installed, 'activated' => is_plugin_active( $facebook_plugin ), ), 'twitter' => array( 'plugin' => $twitter_plugin, 'download_plugin' => 'https://downloads.wordpress.org/plugin/custom-twitter-feeds.zip', 'title' => __( 'Custom Twitter Feeds', 'instagram-feed' ), 'description' => __( 'A customizable way to display tweets from your Twitter account. ', 'instagram-feed' ), 'icon' => SBI_PLUGIN_URL . 'admin/assets/img/twitter-icon.svg', 'installed' => $is_twitter_installed, 'activated' => is_plugin_active( $twitter_plugin ), ), 'youtube' => array( 'plugin' => $youtube_plugin, 'download_plugin' => 'https://downloads.wordpress.org/plugin/feeds-for-youtube.zip', 'title' => __( 'Feeds for YouTube', 'instagram-feed' ), 'description' => __( 'A simple yet powerful way to display videos from YouTube. ', 'instagram-feed' ), 'icon' => SBI_PLUGIN_URL . 'admin/assets/img/youtube-icon.svg', 'installed' => $is_youtube_installed, 'activated' => is_plugin_active( $youtube_plugin ), ) ), 'social_wall' => array( 'plugin' => 'social-wall/social-wall.php', 'title' => __( 'Social Wall', 'instagram-feed' ), 'description' => __( 'Combine feeds from all of our plugins into a single wall', 'instagram-feed' ), 'graphic' => SBI_PLUGIN_URL . 'admin/assets/img/social-wall-graphic.png', 'permalink' => sprintf('https://smashballoon.com/social-wall/demo?license_key=%s&upgrade=true&utm_campaign=instagram-free&utm_source=about&utm_medium=social-wall', $license_key), 'installed' => isset( $installed_plugins['social-wall/social-wall.php'] ) ? true : false, 'activated' => is_plugin_active('social-wall/social-wall.php'), ), 'recommendedPlugins' => array( 'aioseo' => array( 'plugin' => 'all-in-one-seo-pack/all_in_one_seo_pack.php', 'download_plugin' => 'https://downloads.wordpress.org/plugin/all-in-one-seo-pack.zip', 'title' => __( 'All in One SEO Pack', 'instagram-feed' ), 'description' => __( 'The original WordPress SEO plugin and toolkit that improves your website’s search rankings. Comes with all the SEO features like Local SEO, WooCommerce SEO, sitemaps, SEO optimizer, schema, and more.', 'instagram-feed' ), 'icon' => $images_url . 'plugin-seo.png', 'installed' => isset( $installed_plugins['all-in-one-seo-pack/all_in_one_seo_pack.php'] ) ? true : false, 'activated' => is_plugin_active('all-in-one-seo-pack/all_in_one_seo_pack.php'), ), 'wpforms' => array( 'plugin' => 'wpforms-lite/wpforms.php', 'download_plugin' => 'https://downloads.wordpress.org/plugin/wpforms-lite.zip', 'title' => __( 'WPForms', 'instagram-feed' ), 'description' => __( 'The best drag & drop WordPress form builder. Easily create beautiful contact forms, surveys, payment forms, and more with our 900+ form templates. Trusted by over 6 million websites as the best forms plugin.', 'instagram-feed' ), 'icon' => $images_url . 'plugin-wpforms.png', 'installed' => isset( $installed_plugins['wpforms-lite/wpforms.php'] ) ? true : false, 'activated' => is_plugin_active('wpforms-lite/wpforms.php'), ), 'monsterinsights' => array( 'plugin' => 'google-analytics-for-wordpress/googleanalytics.php', 'download_plugin' => 'https://downloads.wordpress.org/plugin/google-analytics-for-wordpress.zip', 'title' => __( 'MonsterInsights', 'instagram-feed' ), 'description' => __( 'The leading WordPress analytics plugin that shows you how people find and use your website, so you can make data driven decisions to grow your business. Properly set up Google Analytics without writing code.', 'instagram-feed' ), 'icon' => $images_url . 'plugin-mi.png', 'installed' => isset( $installed_plugins['google-analytics-for-wordpress/googleanalytics.php'] ) ? true : false, 'activated' => is_plugin_active('google-analytics-for-wordpress/googleanalytics.php'), ), 'optinmonster' => array( 'plugin' => 'optinmonster/optin-monster-wp-api.php', 'download_plugin' => 'https://downloads.wordpress.org/plugin/optinmonster.zip', 'title' => __( 'OptinMonster', 'instagram-feed' ), 'description' => __( 'Instantly get more subscribers, leads, and sales with the #1 conversion optimization toolkit. Create high converting popups, announcement bars, spin a wheel, and more with smart targeting and personalization.', 'instagram-feed' ), 'icon' => $images_url . 'plugin-om.png', 'installed' => isset( $installed_plugins['optinmonster/optin-monster-wp-api.php'] ) ? true : false, 'activated' => is_plugin_active('optinmonster/optin-monster-wp-api.php'), ), 'wp_mail_smtp' => array( 'plugin' => 'wp-mail-smtp/wp_mail_smtp.php', 'download_plugin' => 'https://downloads.wordpress.org/plugin/wp-mail-smtp.zip', 'title' => __( 'WP Mail SMTP', 'instagram-feed' ), 'description' => __( 'Improve your WordPress email deliverability and make sure that your website emails reach user’s inbox with the #1 SMTP plugin for WordPress. Over 3 million websites use it to fix WordPress email issues.', 'instagram-feed' ), 'icon' => $images_url . 'plugin-smtp.png', 'installed' => isset( $installed_plugins['wp-mail-smtp/wp_mail_smtp.php'] ) ? true : false, 'activated' => is_plugin_active('wp-mail-smtp/wp_mail_smtp.php'), ), 'rafflepress' => array( 'plugin' => 'rafflepress/rafflepress.php', 'download_plugin' => 'https://downloads.wordpress.org/plugin/rafflepress.zip', 'title' => __( 'RafflePress', 'instagram-feed' ), 'description' => __( 'Turn your website visitors into brand ambassadors! Easily grow your email list, website traffic, and social media followers with the most powerful giveaways & contests plugin for WordPress.', 'instagram-feed' ), 'icon' => $images_url . 'plugin-rp.png', 'installed' => isset( $installed_plugins['rafflepress/rafflepress.php'] ) ? true : false, 'activated' => is_plugin_active('rafflepress/rafflepress.php'), ), 'seedprod' => array( 'plugin' => 'coming-soon/coming-soon.php', 'download_plugin' => 'https://downloads.wordpress.org/plugin/coming-soon.zip', 'title' => __( 'SeedProd Website Builder', 'instagram-feed' ), 'description' => __( 'The fastest drag & drop landing page builder for WordPress. Create custom landing pages without writing code, connect a CRM, collect subscribers, and grow an audience. Trusted by 1 million sites.', 'instagram-feed' ), 'icon' => $images_url . 'plugin-seedProd.png', 'installed' => isset( $installed_plugins['coming-soon/coming-soon.php'] ) ? true : false, 'activated' => is_plugin_active('coming-soon/coming-soon.php'), ), 'pushengage' => array( 'plugin' => 'pushengage/main.php', 'download_plugin' => 'https://downloads.wordpress.org/plugin/pushengage.zip', 'title' => __( 'PushEngage Web Push Notifications', 'instagram-feed' ), 'description' => __( 'Connect with your visitors after they leave your website with the leading web push notification software. Over 10,000+ businesses worldwide use PushEngage to send 15 billion notifications each month.', 'instagram-feed' ), 'icon' => $images_url . 'plugin-pushengage.png', 'installed' => isset( $installed_plugins['cpushengage/main.php'] ) ? true : false, 'activated' => is_plugin_active('pushengage/main.php'), ) ), 'buttons' => array( 'add' => __( 'Add', 'instagram-feed' ), 'viewDemo' => __( 'View Demo', 'instagram-feed' ), 'install' => __( 'Install', 'instagram-feed' ), 'installed' => __( 'Installed', 'instagram-feed' ), 'activate' => __( 'Activate', 'instagram-feed' ), 'deactivate' => __( 'Deactivate', 'instagram-feed' ), 'open' => __( 'Open', 'instagram-feed' ), ), 'icons' => array( 'plusIcon' => '', 'loaderSVG' => '', 'checkmarkSVG' => '', 'link' => '' ), ); return $return; } /** * About Us Page View Template * * @since 4.0 */ public function about_us(){ SBI_View::render( 'about.index' ); } } PKL\;CzCz$instagram-feed/admin/SBI_Support.phpnu[init(); } /** * Determining if the user is viewing the our page, if so, party on. * * @since 6.0 */ public function init() { if ( ! is_admin() ) { return; } add_action( 'admin_menu', array( $this, 'register_menu' ) ); } /** * Register Menu. * * @since 6.0 */ public function register_menu() { $cap = current_user_can( 'manage_instagram_feed_options' ) ? 'manage_instagram_feed_options' : 'manage_options'; $cap = apply_filters( 'sbi_settings_pages_capability', $cap ); $support_page = add_submenu_page( 'sb-instagram-feed', __( 'Support', 'instagram-feed' ), __( 'Support', 'instagram-feed' ), $cap, self::SLUG, array( $this, 'support_page' ), 4 ); add_action( 'load-' . $support_page, array( $this, 'support_page_enqueue_assets' ) ); } /** * Enqueue Extension CSS & Script. * * Loads only for Extension page * * @since 6.0 */ public function support_page_enqueue_assets() { if ( ! get_current_screen() ) { return; } $screen = get_current_screen(); if ( strpos( $screen->id, 'sbi-support' ) === false) { return; } wp_enqueue_style( 'sbi-fira-code-font', 'https://fonts.googleapis.com/css2?family=Fira+Code&display=swap', false, SBIVER ); wp_enqueue_style( 'global-style', SBI_PLUGIN_URL . 'admin/builder/assets/css/global.css', false, SBIVER ); wp_enqueue_style( 'support-style', SBI_PLUGIN_URL . 'admin/assets/css/support.css', false, SBIVER ); wp_enqueue_script( 'sb-vue', SBI_PLUGIN_URL . 'js/vue.min.js', null, '2.6.12', true ); wp_enqueue_script( 'support-app', SBI_PLUGIN_URL . 'admin/assets/js/support.js', null, SBIVER, true ); $sbi_support = $this->page_data(); wp_localize_script( 'support-app', 'sbi_support', $sbi_support ); } /** * Page Data to use in front end * * @since 6.0 * * @return array */ public function page_data() { $exported_feeds = SBI_Db::feeds_query(); $feeds = array(); foreach ( $exported_feeds as $feed_id => $feed ) { $feeds[] = array( 'id' => $feed['id'], 'name' => $feed['feed_name'], ); } $return = array( 'admin_url' => admin_url(), 'ajax_handler' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'sbi-admin' ), 'links' => \InstagramFeed\Builder\SBI_Feed_Builder::get_links_with_utm(), 'supportPageUrl' => admin_url( 'admin.php?page=sbi-support' ), 'siteSearchUrl' => 'https://smashballoon.com/search/', 'system_info' => $this->get_system_info(), 'system_info_n' => str_replace( '
', "\n", $this->get_system_info() ), 'feeds' => $feeds, 'supportUrl' => $this->get_support_url(), 'svgIcons' => SBI_Feed_Builder::builder_svg_icons(), 'socialWallLinks' => \InstagramFeed\Builder\SBI_Feed_Builder::get_social_wall_links(), 'tempUser' => \InstagramFeed\Admin\SBI_Support_Tool::check_temporary_user_exists(), 'socialWallActivated' => is_plugin_active( 'social-wall/social-wall.php' ), 'genericText' => array( 'delete' => __( 'delete', 'instagram-feed' ), 'copyLink' => __( 'Copy Link', 'instagram-feed' ), 'link' => __( 'Link', 'instagram-feed' ), 'expires' => __( 'Expires in', 'instagram-feed' ), 'help' => __( 'Help', 'instagram-feed' ), 'title' => __( 'Support', 'instagram-feed' ), 'gettingStarted' => __( 'Getting Started', 'instagram-feed' ), 'learnMore' => __( 'Learn More', 'instagram-feed' ), 'someHelpful' => __( 'Some helpful resources to get you started', 'instagram-feed' ), 'docsN' => __( 'Docs & Troubleshooting', 'instagram-feed' ), 'runInto' => __( 'Run into an issue? Check out our help docs.', 'instagram-feed' ), 'additionalR' => __( 'Additional Resources', 'instagram-feed' ), 'toHelp' => __( 'To help you get the most out of the plugin', 'instagram-feed' ), 'needMore' => __( 'Need more support? We’re here to help.', 'instagram-feed' ), 'ourFast' => __( 'Our fast and friendly support team is always happy to help!', 'instagram-feed' ), 'systemInfo' => __( 'System Info', 'instagram-feed' ), 'exportSettings' => __( 'Export Settings', 'instagram-feed' ), 'shareYour' => __( 'Share your plugin settings easily with Support', 'instagram-feed' ), 'copiedToClipboard' => __( 'Copied to clipboard', 'instagram-feed' ), 'days' => __( 'Days', 'instagram-feed' ), 'day' => __( 'Day', 'instagram-feed' ), 'newTempHeading' => __( 'Temporary Login', 'instagram-feed' ), 'newTempDesc' => __( 'Our team might ask for a temporary login link with limited access to only our plugin to help troubleshoot account related issues.', 'instagram-feed' ), 'newTempButton' => __( 'Create Temporary Login Link', 'instagram-feed' ), 'tempLoginHeading' => __( 'Temporary Login', 'instagram-feed' ), 'tempLoginDesc' => __( 'Temporary login link for support access created by you. This is auto-destructed 14 days after creation. To create a new link, please delete the old one.', 'instagram-feed' ), ), 'buttons' => array( 'searchDoc' => __( 'Search Documentation', 'instagram-feed' ), 'moreHelp' => __( 'More Help Getting Started', 'instagram-feed' ), 'viewDoc' => __( 'View Documentation', 'instagram-feed' ), 'viewBlog' => __( 'View Blog', 'instagram-feed' ), 'submitTicket' => __( 'Submit a Support Ticket', 'instagram-feed' ), 'copied' => __( 'Copied', 'instagram-feed' ), 'copy' => __( 'Copy', 'instagram-feed' ), 'export' => __( 'Export', 'instagram-feed' ), 'expand' => __( 'Expand', 'instagram-feed' ), 'collapse' => __( 'Collapse', 'instagram-feed' ), ), 'icons' => array( 'rocket' => SBI_PLUGIN_URL . 'admin/assets/img/rocket-icon.svg', 'book' => SBI_PLUGIN_URL . 'admin/assets/img/book-icon.svg', 'save' => SBI_PLUGIN_URL . 'admin/assets/img/save-plus-icon.svg', 'magnify' => '', 'rightAngle' => '', 'linkIcon' => '', 'plusIcon' => '', 'loaderSVG' => '', 'checkmarkSVG' => '', 'forum' => '', 'copy' => '', 'downAngle' => '', 'exportSVG' => '', ), 'images' => array( 'supportMembers' => SBI_PLUGIN_URL . 'admin/assets/img/support-members.png', ), 'articles' => array( 'gettingStarted' => array( array( 'title' => __( 'Creating your first Instagram feed', 'instagram-feed' ), 'link' => 'https://smashballoon.com/doc/setting-up-the-instagram-feed-pro-wordpress-plugin/?utm_campaign=instagram-free&utm_source=support&utm_medium=docs&utm_content=Creating your first Instagram feed', ), array( 'title' => __( 'Instagram Business Profiles (required for Hashtag and Tagged feeds)', 'instagram-feed' ), 'link' => 'https://smashballoon.com/doc/instagram-business-profiles/?utm_campaign=instagram-free&utm_source=support&utm_medium=docs&utm_content=Instagram Business Profiles', ), array( 'title' => __( 'Multiple User Accounts in One Feed', 'instagram-feed' ), 'link' => 'https://smashballoon.com/doc/displaying-photos-multiple-ids-hashtags-feed/?utm_campaign=instagram-free&utm_source=support&utm_medium=docs&utm_content=Multiple Users', ), ), 'docs' => array( array( 'title' => __( 'Displaying Instagram Hashtag Feeds', 'instagram-feed' ), 'link' => 'https://smashballoon.com/doc/displaying-an-instagram-hashtag-feed-on-your-website/?utm_campaign=instagram-free&utm_source=support&utm_medium=docs&utm_content=Displaying an Instagram Hashtag Feed', ), array( 'title' => __( 'How to Resolve Error Messages', 'instagram-feed' ), 'link' => 'https://smashballoon.com/doc/instagram-api-error-message-reference/?utm_campaign=instagram-free&utm_source=support&utm_medium=docs&utm_content=Instagram resolving error messages', ), array( 'title' => __( 'My Feed Stopped Working or is Empty', 'instagram-feed' ), 'link' => 'https://smashballoon.com/doc/my-photos-wont-load/?utm_campaign=instagram-free&utm_source=support&utm_medium=docs&utm_content=My feed stopped working', ), ), 'resources' => array( array( 'title' => __( 'Differences Between an Instagram Personal and Business Account', 'instagram-feed' ), 'link' => 'https://smashballoon.com/doc/differences-between-an-instagram-personal-and-business-account/?utm_campaign=instagram-free&utm_source=support&utm_medium=docs&utm_content=Differences between a business and personal account', ), array( 'title' => __( 'Display Posts With a Specific Hashtag From a Specific User Account', 'instagram-feed' ), 'link' => 'https://smashballoon.com/doc/can-display-photos-specific-hashtag-specific-user-id/?utm_campaign=instagram-free&utm_source=support&utm_medium=docs&utm_content=Display a specific hashtag from a specific account', ), array( 'title' => __( 'Reauthorizing our Instagram/Facebook App', 'instagram-feed' ), 'link' => 'https://smashballoon.com/doc/reauthorizing-our-instagram-facebook-app/?utm_campaign=instagram-free&utm_source=support&utm_medium=docs&utm_content=Reauthorizing the Instagram or FB app', ), ), ), ); return $return; } /** * Get System Info * * @since 6.0 */ public function get_system_info() { $output = ''; // Build the output strings $output .= self::get_site_n_server_info(); $output .= self::get_active_plugins_info(); $output .= self::get_global_settings_info(); $output .= self::get_feeds_settings_info(); $output .= self::get_sources_info(); $output .= self::get_image_resizing_info(); $output .= self::get_posts_table_info(); $output .= self::get_cron_report(); $output .= self::get_errors_info(); $output .= self::get_action_logs_info(); $output .= self::get_oembeds_info(); return $output; } /** * Get Site and Server Info * * @since 6.0 * * @return string */ public static function get_site_n_server_info() { $allow_url_fopen = ini_get( 'allow_url_fopen' ) ? 'Yes' : 'No'; $php_curl = is_callable( 'curl_init' ) ? 'Yes' : 'No'; $php_json_decode = function_exists( 'json_decode' ) ? 'Yes' : 'No'; $php_ssl = in_array( 'https', stream_get_wrappers(), true ) ? 'Yes' : 'No'; $output = '## SITE/SERVER INFO: ##
'; $output .= 'Plugin Version:' . self::get_whitespace( 11 ) . esc_html( SBI_PLUGIN_NAME ) . '
'; $output .= 'Site URL:' . self::get_whitespace( 17 ) . esc_html( site_url() ) . '
'; $output .= 'Home URL:' . self::get_whitespace( 17 ) . esc_html( home_url() ) . '
'; $output .= 'WordPress Version:' . self::get_whitespace( 8 ) . esc_html( get_bloginfo( 'version' ) ) . '
'; $output .= 'PHP Version:' . self::get_whitespace( 14 ) . esc_html( PHP_VERSION ) . '
'; $output .= 'Web Server Info:' . self::get_whitespace( 10 ) . esc_html( $_SERVER['SERVER_SOFTWARE'] ) . '
'; $output .= 'PHP allow_url_fopen:' . self::get_whitespace( 6 ) . esc_html( $allow_url_fopen ) . '
'; $output .= 'PHP cURL:' . self::get_whitespace( 17 ) . esc_html( $php_curl ) . '
'; $output .= 'JSON:' . self::get_whitespace( 21 ) . esc_html( $php_json_decode ) . '
'; $output .= 'SSL Stream:' . self::get_whitespace( 15 ) . esc_html( $php_ssl ) . '
'; $output .= '
'; return $output; } /** * Get Active Plugins * * @since 6.0 * * @return string */ public static function get_active_plugins_info() { $plugins = get_plugins(); $active_plugins = get_option( 'active_plugins' ); $output = '## ACTIVE PLUGINS: ##
'; foreach ( $plugins as $plugin_path => $plugin ) { if ( in_array( $plugin_path, $active_plugins, true ) ) { $output .= esc_html( $plugin['Name'] ) . ': ' . esc_html( $plugin['Version'] ) . '
'; } } $output .= '
'; return $output; } /** * Get Global Settings * * @since 6.0 * * @return string */ public static function get_global_settings_info() { $output = '## GLOBAL SETTINGS: ##
'; $sbi_license_key = get_option( 'sbi_license_key' ); $sbi_license_data = get_option( 'sbi_license_data' ); $sbi_license_status = get_option( 'sbi_license_status' ); $sbi_settings = get_option( 'sb_instagram_settings', array() ); $usage_tracking = get_option( 'sbi_usage_tracking', array( 'last_send' => 0, 'enabled' => \sbi_is_pro_version(), ) ); $output .= 'License key: '; if ( $sbi_license_key ) { $output .= esc_html( $sbi_license_key ); } else { $output .= ' Not added'; } $output .= '
'; $output .= 'License status: '; if ( $sbi_license_status ) { $output .= $sbi_license_status; } else { $output .= ' Inactive'; } $output .= '
'; $output .= 'Preserve settings if plugin is removed: '; $output .= ( $sbi_settings['sb_instagram_preserve_settings'] ) ? 'Yes' : 'No'; $output .= '
'; $output .= 'Connected Accounts: '; $output .= 'Placeholder!'; $output .= '
'; $output .= 'Caching: '; if ( wp_next_scheduled( 'sbi_feed_update' ) ) { $time_format = get_option( 'time_format' ); if ( ! $time_format ) { $time_format = 'g:i a'; } // $schedule = wp_get_schedule( 'sbi_feed_update' ); if ( $schedule === '30mins' ) { $schedule = __( 'every 30 minutes', 'instagram-feed' ); } if ( $schedule === 'twicedaily' ) { $schedule = __( 'every 12 hours', 'instagram-feed' ); } $sbi_next_cron_event = wp_next_scheduled( 'sbi_feed_update' ); $output = __( 'Next check', 'instagram-feed' ) . ': ' . gmdate( $time_format, $sbi_next_cron_event + sbi_get_utc_offset() ) . ' (' . $schedule . ')'; } else { $output .= 'Nothing currently scheduled'; } $output .= '
'; $output .= 'GDPR: '; $output .= isset( $sbi_settings['gdpr'] ) ? $sbi_settings['gdpr'] : ' Not setup'; $output .= '
'; $output .= 'Custom CSS: '; $output .= isset( $sbi_settings['sb_instagram_custom_css'] ) && ! empty( $sbi_settings['sb_instagram_custom_css'] ) ? wp_strip_all_tags( $sbi_settings['sb_instagram_custom_css'] ) : 'Empty'; $output .= '
'; $output .= 'Custom JS: '; $output .= isset( $sbi_settings['sb_instagram_custom_js'] ) && ! empty( $sbi_settings['sb_instagram_custom_js'] ) ? $sbi_settings['sb_instagram_custom_js'] : 'Empty'; $output .= '
'; $output .= 'Optimize Images: '; $output .= isset( $sbi_settings['sb_instagram_disable_resize'] ) && ! $sbi_settings['sb_instagram_disable_resize'] ? 'Enabled' : 'Disabled'; $output .= '
'; $output .= 'Usage Tracking: '; $output .= isset( $usage_tracking['enabled'] ) && $usage_tracking['enabled'] === true ? 'Enabled' : 'Disabled'; $output .= '
'; $output .= 'AJAX theme loading fix: '; $output .= isset( $sbi_settings['sb_instagram_ajax_theme'] ) && $sbi_settings['sb_instagram_ajax_theme'] ? 'Enabled' : 'Disabled'; $output .= '
'; $output .= 'AJAX Initial: '; $output .= isset( $sbi_settings['sb_ajax_initial'] ) && $sbi_settings['sb_ajax_initial'] === true ? 'Enabled' : 'Disabled'; $output .= '
'; $output .= 'Enqueue in Head: '; $output .= isset( $sbi_settings['enqueue_js_in_head'] ) && $sbi_settings['enqueue_js_in_head'] === true ? 'Enabled' : 'Disabled'; $output .= '
'; $output .= 'Enqueue in Shortcode: '; $output .= isset( $sbi_settings['enqueue_css_in_shortcode'] ) && $sbi_settings['enqueue_css_in_shortcode'] === true ? 'Enabled' : 'Disabled'; $output .= '
'; $output .= 'Enable JS Image: '; $output .= isset( $sbi_settings['disable_js_image_loading'] ) && $sbi_settings['disable_js_image_loading'] === false ? 'Enabled' : 'Disabled'; $output .= '
'; $output .= 'Admin Error Notice: '; $output .= isset( $sbi_settings['disable_admin_notice'] ) && $sbi_settings['disable_admin_notice'] === false ? 'Enabled' : 'Disabled'; $output .= '
'; $output .= 'Feed Issue Email Reports: '; $output .= isset( $sbi_settings['enable_email_report'] ) && $sbi_settings['enable_email_report'] === true ? 'Enabled' : 'Disabled'; $output .= '
'; $output .= 'Email notification: '; $output .= isset( $sbi_settings['email_notification'] ) && $sbi_settings['email_notification'] !== null ? ucfirst( $sbi_settings['email_notification'] ) : 'Off'; $output .= '
'; $output .= 'Email notification addresses: '; $output .= isset( $sbi_settings['email_notification_addresses'] ) && ! empty( $sbi_settings['email_notification_addresses'] ) ? sanitize_email( $sbi_settings['email_notification_addresses'] ) : 'Not available'; $output .= '
'; $output .= '
'; return $output; } /** * Get Feeds Settings * * @since 6.0 * * @return string */ public static function get_feeds_settings_info() { $output = '## FEEDS: ##
'; $feeds_list = SBI_Feed_Builder::get_feed_list(); $source_list = SBI_Feed_Builder::get_source_list(); $manager = new \SB_Instagram_Data_Manager(); $i = 0; foreach ( $feeds_list as $feed ) { $type = ! empty( $feed['settings']['type'] ) ? $feed['settings']['type'] : 'user'; if ( $i >= 25 ) { break; } $output .= $feed['feed_name']; if ( isset( $feed['settings'] ) ) { $output .= ' - ' . ucfirst( $type ); $output .= '
'; if ( ! empty( $feed['settings']['sources'] ) ) { foreach ( $feed['settings']['sources'] as $id => $source ) { $output .= esc_html( $source['username'] ); $output .= ' (' . esc_html( $id ) . ')'; } } } $output .= '
'; if ( isset( $feed['location_summary'] ) && count( $feed['location_summary'] ) > 0 ) { $first_feed = $feed['location_summary'][0]; if ( ! empty( $first_feed['link'] ) ) { $output .= esc_html( $first_feed['link'] ) . '?sb_debug'; $output .= '
'; } } if ( $i < ( count( $feeds_list ) - 1 ) ) { $output .= '
'; } $i++; } $output .= '
'; return $output; } /** * Get Feeds Settings * * @since 6.0 * * @return string */ public static function get_sources_info() { $output = '## SOURCES TABLE: ##
'; global $wpdb; $sources_table_name = $wpdb->prefix . 'sbi_sources'; if ($wpdb->get_var("show tables like '$sources_table_name'") !== $sources_table_name) { $output .= 'no sources table

'; } else { $output .= 'sources table exists

'; } $output .= '## Sources: ##
'; $source_list = SBI_Feed_Builder::get_source_list(); $manager = new \SB_Instagram_Data_Manager(); foreach ( $source_list as $source ) { $output .= $source['account_id']; $output .= '
'; $output .= 'Type: ' . esc_html( $source['account_type'] ); $output .= '
'; $output .= 'Username: ' . esc_html( $source['username'] ); $output .= '
'; $output .= 'Error: ' . esc_html( $source['error'] ); $output .= '
'; $output .= '
'; } $output .= '
'; return $output; } /** * Get Reports * * @since 6.0 * * @return string */ public static function get_cron_report() { $output = '## Cron Cache Report: ##
'; $cron_report = get_option( 'sbi_cron_report', array() ); if ( ! empty( $cron_report ) ) { $output .= 'Time Ran: ' . esc_html( $cron_report['notes']['time_ran'] ); $output .= "
"; $output .= 'Found Feeds: ' . esc_html( $cron_report['notes']['num_found_transients'] ); $output .= "
"; $output .= "
"; foreach ( $cron_report as $key => $value ) { if ( $key !== 'notes' ) { $output .= esc_html( $key ) . ':'; $output .= "
"; if ( ! empty( $value['last_retrieve'] ) ) { $output .= 'Last Retrieve: ' . esc_html( $value['last_retrieve'] ); $output .= "
"; } $output .= 'Did Update: ' . esc_html( $value['did_update'] ); $output .= "
"; $output .= "
"; } } } else { $output .= "
"; } $cron = _get_cron_array(); foreach ( $cron as $key => $data ) { $is_target = false; foreach ( $data as $key2 => $val ) { if ( strpos( $key2, 'sbi' ) !== false || strpos( $key2, 'sb_instagram' ) !== false ) { $is_target = true; $output .= esc_html( $key2 ); $output .= "
"; } } if ( $is_target ) { $output .= esc_html( date( 'Y-m-d H:i:s', $key ) ); $output .= "
"; $output .= esc_html( 'Next Scheduled: ' . round( ( (int) $key - time() ) / 60 ) . ' minutes' ); $output .= "
"; $output .= "
"; } } return $output; } /** * Get Image Resizing Info * * @since 6.0 * * @return string */ public static function get_image_resizing_info() { $output = '## IMAGE RESIZING: ##
'; $upload = wp_upload_dir(); $upload_dir = $upload['basedir']; $upload_dir = trailingslashit( $upload_dir ) . SBI_UPLOADS_NAME; if ( file_exists( $upload_dir ) ) { $output .= 'upload directory exists
'; } else { $created = wp_mkdir_p( $upload_dir ); if ( ! $created ) { $output .= 'cannot create upload directory'; } } $output .= '
'; return $output; } /** * Get Posts Table Info * * @since 6.0 * * @return string */ public static function get_posts_table_info() { $output = '## POSTS: ##
'; global $wpdb; $table_name = $wpdb->prefix . SBI_INSTAGRAM_POSTS_TYPE; $feeds_posts_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEEDS_POSTS; if ( $wpdb->get_var( "show tables like '$feeds_posts_table_name'" ) !== $feeds_posts_table_name ) { $output .= 'no feeds posts table
'; } else { $last_result = $wpdb->get_results( "SELECT * FROM $feeds_posts_table_name ORDER BY id DESC LIMIT 1;" ); if ( is_array( $last_result ) && isset( $last_result[0] ) ) { $output .= '## FEEDS POSTS TABLE ##
'; foreach ( $last_result as $column ) { foreach ( $column as $key => $value ) { $output .= esc_html( $key ) . ': ' . esc_html( $value ) . '
'; } } } else { $output .= 'feeds posts has no rows'; $output .= '
'; } } $output .= '
'; if ( $wpdb->get_var( "show tables like '$table_name'" ) !== $table_name ) { $output .= 'no posts table
'; } else { $last_result = $wpdb->get_results( "SELECT * FROM $table_name ORDER BY id DESC LIMIT 1;" ); if ( is_array( $last_result ) && isset( $last_result[0] ) ) { // exclude the json_data column. $last_result = array_map( function ($row) { unset($row->json_data); return $row; }, $last_result ); $output .= '## POSTS TABLE ##'; $output .= '
'; foreach ( $last_result as $column ) { foreach ( $column as $key => $value ) { $output .= esc_html( $key ) . ': ' . esc_html( $value ) . '
'; } } } else { $output .= 'posts has no rows
'; } } $output .= '
'; return $output; } /** * SBI Get Errors Info * * @since 6.0 * * @return string */ public static function get_errors_info() { $output = '## ERRORS: ##
'; global $sb_instagram_posts_manager; $errors = $sb_instagram_posts_manager->get_errors(); if ( ! empty( $errors['resizing'] ) ) : $output .= '* Resizing *
'; $output .= esc_html( $errors['resizing'] ) . '
'; endif; if ( ! empty( $errors['database_create'] ) ) : $output .= '* Database Create *
'; $output .= esc_html( $errors['database_create'] ) . '
'; endif; if ( ! empty( $errors['upload_dir'] ) ) : $output .= '* Uploads Directory *
'; $output .= esc_html( $errors['upload_dir'] ) . '
'; endif; if ( ! empty( $errors['connection'] ) ) : $output .= '* API/WP_HTTP Request *
'; if ( is_array( $errors['connection'] ) ) { foreach ( $errors['connection'] as $con_error ) { if ( is_array( $con_error ) ) { foreach ( $con_error as $subcon_error ) { $output .= esc_html( $subcon_error ) . '
'; } } else { $output .= esc_html( $con_error ) . '
'; } } } else { $output .= esc_html( $errors['connection'] ); } endif; $output .= '
'; return $output; } /** * Get Action Logs Info * * @since 6.0 * * @return string */ public static function get_action_logs_info() { $output = '## ACTION LOG ##
'; global $sb_instagram_posts_manager; $actions = $sb_instagram_posts_manager->get_action_log(); if ( ! empty( $actions ) ) : foreach ( $actions as $action ) : $output .= strip_tags( $action ) . '
'; endforeach; endif; $output .= '
'; return $output; } /** * Get Feeds Settings * * @since 6.0 * * @return string */ public static function get_oembeds_info() { $output = '## OEMBED: ##
'; $oembed_token_settings = get_option( 'sbi_oembed_token', array() ); foreach ( $oembed_token_settings as $key => $value ) { if ( $key === 'access_token' ) { // do nothing we don't want to show the AT } else { $output .= esc_html( $key ) . ': ' . esc_html( $value ) . '
'; } } return $output; } /** * SBI Get Support URL * * @since 6.0 * * @return string $url */ public function get_support_url() { $url = 'https://smashballoon.com/instagram-feed/support/'; $license_type = sbi_is_pro_version() ? 'pro' : 'free'; $args = array(); $license_key = get_option( 'sbi_license_key' ); if ( $license_key ) { $license_key = sbi_encrypt_decrypt( 'encrypt', $license_key ); $args['license'] = $license_key; } $args['license_type'] = $license_type; $args['version'] = SBIVER; $url = add_query_arg( $args, $url ); return $url; } /** * SBI Get Whitespace * * @since 6.0 * * @param int $times * * @return string */ public static function get_whitespace( $times ) { return str_repeat( ' ', $times ); } /** * Extensions Manager Page View Template * * @since 6.0 */ public function support_page() { SBI_View::render( 'support.index' ); } } PK�����L\8>��>��)��instagram-feed/admin/SBI_Support_Tool.phpnu�[��������init(); } /** * SBI_Support_Tool initializer. * * @since 6.3 */ public function init() { $this->init_temp_login(); if ( ! is_admin() ) { return; } $this->ini_ajax_calls(); add_action( 'admin_menu', array( $this, 'register_menu' ) ); add_action( 'admin_footer', array( '\InstagramFeed\Admin\SBI_Support_Tool', 'delete_expired_users' ) ); } /** * Create New User Ajax Call * * @since 6.3 * * @return void */ public function ini_ajax_calls() { add_action( 'wp_ajax_sbi_create_temp_user', array( $this, 'create_temp_user_ajax_call' ) ); add_action( 'wp_ajax_sbi_delete_temp_user', array( $this, 'delete_temp_user_ajax_call' ) ); add_action('wp_ajax_sbi_get_api_calls_handler', array( $this, 'get_api_calls_handler' )); } /** * Create New User Ajax Call * * @since 6.3 */ public function delete_temp_user_ajax_call() { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } if ( ! isset( $_POST['userId'] ) ) { wp_send_json_error(); } $user_id = absint( $_POST['userId'] ); $return = self::delete_temporary_user( $user_id ); echo wp_json_encode( $return ); wp_die(); } /** * Create New User Ajax Call * * @since 6.3 */ public function create_temp_user_ajax_call() { check_ajax_referer( 'sbi-admin', 'nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $return = self::create_temporary_user(); echo wp_json_encode( $return ); wp_die(); } /** * Init Login * * @since 6.3 */ public function init_temp_login() { $attr = self::$plugin . '_token'; if ( empty( $_GET[ $attr ] ) ) { // phpcs:ignore return; } $token = sanitize_key( $_GET[ $attr ] ); // phpcs:ignore $temp_user = self::get_temporary_user_by_token( $token ); if ( ! $temp_user ) { wp_die( esc_attr__( 'You cannot connect this user', 'instagram-feed' ) ); } $user_id = $temp_user->ID; $should_login = ( is_user_logged_in() && $user_id !== get_current_user_id() ) || ! is_user_logged_in(); if ( $should_login ) { if ( $user_id !== get_current_user_id() ) { wp_logout(); } $user_login = $temp_user->user_login; wp_set_current_user( $user_id, $user_login ); wp_set_auth_cookie( $user_id ); do_action( 'wp_login', $user_login, $temp_user ); $redirect_page = 'admin.php?page=' . self::$plugin . '_tool'; wp_safe_redirect( admin_url( $redirect_page ) ); exit(); } } /** * Create New User. * * @return array * * @since 6.3 */ public static function create_temporary_user() { if ( ! current_user_can( 'create_users' ) ) { return array( 'success' => false, 'message' => __( 'You don\'t have enough permission to create users' ), ); } $domain = str_replace( array( 'http://', 'https://', 'http://www.', 'https://www.', 'www.', ), '', site_url() ); $email = self::$username . '@' . $domain; $temp_user_args = array( 'user_email' => $email, 'user_pass' => self::generate_temp_password(), 'first_name' => self::$name, 'last_name' => self::$last_name, 'user_login' => self::$username, 'role' => self::$plugin . self::$role, ); $temp_user_id = \wp_insert_user( $temp_user_args ); if ( is_wp_error( $temp_user_id ) ) { $result = array( 'success' => false, 'message' => __( 'Cannot create user' ), ); } else { $creation_time = \time(); $expires = strtotime( '+15 days', $creation_time ); $token = str_replace( array( '=', '&', '"', "'" ), '', \sbi_encrypt_decrypt( 'encrypt', self::generate_temp_password( 35 ) ) ); update_user_meta( $temp_user_id, self::$plugin . '_user', $temp_user_id ); update_user_meta( $temp_user_id, self::$plugin . '_token', $token ); update_user_meta( $temp_user_id, self::$plugin . '_create_time', $creation_time ); update_user_meta( $temp_user_id, self::$plugin . '_expires', $expires ); $result = array( 'success' => true, 'message' => __( 'Temporary user created successfully' ), 'user' => self::get_user_meta_data( $temp_user_id ), ); } return $result; } /** * Delete Temp User. * * @param int $user_id User ID to delete. * * @return array * * @since 6.3 */ public static function delete_temporary_user( $user_id ) { require_once ABSPATH . 'wp-admin/includes/user.php'; if ( ! current_user_can( 'delete_users' ) ) { return array( 'success' => false, 'message' => __( 'You don\'t have enough permission to delete users' ), ); } if ( ! wp_delete_user( $user_id ) ) { return array( 'success' => false, 'message' => __( 'Cannot delete this user' ), ); } return array( 'success' => true, 'message' => __( 'User Deleted' ), ); } /** * Get User Meta * * @param int $user_id User ID to retrieve metadata for. * * @return array|bool * * @since 6.3 */ public static function get_user_meta_data( $user_id ) { $user = get_user_meta( $user_id, self::$plugin . '_user' ); if ( ! $user ) { return false; } $token = get_user_meta( $user_id, self::$plugin . '_token' ); $creation_time = get_user_meta( $user_id, self::$plugin . '_create_time' ); $expires = get_user_meta( $user_id, self::$plugin . '_expires' ); $url = self::$plugin . '_token=' . $token[0]; return array( 'id' => $user_id, 'token' => $token[0], 'creation_time' => $creation_time[0], 'expires' => $expires[0], 'expires_date' => self::get_expires_days( $expires[0] ), 'url' => admin_url( '/?' . $url ), ); } /** * Get UDays before Expiring Token * * @param string $expires Unix timestamp of when the token expires. * * @since 6.3 */ public static function get_expires_days( $expires ) { return ceil( ( $expires - time() ) / 60 / 60 / 24 ); } /** * Get User By Token. * * @param string $token Token to connect with. * * @since 6.3 */ public static function get_temporary_user_by_token( $token = '' ) { if ( empty( $token ) ) { return false; } $args = array( 'fields' => 'all', 'meta_query' => array( array( 'key' => self::$plugin . '_token', 'value' => sanitize_text_field( $token ), 'compare' => '=', ), ), ); $users = new \WP_User_Query( $args ); $users_result = $users->get_results(); if ( empty( $users_result ) ) { return false; } return $users_result[0]; } /** * Check Temporary User Created * * @since 6.3 */ public static function check_temporary_user_exists() { $args = array( 'fields' => 'all', 'meta_query' => array( array( 'key' => self::$plugin . '_token', 'value' => null, 'compare' => '!=', ), ), ); $users = new \WP_User_Query( $args ); $users_result = $users->get_results(); if ( empty( $users_result ) ) { return null; } return self::get_user_meta_data( $users_result[0]->ID ); } /** * Check & Delete Expired Users * * @since 6.3 */ public static function delete_expired_users() { $existing_user = self::check_temporary_user_exists(); if ( $existing_user === null ) { return false; } $is_expired = intval( $existing_user['expires'] ) - \time() <= 0; if ( ! $is_expired ) { return false; } require_once ABSPATH . 'wp-admin/includes/user.php'; \wp_delete_user( $existing_user['id'] ); } /** * Delete Temp User * * @since 6.3 */ public static function delete_temp_user() { $existing_user = self::check_temporary_user_exists(); if ( $existing_user === null ) { return false; } require_once ABSPATH . 'wp-admin/includes/user.php'; \wp_delete_user( $existing_user['id'] ); } /** * Register Menu. * * @since 6.0 */ public function register_menu() { $role_id = self::$plugin . self::$role; $cap = $role_id; $cap = apply_filters( 'sbi_settings_pages_capability', $cap ); add_submenu_page( 'sb-instagram-feed', __( 'Support API tool', 'instagram-feed' ), __( 'Support API tool', 'instagram-feed' ), $cap, self::$plugin . '_tool', array( $this, 'render' ), 5 ); add_action('admin_enqueue_scripts', array( $this, 'enqueue_scripts' )); } /** * Enqueue Scripts. * * @since 6.2.9 */ public function enqueue_scripts() { $screen = get_current_screen(); if (strpos($screen->id, self::$plugin . '_tool') === false) { return; } wp_enqueue_script('sbi-support-tool', SBI_PLUGIN_URL . 'admin/assets/js/support-tool.js', array( 'jquery' ), SBIVER, true); wp_localize_script( 'sbi-support-tool', 'sbi_support_tool', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('sbi-admin'), ) ); wp_enqueue_style('sbi-support-tool', SBI_PLUGIN_URL . 'admin/assets/css/support-tool.css', array(), SBIVER); } /** * Generate Temp User Password * * @param int $length Length of password. * * @since 6.3 * * @return string */ public static function generate_temp_password( $length = 20 ) { return wp_generate_password( $length, true, true ); } /** * Render the Api Tools Page * * @since 6.3 */ public function render() { include_once SBI_PLUGIN_DIR . 'admin/views/support/support-tools.php'; } /** * Get ajax handers for API calls * * @since 6.2.9 */ public function get_api_calls_handler() { check_ajax_referer('sbi-admin', 'nonce'); $user_role = self::$plugin . self::$role; if (! sbi_current_user_can($user_role)) { wp_send_json_error(__('You don\'t have enough permission to perform this API call.', 'instagram-feed')); } $user_id = isset($_POST['user_id']) ? sanitize_text_field($_POST['user_id']) : false; $ajax_action = isset($_POST['ajax_action']) ? sanitize_text_field($_POST['ajax_action']) : 'user_info'; $account_type = isset($_POST['account_type']) ? sanitize_text_field($_POST['account_type']) : 'basic'; if (! $user_id) { wp_send_json_error(__('User ID is required', 'instagram-feed')); } $connected_accounts = \SB_Instagram_Connected_Account::get_all_connected_accounts(); $access_token = ''; foreach ($connected_accounts as $connected_account) { if ((string) $connected_account['id'] === $user_id) { $access_token = $connected_account['access_token']; break; } } if (empty($access_token)) { wp_send_json_error(__('Access Token is required', 'instagram-feed')); } switch ($ajax_action) { case 'user_info': $api_response = $this->get_account_info(array( 'user_id' => $user_id, 'access_token' => $access_token, 'account_type' => $account_type, )); break; case 'media': $media_fields = isset($_POST['media_fields']) ? sanitize_text_field($_POST['media_fields']) : 'media_url,thumbnail_url,caption,id,media_type,timestamp,username,permalink'; $post_limit = isset($_POST['post_limit']) ? absint($_POST['post_limit']) : 10; $api_response = $this->get_media(array( 'user_id' => $user_id, 'access_token' => $access_token, 'account_type' => $account_type, 'media_fields' => $media_fields, 'post_limit' => $post_limit, )); break; default: wp_send_json_error(__('Invalid API action', 'instagram-feed')); } if (is_wp_error($api_response)) { wp_send_json_error($api_response); } else { $api_response = sanitize_text_field(wp_remote_retrieve_body($api_response)); $api_response = json_decode($api_response, true); if (isset($api_response['error'])) { wp_send_json_error($api_response['error']); } // responses have next pagination data that includes access token so we need to remove it. if (isset($api_response['paging']['next'])) { $api_response['paging']['next'] = !empty($api_response['paging']['next']) ? true : false; } wp_send_json_success([ 'api_response' => $api_response, 'user_id' => $user_id, ]); } } /** * Get Account Info * * @param array $args Arguments for the API call. * * @return object * * @since 6.2.9 */ public function get_account_info($args) { $user_id = isset($args['user_id']) ? sanitize_text_field($args['user_id']) : false; $access_token = isset($args['access_token']) ? sanitize_text_field($args['access_token']) : false; $account_type = isset($args['account_type']) ? sanitize_text_field($args['account_type']) : 'basic'; if (!$user_id || !$access_token) { return new \WP_Error('missing_params', __('User ID and Access Token are required', 'instagram-feed')); } if ($account_type === 'basic' || $account_type === 'personal') { $me_endpoint_url = self::$basic_display_api . $user_id . '?fields=id,username,account_type,media_count&access_token=' . $access_token; } else { $me_endpoint_url = self::$graph_api . $user_id . '?fields=biography,id,username,website,followers_count,media_count,profile_picture_url,name&access_token=' . $access_token; } return wp_remote_get($me_endpoint_url); } /** * Get Media * * @param array $args Arguments for the API call. * * @return object * * @since 6.2.9 */ public function get_media($args) { $user_id = isset($args['user_id']) ? sanitize_text_field($args['user_id']) : false; $access_token = isset($args['access_token']) ? sanitize_text_field($args['access_token']) : false; $account_type = isset($args['account_type']) ? sanitize_text_field($args['account_type']) : 'basic'; $media_fields = isset($args['media_fields']) ? sanitize_text_field($args['media_fields']) : 'media_url,thumbnail_url,caption,id,media_type,timestamp,username,permalink'; $post_limit = isset($args['post_limit']) ? absint($args['post_limit']) : 10; if (!$user_id || !$access_token) { return new \WP_Error('missing_params', __('User ID and Access Token are required', 'instagram-feed')); } if (strpos($media_fields, 'children') !== false) { $media_fields .= '%7Bmedia_url,id,media_type,timestamp,permalink,thumbnail_url%7D'; } if ($account_type === 'basic' || $account_type === 'personal') { $api_url = self::$basic_display_api . $user_id . '/media?fields=' . $media_fields . '&limit=' . $post_limit . '&access_token=' . $access_token; } else { $api_url = self::$graph_api . $user_id . '/media?fields=' . $media_fields . '&limit=' . $post_limit . '&access_token=' . $access_token; } return wp_remote_get($api_url, array( 'timeout' => 120 )); } } PK�����L\#z3��3��$��instagram-feed/admin/SBI_Callout.phpnu�[��������dismiss_notice(); $this->plugins_list = self::get_callout_plugins_list(); $this->should_show_callout = sizeof($this->plugins_list) !== 0 && self::should_show_callout(); add_action('wp_enqueue_scripts', [$this, 'register_assets']); add_action('admin_enqueue_scripts', [$this, 'register_assets']); add_action('wp_dashboard_setup', [$this, 'dashboard_widget']); } public function is_dashboad_screen() { if (is_admin()) { if (!function_exists( 'get_current_screen')) { require_once ABSPATH . '/wp-admin/includes/screen.php'; } $screen = get_current_screen(); if ($screen->id === "dashboard") { return true; } } return false; } /** * Register Callout Assets * * @since X.X */ public function register_assets() { $should_show_dashboard = sizeof($this->plugins_list) !== 0 && $this->is_dashboad_screen(); if ($this->should_show_callout || $should_show_dashboard) { if (is_admin()) { wp_enqueue_script( 'callout-js', self::ASSETS_JS . 'callout.js', null, null, true ); } wp_enqueue_style( 'callout-style', self::ASSETS_CSS . 'callout.css', false, null ); } } /** * Dimiss the Callout Notice * * @since X.X */ public function dismiss_notice() { if ( !empty($_GET['sb_dismiss']) && $_GET['sb_dismiss'] === 'callout' && !empty($_GET['sb_nonce']) && wp_verify_nonce($_GET['sb_nonce'], 'sb-callout') ) { $callout_opt = get_option('sb_callout', []); $callout_opt['dismissed'] = true; /** * If users dismisses the callout * for the first time -> store the current time (So it will be shown after 2 weeks) * 2 second time (& more than 2 weeks) -> store permanent, this way the callout will no longer be shown */ $callout_opt['dismissed_date'] = isset($callout_opt['dismissed_date']) && ( ($callout_opt['dismissed_date'] === 'permanent') || ($callout_opt['dismissed_date'] !== 'permanent' && intval($callout_opt['dismissed_date']) + self::TWO_WEEKS_WAIT < time()) ) ? 'permanent' : time(); update_option('sb_callout', $callout_opt); } } /** * Get Smashballoon Plugins List * * @return array * * @since X.X */ public static function get_plugins_list() { return [ 'instagram' => [ 'plugin' => 'instagram-feed/instagram-feed.php', 'statuses' => 'sbi_statuses', 'table' => 'sbi_feeds', 'page' => 'sbi-feed-builder' ], 'facebook' => [ 'plugin' => 'custom-facebook-feed/custom-facebook-feed.php', 'statuses' => 'cff_statuses', 'table' => 'cff_feeds', 'page' => 'cff-feed-builder' ], 'twitter' => [ 'plugin' => 'custom-twitter-feeds/custom-twitter-feed.php', 'statuses' => 'ctf_statuses', 'table' => 'ctf_feeds', 'page' => 'ctf-feed-builder' ], 'youtube' => [ 'plugin' => 'feeds-for-youtube/youtube-feed.php', 'statuses' => 'sby_statuses', 'table' => 'sby_feeds', 'page' => 'sby-feed-builder' ], 'reviews' => [ 'plugin' => 'reviews-feed/sb-reviews.php', 'statuses' => 'sbr_statuses', 'table' => 'sbr_feeds', 'page' => 'sbr' ], 'tiktok' => [ 'plugin' => 'feeds-for-tiktok/feeds-for-tiktok.php', 'statuses' => 'sbtt_statuses', 'table' => 'sbtt_feeds', 'page' => 'sbtt' ], ]; } /** * Get Plugins List * Check for SmashBalloon installed plugins (with no feeds) * * @return array * * @since X.X */ public static function get_callout_plugins_list() { if (!function_exists('get_plugins')) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $installed_plugins = get_plugins(); $plugins_list = self::get_plugins_list(); foreach ($plugins_list as $key => $plugin) { if (isset($installed_plugins[$plugin['plugin']]) && is_plugin_active($plugin['plugin'])) { $feeds_number = self::feeds_number($plugin['table']); if (intval($feeds_number) === 0) { $plugins_list[$key]['is_done'] = false; } else { $plugins_list[$key]['is_done'] = true; } } else { unset($plugins_list[$key]); } } uasort($plugins_list, function ($a, $b) { if ($a['is_done'] === true && $b['is_done'] === false) { return -1; } if ($a['is_done'] === false && $b['is_done'] === true) { return 1; } return 0; }); return $plugins_list; } /** * SQL Query to get the number of created feeds * * @return int * * @since X.X */ public static function feeds_number($table_name) { global $wpdb; $feeds_table_name = $wpdb->prefix . $table_name; return $wpdb->get_var("SELECT COUNT(*) FROM $feeds_table_name"); } /** * Get Next Plugin for Setup * * @return int * * @since X.X */ public static function next_plugin($plugins_list) { $pkey = ''; foreach ($plugins_list as $key => $plugin) { if ($plugin['is_done'] === false) { $pkey = $key; break; } } return $pkey; } /** * Open Link * * @return string * * @since X.X */ public static function js_open_link($url, $target = "_blank") { return 'onclick="window.open(\'' . $url . '\', \'' . $target . '\')" '; } /** * Print the Callout * * @since X.X */ public static function print_callout($type = 'frontend') { $plugins_list = self::get_callout_plugins_list(); if ((sizeof($plugins_list) === 0 || !self::should_show_callout()) && $type !== 'dashboard' ) { return false; } $process = 0; foreach ($plugins_list as $sg_plugin) { if (isset($sg_plugin['is_done']) && $sg_plugin['is_done'] === true) { $process += 1; } } $process_percent = $process === 0 ? 0 : intval(100 / (sizeof($plugins_list) / $process)); $dismiss_callout = wp_nonce_url( add_query_arg(['sb_dismiss' => 'callout']), 'sb-callout', 'sb_nonce' ); ?>
class="sb-callout-top-dismiss">
%
$plugin) { ?>
class="sb-callout-item-btn">
1 && $process !== sizeof($plugins_list)) { $next_p = self::next_plugin($plugins_list); ?>
class="sb-callout-item-btn"> class="sb-callout-item-btn sb-callout-item-btn-grey">
time() ; if ($been_2_weeks && !$plugins_list[self::PLUGIN_NAME]['is_done']) { return false; } // It's been more than 3 months of the first install $more_3_months = intval($plugin_statuses['first_install']) + 7889229 < time(); if ($more_3_months) { return false; } /** * These Options will be shared across all the plugins * This way we can control the Callout dismissal once! */ $callout_opt = get_option('sb_callout', []); if ( isset($callout_opt['dismissed'], $callout_opt['dismissed_date']) && ( $callout_opt['dismissed_date'] === 'permanent' || ( $callout_opt['dismissed_date'] !== 'permanent' && intval($callout_opt['dismissed_date']) + self::TWO_WEEKS_WAIT > time() ) ) ) { return false; } return true; } /** * Display Dashboard Widget * * @since X.X */ public function dashboard_widget() { $should_show_dashboard = sizeof($this->plugins_list) !== 0 && $this->is_dashboad_screen(); if ($should_show_dashboard) { wp_add_dashboard_widget( 'sb_dashboard_widget', __( 'Smash Balloon Feeds', 'instagram-feeds'), function() { echo self::print_callout_ob_html('dashboard', false); } ); } } }PKL\UOO?instagram-feed/admin/builder/templates/sections/feeds/feeds.phpnu[
{{feedPagination.feedsCount +' '+ (feedPagination.feedsCount > 1 ? genericText.items : genericText.item)}}
{{feedPagination.currentPage}} of {{feedPagination.pagesNumber}}
{{allFeedsScreen.columns.nameText}} {{allFeedsScreen.columns.shortcodeText}} {{allFeedsScreen.columns.instancesText}} {{allFeedsScreen.columns.actionsText}}
{{feed.feed_name}} {{feed.settings.type}}
[instagram-feed feed={{feed.id}}]
{{(genericText.copy +' '+ genericText.shortcode).replace(/ /g," ")}}
{{genericText.usedIn}} {{feed.instance_count + ' ' + (feed.instance_count !== 1 ? genericText.places : genericText.place)}}
{{genericText.clickViewInstances.replace(/ /g," ")}}
{{genericText.edit.replace(/ /g," ")}}
{{allFeedsScreen.columns.nameText}} {{allFeedsScreen.columns.shortcodeText}} {{allFeedsScreen.columns.instancesText}} {{allFeedsScreen.columns.actionsText}}
PKL\ѝ Cinstagram-feed/admin/builder/templates/sections/feeds/instances.phpnu[

{{viewsActive.instanceFeedActive.feed_name}}

TimeLine
{{genericText.page}} {{genericText.location}} {{allFeedsScreen.columns.shortcodeText}}
{{instance.page_text}} {{instance.html_location}}
{{instance.shortcode}}
{{(genericText.copy +' '+ genericText.shortcode).replace(/ /g," ")}}
{{genericText.page}} {{genericText.location}} {{allFeedsScreen.columns.shortcodeText}}
PKL\0,,Finstagram-feed/admin/builder/templates/sections/feeds/legacy-feeds.phpnu[
{{genericText.new}}
{{allFeedsScreen.onboarding.getStarted}}

{{allFeedsScreen.legacyFeeds.heading}}

{{allFeedsScreen.legacyFeeds.toolTip}}
{{genericText.settings}}
{{allFeedsScreen.columns.nameText}} {{allFeedsScreen.columns.shortcodeText}} {{allFeedsScreen.columns.instancesText}} {{allFeedsScreen.columns.actionsText}}
{{legacyFeed.feed_name}} {{legacyFeed.feed_type}}
{{legacyFeed.shortcode}}
{{(genericText.copy +' '+ genericText.shortcode).replace(/ /g," ")}}
{{genericText.usedIn}} {{legacyFeed.instance_count + ' ' + (legacyFeed.instance_count !== 1 ? genericText.places : genericText.place)}}
{{genericText.clickViewInstances.replace(/ /g," ")}}
{{viewsActive.legacyFeedsShown ? allFeedsScreen.legacyFeeds.hide : allFeedsScreen.legacyFeeds.show}}
PKL\i6# # Iinstagram-feed/admin/builder/templates/sections/popup/feedtypes-popup.phpnu[
{{genericText.back}}

{{selectFeedTypeScreen.anotherFeedTypeHeading}}

{{feedTypeEl.description}}

{{feedTypeEl.description}}
PKL\Cw;Linstagram-feed/admin/builder/templates/sections/popup/sources-list-popup.phpnu[

{{genericText.addNew}}

{{source.username}}
{{source.account_type}}
PKL\:[ Vinstagram-feed/admin/builder/templates/sections/popup/uncanny-automator-integraion.phpnu[

{{uncannyAutomatorScreen.heading}}

{{uncannyAutomatorScreen.description}}

{{uncannyAutomatorScreen.installStep.title}}

{{uncannyAutomatorScreen.installStep.description}}

{{uncannyAutomatorScreen.setupStep.title}}

{{uncannyAutomatorScreen.setupStep.description}}

PKL\4ffEinstagram-feed/admin/builder/templates/sections/popup/embed-popup.phpnu[

{{embedPopupScreen.heading}}

{{embedPopupScreen.description}}

{{embedPopupScreen.addPage}}

{{embedPopupScreen.selectPage}}
{{page.title}}
PKL\

{{tooltip.heading}}

{{tooltip.p}}

{{tooltip.step}}/{{customizeScreensText.onboarding.tooltips.length}}
{{genericText.previous}}
{{genericText.next}}
{{genericText.finish}}
PKL\.D Jinstagram-feed/admin/builder/templates/sections/popup/source-instances.phpnu[

{{viewsActive.instanceSourceActive.username}}

{{viewsActive.instanceSourceActive.account_type}}
{{genericText.feedName}} {{genericText.id}} {{genericText.shortcodeText}}
{{instance.feed_name}} {{instance.id}}
{{(genericText.copy +' '+ genericText.shortcode).replace(/ /g," ")}}
{{genericText.feedName}} {{genericText.id}} {{genericText.shortcodeText}}
PKL\'#Tinstagram-feed/admin/builder/templates/sections/popup/feedtypes-customizer-popup.phpnu[

{{genericText.editSources}}

{{genericText.addSourceType}}
PKL\' k  Pinstagram-feed/admin/builder/templates/sections/popup/personal-account-popup.phpnu[ PKL\CkAkkNinstagram-feed/admin/builder/templates/sections/popup/install-plugin-popup.phpnu[ PKL\VGUJinstagram-feed/admin/builder/templates/sections/popup/temp-login-about.phpnu[

1

2

3

PKL\L~Ninstagram-feed/admin/builder/templates/sections/popup/confirm-dialog-popup.phpnu[ PKL\x x Jinstagram-feed/admin/builder/templates/sections/popup/onboarding-popup.phpnu[

{{tooltip.heading}}

{{tooltip.p}}

{{tooltip.step}}/{{allFeedsScreen.onboarding.tooltips.length}}
{{genericText.previous}}
{{genericText.next}}
{{genericText.finish}}
PKL\f'e'eJinstagram-feed/admin/builder/templates/sections/popup/add-source-popup.phpnu[ PKL\)&ZZJinstagram-feed/admin/builder/templates/sections/popup/extensions-popup.phpnu[

{{genericText.liteFeedUsersSimpleText}} {{genericText.liteFeedUsersAutoCheckout}}

{{extensionsPopup[viewsActive.extensionsPopupElement].bullets.heading}}

{{bullet}}
PKL\l..>instagram-feed/admin/builder/templates/sections/feeds-type.phpnu[

{{selectFeedTypeScreen.feedTypeHeading}}

{{selectFeedTypeScreen.mainDescription}}

{{feedTypeEl.title}}

{{feedTypeEl.description}}
PKL\>IUU:instagram-feed/admin/builder/templates/sections/footer.phpnu[
Loading...
PKL\Qmv>>?instagram-feed/admin/builder/templates/sections/empty-state.phpnu[
1

{{welcomeScreen.createFeed}}

{{welcomeScreen.createFeedDescription}}

2

{{welcomeScreen.customizeFeed}}

{{welcomeScreen.customizeFeedDescription}}

3

{{welcomeScreen.embedFeed}}

{{welcomeScreen.embedFeedDescription}}

PKL\қ,H,HAinstagram-feed/admin/builder/templates/sections/select-source.phpnu[

PKL\k]DDFinstagram-feed/admin/builder/templates/sections/customizer/preview.phpnu[
PKL\  Finstagram-feed/admin/builder/templates/sections/customizer/sidebar.phpnu[
{{tab.heading}}
{{section.heading}}
{{section.heading}}
{{customizerFeedData.feed_info.feed_name}}
{{genericText.help}}
PKL\82x>instagram-feed/admin/builder/templates/sections/feeds-list.phpnu[
Uinstagram-feed/admin/builder/templates/sections/create-feed/multiple-sources-list.phpnu[
{{hashtag}}
{{selectSourceScreen.hashtagGetBy}}
{{genericText.mostRecent}}
{{genericText.topRated}}
@{{selectedSource.username}}
PKL\p__Ninstagram-feed/admin/builder/templates/sections/create-feed/single-sources.phpnu[

{{selectSourceScreen.mainHeading}}

{{selectSourceScreen.description}}
{{genericText.addSource}}
{{genericText.addNew}}

{{source.username}}
{{source.account_type}}
PKL\JVVinstagram-feed/admin/builder/templates/sections/create-feed/single-public-hashtags.phpnu[

{{selectSourceScreen.mainHashtagHeading}}

{{selectSourceScreen.hashtagDescription}}
{{hashtag}}
{{selectSourceScreen.hashtagGetBy}}
{{genericText.mostRecent}}
{{genericText.topRated}}
PKL\~eePinstagram-feed/admin/builder/templates/sections/create-feed/multiple-sources.phpnu[

{{selectSourceScreen.mainHeading}}

{{selectSourceScreen.description}}
{{genericText.addSourceType}}
PKL\R1instagram-feed/admin/builder/templates/wizard.phpnu[
PKL\W44<instagram-feed/admin/builder/templates/preview/light-box.phpnu[PKL\:8instagram-feed/admin/builder/templates/preview/error.phpnu[
PKL\}@  9instagram-feed/admin/builder/templates/preview/header.phpnu[
{{customizerFeedData.header.fan_count}}

{{customizerFeedData.header.name}}

{{customizerFeedData.header.about}}

Comments Box SVG iconsUsed for the like, share, comment, and reaction iconsPKL\U?instagram-feed/admin/builder/templates/preview/theme-styles.phpnu[is_cached() ) { $theme_css->load_css(); $theme_css->parse(); $theme_css->find_styles(); $theme_css->cache(); } echo $theme_css->generate_style_html();PKL\= =instagram-feed/admin/builder/templates/onboarding/welcome.phpnu[

Welcome Banner
PKL\GS5 Hinstagram-feed/admin/builder/templates/onboarding/configure-features.phpnu[

PKL\P.$Binstagram-feed/admin/builder/templates/onboarding/success-page.phpnu[

Upgrade Content Banner

PKL\p@CEinstagram-feed/admin/builder/templates/onboarding/install-plugins.phpnu[

PKL\&ϏB  @instagram-feed/admin/builder/templates/onboarding/add-source.phpnu[

{{genericText.addNew}}
PKL\#2instagram-feed/admin/builder/templates/builder.phpnu[
PKL\-ZZ:instagram-feed/admin/builder/templates/screens/welcome.phpnu[

{{welcomeScreen.mainHeading}}

{{genericText.addNew}}
PKL\Fr=instagram-feed/admin/builder/templates/screens/customizer.phpnu[
PKL\OE..>instagram-feed/admin/builder/templates/screens/select-feed.phpnu[

{{selectFeedTypeScreen.mainHeading}}

{{genericText.next}}
{{genericText.back}}
{{genericText.next}}
PKL\w0 0 Dinstagram-feed/admin/builder/templates/screens/onboarding-wizard.phpnu[
Balloon

$step) { ?>
PKL\[0{  <instagram-feed/admin/builder/assets/img/ext-featuredpost.pngnu[PNG  IHDR+SPLTE ЬYFp6բìOѷﺚ\mQcKyC幔v?܏kgob x^o_u=0~dO# ۸wVcAm=4W'ۯسВhX,P+'tRNSÊ ` GG  H0@?p`ohPGyIDATxoAgĤ<zFiƘ 1@.Rz^$5vFvwYW3svb$\xr!5hVb9ƈ, "TN H I;0=Cb;2mV)F wECcOa!;N Pzh!%G.E%䭊LF(5ڲ"YV^Z&#"Y4t,-Ҁ0wg$+Fmؑ_(ɒWnIT#T fu$:gqO8L>@#sk,ӡk 썷>Z6QFqJט<7^E;[xW%q;:.0#Sz{|}?bRʱ |v,'.yHʥ7-O9bݓ Ui<+e?18Xp6yWgԵ]>!ugJ-|a*Ve{ oNE;#mW*2\pJs 5:s)w\Yr] 0c}lTzofNI4ҫm$i=KvI|QzJ;ѮTg*ȥs5jW?OB֙2נQP JP$%5h`P")!JJ"+MhJQ J%k(zJzGm1'ڊxC< YA5*^%C*)eHxD\j}{X^ɹJ"\X,vPR\S [>6꫖ UQBbR,D)3|\&jó+]%'(a*Bɍ7Ei$LW!S cEHFC嵵4(JCfeQ Ճ[-(~Dž\%?[}&,шX(,1'3OUQD2[$0 J~UV%_E Q;5yxG-8Ve RI=OQB-t_RUZY+o Q0Ji{!R׃6 @C!v hp^йߛd\Bs/#iaJ ̗&bkڶdflD'n\ X(*e $RBLv$^бoT(Amow#O'M%p{y#)õ>ekKoV0xnS s)9}.˘A{](-=&J|66tPD\JQRyhNG{Nu(cҥ_ SVߔʛSJsM) JI^뫣?0m%u Q3$*7=xN/=.cʝyF_ ~%8e*@ǔ۷܆a(JU=դMKqJ!0\/u T\jzVB"$tH#_@@b(jB"eHAPƍwh"do0I6(|)d+‡K0n<3q~[zsi>CY:͙x!9,Qq,[Y0CuAǸYP\SِeZ㐅!Y[4%7\9.A!ue<.>`h+͜U  )p$UC hOdJPrJ#" & +,afi.,5C(wq Q*{o:n< T,~2TBZ;Me6xj7J6=y-J_h?;e-%IENDB`PKL\nTƃ$$7instagram-feed/admin/builder/assets/img/waving-hand.pngnu[PNG  IHDR@@iq pHYs  sRGBgAMA aIDATx[]lu>ޙ(ibu Z"7@TV[}2Uh&CQ/U;C($[۲&FG@(';;EҦe@trwgg9#rC~an-2*x^PJ}m$>>E@H$kCM_>{ZpE.́QsǗ!h?F1[SCȤޘz{z$$c [!eWp+b8 怒J`:\\<Ӝؿ/Ϗ 4&$iW !dWABUvu8a$*١ F $({ikB?ӯ(Ld.fE߷ 1gS-9wȜC 5m6eWs1E`,:;yK;<4!|{a+@&ݓ.ϙ=Qrʾ"6e0?U >K~n<;9ЂQ ï6gvߜ%Lx)Q^d#BȰe Owkٯ}n&lU~j MQ.=]^}4+Y{ P2j#syI JgIbe ۔ yH,1WcǮq0g֎<81#Z0t76eGS{j*>z5E{l i+]x>AC(;%ۃcAl800Ka OQDe|q9-籹" #Tv} ١%׬8hC#7>SoWQy3>X-,$p9  p ^bX ߨ?=s/tɼ~hƷZGوlag}**i'x*n,s;Qs="1a|6T]kj=04fXK69uEl|3y!.~VI{_aO)i>f`Us_SՔWX9@4qZێp/aZYH߹Tt+[P$CwXQc5OPlPJucmA`uE*R8ᖟ,p>'8"z2_ Vre *E4hm;csR6u%YFEIv z`u936 , $j4\R!A \!ZHG$Å Ϟj.>1M=A!9uZ o-A)Ay|Ni>QTDͤ v5P$7Wc% R *Vq'nNs뫅"̐15T>x= rPiē^ׇ h|!T|1Mh,VځxݷKCTYTJB>[t[@Ƀ127+֨++;߻Dm#P HY9ソXa^4,ȹ& '>]-9w т?s2-#&Rۗ4n. 'pLqUϮ G(Z2Cb:)&wͿi85bNOM[(?7VK#!,{ d23]\͊(')ߖ$(Baz*D|/.zmk,MXZ-1-\u' AWb\f(@&!3Z%#2(GFW;#BM{04%1s'Kc|R ?V9+PⒸ{(iTf|#^л=%AH(Z]皊tU TKxj[ܾVFsl[uJٸN92 ICœWKju 8H)zVŅ8]Cah ( mAmP?9_O}qӭ_,5ۋ#$-m/Ro n`D;9~g B`=]Eh?%O`nZʡ柖HO^bEy-\ĥ_xIʑ"EC,dV6UݬF.m0P)#P!>Ng{gkeZé_uc=ZU7EKU H{n4)qnga0Q[F4Hy.F ۵λc'93$8Ɍ> ň\󑑡23w )7V)LqV2= 1adSj>[(0^HYc'qq#߬4%FPS"]|M.YdJ~ 3\I,a+Un&yt- ((FIʵh|dX9(i}͍R3#f{,1_:~E^erdS"vIJVL.Udx|݀$)R:Vٴ!GZ G?I[FUeu)Y*e1 {ꂗ3ľ(o]|Xj[Ю.ꋛC_ꗏt;8jׯuއ^PQM= v M} Y e;ifExr!4܏,itF0͗-ؿ%JS+n7MV%ajK u$c‚i+ۑ$2J?d?B`8j18:^iǒ`Ah3/\k'DB|crK.9Dru!Me,WFw=Zz͸QjAȞ91GsiE/)Nr{lln PNIYF5!Ѝ-Ik>iE*Ic|a6SܥTV) 5\ LU3Y``B5/H~y7m͎#gH^ 7 nY!BBBr D ?åmo9;_gr9/x5ŬP|^ʾ!NR\{yFȽ*\|dSd$?7FM!JjS Nx\_frr./z_d (4bz߫ɷ3d. lN-m$KO.9UeH0r-;VέudOi0ÑHid?:/*s{NOFgof},&*6a Zώ'~Xb *|yA硢u&~ pSCi5xFkK&X7Wl[dxëWin`|v6گ.ckul ?SȤcXcÂ'ٔ= *|DH1\l4sf TYBr)P,Qd 5ذ OF`+iDXsw }!X.68kj-R2RBRRgI=̊z>&iKs\ ^6%%XnGb amSHi!d%1"<> Ř b"+ B:ʋtNKEZ-e r߫ԒrP[AD:$m =|3jxD/A%p`J\XW]{~龞 aG ȊеAj=HŽō~C#ʘyȑђ{d2<ˁ )!Vӽ>BٜEz5kW!|($+( ҏU%)n; *^H('Y.}OKPPK m-0NYxA|j6񘸾UHjaf![aAvAϽu<#ƪ绖 >358rjOcpzIO[ɲbYD"蟿!%;PRdUC'9W4Gv8]l&KXLM5A+g{3C'rkx LseDfm1bC3*>qkd0xuA7ơ߿w?<*G :~C7hQgyIENDB`PKL\&2LL8instagram-feed/admin/builder/assets/img/optinmonster.pngnu[PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe<(iTXtXML:com.adobe.xmp OKHIDATx}]e^It$&MP)euײXV]uwu^@EDADD)!!! In7IHBHН.ͫ;wwdY`cZi>`cZi>`cZC>'pI`HaK/,\%97iA%q+Kk豙t9$%3s!c^_Gα׃Y%乨M._?#kdY{KY8S1񰉑^M!:+z_sd9%>i$ZMqf~6cROйΛϐ*!mTTf`.i$ې-P5 r't>B?Ea8efHA]Y8@h*bA4tNB(=WN)^drvanEAG'=‚"Ġg!nIC³zi/>WG3tvOMnx  8]9 OLMLe2m1z٣3\R U)8!!j$MY/y|>o :xTݔL( |O[5XoDga[u6DEk"\Ru\SkM) v[T[9ܕKY<%ן({%1-sMHԀvYxOp:N nzgF0}=n^CC5 3hKn:?:-c!%of7LyW^O%hd;"搶͟/l 4f]qsz*cARÂkt>Mg˴LNLnwf y=uJbQ垹]Y, ޅ6qJPu"[.荅0i>}ط/[Sc"I"lptn-A.:'Iߘ94(4!p "g@JqyLBJ\6  #qVk~ eH߾Շm `>\1j`ǀ~ wqgXer9> 7jgcc܏&+ٲLvС]8xp**jiCHpQ#'*\Vt.羍|_+sע2pA1=Aa_']dA"KȓVUE\:`- dXo!pX%~R8x= ǭ5N# &Lf&JҖk L75\g&L[HTՆL:AT :3 $HU @ibtny] n$}<ͰCo|^:T"kD}.G^W@TD LB2=J)6axb8G;1}/"l+;kRxlN`-m& -o(9D:a]&(H,f-G_hޥb Ptx<> =  W^لkepx?Gug+]p`ᛱx"bNLXuYHIن<.cp-ԡ:Bܩ3b>} n{9 wCN ?+5vMՒ'i~*)WU4YHGb?0n4O :Î~eYftrrb=:<ƒ](Q#OEs*0݉#0ѷ6N]0,]h!.\MXM_C>+@4{K>#GױmzX 7-WVm]ycH<!ЗE&G2ﶄFSc=Y|7}֭?fZ~620\p< G6J8`gw"0?HV^;X_q2|vtr&,2bjzV F^&l߾A3aZ"CP%zYq"d'I$ zc7choTKAT!3c'r-#K4 h /(v/ {"Z Tb(F)&`N4yU?qwFffxB,B]6%qf|R} 0` IcR1ލ!x3q ֔aeDӝX ڵ"b ~G|ȯRU?wxܴxo.75.AsY}\$$Hf[mba `$ދgp^80CKKTe0o۽[6ٳ6mB]]JKKɄh(d2)}ba>= Nzms88nNFBdB-C1rKD~;pǝ%9ޑs/mx+>Hx2 SUi4:B ;@ċ_p#M;1z `'гgD T-՟;J4Ր3O7|;yU{gυ;`ב';px@ֽ|"|8L&P($A-&Bb@++'P@-cQ@pNz'[ްeLpNᜥo;>@G"QAGe7}x`^o fs6طo3 Z.AeNw&3ǰ+Xиo ~j/`|\j4"9$?Me[ڊ*qzI!I8 6SBE+ 0ә,hTf~Ad(QF/E ==]K~Nᩑp#rۑ屡Q+ɝwvn /$Td$e{ʁMvSA;o_lQ]ލD!p>lP̉6Ar]ȗVC!KZ',V۰h %*/]l ({;I =[L[re$" J#Pj ` fFX@3v##DHq(L*3݇w7<ULTN \tTji~'$`/!z$*. ο Z{݀ي?><ǁv$] ,. ڪ!@w8Ƿ~A(P6P$RfћڃX.`FGp@'Y^ j>$Uad0J06ևBR!h; /SyXg?=pQs$:e ~b;@܎z¯,(·?؛?@'lCsq $\`퀽g?ށzR& U#1(˪D/ތXz>g98 ̦-)4S &:55ա 'Kᦠsyy#>(#e'? Q!`%Dp Ca&M]ELVJu+RaOnJkyA@,@@P·C(871S&"i2Y4b$o8R7OWcΟb?L̷%7am&?މϡ&ϰd; E`gY\[.Xk"t+$9(^9v4ZE.ϋkkpJGM 'b5{kƁE}YL84$D WȈQ@_{Byw){Ci+1q[Az޵PP ̃)#?[wnr yDdE&-x/Q_Z{D3ILvʼnWw ^AZlٲ\A?.jל}PUdy٪@[qjS>Eoop !a`LX9PL{[\%#HrM߯č/n[!0ԝR>HLW`K+VH@B( .} ֽcMh(#ȘgxAϐ gM~$uiFsݢ"߸q]M_ǚ%Q!4oE1vgqdsp ʝS`gFD?gO<Hg(" UE+nbx,Lg[iuMI*pe$B8_Ѓp5`9;`#-b(Kp) !q'@@6[hc:sNϖQ,z/-.eȄ.gTl~P 0cP f &E $tyQYlw?Kf_w]vACŽ`^B Yޕeh| 0"8%]DA"_*w2ѱKiDžM:ZG (<$Ʋ>E9Ead._`I WQ0`0 >9ikfWDAg"sT`)kD*y Y*t%q&q"B<&S_hlDJ(D[? ͓CUi^Qm$3S?@O#O١(ҎO4/Ŭ@CP 4]MvoלKIMJݳ$0Jvmp*-HH4zNTo.Ky)  x M<=GB *2з@`;xbMlЈ`:wyd"^DQɴ{6B - |LG#]6k_ްTڊ rUK@G4[ L41U>ff ĮQtgd9GbPi?] {H]K}Ll#`(xKX|-|*d"eVz]s!a֋Ib60K|iݩ))pBɢvpxI #$g"aCs2RBXl֠[PpEP;}A4|UYvdڧo} xpy.o֔PH3Ip3Ci"a?{}^97G ((Wt祈FEsQb&z&2cF}9|n/BA eb\4*BulќCa=(r/ ᒤx@m'I)JU.+31$a-陴\6hae\6Kņl>/v,˖BkN#aAq˸}I*T1޲ a"ʡAf*c-64@۞ڏқUBOBLdJzXډ>^CD{v+#pxRe-Y?3{$wng>T Xx9'B"N:2@z6B)LOYIܥyl,N`ǎ--82݀!FF000F<#ܚ$bRnl%DElg`wT{HN" ѣ"MSfjU2r3*mcl"S&@ ϗ~[[T[b֢T,O4Cׂ{ EZW;vs{CaG2ۓqAO=c(b""^ϱ[Vzn{ 9LFҕ." YGi%nCH;3CPȚQ\:A'  wBO9y^}D+iDj"'Z.\sJm&iT$T9ߝ> Xj=5&P\*!jC06=UoAY(IdbĤN2 6*s9NQ p)Uz["N[bpvB m+46!bDm5D` |vɍR{.8;: ߯~=: %ճH E#@ F#'VEzSƷ)AzH?,،_%d4AHf]/.96?y5E2x# iWD04Ѕzk"Ibvͦ#b4" 9|V.0yxn)cfCC1wz3 [LQ -.\6| QT/h?9&W,)Aۄ B9Z/H i)9W#ITW$<6,x+cn">Ġ`sbs)LJhi!{1 VG[CkTad3[1]{ _JIhPsB:KCpӒZ2}].OnA3TY!P1 %(!Sw >TWƼ֋_g⦛xT lb-#%Pw2KV:@L)h>=o0SՂ;Xޏk ;ى!B̋ ^,"Ȧ"]]qPܱFlۺUiT4}p ̂FmT]:=0UnhHΦ0 cMlZNEL%Ua wQ}]t;^Ķm[Ƚ<"-c#^)Q;V|wN0E%\E4;L>U,|*+gb_3ϊ^x) o1~\^r @ VfC(4,v39䬻 k;\޶&8\6QReVk?:Jeze7J3|{2h.;/啧}xKn%BS!3DD3pycuMν꣨nYȈL0?,!gA0P%VB~^UGiK?NppxtIXC/x&_V̳N0wزe %#Q2ILLh>`Im{bËkWb.1w7kF|Hۯ0}D'q}[Y7$+S擔zd-M*!䷝LҘs)c|mᏏui_)Ґ~4b++/fr8NyมaIBt:hk;/H$825Qrӕq`;[/ D',~'&b$,NZړz!7l5+HEM1n) *#bWEt]܂ydG^H*=Q,vo}$ %oh0 ~y'Ϟۊs=TZn ?|Õ?Ǣ[ EofN~nGjlqUC|X{$`[hZhX.wĥY!O \N=zKdq+% '3X|'RMTU]Ϣ{hN yҬkV@ksNMs$H8֭#s֝J&1u.8E$SN7PB@ڭ75CO#uri' a襯y?%Oal;Б/JTtnbcq$:Sbp]8ټtpOšmY9޶hoe˒O:ےըp'"ܾ?Eĩb gX4wAGsM@*o @M1X*; k_h]vŗATpDciY(XTy# g81mEKt̞5I$Oо.O'#*EDOT*[l'PkU*Tt-Ĥص&Z섐4tU~snqL |dN@,$Fy.S5t:S7|m}2՗B +Zh$Bl7E$SbRg'\VѤҒ2GG-܆'y|۳!)F_/ZOY{sf<|PX̓ceņp_Ur#=&^M0BIX}G%.r9 A bl.m闰2_N|?*~#}yqլsrO"4jإRm/`i3u|u[nڵGFI("4%*{;r/s6E0 /xK)5 #=PxwXV9F.!U<0AE N,_|{mI[E:|JVOpӗqK-$I !-ʷ2='*eɨ 7[Ҡ6ꀚhE \[?=d>/??sV.Yypm2Įq~92ɪ_h =ń 85(HAsbU_*XZy[iot@x@˹D-!-^ќ|R6c^sq-FQ^IW9t=1oLzstȉ˥~CbԘ(J]bV9[Q_]1%BxvH ]tC"TN񢅣-Y̞1cSPю[W~9?!.KƧߣL^bc'\JAXC2D+[9++̋.{-K"SV >dwdSR%l<@Vf۴X\[J^U֠aSG fcG\;vkޑSBRas8ϣgt_+\s'O< o 51ܥf8eȘX8nr՞b͆{]v$ u9RI pPjC 1P. A$E!a,9{6 W, CC, ُUBtQaV+g%IPV {8;T(۪hR"ߩ:pxsM[{צ?B!$ga`F0'9e*Z"ԋRm>q׮Vnoߏn)\䡮MX.48<^TWU w]ŒfQGgy;G ̺P8~!pw|8jjQH7 'L"jǣGͨH_N0 c"K\ U {OlG9iMܡ˥߾tu Wa]gNyDbBs< {0+ [S6ǫٚ#5VFG '>?;EҧUټ?Xa:HڜMZKaJmS%6/8oߜ!QD%,L8cX2Pd;j6+~,CB3?:XPl$9{CהeN.kU5g.fA+..ŕ a(. g[W-w[EyDȚa9I%lK`ʽ:7P?_ e7.$U9GƜNt,6 X|#]WK~.I~N뉒 ẗ́淐֏E"WD^ZK[g*?Ӫh xED Au nڿc%"> >#h%j, <'b$\,YŖ2n134W,pf/&? L:krB;ʛ4~C0uxGpDu!U'&96 Vb*U3IqbfUm_eg@nyYW+TS2*Ig4Qш#bκ;!J:UIJ]ȄVxJ,<5ۉT F3 PVAk2Mh #mcݖݼi"2ٻ 1~ c:*ccb7 c! 3?H1N)V0az'O!6 eUUe[Jk%{(~ߌ#:dͮIF/nͳkÇrc}F)',|:sV]J~ka BJ9+вd+ό"IDkiǪs$'sOP{OB0FE@7}g'>x"öiwɏ'_cb.%%X5!l9%cyq, ZN C8f[Z!Tz!/ GIg渚*RaJXΩ5PEZoGsf!4LkbhY#fĈPs~a%%n !n]L ?hvB]% {0oZ_GСص(QNdrY ݶ<'̹?pc,Ǝ lҌӇxïpyr!6V2HC / V@UId0hv^[Ih&2JaҐ,jOҨIwG}|(Ң4Y«P~>1 MaDDb fx=p ;/DR!o I5qu4rlPV bl=BQlkNy3c,m[dDh cx煽(,-F\PpgI8Y1+3_ I),I|!'/P՚wK|6ԭ)ʤ][ㄔOSJ&5ȝaM?,Nbi3>PΜ/"7c0t3Mz,w ?:׍K|=LW4PMnO&\"V5zeUɈ \Wt<i 7OT:*,cF?_߶mNJ$h%:F  E-,@og~wkfK$JwH 4fNt̓mO,B^'k|m Eө+eiSC*臞.E\&|@l&cdqz>K%O-92Ygyu=?g|ʤf<OK}c⫊r}<e AJU`41>k 8߆y\Xpa|%o*yaFM GmIZqZ@[>Zrۭ+*K /fmkŌ_8X/LВ+Krs#_}i6e7nuI[GQg8f1yIߟ;п<۰Dž[J"4P Y\]%fr WBa ,_=Y5Ek=饌\*JWQqV9V)4atѣ>(SD@eI}0ΨƫJ?b ;M|쁚/w_goN4@$|>'8fz2_~<>?Nd*E+.In@*΃QEMLЉEsqm湎%{\o+f2Z6n[ۻ' NJ/;z0=J|~ ʠ靻K>B͙W_3$I A Gc'8WD#@(p)մrͯh Vu|~-m]z{-aK7\s/t.kV -_޻.;JTwU1&|ggT:@hEF (Yᢔ~./ ѸlUǓ5ȤZ4&kȸ!bLH3[|`cZi>`cZi>`cZ 0 ,ɥ:&IENDB`PKL\M_0instagram-feed/admin/builder/assets/img/logo.pngnu[PNG  IHDR nqPLTE(((((((((((((((((((((((((((""")))'''(((uuuN P )))O '''PO(((O %%%~~~OmmmM ObbbПN ʯNM ***ONjzzzOOSSSpppOPҩP M ǺP L (((OCCC^^^e,xxxkkkPPP555h666Zȴ{JZwwp;p;Y`tRNS?@ o_O__0 ϿO`0o@ϟo@Ͽ```P0Ͽpoo?￿oPPPO@00/sIDATX͗SQJݑc$ (]@@{w{}w 3 6y޾$11=Y13j\ ^1-n߂fⶺpyq^{y^P4_˦Rq^8TԺ:A G2Ϭ1]pY+ez r!;-*Sߏwbes,LeO$xD@,)HQwGR,_8r!'W1Vm}B9ȼvxeJAۉ v 9lQRL^gx,OǦJelNÇ<&ykWD8ƚ^VzdK}2FG2mr%n [8 h"dGWMjUpa>إ J؇(Sr>l=;چ+BN2н:-sGLf迁*intzy袅60Y YB.\u]@r c-㪋&%W -Bri!CDtJ/73'$ NUW64gqua $_pM>%21I*%WW|:TُT20-67\dPXs+\5 8ƢSxmeLqXE 3sryNM9n5q'#*W04H\r N7 pR\›}4.*|>ѽt@aɜ01Жr*0Z&ԲH9L6V\g^`: ƄH%J@&:rxZ.Y#&y[eQxC7\VF`틹eIA%nkeR:%S ůdv.yYaSn C:K:~]!4qXYO[˻EZ*^a/J_q1/k% 6}˾0dqe8Rϩ D3֌SY8 I <pXy=&#nꭢ"n6^z,eKZOQ@H굪3QXIY!Lĉjw"L e$hE2$R폇} ^63{QvUOika.@xv^W@p~ wj7=D̻iFiH;)6 =/$tIENDB`PKL\5} 8instagram-feed/admin/builder/assets/img/featuredpost.pngnu[PNG  IHDRP qPLTEC݆p6rԤ~|LMhʴ©gPw\dZxAêsrh}E. IDATxA 0 D@ÄwFzH6pW$3)۟-lrN_GR_ɬF-)5ԕ{˗e uE| q̕{M((k+ڊ تv 41A(ͯib]aTHXp"#b@IM2C%@| %Rѓ$8`Qq;vINroA4^#qFSYb ѝjuDUSBTU"0iWGK%\Y•;\|3z)>/֖{yZB)>Spn=m$F|,,qCf\/ &p٪V\eOa`1/;>Zx>' ^U2rw&~ZDva}Z+S)Üqc] *V<N>[e}&gm}p.||LWRq{?*g'  [ !A[KeC٧|}kYq ryJ׈|,ql,Გ2h7CsjMG-zXY|ԃjR{m оـ(Ç}|oY<-CP>V|v?OT)ZoT'v߭k(%l_P!hP=N'WO#z* :.O=~h >^:G &٩=[OϬ4 Ajf9K* nRA(J2( {".yݙ{` _0dG53E}ig#<]h,wc~P`dγtҧ?_yi@ۿ!}$ļ@|J*G"ޖOI1/$繍t>?cf^xO/񘉁!0s>9h~$3yW3AgOGGS1Α\dK<D}VuLA!kQ4N`^^ P$]"_oT"gpcdzC}H;'z3ib4ɏ?y=L?9kgk}+Xq)>R`1Nlj¢>/yۃ^zD͛,-$^݉?BhC?^c{ 1_)HATuRvnAס :2JrP,ǂ8XR KN(˄)>vBYLi(&l&e(HC50k KAaY9.r}qw|Țڻ)xR{%pijx8Tׯ(XZB"":FyˆpFEHDO`eT{|n{GP7}s^SgD]P!p)#%Oů~rToJc4IIJUy9[;ZQQQQQQQQQQQQh6M.IENDB`PKL\Zư$7instagram-feed/admin/builder/assets/img/singlealbum.pngnu[PNG  IHDRP qGPLTEkCۆqɚѽڥ```처Kױﴚd{rx鮕hg橎d@@@ꂽ˩ʯ빤궟{ooo쇿[ޭМǿաϝo???O_!IDATxYw@q$QJD+QjMm/;/m}_séB{0 0 0 0 0 0vzoN8M bA=CvĮjt1IVA=zsGs ypp$}Zt-gI ]s0bWPv~]ete׉ݟnϒ ~4ک7+PȃMd{)r=/oxIxc7|sQr2O3MvܷvSzk;\Ir]P3P؀7ξjq@IiS5U:Y0I5>njOpFG֘_Y~)@ˌpy,"$$0[n-ȉ XK,y,ZJgG<ȢjT#K h1ARF)JNH {(G$HKq6 aaaaaOyosZ*IENDB`PKL\<<$<$6instagram-feed/admin/builder/assets/img/more-feeds.pngnu[PNG  IHDROMPLTEﭭ""ìȲ͸䷽ݼоwt菮rXN__AAyޅoT;CA롾]2I IDATxڼIPg5V4w(ht>;$YI cc: S{ KLTcwyDj)|bֵIfg(*"P鵨#ryV,3Bw4^ĺJ|ܜ:tʙiתLKdHؘ JYJ%LYb8{y{w_s7kTm4\˳gl1(ԧտ&8^LRp P*2D#zRtQQ{x1L9b$)1ғazl)+ng#Y/mۆ).0z">KϳcJބLHVS)@@B )N[QHPʹM~$D,i6ǩu4>kFsܘn7)眶 M5]7JUy%q>9 đ{ޫ'%h0uA-z\ `j=Lϥ|6ÑY[mOg%F˭'YV_LuM)q #=kNH܀QI^' \^ϰԀ)LֈҥxohSET'r=Ӛ}ZumuӠ%wɩ5⹔'(Rn!|,'a 2pS4E⑋'oh)ɔ/3V➨\X&JivO$h)oh'󻠙S (]|2N0:72)V_Z 'ޫS /1m]-=֩|=q"gRg{&H€(Noz!hᄧMƔ98PH rczǫO_߾**=fx+>|aXfuy%JXopշK↔<E8fxIVoݺz5IHM&Ę+էDfy0iyq5fXO:W1@g>NWOp)=Q˂ -S#.x0Ι9oE,Txf&QM٠<ƳCBQ>E4ch^Hyc ֩s-:zq~.u*'K}^_T5D1ҳ[so6᫟N݇gf0:"›n --.@ŠEEBJ4hz!h̖5obtQF U}sCx#qn[~vE;-3ز:LC,{6ϖmk^ig6˽5G'b&ׄ'6;ן^c;M%9g˰i?t©n?b*'.>ٲvZhN#ک6Lf)gߴ:SI}"Д8]w:Lr2K<ӒHGU}"KJ<؅&ㄧok4bzДy"Ӫ"8YyZo#s$/])gIjWȜk\qxNms;w1jI$iiOBqYCk=>K\lL7ZdM iL~[vi'_Dݫh'8UzZ$iku"_q'%3nK>}&4 t{`r>I:Nյπ"ώgH,鎾wG9oY\ŋVGk;U5lj&/.4yDNjTslέ2խrއMxjӧ)8qP28g-*Mj>GqrqQ^(z6'kǏA=MDDzOd%E>m晴 s<- Ɲ]p"6S4.69 L?jKቨُ& tj N9fq?ڬ)Oyv>',CzGJB9qSj4'8%M#q PJ;[ Q>LN]9VJR3g/48Ύ+N& b9FRىi#(OxNM큔;ki̿ktd݉3%ZgD< N9N`Ω 6Op2[tN7gn>>XSX{<%PWByH3L<5XP0R8LӔXA9w-5%fiNٗ;o/ %$ypG^盀' ݝ%8Rk)eo1hRN9qXmS$o$(͋|eQtw~Y{9wnٶ}bTg"#ٹj46DÅj“&7*sх.d4w3-'IQE.&'"&ZΎB@ᨋLT$Q'Hjp@}U N֭fyb\gg#hÕ0IZhrQB /"N6˔s9FMD'ypLiE.)m N6wSnm,7mJ0Dy^LWAPRIv$xWh,9,:Gu+8Nti3e{RhdOOm"(R" Z5q"xҹw9k"yGbyhaVّJC&NMrr* O͍V4sBrhD&aJ_sϞf|;UvPo.GJj,zެ'ySsM- *^ RVVFsSQxJQ*SJ(*%O3u,|!!*9ɒҞGo}˨ t<-^P LgffB<%ћm9 νzM$i!D^oT5>-w YG$9hI5nPDT'ʓsT&R;)x'\9ok!Ѣ"xR)C*=͜)X۩<ǿW&R`l?Sxt8)nt`~&"<4OYSr"wsk"r[zL9r SeiIJ4Om;n?/bKt& i} 5B/9MH&TLDDunAyR&8GC~zV7tHx~cv2j5{ʸ]8gx*'J[YTxQgKcv9N7x& Pie@<=eurOHŕq3wRmݵ>L%N4髼II[@_r#v/^O  |Kf _mT)K4sϭINDV'|b|h^t \~Ґ`8æq:=4t3M$9D8.;>5yT[8vtݏ7(@*< TP+O|;4Opn'gF镟/~w`njs0=,/15:9'IHf}|O(:?䏳tzx&ZzBSJHi~T/ Ƨ;$f/Q-7KڧVq"&N^Yjwݻ9ե4>fVd<i|B/@PWWy.I|#y(ojh<-@,H]DV+ !prOv0'{d '<5jws0>^gwR#|0Mi-q ̹kOh'ZJ%\t㹫7&Tc#ޓ8E}JNy,s(OHm|? !O Qx-HwP&qhwOe|kKmP@űs)vge%cD|4>ky|>t~yTYT4%i|<sOsIN#D"Dy܂~2qCh tf Nx<g,5?4j}%}(8y&O= D'l'GD)6]>>_mu;>aK~;bĻP-l&4-)+>|jXJ {z;O3'@tO"W+rx?44>!}ʆ7{4<;:trr.2;dzc)=M J%OɉFQ&MD|ݽ.|{JPVyW'"=0б9,\< ;S< OgLL'y N!R$"~GQaSṼc“Hi 1:D{y8'4ɓ@eh hĹuX}]=-8 tI94% Mx>>x)kFLYg)=muTo8TGE<0?94RiS>/DqNZܔ0ɓR,qzr8v'P h bˉ>Gw8ϳ!PH=2Z6!jyp<q7oy7j%LL2bO|tPO'[PGÜy&|XgGhPy)%عVOքS(S]rc$Pۆ%J'D~Rz /<)N#ݝ)%q³n7} FI^%$y7<<8{8'B3r?dmq:[ ˾X (vRD5[oTmEI&x^*^n2)~_5Ϻ,S& RZS#8Q .rwS N+ӴOo'bI=r~㬜e48 PzO(4 ΰG_)_eYsvHOJֿy&{_MvH J)R6N,eiܕT< #bZ=rQIENDB`PKL\8,,:instagram-feed/admin/builder/assets/img/success-banner.jpgnu[JFIF !!1&""&18/-/8D==DVQVpp !!1&""&18/-/8D==DVQVppy!5 |0L@H) P$ !(XH(I$HA  3bKI+&@" vLrOy:6I" UbK Dcʏ/8YcuxXMI!AXBD,=CyѬʽ[w&l KZ-i-b+U*k3͝m>_g?=o[r{\MU6HAZZ\.tZXBA ݵ~WL{MjkS(qK>:KrI+-jJw?G+սN5\x_v2*8i(u?m9s\2Βҫ `Ad>lۧNR?H{_ V^k2x~.=^>xL\Yk&K}l1?&{E~mk꾞W?Yg.tV-K$%W['ݜ." (/\Le&YcTXKR̢{Y?=^ezf2*gB'Lnl׻|>ߩֽ?XeeIiOWg)Z鞘eŮa:w=>_se7YeXK^iSWU 2ƕ W-Xw?[6l<~uLS,fXeTeXK)DJηrq~ rλG' OG2VSh[~W蟗+1S<2M4]Esz^U+7~/S1p9~_tg[$Ζc7 Yg2e̦XK4ҵ'G7ܧވ.SO|>r/ݳeW{9[)q Y̩Ysf魚S.7vE_///-H+R<_Ⱦz?[d4,%yg2β2͒Yk/us~^^;΁WJ}WȣEjO:_o_W>c2,rr&TJM?Y;|C~Y~!jxc7,tk*%Wqw/ 93PWN#_()t9ye:KJdXG&?l|/s7a(}gb>(UJ{eZQ,I"Z aVf|fnnvCk݃}g)grҲKH&ʌ3F9L*"VL)U(gIi T 2&e8c6XB+eݦ)Rְ(L0SD- fzJԥb,JIH9Mi&RK EA`A@IS--5iIT b+q &VlMD",U"($ HQi"B",T(@52,$D,  $dH $$ID$   P( 0@Pp(8=vtOosf"""#DDDDD~ cco󘈀"#| >cSViI%ĒJ(yVj2I$QEu Jrs=555k39ϗ.A4cJjݚ$I$)DAki|_SɳQt=ȧ>z:YZ[|Y@dI$Q[Ǐ8p|>3O!HRc)I$DDDDqǏ#mϘ_=5/|n/#Ze49#&|j бj_<c2jE7Ne9"(ޑgxÖ?61#ۙpىbwC:"9n*/d@ܯgW L#,٨aEYE7aШs#9}o83}ږ5]sL:Txl}[bW#FO0&n'2шe 9m`z0%@JTUY$ & [I-9j s)3İi>d1FC1ɽ)-m(jǬ" Zr5zI19epobt Xɚ:VFXve"3i9KXno\]2j,5QV>V~+*4 xdNںFe 223I=ӭ븟u)}{H[5q/if%#l]Ľӭ븗uk{{Hs^?䭜븗+fHo^?䭛븗u}wNt6XlAW q-=*4#6у) *hvyn ը#Z>YV߃8ba4mA+ƌ?J|(^U~5g8OhYb Έf}0j8c" "d^ٵ-Z,9՝lɒ;Igd84(: CXAx,FdB|babXZQ@I5FnPj&o-/xVs ,@B|:<1[]O8HxBf@ k y[Ar$Hxʫ_.o!ˉ`d jK{urs u4Ḣ xxΗ9)P=±[!{(1Ƭ3kBWVzIqҔsoĐ)s2F4\_ʽJ>!}zl&(2Xv',@asGu?&Yl$cI$f@p"X'=K|❭OcRI\Kͦhp8gXE='rqN-w E&/#1r-H5{6Ż+9C!,NV nUI9I<+#䎧apo) FP c0AʶY۴tQP5t C $:O,l;bU*,L* +(vK;dĒI?K8eK.[~Y3ɩ5n,jčXAyg۾AI*:a׷X}UFrD[5/-_¶J^|,5l鷸OFcX\Xewt&6G1WWӿ-w#i zuZlG05"I)aRNeg?n&`3Y[.7Co15}#`XT⮀X!{BdvS&IsNy *K K$O W$TVO:&6"L7=jAәZ66n]I Jضg8]\)_-o r:taMηӶ.%Q3v#>2Z'lM<6i.G=Ocs%utD>'n`fI.,14&Eht̀#N`0`!5m{nޢ/oGVTp5mGVTp5kVXp5iVXp5iVXp5iVTp5mGVPp5<$2KJrF %o($j>`MbF _=!$ |] ^^ m^V+&^yӖY%B&_]t wǾ~_}@ 5NI?b,aX--!̑QW%g8בW>G`oe7t/44d=O |->?qHS>9 :tJxfHA{oZ d||~?q" l3 l΁<:._^a88Yfy,*l' 3N5{n $쀒xGQjg8`9 oCEO\M]pa< %BrDO;8%svZcI<{R $9[]yJT>yz/t?;LbAv<_>H?orfP9PG&DѳxXtc=y+ En}4:gW>'W>'W'W'W'W'W'[A;NR)#(5K84Tp,UZa\jjj W/8ψ8jiXdD|nﺀ\}ᠯ=y,[uel' _E |5;@ !013QAqr 4@Rabs"#$2BSCpc?.)Ѣ8=A@\mvޣNͬSMK Jpob{m{)&^WømjZ ~wJpDM T 6 ^ &:IM=X׷6Uż ABn6qM%881E-lB4'W2J5YWw9ᙪv!.-f~!gȯ LG15Bס ~3_ ~3_ ~3_ ~3^/ B$GÈւQn"п,D| Y_.H}GVEEyk 6O . d2WFqa>V{XÒ0ō. 4?x9戆 ?djsW{m!8U9 6~q#5%i"PꁡW+5x90>ȑ 6UkÄNsQRM*iSZ80KHλur*X p]ѿ]ѿV;(qf kN7A ^+g t툱 F¥ ^)g|r4 t6js]3.+ơ7,Z`b[Z DJ4W=Nl!ķ,^,'Vns`,Hѫmo`DTp(N#+<;wJG?x l`AQb6w+ 2䍗r(i:KtJz#T$]Q }]ZQ;A QLv=簡ķLZ^Q*7SCaẙ U8P[w-9D4kT $|UV[w-0ma4H'>,qB<Orȩ&+ 袢FmYEe&#a ^'g|ra[D,! ^%g|rQ |)a{Qa N39iM)ihV,1~j-;㗉A8H6P! X[@4F&@cji!RIRC+گj)2Գm ^-g iV& 5xr(4Z8GhUqV(J}/IeR㰂G0ޑr*Oi<V.f-g!^U^U^UHZ4K HzTf.Y*ߒ-Dqcr%QA%9b,xgl0#HFEN(?HèŒl7"6Ke4k !VUj Ak !QQQQQQQC]MTTTTTT@!w? !0 13Qs4ABRSaqr"#$2@bcp?VGxdUM8`?mD͏C SW9Gکmev1{&?;o}dϓE9Is82{H@UGO~\Si2wWE-e)ds6(e{Z9?S;4>ٰf\ak{L-{|1- PYYr7&tkZ%p>N^w }(dG&E ?Y7x/QɻxM>⣉]o.C9_%ƕ1/F]9/7}R0+uqn@ڜ:]^!7x6Y184M҃VTBnij5L.8t7WLJ"dn>Z %M!g|ڋD>:+xF.Pj12(͜bh˓ ^ٜYj8+cLǵqG@]3i  lW܊_j\)X #@ 0.;!y>@wuyFVG흼 ;'lhbu,S7oS;,!*Q&j[p࣠!:wgE15RxX$_hDt7ONU!Xt\"S]by׊(n044V3VB=re+uN>$t7WL`Y~NuutYk*} ?S1p[jd{jdZR=b s)} ^n0?>B8'$EwY,唭y_Ԝ㛽{ 相D𚪟& |%_$Npob#aZ"ULTN}KKGTF!FWg鑢Ǎ$G@ana #&3S ʝde{*"SzQ~۝v,=GD{Dў{ {[euFIO"{/ opX߷Y46~d!= FP(Tڳ&r{loY% h\ߜB{jF #V'_n"""""AJժURJH'G7+Ԯg=~Eqg5vnea3g̒%˲+C]? EL1r A6cƌYDVPiaoڛ(.vȔ)T^}FO}gx:݅c;q* =V4OgV@(N)W(T*(>aBT^moViAi3gЃVBe&uV;0y%=QBe&7fT<.=lcej MorbyʴF_Sx 9E*>jTXz{Ń:fX޼@6Zk&Sv>rPf`sv9ZA dh0)0סB-[߾\VO\@e+SBrizf?fϞٴi.G _2Kb5kB]/ (IENDB`PKL\JB@@Ainstagram-feed/admin/builder/assets/img/process-featured-post.pngnu[PNG  IHDRKKPLTE  %Zw(_}-m5}C۵aZurNJOOԲtRNS A)w 1&+$ocV20w2B/IDATXV0-ykוBLBBhZ(k5J&D?$; $oz]m $0`,YVR~yIQ'gQ:%Ggq$,GivHRBʋ* ǖDTEcYJ eHRM,;c8*kT?EX8-t xD(t*0,"ʲBѽ7fZ.uYQF"Ra`Ɉ(b5!_DqYFTJUA_zd$_Q9ŚJ,/{qU+Ba\CU_rgdcXso7csyWy9VO6[Ysj=X=w3{bGQ%OoW#h\~Y_>ks1]=:t~(=s(nĺ;$}"D LA` $C |>|9 `HG`L"D @$DiH&|`0>"DD(D >tX>@}$@gN`@$ HD @}>@"9"DH Ot@H[3$0 L"3 @`DL0> $L '2 @`t0>   ``D D $ 0  &"I,t "0"DĘ @L &@  H@@r"@@џ&D0$L &"$LdЈ"@@}90 $L "d&udA7@ @@r@X8 >.. DD @0 &H#"dLu:۩8ـ @Ds,8" $D ;I,vH"@Hf0$&H&IV y0ыg.oBdǗl'̥4cty/Gt^Ǖ DxW;(ӶZ-yiC>h>ξOg.zk~.ʠ7r D@-F`$ɒ&H"dzToQ |zkcSl{~>\=^'>6l:[xz+c>O~_7ZSgr/oJ}^}]z7f4^-3yEdFʪ%o}ZȁK gSOIt=>!~mÆg}?Gz>7/Ot<ڵumG'Lֽ.e>gұ|?WBuVSk$DH"@-@&H R԰A-FNO6_̾o_5;_>G(㾧OoPil}_uT>;~w zs?}Ւ9z5Rubj:nMrv讧mvZl-t~M45\=w.]mO9 D"r:H NΥ{{L_3KlyrWV|OYLuS/Ugchz<5:sq0׬Q_w~CBooɏe%.k7nZ?EZ3ޯq&5Wf G*|ׇxkZ]^ZŌiW}|D r DeL&Lu;mcv{d2҇\\0:V?A||罿%9=7s~xw',6A?C㥾/3K\aߓ2޿y%UV"c{lU˽Th辺WoT NTU6S!mչOq[.&ȁ@L3S|y/w3k2uѕR]<ۆ2U'y A>ϙ:y_-)s_;7׾zUy?Oߚ0>&Ҽyw2Ҫe.Sӗ-eroY[S-9iٚ5z샊o`ZlOR#&-$LkFйw˺T9'x;~(T4}xz;suUV.>wϧSֳU_jG ?/ys{> @p*ͬ;ikr'8r9D ZKh9/V{Ֆ(ؙbsbU۩4 pqoy5{?7\ׯc>G#>VMٖ,Ʒ|m8Q7[1e+#-jo\L\wU,gmP.ʓ=tZuZd߬%2/ƅY#7-r-I5WdBio:{>7/-+ ωEXa٦)'ǥrV}ky?FZ>1?S8zw?JRevzK$Ú-=+iF֬=7y/vRW(ەa-3R. 4ڭr'Tz(/WO#1R6f[a1pȾjD"`XCSסL r%5wQWya |٧޹,i:-3Z.e Ykh[bOU(np} ZT"P:.],gU48^:d-hi^ETRR{+!|3p98wk_,5 2Kd P-ɮ[!3C 5Jhoq?՝l;LaC 25.6i'k LR={} -se|7҆RuKd-s-Cff3i:!8jve"ι\fHD5GRbBB$X6"U7wsVo.u#`rqWsqms[\OLHe3U 1ۗyyYg^5/k lhZhbsi>kN])r[,Q*VnSNvqM8Z(\zsmB#Xm_O",瞴xf̙jܤ}>A_Q-G"K5 q<+`ϵ8 gYiBѢnZ/;]R4\mV#H_<}rvdI'Is͇+vvN].V.m8>[St r&EP+14ԥJBR뚓6$P*QЌIES<%. b ʴ/3qK|3]SSHyS}ɵw:NDG[kKCyU&Z.uz V_cUPeuH^`r9E [z 0T*U jJJ#V Q|tPjᱢVjeA;~y3Pi9i=}1˹w3.R;]V&@bK_=XЦ$k0!T[^V]ɑThS"lESfe>vZgMzL,Za|[SӏxwsOʏk e)֖dXo rz|ZtRfLϥja+緳Ϊy#Qt˹rcZBH?Z!Shp'߄y^j˹Svy-Ay`daYih떓:-|ު:b\ =l\oyo͢Z0O̲)aД걃aU̓2uDDUQl#N\w"Muhyע>K<2_Szq8M7,sk2;̷_3vEjΉ袍gAs  ezLQ2GO"]Be3TfhNBXf)@KXzʔr/ o=4_Mc=+ W)HkG.\*:gf=y}H=fʏ׊2 l4rJ!ѽ4SLh"0Bvg)jnȞyMtxS4l,F8U#g"\F%@"0EL}1Vk.\utTLЋŢڎvy=P͙f G;ɛGSr¹gamC)5\*Yi4PA~rtek7|nh*&q vZX ĩt/MَNb7)<^*EZGS hzw#,SqS\egdXK!5'5.(TF1kPVZnDSe@֣[a&XkN{=2jlJ:zQ0՚AIƔ !5cRM<44PC&gS\*qs 3fSD3JY|-4̳oWNX)IVd2O#tt%%x1T Ez!1tӒ15t+7e}"@Ώ̂@F48=1z<"zxdg,cLti+mrzs`Ʀ I#=j-al+B.2՛.M9T4jӉS<^z|ޫFȉEǕh%wSW@H;Ғ.Qᶣo{aP11'_N]i/K"Tdy@.G/-_E5Q) f.3M=Je벼*zqV^FLn9W*#&Y9sC\FEr( obRhoӘ!:#Εhٞ i&Њgri7Ţ30]7,'4g'K!~|r1 i|;?F>P#Դe{?ǚ9{<@Fi9bKE!k'*S3Wb U9 ߞ4Ѣ0> S%a"uXU,WIɈ&L\frwMK=-?/BXK=4|̷9'4q.͞{&',>w~~+N|(k9enQ@U$X\˩UYƸSţ q5f,J30Aam)esFbUil̿)Zx7<<>qN_0?Ku)1}SaνeV^ך\1tru:SN8YwA)spLQX]BȜL\U7ښ{a=1\ZYԌtP0/=5 ,Mx=4QP40!<}*}5ϟENz wI8-Ο=.sEv:Ei MU;͠;Ƣp=~լi Uب 5"i)$0k&yq\ylo43xI|M:4uL~5T@~^Ep.z--u>OvwW*N.$9rYTjJE\2g"=*VrR1ʂOvжr$X):g]fn4,5Wa="mW,^iv٪S_׺TfhBg"x S+̶[p[Sӵ;y>Qo5@%ùALZ^uU3l^0*Zd( >ysT u<8 )xn+Pnx`*q穭XRmg6Yz3fi(҈GHL2zSm1E,_.yWзL24w8RcQsGUhԜՍr^ QvU"ŪIzoWEGMC5=L8/N 'f{J-iwЀŠyOO=.O!-f*M0Xrlфg㯌FN-KL[L S"gXUkW,t]X s[uW7iY*I[wB3⑗O)MX YmGxp1e)jZ=X.2׽ϨI Q,H\zx!k xdCZǠΕErSLz`>RJET{ C!QT-ێZOlVj1=\f򶨢iWzhҞo9_ +T$ hn=#E ;-*\BVK'u A_J]*<(:˚BfTt{!7_3x\=pgM%籏)Za-#uחsOeAˣ⋞l9Pecэie!3y3s:Ӭx]Dnsr-(]V#z B u=Z[ sTA$3[GYiν枮gη=';<좳a{-?&E>IO6!"#12A3B$Q0CR 4a5@P`bqCcLV+YbXV+bXV+bXV+bkZֵVbZֵkZֵkZ+bXV+?TEq+=. kZֵjcڢ`XVkZֵk^B"p=L 6ݡجV+kXV?]f~8浩32 G5_) l?+b_c詻{aZ(ry=waT)[C#;ǭ0T7VRnR!w;y(O0Qk=Ա*a´Ro!z[#p%3kZln51;}X7 Djz>5rqs҇5~ g?~==P|^&>#+ֱLBKSuwx<~N֒EW3C6OՄW9bK"*~{o-I~#C#:+wR)))ZH{_1ȾVg'Ʉ֧( Yuh$r/Z]7C'@އފ$LV|Rݧ#A_ .RSUUbIg{DiK=J1U>B%MɳQf:(uHG+b0"]@Z}sHT^/DʹcYADi`#bkb9F#XQUP,x{֥jjqC­8. [#簶p"}\>8P)2P|IƲy_8/zV3Z*J5&puO_(|eZ2JVN6N(Y=5>):Oo93C'^{3#q*u ':^m8K5|R9\oVqCs0oɁbШ{ K̸R~*w{f^xV+bX 1Y^T1K̾|%4^gV1 553 6Z]H2?6*c*Ȇ$&l.7%ȁ`h24:ܓ;Vbu֜d2E&y3i+3-Nj "<6dq$/9ԱZ6ݿ)tp i 2ޥ2lOq.09M%ޖɉ(Xs:c9k'іF&)Y ďAPb*~QdbF  XV+ţZ $JfA QL[N@W2%٬g~DU+0J'em97Zde]"#ʟƝ)~dvm443>*jPmH-h&V%0.{lJ`0RX9x.ҋլZ0@, [NT ==E܌If*(dceVl4DcbhU̟e#1ƕQlq{N kQF.f?bX\' &<`~u(d\EL\fG 1sPP/le,ԏ*!rCb{H] ϦMFT1%h1=K~F8 )\ofė9Ps-jɹlqZt.cHt'"tG #s"QC^~*Js ܄J-g ͶD>8 P`Hc7eϝxw*[@* bgD rL0+`b:`GbXSNa2c2Gߛld>Grf;'QAJHxvs>iԴD O۵_p*VP=#d~;PdE0 xJW !)%1[, ?*&USbjbg*5B1S"8N$F{ri;sN?HlmS8cCezR+XW@GTmCd!>͌ڥwLCS p@{ۑ"H2eieL'B;:2 .eh8k3 8f.p ~,٦_I7Zߎ%sv`[c^bv8ԉ2P51H))+{K vaL"!eOqL !|W^J.<4Jݖku 'TZv1b$LXyBED"$eYgj\O혹#>8J(1FF0(BPcvb Se~&*P*0")פG1W(0.sXȍ&ԭ h,'s3 cy"`Lt R84bi34=qk9.6,i"YoBg Ʊ9J4nn8G &&37Gdk~3mm>*Zj!`s+-iOi;HGiNr nN֋iI'Ty6b/k~PZj.0œ ]bXP.;ɤb@d*- rҡ/%5m40[ IӅHAF;1=2{F W$aWVߩ/eCqc2"1%k@e*˴dAwv`Ì-R-B9 P/.B+9]5!'a@K8ʴ&6Mq-_"d56O x We &w4 M>yLM w/X\FP̮}!-zJ:Ac`V+ 7ߍ Nfn8@X䭢[wTv2^:Q6IFt jT.d dI#~Se8w,mؕtWoE[B9~|Xu[hd.Vvf#fagZ"(90xIR ^+R1nLB[E4?IQJ6FHhTzjkd)@"=FVmkl/0\iHox#1۩|L-&uNrHm/X1&2l1 ,hH4:/hﴐڐo \-Va1F=[8mG6 *ESm#/owJ#j(Aj9(ߤ2y)^&| q(.3.vҊBFh`GȩGrS.^z) W!xG/z/VƎDqzKhR^YÇ@}4n,&g,\:Zn:o.%6f#hIa6yJ#:v+kBSC6DKf'0#Z34u4DYaOs[]G$XqAq`ǻ%q'Lݜd^-bmnd%*qд w%l@q5 n7 Ú1p̮Buɗ\5jk)!.x`By#"3@ɬݾu>A[A1x'A,ު6$[ZsRX&=i9)vQNEfvpY^R9l!VBp,nKJD8}XA xbk(Bf+Bz6pBEӨEBFC}B|ڨhHلdI3kD*0 RQY)=6{R Smmor9o+ dHxI)_eC#Ak+)eskFV`C 1Ǿ=7sv~+'n*b՞٘w0N 1 p fOReA׼ZpR 79h`\D?#1ޜh|꫑)b~^(9%K1 ~Jh"IZy,88w03Vr8J|'rҭr6ӭ0XrnR$\k|Av˗ P$b& >YwIoM$i4[Ҷ႒tgXLHe WI7܅a 2x%'fɆH r4 `n9jEl x!FW} _KZ;k[r ܬ})и9?I699bMzPa|gTfp41|IZt@&ZMI^0]ݏ,nQ&ws8Nt.HUǯGC2+{%)%Vw7 ӒJ sFy0wp61AG[ B?pLP3RX׌϶<[kJnk~*g'ZRWIȣp T:dsn.\DaWR6EZ@7PD2|'ɺRtw{0HE&E  t_)"ԠsknV\&uɒShu+}D_SWntY^  V<|VP:e}.owDR208o(546rn]Htg`eDIUopA'Kk薕Z[R--j=_Q̓ 鞍FdA®-Snp$$ͭͨnJrd!Vf/%S+9I1CigqM.^,pwm'5dvILIJ/) V kǹۦ"K\Ԝg&ml3uq+B _ Zɻ@Q$W!<7I颦ڇMu$\]/e*% ˕bs"k>Ae\Kl'[[!wuKZ4+f;R2"-mA@\[( P.faMMM3QcLƋВ|aM'휈zrG< ^"Zc  BqE%<$6n-ɶ=ǡ]UlN)M1)¤t+awGLOsV- {Ld\.jB6/ ZPx ywLEgDɫ,%smc 4ktقޑQ_?9P_dˆ1ds;I hWG5\jCD˝oɗ o7 376.򿩗MX_Ҍ Z]OI.t=P`@iN(myV'|@@ӆ T;.n}wys6qM/eސw 4%w Peq hqղ8e煱9\oBKeY"&xz͠Wmh0( eg^OV |ހx C#u۲TG \"Vqd{9{05$ůx%V`?Nb96cӼk]א#E*/YQq!6> 6OԌLU!M4S9\_8E Y:C|$.p,.sD?t㲙X SO6V8uKWnoS"E;iHۺJ V/]JUܼΠ@4Rİ`6%J u NbC/o?9W*PA {p\nr痧;@l;{AiO6 `PÚE:,|ܝȫ1`^[U;p[gk%lm;t†ְC"NͪH Vvd]ZȽCyl|ws ɄSQ3IF`hI-ॖ$hSF;8f Q +IB:Uϧm|jMڭ Q rC~L ܩvkH^SqiI5{sFsO(jU]ᥞBq?Vj1.2Ҁ8}Z@Ool /e 0>y.xkyD$c_p TK躚la㓹E3_X5(Qa kkLėrS=Z&yoN DMk PEmҬ^p\E2;gKi׷TNfcEGЉwd~Q~'J$iq;D2 c?Y93ҘXS5_jd%&L鹼ޒ%u TUZ6D:#m"iNL2\i Dg"PB8i|Gr,aq8F+PVl㫁n UxB8`8;Eq?Fb6\e͠#D3XAOzȐB2܀zqA;cbSrn a H/mL/Y!Ax^-O<\ZEz3ڦDU!-kd!~Yu"F G AZ x.@c'kn+w8 vb >s3bT~)د9ωO9ڂ@(.+1P1'^,0)3')j&YU1(̑_9!$YeG@iу{M~&(FdguOuE,W`lqTpNB)7rucr=~R_']32Yfdb?8y"9;ۭM#ڇ$cE6}V.~ l1ܧ?&=-ۡvh L(xIDRKiJynzFj7/dm*VcTԙ6D =W2@\8pNJmymċo_DBPzu:\\rnS!Ӎ g7_*g̒-? gEt1g03W%#?Mj\wDUxMKLd[ny۱r9g#=5Qo xMFBFDK4_LTFS=f#IϸUmE1CݥZ`ʶTɲs5mfw  Utx*PPL]>`CP[_hsD K)YcaSH8TVܣ58eGi٩9{.#۔L.jٜ{0ٖ8r<VClTɨii%)7j6 b+:-lCڶ9*6ƩE j@`gjGZ툫8Cpq !7)JLM&cQΓ'AXJX>(M,whG'濌/||}o5\r]eAc Sb~9fe?Avu`y]Nr][ o׬us]E_2Yj,6 IZ9q%HK "~)2n:J%w9֢{ABɦgy⽏ YtH3nNS63޶-96-#HYFϼ]./^U"w٨""ރa3:X(aʿ0n̡CF;c3Hn\:^Q=XJx~lU+fgZfw>V~9(B!8xFqӃ/o¢df,),Wj"-f>+¦xԗz: qE:${|-kdO+0XV;GP 1SVΓ)-m$'Q`/IdkE|/C/Z6$k4rˍͳ^=r?m%&n"SK]D/8ݬ 8"k[Fh;806m7';N'*ipqL:21-;Riw茓bzk)5+men@L-T.po)TcS_B!1AQ"2aBq#R3b r0@C$S4P ?O!㰏2`&elwA0ҡB4 P҉$KXuԭ4J6ic)(X8M:<%?D$Tz-l*Rg ḓe#cx@$iPFIef x^+7N3!JVM><,md jPHE9;5 H̬Dyomy ,^2)\%~7^d%CPkx+袚Y ԬJZ(gbREFk&Q,sXnbW m\Ajn\qO 4CyXu,V%}VYy-Le*+,*}SDи>d/FT7u"(i?4 PTduje d˴62W++s:%_U\/L?4=D5rD ]x{V !\EBŨ7'nB2#dGĿ8ɗ@ZfQS`\/QR@,(BO7N2iX@h#t?Ot|@hW #a0ݱoJ%`NhLi("!|&:U`%s&ʎU=UMP,W9%{WV\q/B=)}_ݑ[j|] R<#)A*r K~꣪Be*a{@o@J~(gek8]rM ÙS^JZ#qh*iZe Q5n&\9/ NT4^vF7XuI~݉:䰃O3$*^g*j;d0V$%tY@5Ѷaf#%0@\D2OUX/Ei:WPNN ;M 6v hug gU.y>%9&$dg߈T2m֚j7M۫ O(Gnoq4) 9$dP:Q FkNN3璾)S`g^Be"|X)ץ#\IXt%˘n&A\R`FeJ#,6kW9kD06VrZeVK 5Hݨ9Ȭ>-a @7tiةUjl}Ue5 V Ӫ>ٻ– ];"uDuQPӰ y#ö|i?q@)Z4V^~MAQ3aTp5j78nlJ˥J(h nv^%d9R9cU23rG%$7;X'/N;)Y\ -7\#_̤NgШtBy)[ tFgE4! V]5S a{[QĨyB,1|rm2~Lh$@K$ ͢ q'M]2QhD9'54/E!C%Џrl곪g΄!c%I.0N[('od A:3>A!$j"nz5sM{PtJ B%&M,FLg\r*lr>!86vRAi̦VS A P76^2C$ۿTs#tSO% SG!fnW U0qRhh/m5WYDi@<Sj\qzf%6窃PTd##_ʝ.'D:-Wes9b gT*[HkQOu>H %y i4/ԁT艉ZlvG'XDXufDU2uVa@r)I_RvQȧ*c)b9':hZj`VH0-m1O$>EhL?5¿aL=9I6-cR5VNȮ-Y*mPNy' 9ġΠ;4\`a_^g,`GPص;^6Y깍jam _EWwԫ4'J9"9`")688 &L9[/SnbvTS(a w˰]Aʤmrec$xZ8T^_Lhewdyd%C͋Nji(Vk˳D(XeXO`/U^IZ}~Tl@=ħ/1 %b6t>/ : >8-Bh|\`-5!N,* CULMd!C2NbqCuf A1VZrob*?|TZ~g 3r`o$xztXêD n^7V'%k n4 nSѰp_-p6F'5IF;,P셲fJteP`x0kIb#^{ل*~$ vj?octQ(W#5y*峺s<|j(u7\$[{]KFƁi#Nw5#ts H<9fe:q[<:B{|cM>u\?XtN/.΍XS]`qmc =Z]UvO4&RwZǶGIUHnJ-pp \S6X,:{?Ejic8?>.&cRPM-nQNqN꬈lSƊ *G]4؇Mc# v ZFDh"+ ClsMO&s>Ӻg @SUR8ORiF1#%3(l7%Ϧ!=́=@?TDB}NrXcw> hSi"eϛ*Z@(qAu%N{4P waxNZN^K[aFdӪ(DN8PF m:|  \-䣇 xZadT&Sv<桎ڀtaT5ZV#qNW ]/U-l DcN)٩źPQ2[d0ܣtV~.B\rlXUnt2X/l>"Wa,Le&!gYs 73`Wj.rQu!gO\P$.&$6S(J$ea3=| AU&ᵲONJI08cUЃ'# WI2Ƨ6V'vkm<>-Ou:AHKIP ۝q~Xa ̒a7lZDF٩TI6?KN`tM̹y WDL$58xXfx+ ߉UVSpО9sTBz޷'UbQbsrՇ7X 1L5Gs:PY=C AXd3 Ug3 :,ʶVTIȩqD!bz!IF^j{]Mv.+C3V=CB&Xb ݘuXc|jv`,'!'d\Tr$;CF6>k{򗌂k177\Xn"{ #^2SO|fFiAۻul;j+5yh\>]%ngdM^Wd鲞f)fǢmN4 XEUP&s\9h #1Q <=T6Cѩ2%iɾ/n'L6\XDaM1.]bG dp@4 SN#JQuQn$բ~BF .ng\[BШO"T/*cZ]2dfQ.P.zwnxb' ݳ1▟XtbNsyc\ޔ`f|)sa^?eIo,ʝq#m7̪%Kq,~<퐉$,O=%bw1d,GYc<}!PnL x-)LB EW֖i `+74㒞U:!:P \挹%#Uג`7o% ?sy40] ,sutf^GU܃jw,K.P_qFV^5Lf/huƗ57Vx+7R(Q#^-m-9N'HXnnE1Լ1+^NMˎpߋIOXV'YsJ >ч-& hibnA^Q*H6#nቾ4P5Č;&/E-/:hڡXEXxL轞QCwi maU9u<"6_?:7pΫ˟4~e~j7.NÌ(wxC2%5*E:G13^'OD~&XM=aY\UM #LIyUI$Z\mSu@m|ګ6B]| eR,|(a9,L]c'f"' ic2UHg4ofpK/mqv`z,1M]^`\YT0 i { #3;&|{*nAtX>vy&U'dN #Zhq mGQ0sgrkZ̘=Ts26Ԭ˿tq$F_ıkSSηPx<2PnˆdD4Fj.bdce 얳BV]ΜCE}WVc渴{=,gP>#;ł?š#;+k.'Ug{ hvǬ:5*Cg@^؇G ͨImgު9j~R}sfx'ׅpbj]4HWy46J&E-ƪbh*AeX,J>A MC*Q.t舀[7/@ ;-}zZXJ}O-:Ih>5'G 7mSwyuD{u f3^l"KEE T&a\l6S,tPLuC3ގb״Pf FŽwDŽee뼡D ̦A>W@%">AeIl{ȘX)+%Bw 'NgxŸDoŘΡVh:7뗒kWvO,9 !,nDہ{}=#HQ)ݐW$XE^as@51,G,6p\쪛t6"ɴ7;*tz'Qɀb °\ՠenj Faw;`=`\ϒeIOSImʞi#IfL RWU$ Ƌ(ne6.]z*?NBc`y,*q kO rkjtFUEgulQpG鯠9Jn9: IԄYaaC"*fyLf50F=~x]5MapNnBZrh:b ᜊyeBcF58:'1^K$̦FM!t$zbFY (sNruXD2b,KXnqw%&h8L׈3q^ބwpݲ%JD w^fK&]ŹãŲ#ϰ\t1>-U.`!Ŀ\AwI4'?A̲K:v;5,v#l7Mp渵6-J77Od}"GY-vfXX0`⦻wE7:V?=Υ}z kؗ]ʇ`;z,84!)E= p2]׌X|bj؁#%S_T9u qG-&SHjvNkHxu]AݐY{=UOEFIe*6v얂{' eݟPLTv66":g$7 lxa5\3h^#_ƭc]5uO*MPoE}W <"c5ourŤPh}Eq)tχ& puM,3F6ŵoV#O 5Ή*\KePX`3FyUJ)-?˔)S =Z>.`5DW2&ܰ& .YW0a佣>ko7]W&Jk R\*g!f8Ϳutp8oU1,tW:ik;'wu8LG5W-oN"&I\sq6}J4·U$koX}Ժ3%L:o܌V1+I,:M7/jyܤ? e\ODAB%@w7IJrpaf.XlHHwM7mM"`f#o8Q[C{XkXFs)~y[EMy2Xnqe BdD 7"K?5X|Ej!N.4>k3\6ݮh꽢_IhNYK|GXGB. 6*n^ɱ{Cn>.2:sp`4W)ѪPlOU. ,)mLOĜGXᨑ]al<05{ڡ9|,sku'{dB훪x/9 Ә \X:LSVKoztjwyfCϳFUX)2Zf>J9츙)tU5 ~$M94=JV5#Ntek?*"fHb-LWwg |,*)U:iBku"sXS涚~H˝r\=y dwK*]Tmk z>/ 'q豍L S`!$Fic/[5@o,"6fTىݎV=LXUqpi7v5V=W}u7D&C~N8xZzS #Q#\b8;T4 7iҧN8CvBY7U 7X9ܸ[똙:+@6D1>DP-:2& 촃1#fXy"@{&H^DBmHB2MtPrW8 m %ɦ` ԷdӅ5 Ɵwd^`bZVVeZB)Ԯ5O诈]95F&Ϊ>>œC{5A\ 5?t㾽<(k8)C1 Q,,Hfb[,f52O6pۇ$z+S ;p]9-ToHЄG O TIte|״S^vR1׼#@3B"Т=A|SuO*Ǵ؂q`c[c>-}S-8o|988hV\o;HmTqS1u%FFV83 dې2@@YwXj EIho)v#I<=%c59Xrst1@u*I uT_b4Xh12I 7Jo0OGWc韲dtP-O**^QX@`]3d|vVp1"*`Kꆷ:1gYV ix=Blgњosb@Ó:c ݷy9RG%'eՎ˳U~sې0J%3j83;h*ЇaYu굈[]ӴPUƢ*;Èܛ긞]/uܲ;P! !+VN꽤cB.6N & bpUޤRVterqMLwKسe.~3Fhp1F&pMVÆhram# á);7.X!+WTj O.xiCjvL"Y7U{_gb6X?,Kٝ+>D+Tំ bn.=d_N[i ˆ럒}A-]D;%}0VtQl Jg̭Ps'`^gU7ey #7~ڛ |LMW;"kak<: h'8m .c UMQ\S, 'D@h 4Ct[-Xĥr\4.Fs3T i`d׻B7`\Xp9&ael,)۔9V i&hwo  M 6BAP2׼,:BhhM[s\UGq/qӢm,Rv#pDK/9vBSFwt za֒H"d]Gf7`JB%vjQ0Vy+EMd-~K1yaCycasۢvS> Ux~pp92H4] eWgx걦l׿dIv‹.2t5E_$;9Bih6K8L@22jF.73nc,tO\Z>36Ҹq[o00 yE|i BOdICq5Mc4A+VccFIq-&)@b.YէZϚ3V #h,4& }W,n{4zƻɷӳ>=pZ/$$ cxmVЀ1kply80f) uyhN/?ʤ!rk`cỐ2.7e5ӤvZuEΜ;Y9vEu);[NkS*LdƶHOyS$^Y|'7q'%ک73Cޓc:;i{G@ǚeR[fy"|Œ6Ll7NQneNEu0>oGelyzVBUi!xI>n fV)ށI|}q9p3vn'W?e wyWEp0gAoIX.UMa7h!1] 6n3)>G-01܏9NI,L FWnˈbaIBlShy\^hT#Tx5Y*!1AQaq 0@P?!'?dsg?I&O韤2dɓ'?T2~ɓ?~'?I2dfL2dgdɓgL?dɓ'O'dg 2d'L2~'̟?s2d')d'LgO &LO2~?d&L?DL2d&L2~')3?ILOd~??I'9d&O~&L2dɓ&L2dɓ&L2dɓ&Odɓɓ'd'L2dɓ&L2dɓ&L2dɓ&L2dg?IS&Lɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ'?I&L2d&O~&L22L&L2dɓ&L2dɓ&L?Dɓ&L2dɓ̙2dɓ&L2dɓ&L?I&L2dɓ&L2dɓ&L2L&L?I'2dɓ&L2dP2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ'2Dɓ&L02`dɓ?dɓ&L2dɓ&Lɓ'Odɓ&L2dSɓ&L2dL000ɓ3L2dL2dOdɓ&L12dɓ&L2dɓ&L2dɓ&L 2`ayg{*@rdɉ&L2dɓ&L2dɓ&2~cϟ&5yߜt6NG8*7~>0Hs P-ߩE;(qpM3K^/x~I7>!ּ5BWn^Z/kztsKj, \jX$m uiw*V?.A&shk'.Zh5`,bzrE'aOXh%811W)Po5Vn/I D O*=xƝ!qP;Ge  _'\?Y>p#R_ +ۤP~t n.ǰ01et8$.^:[}Q^ZCj=ɉ&LOd&L2dɓ2d$_;s<|HƆNKKL0\vi> 2TQ`@ `)Q8ɈǼw7%dX6}㶢_cC%Ġ/9{MϼGq/$ut&%}8>F>|`~:6#`A'}$JRۼTrN9qdk=Tpq8:3fwÚ&_U6 iax{DKYf=fAmזdikbeGtSg9kĢ}MdD ˩e>l-ߜYmD\LL2bdɉLɓ&3x~ɓ"RaWKCƌ91DG D>56̒HI׮睋kqіo Ij!pZJ"R1[ ฦ;f'7|<9!`#jq0$;&tE%;Ԣ߬95!Ub~FNkuݤ|zu}-rLn`Rҩ!ϠI]PE;12bbdɉ&L?L0`Զ2aьwk4S67B\uZ`Z|6]I|q 3\Zvp0I-o[ uM81AO D%viݫO*O2wE[+'|]߼DQG?9R\V8I'2QF+?P 8a_Bd\ZV[}y{O}at)̡pHcQF6q%vA7qz'cҩ x.޽bw|y=XƳZ}Voxgcyp.$oߜ2dɉi:pytw\Տ?c qX%Joc]j_8 ^ >t ^bYl#|7<h#Ff\crܱgKYo_oH3g5{IÀ͋ 3uv~j˥.>^rF?XLcdԸ,7o|0ӓS&kbӝ\/?M!M󝼜aX.tG=[4rQߏu>P!Ą*e]j]86NM}OqǬHƱKK&&L?L07 PL|\x|xG+EW.Tt%d58wb@-T?UzN b TEīҪه9D7}cd&T1VN&>?yQ&qYjt98qLZ @.Ӟ}cs;6^k⨱9*o.=K/:|c^wˆ N=t{q`X/!`y{,oؠ-tBY-FwRO#wYɺy)X~ & }˞SP .^lhk`{ŨϷ6+W9'p`:?& {]@` ͮ A npӹ9pE6KC$xb|y]`]?ƍ.'@޵&&' 2aRoArOW ݴ}40|4()/X60ά]OYLçf*3MDz\#*ypDq6tF nME>|h 4}Οgwa]'9*> sWฃ7 J++?C9eF|R#@C R:70.71+.X/|R: 1[8=J'7|eMm g@]O򞷼4Aَ/rD$n /n[˰nn}ukwxIOoS'^#dQ.[y=0p)p|y[՛ϧPɨaEy (/*ʿـ-'uLLLLLO~/q?/X%{8yߎ2c%6hƃF 6|\N\T|X%qS =b\4W1 ;eư3qZ)8(όU+ɐ4we+II!n`mU,pC|L?5Cp>E 1y]vZcۯ$Nkϼ 'TaTc2ʍA@P['W_2ih:tLD% B8Ө]^.@Ua VHC9r)O3r ב/b̓9ƘQKcn#`_8큂t<:cBGC60Bz2^Xs{jQa´eRPYT4 6]8Jw)txnŔ~_9xSk?8snJ](N#EXqB%)Ѐ| 8G)abH5+:qB1#C5L112`su g [8Ȥ_8Tyo!PW`Oĺ~q=6o?7a֫:EĢi ]^ޱ8_^K}.a5&if;;Ea<|[Z<~@|v>0w1"03:vSzg.XŏwNG_8ң;L+R/ϲa汝מ?qq=}tS688]e SA.* 6Pu}ކq}L{/Tųs N^f Ǩ6>$IZE<MްO\|? c}5qt ѡ/:\uM~l68b!0jŗɅmG54rL H`%Ll|' ¸!\B(7ˣmʷn^*V? zqI:D[yxP|p^ٺ'Bc@hg,Tpe=wCw`BJzL]xцgY115yF'՚52{r`Xl:O;/z_mdnj{-:802 fhGey9x-^>gE)pu"@X*_ԡZ2oMeˮrKN1C߲(`O<°٭T_ ?[ & b߇ᒅ+\Э,|e'ٮwSZ~sN5t_<[_~K^P_92R9Vx 1H*o8cza7Lt6mB7`zм;lj0$/xDO{5ѡۑäN}w,N|>̮$ axbd_ɩ89S4tL5>ԓTP4,t?LFTSXT\>1ob gnY;Qחn4{Ȱ#6^G,TVgJ&<ǟ<4F!W]MDTȈf>P ٯX̿s4ޝvo8Wzk1by?8QÏ}G5~YX<~k!E EZJ?񄵔ExRKY*cCYܨݞq7'w`z񫾿'hkHzȏoO$A񅣪_x1 {1hb2Z/Mp|z|L5>.3]7Nǐ 0IaV`,JxKNaU'uׇyF?)Qg7|>0ݾ*`˭'R%Jx2uu9-XȣG| '}Zl0ٞ0n L ǎsp!)9;5D2L-oyt8?لWClb3LW2y "k8ό^w\CdxP@ X(Ʀ}>?)gc&Juu7|yѠ x6zX[ś~pT<`w?W0N v4%bf N&;yn׏ƊPGUyW(ݽ3xI}\#*藝rbB uWo~Ԋevas1Uqf!8?o8葀sƾ]bD1`(¶~z?Y| 8NcU)/CoFrRoGatxH-0*s_ɁyC>7/{9%˚bXwGQ/r;yR/?qщA4y:gx'H;CT1b5,z!Sʞ=bMM=} i[v,,CmRpDqH [~n!jks/206/s.g:CǴ0zE\v: I E7rPk 9nb t3b 4sP0r1 aX?rk}\8s{B[29x`M^0"8'œGsS\or{$S=yÇsG2:lrFI~WQ?/&՟&5댂"Bg|>t>|/ Sݺ]q䜸'4|qަ48ޱRlι}FQV;}Ә^ba̺%׌wV '=aW^0$;W휍*XS1Rxy~X d3uqqg$r =`QayeԧVz|\70fCI ;BxwZZF<;*_Y Umg([묊w//Zo+ lR7̩.{n־"4Z kM}MfA#"\ Gy^F |v9F79)ɂTޫ51٧'6'uF͞|aSX?9,1yBokR 履DW)MPx=dB(,}+elsm'ϚƷo 9.n-#wzkzw 99]4ay~hB.p]&[nŽAS0 %ŽvSwѬB"Ἠ޽>`;ƪ01B1ly#{M)N xM+-y+G>\_lj/^en/׷^1Ϗ5IH,2`  w6;Qѧ-7&=\؏?=6TC9wdL5Ӿ\"Sen2밗<%)l)A{_=mDzQ6:&6q%HgxEAb>q9w!$Ÿbi`gw:0 tafai/)[^N0`\=7C:A'ݡ/˅O Yӎ$7kS0W; $>_xni}pQD{a2&LhLwp ^EюHhY׬WQ!V~&CHGT e~ Xx^qP[:?C8UN@`Z(wW0!rXO9X9upG׿X*pt ˋ÷: F(!d\7V 9pX5pP765^&(~\ o7-F)nOtH"#zr ͤJa$@)I(8Ǧv'qs~\q< C5юkG:0?Q'-pvAt+] O1O,n}2r[Pl~f%ˊԮ$5,O.{0 d`<׻v⦁!e%зGX:ZGrMX(v'}f4rߋ_X,}<:9!FAK-x񒣤vN7hT?Fey^鿬LqD[ݨ]0o_8 nHf2m'bk-<<=L!mJ ƕoGXô^9!h޷FL!tqV[g7`:'=Wf *<1gD0x!]vDk_[ge@&lYlev'}cƾ~4fa^,(zXI2+ԏ1v:+N&(bN1:Z}m/񑄏cM#Il䵵M #a4/Xݿ^ c/]"d9A+k͖sI`ۣ÷,fG?IA&ivλl:yϊ\ןX˜i֝iJ7@GmSxj5β@ygx) d<DOP  }e8'&ƺLR2 儗1 rNO {\9um|>:܄^sM;T98"'[3[Dzyʯ]Ior&G| .W]oOx>\~$tPC2N՜$qٺּ{obԲ0~{6QֻPIO\@ ͐A8#^-~<dz7FIu:gvkcp| ]|76I'|.ח^ Nt>9~?pcٹʺf?/<k(x}ލc^XO6R=㋃̆`&?$".dymy^+,N-UJu 0yxzڅ]a2댦X=h1O;\h\Xo 7U2p(pXij40j1k:rWQ&(s}}㹭=I7$'_Z`}epQKy|{>)֏8Jx]s.|wfEM907vy1s:y J+qdo~_p\ߔյ&t鎜m-DZ.2ru @kو'uEzƩ殧X?e;u.XЏF紝n6w8KL& ۨ?![u僻pytk}dqBV6M of&WS윛1H|m ERw=cN1SFy +,zJW8iefmAk`hp:pD1Z1BǒΚΊr50d8J%TC]e^#~Nj[@޵R]&]*ræ(}7UӁP4ٻsXYGOjI~xTZ}x>HWo&tuQ0ru\ ǭ,tS%=L ̻(77/g5_wxK hkXqpTαN't|]hjOߜ3'vaϻ=n3e {Ziutev1Z2,X%v1=)[M.IjF wrPq:C"*8=xKNKmwƳlAX0=z!}}1wM^n˫SPX_X-/&!]~?9paB{ƵÜj'@,9_?%jkZ4-xA6A`凑kOQ z+nD]焂Dj @-J$џe uنgE׳WpN5Wک9wVvSӖ \][}>1&mi\ߏ%fۆr2RPjX>1kߏѼ1on [4gM=?rg/hx,ala0B1gß+z_ r_8"mXq}qza%a :4WϜ|lySc4džqذVvjD[^hێѪcx|bx\:O[NaY]]Y,fe Ǻ?Xßa89nܥh!:jѦ o>x\7v4X t[ oL;S^j}hp{eװzc<ݸ Ano4KIMdMdtSdr}G?4r{ a^5&e/뛿$ǻ%o?j6pdm|#>vWqr=kLR5M-G~ro>+\LJo1ie괓yDw_5\02i\7w9j O67H?Í|YjW;˥ti>eUk#uqZd3xě[w!|E;b+3qA5`x8؅c_7B _ی}.?xGW^h~u^'N^:`LJzzu7'K1N~1_ 8tĻfSSi8s[uR<1#Soc/\P |;xBFKV@ykve*Xhv>L-8E]Zr{Vt᩻/ƃOSuj~=e}?jX w/l_lgF Wd(6z1wo+!AiGh!yg U|s^NߜRW8ɋUӭZW2_е;EN Z^6!6ߌ.`9_79x1s=}b ]8~,uqEM՛pp @)8OBrK|2\h|v ãN<=CtoXh푒pS}9َ'o=BJ ߺ>ӼA}LK 0=lfXCivrYaXtx,M"/ :.IoF}"X`.'%ñV8oq4ep swHRn=ˤcFn="5qɴό(3Qn )o-^g笌=[.z'+4/!ۗSt] ;(2dnnjCA[vigyz >7Hìb{ۼv(4L/)Ŀþ w[a.l,*󹣽w}OQ;ax-]tbf"Zc.zk \w3B4_`(2k_v%lвiKרRI٬@eiP?KOz񯜳tG 7+oU9|~xmf_pW]? *Nஉ[ }cgMJ9޺agpHH>up V|c=~O&Nn;/!~-^OZ:pU4PcK~"z*qX߸tG׼@쓏sPaGT'.׿>u7/{$u&a}$> 쳼eUpx.j<8}o.D?gn@Gg<[[[js1-tubwYkz^XVe5:N޿?ϳSq 8zĐ²@h`CYOrdv%!o3Ϝx}U1C-.qC >3y|ZY$!Q!+a`<ϐ,\ѵ`z͈:`AO?Zz5pw\dmY팩6( +(s=p%u0Vi>ѬfO XPjTӷް^MngXAjV_q>~[sUi^} WL7UDbv-_\fΪipz荀ɐv67D8ۖ tV#r<b/wY;NFErws kO8Э}幁Fb}7)2p?o:fOVq3¿sno]a!~7 ڻQ?Sپ2Ŭdzũ+ SggX[u=dC>k{]ᴅ<  =a:xYT:d);ݧ1A;A S@C^. x(u5#{$7۬w=>Gk8<)7H LJ #S >+5+R^q, >F//@IT:9Pɮ$4k}jӛcvy 䕓_-\DaV-L 6TF ".;m8ux0^ojw \Mg?Ɵ,޾ˀ;SyFqĵ]"NvxZspy y|_x6!]/oxe[LoGo%Kp~?Xǘ#87)J;Qqica.[&x:|3㌳5OLvz[yZ:1-ȷ(GJXIAiĶ=o7/^"=ݹל7߼Zj,?E1_??R O:~}~ A߫5$<} [{՗,E5Ϭӊ<|e5Q[#±V3>9 .ww-;Ȯ 2O0`ek i:aэΓ׼-xc(8ƹ]T!.a+**'xm47Wf;:ݹG8v!X#hJEߥ9+X[6?}BDQN.n0_s9{Z>LfWȓȉ%aĎpm Tywxaz >-qjRлf$l!G}sZ@"n1/(=xYsnW2|ƔP WӬ4 xzcsg7(ʀ~{CO_Ü,Z7VozvN׌~|ܲW@7xqCu[9v/u+}s xP=esK3m1h~S!kf'a=“N|Ea.".|qnCH[[(w1/Mާ>1Fnp1iȹ˂&8GH|܅;rNzv{Bv(?8vwЙT, M kggg^y^yb]BEʼn g|}D55rK82‘z6X)]6pڊ핿  Ix[9GR{f.M :X4U<\dz-r^ T]oqߵ^mczl M` tW=^ #ě‰@sQe: d8]~9rkuduQOpR x:J8 =a=kAc}E&驔g&]{qIVɳw.;ĎN!˛6Cp`&pjh &ӝb.;4kU 1MBϺ|rfWJSϬR§u>hq|':^P\xc8a,wbgNw{1_8ĺ{ېIގ?8^_G䀎5Yz|s}ivB x>+ɀbTVz9.Nn~N0&tu^8cSz`[X; E^U }%.V2aN@_;*:+4~ C 1'FrN_5@6|ڏ7}fum^vSC7}si;e=\dft]Md9u7i5C\3u~o' qd _Tݽ=eQL͋uKYʆq~SW搁Tk4~cuq-ԭuntS4Sjs-1[2 ў:)+4!%&X8d|MyT؀![ oy~R>q </?ĸ8/Gxy\sg) F5zـ ~W"UjO_ppnC?=0( kzs񇊦{ XZ\^;|d-7;JtzͲkyn^+O~0=h5#nX/O;>( #5|?ő; sp-_Z_Ywwq#L/=5LF%y֮czsb)pt ݊߬t76ZpjːHEXi8TjۋͷۓkEn&mwkClyC At<(]O8e R3Y)߽c81$Ww.,dž2p`bLR8_&]Pqke:*y; &}Oí~m%`i `MMp@2ϲ~)S6%Rz:V{VQѺu)޶8j+F߂[w |sUx£ )@z7i{_%g)Izڞ<`1#ZX+f[]/fGڎ^ۭ5rͩ jcVƢ}w8&3M$9ݬ_6t.E~2IX181Q;閞\j:l﬎}c "IzE]zYMq9*ƪN^?Ơx sxӆ|1Ej< Cgx&KwI?Kf .0kΝpݘ!ě#˛莞q mmmía؟?,X&"3X, 7:ʻ5|Cdzr*AuBkYqW<H 0?)f]ɴ7?yCvppW-G:l8o:P#`" ay/fZͨnq]7$͘+V+|oVo5x#q}za>ɿx6Yd'18d2LO!_8"8Hr<F?eݞ\N7z8͗(Ri;kן!&(oI;S({=g ߌ /] |M1hB"~~-9{9<<_ %$75GeGzSSb+}FaK(IP*4E_iq#)qv]Kdi#A$0XHxy'M. -5) =5+W-t6bQp:qU\G4|bf($R1I-LJu.9k o:`87k?fmn%o;jax[8?.WX|bXgDS{?[>u6 ."6h!*7Jb)Dt߭AcWå6N'j*wa,eb4JY>0*/7c1iRס^Nf2kWY !; ?>mTu} h&zr,ɣg }ۃ[]}8K ~rjP#&>=8%{9o7XzA5]zCv`חdѢ2u9g+Key:\^ma+}&uJ0c2~:O6)$agP 9刵x8UdwF&Z[]k|}^0yNTOi`hL`ǒۓ#Dq;;b4h0W +H~rR(h#d/88_9h?q=w>q7K] >K&ݕ@&1@kF""ʏSc[M'߼/ A0_Wr^5{*cVXrܑ)x2+s_.]}z~?7;c[rM7gOAXe 8a'*xE6dQjarnPt*cqޏ1a{"%o?& ;{^}q5i/0%HˆiD b9HN3VڲbNms1D:.84Xp@~0myhhǨf&ƳXi*z dWxos \F!j'OCp.qv".RWc`SCTЦ3c ˂yoW7K_pٽ^Y6q"q0QwF8 fW hx[KW.˭rX^-4zr?a(^q ުڟ\;boa3b xl׽dƻW3lIc&u@w=808螲 ;wx`C7G`ԾU908<۶ADVvӲvZKqMJ twz'_ g~so4۵g`a9x^ٮoD;Ps?HP ubsr߬VA {{އ '$ `',y+ v$K/ V` ?=g,&MaDRc6cQ0YS˿VB$?tG9=i|Jr&.P cFWrӕ\ܞ \nNLXm.0搐|IxZWmDQ@yӿ?ye~!z$GSy>A94!k^ ^/Ϭ&zNFLg2+w56Gep1̙ݮ2Z=|_5B9B K\a .PV_Ǭ^ib&8T;h|pO0Ŭ0 mK.hSu1#Mk- Irq_oٔrv/?Gv.c^_8:H/ƞ'2₽^r2~^\ <+񍳨;?˜+t6`.@V k8gG֩G5/23is-#p%A|扆-!tw--gP} w&?#K HM [q9N:YLRې,:qk\AAD^p(i%gp܅:r7k&)h_So[GnaY^.YߦS,!!Z2甥Y2\̓Dm!Ͻ"H62PyS^<+Oh,ʩ ]M2] 5~ h_l+G5&7aIIk8 c VWq.?ee"bk!O M?+!1AQaq @0P?<Ӄ?~}0a=3zC=osϥ~'{q6Y)ɇsxW(T~\}/F=z7ff; ߯2:2\~ƣp]{m]P3u:> wɵXg>׳CY-g5J"Ky.ɦ;*$=R)m!1}f۠5Sj=BqLD~؃:G)vOQS9jpʡc]ϛ]5uOO27|Oۙ]k4Bw-q kODٻKf ^Sl;?'dN$?p!n.iFꐙ[bƁj8[ wX񲣪N8SSu0Pa>|:KR+U-{W]00b`7vfU )6 f\`ugld M;A;ʲzn!󼏢4tj<] KL3dD>5E{ |f}OGLRez +uۤ\~~(btY!fzMWz\{?Xu^sR/mR@9+QC,etKhKV#UrÁ|n s~vT['S[7ĺ\6w|VL?Lt׎N^n*2.bsv}dI ^V9^I3ᰙ)Wl5U;Y=|w3gU>5F56C7OSeaiOO'K{t1]?e'p;ll iOnDdl 6Bˀbof| TWSΚŮ^.KUg{.Qyv1V4*ߎGS`L6TL6/;uo=L"{y5Á`Imѽ.%5i$/o˛s~@I:cޝ U{ +rkErI;Tu`5uؕTշɤj `ԽGԣCb=PlYB5kz/Wsar}'>Q LTߧ/CVR@_ ʞf70q”:6W0/V}.x`h,k;r #-ﱎS WM< GT9pd!ھМH1SOѧ2| q|4iW%VhJqt:C>(FFfqG*ط78u77{lɐ6+N_N%ro`Y:;_kUN*T?zf(^NϓlSMD3nx??'ے{[Ar'zl`wa1?l=ԙ3+saCObj_^NjrlnM+ɑGv7˪&@]!9=5̯ Ab9ƫU ]]bԬ}/J#kӤr3dՎcJա=!|$K?z"Ϟ?Emҷ:^+afK5T1;a.[.˾ zعE,(=Aomƒ jCgh/1zа}5"a7FZqN *? _.FMʬ+c=3Ûo>\6ZOf>QY~NW}xTU J-S#NRhw o74nB]K[r.R%}sUav8H<9 Cv *Hz3ƽv@kk9O]4}עi{@N\-sJ%P|;7둶1`?QW:Z s(r~ڨ:+دskp XeJrhy(L⥺C|DN-KfN%p%48bt-Ϲtwg."Gՙ wܚuP~S)le`|sf]CZ EDs}ڷ98:s qakn%ͣ!3MZ |fŹ;I.h8X<7TǖKQV*9.ms2(]e:GOU2+ Ysq1/EH;2b9 oE~KBJW#E\5w6ux?"(6NPhʱD>)3Ed4+E93z ǔCbj?v/Ч*1Mr|[oLUwjɽ`lEToO$]!}V[Ji8\r|O*OQwZ}x?'Sm*0ꔝs7Kwv;s93Kơ5d3qjrBߧ u| .J臝1:u24.?sϐGަ~V) 3<%O&ݷ*b/B欵Z)|ꪴ?Oe:WwIQ ~/Cw?~< gJOZgYmB+ʜuoZ1u/F[ &*ܗ4STJU1xFz?J#TՔD E5#(i݋_: [B'sy NCY>u^-D% 9|'rUwԨc7Z|yTLqdOvA}Fxk Yϝm.yӶnE sHsaokRh\Ղ~(%!n[I;PwhS`?7FǼ8A.P([/L5>g}>d_01.cIѻB\ Тy@u~$C+Kpu9EUG\C~(c`]: t,}gDph^;iFqlM*2?|?ҴHMZotB 6s4Oqqi7=Z[BIX4a6yт\l̉{x&e%CQEC*#8|P_4@`{KiQ~:_ TNuzb{\Bj{=N֪m,2le//CE VQW;h:ұA|JNg/F9ο>L-uƗ%Zx gPXBZVUA"D=ТB(MO~W8;} w4@o k@uMJ%EU^88,cܨq#DLcOVG $ҵ Wsg=)yPJveRk5w!PjbMh/rcXƒF3+*>rUo}> JTgAr[Үk?,xڒw#!4A an4!&j$l^ƕ:|75KqMKH*9=z!?k?Uv=Qs>NPޅnf[EQY5Bq2_'''~#'ɵs7 !k ijS'zLU݃AoJ|~i~RSZpŊYyL>1{AѦhx|%VL"+tgɰ=( l>0WWP (9mj/5RֳS2W-k)<a_I:4!'Z-gVFopDKBB5.$9P4y,*}Ha:n:w R}[:P]{!{RW/'o03^껆P7Wڣ(+ԩM $:^4bl`Ky_}ql6d}B3Cѡ%6C|u_}-@uBz8#g6_t㺆J䏨r#Ԧ(w#Uܼ!qBJ?P>Q:;*r&h;_],CkP:J)i.G]Qvr"dsDyȼ8'q&EѵMn?zIմ8EnUe(±:״|6As} ! Vr hn7di)8g+t+*_'NZ)S 9tQ8 ~^Gn7E;8)L%-}ÿ!5U3VK=w>&pfҘ67jW׋~w80vbY2D4{+!CZnqQg6+Q_5-AoxM08fK!F 9_6{uuEﲗO66嫟Lh* { @m":3ZnܺVD`s0>$e b݀AT(J /Ziq~E ɗ)wȕڢ8uۿJq_,Sg30I 2ҧ;OcT3j LЖG5cG܏5)O]=iT|,Ku F$_}'Mߴq3dҸA㖉\8:,^T[kIh]*lEWQ,w'FV "7GLol_M7Jj%TчYH(s@JꦎBDd5tC#❈3̜FtJp`u; *֮v<.9]p֤+Nv pᜅ>U2WK,WvDiBDn AiqXz!fbMsDߍ<\62廛M@Y!M?JEC^x$T ѓ{zZjeX7A1h.7uTSpo,oihͨZ]Jޒ\3#2b5sus4h{)MvHf[lF]h|Gpֆ2 Y+Lc()(t7:s"ZXQ2Xxd{t 7 is\a:|;^/C'}[H:E{ 6Jk^ތ4ti* Y /!uauB hW<ժS×p|z.*:;?Zw m GǬZ4fJb}w/rk k"#`ӬGl c^(oJqt=/8,P]:bY*],aw5)AP[5Y8S\P닄9UOr@ܿ+E*%ېuj Wt "YƵcj솪wU/OjTN(n\l !oeޞ"^=y[oR-S⢧׾h40ìb- C`~Ƭ| (UP |a=~xp5ʖ.gŕ !?X!V{`C槪TI4,D? u\`sASY r)?g!懩p*kD-YS* d8rZ,/h;$YZ)8l]jfsd9[Uj!%z3ے+t1nگӓzS44;"ES[8qD]ہNA"n&40" na~sq:'뽠A˵JOL"tbo$*^7ڃx$:eJiD[>j[ 5 /ՃtAژjl2ˀ]&UBY3äa_l\DBPgyd>'"tX%tY?#Ǘ%=1KGȴ*ȏ*.|Q EoL ak} }YHUxè+'._%\#ߡ5>vQUj?/5 7/d`|#`qH׫PV6xAƖ m}/jҰ7R9yv{ uvHn:aw#A?T䈵Ŷ9Ԥ5=uR,)) gm.^7%_)R 9gAԌ!8WSր5+:1g b~lr:r\#Ykp)qI@K b4oCVe{JK8,cqs6!n!2(?WG7 gQ*T!U=Pl}YqUŪ1Yð5ս[$d#t%Ɉi]h`͓uBv2Rp͝PȢJι܊ڢ~7pʺeG.lnd27t?NNJ8rL@x.>R*,K;&!JR` O+31uQZmK\caG]cYt]T Y*Ӂ4U3pT1t6j`^>ˀ4e?Q d*USSiQn<(տb=YxI,r_oӭ[4^fUi-LY+ӷs*m[v|pN{Tc'ʩ9e/Ԟ'"Yj-@ u FEa;!(KEõy 'D]CA[᩸IPEEy/@hG7St_ IC_3 i9UBv Mk]Ciy+aWN(-p؇(5e5\.ZUWp |TfaׂŸV4r{.H0]N(uI[spw_HZYfFcTp':(MDxt1x1Z~YYz]}p:I2'x#,Դˠ*&Ľ_(43@  4䄵 `O⽏%uHTJ-zg Zi=U`z3oh8& 1iE )/IبAgU,΋fECMTF7(By[L| ldZe8+ TXqu׃Ueb3eAX!V{tEojmAB&\|O~d:ttUa!t3dX_|'qavwUFh-,I/~eͤu&IFw4CMX=L2<:N!7?JX8JJ#2~Y@_M΍$7Gyz-!Fl=kϲ<>*%YS_bq[_ sO RMLtD2Uu;ÚU'ʯZqXhTvbxr~ut`9Kyr83IexWWe Ɉm%ERҦn<4uK]}ڦX惱5+]zlu֏#Gyo7 IH/N]/Sg·6jm)QUԹ]{UKͭDSEU7k ^k8ۅP 붲@qXʡksC5mQ$W A- I_y|qq7E06w$FU fz2LA6GU;&[h%rGH=A76YWb4xř[c3jȹSP˅Nen5h }Vm7eF=̐h(4 HX;f. fKC],XqQy$Yٰqsګ[g& Q܌DK"d+xZMN' tدstc\:a{Vw+m):<ɃbL?ێ[c 3j@t|&ZICuSPq?32A;D(.>EiMV˶FNiD:/ʂ(uG2ҟ`\߅B_:'QWs>ו"" USn{rpk(+f$tQǽR;lYyC*ꛌoKK%QoAmޚqzdii'a*Y;"U"ר|)o &݉~YZi* rF7pV"}vJi |U"n.b2WÚZCYPVD$Z)~R'8TI9jNZ +ѵDыdi6{S=˃NxRK4.Q'H*6UlV{!jsX\+ș»ϙ\ ʱ[ <5Q9J{c>۴ _DU`* lu~RܩB%s iDa͝pTB)jVTd%gu1JPsRڅ;~>Eg;)"e77y P{Wt@+p 5zQB YˋUf w 7 ^ZX]^۸#*SMm4բȽl9kw-EN7F,Ĥr]8. 6O0EV!S}+Aa/wy8mVaN/ѕv7-Md}緫uñ'؝`N8ewUU2=}M2^F>uU~DG{$"fk"= &~; jZu.!7\!X rJ.6w.GtiJK`nH$ 1! > GZV(SC]%jDNJGXd 6 _p[h=Bi|-UTڽ(1/d yʮMSC:p*L,Dvg?5"[.Br-M@Ild>t.x6AoxHB4`J]z`1مs1@8GreM6l2QrB͏QV+X xv*i*ʈa&^3LR; :kP;\~8#3CȷvFNj5ShVK+&YCDl>=o(xf١pv)SLaoQ;D4Z>(֑w6H"dsŔzaEJVlWWȶ'.doË3+m5ս҇Z'sSga b\o*H!{k؊Yj|+g#,vUhA[ޜ;d`=##qgAkDrC׀HxĤDrJ낆 JT% EYmnhYp&P-J*('1SeT}GjyUKw~ŌJO |5nCyrE#0 Y|tK,9 GC`~qxY,I+;s,'}$v64\V*U nf:Xt] Y( Vsnԥ7ZPխ"nO(jG&*ԩ~A(jtd$5]tM 0}+m;< ;V8CJM,iZ;1CYk5TEWj`) 4kb guŠD^YL#UKgf̷$qY>0qr$p56O"neU|C_Co<7~`q)c?@R /CYAg`rzvU[>^S%)gw"Pf;Rtq ƷQPCr\) _L$Ju Ċ"gp 7 5kvfgR$Eh+l;Ipbl-0t=|և.qW45(HQrtJê ;T6zt >e8~Za1v-lj)w؊P9_ÕYhPc&[@T 镕P$N,]ߔ\CúV!ch ^#DX SA(N-6&9!7?]+bSB DaW_X]ej3D,գ#6T)`g /苨.ɐv{!c^C2PhφLv8"vck{]T[ JpHdeEjD.EGˣՐwU(WunfЮ}Cli]Ba[ %Z%xdVd_cs'^UCda/TR>ST}$+ODVP=t+Zxd =!Sw>+)bwQpW1 }}e9X}[kYPsx4 =|z$e)E|[D~[n7XO;5$)b*F?懗>IQWf~UMnY Pj`Kiʯ NVڃwf[%av93:6Ԩ骈ڄ̮gP(C],=LJ/Vn]˄/c\?ZN-" qDbSj0䫨-Mca;;k(5p/(R3腠UYB QH0̡honQ~D.zbqѢ1ciM*ZPXv8]2> a~߾HVĪeC ̒êP*ɪRGxkϱ!ƘoJOC3%13ǦTV4-l[D ?օD]/W$)ReX[ǰOCYX/D_~~;{cT Gu1tO96C+Ͻ5+,[]2;p9`[-Ƌ[V?&?7*.;X ?Jd>ۦ$QiuyۡOY7% sz>J11#Xa q\?$rԗFO'[&O+o{P4jn lt,%?"? R B{e i&CwVƗdGod' T+@i"YɸZU}dBɴdhਧ0SUiԍAwIn -QE1K?Q0$9rp ԟBVUy$`aiEMVQ`cYXa݆"]9dal?χ+3z}6tG?Z,<ޫ I &Bױ* ɋx*hOU *#\p?(ԧqݛ@rᘦi릢Gs?"Ӈkv~=oTJ2'֊fG"I=3PJ誮AwQ>#첗FXS7AKznD;%Ph k_ZVU lPuzƿګ[ZQ)PDc h,MBO6kԵR22A3_o:  Lz#o `7j% *`sBP50Y2Z\nUUJ1<_;A h??;?_RCo&C?%g̱ӖucN7hdO%Ųާ%z,q߆S d ˨v**{/={ڑ=rEO0d7/j(.S +I.$y=\Q/ȱr'G -8[*f9=]:F"ϫتV QU~"Y *WM=ň?%nϐIExfu!v]McK5-4{Ö4$c[tC5JG KۿF73I ZUD,_VD9E{vk9icmv.F]CjQyGi?d6}Tz^ExrEWыml QzzRJAo"\)a3MgW>:<؆u#eI߭=d"1wWdfh[)ivg&thc^sɠu] W Q / {~Bt{-F`=X7tUyTo-{ڮU/W57GtI2GHo9':ګ' (]!g)E&ĸnBGhwpS@֪) nllJ>݄g <5p:LYT ~>{S >tМ]ᢃ}^g˫o12ޛ_/Ǣ~Zr#n?qSTִaV^>)զQVIϿb}TPĊ⣧xmX+Zԝ>3GWއ$k3ML LawЀi](=P /A`CVy ~ T6$F \0I6|6 LQ=.k5YURO]PGԇ4|[c|ΎvZH/9UEҮ=%r8"%#13:eIkM}LuV⬳#;u Ώz<-栺`j~lG?+|={k2%UznLcoѪMc mRry6B%^Grn#Ҡ_N 鿧}uq=eW5ս$KJNR5hF3T/'r; Ia>WiO=:HzGz3p,6 HP~.9Z~ZnRL ܉bZE=)(OLg.g*O}ʱ$Q.ƱU]B ༆E_^:c,V!)Rp6V3iSQ|<5goKUwȄ.Fo7CN{EmCMei\Ȟõ.P~hQR{hWsT{i*nlʽ>^k=]mOG<>Jo ~/!>N9;wqv'pnEEKYuJX@jܴB:ucMbO4hP![iMg\ Έ61Um +t%Z*ʨ9% ?@*  * ?6>pW$p5Fkxm~AC9ÓUur;z# .Q5I$ڊ#z7[pi^%iUTPVPZo!Rb so)1}H($ QTsX A| ! S3yIL߄[1El.iUHl(AzHD'?;Ͻ[ɣz8릤@n#Hi)kȁG"Ktw[%!|ªHu?_U/dꢬ#DZF;Z;]$['bΦaxP)T@ .q[.FY!Dhq::=.{~ǃ>pLKz܈bZisU]o5>=,|k̇{'c}n ?j?=xrCAkYp\WnIen2r I/ eG(K/.1{ڞflǻNUG|nWmEd=[ }F(dպ\ ;=Aم(%(~_G{~ (__p{྆ٺEfzWag޾ i2c",?+8w59}fp\UU }JUYj M݇x?Fq`a͵2T!GHMcO.dwISPTm+6Q̟AêQU߿\ժ×J+֮ (8mNMRXT̒6DI5}YpKPzQy,yjE 8!(qH!r0`M2ku[ ʍmpo[G[8.礳 B2g$? gh{#=-%[zA-]pc\d~|GKrI0 7r1oM~;O_W}mOWL0u1W'C۔DyWF$x<* rT 1]gD2@d2,1W ‚ذ7&P+: ‚!T YeTB!BtSLCwʎگPmbj%̤Uj[HBMkMȁ>A:2^؊TD$gȨX?Ҥܾ0 Dj -X$j-i$idpHxJT]^*k:`az8%4"֙gYS _!pyujF]TVBr Ax؊ 7(D&O2cj-F48qUhh9D' &gJsFip+HIzIjTGYƣ,׳##cǺ'fF2؎r挘#!(#/HT/h薭UĤ WN4(˓44fjF54f`1f .Y6cp698GiӳE+9fL*mC\##bc$B*L/b,Et)6P hx=]P,D4J!cX:dl=ب⣑f_ʒ 3 ]ޛ2l~8=lChoIpAŹ”M}s|Fi 1a}}46tG@JۻU. KvTfJ$#3?od?LșHRf4^4Z [/Z4w"Dr{ФL2"KD;vh^kEȑ(mN"8$'0ΓFT53Nbq1M3 VRƮ͛]\JodDxc"7$veB,bK_ HSDܜ/`E$IiώI&=ČŎ}7GbCeF1%"]hʬĨ/a ȖQ=>HR:vB;Wâ&4a͉1xqYMDlu"%KB~:+ } !8$%&.""%!1XRbD1HWj 6WF|Ȅ}$Q'HB"D2hlBSuW[,B(M rYQ~aEB}"!~]XH!($6be%=%}"!~g,7t$12r/qI(ceh!/&Ȉ$<> H#\cd]_b ? Q6B<.I`ᡪ18" 1 Ή#Eټs йdx#4d1y>^+8PFHHK E ^gìפV8ٰP3#dHBȑI Y1x2$a|$c_dH{^8?H{^8$Dv3G4Q_Ϲ- WfC~d>Z8YW+_ .ᢾWF'fWF'eYő .._D~ b,7tBM Ec}DbBcT",D 9$_2$%>E$@#bQ^4/*jY b_hvul_tc-վFHK&ChCml7T!!.,+BB/EPT/xcMQBB]P c12>9$G2{^7/! 01@"A#2P3QBa`?ґHQ/.I i!adͦ{m4iOXGȇhq7IX!MbvI:QzH6levG 2i2 Gz,zl6cGh l$/dC({ʋG!ci Q_ O`cFXJ3hzltͦJ/홥 Rfƞ %7>Qh鞙[]KQɥ~8`5ZH*8D$), #C/C*P%%r2#Hȿس&SM 䎏F W KQ_5pB̘ymd,>*Vcŵ5yq0[)LPic:2h5yi$O;=8 \m?H+c"1diႣ@ܦ܍\q8Hi;ٚD%]PXj膯q-Q-eןGQ=\Tmz!·Ɇ/'1:1)B&ϙApccp}7J5IzymgIEʲDYȬikrBs'-F J31K%A))Y'TWB&>Fa#%&G<5#O&&7EV9WT"hYf\:2AWJe2#(+$J{wrMDQ6H.0YeLYrFDGҧ'$6A$ؖܖBVĠ, Iͦ\}CK`1rڇ%ȸɑ0~#͚NɿB0OQ"q:cCFa6(pFq9J,*%ICZYHZnFMsء6 ! 7)iyx2}yn2{2$(yP!)Q{bL_lMMv2ye )p)rOPϑJʉOS!LTHdDd3L7jFWunF 'FɊ._Fl[ZlዞI>V2uH# ͫz3?_(2CF'FWbl%+!ͱEL,WK*ٍ7nG3f ^hCWpۅ#./b2dhxꙢ5f~2VKqCJod3^"\EdžH44]bKO_=CyPOiHQ1&֙'Ė?sS,tbPf6fbF]Fu"@|H$J$#EWKB. MQE_jdeDD%H6.mG2xJ{(X/-lxdohY*nq I6c$bf ɋ2$ݙ21&d}P2&"DD.#I: 1ЉC!2bueQe68#r y12do6jG!ȁ!9 c=[6_Z+(߼9b1|>"1|z+ƄQBT/1E1k| Se|z+ƄQBT/1Eo~zSe`X!B/ eBCYcy`.1cP1 Evb.:"h]}!"#L^7ՌB1#څ Kd_ɗPKL\3 w 7instagram-feed/admin/builder/assets/img/ext-reviews.pngnu[PNG  IHDRPLTE///oooYFOգ_×ˋh?{JςtcQZ0ȴtxhm]p;e,oOۢЗŀwYQtRNS  * IDATx\0K9BQ nծ znRgjy|Lt*9*ל)@)s|! co41*JX4ǐ,t*L7{Jyj (EXe:!lTRBQڛ D;T,{F3 p46njgLLs ݿ۝4ދX}bN͉Z~FDB g !4} ŃNCv PZBJ)s#pp~ӀB4DJ$G_Fڦ(#Z.˫h`5v)9%[JʉuټjIJD!.7˚BmH'wc |pQTrJ- RzX.}{zuyQTL vڡR|yMSAk,ZGB=JBU 29BNCM< e<)v+u}moBJd3P IGr2bV@#HJAD>exYJ&}*ZxT+eTjrx< B\W:mztH/:x,HiZI /^z +Ї8)̿8I Hdx=IGF)\"6P+_e9 r^(Rx'gR3xr++ tS*ru*RY:R1fJ `5—3=.a?˥XP"(f&.%_F,a/]!1 啾n8^w{L߉`n"O4#!d组A/: U4f0Dߓ1'j9щI(fn, N>)t @3 "T"t `D1Eq5.\PO5ABX{񢪩ҀTʓ* umS )[_4kWM+~Jj(Rο[U71/lHJ&^fm]M\Rҩ9"=[xVT~{T)*Q #Y=jOJxNiT)Dei6)~q4Tl4׮T64?=yksi*pZ3î1"(^9CMS~tw~R>@?R*(<^@MSCX*uѐSiI}*ua,X#5/Aa/-),bvd/_7E733*q%(!A5Qd{#|}~81Pz-~jze2Sd~M+L丢8xy!(>F" S>"0ƇC'AT6\4t /|WHF`@S,\T p ܣ 'I$1 z#9eWn;Ը|o a t5aL)ݦJ$:D,XwXV%j+`{*u1U/K{^\9U'knso}9(1.]W&VLƕKCGM3Ov(135Ws-_z;Rœ-ȁجl鼳.n׾~}N21Ж&lYS:< a-K%XA [J<O`@7mwJ3kWa tq@@8 uԵM^k)m9O)MxzՎHC%7e6 nz/F y*W b]Dk@R7Q5`wwg 3,:HUu{ZSh⤀Iľ YOk\k`lҢ( `H\f"`0`uEmuq*B=Z?P~f'z`V#Ni V+SDIzyǩ`FMu9Iu{91&Mm C-Uu FYѐ>{!ST5)"FDϑQ)C:}_[b4a+<>Na4O=_ĖaJ杢LE9'\ARC]J)S%EީfЦ!\E;=>(SQ4;`VE&?` tST褱2)Cpjܮ"YOUSeMa^Xs"T5֥Wة>y.֒PdDk |I֮F `- ~ U<b{o`xS|,#~yk7aQf';-h!"$`@@b°YKl4 $}- aj@lޖ>hYB ҃Y=Q )!A6s=Q) 9phaj?B@&<Aug2+CFd"o7+Ƈ\ Bڪw[Fi1EDp _-(fP4qBnζoy2);]+q=fRZD\qEj>H-w(/(Ziw6G;[ =?Q"eC*cT\ !/r^(pi6iQ:wnȋ\.rU0kٳ$YUɡ\._,p*^o@^uRF=|+y( ;g~3@X*Y?Z^g0:cGG4?Kx'w4cR㙠%xqz /}Fd/0ݓdk%ucts?,q˸*aH\NMqTB4~o{ y z%O} k(3zubqK-Yr%T^!ҴۤëDl<1+_by2\Է5E#Gfx0hgg 8`\4 ,oY$\(rJ!@WyMGsǤ^˯uaՍEz> SC1$<ѡwD~ I2$1{H '^"GNR|$KFPDgR%asb *U0哒Xc0A}|lƐ!]Fu$ŋ~A^ON.~~%V#C5@t.sxqq[XϊKZ}q=p?k}!SI@F3iEjyp;Ks'luuh k_IƠPk{FuH ٕ1~KynG݊\PCDY-D>9􎖳(ݜuXBaY.-^_^im=1ozrM mvνJ{wq-K\F<8*4I-o)KENUL˴njiJc}wvZP\LwȹIj0%҇C!à~h!t+GA{w.T$:T5U8yod4TpM5)΁ʔJB:k=I]R*f)iIENDB`PKL\Zqzz6instagram-feed/admin/builder/assets/img/pushengage.svgnu[ PKL\%?instagram-feed/admin/builder/assets/img/process-error-fetch.pngnu[PNG  IHDR98GDP pHYs  sRGBgAMA a!IDATx9KADASy,<"Gha'6"6"?(TDK р'(*ZƝ%;yٙͼ0_!$,+<,t!u;qxN6f vܞTGሼI"*BX ,IKR%T`I*$I>G^aqi]]GՏť xJ^^Im@D^ 6!&'&@/$kjbXYINnemG "e%)'$8+X]YY1#)WW+LVPV&89X75t'kM]ᘋ/.o5#fXW:E?.OXŲtlSmLD~ʚNX]jU:9Zƕ57/c.M`T'*$r!ln=v΄K^\ݦ}W3j6ɺdCx*9IKR%T`I*$X Z<ێ@bAe! 8 WЙycIENDB`PKL\wZç5instagram-feed/admin/builder/assets/img/instagram.pngnu[PNG  IHDR!!Wo pHYs  sRGBgAMA a$2hD0S, 6# d||1 }!i$}f(2H`EA0' P5'P7콗flrsg"c!Z^[?86y91.b!qp<.m ih,'Ig$< Q#2AH_QiAZ ׮'n<īZnO),AkC @H0A  YY.^ ⷏^_2,$>r(< c.H=|Ku RK-ٽ.4[\ [Gol_k6%þkÓ+0}Z#D!c] @a]ðBS.H~sSl72s Z{o?-칖sIȄG@$= v'TsBF*I6K)IZKg8#>f^ #r=Y9{9- (4p0CbV8p :Rtd~9=E갯νU8tPڨ ⻟+NuDɹzpXeӯ- x9Q|έ{ %s݋YNKOZ<kkOOelF8ܳ/dGg=ucN혵oẟ 5@VJ#5lϟtXc `VBo揟- #zd24e8KI 4fI3Ԇ>Wd3piӕVm =q?Ldu9=b>%n\Aa: yޫ= 7_wi~:3f ^%/g%Qw7 c;_9=hu%]g-q kZC8L?z󯧫TQ~W .PgD/S!=g@ l³G6;01u4,s$r;3af-35 >l 3SXhWA<x.PoeY&7(ыRIXZ 'ѪWػbBj׽y?VJYlHj0os;l~/ afc9QaSa9NVy V:l&-En>=ıIENDB`PKL\Vii@instagram-feed/admin/builder/assets/img/process-single-album.pngnu[PNG  IHDRRQvf+PLTE WX_~|uw[]d{}npx@?/uYYYD>C$IGd2kyVȐ{V˴^m~`fxx nDR4\D(܏Uɬ^yl>9T&!>ozÍi]*vQO )8d$E2'tI֡u]0Cb "%U]"oAWu)ס+Gb.!;b/Cb,C= ID]3 B῁.'-~L!%8[+E̐z` _/p/gKZ9!D돭rs7݇3TG`#2?7l׬A2_zd ' (~C M֯_q1 3fB~d 2aև3BTA0722#w=owgő$[2j5\Cp΂BR2| =#5ףM2$vh4^ڵk׬]3T'аaC <-ע>}42ĉ ЀAp8F"xnD"ѺCVZG56Ԫu,(;܅@(Pj ǀLРCxRdR(r.>gphh=e[d`diӎj?($XaD 悽' \ebkvk&#y1ak2Gck8Qrkwl܉- decDW,UyQͷ*k2LqAB[<͝|IENDB`PKL\tuu 8instagram-feed/admin/builder/assets/img/dummy-author.pngnu[PNG  IHDR22]sRGB, IDATXYiνݯ2o73h} qI4q2*QI\ SPS.QXB*ZZK˅BQGAP-ݯ== 3{wN33XcG%D vV1yC÷[c6o:m.uA+Jf潌#]LD{`T[UW{.B44c'$:=ycO䇆գҳ{>0bZqʞ/M.̜lKꆥ|{eQ<(".rM/KrqUw"zejA\d/9;:qM4/l3YW"GcBW+ Ǥ;KW+`(LK4䊏kU!|a ICښew^ D}L:;m곀5DyGuSmXQU&2r%?##u=vǚbVvm` y#ZH_mAs`XZA꒧Kt#Ŭ'+gν~ļwr3ɾ i0u= D"x Z(k*l->z `1AJW<"Ӝrywp]d,2988ȈDGE:W]lm21QK+UGH5ݺ x+E5nD6VH30ϵ*{gfX4zt*D2-2-^"RUj]3w.e;"P[ص)eYW^eߚ<<6I:^~#9fAm|;[.leBH]NueR %b̽0c".u *{E-v`0| e=" !-o8wS2M%O 14m㢭s&{_4љ&B:-NEVgLVBdۮ̽NK<̘'#biXDDzˎE:Vxku׾s_UZfޣ iFO@ @6XaQ<}4ƘJ'$J<-qT싌a  [ưe{GvIM_y~(:dϹ?+>0n"E{&H%4z]&BV @ uJ41d֥'r+Au$D]yt/c'!ۭXΔP]mYW[aZ\P!$&-cY,"#O0;O1=s`J'oU^y]ߊ7@ er3/s5YIhE$G Hپ2кܵɖQߺEoRߨB.u6;3YC $8AحS%ic'4zN)Rk9ZAFꔋkWv̽X{K$ HAVB5! RlNI{Vx2a5SunSP>0XaB߾9x#wJ":k(iR!yyIp=BBIǞ;ͅvisl jqx;{Z$|B2?k#bou_ +|Pە+-cv&Z40DvF oݵ+S<U. Rꮮ܌[ǟ^XQ*?~ȯf?^Zd&y>tWg2 &SCi@iut73.mUeID$Mvk\.f/-wܐ%MG6쾥񟝠9Fh@HjR{%U|˂Vuw}\~҂ H0LH{!V>}ؒ:yZflm3#@rug +UWIǎM1vB3'L @1>tqӮyWXh824sl.߭CN#±L06[fbޅǕ]mC>/?]E{_ y1`Tp)plC'9@uE~!.DCDN+"Gg{} % 9Jۿ{KIENDB`PKL\e``:instagram-feed/admin/builder/assets/img/monsterinsight.pngnu[PNG  IHDRr ߔ pHYs  sRGBgAMA aIDATxUiluͽwwݶ@[ciZP"$` (QLhLBX#_oc4&.o  AJ9Ж=sf[d2{Yxw2O$q$pџ_;Ҁ' Hy+)n S3[_NUՅaAbڬ(7*>J_Tڒ֬Lks{ritwf q>!f[.kTr}5𔚖l'_V'M ɢ[jOvK,9Ad/r:@~,zl# GZKƸd_aptzUNe,9DQ &N~2i , "d[ٌ'Q Jf M3G z0)aiuyD=4,}u1hVմ:sgE{[7.)躒Hΐ|DO9"v7E:@xhsU87X?|:j<8]Ը'њ*H e8@уU,S);nT=] 8z:S* Ҫfe "jJVg!:zTx'c/; 7SW^}LxɜNMnaqn㚏5755A I%G6_chf `ŵXvW}' |^L8T sFX>PAYX8,$fԝW(GԊ<_–=;J S?</BdYT0e.#?i&Sط{" œҊ-y J" 3Cá2^=1SL $oxh,dڲq^x8]ZhDW0 m9ٱ +z .hbIpmC]_DBm쯅|'nDh${ru$y-8t CtemݘS:pgZq1Wu$06@54 Լ/ APf} TԌµW}3W q!i4_8$I/X@ Yb:H+ɪ' KI%DܺڃPi!4Y@nPU?`}INp9l]\o"[(;gvBOf hO:ٷm*\<݁KCۭ(qUѲz^8Hi$ 'lD,;,AA' 5͟|?kQ'YnCMi|\X&eO :Ɗ~ã:aYTc5K _Ivnk릅w깓G|3rQ~􋜵#nU50-j,0`Pֶv/-y 烪IENDB`PKL\*v3instagram-feed/admin/builder/assets/img/reviews.pngnu[PNG  IHDRP qPLTEOZe,h{Jwȴp;p;YiFIDATxA P !#> ui6[O#þcTz][9^Vq-;W-d;J 94Ng=J8^g`'lak-zl.Vj~㸵n5}I& P8"eVP6[ݢ)6p]5 [+̞ǁz{ܦ[;gAchyXyv+k@7t,`<11n.f`@_y?A<.T%I9x  ZcТ*Ⱥ<>Y_-.\/ߟϏ>ROD|+yΨb?ٿ$_ W%R&K7H;w Ҁчu^elhOv,a6nX y JvV1w^9̓?y[g37±>?ރ@e{߫T7F̟jhaz&BKqaa?߭nЗJ I8dNR|],rTу~~/`@uخ TUzs (0JwO~{0fu_Ż:=_ʷ"8KzG @&mޅ&c'R# cb0H |Dd\ۤEbDl-%i蒵 mx_AR ƭzQ3RjZju}րByQBLRld8\Zkh6 fHi*~L3,Pjڶ:B2bd zTq*y-6>uf4Ĺ,A?[?aN?ۓXMq(&ED<7_`> ^L\KuO[qD)~ rMQ%{>@.\ÿ@T<汷tIENDB`PKL\2instagram-feed/admin/builder/assets/img/photos.pngnu[PNG  IHDRNe~PLTEݭkCۖΉξ۰ן[bwMksSGɶoN $tRNSu~IDATxR1a K0 /%PńX5gw; QEQEQEQEQEQEQEQEQEQEQ߿Mf^BMy}z~TO e"~\6EWD$o"̝H w"܉$s'+o"DRINWDRINI$2Q$ZHjl.*QDos̒Et%_LTQ !2f"YfsEY5h^[$*[G"EϺ'KU-&/Ke"5w"EHXUNNNdX܉GRxf{{uk>j R D֥=C#ZsQ ZwuGpSa)`??????????;U>IENDB`PKL\r  2instagram-feed/admin/builder/assets/img/videos.pngnu[PNG  IHDRREBPLTECrOfZ[~Nݕ.{tRNS@?0wIDATxr0Fa-!Վ#`9;g7:J$$BI"$$BI"$$BI"$$B!u$II$I*I$IR%I$I$I$IZ'9!LCZBH1{C[BH>ϵ%t=NB:gQ6ԇB}iI!P,nR*BZ˄!oR}!7?/1@ʨG!M+Rw}fJ!:밤+4f7mRZ~RDR)</dѥĐSCj׭OS0aH9I$I$IJ$ITI$I*I$$BI"$$BI"$$BI"$$BI"tMxԊ<IENDB`PKL\ cc3instagram-feed/admin/builder/assets/img/balloon.pngnu[PNG  IHDR )Tu+< pHYs  sRGBgAMA aIDATxX=LPs: ,k֠ Z AX:T*!i;B-JX.8׻8yq~{y{߽g.@+ PqWC*@ral8B;&tr K6O7l\!K,k"-Czj$h@M/>n2n)Oa Ix)A 8I`dPa&dc% 냈UÀWnvYJ,+ǀ Hbְsu -D"`dq!72R (/}XӑU . EI'HivvL\oh1nL Yr3\.Ū5TmT>iz^G%d$x\6B<{ ,{|1~`o7Kk%wz6k\Nq$ֹ5g~7?:o'BG"81 gA%%]Ck!:c]cҜ-6g,LjU)CB{oM,Ņ7^بOYՍek:V]x} 78;%JפM<';%CͭZEo,ơ6f&Q xL{t_=K_ړZ(~sL^2,GY ^B - 8+qF e};a ?AhǾB0za@s'"Juޅu3y|}xVp|ZH]8≠9PAz11s-;3h,w}`3Y+uD l;M["pLGtt(i=hD%1$QkL: u`BR:SW`  ~;?IENDB`PKL\_nn4instagram-feed/admin/builder/assets/img/seedProd.pngnu[PNG  IHDRgAMA asRGBRPLTE]3<3'ԃ[u[yy7 ox qHOftg,ƒ!f?pgdS(LqAA۷ݺu,,ߑJ9M"<-9842"2rn"Awoߛ<9Q5>+Dn_\PX#$<"| [[zee%%%$?NןLbmqҭ(4Z; BOO7f/(yHa՗b%=mdDL|,PN 1Ic['Jϟmw{t)/ pYVoK>`@ ̏K .s][2ڢ UDОK2gE9(_ n${vwAN1-rX< >@wm'7x2_@-s~,8G{+. Dۊ`v_1|h+<XhߧRDs $z0'2ЏXÕB:ɟSU]r~/ y}S Dˡ9AB7ScPˣt+>,f :V kL7W : Ut~@7bF A4G'ůD?`[C0p*LԹǛ4v,{؍79Hѓ(D-T[AE@Uq!ۆ=WnVp:YNC ?ZCu͔~ɗ B4ן14}k$ 6BC^HHLG9|4ޛ jcxpch%X??'+ÊtDY_n@kH~??˲zH=#h@`T>p\1}G}+?!{?#C!A郊n0`6Pߓq睊2Uũ.lQ*znlEh3==og?~,1$2zj, gr/%o0?82gg Z:?P]/wU>zB~ȹcP?/{ OG/ 51<{VN?^@o:EW&GCt)=͙7<E&Hp-+E] P%%#I" pkO ࿨<8n?KxNW H71b>?ps'՛'o%$jmFF c T ȏH ɯ<~g bs&vu" Ĭ5~/e%TїL%Eˮ8׫dbZ 5Xkc KpWUCOlGYXGU =%y0ke ,Md" KUkȁClfP@~2Zg ,ºI !W\9kȹPr_f↹!V vd \ Rkk@ϯ,Z۔#mV]X@@aA 6KA #0V?&+al[0}k f{Vĸ2 ltdY4z(:s*RVbEBW\-֯ RCr.$Ei]e (;^'HͦJuRg7爤!$&2NGp_MkpehlTaJ0oPa0`FJ1Pc"@ȇȐYɨӰ1;mh I!;Ryٰe*Cb SLȎCښ5Y%ZӈϬ&<6r26 rpcFW((˲܍0,RcՆ ʿ`E raW+*+CH} V`_ț] :TiJ>lgXkќi_q;ϝa6\9Wc, ;X!\gF*hSb ,u1~4[V/@,0 &ޤPXM, 5VRnNJC&90*uN>!*[Z+݁B|X;CR^o' ,{$dWkHBn&[("AexZN:xix^b.qwZAX%yϸ(9M$ V oT+?jHWnjBqNHyK!1e/ӛx.CkXqqt8UU g}PPxFd`-K1iũF#k/fDLNgin%WS硆P6+X qWmW~,f!f<G54{v=M{Ը9<ڼ`n;QuW3mBӋQg xIENDB`PKL\ֹ||9instagram-feed/admin/builder/assets/img/footer-social.pngnu[PNG  IHDR^ PLTE!!kﭶ½ſ﮸זּ﮻谴嬳ƿ鸷ߪ٪쿻ÿ侼z챹⶷ήȥҤ篹Ŝ赿ۺ߱سϷ3^<Ƕپ@Bͻ%vXXxx=T\ݶ­ߠׁٻ?Apc..kS(py蓸#K5jl?@zّڱ)dKqҼH!7IDATxkA𱩂܃RUX۪`-~U3XL#x 9XP()Pٙ;ni$3;DvXg׮]lكlwruN68ir4421B>R"#>62"Ԩk!5"k #;e|FB "F` ""J #; %jcMC"A`?"`ŨQJ% [5 yQ5HwTc"DDQ56h.ܢ>Dbyrul ְYH&Bh\z; !.qND@(ڨ՗%<RqyqDa+ODFu'TCaj[[#r&xռv^zdMJ"aa5b@zBCc8>xȭ"ʳyۖ-Z=آ.CJ{zyb QND6.uUmt|0D *vUbaxs-kF#j"#bRy|*ӰǠ*wp_S#rR[Ĥ򥈧$M+1웨cǨ#^~"ZF/ Ou! Q!"FLlDDP(_$Y{ҨRIa0 "^{rINiQ"qQJCDЄ9!"^ģdPeM~%W "C(‰݊`"R[!PBR2R".A%aP/Diԃj&)=vV@<I;*%DahBOUEP!DPת D{uNoo4"oT"!") dDҫ$ UfI]9u'U bd!{ݸ 2B& -A"#b hj-[HTCVGWYXBD:=(wPIđ z/!3x1ϕ2̓i_~MH,IeR O:LD?\꽠/s̐x\0::yU[11| 9g bHZv`,1hYF.^?"&76&0Ga ޾]0Ɩ#LqW"ifY0$ŐҶd~WD0a-$.J ?,dT&PdWF%̱Z,Lz BDni>o3C%[SBȖ!̎ulĈZ sÖB1:#iBݡU#u^rJYrp#0 z}z4|VJ/_6W(f*fPpWF\>}4M+wS(r޼CûH$*<=n$9xTQ=\Kh+Fà c;xoĹ#(>-^TD-%B̔[~910}xty31aB(\~NinZ똘fd9q_)vHGTGуwBK!1.,*+UNajӡ¤R$D{8a攦P]0GD>ZA<@\1&o-"嶶rkˣ& W޽D:#-DPU6Ia{#iz [o]k+ۣciX{N;;lA;I tZϛ!u[)r9ZĆW@MMi!:\ZhS*6l4F[[nնuOz޽;'>?{BB [OM/拜4D7lj¨&Mm4gΜq|1JBXu1m21ͩ ?6NZ cW.E8G {}7:($u8vޗmiQoC!t(Çxj+>Z:"@k"?IhSAE-Q/Jz+"$*E<,@qy-uQd1f#lk/kuKDLoX(…|*mY!E5q,Ը@d6 q*TDoޡGް7o;\oʉ ꅴD.m1>Ԭ4N!ZwXHZo/sb"!N@}c!-1me:|r:]DhvYѼCI BKFyh[7w/'(DMo1p8Fo_ [)W/ҩVWK 7Hd&SDe'aBx/DSf )aJمe:ֶ$hP-eZ'M)Pe@8zAT^$}`wV)D6&p*\Z ^>k3 !?x7\ aB#LqtT ;[1LDX( .:$TG4PNBph;^^(|"ů|O+jP;W訄]~=p❈);KDTj>t3eXQhzvB/P_Rz =H1 jix>eFftilE5!z™Ji:@ SOI -yM &O1CQŌvaC7M& s1"kV+dѾo*KԿh#l@"eԮ_OZP!eddx8ϯԴbªC5DT#0GiB/#?&rH!Jy:a@Yv?~;8W\~r -X?^߽Ia֓H`Ѐ—/_5O\a-[)iK{:ֻrr31y&ThD'{wǥ}{m_oku{]w/''f >\|~(C*Q@ E]&|.Ǜ;<yv<TaH.dՠ~ѣfd=7$essuvCB&fV&,5ۍX{ "pqqr5??A.9}' Q*G |0l@y=70p>)➞>x&}xUHT|[Cԁ犺e0t7P0ϋ @<}KCE" g3[PiL!yF3/Oq~h@t#&G2 >Q]UfB H_l(p>oHH" t #DQ Qh@˴BcCD#T!"xBj*#O\!!4HL [!hB%_t|!|V%<&Lh@qb/Se8_ >NyB#Vk֨O'*Bu[*Oq>y:gBiP*/ \%J`))R44wq||!0!b .P P'k4h@ф#D]PyЀo cTCLIL/Ğ>"Hð>0Da2M`;|GcN2]yEXF\[ Dy}^r<+ 9CTW(|#e@GК)0LOaVW;g6j2 B'h} z"^*D>נoMBuF#gEC+MF[p@)T"J ++%"!DB%‡rgX p+Cd**x.е FEH`*%67S 7R y X +Ԙ#DKy'jTʄ(OǑuNIo>)M)gF mrWL<-ߟB`LB$Є$wŕ5d~Y@gzC9wo]£7`_H`(L{{Mi8qUBIENDB`PKL\ci==2instagram-feed/admin/builder/assets/img/albums.pngnu[PNG  IHDRNefPLTEkCpoîTq̹{ر|f(tRNSu~IDATx n@B  ]&ɒ.jL&B<WWX ,",",",",",",",ϢDjW{B:M,(Egda}rq2ZTȟ3,:+:Ȣ3 DJTcm #6QD;"7FctQ(-6p","GڦmD`8ND`8ND`8ND`8ND`8NDh\ҳhX%z8n|*l>N8JfQ":$:h2?eiJ",",",",",",",",",ow2$IENDB`PKL\Ȣ=instagram-feed/admin/builder/assets/img/onboarding-banner.jpgnu[JFIF    %%2    %%2D9   Ԁ b*ɂFp C& a9$L$nAۘ9NZ\OOs=}jfc3$dP&4!emT䚻uG1~Wzs?b00fX3Bi~yW@ߛ~{t֔$*Tky~x]o~W~Ez&L ,X T3V1VFgBg 318o?/+~UzψyEgh} {Z$~-~qz_[\Zbɀ !L㑄%sXb)[_cYy8Ο|4?Mן?5ܙO_㗳x ٰYj#yDf3Z$fXHV1%xjr8{᛼w7|ȵW\3螹ۆb}o<='.͂wƵg F1[f!1 DN62%&2ZrsXDs b/_[Ϸ:~F2-NxGy'zoDf>ks<,LJQebQ%c2[RFef`̥"UYTkz1gOwϤ}?\!dʳUz/Vm|Ye,MpBeTLZpFJ%2 dӘRIVI"e"}|Ç{c⹸Sx+toů]͝&4j"3L #dSbҭq3ci2dq%VbDf'6)&$4IYD'5kz4yo1rf'Zo׭bj"EQj֭1LH5k *jʱSVM-V5ؚvSfڜ{S]lEmoo#3jU } -q>{_ɶxojOBMb}XNkũkRjLZ`HC Ugfj3$5l-E[|eMni4SjdM83~xV(4m@q k/JG.~ut-_NՋ꯮"-Jj!LzC.9Qve2H[arZ 4ٚl#m]bڵwShجHXzۣ W!tGt\Edԭk}EM 3LZVh#^3X͢Dɢ,/Vnv&3]6۵7gs]=6.-g>G07NJ&K&V+JXF"ߊ?Cg,[Q:鯦ɥKjVd֋QY^bͫm$bqYh̴̦K}jm+ri8M=6.T HyߪKd ׶g=SxGE?JÕ[ /9.]s|׉\eu(͏e:~pBk_N'Qm8_NtkEbj"-LZ15EN6XNb,.E4ٚZ*ڛMcWyrWn"ڳK`랝Vṱ 7't͞/>^Sbc]pmvϻwǢxM0גU}:[N2֭V֭֡jũ)UL8Jddő[f"vڵ6ڵ62WqM-Wzqn)n+}]}ί~_8~%tv1lDKw~_Ӓϛ]f=e iD2i#&qM}ZZ'Z-JuB$&'1jܮ»3Mni8-M٦ޚoN-6%-k5}}^s#=?Ex+~+8}#{zg&շYuL}˱XkَQ_*:$\L@4DMKԽ 1r/vΏELҚT䬮]VQ$XMu^fcf)JN=cޚ1ol{m6 w~D?I;?!Z?{o5xe=_CnuO𿸽M0d"t;yq:Uo1fԵet*J:ń,_-/vm+rbS~qwmy_#suJ~Z52fo\CW8/x^{{_ qk~W`a}Xpsi8~zۦ}3̳`QM\)5جbfqXNVvk]jo[-қJnN=ɦji __*w7:׿:{__u;--͝>s~.K¸W»br>5duCϟ8oH=>S1ٵ*We%im(LXlFʷr6!>__>U'??;:WuSax^/76>m/۝;y__f}(:ߔῚ_=>W´k N"nEK3Fq;qmfrw/w+z?7wCOtgsCwc^p! +[7IޕYDd"يNRl+u&U׿f_螤|4'-XY8.S;5~ˡ8^+wm+|ϱ%v`Ɏ7wN6=ӣ9H[k{5kJ5DiXad-lE؈+mm,Y};C{N_G̳X׫T^>;NX|q_'.#SrW[_̻vukɎRkQjJVU;.R؋/n  =ߤ vgjx^5sr=k⻫wn9W)<>kaZx.{N庯ԿjB􍢙HD,,ZZ˫[+lb^oQ=v 鞝w`|ͯ= gvP\п=yrJ0ypw57_?? 7+pq?7.!ӿ?;[V}]sLo-w=Cg{ޥ;;jn櫆w z_WW_̻ucL SUm\d!dVm:ُ7|׼q?E+tW6ÍT=_OyK^;G:oyO}5!ֳӳ]/|8 ظϛzוӋluv7zk'=KXׇdֵ< '{V򏱛CG蹛UU/ckV9iR)ԊDy2XX[eUY}k#2M?sozSzz}3߼:c4-ݸ'ߙ]xKG3u~^nS?xy9[;&~ї_֛<'avWiI#_H{+ۼ;ۜ~O0$! nԚb=cC/dz/A|Fkϖ7~Qrz\꿉Rfj.:)%\ZC6"X [Iű7Оethqݮ?sG?;{ǚq̺~cxƾ>]g'|oC~M>{_d{?[g{+knև;.'vƬrc\imUpfȋ-,I"Tqg7(x߻ǯc!~}Kmh˩0q옸L<~=FegCzޭ་zV[G}ҷ>|??|i6c&5/λ~q~P/-=gڝ|y+VN}#{oKއWn{?ȸ\_Rgԟ:8ڵYY !U4Y+!%.̕/ 9''gb/}>NcY?t[u:D| }x v}C;y@/_Pu`cy^><8:00000000000001Ձuǃx^yC(ށlqFlx̞qu&7> I/cC{{PEԕJ 33(,r [s1" ?Nj+/o##/#iZO>J2i qT#+U#Upu^3:GÏƊyv99Ø9㚌 Du|Fh>qD#c68 %_ؙ}˨F/}Ãpmxm#O˅!^xPus.[\U,RCR#;#_kYl;K2栭ő}G ^#a~Dt%ʹ%Oyy4! 1)e 8I6 ɅqӊF=HLi!E6FPVui ]E1+yJ,0n"$R_;I tɆe1=I,&Z%#?noZÞN @F/#1PQ#f: jfOTXa)m(-㍓&4O*VL=EЄffҍ rf;4$w # i)ZuW@ bz5rRDM hģ%pD "\4Duԗ2w/SE™\6ȃdHe"Ґ.<NehnӐ ]Dų7arqe%;Ϣ9nƎpƭx[D 4TԇMπdK*: :}QHN9mG<iun+WOzT'g{/ѕY]2>VeG RNuI ^2@)/>s{M|V].p"j$4HJ DI,J,*ZChVA}G>+'6K#NMs9p$Q'-nd2_a@^cuF()Yp8y0h{{R)Ie_K}w@|6xDL3dQ(pM6xP$A T vdn+; n#HW8lir䆺J[6+ud{O_Jsv+dDkKhQ v&\4*'L[;JH)#Ғ;JH)#Ғ;JH)"B-e}{䮧"rbȱO0n(EQcXeh:SV5Ĵk!Y| G30BYÔI/:ۉq,0dz\L<@3Q-mmr.J+Qk%:)i>3&+;ok}{䯦mFxi1r1) ~KHqMУp4Ĺ-v ?""Λm}<) Yd/3iYL['x̙3xfEW{]/4,lK*?4hҢ]/c! ɼM\o7 ]ө$wL@I (꾙4gD.K ɥP1 GI,tF3&;܃ו)Af0i1[6y NJ<9%'Riy6ToVi A\ܞZɪֹ)7pFwk ; PֶIRi$/zwuL\#O-/ IӓJRnWW2Q䚳BNgjɩ@q9VeC ; 9vN$eXkl6';SjY3ψ>Ƈ6?G&diD|=J1P ̯bn8iIS[vr f.5,vCcJOX|c &؁$d 6 NС@4Nu'HջIP?k| T J݇2YĢ3iw %o4IY$l"vNYly 5># }PiI6 IIz~ #Ђ 4Xy{2Ta+mV`Q 2UYLL@aɬp䳌RYJ)":[KWS%qxffI JMΪȒn:H&Җz?ficu2mByPm9!RpnI -᷈s!OZ~h͎]7k>;x=7 Q-D.S$ʳplp (3*.mǝ1͚#GoH;Ѩv%Gjf]7VEܹ4M8L$6Kk]n$ZS5ٻM3 , 5aqYC\rKƑhC/8O*mV`H[Q`Fyj̮ʔӑTis+CfVĤ)!^gRAJR\WF5g&, ʛ-B 2z8|3)C&rYTÏ8afu/,R<ȲG]6m'zQ8䦝 CkjۭiL?ia>0Um|̃nq *DhIA m+oj_N !1AQq "2Ba0@PRST#3br$C`c4s% ?tXn{fSڒG,IhduhQ20̚5:‚ l(0(7RL3BG^oSkDwE#|SE\"ܩi2I(I'Gw/w(r"BqpoЀpPv_N T8Ќg5Ă+mfDakl_Ɉ@:[{N&+lV î^"I Mεʲ2|74"M|, ,:(bwW~~8N H0J@6Jvr'@h֡>[؂#o(tГDs*A[ al3n/m!ߗ|z"XW/̭yh1a>%@[9AS) s:\VBug!'FD&!rOqƤ9Qb~={M %yz L w*s*Npyjxg/](TS(8;nAS9NZ # >e]zh23NY :V 3a" D T63O:Av}^g :VxMr.sl/I3$Qsz#塋?s{.a]h7Wni@P,CذUobT>,DذUobT>P,CذUobT>P,CذMgbC[mIB7Zy'=ئu#j{vj{vj{v>EDcLh^ 37C1+"sq޶i 9Zf{~qܳpN 8#psCs2< 0ThisJIY,?H Exv#B>}g4H:esQK 3C< y#=냢g wXՃ]3`uX4ڰslX8ڰy鳵`tڰ{lX<ڰy鷵`tڨ鷵`ojTgj,;V=6vzv x履YD̎t<(7ņ,2şM)47ailP0m2!&CH48T982EYt`^cHz68d@BlfmV >haN(buG{_щ3ҙLzS=) x0%[0Qkk7[)2OH`"Ck9&nY݋8ś8i͹NBcHzy-*U]LM]@5g AxrQ(6D1r&&Hl3 kig%E*57ωCI/q1PXVB`EYñC|J3b梘[&UI<9*()h,9Mi0ʆTԠakWԲ5og'D-/ 24c Hn|7ޞXz( LC8\NiL˨䟞M"q;br HTFxK8Ō`щР:k~*,;ZӟHBNeMnmH绑f 3Yڦ.pF/`ռ{8'ܡ4{bo5$34ӪDϡX.Z*s汽w,l4wxQ}v-&W,55w8*qy'>EuRqƔ6NiQ*s*_mV9'ot0_t)h;5g@"$]Bέ'_O:ط͹ 5+Fps"Q063 T<N3䝗8Vr7.0+Ľ4^Reuz_^S) ߖB6(p=Ly&GS"Z5_jUU}_j/\N)N)jog<a6THNQ̌Ďw V+?Z/ =ϕN=B<6 #HN3㿄nZ ,*NTؐMAk m ҈nɬ%IK:yL\FBBy$۱S"ȝ*hDIvXVvVߎՄ_8!aazFn287XZ0ppV<`ֳУ=uGOu3iXR4ɧ|NORt^j#Yrq8x`&LJj ,5ewWYfսTu'ÎrX酮mUqBwԏ s-w!C#<1LSxdRMci7 Cq)W֠?2z&hNe^zt'6!{}Ѽ=Q`U"[MmfԿ>|u.[| G<>`(y3#6:h@Ck9-UI> uZ6}ZX,!1AQaq 0@P`?!.kx@zb5bͤ J}X>^J 8"H"D$H"~! @T'xG I/@mBph#|`Uj'BA$H"Dcѐ! @C1?P*$a"D$H: @%A2%3~AǿD=marR'O=+DZh?͂d6D%J$H#$eF1 @CsD 1G0f1_ݏAn'hW55q>r̫T|r+ݠJ$ $H"DAЁ@ @(c^E v/eg̺O6PW3V/F!x>0@tg-Rk 9 x!Ҡ$F1cǣB!A O+p= O!F'tKмA[::M+G"YiT)J3N·ǡcB @P(X*1o4Ԃ5 n:TN];:/Nz2-m*.c+$/.lFX[3B: @*T8ed,5ģ4tE/ʉgJ1mbAKi&_Htl( e`ИHoI7]&/OAB!@=Z!W B LKb_9{Jœxdg.U-<KaKta_lǞh7{4cb 66'''ֳK%^ъ 98Lexi}gR!ϋ;c2'R=t )V&YQkqy#kg X*+p\B˪(.XXWnK:;謹V"mϼ:tܧ͊؋ƭMњvAHAc}RCO $W\D>&!ɹdʘF y ̰-2$Kw?d*q VǺv=ӱ{A}gRL[P c0Qw1s4 6X=۫>qKb@`_1Gt!tE_PbڝޙcQ{9 AKX:%OnK" :iVjTS‚Y;,Ĺ(ZzI]sĬSk <49KנqG/5 e|Π6B%jUٓUBwߏ~=ߏ~=zoBS5y3A :軴|_Ot337se Y&mJ ni WK*UQh㊸M iXpO -tHf:{ݙWÀ{wkcJy]H~'V/|gr73KvcPפhepp\:Rbc;$gynr dЈߠ^in.9lz>Ap%Bv2uMJsh'yY:6\GeP?c˖ddD,{nh=_ipWnnԄʘl[(0oX^*0B%e? /r+ԚhuwۅfJNkV\ Xb.@p5+jU~Nom#ƻ@3M 5*osOF=XHBXrb" nQ\I Zo!?mm(wWh@bEe5*]r̯ޏs~ ՗3+)}TFCWɔfŘ&CQȕ@O$}VP~yDkQ}ͥkor ^MU؛Q_`$BU1gye-b] 7$_xmM}t p_Ž;O;GX4NH3}f\ ANkTa T =?6uz$15ڴs+{e芆g 뚺M>QG Ó47E4Zӱ-P{/2Pa~oK}< n0 H$Odf  EʭUG(7Ak 5r?+sI~e`bi B"\v/ Zі1MrQ)kCu<]ks-ZMcph0Z:3ߞ)YtN0!FW07U8˶մ*`dionV%@ӆ9Mj\| |ʃr#BSbP?؟O#ѷ 4RPCR:mlj1b $sgīiEZuvWN\.GyWWw2/h:Z+0;Ǹ^EJ%yO55E.|MfWDj[F''OD''2!|~O)>|_GcYfes,.{Oj#f(COs:1N:g9-$kn+mIL[}E:seCU08W:C0ov>YwĽ U ZKotnӤh62y#N.߿2y5˩~Kь}gBgP0GVa\l 0Lp{L1wY2;X)e/(/'-#MK?]W8p]ć贠&>ɗʣ4x5whF7^W`ߴ㓯RM^^ Xp;b{n.[N~(' gx&I+5j "ƪ`oitpBKM{Yb8tD{Iki~2+_WIHNfX;He#Cc$Z9CN`+JwHKyI,1Tn:˫k]Eiݿ4撲nS-MPS{p=<(!Ayoe7[°, rP,֍n3 i UvQnbiVRnCyZRLi.W*s`6^5cC}{k4)5 tw\%LE\-Ҍ4k_TP  !1A"Q 024@Taqs5BPR#3C$S`bc%prD?7{X3=aUl׼3ƿwEM*Fk_4@$ hUoq,nQݷԥiݚi\7)?s;=JLDu`FO} ʸtҝzu|٣n0al&84Gph.&,Nnϵ`]òX_%cfa O:m?60@>Upz 'y;s^bpUHqeuJe+Ѵ7{]4*fEP<w:.>bf;6qX44 /习$;E)9j NhgtaXKI#^X b=o9G6+ t2((lVw/hp'd^Ã",PCeʯnZڱkʚ^{_#íX~- F=knAXvr: pBi}Lt(bC-'C$5]t |owC"rW9h?˰ܔ917>VULV. `ڠi|bϧgjӴ.nÃeYP^ZhEݽ[\j , :uW=&}[x X+KAUN EL a677άܜF'@07 *sЄ Gm{[(e%<},r V@q[+++++++q[n;pmeuuu~WW⺿* B8y75Bgu}w ;?+vhW\+vh;?+;?r_G.]p\+vh;?+vhWWxЮ]__BgR53Vke쨆9^O~Wo1?陖.|RONsoX͔gVW~qmvWWWWWGC9ꪸ3!bs\^n,RA.#Y#v\O)?U̮P[QZ-)c &wq,o{Xo`6y(x9\t:UOJn:xe)>(|}PpR_j؊asstrAtkH13F5fA ` |CMMCڢB`YN9'HVAoW/ul#Ltj9YpbdCPĮVrn Ph&^tn &o7B*#蛮 Cw[#}`s yMNrnQ `Rr}.7]oIhw% ArwfnT;ǴʗxR_*]C~KH{O|wi/.!?E$=T;ćʇxP_*C~CL{O|wi,; 'vৈ10'_T6#֗'滤)b~7R<<>g`xsɾ;90co62JtڦY(D5Q.ptnop\GݪF ݱ W 4:çʣ̊V۝ T=GxS\b6t ENFm#.ׁbĶ<`&"u r>0H;;rUm?M/yEǸY[ݡ CglU%\{: ecm --bN lWu1Y4hw+(X7PV hؚZ(kx]9;iMo/u+MR\(9r\(9r\(@~?zW/L=NJ@X]ʵ;PCbs+FtMq{3{.߷"uN7^jo}P$>ǐa4Dw,_m%UaVGT;SauN t\s^X6d{}c9VlSP5@ZGF1ܨOnMfkrTLãkM)3m%O`ck"HUmiGN3#wvmJ7P NJɢdh00vʉA)V glOk/O5;MQzqhYqYeMFFly(hߥϹMs6gnPH͎W)tZJ]pN7qLѻT4Svʌ0 kQ(4={Y,,jj|$BeK/+w݅QzxW /N=NJĠ,s<ߙ}7^c'nNɋ[rBψXxl-F:Ghv>-۽ŽY!}v~K\K\t93N+q0hN7B)!.176/ONZm07kb(@wZ?]n6w-\<#VFY5djɄEwr2eCv ]v8g˫uVgwW" FEx@t B~(;CW VSRhLIΦs!,Ýjc@`W܆>՝ #e x: dZTUJ$cA~8%56*,sJ\NsF%⩌MLZwq>Q֍e #Z1X`9)6WI%7cHRnr1X:?/tY5(rXu jLpOI+rt籠/O7W/L=Ljr٥/r'=f1<xUt0bqL݊vez FIL,;ho)w*w+± ms{U}6%xg'BW \+m.YJٲ(;- hAۚ0wrR_9Ip#|y{*h^l6nPї7]tB5.~ʃ<~+}v]f>_r!NMhز,#r\*$+v*7fmpSBvVH/]-'"9Oz2+Ø7VlⲲj72S]:L?RJ2_c[*}"łj QzxQ\#80*5f$P(${sZT6pإ,B'SԲ P>  ~8)sMñ'SNz5tm]Tѹ+N'w.*Cjr;ySD6jb.JꪷٻV#&UQ1~҆6^Zx<\9T='x;M"Gqzq'_3\mN-k|xR5r cyzyZWFq;wQzx齐h+};kb=Ԏ̹6dQ{T1˕ @ Utaz~ESSҫ#{N1uƼu[tc O?C]r t~`8 v/S)9p/BfI%q^9[(}İ8FjwA6m\!U x]%UX^vuU2D*Z`_:̴[~c JˮUX!XTI>Rs _BvI=&5s>' s =MOTe{`mX\ꦦ.dZh7N-\R/HvPy2ꨣ6n|b*.5UWb<˙ \*]T9g]{^8l"{3Hn* LE |{saD.gV`6cz18-pOי*dTE\"pmW{kcrx#u;(&t/(jZc{vr auI}>ebx OZq^_V89Xwt0H1\zi~ظ7AIT Ռ26Σ0Eu[\/|]ąqNòa8?[4!: t^ a&E,Ph<pWp~D2 1udpJlR75-\ 4D爉O?̝QGqW 3Q%dSVKkKj*i.ˡ>Mpg.k{l6,+ !xhW !1AQ "25@RUaqt#0BPTb3s$4S`crCD%6E?Gǐ LV^Ou?t9?mF Q.[܋pSS#b2 ?vww ;Ygid4~;y?\kVܘu/ͨMQ%oƱ⬎&|ܬ JǸ(m 4_ "mN*X']O,HԴ՛4ݻ<]&ZWrHG"MXcaG@2z5soX S$oc-#êcVG'в++D㹤(p"B?Xhwa,Z*挛q7܅ 6 aцS]>&=QۼSY;;w#M},(Zñ~?9n}Bա݇4s.0 2gXʨ)ͳzejs.U]3CݽSiul)(rY< Wb ;~oц3~hj(D~yC?lkB=$N#T\ ȥTQ5ܪۂ{k&Y.3| Z3)߹@]jEEW#ncGMGKn<-Zag,=.]3G~kvw/te5S;} g|OAl_)>]3~kjp=Iٜ?mZQg\] ܛ ݹШIe>L,苔20K NlWCX؏ߊk] c_b>~+k'ot11]о9>}v|WBϊ[] `>>+\wgt-OߊњI0E[5oָWg*]һ{B(\Cfhءh`ljd:ۦFvq dbp:(if{YVn(\amL3{W'V*9]py36Mİj#G۬&V9%-d7/n^uN:X׳-ayweφh 5|\J5{7b]5u Nlfn{_ݤvBo&w;O |R8t G#ѝ`UE1{XI5Mkw#M0) 8ӪoU0r "=l{L*Dֹ$F`o nLۂPVVO)G-?]b,S8ÎW\&B Q+ɽAG8y%MF 3>f) k-EDBl1٘0p>-m̚x\+M~;rV.;Lcj= D{!7;eNmtm)@o;Uarw%`C [Z3Y҄D8TPͩocʇ ؋ nOEP. -li=,X`PV]d_3'( e`.ʄg4iye-\ ux+Bj]AYX%a#X >t$puU I\M;gM<ܤU3*"DYmZͪ(r lܮBlYurdԒg$|aKSF ?n݁9ݕBtI~m&;Lcj=œh_w{ØO00L $BX.͆]n55|ZZSX/UM(4xQLuca{cc{MҞ#.c}GXڦX쑽{Ͳ!7aHYl̙2pcq5C-F.Dg9aU9MgUwm*S]xpc*$p ߵU(G6 K6=t-@u4FHI7sc<)Z%~o'wYl KO&V7Ό*m s"ݜ#czTG 9533J妔Qcջp Ưd69_nj->< ?&CKWŧeV7j,Ty$mtz1dwےkoFs= S7 Upevd| Jl}U}U}U}U}U}U}Tb1ÒʚQ Y7bSp'V9A{dUCMph1jhGIp#ҏ Dby;+]8xU (ƴ;uWJ(hީG(Xv)5ŝ>EcT=OKMë{AXQG~İr> 0i΋H#}uD5q2T?=53MQ=CA-q,M$1w (lmUrKݡsvNB%IqkzfWzV!Qϸ[ߩV L͡۩pwrҭ7Y/5NX{LU-.vȶ*B`E+Z 7X^y'ygcwPL*)js]^ylwǐ{9 D!7ñkWmv/\FZ4*#wpkz!ةй`BٚHC&fWc8 Ul/`껯qK_hx:QBcp:sl5 v9 '^7$FuM8w1ǿV PB >;'5Yn&15Nޏh]d9EI)9G yQFџkue,c=IǵQzjmE48֏i,ormޱ":`mUQS|Gʴ8&gklt6aɜq)IR8#vi|ɭ.6B83s1cCQ{D-NxsCӁ7wppN X~VO~KAR=7+/2JwaT5ĆRѝ01Mݲ0[ԏnnC3GJ簾w-#mڂ 9""Jy,@6VSJvRҢ61vfgfpvZ(o'dQܝ-x n\p)j.e=JsQRԾL3ڈ e&52T=uxm}=,53!#Ѓ糦:~Fp7w:RMa3ZH˗7(zlpT`N f `E;:A{[y־9Q+,uYMQV9mnBvS>R,kFo۱1]ڨcZ.TUy0D+ШնWSTz-.燾Y.d`; > *'}lobxl8tD5O7W'Nu\:,Kl&6X0xQgz؈~0⺞2FBɶ轮pvZ?UF{F^Ȧ3_S ]# %AiQ*AȜ EeDs(M%RSU-H7M8a<g)Vk7NǙ[󙤌GOea9 -d,XeE ~Lq:,VU@F~6CEIJuE#9U[&˩>[qBk+2h663N R):'\qlZsMZ?L=?BMKP͏u  MQDڭkyo‘ک! c^%Jʉ*TIS;l-T^%˖ˌI"Z 4 :Ҍ&eKw[%F1}CR+*W=ppbÆ%sX]ZFd[]bb?p<&5ԹgS!yJe<0W>sG_4. PUQl+%ضДN[2=;O1ʛVecj4T52|+\$ex&SFs7P.V=,xjSE>{o5 A] tҒYpX(?*x̧q]qRaF㌄vZ\noz@$( ?nv Ȩ Dĵs~7aC><*hpzZ, jrb1+*RpLBF&dĻ\Q&LRBjȪ! "އO!#bw&c)G|+5N8W";+{i3 G}GNХl %F*T_+D/%ZL RRp"x*X?mh[^q;%P۰}k2슮naQTI\Q*'˾1.J)AЊq|xHElv{Fae kA,kK8K\\8W!%D%NJz}paW+P8P x0Acow7Li+0`N^;FHDV%JTS+NM|NM*p8o1w%a^LO XaTa<'+|0~1g>5 T pp$>#_z97a8IRԬCUʁ E 8:xpi˱'q#}#0zc<<a%f$B',N*f<1+3 |q$H8IOiXmhV#,>Gide1$eqDHr+S\ @!(qNc6!2٧wWFtq=<.lx;9$LGUĉ\oè\ @8`{=Obۈ HƉ^S3DQX!~n ǃ.$HP A a9p) jRJ**.̜n1˧n ,T"[A\~]` $J /__1H1yx|k88CLrAقA(¿*J-R4Ti?((-ж~TT΃OʙDGN;BG?o!/*'#;B)9GaxS [33Ͼ_ϒ0ҹČ ͕0(fVfkW?GDTeG w[2ZUk겫HPxp__; <B P0AW+*1KFY͗ʠ#2QH|o3 3TĨaTV Bj8|{'<2@4ePNMD"^eko0i.ïbt}Y̫Ġ@JАuQ; 7T1xc|N ?0Xxu _l_Z4rucQKF+Jϴvb-C 촚'NzEImm0v*ٙ'ѺXaYvUZ/:@XV7mXרO_ߢq@Qj<<|(jܸi"D _)-ˡb+p4HVpZ#D즣I)XJKPL%km#l{oa Ieo| byAC3$80Dmcbo ˳X7+vJ1Ժr e')uѳtGng-^Ym)#># (}]zWn݂4haH5O*= d(2_{šn]0d9*{Dfu _cTHG-:,HHxCD톗QтenPy-B#աB.h.!feЪ@m3h~`x,~zYxLdII@S1$RA'}KZF - #ğqFO ( Q `Ԛ Wӳ y}3NTxIRa ``] [h.]Ph6x">W?g ԾNڙ1y0u \[2BXLvKC ıhrcIUaEe3-T:G%XxeO>iu;w0fbB/eEhX'ֺLG| x.Ȩ ϩG ]ʒ\":Ƣ%_W>To=|u]E\]XHbVyZVhGaFOkU㜉fa d"FQP }R wO]|kf'hUq=S@N=zoǾӴFgF^g>$I>HwΠTů. ?rFۇH+z Rx)+-?XV+;l6BD:4Ѹ iy5j6T*Tpn9E+N17CĨ 2Ji݈ `s(L,gHRÒpf74\f&`6#jXxܷ$̚ ΅n!:&1 Z5Vt0Gs#}< p98SAƈ`0aKj 86e4_AK =#AdEBuknB pD_s e$ 6EpktD@n}؇R Q{E(y C63Nq7;[Iq)u bMw87((}3]Ջ`gmFdz`ɨ3-6{+xE x|nG'?xKX[Y(h ]fYH.:=<_ipPdJ֬84=bTH^"&4Hey- EȡB01IR6{`(O؎퀆[~-M1;B;c$!RE[ٗhD5Z FZ.v  ;~[4lv[Nwɥe û@1/' _g51 wzq5)D1=E~qyJ)GЁ?tqx'K)F[FI pZš|W3-i8Rl);{UPɲdj1C"a3ereerDm` 1.ͣ Uэ ^TGq YbϢGK!RPowuWL!B3PhR䤋leڇ'Z4ĘΫPaH4o[ſy[ſy[ k&҈N D`4Ӑ(lT=ml٧Q,!2֯j,4)Ix^>Tbj5_!5:BcQr׻NyYhc&bYx͓aH^ڐR}0AΗ_H?QQ N1(!3J%9C*25߷99q.϶=x>B[_lu)zmTj(?V8'`K~)m$ED_@i[QBK(<^Y,E=J}Q-%U|~_ 6F(BMƆ~SСޭ;$fCPx#fAb)41ik銆{*-J(EKvAuHUP \@?W0޿":Z^0N6+S/@VdS`%.gy rgLsmȼN5qSp(ӏVmg S!K$iLB"t-Xk^v xP`a޶ؑcIvB&h4Q& ^Mcvq$,#b˜⦛)". ͐c0͌2!gh2s9gEp_=8wL˥Q̘.` 5Ah(0PQ!y㹩*f1 =[Kp,>03uZ~(h 9)q} 4ZʥH8Mtf#ze-y'h`\Ќ`Z![F/ՉlJ p.ºZ"<@ >ˮ(ہoH5 O!K/QX43 9foܶ~ m@'bNZsNOL)* OS/;"^P$h=;M?~g^@q7{j v~l,@7f_ڮ%& exFر{\8vDl>zi|6֟g^*tE0v8#1m{jRFiqn%cMu`S+@G2o..5=l-V m'~ dgS$8ҬPs.wA"%eYc HD4зdD(ٍAHScE(D^S Fª0{F,6h*.вD,-CeИ6 0ڴfHw z"חi[ϚQL0EAlP]*$MEqցomH&I gDk \vk 2orܟ?v)b\oJA6Qb[,!1A Qa0q@P`?l_[Md~b{`$.CRٗH;`e2*\b>׀~lB97oB 0/w`er?lGA,3@UvWQ_ b 1eȮmQؾX#FK&FR8у[1Q/tʕ*AUʏ-XR@]’eC}@;CJ5ǪG0ï4ȨA;JtSДD#1"fV:jShYϮJם)R*TLJꮃߧ:aos:z'׉]U*Q*TRGH42Xz=Jg0JJUt:Թh>+Kx'\i=*Qu Hosv[˛g0t0tBTOHc\ ],7e%%!E%=N/"눚V_BuaвK6a>>o7ϛg3|;>ϛgÿ3ߙ|>o/ϛe&l'K_2>tc6Q;LJҙOfSٔe=OfRz -0xW +_7"dWxTexMu*T6HtTOi7V&5~kNk}D`XW庍 }&JODyP5So]ev=!$Nju%vА:|zx::~'񟡱U'~hLit~r䳹< O琖w%K;,K;;%gr;BP&:+AzgW:T|bZDFmN^RLèً=!ɋ \Dnp,#<2M(h"=r=zCK%kOWXb_Rf5sjYk*> @Q XN9Sk\Gg1q뙍(^R:nCf{hR{Ŷfoa6HZɔr\t,ipi^45v5!z3c,ܲahlLlMF*3{ L)rOϼW~m}AxRA#"k0z*vhf\4:cΎm|e̝u 15k(lYQf@nY]cb;}PjfM_ɒbGَ\"ma?ޗ`\shj,r|fL*b0nxM[D^%EJlP.Ի#pn 1@1B%y'vLjCn: lR ^Za鴩ҧJ4h$jQ˃qvU# 3|;ˏ L˭M*_{^yo\D۴'LjGY 6C3==ސ.˜e8)%N /V)g S}3BCh}T fs gfOsbS9Lf,"M`&A, *ه׃l0W(,+Mw%H,sNqIDp=16ӒH;GV*%AVLJg mX U8|Vbb&e+i\rl#/)KQE#ѹo&`'G#o%&%2<1FƲC;$ p*_ uys D`b(TX)k0XZqhh7FɎ!1v#q hC l q. sn 76CSi4M4&&tX1[TA~Oy T'f*%0!D|(UQX3+S8).a>#(冭r .$,.*D2RpJ_t3Eá0cjF(*g[AbOF\D"\J"'19 dmm1Gyd6xU%˃w4+<7гae@ AlA@I%Tk NDT?@rwXO. 0M l,Je{k)J!oA `nox,VV,c/}O.t!#}9ӟ@h3Ex8""[Lb$F*Q8]\_HVXym6s"eov[cήTDG@-aF`Ϲ  L/߷ng0hExw:sV}aUBn܏iW Io!IJ^eb l"@ܒ灼]X _8O(E ބ' qֈ  Evą0/jR߆|l.zFڻ?ZG (%e >a'~pBEi32!<&Xφ>%!aR 1qaa p`b4LcPtD?ZfUyS ;c29-ZD G.!Pǃ87Cx'tvɨ(iULޣD|Z./pm1\ 2lfD!Z4q(w"=s];ܠL-) *\{(kXnaK YxE\O,v(UCtV)R٠ n߬/|?Ӳf{E.Zn1}Uˆ5YKe2!C$ 8MfJџZH|Dt-T6Vջڅ [p;S)XD!Uf|_nm\s,!1A Qaq0@Pѱ`?J[5I*n{lD%~R} }"L;nx~yXr=3ӎ{sh?&؟G'yaAhjhu[1eŋE,D}<\.,%B$1BB=e(^-n5="$/ |tmCAo@k>4^:.}Ōtu' /"mV1 ⢣$؈cG o2 !ydxjBh@ڮ]LX,XSA35.%b̷L  @x:M -xJ԰3ǠW*7@>.+%9;m-Y-FBLZX(0Hff_#ݥA^MEHrH*e\uYy-0#XLJU{owMk5td4M0@*{ěh݂shd!6c:8ȯiT#gzymF  ;KBkǴƞRA?{,ThEf8xKal$;2/ 2/ 2Ȗ+ozq4+} BD;X)|4YtMѐ.6 ˼@גq?f8hދtxUFV(= Orn4i`)~e U+IP:F`d17 :.ed.>3cAc#Բl@ƨ,d9$' cI|Q Be*'nZlyE,Xޥo-O- PA Y"*_Ʉ.a6 r`-/wķd !d}ǻbn¸.ʍJ;zVlx69%v\Őm piNa.C&&p$e;sTxfA,J|zN4>VA2!@vRwy>tV;u+"e]?{ 7zV̹4c`ӳ37EN/. K͗$s%4HE#%uup/V77X [ ?)k`(%A;_d|=dkQwlAlztI MR, u15GcDPFʔK]Ae52e{䧈dvsY* 77R_oؗD+@֘G-ko/5,,.^e+tTc7Qqu:[oF=&#TH&}Bmrxt ؠr3FEq 9xj(0q?O§ST*~iot%~e#MN-5`Ga\!) Q{ןw46,p6 774YdS/o$cSOgFO110׵@F "aۇ 0X&^SmmdX|YqD`Nu6GZX1ʋ|u,ĵp+aسp䨋BMFPLX>hG[׎1Φ&C}Nէvafk[(BјW.݄Q H;) sk Z)D,V9p\O{;[à\?˘Y\9Xs@.2pn3=3oHJKnpcVaT@22) v[-tbg5dT كV }W/e0|Bx=PKL\0instagram-feed/admin/builder/assets/img/user.pngnu[PNG  IHDRAAE pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxKl@3C3$-v`!).EU%PUm6   Mw E|ڤ.FEv 5ɑX%9hH0#PC5 MrT  3{t.TT_3gF#@8 2 7_NU7. \>~s,Jxx/g^oM@B%0h$ce^W \5?ui.Yt'!L4"whb21m?2'^<-%#!xsgq:{$ |hX6# |dn ~j'e6pOnk6'̕@HDRP(:J˅aH,(RO| .ߋ"S(D"9rH$,E2 ׯ_G4<~0D.e/ 8qx[+Jr666D""#bV愠I pA9zhCx<4x $I 77s' @6%q)|z^dssS$_S>QbݡNdjj>t] /f^DE###-GvI$loo>fe\.ghhUU)J" S-| B@4% #2HB BK= 1V @Q!dY\.$o^^&oe T*9X-gA8("-x^,bѶ\.keC: <L[zVWWIȲ+1ap ,s[:.]rj^8fp ~u:z~aa5SuVsjf\x˗/2333Awm+}SUZmܹsh8~gt]g~~x'ƷV+7 L&C8ftt6R,O}\ZZbii MPU% ƊUQ{\.B5 'APIENDB`PKL\JK8K8;instagram-feed/admin/builder/assets/img/ext-singlealbum.pngnu[PNG  IHDRE pHYs  sRGBgAMA a7IDATx}]eǕV9cOǺq<0#Y00yA!"#Dbd21"tld.i||w 2/ӎBB$t=׫х+UW+ZW+̧ԏ^I+ϷGl^y.t{{<$M{1aDI\@xY>AC˟|'2OI'xbGj?J{VZ[6dx4? eh 8&C+ W0(u0("V C&R._r8#iiaoR|as((Om1T^"$D:-2 B498րl G?ca3GLБ:cqg2.SʢKԽWmX{tqYf<Z3NL`Pҳ\b]Di͟s4ԋ+H9&QI3 #v) s3_vקu`N1: qݯA+WmG4SjC|2L+O%jR8rhqeYj(ϖzJ]M"O%,wCAL''?qaڏ.\pRČ)7ⶤ g0VgyFnLa d7֍3|\.}c0zR_\)&ā"3`.>{`~屝_>@ 0|Нܸ5x=v .YN1D&|Ikd*D+R^{5?4<,X x;vlǟ{7'NL~nA}ےjE)# р|QO}}K.1%}^p'35ٟ{E]CRE!i0Qg]vx$lsNo~{ڵo|+JSX*ӈDUN+`p ǝ:uj'q@킍/E+nsgB-L7aېW)]g0FƁZ{?2(ݶ^9K\6JnFPHSx/cF]5&;t1 9tm_0*h࿃NN΅QT$ܾB`D8e܂mI: Lr0I < 0BmY@pLSI Ƨ\({0;癱܌ZKnAE4\fq0ZH%dٳ'ĕƔ^m㜮X4bI<`m2FdIB˗/OΟ??y#GhGy.4-ݒ'I-}©S;Ӗ2 >ACE, \z?1A;69C &AE&CYt̙3$aSn\09}4+c'NHgoL)l~udC() `0+"[Stw7۳)X2pY)${7! S I(IJJ6#wL*44fA@{+!_Gi qA Ab `RVoFO;ҿIr00J)^@Mm"`LO>|/(RǑxwCCKB1 #A{#G0.5A"$JVp0"E۴`lP)osYIA%n)̧ Pc bR.J:˗/'>Vť)?1g W'4cH8\:Zqtm0.4+Iݯ˙ɬlXfpik' 9E=ܳ)b`0mZ1$-iER?~|¥bxČݜ[0n0J-5y_[[Gqā'x"-۰oxmWp% $LӊU\˛>jYl>j0BqA)Hijz7:{ݖ|Hqxh2>{2֔ve9r%LZ,M<90d6L`0F\i2K̃@+Lr Y`Ss0AiْKٟ?p[;ZTHvd:##!opJV3 +v.$ iK|/nޢu$|`0baM+c)V GuC,|˶ ڎMhQPݙRRf+v٭WD('&.0q C7{yϙ%:ܟ[eYO'y!z_r%>l$1?4pB.e֦{5۸W8bk)3¤tb͇OOb[-}40} "GpSxn}iPJV`)s&RLP<-7#]u[چ*-<XXĪ$U`";i"#ǏDVfjz9 a̠K+2F$XO7cOP{xp8{p)8{ tИAit|OOCC%4 #uÕ9kXH#yxN.~] Ǔ!]g IaTHP\s`:O+܍irHsi@,-ee`yU70 GM鸬BđBvYJ gq MLV # (_)A)j`4tR H7=g/bV+̟04Т,J,,-#@rH0 p{aU $ |Y[-t[ &N3 #3MI%M ~"&21n8t14I-S=L'}r :yj60ƃY(yv:V,1e*5H! q) aHo\خ`:f4iUًc8Ij>$Mr0F$Ԧ|BBVxw+f-`0iYpKOuD`)$iŌ,$)b9^{G`0 i5K}ȑ#Y`% ɼd{l)ە9`Xؕ -$EҟIūw:V+ ʔKJiK999a 2رc g47zb\I|B]v3.**$=ve:p-&]Q|hquƿ_9p|HBr9M+ 86 rVô\lޖ?H-#(YGI:t  IC*t١toW+s,eFV @Zd<_>M\H: |d9H?18,D]K[iN< 1e e[%Za8JGbrw-m˪Ei)ʤ?uMDZf`09z s.NM׀iV+}O IV8ڕILsHtx,VƯQ`xk7΁4~e>j h7p_)$aiqÖB#Af!8HbbH7*sC6$"aX, ZL{g40JV% dF P$ve21MSH 7rOŐD#2.>O{G`]"k @sm9)J?jC^(0{i)Ӧ85\+j q<'q AuɈO !B`Aoa2f?j@H2́⇾[ $p:SH #BP3j^Jm$)t}W.L+rIÈvVH%Ḑs %-y܉trIZх`08Z=Z ve⚾WBrĐ43ļ #BcCJʖ}%ɁW̱/2bܟCu$L+'.޻:[ wsv-:SnE$ Y&}{Qrt̞K;WߍG`^J%3qZ9-ebޠR>$'PHFN2`ng0l4#FP/o0A,"p]';l>MFEο._7Ct`oJLN_O'O[^ƙNcm;aYp*hHĂI=ە9:.+“n,u;t3 mWCR+W<$rGK= 0>˝9W~pK~w[%^Go&9>5BKz4´V+:ȮSt'7^ Lyd;w̙b`t߿} w_=jL(= V5=9_.i?^]wgv|z&^[g0bd )-K>^|GR^ <_Ȍ!V@;0?yN}Wt/swρǃ1RwpX2RAM>y-($ɦ:1{."̵kך%e _>?{O~˿V{>guASQjAq'ZV8sKBrS ,}闾=T4x+i8t:zRh]$xDO-!a+$d%)7M+RZaX t/? }O/6 Sv:s0Z%6m ZʌAry+5`Ϯ4W b>9nm1 .nL0E:)D+Ce`vs qKB:>H16c`^h6 C^$Se8cfy R&E럚. $=|pvNLu[F $$yb`tb7BzUJ WHjIAVVrq3蝏`LkPg. ەO.,il/mwv5 aM5#@#3I 0%Fw{+ZA_B>xu߼N;a8 I:'dtk?G'VP\^ݻ{7+$^X^<˿nU{tЌOg0NuWp-CcNGmr[ʤ?N;lNڋ~JK[ XX3C#xr 1tEL;m꾓w 0A9rAܽyh;}%C9í >o[HrKB2inE1[+ՊTۄdI*g/M |I I5E 3; syG<T -rvrK/2gIr8vX(C I3 OZJ˚i @>$G2Ĺyg0V(H=@Wpit3H@v }я: rhB _ˍWYгK=HBM?/^g0VLݣ_BԦRp),2;?#1|>o=Jq*n Eg*/ 8bR)#ӗhiy<4ZC( K %)>ONZ_tZi4KulɿDG32!1`tiuphCZIӾ)#qvh"ȑ#O<{Ca$z!4ەN4IH[Xz^ov[zMޥx%Z> p iJhL5GGtYm0\R"^aeÇoD)ƵݻwwU5,#Bʸ8 /j\XơNJeZ}eXE_FR^i0ΉWjֲSk;iTB??σ,092R2a&d!]5дSի>!_t ۾xSDN ϯKC~+I[ؒh孥o)PMh)FOV6.e83,.B׮ehrˏev`%V?⻳z GȮai5BʬRr?O)Voײ²Wo Z22u2her-tʡ)1 C_/1CJ*e-%"r> @K %e&4"d&VP04Iza*'((,锦^1 _2|#2hyk(!ۮ$Mi44)Mb"f+wJ:~.%iD6)oC.5ƥO2^F>4Njyim.!{{ yx\5|sC9$rɩS<8r??l-ۖ$ڴ_TS|Xkg^k,"ɶb; ukF3Tv f^V/hT Q<݈vdtsHB$_xҁYpDX7mQ1$r̙y,<.ii_ h7+ǯ%-yxD%@+*pf .<޲mT*;χ9R{/L'kZkJۉKeh}[yPihdB.#.<OE "07 `$V."6} MC ۀ\ٳ~PLR6 x i5[˯6J<cђ۫&C_"Vã:3L'/ /wr$x9RHƥ̎891Xy=h e<:icA)mއɱc|bzVTb0D%Y kl{-kk[ Rj,+MstS8h1+Cځǧx5 =Za /_N\j̈_}G~?#A|Є*EB.pdhhR=v߈:?o/++9䒒W ׸}AjaZZ-Z m_:4ICqM3=;6eKxZV`<^zۺA[__OJ$ i ϵ{"'NdǴ6,o>2]1>8JaxzW/W$#U4y&9>By\ZY;(pi#uJyrr"<ڊ$%F|ctt Z=92>,ItOoihK6/ i-!@rg?.K >Sj/lzP ]xGiC(AL5ϝ;YQG#);%=_kA +) [;;oKr`h؋Aq75!A'%iuڒ@NC :rWIzu)tO<׵fk|hi%Sq RZ*8jQ+O)>%R< oe\bU%EKىmIs-]K''O?xqXDV0.] $2Hiƙ3gv̑AGWʋ9B]Z,Ia 2^ڠ_ZJetշ֞<e<5,[sQ+7/;Wci;^~Ct{(,HWAG¶%Xs2d@81aޤ&Qzׂ)L)v;XOFI 0^,q~-ubTF=~RR,A- BmKmSjw`~DM3^I V$mHy`Պ~9$^ 8?$i$id\=| !](588ۢdԥ򭩽_zKט[tMU+Pk/y55ztӕڢ&,4%1;-!vy+t[Br蜼ͻb o8@"iI J{/wuWUSOۯ}kνo'C s{?XIR8x7ŗҮH*i Vf108eiuqNhiW m=;dVc2W";+< lΣ!t;~3$y(DQ0ɛs>P^T! nVrܐߓl<ۍTJKיr$<ۣ\o+l`m)-,aQ aq[&Bʶi2ـ]kqY~nt)֞_^{˾kV9^?Wa}I &ω.˃8;zsQ:\s,]m縉Or i@#ӟi$x &&ݣ`e)Su6u`my-S}Yu?ѧ9_Ϟ˝sⱺY~򣴌V`um6?vq]PIn3sY\!=8ϻ1S{ű6co߾4e~8?xƹs%8ҳǞ˖̜ЋdSJqD`PĹ(<$\O(9Aн@CWsgϞl!`ri%$t g|yCl$mjic> n#-Ni0AKZΥTI$,<u&1P]s.?VScvNΗeз%}:8,?Vx>N,?'ѥrP>o w>s)>0Wi_R\a2Jصk]S񘶰O׬(4oEf I)ˎdS""­BZ 㜾S9XUF‰8^q#튔]Y_4B|/*sMʦ"?(DWmR /+xAgoPi$ &X|Fz45szW[ډp]ǗmtD^Ha sp A7أ!4zWyv"׃f;ŵZLHrc?GFӁf?ϯGWT thy 5:ע aL4d{_j;us;x\$2umرc4>0^nL(q43wt{nA=i B0 "KL"QAl>n4 5LGcū5z-qzn {T?g|P`SQݨŃY˯S{km.^** K3,m~Y3sq1]h`TTb`Itgn й`0tqҫ4[ݕ{a9nwnk^->@Tݲ*֋l}c6ڼy~Y4sC`$-Lً+Lঐ1fŽ8fn8b@p[7Aq1&k<ϖG)[ۧF?W~,-@U D+6zz2Ijj=*–ٱ/&iBL9zL#*V&gnf 2/YN<\ېW:Ce2 ,3wY#glv~PR2lB~Jyc[LWRF{V'cO+9'2v h)N"N [2BεvMVNDԁ2jubsZr)}ǟ7>\hסzđ1-SVh,qX^; sw㢐S*pO[$'u2,S wVwùB۵X4:akRχ3iRjg;nipН(]>4&qS0¹YAʉD\_< eajyCa.(Wpxp PKL\2instagram-feed/admin/builder/assets/img/events.pngnu[PNG  IHDRNePLTEOd+iyGꩍwɸȸ촜cp;ZYȴaVetRNS` T> IDATxko0ڜd$"Ahʝ!(em9LA/.OF}H~Q$(_/E"EH~Q$(_/E"EQˏmԅ#ږXuE 3=3uD=$&nv:!Z"nԷ~G)96WVtCH\%O;S-f1f3(V ~{6IT^#j1͓m"@-wX=+ qEߵʄ_x"Px4NlE,Tj1^MN]d(s"e_H!Z^/_->uUyL%iYwG@hIw"Z81rO\bDUy;Q}W_rgޡd!ruMѽk;h 1"AQվ 5Fu'ôo!pԁPj^zKD01#%U =OP\>}NuFf.FΏ";Sz oa ]qg2CxQ"u _DcߏZxwwSЍ1o`VoRk!i{ Y_êz` Dݰ?HTan >JԞZO0A#3d}DD{WcM̨ OdVBٞ\y!&hqjmyGa]Jžϯri:sX5un$&>Z}${(WD$F"< = IϽD/Ql:_#e|ݱHJ~Σawv|FSvG{*TTy$r75g6 a1AZfkK9Ks:;H7dDr 8#Gݶ]?/>#->.Toc4dJ6c!/&OCƾ37Hr""{_@LiV'jV&$ ZyDŽ 8#4,EIÑ{ǝ{i?.-o恲8du t"TlF*,!hrT)Wc5m®C  AHȶE6m%C<uj7cNC%dŃ ԪPIΘÎC\+sE GAnӍT7s?QJuT FJ<KTDWTXqfQmO \x*Eon,ߴc k5xL7.vM aY5h`84p/&†b->3ؑӁBX!.`X&X9q[6Hƈ&7mwZGcIkinJ.oM=M\a> c*Fɱx`A `2JN"y~4 vapOS% v\hެ؋eƦ-K|Ɵ]*<F}F}F}F}F}F}F}4 oIENDB`PKL\H7instagram-feed/admin/builder/assets/img/allinoneseo.pngnu[PNG  IHDRr ߔ pHYs  sRGBgAMA aIDATxV[l aٵKZm- uxn/$Bں$ъ[ n %CD#hwRVeGٵߙY4mIvs?.WV\B8Jcek&-,.U!d ȘGH, 9HYfR蓰(q!Pk7+``\;`yxVeUo7G 0銆xsȇ%Y6)FYKUmRkQ0|!"^&pUxy"c:(Ddhw ľO$U#=8P1udˤn-8 {b߃ '9/Qw. Zc[;39?^jioƟ =+t~ޏuꁔB +6O o "Ӄmxym;I}/e;gu7t@`ѤtWUݢ8s_R}FrmH2ތi;e|Gy*gfnCc(ٝ#[5-jEg)cܚ>c:]ᆭjL%҅hJ8W':Yn.vsW /Z36#ch6?E3t`ra-逌0(!^ y2ԭS ySwdޠh~D;oE!e\:7EQs+[yaw{Wx<kbx6R2;aDm ጱ9oEKvnJ Q=]Tga"$ tMLMX)Q=K9;pO~M%"Nݓ9muۤ7SV*G8 _mU;."E0o'FFLw$-}HRQFכ۳86jW.0PͯSLw?Z&0IENDB`PKL\ 5instagram-feed/admin/builder/assets/img/welcome-2.pngnu[PNG  IHDRyշPLTE17Q8lqNSi{䘛#)Eݦ^bv]bv@F]硤ïei|X]q?D\tRNS_`oO?0@ϯ=IDATh _0GҋMCqxhO@B W27oJʎ:*7{{wׄԞl:~xY/K.޾t-V+mZ²peZX"[XtEjtYjDԲqnyEF>Q˻ԼG"9Q(FQLߛwbdXOaUBX"+ՇGV͏1>°:؂TV[`VVkVX|؂5 +M@rl"Fá]uh~g$AP^j]\5$gXix&4qtNzYN)2>R&B(OucFl5l@d9|np?1Y5":q0iX&ϥ++mK\K3lN:>Ɓ  G2ԏqagEYϷpLFjpMTm5&YOiL@|bıdME._pIGuǩGǔ 1 ~ƪJN&fGӺDT@t Knu!h97ԉ һpMixI ̓MdU8\: B*a]CsH}G^( @ ǭ/.'$B3Qi~3^@p*$ 85, 7 MX&NS+Yj#c$ϷPI n@^}Ku)7mٷa'aĽk#Y:W߃0vH3Qӷe*yߖmj-ێ; elD)[qzR%Ow@v}lOoya߯YmXՐUªV{zً[!\d}yU WTKs?{BP5\(KJ`os-.Td 2e9_IENDB`PKL\Ce4instagram-feed/admin/builder/assets/img/timeline.pngnu[PNG  IHDRNeZPLTEkoy(tRNS_2EIDATxK 0Cz\D7A*N釷bdO?1'Fȟ#bO?1'Fȟ#pXǪFzDV6Xuµnia ~z`4@(y<;Mc?\!*5 0˸&P%_-X/m114qbC78nӥv_OE@yE`ߠ,#`E"p|'0"x/Q-"܋@FP#H/x y-s;c7Htj0s͵u$Z#܈Js"TT^D!M*TGdQYkIZ'20Dz뢓`I84~pUDQeUSQT26ў"$QzwJ"`R=E3X5C(ꋔm HE뺡ˢFdb!2dE7QW2 &WOejw4 R̽\7 *:%R3rk_-  z% d~rC? 'z+QR =͓:xdhn3Y_}TGT #D*z@Ec :>}\{mBcTy-a*0oh*l9FÞ"#OTķyŖ}CqT="#!:retl}PGpQ9񑡕Mc4"jTUM$#^)32#Ggx&+Hr>ѷef/W  EFW_%TMM ؽ}t#졒?[GT-2U ̰:Lu|DFZ@ Rd)>>n$#ZggQu,hsbN{H\j#fXCDZ[nnj1g#L8\\ܝl]+$'|{!>}Ho4kEjd@_#!& V: ȷ|S{֐y]^ĉBl@񧝳[0B\UNuPwUԨ\01B\.w)sDB̡(,Q1=t5eǘꚛN՝sLb%&23*.:68cz>&Hn豻+1.k+i;)uuG>!lbZBȪӋU# R.-;Պ%۩"8Q\JCr~ ڠ_YG渌8칢@/bJMO^)u}~VyZAMc#e8E-= -_A~?ݏ~5 KxȥEUpsJ śÌ=/\Ft"y'#5Ywy@iJ64HH8⺫4{te9pnã2:PZP9zY]5mmaJ4[vKYpN =zUKc fPz})4pIX|swskr ܣG9隇;xm훁y(0%ۋ95 qۏt̞&9dt B}=3Vq=THi@5|W?f97<'?^ϪvH#[ '*7 u:t8|Stk9VO&H$ !!I3A xmkV:7 Z%*JAqߠ F:XXW!Gc2gy׎T?%eS;iw@x?^oqZժ'aQkO2cgZ"A2{ԆӶ\Y%mLGr-MeӖOUǕrv Jڝ ?.KpO²oЎ)U%{jz"]n&LXgҼOg)k˞/,Yx-#(`1pg<֞T, vy^Ǐloa/pE3GS9ZR°\&R>L}aS)/b $.$N~R@..2EgR.xJ8PrOSN\d4Uz"Wdշ|#VA&Iv)u,WyE4[}o2%lF?s%> ~4rNIԘ`HcTk|?o(ز^G8x>3'ڝ 8j-+I;ڊdOCN t%SRv! ͓#|55XdQp2==$KB,~ECW5&iPF[NzV55NݎఈGg(1>|==yzW$fZX c4? YpzxҸ坤MkքHUAR::30XzsZ ;mێ;0ަ6箝>^HU2:5) |bL1\R *=3P_K+i㈆e%Q('<?z՚E}F;%7*߼>08'Sqi Ǔy{` 2\|L/ZY0Ai;nWr # P7G~[lqCṃOQQ VyVr9Ìo.]*8$Ye@ ~GeNGo#IbZvI6˻;f- \6\YĹ\yOR`3Mzv-k(]LfR8Rq'>)o[[9y~b}4Sy$V ͑._b+nG4'mkS{gbߺdzc %)4{8xSLwfN[eᥕcRA? Vg@ k7IX4Ytn&K*yBGr>¶ 3$? L.JT *F[mEʨ͉ k6?wR?2̱zƟ²Kowj,PFp=Ku פ|6.h<>MyT$Jdd>K]R:GQ uA$Y[ҘߦЫ0B9{lwecCc-IK9rB~`O#ÞСuKշSIb{v:dd5~0mb{g.s銱fƅAt%3Ab!HO1ut!s) {A9]E徘hPnM]./ ϴ&282jrMxXϣ%g+]DP>I/OCKfaI-WsE?˷ s=}B biJ0U Hsq $! 8c|I_$4Qg8nHC1w=xn=Q"[@<}= J4rqګƥ\ Ո6`S6>\d|4ep:s3ci RT1qZ!aeTYH@sA;rX4kq?ԃ{:T7 +^4i (;qZu; ,gRxcV2KP"Og'[,a~5+WνIJE $ q\MilBC3ֵ4CqetC)>^w8aX8'wF~qqZ#/CQa~TYmNx SN 7L4X-mQbryHD͒[qo\m{| )8=00LW(Mu{3.fBv?^ZΪ^R(:i춒@a68v~,[j70]lj-j#qQߩ2eGiYG!Ikso;yPW98W5Kkw& hkg)Զ?ʁ>icosq4ll8cc^Z[xsCmʣϡ5-ug+tO̤FP)5듐Ò3[8rnB ;doB= ajlq\;y o ^uCgĜߗp~ ?vLd! cbJR zfSo>oH($3V4{HlDmj7;$;>ʥͣyg?W 0XYa2xy;kǙ]5Ē٘PJ>9ǩ=;~TT1"|2306NT-Ec5Lެ[$mNӞV(L+ddk'!r+RՋ=VԬwVyc]ʼn9UF9##.%yǕCNiF,Sgra*v0I:zw+]2(3;!@leIG?^[ዻ.I|kIOb;&m37xw-A1jZG<:K4 .&Տʀ\Ʃ?qqAh-bfRǔFrFOag'Tؾ+1ڼw xȗ/4i,i +7v8 ?eeKh񘑣휎) ;XWj$9A}Y

$tǧSm,זwF ۆT[szozx~iԵXm)>~т~y-^Yf՚#q$һ:"Xav2 ?Ӿk ԤzF't.Kً1pNUp~K> 4oh ]؁Lr7r:װ&x]g5Ωb\}!wOcn5k}Ɲkw,vVX>ʿ.p 8gK N/tt-%Je$P~S5,魭e%#ӌO]P]+ډ̎]C?}8˨` ˳'F{'96?Cz$ dJ Lv5xڞw%mgF,t|  :^k=[đ[qZ.8' } RӭtZyRYw}!,F=yFR[IuGw7 ~ir}vNu?+H/d|zcxv;vKXbȶ .F'WL `w@>f3ϮxMرwIrs=oܤ\U;JnRy\ewu= c s(D;Y2vd`V b7n9Ri;To|9ٻq-1Hd]Lvz9isjq2=y|˩tڽƲ8bx|X><4aøyXdF =3ޥ+s}ঋgx Xm7 ]׮O+bD@8cVVap%Lבo@zU^Č[KN2}'5|UoiS^!ᛟҼ3D>2K9 NN;g?C,߰ ?ʡp+VZ胤㌐>׃\$wOsmi?94FprVgfo̠C*(] fN%HL>gɂg޸ X]n_`tz]] dKV7WAa~_˧K]n:ƞ a`N;>țBգ!e _=TӚ*H%&^H8$ԱDBNJ(G&?+lysN?'QC#tXܧrɞUP.Tp:QHu/m"s0w/hnZ8 WD*IJ1)*&Pb )=Z7ZhV1'#(ks&5>dP=M-_Ti I=y=:(+2'n-$."&VU'8O9$氼7脪3MnG>~]h*xtI$RΣg-Vc Gsܾ]Ym*;=xtg81}xɿWOZ& LQ:Jy8(舻oS:rr2'QEv,%|(՟PKL\ՕTT5instagram-feed/admin/builder/assets/img/welcome-1.pngnu[PNG  IHDR~xPLTECI`rv߸fk~ٕ𭯹OTj~~Z`tZ_sGBStRNS_@?oO0~\=IDATh[v@Fh@">r 6Dv} y/T=ⓠQZy_﴾|i\ueY!Iq8;=sjp*)K b y n,I3~!^ڍ8 a\WaɘFD68)Y!vcOoGtDOH5K=}{g2"ɀjx@xPysoЏwO ߂~mlxgv*#\WLȹD9_GJ[Y*x z뽽mh|7 f&;qP!qC woi#cgc1Ww)THWo}Tãa_0Ǔ_a|̉aY4<{ }4#tGONCy~R;b&+Lskyqc#(f[ix.SB٨7 0bqH?,yݩ#وE/%};@Wq]Yɠ狺#\7MhR[6I_+uߤ^dmz61/+0/U_H_X:@t7/Nu!%Hh0 a w3HBug1V =DMw2.{VlG5 VTmpqݱ"DzVxϽ'Yw6jWޘ ]c]~x||Zl;@!uwɎjj.*xHjlLb8F1/`t Ywmx߲v%JZ`vwaxV C!0L#nݘ#D%5C;![RwwT}R)tG<Jݱ;TTMA񝘾#X AzvCA!$(;91߲>;g$M;4 #A#f&; O0i_HGb!t>B Amm53^wG!N#Dށ`)H2jyQcᕧ`6ǦQ-KߵeXqTmc UL=Q :#xxZi*b2Pm+*HQ+O/G ~=J9v <6e43$T8|]2;Y԰"f0<} H>;y GÈ ~wT5&S;3啝&T?wTZһhhxVVkl_dq#hM(VGSyjŋTHSL]'9CT^G:;yl\T['p_^IENDB`PKL\G.  ;instagram-feed/admin/builder/assets/img/dummy-lightbox.jpegnu[JFIFC    "##! %*5-%'2( .?/279<<<$-BFA:F5;<9C  9& &99999999999999999999999999999999999999999999999999p8" B /;Iv,7a)]}WWh:MɞG:aJf9ZR%.ŪUᤩ~56)9Z͠KdכKU6~d,FKu+w'"ӑ.Nr\+yMFp[kӍ"O8vQ:󾡆`2d]Ye}aʧ3MV((P{Bļѵ[du8~?pd 96D5űEP043'|O#@k;Hyhaԋ d/9u(zgԧR脄g*MŔQo xJt8lsPZ1֤ѣR|àVΈKJ H+Ż4I+}^Oz9S$QZ:Rݹ'|^3hreP9^y\ ʴzR`2Ѭ^44)/SFڶ vb׉z]J2 7΃WCf3uQa LeR+Ti@9O!%8JtOHJ/YU,&^}v/s]yÊZq]~^w("dעVzf#ϫ/>HztV"!e8TYfG(Bn@S"<J@(`3+˨`:\ovT4OsD7-VKrˍ*͡.߳#&^?>kgJmHMw 2Ip; ZUs'ӕ^{M I7TdY,Qv rR6BJa;+Slw#lוAVfV{59U̥^S|VI6 'W8؜}񦳅)|um,qŒͿ-u_K( ԤkژrMg-='z=?]yA-{?eoW /#:)0צ(Vwh 1Oԗ?nv:):Y*g2aY1*Ll{PுQfd^n(PSrOu'=:#b-Q:.HՉ9ޟn{b9>awF99nlg}Gvr'lnӯ8D? (wkȱ𾕒nnE J l`M]HȢd6XHt^:I[]. ortr=*N)jzktTA=O蓦YK=ZίVHwܗW*6^4P J)ꂬ#޴M(kqRѬ˰%T3LVAVD>J;ixp|պD[gwBޝUdm8GresJti:HJ*zh-IvURC Te +Ṗ\"> JJ0:t+#USڗGUf8Xg16ϦUR.oR?5Oˍf+៬ɥ :GRt ,Щ˾!{4A9;G<_+VZGQK@T9ytSEeɊaA[RyAc~txJlzl,UKJn,]%,M:( VZhӆ]J-'Իq쫜bgE=עSyi$cil9(V,9Y)F:vx΅ W׍u{V7:s\>'Gw@,#ܾJyToŞdfh'z3ua5B|PI*;I{u<de[ӊ^s 3kBY  JdX0K3A]AâQ-EMg=xԙA[i&R̂^g;=F,KAs6߆5{8Lʵ:\W$c}65hud XAz <7K=ub|"c`*54^/+5A+θ3HNtdԞk_g=FlAɋIt5y ^d]9u^O]3PIO;?N.½f'yRgZ)c-m+?&ES#g5<Ԗ3+.KfxTrC+{ߨWlgYTJ2‰m.oҬ^m Tj+<6YZ|כF{*܎zf'Dwsߔ3NaV})1b}T;Iv+3,gg첞y=p |:)s&* '_=/=~B"2?9J֧PCNy#̐qHsj( A |)h^Zo>O@/ld5Tyz+g~6PI^sDLߛ[ufE!<aK#<<@] ifam)Q'/zot1.z{Zs2^q0wh)M 4:WDlhT3gp_.蹖Zi&nȒs,ʫgBuQ9oJLisT'ܹU>IFQmabV ơ=)D#[H*}%/7R[9KMt2[R+zlZͨWAŎI>>b;B{Q2,VjmoF*ϱA[\l2uEVVkA]9oy,8c(R_vS,EVUh<fLO4ajyf~QȉVqm3f&)p!eg;(=1S">GIy7Df# GaMAu(?vm*&Q}mk<QN3t+nY(LdhȷOW҂uQ%q4ľ8&=-i:ŮMmOdm'}OuK]O#EAg 2.Jң5{jRjYQf@k^j6#k`F+ڟL}A> *FrDjnCẋybx rZV`6eJu0, K|f:{V~f8˹r`5^iZ>3S6͛]Z%5y27':%-64)?:M7i}CN:Isy2:>nhVW`Pօq7KHS{hS[k>7B-u[?z,o7r|Ok휬Al,"(]-}o6FlrEyO5oKY6-Iew, 3a+N|3;y}=DؑكVwoNkI/:Q|`-%^qN7X:sΊ{:Y6,ri;Qa3p.藛3UE$LHβ vg!zYUac`'-+5OfyQ0ۃ+vKɵ!1sn.r;0k~k$P^Ȉ< ^N {_/* {KE2wו 8iFgOFdn2&aZ\p7P [|Ͼ;08EfMM}X Pb tŔ]T6z";]G[260.aY1d3YNЦqtwDjBT(e78Ncnw&.q ܉^6^rd͎q}zV ?3aE~gԧ}+ )Plu:ϸ=Z84 de>X0h.Tch"ͥvlTXXlހ}Tva?,.xw۟o YLn3jY0UT8K"!Jej.M]7AKO羽B"ؗOⰎ ߰1N>+WjYiU|5f޷hY/A#]"//~vCB2e$ڈleT>6p(/8ǚܺeϽ7QÑg Pr64.-fY+'_sjFDM%F`*F#TwNi a+ˬߗb(92"tPx(++oCw?P5˪|Ƀ:$J+klI4&R+%_:Jl@0L-x啫*jV#n{O-^f[G"5bшd*Dcʵ2)#k)Xؚ̖ g؄AzG#2Z{R<4zs7(cRgSITHq~>RﴛmZĹ^u/8%j_jVSei_H~W])N-E/kq}!R"̥&RoBҵMm'm٤9"T"deXN&) Jz"Cڬ`Jotg84B+\ZluYZ63- hK#f' քkҺ4Ηi`2N;]1F׷?Yg^ |cK3.|٧2fOR9s\qz ˫U4ȓnZd4d Q9fP]^sO$ 3z^5[T_6`;තJ;3gQJF}U:(FT BBVpyլyi=Iy2[(z/dM௿yzLX CޟI&Y'?}peYv[Zz財U̸'0, ;]1UlR- |g(Nh1Bt*2uVVMiS;nW}>Ԅs;їW:8bVZ9n3U|d> Ck3)FRryF\K~7VW$j"~tOfΉMlYd?3ryצVuz>RKi4&ROhu`ف|y]Mcg`Xk'MwgXe=} Y'q ll&EB&yܜۛr5tMwgXV<Y,ʛIIb{mއEQb9Q?Pݜ2sZ-]a&EԜG2>N-Jl57bGX ]SG!e iС3'.L is\W;<:(io9qjo!T~hes:Ɍ ; ef}_. LY\~vWup2CcmTDEu,& <̠SlCc>׵IB{?]ZdsHW%Z*m$d߿eմm4؃d _%Q]l=\B*pܑ#ZܯV?Y-<7war5~ZLI6665;lLlK,kiQjt :}SYn [. Fo}w U;>֓&gakZ*=i"ޛUǚb{/#:PMѯY6V]ũqJ@) kx*ifje%Cf;Αy6䍂3Γ<̺RӧSuqz]eB VYbx|!5K+VܯK}?,rwR*UP%t Z<4]:V@Beхb̀eҠy;<^>vF@[[G!ga sujϹ=GVfGR[-b`|A,6gisʾ2j Nkf .< (yQd U 3=x 67RPy\K4:o2ḾkHqfm"p閈ɮf+,STOI'zd/i)#93t}&`j\>qyWS;|ʇ~|T&f2ٳ*TIGYKIf= ZR茊Y>|ν_}R[WrG{Ŵdx}Mu һ4:O`e&V/*> ̪.Te5>%cb[KT֠n^_MGԥ&EFVZ-g謚y>^S·ی3*Տ얼Kc؏uP|û)(uA>uh5Vq_-fW+g<kR2qe .ʾQ`W=EÁg+"ur:dS範/+^N3yAy5¨yN"ǺgnHw<̌^6lkMy#biPGVVzGYim}ɫ ]ebOQDQnO=dm=j@8}lIT2?Kf_d˞ں>,}>PJ6#'<<\f@?jk˾l?7O ɂ*q`It6'r<}(H4^O=>Jϼ^q(,Ȧcᮃi>qV5BCH>(gVc}eRDZi+ĪY{%ar95{UyEA_ⷞFO9LkNz]ժXm5'lW9|L(/>ӟ =MW X&KDyja‚h3VOKFm2O ȘRfYR8$#fN=*G (,f|?b: 2e]K#2/i}Ne$hI.1OI+ӥyo}Vu#-pQY{6X)My֧JbfĶKq?^1h?:馰=;ҕ::~uiXѼ ]K;9H%eyEp{uN]#rxg+( oF5!ehtRRepHvR$U5H&w8)od?eOl]7>cm=Z?$}}љFJT@Βν eZ"nW`tʦUHO 2{U:*#jYuZF[g\*/Leʞ L؆~_`^z֬ʨYu?AoW_)? Xuߝv3dm65wc>Ώ=Ygw:ڸ'4'ȱG"ZXA0(I]/nm;QiYL}Yϳ; AT+(~E׉e'!յ'aQ+;΍Hy]A>s-Y# ztMQ=T3ͲP/=A|I{#ߝ=Ayyco\iT%ds]畕+g:9j}5O$ 4uhXA3lgIz9lX j7 Ɂ&j-W{]n#J&-=+*Eʢmn(+&O8f6's#WTȽlaKysvP['[ҔJ jQz#&gE!RK`0euKJ4#HA7 ]$& `pd‚*^E0]'K t:G%M鐒:I,/7AB=+emA}kkщ5|䉜 3D4ϕh]cR`}FK#5+PLIj3f'QhSҪ-QJbh;6-F.8Q$ͅFO~גf r0ݙf=$`]t?6VMS t(OO}׋HþTCml{Y)" @p{>+>w1,fC1~n:C&9zDg-ewAt<|Oϩ*/ tou43O$ R yVc!լK7/D"òߝ& *6)t n~m>?-ƫRs6~Zh&VbPt&VN̘vԚ V  - fom]jn('6YL4VO-**%yH 3]P񽆽-:`t\-7ek>ͺדfSl\*k?w< ^7CIwqurqNGfYQز=]|PTUMo:jV^o@3ajdl΂)xut]fg qB'ǽ?Ҕ X. kl-ʤ2}?k+sLeaCrM +kP.fAϽ/ߍb`/ERzG4pYh,&Dbs\r{\ӡ?_u{2k+]n~iuK})W nP'(E¼QJ>ҥmyc{z I}]&ptm_?FclR#Mݟ @}ߺ;hz֜~T' rAQ@VK "ɒ{P.li O#lϕբ76X&ʅY-(sqo@ <^8]N^FYG$xD}1HiHEB[ ؉L'3}s$?['ym3+1C;AZ>>{Щ>F/-l< b08,,ymZd">:N7^Yj3S kiQU%n$+W¿?Dˈ{&ËLh80ڂ|ˏg̠?/ՋjP!M44 [,AacUCT~sJ??Ԓz%e[+ [B)K)HUynkfu'JK'?⪎[Je^?Qv_7j8H*;$rw4|%zOJnʼ#ʳY~dZoQz, >xfKZ?G!c{5'X]}ZϗeFLf 3*jTTembP!5Xi,MIgC]NcSMAf]T%(H5f@D6dz/2(-VX' B=>yO$y@v +w![;eNk"e1&EI.Ͻkˬ<霝zqqOޤv{ZLHli࣬wL)ʠVAij e\5~y).;73x5妼S:߅ -icsϧ뤁gũu5z4UW)Ah[0s&.~EnNM[fJ {zh6F; e=l[RFNr:5Fs?W~tRjbX!y_&]lȡVh<jJ銶tB{[i36zGﯟu("H~&KLe;Et"lcVȋ0|δ ]g"2tkmtFcxhUI?}ԆFcBAGƐy쮗.Kz! :` Egu2/;4i ;гLD _D=Oͺ.5%~YbesA:Mon,ܨ7\;)^X>bߛz ˞fS(GIzhЧyJ({M2x,)L( I3MCkXPL2ga5~:MC-tr$&H~k^u |nǟ鵯Yo8GT Bnt~\GV+ */kc${>{{gWz ߕD6|02EKa%t#hⷖ9^F%\35lͽ`ޖ oz<۫}/KSYdKSH6`8 +"`t }7z{ DqqS]X{h~.7R߸X gK:Fuq(0D0Ϟ6lx7Z܋uTg|/OAF%v5a6פ u|׆T4>({Bȧ^_g7}__PVo3(Pd*so g@}h L|2ia?m>+{e^_G2AOc>+àF=@T~7Sk\ w8d΂E5ixUG=QE葕GQMbEfk.Sߝ5<a )W\3C u3˰xhT/= MoCSYksg;k?L<$ײ/O3Kw䔗"_?~70#(cYYӛ~ +ofnkim鱱+,:7?/S=7tnvg+t3E4K8vOM2x0.s:|M &Z"<͙ (:Ȳ:̺t1 M owjΒC0 ޤ Dc&LųI _b7̃Lb`9y/-zHve^C>װ}{Dti$Mue廼\9n-t}*qkT48N矺#K߳*Avok:rL}7Ueʶ\<ާϓT~}E~(3jx(~y/1yki[\aF-Rk;2c>ͱ2"ߔQ`)V OzbeWmz<"տO\|'wWgMZ{zK2YߘO2asf@y26ZߌNj\}i^~7[b8载fhς8!Ս3U*pX:l38.}=:ut5˟^/LJ߀ײ1j\8W2-x~{ EI\ڼ.06Y 5.̎"^;$]G| Ľ]D=XL)`c]PMyyٵs,!"#12A$34B%CǭdgT^cȾwzc~$ҷiDp@FTCOFy;n:1Eq*,Vm=6b2qHż"nظ:ye>EZ0I\+zs~?0ޝ!&|DS$ROڧiO2Wsp_t7\vh{FtٖUZfm ]UALHc{NDiY3ZpFR/12'T.pq6 ^`WS_U7l3к#Cu)ٙ z J;*6 +@96DTAjd\#cwɍh" N`M Zh?D$E@*942c6RVi3iFStx-Rݞl< Dh6$_t P}b͈4'M!2f Z0F#?< WCXhd8Pciħ|#85U|tm5> 1%~Z:iGHh2v=H*z]4; QGxmWHD*Ђ:cZB'(Ҽ!1iu2@"}uQ^^1cI*yJHȑsO9ʡ/eWTJì#OҤHI!AnPlRiNeϬmѦT1ꗒW0B$E F[Qg)1ɣ@uR(&>U+dMM)~=o3c>lBSqy~ٓA34%O;;\slOz(5h}qSg*ʞI!NaR)۲cDi E_eytsHl}p6%+*cL "1Ƕv@XA k*3= ?!>TA 4j'_ebSĴ`cFd1k)3c>WE#Pі<'(&c+DpC$fp9?O +vK8 y#ĉ E%s9"`~C&9NN-0d` ?px$&ZX3,MwǩnȌΈ y댫41ף4~'@lHCUlh#Z;Б,RKưQR9uՑ>8,εc=Ij4Dܢ Jxi4>yp<%m|I +l\{{ }цKmS1 ]9Og"Yc ĉ/WO$iјo-[̆t$fc3 %!äk (w1V\c>4_)p*S1r%Mߣƺ^Rdi ئʩ V{`Ef8tbȈ[2>xR4\mv)/1Y"'jdd`JؙP6,b.sJl劀4I|kҔR!螓^WY#$igB jJcz7XiOz  PJc }jr% Sڟh)s}3З,4NQ= kT!K4]J`rDW:y`d@ڕD+y2Oy*w4aoړRr >&-_Ϝ2lxyJ&㷙1Noy#}hU+Whx81ӪDrdB,@f fJSꙉn|!2_&Y4<ȠX6 囿'IF}0ҝ4f+@ ͮ;m1,z/EnJjN@>" $K1IʷfϚVaA sʝcN_ܟfC(Վ0St= SN2z<4yhBnL'1T#,W0/!dLQ_S:ېV2ɜ58fs{>?Ѐơi54V"+y2GZFy)MJSe(u*k`lءPv_!-lxN!G;d lQ%ר] I퐎1" 0(:on~8_]B vDHpzvd̆GQso"ɤ޴*zւ*6Ob[.wЃ\#D˭hiyAB &oS`S 9 ٚ{+.BF9rm0ô<B)/)/%\5\=V\u>"`O.Pcє ha&,ؚEZG.wzPڅl,,Wy7ǚ?d* ˃FӶw4=DɅHKP{'!_$C}P͏*S N qTS?/u 842P"EI7q 3cƩSЬ5iurcFSG}zov= C$m'()AQF_ێ]ˍqTT鎑ϻx')w"4t13~$1#˅JiGKI2zL #A:5Z0 @zT|';mndٿ"0 MfCN*\Z/ccmW[PT:"T$Bd0$/O0fS/@3ؕ7,CMQfTmY jg2)I,S>¹gXv%%B֩^/3RiK;3R>ѱ։u!: &\є+{])וcBqbmu'ΣD)Y$0qcm˿wC9 %!ᕲpX["{{MVLLΙ QxDkEBqԨ4 HR2>dэPm%fYվ΃L`K4MXi㰌!JvD1Wk gsZUG(244f`; 㕘 Y Rќ5uT/ Ʈ>O C㞗)M)ķNEXo- "39_"LI62@GSj]Z0LwM2W.m,{چDySP6jᨒADK~Dr 4*!fP+Pa& k>FM?b>GGe-Hsne+)^*UW 5ϑ2iyqnh+eifLuǙ$cyAup'jlNhE5WdAP sT,G!&ǫ!5=$ OBfl& dw)Yi٬漷̙ Hf!埿12:TˊL'In#U H' >*($LɦQϏxARKЈJܤ: nJN0r%'M!hU!䃵 蠱Y /g1؛=MŶ{x/b=N&,,n=} N9d3pQI2:Zd GOM`qO(6 $Rд<Ru>vqɶQUhVؐR ^>7nFǘBwaC2I:m?cA'eNq)wa쓡 J ;60LQ&,du/O*$TVL9uBQ.5%F9*t 0 *aIA= :~=d\ *JE/C&WDŠ1lTÄ|9OƬ覈B9&>'^u]A:F|px~ }Zh# C hB$dnŽ"_(YU9up-VJzR)͵`o#v*5bIbGS\M=H,2YR'IB{'G{z_~v}A{㰘_.{Bz#M%CUuSfHhpmNf@34fg phwgdMËQ%'(=")m4*#zTM+8`fBYQd^'jvP(`6 5TSbv'!C-q%> Z}06kBsR7 )D)ϢPII] :II%1c0xq)"KxH؊xtYEW+K!%= K2}ǎ@{3hLUfɃȒa>TܤXH+A0GI,H{l1y댛DAFYI(UQr˙ [tJԠfK̇uIf*h@x1d,Fg쪧 EQY$,S32)eB>Jz̕#Pb&伣1)A:O3p~,s+ʪ L!SIDTEѼO8 b-Z&/)$9|kĽ+FjqSEw5DgZU&{PSGȡ1^v*$%,=D~40ѸWWu!iƸ &q.g>޶F/^o!@}G+FNѦ44 &RJܑJ9UfDƛ ^2 @\άٔRaeŅ&Ut c#6~+dheY鴢^{$1c$~K(܍X_c9%n$/18y@M4}4IhĆvh|SzU~A('*0MVcyeRZіD&+@keR`7_T@mG  %aYFcGP;E]}qX׍֐Y3=*5ܨC9ڢ[ÀO>@S@~ jl4iA@(gӀ{E۔c\UeLJ쳠%Ehnq ?;*F1ӆ0XzaP)lx!1QqaXIF8/ihI47-64߷B cX|8קbՈ3pi5H%'8Ng]Xʟ1Ucͅf.tkWnq Zf6ًNPQ*qaKI>ٍi/B!Hu5cۖN Ar4*PYq\vqA94aD앧;~%̧s=pBx\B%.QF[4dz4J6g"iዧBCgmlKW ZBR/ R'Ch%66*R*e Ź YQ]aPXpq: njԲOW?u%JqȖ &XSSC[)z"lXaܕ=#J}m)-;PލJ*ՂSCp??̐Qy9R P@!CːJP^'Vm4ECdt @xG"襆lAvRhe_^֚5ϔS1n܄覝_ lrJ9Hn۸`Rr&^VzLS䗋cg:6⪒N) q)x(t8p<\An$SNjjD|Y(rShtp0j*QG3HB=)Ɇ1*Ӵ'xۙ%ZjXQP )yAwt̒=)0DYAm&F'{I`m Z4~ }Nm$Z0͏OLr.t((d*!SzooALJ-{5Wa#F,I؈g6i1Bj¦=c;bvMҢ&z}\$tn6RQT{u#FDZ׮ВG>?UG%ǘyZ)2=u|)"Zj;M>^ZJsQ9sjicmI%F5rq* %Oa9(WOx6C$_dF reh6IN"1T"JOLjv(J9!t9 U x؟nVnm@$*#2ۙ~CP Q0sIؙ|=r$ <{-"I5e>PN$T 㯐2 E2jߠ9>YB`d5Q{)&Ƨt-OWsY瓍s~H[F<5rXC(FTՌIZi>cQ@KMG$#&@^2tDɹRں"FX 㾒l(82@bFۤMGKsn>h ya`Kl-Jf u$/ )=,@&_'Y* ;(H*jÈ|*tQu]pq ,I"4(>d&drETyu(8 OPC@2'8_A/d@8y91FE63"sd 9SGMY$Mĸ(~ETHU ZSY()+e\w _')Q7?qșn$ A(GegM%NO1CFۿ>B-뷑vs=Crz>/{l7A{V_&}q*D*L<r&;5f;tF!0y<S"1vل Mo%65KP@)]Ek2Q)}}\S_ҞQ$>=OETMU3c qtNn':Y^H㌉FMᰉS ?Lz+$XMmfďQ \!ڄlvQzﲳ '`8v}̒w˦!GEYRoB`?N߃ұIPLvŞ 05tB&)2'56(jRa?dz`ׂRXW%ߓr;kHWohy$`IƓgsa@q2:0p+Igpm+mLvt4iZI QTEV\]-l*cTy?mU)\K.GȺ '2b[Sqέyc8a:%ψ#\ELl͗M+7UCSqt\r29 笵}tjuȏ]mF+ܙfAn 5boNQPr OD'_hG:}8WuϱOW$*lz6g-^8 %dlYuQ"vٱ638UKQd3PpF̔uU ST:HVce!4RjQ||`>|;ORblA*,Km_[ad)FB3>>%3+Fk ȲI NFq4ˊ>4ǫ#(^6JydQ TGx3-UdHc"#P~-:W|r #k$醑c5׈6M=r}`K5Tꁧۂ4Ko~) w^fqE.g$PrK"N$54Rp#TaކhR+">x''  DN͐r+)*ɁCoXyț&lub s0 u,+ c;o1䝱v1!11fy>"Yn%'0W)uuKsȽTj ,Pg!RL2=r9ڌPԬp+GJ⽀-C*\lqRp JbtZ)viI zoԄ'FЩ/&4]G+ǧbf<9<1R6UX*5k#ЮɢydTHOTG>UJy\|VF3@ 'D2?-Ծw)Ku>=U#|dD 3+N6d:܂xI2'k׶4bKBmEIC,|źŷgZFsUn%s2p2rP#Z8|iSdjU-e)JcHp LN0($^Rhc(QWSnu%DOj#*qr)O+e=7hX> BxFK'v`}1* zMHfn?ZU ȩo_Qؘ^ąњ(v@kMQ2sX㢥Q!;& $SQ q@J͏#z6TOFXPd`h߇d" |f%bC)$ g"F4d"\LyPbǡLG{e:1݅44 ?!3(pZ+DbP|(hl6f i|=W;KhAӅ pRnL)آnRhac(PROFcHD}xh c|%P{+judH.3@:#% *~W2גd!jSm!UG"Oy*v~q<Sl2׹Pi(M0ڱ ~<|a$~\NQ\>BR 9'S%` 9d$5~CHDK$)W i*r2W4`#Tdz>68NXO 2eG ΥHvb4m#Fhc( VjD5VRIړ SLt}aRE*VCn`w;Zڜ<@Z hjЮ@n9ZT@#g-נD|c7I"}JLx0Y$>6a2 NlJ I>N/2&%I\\_xv=E=O,O& pgK)4Rc-<g.{?-쁢G`(;q#*tJЎ"rLrt@bJ ؚs#(/W_R+K*e*,ԉT fQ(ȧ/WZOزك~G05\;Tkp89ӷ1Àť!V脙;g ]L#3+17bxl!4yԛTtO)u<`3b3^^vSJǡ875†:5 2G.ˮlJ̹L[kG[Ý\'\'\%6>7< p/^$({^2<>EU'ҸRGa-Rv{K3=HвSyTjt՟j.jh-;@QϗBj2\Uh!"V*ME,8(Y J8,Tه9=U/LL!Ӑ;rEsLȗUFoft}:Q ,24I'Tu73ZsYbҕɘQ9 KPõ)|W)P>$݊&LkOĪQv +ҌBgKX 2[Bö]G'O'h-l]; yrLvqTYHJk>58 Ę$Aj@1%|`&Ru^eZgI+4E%;$ íX 'i̜?)11 +ȽhĖo>@P4SVz xxpthX)ɧ\+6CqN${(4=BCEddd҅-1TRv\SsőtyQva=et=Ӟn&0b^kJz7 D:(!24I#43?|lz!U(h;rSzvH/4fFQc=ĂyrL?^1Ȉ cȷSxK1@@eb#s,"i)̏ #ĖH$f/x~:$r J`e"DdN$=xI*@TgHe%݂ʼn' UAmށOXz'JZW kb>P75Q{#{c [BTK8`fiRz nWVb[6zc҅KeZD pJo_ iġOYɇ)+Ӛ࢐Ok.DΫ*`,O[MKfO1#&Һc.O9s%t+ J`%fnYvJOK~[,WCL<'g8u0{ШHA+3f)i SMG[̒ÌN& z pS-3 ~IA|҆`#qc#k{Qau t*z~ +pUX1 "vK.S ݚ?,q]7s,0 Z<S&YK!GSKuA!OA"O$+\kčcÒ$CLOMjbjD(Dh-Fqe4<ٞ)Y}Fň+Rp,VU>5&ژ>L?',t~*=g$BL=ʖp` x;:kd(w?>Yt>6v'`8'5:G(uE'~))Edpl;x+F GOg-LjP^$ uuJkFzV0 +T'sNA pi}ePL)*q1O?"ʙUQUfHar9@hӲQ1di(yjlL/K:O&?NeL?͐JOM7Z~=8M`?V9 _1M䪞kr0ƁˤmC=Tl\lGRg3oǔZ'#G^hh(6I9Bc^ϮkHm{'g<T R=Ib amS O oXLt \#LSp,iYD:!kmVPf] b7$IDtBNT@(J bI(++rLC4`IdG,jl#{Hbc`/^w Ǥ ]J6荎Vָ:Ӗ^Q~b|aWRHXY,AF$n+0TnB8n(ӑI!a9`|yӨIyM$˷du+)6t-\mI hǕbI!,vYEBtDNˠٙ%7 9b wϡz/r)rωʓ~ƴGFri:&U%A^ 裇'Ik^^I~'̉ǔ 4e_>_O= hv#EH<88M7d'p$J?Ζ vPK_:}%k2M-dXLSھ)7 3;n!gs7>Z2-cI = *4= ) Eat  6^u3oOE)QfgFxG2'&$'WGȑ#O=A \:, WGnSv;Qo@g6n@ E ڃj kzBBU9$痨;Hߪ{>,Tk AG:p}y39"u) Awns@xY]F#i뎺@]JӖnC5W^ ?w)C 2#TI\dgRFgO\'\A `qN%tC MBPx Q 'ǟT Ra&tO\!'6t .;e'FFI66OS}lDB"O$0PO:uJ͌i&3/"$S\sObQZ;jTS\r"R; I 2G).[c㱑<̛ޢS"B]_fg|\2`S*rOtb(gS'؞O :EqؒFʍF/@Q"!̺8> v@,$7Z|JDK0hޟ#؋hdћ''fDM/&=#+C"ȒʈB]FP|_A$ɠ[qɇ@!zfe"xLbOX}GiH= 1`A|Qyث P[J*zvr]΄'3iBrvj_Bo{`z;$ȍQvUd2:6>|ǯGOu,?|)OҨ(us@!;ZGl=* KlB o|tDULEȄ \ aZeM!(A-;ΐ)D G$؃&g ͸$(Ll}Q bBbM rQ"X=2FDѪ93"nQ%8L1:j;%vB=Ilo|_햄O` l h|#@I+و]Rf0KN WMhkL Rz)]YJ,t 9* GeL`9aߧ| <HJ? F?dfC6(\WpQrE"Th,psz~ )š~F2kc C|2bg ^ώؑc edIN>[٣۰qM;. 0q!ƌCSkRIu[}Du;=j'FIB* Bm'KqCh&@jL5iZNʨU_"W2 >r}JEeQF6b=q\35Ғۗ;?q&))*b@c (HlT2"?"#١'D&DMDdAYkl~|M=ʕ]g*NV{~"uY$*,q IHwͮ7BG-8{3rA5Mϳ& mvvRN$*qSg\ %\:ҊPvd6{):AȀ,vO zD&OhY z?JB K2l:FUvE=37hY΋ͰO;m녉~Kuꀂ7EbYu"H7<!T3NtyS4"leb+;J;9u;U$Py+)wj4! 0L`G-Q5oUfϩrzAk'[wzƊQH5~ l]b*-F~0 (u3,idm(BeT UǾ8Iuzⳕ$)tO_c_BnC!Zr[6G 跠Ap?@Nc}ol)gMO?Bo3jqu?@idfNKvNȝrզ/F2]9 >з: JP*P nTzo2 j(D^1Hv_EMT.[Bi:+D$ hGW֐/sZ P`uE%!}B֌SnNIfRN??)feI{LoP!dr1[D|0٭; /xݸü~d[4<눚EqXp ÍcewaROU5%sF:2<@ Δ٧[㙼퐄٣!b@ɂ!zliN } %^tO$(~t= ҃@.j5A,TwLO}*C?jNͿ!Sԥ46woOE#c[Iif)rgA}'mSV^=frJ ŪN`~Յ62 cQgYSfХ6L:m2 QmLtXIE8 &NF|ʇZ1ɛĩ3Vk0#'QD,)6!񓍐hM ?R_eWd*s>\U)NğL6H>vT!ILMl\'c=C{g*?W}$8\/v/ٙϲ>բk~Z'gPrtR2bthG^L=жv)ؑ@R6Sj.B#I@_p9!詮z-|۵7mtUԳ :FRA:bM|/L ^F}Cظ T"Q+oG0zFEU$̥IB`Kdt4GǖIFdI/9ULpicأU\ҎE#dv#|;$ #v2_(zP'{R#v%q4L9;"HbH(1P[0gwCfv >l\#*@r_3e(tIQ6]>Mqr4cu^w(JHn{t;+-oh#0a@D*I&ODwd>4ianecNy?/TQJh[C&gB.O.p7jΝpXK]ey?`YpYeAڭ1 fQfT={'@9OiV'X|[*_\چOc(F<-=7&^Zќ I>}v5Np_D{ V>% tC>vOrG[>⍒D'i;}IhDW$hOR~>T"`!'lPB!ғ/oSB7h#  `30 '{;I"dBTDV֚ },ebw@&'ӗ{Gٯ`R%⟶4~ΖVǖ,.Uz#ނgt|PiƅK׀RT_EpԝUhZ82"M92qr9'*qN`I9%Bvf#2>}u(Y})`t4sܤ8;(xR:0n!lIFzB4=D 5vSe@s4zm:FnpnBE ˛Pd gGciJ)vufB%^^J\M% OZy%`&wm6\v'5m"KH068OM2 ݘOD@ LBO<#G[,MÝ#L"(\RSɮ (k=*LJ8P*! {3='@LL#`xP+}ɞ`l!р'+NOn:I SdtADҿ;M}+#ٿcͬzʲbL|!(A867f#oq&`}tCP:/쟭u3hGBfdۭM;U-YQNI#_Tլ°Ax?7up 犊yWM#\$o42_6عo[ʮ6l;Riϛ3C1m.9 ||3NҌG7] $w 1ZJ8X!p(KؐvEjlh;pQI _뾂 hz+3bBZ_jvx~;4f7Fv *N4e>!Σ1RX}_!ɮMt;5PI \<RE'ӄk:6;iCk H>+M$\#%dRCsw3?)=FVdcxrgDj,uhoŪ#D!eiiuwTP˾$N y4mXmd)S4eAӳG0+TҌ燅xAƃD{?vf3Svbeq:`rFF\`g% ]p]vOٰgLqI^h u/RwOy+R8>ҖI0m= sAO|rJh # tƹ2,jo&AVuǠTasOc-pV~>^|!'lA#|C$k C @,xN=a-f5d[.N?$܇I51CzH粎j7QCpbgN>}rho|CQ|ehZݸd_;*z -mt # CN0a˩%>w1*QuJH%q4&l64J|L1=V=% T'ɨKrt)"iv D A8-W^E;TPS-CV= X˺͊ S"?*Y'DFdS<%A&A,Q?gQ Ǐ#:ZltA Oo _ f癝d-sN5fHDvHdB $bA4BG6O|#ApPGVRܧ&pKvC܍ܖ~ݗAQObU]Fꂞڝ}r2Bo[FhR]M$a}e#t%+TPj)YjP0ܱd{*-A;AMڠhRp1E$2\s#N:JLGLN`I݁P'&bҌx V, a)ԦKx@} {H;Zez hsæ%i#$iu2'9 yoC L觲/UxN@<8`C"zG9[vn$c?*3+OѲhLo{88ʇD;>AҍDp qxABBJ0$$zk1:h)dRXꈓ̛-uG=JvzGԫl|H~ _\Ohq^LA@)>1M>dMnd^F\Q(eT451<.y5$&9VdzT>睁6kG`(E 6u $4q⠴U8)Hy%CO@L[ǻc~?{vC4 Z?/Fʨ )  "Qy2)_,|o$o#"EgǤ`rk-F\ CC涽=I\S읕kT5潒G&w{Sn†|Sz cS]Ɣp`*5MG?REvO`Bl*)t:CUu*,WE4iS&Mq\(,v?M=Uv oz SCǵLQP)1SGfIΧ!ORW>建!f0(Î7lG8B Ҋk}Mv[| xNc$׮]1-m@ N:D偙;S|'YA\bV$߅ϒpq"5%/`,peFr8[dm <'AN:>i0e% QMpH/ڬRJv(3; ;rl&GAnRW(3eFppKI74͢@4]ƒ;YDhFE1YG}U "&g(-'D$}BF-R),u0dF6S54Bԇ* rrra7 aX5뮹b;PvAߤ\f!<ľ2q(G#u2&I9` zoe5t <{&{Rw >Ï[ٜ*x~ NeK$۹ms+^DU-&A1FML!$SZWbcGnՊ/@"efIP4 Yck-$<`}(C{ :qN:{GD:4^&f/о& oolI<`u8K&UB;d+!xT2iˆNEDJ}`dM^vyd(9 l:O%]$MTl  הSOyٓ.(2%l7bs6z,u*x2+ӊ B8ۢ,.pET}{{֭bY)4N8p pdr;C>U)dLhS2^Ż(<F4㈔^A6=)1{_^Y$=&ղI9HGR ;kE%H RXI< ҆N'ۀاoaN1KaA_`/~վ?8HmC2j 8rOY?`ч1ǐ_IRr ʏJ +Z9HUjP;@G3̙^taaG7Nʍ S|!1aUpx BP1EF}r -*Jq{ָ f˪ Ff2oWiW*t!YczEFuz 8,RT%;F~Bm%E_I?p[5-VdkU/!ۋ6!#"KLJF_]zQSn ~N#0ydFLW6 *) \O m*bFOI>7HЗɝp<ձ$D=AǶ8L%  qt8 ƓD75˰hFєm9-rN?Q:FM H%As#BPR3PBs['{]qd(+'w=0( :3=O Lr(;"5[;qMXJY :SF2u'N851sZyX΢iyZ7#ɥYEGfmNr'Kb(>`WoƝ{悫xiԫ83j9v|0!FCN1`Jʑi=W|#\ߢ8F=p(|/? ޽ʣ&"(WbyU)>qCǁ܃a Mؑ}AfۀQړ3$!h*>Hou(=ct9?4;9UPǖ${?}'Ȓlz3I eV-ٱ1hJc늪F y}>[̙@;=Ƚ_dOę BbjbΧ ld< :1H$k:4xM MbV,3i:R;Q АzQ!I][$c-M 7R$؄.Ku =L3**}'oEW|* 땙I~+<u;lta; 3N< 7^i9pdl)W*L%ik$}xGֹk+RlL-FH͔59a6ɜ:)]OO [W#Z#IiQMG.:. "M<͌@YWiV$ LOAx+<< JDO&Dj˸A!MUH X3uDq(z6TL݊q} J8_JƏ\Juq5 yn$8$N8$|O_ ܣ\' @6@ܩ/҈N!gFݨHipeu:޸?@4}plsִA?¼)G:p\(4d,~Mm]6Ϯjܬ~HQ mJRQr:=vqv)cآT7Mx'* UA8F2cXB/(!v*N(ϓNv5aoI)4?}p(W$Sq$T<=62fUT1A2곜Ͳk F(:(]poC>9f= f=oeD3ȣT@[|T'MO>CۃW]+wOx]\# \#_~7{6k2H>6_{'Iy1.`px؋Bp:5!@DqBKm) \4b8 :+Kp^W': 3?}dI 6RkOE,s!!@d7?狅QPUAu 6KNF R~rR ! h;҄O/y 8VI<:ǵ Oo@랸G7}|ɪ Ǐ e$cce'||Dq*Ȏ8 yk޹8=s[9<O5h}qdb!Y'Ӆt:9pe.8F+2?@LPC K@KҦCk>ky/&L@֫l6yJwt=JL&$p -Qxo 6G BВ $v Ta΄Б;$) A!66˳m2 8.,G]s?UI;cFgb-Ss/qλȺ(qC2 'F-6'F> Ů+c8]-²#z湽{;:$$4OI<2w|9s>+= 𧲛4||2O^p Qiױ$%u ;%Itҟ !|E#2_ƙ>v'CM| =pthDsCZ?葵8&'S0.;.TJ̞;hi%0jIN&·Δ*s6<](,xxh8YO?֓s'9]?R99=ʝk@zl]o^Wޏ ǞT~5%u7;9o7o9φK&>d_ SE;تE8.`+>]s9<ƾH$G|DTR|jA*.RS/K͐IԘRq]|~J apJ5fIѾݎ[ HМ JygzZ#` &çe#} `'1\P)e"L#Ez$68N[|L3o8N :<=pO76O?l<|@Ѧ6Tp/@ɮeעL3^4 6g1CDуPUuy6l,('v(IIJ> VO`_dJ4.G6WM=yo:o`u1D<@G FX k@w=N= JC4>H4R1y ه<4rT$#lre喅o#*a~?dsn -vg;m[\|]k-ziF>=͸SA^|[\dhcHpp{( $l1w z" & NOCǣJgv񱣈IB@F)Мv⍂}G}PP$>zW>TC{lK|)Çco>e&|r'_>Gz7\5zfl0$D9JN{%/C|DM&Zr~"#R ϭ[0$/9!j7`Z?e^%6~q0ڎGxE|Mh.6:4$/1Q6QV`i\_|p<#| q@3!5@ c旅 OfEwDv0X{YQe.JJ[sO!BT/@z;}lO/$8 S ❝ga6Iss<HCšpsmcbseʟHx02UQ;v̛76iG^u@9d,`|dþ&9|Z0"= q_ד <ȇ\3lP43@8Q \ֆò]F [3ẓ)0Ʊhlp C*z!/%]G P@Ey $I1d_:(VH5o5o{#|fe p[SЄ^]m49:sZ4G?ֽc_\?4pe0 ‹|Dߏ p2o9S ({)Dlip̎0~z̟*w7쑮kנ>3ɍ;z˗rUAp.ʎRx@x[C=pƕKʟtxξ:nf~Dض:!Wj8[c˜{%GAܦo rpK:8Qx= 'Mp(UJ/IՑ #cG5hzp :'\ђF?)$`c1r[X!F_y3/SϓHeq1 k^xMp/GG5\/., ǟ ;s711lT\-(-ݨlB@M fmg!t(L_7|w|y6yZ;|RQ8N):'\.@_dN*PIz%b[dii`נ8G?Zdz湯g5]s[Od{'vHbɋH$*hPGO?'DT$#/<-P Z%̴7{[:_^0WAx9| S?#sZ잀a@> ix؅DJrC#4('Av*T qd4x%$KV$fJ6ObMe1E\pp }|x9޹5Fo sZˆ3^4e?AdnE`NYCL|xBx tolk8ʚe)3?Goqpr r HD,I `^exO(9bԂ\߱'߽ '"v$'j}* E] Ji/߅&3_RxSc^š끵yƏ;星7Cg?'z=j:&t;$ib4t\}MgN^5}{#Duˆn 5;<'@6q>m\Iac6c\S8O <*Ouf巜Upơ'.@׉w-W5JXhUA։o$MKB B~91<:@HaǷxY!:p>!1AQ"a2qB#Rb 3rC$Sc?,5'9[Uti~0`:383k*u;+'*8xyk?dב0) j$=d4˩@' U~OM=񲩚#>kMĄEi"v?›IH;)p"!#`ys'2Q 3LSfn%7"cAq,uޓd:n f}=3_@ pJ`&6KjtƝX䋪|'贡Bk$GaQ5@Ѓ*iyz",H?mR#I'}7+i0B*q Hi<$uꤴ(9.!/1z!qnJ(X lfdsOo;BoDllOh c9ё6(GhA{q~6LQZlsEB 1[NvBf%=83;`E"3d[uj;UNQrSNc&,7NP0:Bg #!8y;=&SYٝX7M I"z O'^["}[jL@1 L3l-V$b,OCLm7^i+%״zpK|/.EQ$.Ch lZ -ƛ$oF{y"ǃT *H8*&S+1eLtVAwM.y):FQU&!2@Qt_ЩlKz`37D0h(HR'o$CDiIiSShwdXI_2zZ1 p(zsfk=Gf;6?fHF]0閳oɚ//xS>i#X->^ p=suiVKb!5^v)cꋎKlM_8/;Zk[/#{!|Q4k EawicdtH `2Gl)sZ ZBcH%L$[ #&ݓmp{0&?eDV>HI석n';BYP֑ΜRQc/t'f| p'xFDO\F /ǎ7t^e(WqdZ<'Hl6;xF 8(>LB$ CN6*uC wYF `@:_=G1u 9UT .%M>+"A5lVAa8S1jx)`p .Y$pp|?I( ȅ 1J{=@( Lo۔lB-sLNVG?4ELtOe)kj/0^6DqcB{t}Jci@tЇoN$4\C#RޢZߣȴ'dm0/~Eښl]!:_FFOQuc"5 DLVGOi=nihɍ{'D@͕Ql Z]?&_1 oWV>UB0=PtؼR2P,QVZ- IHp#ȭՆ;-CQPM. qS DŽ"pk@[Oa"S:L"8)$gt6@a4_@\VN /k#3i ]ueo%a`&ISEd5st{&s|@Q[H-3} 2:mTLGCDH sk- \GK|#t8b&2ħ AgYN1)Ii dT=S7;ěai-snd^mPaMDsA%T 7 uRIlk9eI0gPLh`CGd" Yetf 6n9Bls x-H"g%LIjq xCX sCFĉN!"}Uern,q=;݂㋠Y--)ں~麟3d`DFY;Y:5 "L"J8 M}Ò޶ʓ$Os{nT%0U rYily$ iW"T0D i^i-`J3j;?xc6qE{2d^ZLH9tqOx6&'>H rFet\Hr`Y(۪ ! ԋP5prj`/;s{BlFܡex\@~(u W!YeQ}iQ`[s(! ,כS(6@{P[DNiZxNu$tx<2ָȞ A8dfɤWLyL& `hceHZweUpp"6G5 ¤4ħQH#o+v8~8s@<|MX7Ft#NJ'F=hF9ѱApC /;vFiuz8&mcFm T5 RNɥ {Ç,8Zֳt2 ٩?D7potdRcǪp wADŚd.Dj6]M7SXbl'=A XS~TuDS2-BZUM*o俩g@e4'{K.y(HM-)w1ȃ1Ͱ(WT;"2V̠Jh!{@F]6a B tv@W'+gpizp0Pa k>ܧRPd[d-E֯Pu6T]ku6J7ޮG˾Ü3B~]bzI|'5F4ZfQlvDo=\<3 OL ^"SAnf `,:Z>FOus(y*@XMMM1 Pc YY" /DqdV%K@ WvVlHl sOO},o I(-xtnp}}ԁfې9l :miyMF>h0a&MփIJkFL(f+Pkh@BFBa8=)F;? Q'bfrSN Wd{ DtdGK%i&#|@썀ix5Z uNiIr nHt^s#sѣUϓ A'Ici5Xf7 QPR[lܢ^^9Ob)r$EVEm.SVPA<"tl2OAv],*LY7tNYc" -bl}@ؠ:"R KSB_H)| ~4;#K槻0xOfcu>͋G'xNJm 34 G )1>>NJvoXN! B3y&? .t]{ ESK[U]8ˆJ(_u$UP,mpi3nz!ӟd/2BTCdY{8A4.d]Ss@=tvM%~#DȊĝL79UD8ddBJZ~=e֛y1qʹaInS&OӨ'& Jj#jStId}akD y MB-tʞ5 {tp韬"Y/9j߄DlPuUNNgk#p "{)BuHN7[rbs䊸$Dtd̍ȢR:eQ%6L`J;8Cj](N8H7ƮW$l@SD͢j8Rd'59/a53IFlZs`msCc=ܑSZ=_T  m*1 "bUiF|!N[EdB 0`ϒp}8@9Q#(~ #Ec}NKzEo4 }㣤A ~҅kg!KO{ ?Q \S_"KDHDۋ"AdQ{ @T oZ^E:I?u {M3(lKSSt81){Uxw,Q$O|m>!$mlښ~:.ʗpm i/Tm767%5'DBȉP|NBEPhMuk]8:D,bG*͊9 %eca(Q Hٺ(Α=UL,=Hsj&BGHB&&?e2GLn9Y F:|)3&VWS0dBvH#@]o>M֣GfonPc>E &L<`Lp|p&''|M.p,Eg迨wa`okt#fr^-;9 ZOq{HJn9k2?&jtgBO; ұ~hQ!Sz2[lʚLX.7~EO&zMlyhq^\?"ȟ 6ADd'2I ѱ A 21DŽ& حG%T<%j"6A-D"Sb[ *۔`I|#2{[wD5RE0$OKF2J:mAE推4{&TeGkRCIi,Ah)U0ՊL@<YђT-bcw@M% Ӊb4w(tlx [IpS=y1=|?ȉ4 6Bei0齄WR\ȣf@5hX.__8 ?H.FY3S]ڟm.vA"GKBi~|et7k/uXxO34 #eE]hB$9l2TrN="O"d&Q=H;#pOwt0d-w/Tm@9;4yDYyAi; Z}SۅHn %n&T2@ Xeɺ>r-V>H2FiX< W;Ҍ%D"[IcOAq Fw y'n[zA$iGF$_t\,l޸d`51 Nxuuy'B,~HZگ#'=U#OŲ ˒Gd`Ueumr捓- pۧgF*('Dr$E( tE(Ph/DKR b Α68Buթ[Cp@B> y ې~ آhB#so|,<"$|o ֙A5ʼ-&֓#H]^RJh 5W}/(hMH8Bc VX^.iLBO:z=S/gqGq o(t&(>OIت6@];0 *'{'U ;;'_6#:~!~0m(~Iv9C oRL8*pWU;زAyqZ>[,HPMFO^I5HUx OXJ.6]2dbS:&,$d7t=Q$ۃtBnt(9yE3{ꌄ B$8_)h6ܧ5~y(vBx@jZv8.fKz'JifFA).ucy"ʅ@IhNa[ oN<7Єtffe=^~17hi,qURPmM' -7XOmL2ye6pvPd3Ҝ'1ֳ\>k+F>D@ #uS4Og 4|H CSFI=%쌁b=ȃ(mr77i%ej7 {CUL̡[H^x3RƩ?A}(;u&b Ӏ/\ZOdQ@1 7ițvo}h6(A HEEd%PQy>J( m5i虲hr.P<S$ SaN>hnV h$d;CSչA֔- '_@\}8bWAvPp3)M4]9mP>$t{A h1{ÇiGIpe85wNdgML9]Q7$}iԼʍf5;Eu?%C-t UL\d-M169WhtnӪhh(Qx bI+3UNd{uHG)5"Q&@t0@{t64T6( LxL֐XKErn lSls|-93I2y :ZėFI"@<'6U9d]".r 0ЪBTuvO*8m+m( KzbN0OusN4ʻmؿta0֞ {%1Q_9AߢxK @ 9oPɹ;"8͡jPOI-&P숨 ^WlB |@FBn>wECUauBl|J(Hi h.{A䆞`'ci xZ`; .<ч|@6jĢ66ŖwԗpFAA?T7<'0U Q*&1%P#PTA!2uVl*44>i;TYHoQ SJdZIdXAĩ'6DLB{DEYC4ns»Ҝϊ$-mVM1!\rk]T՜*t5#n 8Gc1m-W.*>Yʻ˛dZwSq9>hƷ4CqSz U38@M@Im`j<`/D|==uINvMi<_ԨqpB2Ej S]#!v;\a {F XJ.'i.1Ftn@Nt a .1nbqT{'C陵h u DVÈ~$gjs].R,%_Pb"xMߨd[E.HëuCI3MZmtj7Se7T$:r-/ 8p""ai5Ψ@8tK D.D6 I晋76#i@ޡa~Qsn80OIr}-òԘ"  Mr+]ȶZ";~~nh% M9`./yb |!tx.4a T,8Qe;Ԓ r{& V'G=dcHL737 0Pv đ ϼAoZ'8;.;`I lZEeXZdhO,eAj恪64gF 6}zn@Ps t@}wR = oS22vM Q$4ǒt2聶W_} cp98bN!RۄaT-\ ='$y^7b, IPQ={ N Nw(>hAbQTxMkg_g59Il<984u4I?4L<"[u- Ք-OP}""*'ji]#L&?P5I,q.rpwl։$ٱ#As%Y[EoͰm*T[?"tmͿtd'茎 ɠ6'䃞r $x̄^xBcJKmEp Hւ:uwET_Vl[h#*58 % 'uLn67Zx7(dQ-TA- D J5u'SL\$~T D-M<)鈹NuD6(xm#&c0AFDȹOM.tjuѩ>wMcNh+S;M"hI5}T] .9_;bKtm87:; G)`3%;̬Oղ=v0P@%&iU2},VTQ*AoF`&"5@4+0rQ(Hێ728N9k$IwM-' z4vPk'2s䃵اu f}*d ji胒^{*$ֆAbٞ-@*4`m/i6Kj/meզ!D$Y2T9B{(-za6Ok<Ѧ\y2spP"-ichY0:}!Lj;VF s i\0hAŜ1uT^gu")cV5"9SSne¨6)cMsgFc 0e=ԊsAA#o|햓iA'i鳻EkR[WWKIB4 M1;'Tj(vMuGPtqmV# 즋dnu`8j<4$4:|숨mEAɭy== 1p!l-  ji'|['X&q G5"0i}B6*K[$R<Ӵz'鹢U4bA;6CE亡ntZpe4>aQdI视9ADI;o'1V%& `#f8wA ߔҋtǢaӁZ S@ȶ6 RQlt´bPQ8Nܭ<"i9؂9{}-慍#J}7w*YߩЇKFh8Zxx!&=NmBd 1t[H4p<&2G;섛ȠZC?.:y"8M 8TǸ12 EH^:HG^[HB1Uq6<|.ZŠr:qi9eokATȸQ 7|C Zٛ8 #dH#93?548)oW# [H']S9;'̝e57%1.EMk= [K}L8gl@i3Tu[ 7':Cn$޲o uCŢaRƘ({:t`f -9KNe;PM`$#ѹvO `e<ɴN!41I  q! KTç ~L|MNeDtj8v }"Q7PKk 3ġ^vEh3"Ey.IDÈʣSLRWlmdN= (0򣽑W'!jI[U}X.ps7Z{Rw2`Z`ҜKqS`ۘM5`q?l1M,4%zNФ<؈@#pӏ˄' &fm>VuXEi Asu@AvWuQp kEA ʙ8N&ta5X\rZ:`'zxVssNpsqTMѽYX%^>hCQZ@gòM{Zn$ݶ3Pe yͮ5PsVwQM]THB Jp`8>ZLu<7=hICJuAgeb)-*Ad3 aiTs&pQDPI0 nfJH;R &mʧ݆y ],$ UnSs{M`ͮ ܧ<`9\8_vD)Ǫ r&av(8VXnQ + 0(,I1_E!ՐFtcdpxEְQ]qF&QeED )di V;b~<$PAZ]RNx ~,Tk7=֣i8*&Dͺqe.\pA?&g7TIcej:&:ཤvKL-uS^(p2aQl›w(A.#4lQj+14gs[[I&h(4">(t¡ڍsH4.S@m@فiH= 1doO0ٲ +X2";YpH?OQiL26@$[Fk@L}-$@E&:@Z^PuH ^A6|Dy t4;.*!8_ԦȲ N!ZlvN6$j9 tq{/Ps p=Kڗ\[7N5!mnsM-tpEXyb >6G0G.$`'TeN{su\" wN 3hCXq6 yH8Qեk-0 Jy`kU SAiu9UpP apS'=ݦTz CŅGHl&4><&tSOo/iqy&Z  O dM2`r";P.7ZOO!M8B@U|d`###9$(YgMm7D0F '- 9pQ=`]Zd!ױ*M0h&Ht35Q? QPw^Td&XI)xE=4 ir2?Q (=(xqN.N赎܂N&%? -iu7x2!aA8(7rm,f$vCY FusP=`Dh,0$o$/Lo j T^s`D 6#HqT.(2:TxǢQ֡yYC[tDCՄp@@j^toQ@kY%7&aN1tDBt |< dSH&SuAHS d9ZUqZ[l,8;|40,n#ꋞAD=A-=GSy ,k Bq($MB~KDNZ/ !c(ðr꓀q ja5,2nxlL4@EB A!&c{:oɬp1MMߐǴqW.^EbCmJK#I7@A 73Z~TSA0SDH, P麨j4{܆.#.HE{"70Q{:] FH>6jmZa~Zs 8@ۢ ŕpztbzoǽ8A5,࡮`[aL-2&.E&h)ld7?=nM׀v5DM=4SEm0:7NlFPC~S8^![Lt99Ëw]QXk&CSNS_,mP8%N0dmS?"y!_SVݺ6E@B2e0:nSTDxQ9L'`Ё]s}dtĎ`A&dt@wNep!fGX|D_Ȣ8{v9i2SdXI8u2> pOYuH>/ .]s2a7%ЉӨ*涡7lNj.$A_8MPS uB,p֙@A8"4A8H(X8 Șt-9rP%M6,o?eu7 S&KZ}T8'䟠ޓX3wp`sb.PԈˑckN\vUihZu2< 9Yk4uࡨ+`pF..'04Q&A'H$\N{-O!1pi'H@>e^3|{7,Pvt A)fIUwKDc;OhD\[u|$nGYŞ`{"υ[裒0Q?dK!#YDWH$Q=pM0C>q64*ˤ}P.?T&(N+'> M¼9tm{'t,Cm?Zr<-5in*!OC>1w{Vo49S !SPZQ dJdTZ @AS]K-*#( \xӕ;G1H-戝 $0<)l"(&8L&ɒU[$ z""p]QN`uF"~Jm~Kp/9 ('MFDž*tǀϪ"-ImNm-'~2r7^"ZvLxg蝣% '*iPXZ9ا2!tH/@dݤ<S_9j|1zl't@pUQ.ۭ`[]9`5[戉pXpXZ4~ ہ[nT*R"@=ԃ9,\LM/i1,x=, :s2pN8z:~rU'KY6ILGhL"8b<%ijUvEnDyt"#L+K}Q=dG`?stSzen~'2F6M$υt =G`"4UA&CNXvqICNO y#&ҌP #(^\UQ3v]H8F͖0Dq!aOve;Z [IBgFA"TFal#hDs(50NF+;%8C J#̇K[NjPvX@nwS`{] ?@2<&-(3ZyCaᷝNo#t I'Pv]xONI辑hQgY˪6N-hf#df`'NEzXs9uIZ<| ;"˕MgLTlߢnGK-<X[cge 1䠛{@[+@y[l#̀6N8=@h.7t:KFA>HiN4o(ʐӍ^KL Dψq2enۢM mt'54^ҋy;&B 9BmFZ=BuZPݜSCKK^ߢ.hrAuLpp$>Z ]<_W[:o!RO`~<0>ד(j0Sk@]@C]"w@87)^O@cOhv3!\cNL_ LoKDg=Ն{2FRC5x*TһF 7POLJn6*4Q5[,Qh_dKÞ\ͰJodC w53)L# bCȀwOy{EQ`Ȳq1}:x?EKIi`85ˇA6YF$Aph-SG wCM !wSNl=3 N a #!͖g }sUc?DxwJ18N:nm$7s,cF_Ӷmx\DrFcmT`_pkmպv#{[4uZ'I2&k˞yMZn' XK.uˇ;6plP m\{2 p%'j;#zO# [}t 6rCp6M]֓}-"*v{ -p٤w9#0#Yhmid9u;@Z0rk|{%ɼ*X 8LSGMv S$L]oFfb/(mC,W@}s4Vc(j;" NRi 9EkWwN;;.>L|px!ab4Z_p"cu;M-Sۺl:N,dLz@Ǣ&m.:` $7?DoHvV3_Dd 'ƓbM&;#D !tsЃ4^G*9i:37!8kL_Iϋk ;.L4CcD;t5 ӾQ hr #?/>!$7ì7M#Q :3䝡>KE{ry.`;91g({DwC}&%_ԓ4imZG<:G uGKpl6@ r.y(>'+hۂSDS|&ꆖi1T.7DblVC`i8>KO[(gּ@Bރ4 I@\eU%sꀏT'AP^+Btg-t-.. ZͦҀ"2V( с1*к<X~7CL/ Dm4dyƋ W&7fA V4ޖ>ˣ j3|ks"(9ă ^-tB47栎Ad[^D7!4?&sͻ29M0p]ndWnA)F2qL{&tb(qE 0Zy6k#%<5qnTϻUƎGH5fֲk~.Z5[b'wG?ӟC[^u=.#-֠.:+Q2 ,ͤ܎s NA^ѥs`]X%x뤰A~tFmh6{ ӌzDA=&60 $@ycNcAf5yax#>WjѴ`D[9[H!D6|H9n8)3TnpӚM("uvNftHCw9h7X!uE1䎁.H5{/4V WoDxr5h:^ OL-1*{MCMcK:ctۻ_d-E#k {#KAk \i I/pL M@*hA1#ڴ: `Jqp2r.М \(@$rW@]:trr~y!-(yp™FBp/ UpgMi;489J-E= 例NF$7,ZpW1S=!r\.wN |F /wMLGp GAY:zI 6L"ցtQ%n{DH{B*j.i;TV,;*vI/De-JɈ $iՓdZIt]i\w7@=4l!jyPa`h–=9"OcUǑAu mc'!Ft'b)i8E bx=.oXDDg`;mv j8Ko> u#k&xy]!CDmd]kF4OfK1&~ber t4LS|!jtd5)&9FI7 EvU[9생(ӉNlɊKei{ (Os="FrVFQdC%΍:~jXU;Rv@p;+4lNyD] WxU7Hr2V6^"Fw2GPtw6F8d\v/xS}}BH(Fۋ-I@r B?7P0g{ʗA0'xD=@-=2TIyoo <pp@*\LnWmdI ܺ麄si= mtk"wN|mF@:={{d;roL܇dGtF/պi888#uk|pjiZNjCv;+uRP;aTa "ůnwlsZl&-0j>{yYPC4Z6)|vq&jH x=38$j2dбť ^ :$zҀu fnziw~X'Cmx$XdI6/uI|^oʐzW6!jء=78ǒsh%2S871u3 QAp7RNOmF (Bx;eXTp{Ap`~NNGa&m!܏59͑.!az#CʖrSFd&Pɪb5"lk4p^#r.AE& {Fq 8lYE4|qHc#z~Jm+T;y=L{uD5& 0c ͉u{'I10Pl8!b%-pd,^/دArQ0jPsÚ'm(5- ڹ;s@<׉X 4()! di5NUoi0%{4 e D {,f4i:'TC R)]i/zq1&hR|qw*˰Vѽ{/][C&P#"}ϓtSŕVmtN$ '}S7&bE7FK=I_XD^zHZmi7Z,s 9 C) '8"ovNyYO`3<tup<1PIEnAAtzHWFۭ E# #rW{X'=7\ (SF`@aB{꬞YwSLq:c7 C1" "o+?uA#a<2-D+CQ\y"S}S􃭵o7u&YEbѳ\?`߄4ETFyC ivg ر RTAeDbUrZmd! &EXTVWH&A<_M$ '[RxM1m3i{=BHA[]5f3|=j djf0LwOcئ8ԵAa6T6*@R߯;#XeK&uMx{A9 ""!eb=ꤷeAᡦvD"{Qhu`S} uC6(oFϳ ًl!I(W$8@>`!P@A>j5Yd TޣoRG wsʟ/$]#{)-( odFzEEwTYGT0?4Y>-N&h0B፷Dp9Olt^ ]y@h'R&i3UJ-O ˋE8sTfm#q Mբ">aj3PܟGOᘺq{H4CD ֩yd6}vtxӀ6 6' 9DV ȵ'5ä:JrL iw:~8ɔ^Y!_H93 pb`B,ykn[jʭu1&Q N;eZHS=-w߄4Λ7LZӳ8CXi^DN] lmpdS'~TAZy$.&-pe EEl9@Hʈ.1NQ.nL#ωV9د+ vU+",Fne` cۄ,(Ԝq 8JǢAvFiA pl[H0P&-"S .wN. ܠ&*m6x=SRpG_̑ ?\>/pz9@nÙ;'TMQcB uBy#9L7h@^RڑV@ZVwY'*}QX eN 7{+,`#IPoS@e9qj*A֥?E-?5KR~9 B67GR. [M5` cn :nEDAn!Έ:z(TX-đp{"X-FF7*K),@wd[A}?8DE6 %SMΗ5%䙺cb Nv.(ݍ96p3o$!~TIBf<;S,Ҵ z Ay-V?lk-&!͎ M-xNZWN]~UM,GP%vCL]sfl,=].30mt_p* ^P a;FNspA1{(XpNCwD4R߲7#Iud }(AMe@e0 d+!eGenl+ ѶȂ(wG "Yt5  MN`'dZ\يTɭ;vDv; 2jN.uO* PbI.J &lEsIϚp P &ɮ.Dy&ZceA{bE.$t:.h(w(ɵwBda8nc(<4v?ϒ-.NJt|'~4Ll\A DǢp#{E~ls &F ggao;"78bl p{*klSum%5JgMi-KLlPGuyRnWX=V#xE V Ph/, 8T3Q4 }9iNtP|86e5s /sPz|at;l09 J\em F@[J/cN2AH e {"35ǤfB x}W6m^yPGYG#kYjiO\wD=2t-~mBd:~+A@P#DZ +;I`Do8@^+(+ ] NBZɺpUWn@ZDIJ_䩾U )Ջi8ЅS=hV Q_E|"/ŠpvanW{"@ʉi~JlX;y$j vMloa>i'2d韒EEHB` Fy4'utT[x6@dBf1w.ŀtGI]#I1>k9/vE"? qnl@RX@s@P}]q ]Lx ;Z~@{x;_QAf7v5-:0AfE֙h񝐡+&08HL})6B߄C]Fbvs~`&o >M!; ]1`MOjtN;LZI?BrQڏI&HwD:˯Q~M/mxoK7@6] 6iCGX"* SM@T1E 셾T@#|Hlb-dcD@"' E2a$T쇞9fk,Y3ŕvKU_; *TGLfaUS7:]vW.7QV5&7M;! @v<1(G$8:%t}PZ9iiB$'cO8ȸpottȿL 8 8D2-(=BEH=X5HwT1 z}'`y&OP8uC=G(8(벓ZMZyOh O" V0vL jLeBwk2شU|"D{x^Ki Iae[{0lZ n[V({ifNpO]EGiA&EE"dkjÆ0 xvt1vN0hx04".yr*6UjB tb;b~Zi"N.SD][lBkȣhX"'w)ĊN$ߺ+"=٣|3p>H_NPc^I"6x GpPZ H??7d7WN3[T{{ż$M}FJ%߳B1JOtZpw6D1]HOa#8Dd"TKA<-F(y?X4֘T<:,^C(%O)Q}}_8mS/' iWDO1f퍐xL gfʶ4Fc@ ]1wœ]2 5s> es` 2DYAo?UM.:sSCr%5-ⵜb`ɠ|=^{v}tSWrX`ZtȾF@s# wՂ:R][ͪyAkq2桏-! ا@7 Ǻ-tJ邲}BLVf@I2pCE e0n퐸& (XĄ^S¾PꍷEhR PmY; HRJtu +>6vV4'D’6@DJ%V@pm*d>9 Ӂ0~EZFN&8;b>׼{S6 c{&>LR npzzSLlDM38 m9ߌ#䋀AēIZX,z|y# ok.44d88H0 mUA=$uwW`üю89RET9!M:!iyL:b M,tX4P H!!y@ Ģ 3]T\j&l!r]jK)2{0/u6o(4A?UOWR{nђEӋo#? 7=]7 dx(4^ۯ*8靅SE!=we~? /p !4E#E(^^I|qtDnQhw(߲|w:۠ABYNp!p'u % A@+'tRF ׈"*>[t#3yoWc~ D#vnaQe<;PtK_NsH1 A^6;C8zDAt+lAAxVR@TT7j2{9R ۔,T1fJh>T Q U0~>A/hq]B`A1WOߤR!Mx Т6UA{\cMWAh^ "P?vEi gZG/%wCMf@XOy!_DDxܢ XV$y@TL"Ŕ48"Cwa LY?y)ܠOT240tﺗTְDvM6M H:\3h]M'g!1(·*i%B$zY(u%Ġ%N- ]Vd$ZBi}RmL"@E;l\ >ۍȂ Wʡ}x'E9Y@JN !^;(h'V7)7U ^P2CA蘛PiutMrx%Nm%p"':"LnkPNH%nȵ񚂑)bSsg f%4I!HzD,O6n &"!w (4% Gt^ ~\ \x>*꧲XGL (oq 6 y'tE$Biv SKyhZ* E0r6<'Qno4 c2;k(/y0ͮ)n16\^FP.q(3Lk`=n;EJ轠Bsw<(im`%ċ)S{Mx쎡q0 u. XFP"-_ܰGWC+#Jg#(&-AAB@. a#ˋ&#S\gjН{ G5д #f|)T^tlr8(J"9D"=hX( ePrnO 6 (d `Vo|Ͳ9@Pڒѷ)nˉ8q7 !=l;*$p5 F{ n a xC #>J]JMl$A  z!{4 \&2H>.ʦnv*\0O9@DRBʨiz/%Y"z 'ﵚLpDu! YLz8)'(zB0~K=]"X]Us}.cSÜev*m@W+r`/xS3vD H@#hvEd4cvt~X/?{l<4Ɵ06ZNiiq.9EwT[*"'(ItdrPxcPV0CkH+ K}ӥk ^9T9!xB>|8ӿ nAq䲏Xg6oCeB h?p0N7FЊ$nwR9!}=J ٞQ{iSNpwT`>/xnbM{_2,!?Dm"d\UL4|h=&qMT /pokwu_pd%^:!l4ȸMɆu+*ԑ\oޓ\_N6w5 ;ex7 뮦 p2*]Q.GCMT\cNKX(:bm1ta_d@I }ӋyS2rb;L:W@rLlj3N.7 ?tK~J0$gI0cW">xlێQsCJ\dS[d^eGm](#x@Hq#-F&- mdY,*[""yB#ꇞ v% $z!E#TŤD{vYgvNm"yVptPn%9k j@oB-vNrlqmOo0]0s:яEcӝDfp2yh;#Vkq ްd f@>p dHȘ?4ϳBH[GCS5 FcO {/u=U9of;A>FBG}ئ [4z}X]}A%j\[p,fCK]t YhO솋[n7-PQ@DtYJqyDlXd H,`fOTynPtM 9FŖfB%ل9@>|Ѻ臖ʠtX;+qc.$'Hvi(M kHv>I -y>I8Z8S_ Umu Yl;A{md)ה')x/3 Ġ`gt.bީSppGd83WFacmN#ZEXlȱC&6DtL.,Нa`F0du8\fmu6Vp'UKF";"샃tAʳɑő}8n~b<q, {_:~Kys7ةbdjitq{$ipϒR@wĬ+_t{4DŽ`llum( òs^0(M^-ʑ ؔߕFlzl GAwxDYEXn" U0H8]CjTjoX7ax3b8ߩ8467LD9{{[聫c#t[%|4n"'.Ӌl^ ǡDI陰G`CE)8ʤX@ Y^:vN1ëh"i$ ٠s@E`!Cv(1%wm+{$!HꚾGb`Td*m/"="6 #;x8l 0TMi,{fLCtLT-3SrEyvFX3B~9H<#őº"B(m6Du’7NPtJhDDʂrQq!QDv pn$z .Zd/ˆpSm͑&VW'rl4*crS\"Do]"#C.UOt7p<X 2& :84A@͕&A'$*\ڌ*m&Fpd`d$ 4Oϱ.sw0Ik-c߄n]Uȇ[ȦzeŖ[ET;+ej{m0 !*Λ $Y918B#ޟ]I6k2op MQ(gbcBBqh8"'桺oq'^m.{`DdѽnMVً8g9֥c:OZKD+*Р(3>*CvZ#$l7G6@ʢ}ԆPxݐ+G2/@8!'*yQT;cxȈQExRI Z.8²q,4t^Ɓ] 쀲'd^S"e:u==!H ' E!uc_YLx(k#h>?2==X$g6AiAsg{Jup3ӋxA &#Q#TA Wd 1扝x ]dRWĠ C ,!EO 44FlmV'dOy 0#3dA!Cz#u4Θ-| &vrt>AI&hn`USX..&Ppao_WSFE!P9@7yA}U/GWT>}hl!`fP{_+bt ']s HI򁝔1 pps~9Pf[ os̫B;o$n0~Hy >`FQAZOLD+,b'(G UP%0rۄ0>Id%9{ nCE8 69&CEb*SVP-hѹNa5XmBH!7z&wo] ? -{aq ȏT:tk5C"F`w%N-sLY r0-PJ @iMKH'#)4Kt]g~V6=bm p6ERn HY!Hv+븓6l³H8<}djInBt7q;yD8@}pi^ #WP9? Cڛ4wWAyiP26dW|( ;ӶOcpt|"TLA6BHn5DH _✐ N&D"Юcbzy &UvĄl!了D p7hmVDOTn2HAQy^!FtKC]'{unaAU쁤$ZA (XTxM6DPl(I$v uB"WLOX*v/x sQ>䶹gj{AMӼ @8E8P!S:mo"I"~B sYYu"\ P:$ )'ƛORZ;4L81%s)i8ŮF,GEs!;H;1%'7othtꆥ}'tAqBN]'P$Lv뉓9DP1u DE'Dnw1V`;-il7juBr/Hf,Ps\j^&Hdct%#C?ƛ=r#3!Lm6A)|[B4Wj mBcPiGBF9X%M²&~U^//Oa' <nce182׮e8 .(tN-+@'\~7jiܪevPIh0h}c;N' @[lUM$UKIZjD_(Ffȵ#!#}UnLG$ĪL3Qk).u^heE*7@t.؍ӃO؈uMڷ{BrUy4=Zn%eg@LnJV H2H2%a$'t$HlEʳ+tQ NRD0QDFuIa9sl1d`#$iMw'ADsA$;$0 :jl`$Fe1۱4`WXo A5y\ $ Kplkl8U<"CUH:lQ d˙,6.1t0EѼB#<!@qƚCau%i ;h:ctb5*a$,_v  ^[m˥Zc.IWd0`ئ l'i|rQ umHVt"O (z5AτM8Ϛ,khd괿$o`hB[cvSM a?wHvNQP) =npe>%{^I[d[ctŔQYW_bJ|3}aC##tJߚuFRۧN"nT8G-;SZSN\SDZk+7+3S9hnI-&*wĈ?tQZ8N"Y3M '("Gpr$ [#S=;'Rd<,<-RsNduGq"׷c62@a(;'6D/|'Ө @l}2C,ў~k*`6$ dD*aD ,!e(t.EB @HiMHD`Q'9e" ,"d h FfS8Gd|RчYonJ$dgdI'*)VOurV6@NjWݕ 8DTo5?( Iqp0xD p#6AyDUrv P5A4QhgXL072F鮁8AӌbǦP/}LTj1&ls]KDܘBP{H(P 4;pC;WpQL uqr! lLVn).I1 *y@"JD*[%29)sQ6& @~}] Ip'SG*l[`AG9FF( }SȹD1d.JDw $<@},pDP|%9&DxC=GNQ#uTd5ёdk%SHZ=U|\xVdt a4n!88h/]'p^c)@08FFT0y<ןT !, @Xp酤GwvPL58RI&pQǰyPruKZx3 Hʐ؁;n#)j:t !Yyed ZlgJq~bqxBUiFÕP=8)qt#U%E#$F!a*ܬ/ W¸ADD9wG@" 2`*, z 'AunY(  5tt;Js}T~U%5ڮ7hB JNt@^Œ,`{2i*SgTߢ>ۄnYd(҈BP*@-D(WBI "@N ߏ`,±C{B@ӧ#nzX~audo%>. 8  Z@6߅6N|׊4X6DNkC;f#De Vk:F\M ID^%uKOHC! @Qsyex">ht"9ی(6lJWYH+l ,M'7YFPH!Ӻ{syFeo68YN#줝@^J):Qc$ bӺ'ݹG8/D. n͐72M8>$ HyGn(0D6$YMЪ;b|& 2*{cxUix*GPt 7D@v,H B 8D!z`؉ke|B0C+$ ʡw-`qq 4IiuN=!UUAv.0W:O({ w@ﺀ  6V!hpcloqr:TPho87Hn$9bM4g(^/! 섀+?`.=(i7Lh7pWH ڡ.S!![+TnJ1 !L|D<Qt[*8<\ a(sR' H셾vQtM*R'&.&B$愝QF$]ZBLi65e[1P]AUSyDADHJ^u!`=藺5X+"=APvY9C޴DZmlxUiI( O*d]}ʳwF+SRN!4J s-'›}ءkYA,*Q#lP(N6*m}0@ax3 (rLwUsAǒ2nQ 2H_~h6~HF|3H_l"Nۅ"$ed!>]SIIj(%<"؁N.D5pVA3d Wl qʆ2JCdc7{'H"–~HtV!˶T&PJ(vM# 7D]!A t5gt:iM$"Hx"9NF)q1(| *ʭT`N}NvVFee s7acYi]Ad,( }P LgMtXtFQq-:Q>|A=h? [)oHJ9.clT5ϚZ:#>3GEwȟqQi""48Ii' 2rl;d@ffWJm!6 !DZJ `¾;"H%:ް(G$JMӌD#.Oo8.3yjEVW".Na=K$=[&|&wP\bWtڹ~[)sZ{a=EtVm;Fe9}2&D=H)nۢ&97wV|LHn.9했%jU璚m(Na, 2" axBDzc 򨵐f}(_eD~a{+4ĭ¸5хo8R-䳲*=⁖7LU'5$ ^P2kw@uuP5dxI7qp6>0, ?՝G Rv86Z"72HC2WP@O SfB,-ip(^P{OP榢ޓAǂU37R"ҊxjZ%[]~B@3D$'Ico(@&+.]]YXU {L{8auWP,‹fбB&Q#0nNiY${|=ОS,d*J5At!g6@ n>Ewt܋O9c2 (m(R1 ;zt %I# BaS :+C(s}Q8li%6B`Db0cu򃶞0w]9@ +ɁOqLB 4Jr%@{sh R.'"c@G-/V$wFW ,J¼Q- u,rL$4y@N`;"ւOυ9}tH}5 ~>)A!D2oꨟՅNی &D#  >y!C ;l7AIV2怒;TnIB>`hA98Bt.0lf"8%D8Q| 4D< vݹTU2}zgD_u.PI.$#@.1~I:FG*@t g谸u y׺DCJ>sId0"\M(8g'YkKWE]B{$#pkMc`edJ Ye;7Bn&OI"dE$,r˙H2Q"غmpe^`lvb0   G9J뉔`_ IB!¾/d#z:'t8L5w ,{;G &wEt 6d!ETv8AwlU@3n鮢O'nnKY7(HJ\9.~mBs rEmo@xDU1pj5ɷ+( `V \>a.&EBhj5GKY@5ŞH s6p-9@=m~DDD\wEin; xY[~+ec>ʢѕ@* rd -!{/նDZ=i]il 8V@i@܏ lViR㵮d8.$ŶD7N}[g31s, l o! 9όy(3 ^ㅵCJ=Ph{C[zl!xIϒ'M3M{5:d{FwMM9@8Lu V\mMjCͿ?4Y]@,' ϴ9D  Wa !nE.P9k\(A<X,L"GMڭ qXI:8D}|**yuʄ"Ne%9&![bIt$,n=W*@=Ӡ9Etf2`G29RϢ:U$QmF' )`iuS\ {`l w ւe nd?P@%o) FP ahWw *mB8D uDքuI8(6'7[!i c>Hӑy, 3]n*{d!qu(t Zte=>gUU թ'JA̚DD4(W QE5|ӱMW\/Ru~ʫrq'UrHa4%9)Y ={c6%S!=59{SSZ 7U2^[* k)qA(PSw?d e;NcQ2}Q>{nLϠ */Udo¿B#mWQe.qMNkFd˄p9Q}S5Fp\Ws6'hLW!7r[1ubXL_ד]p9)qix.j(QZ;'{-X`X]P2Iod ,sH;)?USP6LUWoOeI1 a nm+ARnVgA8ʐ.L8]MUO1d6M"2G0Ո]Q>HE4țaA;PMD=\d-ѺAu_qȔ2rD At` Kxk)Ҏ#B'i@N\ܹRCjuy—11yLJzIj9 325g%.R7H.m@b/苉&m-9.x4kA#HI9DgdHH-pĚ. I& 4q=|BttI>|q>'tfN y-ӟa3FO°Ya9lm͡^Jt4a\B+D*j3dpO(=;a:fzbc떽GXM%5,Th}t~ Orœƚd&8~/?hg`[dJ|F}7 pҬQ2I!bvXN(T z#s~P$#q~I2 F\J=D[ 'Pʰ+Ō" W&۲Fv]GtH<@ `nfP G7Gb j#<"A;.^VB&!Ƒ }lPna9y`8%TIm3 eaI6,IlEBf!od { sŸw[j,&f7A#9W"au'' Ecus5݃1GP42L0ds1V>;/~-4:?԰tdt~i`:NW.+ߑYSMdåOa6(pOђ\y / *7\l/F/3.Qn$W re ,|CuIwX],d CCZm"MжB iBnP[(7]  Nx9($6蹎u1m^OEȼr $*ZfGe+:͎B)_83.CT6Mӿ]R\Lk q vu8N}?OCgȬ.| ?7AetCY(D~`J fA9C8@s]R{}s^8^% :QYia0~4-赤ˬl{5xLkli/es]%xZ.$L%dstz{ Iv,la9p' ?%bdJ6 Uey[F8aHt>N#ѩ/4?>eZp`"ԼT% y+a8j6N ^ 7Ct Ty64> O[lꎶ-٫v1z;\{qx\/ 2Miu5mSFЙ6(C&{}!LϘLsL՞@P&?Ve GQ|-9jU0&#|BLi"*?~k B1~^R*:ҭ?$&Z$OŶ ]o>HNVŽ6‚:IQ %ݾ$!t-Yd2y F[({T 76_^Pb# zB5X, 24^Q6$Zew"*Y#{.N=F ]Ȇ8jd$Bj$E;ENh|ԖZolrJ%n|:@"P w*: X3B=6Vӱ+DoOҪc:e4Xn$>8Cw@ D!EH)XWtMœND,pku Ů.ǎR+US-ifZBZ#RH6O1/.y^ܸi\HJ{@%;boAai54K7OLstIt^d]\|Dǰ/K &ܢ`DƬ; t!ܠ_̺@{^łoH1XCtNeۓw.mp5E55n](GZQŇ?T.)QNn?T.r->X>Ⱥ-"` 6~蟰SF|gB T.>IhD6AcLnTWEᡤe-qdj ͓u:)$t@.mċ-P $Mˌ"jYI9?eI|xHu }-dT6ByD:L)A-(,dAzEQZe9@-hs` tGAp$Ll1"ĠONcs@uͮp'a1aBQydhcZK|-4ӍRrFatڎ3P{ ;@H{L#P"I隝eVZZr~#5?m-xr u i֨u@{H ׀b?5tV"^h>D̈"ު2SjjkI`$Gp]^#KMCs{MS8Z:OS8CHmQ,+w -nÕ@+hiikgh #i(k[TbY>\wQH 6mb¾*B1±h["CwAʆ'FY } %S6 ˬX'̮֒$ؠ-𬋞wD6A:yj,66Uֈ#UUuI8B2p(~⋠PKM`Q~HnǷW@{YCIJiDN#>ji,?4E&(` 8^J"; сdKEUpk\}YM` Y.ҵE{6ZwU i(m`M6!CH"B y쏼s<= Ӱ(f8(h!wv yY9 hN:f2$NPbUMH1tZo5ĭ f#'Q 0W!"o(%$8U[`)TVrf^/sdXX ӟnѸO//Cd!^䡀; 3l9P ʒ}DHߪ6T ]U8 j5G'NC5wJ7>JlQ3(/[e\}4VNiVvFEgٟeEz }d] _Z4LGH@DC"ܢ`6@ =T˩; (:[..s2B(@In C@}7Q $^hBa܄kiQ+e`hjuI8LyOBpge h?eiM'P>@ Z:>+żH~ȳPS+L̬plQeXD=Lcb,Op 4}7t ~TvCIIحGŜw(Ff# x<$*%{_6f7Euѧ*k "O[&{fIl !M:< *G{'>AE$tl[|<@ꄍ|/7Mc5+{G}s@?4K-"\=c*7/4 ǚ]d;F7CSL!yCKwDlID*EB>j|Rʧ9~_\V5U eOQ(91]mw6/L2¸"̭+\>e}7i]p8ED@niC 6bǀ:O3 '+*S>ly|]D +u`X(G/#2ߚ44a}-p8"m ?$Brk$GЄ ex`#SKNnljEi u:N`߅$ٽCe @s^Bj˸Fb}Q|!z #CNa(>IPѿ(P8^08hI7Ѻ4 Dѷ{oC>A w)L^l./ zt )=UE@}wYP>hD\LtЧ ̡8VdmQ~ZN?KL9wďFkwD] O-siY @Ɍ2>kU>lEc2pEH rjAR! DQ2yE & \Oi`,{oeVO+#`PL{d&IQ/JRZ=Ǩ@{^>KŲ%/[0xx.!lْxH+aA%xGc r_l}W3T\aCA̢mCajk\c'eeA6&KdzBy.ȋ=\].}LtR~ sI?YُDڌ=S*I$7@TIߢf6UX!պM f@P#D4}aI.Ve^\"L)f }7ܠo<(|nU>Qq4R$.(˃SEÅn% ?$ze:`t[H%5/G9F{nLA 4ڛ]e9MC)Xm@FJx2W$]Xi;Ym:E/F6t{wGpeك=e3ka5Ri%{jaٲ7ant\>hWh^@*W@};0QZA(&hh1&<t9n~\ƴo)CNFH@Xs+OU^M(8{  D'`B=4|܁mfd#$eZ=sMBee"YFMn xQ %syU)`qYcu PdMI# 0ܨC9#![lp,& t Bc1rU$rAd}0ks{21^&U#ZgQNmujy[ p  .P!XqevU'su6]>WWebdq.Հ7x!\$ ]yNs3m%8Kf{3%ȃ&d#}D"*ouB줝[op#d[ە[s..D,6rS 4%ܯ$!굅KIְZ,|Yo^}VO .ebW֠ui_\e;^̇`їEـ(찲CNIP7$\[^դ0j3oEkQepUYYY\h!8Y #tSweFmOa@ V),qR<"CJa~Sinoat|2Z-](tXXL,2@6Y5OMQ#g䁓<#[mҞ^}NnH ԟf\m`v(u|ї^7DD!u@J**+@hF~c;'!t榏kQ5wl%[M$`CXMrlan+i鵭$u;> 4$WED,/!b^[ݭ}a ?\!S-YFId^^ ``.e='W[KD-'CuLкf>W켬/k Zp$I6nBdmWrHX8أS1SASP6戦ZE7_D0c3 d;ź NBhx+B耄 Akv.89ewY,Q2Ob3dz&8 6>)#6>)ShD]hioXKR)AuH6F̬찂g{ShD꾧.`]/iQ{ߣN@i _tj`9[(۠KRU NacM79Ap-ϝP mV.0iVfc~S~%0˨W貢~"LHL-3Hq6(/O Yz#koA7?\T + Ajs- 9}-1T~<{{.;Bt$ l9D6I8@=©!bnʭL8Eć61AxÏZq9 BjEU̿Q$@qrE 1<"mt0eR"D}Ђ7u"=P3 UyA#J2XpA0S,LҴnVn!~ˌK Z7ݦ95i4:oU%lQQR ;_BKoC~LՕӝXfOt^d;M`iW_6G+t:mtOZos4LdkbaA'ttɸkE[7RM#`[b6(ti_8yJm秲돚0" ij:'gBJ$?yW!XfV)͹ AL`p<b=V30HVi>%o0 7%L| XGF6i{,mF:5B7qwN*GӺ x5l"!dV>їM_&7 ǶC@t䕩y>iķmѐKPsXoo򤅀V~J(XD=|֬6j0v/.ge_ O~#,/7Osh9Dػ;"C=:o!)-{̯C=`-vO=Ėk{ٝ/Aqe=Z{.#"j0}g6OovGe^VtxmcCXH(MpbD}YS%\nua?ueZO-d@XV fG!zZzZxYB K-Nɓ ȫB7^Cz( SeT1.7h.Ust0\"!+ U}AwP3k{!Rֱ0) wabTӛXe85*ط2]%Ҿ!ižjCrLɲ脸ܭ[ne\!C%AB5t͗6%=h2-粠 vOx:oWB(@e`ϳ oG_Hɣڬŀ?$$7XDVJy9V?(@X Y H<m%fѱ8RDyۄ9Q V睰/@/0kK d};:ocTO {+p?4IC@ψMNi?THoWr5Ё̄qO>ed(N*B=` FPsdGkARr7(;NN {|"μ1ElxZJk=O`!C(WմP7{>&n{ǽ LZ7º6 ڤH6,ق GS[L3VT\fmO2|E{qUфI@g}Vgpe ߄A Huo'OBFJi4ÏȐrL!]qzm Cp7VB[nBBŷN(~ v]^ӰPAu^aG!CmUUr/_$3~Q${ oa[ۅ+ l%R( -G5'HX4k)7tot͕}$\V,q(6Y Į FP=f}p P`>+[BX+B+!u]X{02n}bcu M=۩u^)@xXXQanB#LTPpxFnkv\7`;:MDO{ YDoF |F,/a ̬`c-t d,@YV;\ ]*s'di&#teԯE :ٟe6B}V}Pf>k =Zcp"~أ1 :QkSC<wNm! A Eu#[3YYB!m,fh vA8)ij2l#QO&쿳沰]aS!(e xd@aYOPq9:X+:9Bhʢs^OTK! -7 Y8F%X0a|xP7I<mWtoUlbJ(4. J YY++IJ謬r!C:wW YXi@ڤ=&aA]yO6q$e}& ܶBMdo$p4XH Q hŋz~DGG}#7Z |L[GLUFBX~b#è:Ŋ,YTNlȀěAoܷ!0> ۱O,ƺlDVGlrVjC/05@cE&(䡐1 tNƉ!Bv:'UW5c gR 41LB* d 졫X2z"oɉ>0fxP&f zS |SUPd'PbZO/A A (BJ"YL&A`r=!ra4|&9G1 6˕Z?RM.̭5\9c$R bGʡARRКي=꼖Ts$Xj] V*Q  @60N+ s?(pZ?1]m:+m⠬V+_ f?3L)g}}"扇)$XF3x8s H??<.2 yb%FL3bS1d2`6Șh,HHb ٘h?# tB+B #g[g;37ª3]!EW!8g{€m(pz8tC *PͻQ0iP~!ٕbf!8@x c&ʸdӼ@1X6~ *BEC5Ou:exP-)G$|Fr?%Ѐ#P L`[@&?Q'IŌpyXJ IXxt+@9yr#lSY/F;BP[A5P`XH£pFFCk"hTui$0#u.~w5(0<҇-ȽZ< [EK|FK0^.tb"i@32YO93MJ'b hi\. tB…aj];j hPyA zH|AQ'Ԡaf8p#P/)#IE !Fc>z  9"wv? Wc0]^@DP*8d"`{ M ) =(L^Qܠ4>?k%5bSbĥ"48C\:Q_Lmgh@D= E䏈y&V͉&/31F(W ,K"`j@AdSʂ .msԿMZ#BJ丰TM\Y X8ή@v9LgXQݬ # g˨!h@Yt`p ʞULjpͮss(}<4ӑH py@s*Z_KB \D-[ȎQeDQ$ `]F= !e@Y X"8Ju ׌ B@F>+S~$sq6%x4WCs7iB$8w _Q|Qmf`ީ`VʴS~0GX N5aM2mʏcq5 cp8@Rw9"RG|!rK: t#n42f悞kWz3F'=q@1~HEtt@H/a7d &LB0Hunp $MH/+a=`>"8x;F2vn܀g $UQ$&އˆ_f-9v^{o1`kϴU.nuPIG` ]Uچ/vNPѐhz_zX 4Tq5yX~j-A+)|/B7Jn_~8 _292gD@]yt]5maH 8zoϢ ZI KUDHJH,Y3U=/<bCKg mv,3+BŜ}"--%-1@l>&482 iQ-mx*"mrgXɳpH~%:"2a4Rք Ԫk[Dg1*4 v"<`Vn#B&Ɛ>Yrb [%mKqz8Jh ^^HĕRq wS҂ Dy  D,q#XY9U&[oLdnd(|⧁`EZXlP @B/\qgo[!8k_;"`[B"62b1B]8l_X*+-!2r5w.3s&S#O4g[MC <19"P|鶧|F9 >M̏!Ȋ߶!GbM`0*'d%Q-8Y0FfZy.+ȲdZXA  D ؅fBZoY<[ÕP Dl2F~f1馏v% MR6<|& C[78">a-c8Y'ۀ}X0~!YMmbWBjujP9@FqY / u`(XӗIc$A˙F䯒'g ,-y U<p6KbCBf'=8YH l_2C44yh "p9=&.4c3H{S2j!4ѼD}P9ooy3%4A JE>Sk;` (_P|FrQL Y%Ƿ!h3H/+ GMxƲB>`D0#;92A4l 58 ~ʢ{KKaNFuD7 yu(@cr;iA3 9!)CSRϿ36Aۃ+yrR#4lr{s>?|\ ЇǸH=2 ,w P-u LK`i#FQ@E!Ӥ!ZNdlL ?Jw/Q}1 y~XNGYw  R6a(kQ&.9b0fX _0h6JQHܱ:fy*3&k#'\`Zw5iA3`b`"!γ*i /MX)T0?kY70`2-330EnFki s9p)\`u(\,Kȡ]YAr L>|b" A?{ d,X0uScB>=0J˸$79"M f]Eՠ@[ Pc$z uAgJ%G@kޖXU1w]jN <OA+E!c X+Ch2E=rOQ p[엪l;' Eisbʈ֮?Z0$u r8L~q#1`~+b,@HAV`$o*;b~B5h=D0v?_@爎Ɓ "1 =j3#A|JeLS|&̵C ŃsnyQXHp 3mbim1w }x_jQ'pl>dviebfâ"!ff+- & !c|;FI)<σ\]#3I |L}73|M u=᠙jyhL 1\qʕ psP < ]>gH`ׄM&2 瓆6qL pH/>D!ȋ+PrR0@u/(:d1*O]M mW,Y#wgab8#ľ [4T spptp5 6-|CVA>y]?2ݵ C4y?$^IDau0jθ`EE"'BF˘]lrZ }y+n(!#6T"e8(0xF`/˚F7IZz[QCx0!)摘m i0R;} T{tK tK hu5v#kG.8WqZ:p#ϤCc ;l:ΥfTd=AH,5υ7Å<%ѓX0@O%(2PCCY(%@lMɿy{Q <:i" i }O@eV!hgR@@+r+/N cU6 Q bes03/ };x!~1>fyvVS@rY۳h~cɄ4I%Þ@F!pN Ub0r,Mĝ <* ɚq"xT۸@S.|s `Ajp%P>j;x/gK1̴90KseMa"aw3^ex@#`0,bXcT]nabc 7"L u)D1%cB'P{qIv:.́a&u-C| FBW$Aq+̬ĉd>rUW,CB ]Rül[a@dLH"XVwgaL 0yY NֶU0҈3@Y9 ðKpa,!X>rAҍD^st0{=!=ʉ&zG‡l,XNPbnJ<:b] &$/&~>.r0f'U/GpjޢEʰ,G oKH!v{v(CP!C4= 2q( }`\8ذeM|0EF?a|(*0R0 v#B,clW!3aw"? b(Xoq%F\ XY ($,c2s; #E%2P Uaт9KDKim`9==&.`Q!.\$"*,f YݰA$EGbi+kaZkmϵ~#P=a#cdXyCsK3˦g̻pP[5^D/f#caAA'( 1\&s`D 3(D8ўh̑ -$GshDG I[eS@0dU^2MR@LjGQ gb0Fl!%1u4Jf+5PЬ\{ +i9+*|Spð0Ug1ÊgѮ2n>q[ tG)}C"03x$!<2rvg_s BCeXIIG6RYN=繁-)(fv% $i\uI,81R URoG`G& 9Z l :4[ZqvR]NVhF},~ba]JԱ( d \l߈ך2NPXx0A-ϩ\R&8a ,`w4cVO3 U."ĖpTV1D4IhQ 62Hs+~$?jF u̿:w@!8E<YhEdDwN*70`XV-8n|2as)u@o9=Ge)uafIJp#pr@N kmHabʀb?*^As,P_0 &f 2:9:J90yxeMT;13=LvP&*"C㙚F;hO8LFzaK (q3bޥ/;A/pCыY]K if!}0Gj(2c0Xb2 +G1h*QS2сX!'o /0-cb H `H,X`-C` )pe ЉqAnX o`ala !< H+-@gJm߈cd³~@?σqA ٌ4 0aYhsJ93FK* R7qU}\sXMllPob[" |D.t*."F=bdCWN̴A"Dj k l>J\@Nw0yJ@ 2c`:9Ww vM!`v`'؂BH לCR4 %ѬNF&]Vhp H)dr :,ў72fh`Bcj7ĺˁ=`ʃ=KSِ6N4[`*dUpN4QE%qu50VO>aA`(Ag(uИ+ [KQ&:v5 P VT?;r c#b=T7q Aa?`ʱ A7v'ebx@B͒P,'>cDuCu9{6B>,sWsO:(IP' C"o(]%SD؈X}7IyǜpyCz0p2o=@$ա`\Bag vӗSڔGЉhX,PP%ZQ&w"+`Wl0\#fet1IߥDvUDiXyT(@Z[ΥG 7479OPd)BFX.-mbKL*Ϣ4 ɬzvQ2 `x˗ ZGF6fG# V# y\J rHKe[i{0`ݠB]@xpmu*"M14 /˹\w–x |Q(Ս>q" @@ 8I㨕;cnsp xKsA~ 4y yYyb(G?lVtrK\!8->jԳ̎DUvRM18A(?V!Dt`gŽ14@"tFmȇR)h7Cв;Z H+b@@hK:s8~嚂 $N%5I@Hp>Lr euuP0Ȣ @x%8$"j@+ >oȇDIɄVIE&b^D,>ZPU&ygl8Q0j5 .B̃g0{P#J%B6._#`:b qcV-Bpd%LYJI{ǕaN x7>T$dD@ˆ @Mm6sɃ2 \0RAAS'`&w˩mDͨ|B@1$N%d&3 j,/v\|"a(Q<<66r&$ S; (TU\z%;>4!!8PS#ZM8r"R)CljO8q< JԲBFf-Z0g& >c<+Hɝpij+#=*S-Ԙ4@ڙ*9ps,ˮ.𠺚sCKD!uI  dD<{J j4ShX%NM 21Sp%R5 0(If!P_ߘ4ၡ E{0\,]6'pqb(tϕs3 Jg8rL<勤!>.ox'Z1ʕ=p13s)VɇB9HxR'J n͜ˎfp18K,(/ ]Ò1ZLmc":%x02YH#,Tkٱ1"ߋ.@!x`GL>`$t< v0&!MPf/ =)Yd6} h~<P{/n>@_O3XwÏ_`G.`CeCYr6=s "a*<ԤM}0&bM6k|m4\'0`Ӱ-+<⍺FTqyXafGD qO-Ez<py5c"U3@G^HMu8#G⻮~ 0 W繕F@8qhA$@uh H})}P-Q"2I[6k~Ii$Z IU*{n <OMF vH*pyW=PTgM;L-7~!oMG" =07Bhb0HF8KFi;@&#J]Je 2xK%lyeMf0`28p&@>q$8>`t@qM9 *:X(MLc1L1//(!qy}z0Pj:t +J(!1B$U X?1nF(1| r|S[@.|eȵ%xJ&X‡ >+#0\E} tB'n/a$<26&i#L"0(2,H uG";VD_D|e|(.i &fias;p Eb.1Ɠ]P=`A勍.A2 ' #sB6_Ĵ H(iA!'*Rő22Dd\\eu4H> ` cLB,wƥT/,C RDtF9p>Cx"N6yY Є,N/b /='v~:Mp^3)<\pѓÇ7 X1g \U& QJܲwP^p0_q4.p1=fx`C_qc7} Ulw_ȸGqN(z[c)t9a/",~aAEȱbND-q5sҎ>'ص!Rmd0щ`տ ˫6bTsC1h?7)1su'G` 4 >j?55HF:,S_1_ρ T}G؄C N}K>e U]f, k1aQ*NUh?G3m rW0P)t*gɂ*%1!RKմ;h&Ŝ $õ9 s-1B@*veEVtf@>|LHXP:C?P*‚?*xvoy`3Ўf-,?2CYw⸬q:,, AcĻmEÛS %`.:PGs# R`^c@>{=CS0A1'x 5 ! tHg 3Og q|j/Aa8@6`J!YB@ۑU(43tE:{ @ l؏Xxcb >?(7j^HN!PD-OBn-sB`BUPBGuMc5C29DUGQJ  bpb4ͳ"DŽf@7e>;*b@nAD=#FFl@ ކpHR0@G( ;8XgW:Ro#P*ġ>DbxXHOIo@_1'J.<ʲh'%p!c.Ӡc9@x^A@Xn( j$(={Є?"ɿŠ6HH/|+>Z0%مXYꍳFG  l@onr8PbX]^W9!ӨB93eFW. ` @8 bT1ش&(j60 ZZ_INE VGP*$s>o (vFI1c| {6ɛ@&fdAPH6OcADb{P0/F9*YcԳ9qLdKaph)Mӌ1dH$QPq j ,L(_ncYAn-H̛ @] +^N`Yejx 0DR^| xIYz ;QMsD C\PL=UǬ`YBK,v+ Dbi Ql2aJ2 Wep? DLt =r[Eڢ*@J:̨ie^\FۋA1H`- e  1F Za 3)?Ԁ&DYd1FpI$pq2<# +.!$@.bz5g=Gx.A9Pђajf-3JC0F#a_P A62M:?tC\0׫,ͳ rqb޿p]9,6L+}:EӗA8zs{SNz|z FDc)?E_pKX@@d` 3VL(-h'LeCLvʑpϼO̴p-0l7Q9Q:G* G - &B5K@ -za@1b QL{Y˿.CՂ(~Z/ bDHyqC!݈ yvC=FP5Q`bnC.@+P^4MƃTάl#b 7DՂppte`z9z!ƌg]ӣd%g$ܧCOsDQOD` 'EzF@sHrZ';*V{2'c(@:x[7c+t~Fexc7\Z'q^Ǽ)xtӈTѰ ~㩤4#QDI, ^x&@x4ޡڭdAk™cWG<40PK £@xX*yzs,1PZ"|3c rQ56hXa;8LE* n9{$K])Z3h" :@A"mi^hÎVDX6]Mmw` 1 $>p֚ KFTT!q&7ۚQ*!7DfkL9g6vVF1G؂T'b}C*ܬQ@'y<.DR jAȃm!t%*cPpI!4t_Aϒu \=,d@H. FbT ʄS/Qҡ`(Ϳr;cQ iτ@@BML>Y8ܵ]r弐 !, N\ͬ1G9 _|q}s38?也TN|rr゙^-(D^lCgɬDJ}Ƙ`XF6#9OǛp-H~5dfpyS\+;k5/*>hl3eʎbOܺˇbN_3O$X=P:l"L}&8ܣ%nCR}p%G2[o/7X퇩w=H!L8#[/sM.X(p+#5Һ **,s: Ƃsbe& NA^yoiF @._OF 3R}ͯKq*< cHp>a#7$V/V :FɁ*_6_3@uHAb'ȏ)e.7ja}_=t6|C *~DA t0Nxq:l~!0F] NGC lMr, șDrT1ʂX/=˹ QM9vA, wb* `=޵|X"]P^{{̣Yb (LMuj 2!o4. 3Pi [sCv7S+rM;+8m0qWB̉A3 2',qyiR B\+s,P8jq Yle<0 anX֌ttF̤ Ľ 7CzkrPV]@X1=.E_O/bl;#e&CQGO"lL(py* 5pP7v.1d ιeC ]ͷ/fβ!sOR.&AG ƖZ= -p 0Ih2i(v= 2$7S>A%DԸC02 |A UuAS8 . 1dExF !"G@EK4lbY%Pw` )9~6iF[dꦂ3a)@*d&p [\+E` bXp}p@S8>&$]d_A kb!cH1G/ЃТA?Ty&f=dYhQf/>хP5z{A.I U)i!1喏Ҙu+M(Z7(fUaA%!WMV뱖M@'d\v!Ip h~~jFBE%}r g{@]뤪(! ަ.̭ԥ\]}`~(21`EN05)P4e!WU,&,}0<8`Kn]3?+EۗӈU0 jbS$) ; L"dM80uW?YjaK dDu2cJX5 } 3*0y6Ee\`SG"0e vc2,` HywC*D̀C|&Hh1NʳpA 1#!5prl` )'#; AsWh|8& {rsrd8' /ibv| ;R9vUZy-5сf1P8&$W'3\Q}._FQp8Qu:L28H3B->lT s^D %eDix,1 "C0v.$"+״[SW Ɂ+IEI'~JmUwPQl%m= *^$jB9׫x%1F `E6@9D@"UBEң(q^ 'au0xB*8ڭ,y#bJ'hmNS gzw6'b (τ3/ e0@8nj#byp zxZ0G11e=*޲n4)n9s"V&"2N  i€j,^Kᵯ ZC+:< ^́Q_ k"bعCe< %̼lrv-ol>"'`׌S֯q(7>"pBjy*b2ܽacGsŸUX\,EKXy` Np>D=GdBh; #|A±5L,ٳwu1 1jQlISZ0#n;k V4yh!s7gf^`D;eva}RX6,a2pl(bcQ#OB\9dL*\D_+Qp e-d%wQlb7} FuVOh5$Ft%LA~h - (8n^rN bPFwA}RƠYk&Uق(C&'jѲong `sY ј2mU7D؊a. ^WgT:@#MQD/@qj3UBl DXQ2 ,Tj La# 5`1>UtZ V:2C.|>%!?ecH=TzVgN\pj'Yĩ(ct7λ%S$7.(Ȑ F| vh80w.Xϩp<vuqn x^8dyD vn0j 3' C`0=6H_Xl_ 0m+%L8'aQ&8P2%C7EMC:32I¦T\-0֙C=K}4s P *bH&Hžaؠ2cT٢1N MBXS' lԐLQ؄hh.05 E2.אP嵬jp˕kFD620@vhg<. q8rx`xE;'%d$:E!Vq*`ZvƦ $`&FS0]ЏlL#AmCe#.5& bF0P@l@>cPR ECb66l@>XD/4Cl*E~&!~B3l-[SC^ oD,JɢyfR[i"@Ak,;[?-/!@EleB9XaO`tޘf9u)2Fp"HN.쀵r8u0LQ3.:z8#\} <XC!@YNl ~^1.ywJ%$ &) 2"d"'F @E")WUo,}p`^p X0c;&<=9sE,=2o=)W%@aO0j zI~b̓386x8^CL? U, 2&]~8=,n02zba"12a/.P&ǐ0sMCs&e #9Ɂ̨l,@C#0X;)qot)x)U} RlACT?9NC$xS=ȇBFb!!&BY,P {z";VG3VA'gPt>+lRiI /M#AGP3=g4Ś?y=<`(Ɖ9Ș$;Q|HAMj3)VthQTbB(I`, pٵb Cb ]&Hp"bypEAccʗ1s"`4Y `g\ʁ&2D @?f ~ ( μʌ4DsDYrs+&oЋa@+^V79 il,q"ZEVhT>(DA6C#.dB? 9R$3Ѡm0XU.\,P``=$רӘ4G90 F+0UJ vZ 4TĶRpPm%j?(2GaQ_HG;+Eu8,]̺b8+"jPdq6]v#d;~%+Ȧ3H\cb=;*it!;i_#7o挳@z g0@A#[08⋫,3l'=P6'EA}ƶ<w،mZ{LCW+dNzsohr%E~X PKU2`Nf/}D1  4f[mKS2L!# c Tӆr}I:'6X ^4!3U>&mտ#b Qs.]f὚@;YNG32CXK%u#Oa䂀i9<TC a#f?(l<3wQ"_)8%L9(jܩ.@1hbvvc|gv;=W rǴ(%y\XRl/e|a)l6Q`Ӈtp1kQXDrAViXCB Ût2bNŜ+iY`e=VOR? NU!XM0%  >]Tij+p2`L0o}G&X+f}f Tt͉&C[FlY87qs7F\oa2F/?ތ1ABT>,0JY!-d3pÂ@#=2s CvhpLn*!kct`sfM{O8a7.ȑS6Oi@ɼPlT,idz3vw∤OV:khIK\z!x?Wv0Lf̤ / %|:ԸΚ)0,NQ0%8z(Y |o%el/@hj>'ʃܣd6V{h+vvHV<T `6 9*e] mt a؏+L0@ P_l ,aуQJ4.5)4KD a3:4ʜ(Ţ6#'Y!>aa)Hln E7/r ƒdʆXQ9x )xeU"8>x45k l@: fA<yq$-)4fpsKB+2 31C6*7>\p=`K,љDDO-\N8fh7v`F@.R3r~}<넍%!`DPpvA/q.-Pq9`DGE^|4y& ;B9j #?FgfDfzko63PTa^!G=6DAUK KzvWi c.hLXҮL?A<crilr4Q(<@"$=L` @-|ڇT] D8b3(AȁN:qeD)Xs[E4^wx>QV!sdE (fkr< RRh.\pԵ䢀>@AcZEs6@ t}8.4C%R 3MV `c61ݚb 0]'ϸ7X3R pfؒeN #91E %@qOƪ0 1`P/R(پAb>شY= $ ؉ !E`6DlXZJb B!s"MS,D5@R̀=Y~#`{rD_xR`F+0?Pr9 My?̐ak3 n{6—yBq e[ecߠP"43d!Mcڙ$(S1ǯU @׾J8f AH2 $p䇣X3\Xf#, U@aUys'q2X\Ll7烪 zTɕLb/#aJ)mm ᛒ-cÄ'J`UA'Eʺ֗@/LѢ?qg#?@Z+0",e A>(L7QkPȬ0lnD~  EEl`*dDpᇀ"ЎVi,&4H0DG(HW3Y aڌظ[CHLdl ,3/ }l]% $W@q"5>F3Qx9[%.F:bY#Bl`1A#V@- T{Lk#9:PEPL#w1e wp&+cT`pq7k'*z1P +wӋG}~85u_@)5`%+H(}L)tkQYEKQX3'paA:-,Ҹ`qk  a~^VD%|+ q_${kVg!RO&0Y V%lw=>84ܟN@DS2HmS[38ve:"yc&: J @ =L##$u9 RoY@LBOgiMAX{Px&(PM wP0AcH@5ZC'@\6 ̦D@ h u~YAKbׇq*&H<\fe>qE s4^"aƪ(XY$i8zF!:U \P"r'1(3% 7LVn32@İq5cb@ 0koAm* `CqCa9e@#"}b/넀3r0;#ppEM1p|A MS<* ;_r` J#9,Y$ȃ x'~4YKbpmH3Ux1{~DLTNb-V(;ɋYq+ɡC\=yq$qSj'sh )2A<<Y~N V4@OGR}A,2SJM\P11o)3&]Gm  ȑ s B͉<p bN`uݘ618a"ϾJ-@ Kʉں`b#<:'\^"Z0&k!<&POώg;qpXWbPYQ8&hg9 u3؋*@*ٰ+8CА0YR v)x b[6G.pc@ ༱/kYt u$#3CV'+8 Ze-uA C EFcosgڠ5/dD xS7k}tʼ@V ?SX,)\ɹkQ#N機Ugܶbs3:)oP]!F ;%p5Sf_i&&``-0p`xq=&N0;&!*6|!@Ú'ٹMw9˹\F&kprbRQ1a뺸G249*b9TG?gхZnoEͭ"Ah>U$!)`Mfplk$W-QyC56acEP),.26( :V:.b7_AрF@0Lo)2LGr<%l \/ / Zr;@N~9T(ʦ;R߱0`XWmQ],(d_RdLC8S7,P7!qD]/Qĥ,C6XQGmpY`WU7Af( B|C1CG2Ɩ@_Ȓtuw4K^Qr9 ɇCu<0fH t\e$1` Y@08!`ާ{D+P;@3m߈n >x4PI~gn4'3 !؈hv13v"W/ٰ6zM|GFd)f0"<er+XHBxLߜJB6Ks7QԭqboRAv _hYmqUvs7$.:R0诃 %DdxG48DlaLP.;.@P?9V5#K&0e w76HVl0/0wh>dcJs̪2:tDXex+!hK,h`nᔶ`5a-@F>ývC=  (Ť_F/\C"Ҙ|v#5KZ$I9(a ܣɆ( Œ8ƈD$IlNL;9.&Vw*0cl' 95IM9f^^={W+љ3`AvK|NsݜnT(I'2a?@*WXmP:ƥ,0R0݋|9,fFslX|!p/^{0wOy.n4h2֥h ZL1#0:azKqKcXJ m7b^ B! lQψaṰxkV6qr>cd,}rbk3zXԾ"f Aa?2mDʻ?.榣y#3PHnj'eZ18@ uopCvI=@X" ,1SajBpQ;; 1מp̻^ s' #6GE|Xyɉ_9 piQ[@_Vpo"p$TAd_, D 3\|?~B{Z7s ޡ+H9sG@8ŕQ6 @h\N/pxuQu{Wj0A 8e2 g?{BX1n` #Syơ`cRŃo*;P?=5ޟ`3^Π<0ruDk[d ++]Aބ&=TH8s'in+7`A-Ar b7 .V&<@J z@9-3 ~ CfSNe96ۙc@[bYH9e ňZlfjg|~.%3 No" Tr D !O+M$@ {LI£BpHH]Y`CJs ԹE)6Ca3&*^ĭg|tKX.=gKE4iCtC9NQ) R/0. @mW!yL|æ+H =q@ۋbWfsdGň@aаHU)X< mA/NΆ.'+TΩ7s r-dfcS@<۩.!5)y`nAYZ/[l.!r'ɣ0t!<, Yd>< ^w/0eb HcRh@.0gܼ-\r EA;?CN~f'-Y0B5(Ns@& I3 %*6C{ 8]"h Exdy &d-D H% DN u>$4;ρRG7TCD U 1ŘvۊV_h&,.(2!kJ- Q8J!y=ZرU^)  ӸO 2B rFt gKԷxg00g'>9YыRK^B`pn,Z>{s3({^A:\Ko(QmP`\P(ؖ9(kR0,0VWpVERAqlQUwܪfq̵@lsAfj+h˾*@t@q'Y>q;8=]K3^L"Xzd‹!ca\/d( >F@"3znpPY;!.&j ǂ3C=vDH|DlHy2"U`tYm w,V>X`>.\ OLD@7 B35`Hk'<Ubb{U`ѕ$$HE$x\`*/V- He"57+IsgeEBҀ0-~@ '#8  !+Zf#H@u"58q 0۲Dlr JOQ>*DVC1lx?"#2!,kv$ yBq*^3.2%*"uqfh'IJlLj!(HDVf0ݲVt¤O7t ?a!M-Nʞb,8|Ivvt@[Me#*@v`q@yʙQ8C_fO?) " H[%e8Xr|\?U|GJ6!Ga@Z %z( Y`ȣQ "u# ˓]@E?Y%*95\A-{BgH`FTjB#ZD 4b)Hj2$ϓ y)Bpy(y0q< /$]\"C DIW}1т. `Ϧa{la" lD(_B.f@ s8ӥA 8mtu 22sGks-Q&QrmS +'aYL lwBk4%AKًL5T?Ds|!0x5!SAӹpP7Ey& H{&u eJJopipo8[v83h6`o(؃vK^[@,bh ;p.r`Wn )$Ém/r֗>5UZ0QP *g!aQFvb<@iTX3 rpmH4o\O>'&\j q0<˭])/ 7rʝa q=CV=%n- ޠJ@gO"Ls80O39dv'B9+`_;698=Dł2S0-B H3_%@7Fx`[qq-EZ B'zzq/ZzT .t#iZ,{qLP؛}`a"pAAvz `\( Yѧ3c,\~Q\̻s' tڲ"?}3+`)F2f$\ $Ef7#fu6 !&pPmY&3\VU``cAChc&T)v [301q c!fcA)X - P "O=Gm"4@mϩv~f4:qAcL4SSy[)Ƹ@;KhxY$dETbU &z )b(DNzYa8L /00>e51#4"_ѐMF+#HVa.E_ܬ"K ae)WQ궸C#?+X}f(񛆲q$Kfa1PΌKs5TXZH`Sb@B]j?r .xxK_#pγ449J`]؆9=⃤_sO|0(p/[*UbX$deI-xI%AL6awp3,"!@\LJ(C"7┽MrhL\2XZG4#.̄&u!0顢i1!Y:W> 9.:DE[^)piCu}ь5^ f!Qn;l̘ EBQ3B*l5JiE9\yyX#,( ?PNUx)e b %Cfe歈 ̯ah,)%tN9LC<\Ⱥt,} .`TUMrXvQ@7yVOr،mLwm|_ߋ^޼)] Pb!;Drpw4.`h^hsxP?46)s%8.f8(An =3x"V(w<[w5~82 Jb[rVF$q[ :f}(#<\`78HE.F,-;0r |bU" <v?ԫ(lSb?T|W ՘Pv [-q0|Lpť3e,H[ݏ(,rNfG'K (ѳG8}H3*a "oٚ-Pu1!F96`km+0UG ƎѩTԞ ߭&P\'V /+p:ge-F Aevf;FETU 1ZKĞh/#g"Mdd ~'֠p縴#( *9Ѓ(/ S(Ix43D(8MÞu-ܲ8w/cn.&<=Tij+ks;2,D<Ӟ$ehAfZbsW'BG (Cq5gVlX:@C8&I`-LH"@H̞2t먩B3xTPr#$h{EP odC&p@s,l(< nY9 4B6?PG{!BVx$ d=:pzasDeYd";pԾr6@f.Rk=K1<ahVoPm=d\.S+²g;Ƃg:.ςމܣ,Ce/O IEmnJbҗ>4wȀn,c@@8?ga_ \srs^ u5hsiDg\،01ycS*& +;ST |KҞPZS$`:s[:DE r*0w"EH!(̛S(M!80T3xC]E{86`/IuDʃ..'| B،0eeHP+X! q%OI:'1/ ɗ R.f -2xHw[ eD 6vU8aapɈl ;V\X夡聯``PQpdt@+(PL E{$R ̺G'K4bмGaO;TQƖY?%_ K88~jhZ>b< #'_b"$/b:`y:@B!*r.efnJv3qlӂ+ Ȗf\R*l Q|V~Gʧi逻 q/c9)s-ʰ`6\4vs溁CǞ'mm (hǓ[1ˋ rLP rX3FfS+32?ȧ@aV f3^#a >:hCG׈.Z2t&i+l AFھbhc5B !(DdFb|y8R̝0A920jA||i1B mGu*ّLk@!9\5-'H85`|w+00!  QlP' l0,) E(PEQz؎n n+6! !@3 +&  *NxV\s\'(Q˳QQ ;F O& @4rÄ" j ²3k]8vIua*UՑS& Ag ].jEɃ+s;!3b6Xn,:˘pQ:e>r#3$Σ9? ac^wUSԫSq@d7xbs_Wm,SeaYp|=M- 8$wY,OوهHQcO+& y0H`CC̿)c7c^ TLKh|¦S`aBWN_`M{lO.9fX6eXFDLFlbܴ^&ùEou2 &iCngj>f`@ u?p` I b؀MLU%u:Jؘ`O^y#0uG5f66Pd; "?,̠e/CXkxefqKlg8Rxx0p$Ql8ܭ[AeO̫AuOHm<*%'3z/[1&45S_}` bq`օv~H3 6~! @t `cx|!@Xhy}9(ڞ43DlnWB0{?oXD:xpI-T1f (d7*ui,Q_p#D;>?cP" Kv@#)R!8 nDB3 (E 뙺-VAbh.b=dQ?UmhSP5#>hX~0wDLV]2Qĝt40 HJؘb؂^rr$[ªqP 3K -:cR؜-n1NsM@6~э3_o+ɬB@E/l:(gNP<4* l$sUfUF9 p(>@w!PHerPt11͈ QaP&f@GĎ)z@#Be;6Hn$XEE'~ccÃ˿UGh2(df>j^eDܦʀ 9=HEG`){}aب%ḍ Gs6XD"#=)^ǃV$hp{ |& 96 o9cќ76C0F({) 9"9Īp5łlLzP6/}"-p< 9F[=5ƫ)8QM B;Lq`,@Ȑ 5qVB\3*QS<ڦa`7~~gL\nKǻ"x0~!񊀁?/d ~5U/a ]0 dqԌ3T-Cϸ!6WfV͌ ո4; P. 7),զhX SOb4Ҩ81E5f] JfuYitndY#IO3 qSF^|˼ `v{& ɶu׸UPႰ玣4 p6!vw#b2aȊ$нڌCb9G4[eA?d1:q%b\&i;RF=MRbWwgjoy@gyhSZ/~ 00 }=s1[[,e39P EB,уҳ11nL`&Nֹ^cH5/ufaV6F͑7SEN+`cY6K.;Hg@@G& bn8hZ+"S_aG& AElC&o-ʟ`PQA^=myBWSCϧҕhxK`a x_1CLp;6L@k<#&R fp`@K¼m>!Hl"\p0Q~ɢeh2XՆόH3bż'4;fM&3pԋ@gqΎ ,2JUxy~~z.xm+´m=r)p6{_0\zh706#! SG ȦG&rt9೤&\! DʉZAn#;N'3u q4zP\<8iZO8& ,;Sn'K,P3hxL4K'*w3,P:>?1,`G(T71gLS_pnKPb.BWԌ=7pJ$v82@nwٰpl&8AMP@0f4CV T!{ CC+ x"R lN(N}Q*dڊ'+:َFT\߂! eK;#&AՖFNm qU6b3grT>"< i] W8ݬ`fh; +s tčXna(,<2DŃ(`!sǷ ʹօJ"jd` qXniݕ=b}=-LVxј( ;pi.*6D@ Ѵ akPD,@IiT OԚ _jTaP3[ruv7MJJCަ<=hf1֥'ƀ;rYȯxZ .%.Ïx2l Cz`6g14e^!=ȜP Le[y3#xK$ů"fA͂Ÿr3A&$vbBC% nU*sL{BoF@YwX|&ag'pF'V FEpEG^ sKe,d@, iẁ~2J -PLjStDp|~G-{t;c˙*/hmfQҚ9f i"{184ɗ xD"Cpdr*hKf`S>~uE1@n?1yBpzېCpZVZ>eNRhS?~t!$+^;` SkQCQގ u-qK 0b%ȁMs#Y\kcaFWk3 yEɕb~DzӡdF`4 S2cP `DZ2amB jÀNNNϙ@>ez͹~ PI^jLM8tjE`a Lx8$"%·*KBdħW )`02F%gz⁓6'q?:1Ůah :> L|KGy`OD1;l+S$j/H}#]qơftdˀ rg-&?eck*m@Njcәn7>)Ub>A洢'';a?|N߈e謿"R?/:lt+N2h&}O)T"3)[E1,|({4{B9> /DY`{ryf!…b3z]F5hl-Wj#^){x02Х`?@ s 0$4,nZ@a< FcNۄՎ ?a&Ŋjrl7F x6k@Q>X~ *"  U PC!y3:I *`<~aijO ڄ㒢ϱr)Y3\8Rb9 $uZΏ/3#[$PN09Y`Zџ멘$1a~9Pjn]ۄ`_PA` DN35ak_D N5kܠ0* \Xʅ4bzBeC5 %-ۆY-¼fBStByJE#x&~` E5يu 8 A@71 GB?x/"-9-q4C"RF(#tw3xdy1-Crs*e#!må2 Q3U\Baefp&cn8ZQ.;C@S˃^„1rH>2,m019~[1>pR SȦH[:1Dy  4>xڄp4T$_ۏH [W_0X#Cm1b0bea@gN@8CJ 3A;(la1ՂQS E(ש),#'a DBFOaTÝ@ >tӧ7Qp',AM]0ISqKzFܵ˳x>VD G'˔ڂV;f Ar1c=7M&N9D4KVU@` "X|w:=-.fC ;"IE&8qClcێ~Y50%Ƹ9`3~D$] ]Š}rB1 s3+1o 6\rA<ܱȾ|ܬ€+*Ў澮 A'5`nen9I,ƅ3HĢQ|!2.?|\!F®bbS3 dܜql'Fpw˺:N$n Fbpg:iN'G,<@#oe.&/d" 2Z!rvRXCkrprF&s <0 v. , Zu7<`t\۶F %A1ޘoKt*.im kC)/ck3YxL .bTZCc5`;\\:+vvJhg)5# /(YqmPnVpnaL{⢂ wP2x% vzavuNSnL,|(7&5uLi9 )3V̧f&e1r!Ba xB=1p>Ic >gɅ5Z8ҁBEׁ?~L̞.Pj#)CٌlZ)>D YaÄwwW73d"ѵ?֙l]H MvAS `2ȇ(l¼Xotb82Q=JdjX $6^E-1! "@yNC=-l9s(V` bWd< H`D  f;@^}RTr(_̈( lo\us d9 qѢbM~f _a1Ne {3`ڸ' @T0 |.RжIbq"N鏳;~aaUȜARkͲx V|fZc@ LZO-Vf2}d'f)(ݘ'"S-U}fQ#.sќ{+tM -AMHU MdjIdX@pid8hŨ~l. zau?0P`y޽Lt&ޠp6YB21'00jȂrBa[s r&b { U#f2apԦ`<%:?H (i`iRv K[A"6aȇ6]@kA90tNJV}&i02ncplXP2ݘ&#5|i-(C=K o}Ci.A%WX! |n' r*uG3;%$ Acl!.Dw1GA<]̍h/yS=-T 7YL|7#f< Y.<:S!mv0AcF7(lsP>E@w߉DO$c""GB=ܰ |A( *2`d <;V42#@ ԚQGyNvKGV˭f1a -!}fC]KU %'`iU@:jq^de0DT$^:Z @QYIJ2Ƣ`6 m ( W04BᶋAZHEoBpE> Y"$A-1?6p#̐Խ0$ʩNG3*Ҍ`: Q{Iֶ74!6׹wUfQ6B)m|'}s6Sw-O 1(q6 oG#|!L[Y>:aX՗1H1Z$hV~Jn tV;b&չP'CM(\6 =61$xT(E>AHB/0{'%P9( 2;,WGHMyu ra u-2,;b/hp&R|ec69!KȋP+nxq]˥6~M84"]$ttԱί(ܛV@*10>60|JB C+VKJ2*(. 3XÄGUTgrJ/C ;4!R 2. Q`8 wtO]u/E~|A8a1Ȝ   0&ԸL  Ќ`Y bc<&sOUBw-AaL 77.w4'Q7d/Bffe-yuKc t\f\СG4:w d-k "vf( (Hܭ6 Ըĺ8Z}F{00%֚vj\-"J9zC_3 NfLLٜQFI:8fŢָV @}J87 Z-ys8hP(-raAM~&9ש AWzUK,P0NJm[;,jZWyx.W^w(zCZ ?pߗSg1y0уlPt- XCFbb<60v P|FLV) ˁΧF(=ѐsω\NC7Le @טG%x5b ୴e_!69FRr[bC?jrc.ahS;1$YJ@Vpy6!Gy1I `FLFaE (s !KYa#"@[Sz"%BF2L3#%3̹PB ހM~T;֡+`,B /f?N=)&vsQ(~œgť`VF&=2-2 L#WAå>Y_N69ք+5XTY;j_q6HgDFހé!23PJF[Uo4?D-^\Btlr<8JELOyqL lҰ\G`3])/Syme?14w3Ft"Ф^`xpDa &[S24q)DI]Tr=~UҐ`,ʸyloCN jy+TH.!R .:4/;z !5Pڗ\p|LE,=C&,(0:8S1FpCg .a^ajt SgĮa\dbs{afܨvPj p"hP€"X FŖU N*:1B*l,16wXZ Pvoؐyx3rle@]Bm'K-cLǜkOsP@t hkksrC&!b`';0|£\幬T̆>/L׸JBȝ-CkByjnx)`0 AVIl(=5Jf7q p`-7PϡAelCz _q. KvP(.fZ3e4T]n w҄n|w„vR-GGv ̦%|aJ @@옂!d+ h%>X-ABitP"C3g Av27ȩN! Fѹ6S:DA A q96SJ50H8 5%fS%w|@G-#/q<:2c4,qdbĮð LyQ`"2%r3 s~~&Rs*Z\,!"i›=DLM(5 d;+ #d"W(q-SQby~u @q3Eșh,tÔx{h0i`%rsUέ UܬXh  xsm l?+dp~u qsTrccKV RSh#D ,GUYwBh+LWeE-%ۉ#f%(@z.G!|ٻ@6 Xnmlu/2(j=Ƅ9yӞL ;E344 OaD6؁Z =\6  LORca v̓2xD^Lj̺8XVT7pmb۬0;ʮPreT %5 XLlsJ"D"O`4 ~g %Ƣ *-`AA%bzg*[^ 9Da87ɝZ ,Ĵܳ0:0_KA{CqLse!. A9aCAZU͒T\P8dAg,~-MF(lB߈\m8@2n >&O QHWQ*Hayl>u5Db8xkpb6q[ ɘv(FqeBŦ+m1\& /&Dqn4#m*j2]$p%O،=e@5cxeROTRn BM>?`cf()BF %xӍ2%0cm(AҬY̅{$3(Z R Cn {ΐK]+:o جdf#D88MGqg0cGs-G YÃy $U]hK3 e+ 12F~F CB/o G@̼Y e_A`Ń :WՂ a'H .0ˠbo64r2h\,0S/eoJ F׹yg]8,w 2%jTLnSE1  #8L>ʃOaZ89* ևT9 7e͒= qY _^"g]$! C0#\TP8-*bigP#BliOPԺ {I8Ɯ ͎ mC%i\ʊFm>ЉY9T?cqBaՄY1.)omy'8L Alb&8 `B r -%ѸAp)zjpn/>K1F3{36bĚ=C"oΠ 4e AϹ+dM5> m8;>fA!1GP4^?7 Rjc5Sz."A WX{]١s؄?gS: rꧮfQ8VcR 'JǛ89,01``=!F͔Y#J؎`AG2G$sŀlvT(Oi!a$;. >#) _{y!y9X_s :+>eN*!2l7B,i=~[~>!``";2rZP#/#VY gDM m35 :sb+#747B`^@ö6%];.p|\!ԹVGQ7 CR֬B%@$`z? #p 4nWTXÔd#  &?ppxKCg #ȍ{q==,)X2ژ =Bʆ"9眈 FGX+`s7y:ϹV?#WBbkH˖d(s4+@%A1.JAf$PH!Z!I n2 FM7b!% XB]r4PG3`2:4{0gACgū (,\LQ89+4dhiJV2!`F/= V-;ƹ1 ܺRr)S.iVV}ASs,ި 5N*::b(|wLxP9CiD n/aQٸR]&\sH".. ?3=nvg8D&'0L2̙11`r;&3H^h4*T++Ɗ=`P1>ꚏLÚ Vț$Q}hˀ &vBVX p|ɰMA "*yrQQ}9XcfRGh͐xBqDJ|V bB+̫٠g ̥ M&S 0A04nIl}@RØy;`c&? (1~x+9c[Nڂ)۝zʠ[휡2AK0S@[dȉI5[909j]EQȇ{a6&8M.‡(Y uHd,W~&u ȉD9t_"|-=穤u,Z/T^$?bXeXfl2)/'5Wn7CCc;i׼=FJ2M`ض'` t-0$!Gc YS['pls8&EV (8, ,7+Y`~ D^$y$\gTIDLoAeE- oppyלaq~Ga4 hC>$[MдVGSd-9 2 if%e3wf/{ l"q*~MZ?dC4* 8 *9][$]JV66+h73L6X ,(2ݒO2i e1UO&hZgȗeC]F|sj#)p6qdN Q3\SnlXuCѕ$7\qP#6Ÿ:"Zæ..H d%J,+ i ,@+3™dDBPZ`p8Ĵ9R+z1`&ӽFUe0Bd=lܲ,pde$zLTiÖ9pdr|O)F pL8M&\]!F((} [Mw lC" C3GNZ1>7c)u T'eu #4}CRNy(n(\ D//nC\Z&-_FZKQ(?GׁDRHO̓bJ_D‚nE$UiEf6'NctL`5JS~q TP@ f= ŽE-Wv0WLJ3 Bes.n|(0O.dRbhG%2-x ,p H]Z3,_n,G wTs>O%99SB0ȱ0 J}eUxB.|Cg['S\|ˤg"@A3(QqUUPΈAv=K~OQލSHa^)l=|g.C`䪂3P;s5S,}KG/k05gԨpsj +5Cӈ ?BCS~hHӌJnu1&" Z/n`pOfj7xԙ^)'8z,IɑMQr!_ OcAGyp'qTI'0ؚdpN tN1€Qbd"V1l';Y/V-!-,`GFy͛ˣ@rWsusmW e@C+љɉs;ZL 5awdq?;9PlDԦ0Qd&e<Ĵ. t\߻EscjI 1$[b-;(MmPAr^'*F͌o[w?rg !*LkamРpq+(P%~ȝ#e*[$SOrH,7G{܁~=N1L 7Gƕ~cUO3?,oC 5hvղǓ8r<8Z{a5K/GG|&D 7Ȅa< M<3Nc8JNSFb(Zc7/(p_pf!0ͪks3PQ3(K8L8s(y,JHg;!N8?nܽo"=k?%qT<.*K 3rM@#&]ʀGO5,v8P)aDXr/}ݚI,6?0?%(riS9'`,~@,؝1phO=FVb؛pQdjQ;@ * ZiBaf &~0`˿zL\d: ?&i\|5 y>fePf9 TI{G40I4[7> ܎±8WpNqTf&p1 nc/mGl<\@Qa2YL 0!ExDRĦ$!Z:1vѠU h̶WYCv d/Y8/GP8:f)C }݇<$[(/ΡyDqhfs"<GqJ22 3BȐOA+du.,8&nƂ0ZPJy C5>'Qr\Ą ؄. Af0M611 2EĚG %J</וꑉ\Ro='B”p>}B5fL,|9^'@peL jOB M(]L~cYA={xNYsP$ݶܦ7 &ˎ^5^%%BX7 >+ t&Yȏ~? Tt!sUv01c&j>8WMre+,1)=8S{ "2 vݲ,$;@D0C/% `nC𘫐̩#cy@qkOۆ+ `mS)j6)A $1@*ٳ̈́}66=yt$@->_18K D)K 7"8h<0|[;E\F) D|#ПhNJB ]Kd'h'3̨";P`FCDYP0`h2+~fe[A-BB.Y feF@j?'T*DŽT!ӕ*N;U%%b"C)FK̇l' H 6<@иSQJd`أB8t\EF V0-dq |@˼I]EDLxR *,yw8c 3ր zðKi9 )OHfeA GJQf2˩Ay>P|B;yI6>,K ¶wp=!oAg|"Dx}Gx9pϏGF|uY3x/-1mX[;*!\X1tA5lmXDuc1*`9)2-؄}C_E-$K *̶S"l&0"̂2yQp VԳh;5 6B-j~欆O G;Gkov}D2Ұ =gA0̠Szmn4guK&5,l/ ˣ"(9clZ''$k>sqsɯfiOHnBJA0`ToOyL%pNj9S9«sq F7{?. C!L`8R#kJ,",,;0^LM &-&:ب |_Q# (,AcOISp\-g̨^ErL"CgRL`ԝ UvlC/?qCC0)`(#0D7 Qٵ]"$ FeGa: m*bT0-}" \y,6VcȒ (6@:R،",pJnP>W߅b y 5e*4,f!j\AEN-bE,bU:;[蚰dttkTd+uC6j-D\hJ 4n?OGB;_S\s ʡGT=?%-E'U wcdY< =/;:9FL93 R=Pxv j,m w<[\NM>%uv4B1cHEZ22!Z'\obd3@"SdOYNE/̳* `ȱLs_| pբdae5 ,6^%LKd=L39PT+ 0p㣡3"0@xiXd`eUҎ2911Q` aۨ!(TIsb^~2@">LK7E;d !=@#)kD%y K <s+.>6foJ6T:Pch3nVYXE!g|C 8@--wp9f:+l/!{qC#UTylRi˚-KEj`$)} =g^B,9&U4 [H<3S:\H j?g$+06Ԩ;BvSQi),q% +О }G+GAYB @:0Ǥyi)dёspfAݾϩg (_`δGxCIƒ>h> pYnڊDlñ3ǁ#<}LFDdlQ,i#~7o"*`³pcMpY*n/pU@,*Shw$ 1 vh wH&8Qc Hz 3hgѱ;Dѹ `8JTq3'߉{p!$Ҙ=ހh" :%,Y)b;">@ $&A”  C\Fb |Zd J ~&q `A Hȃ>X V-=2 l|D0Iv!V a3n;'BbK")%jl[C5 ' ._*?DڃX=[%a˘Lj3+j' 5)_ӈ-b`>H@nXdNbhI9~p H-TlcTa("~+A.CU}4.* Q,\pART eNI{ |&X0KN {> ¸V/P,u>KvKۇ籁m r"8K8 hRO710lSYCJ-jJ6TQG15aH!g%1bu*hNc_vKg:<"*\B;` $Tp FwJFk6$A,0 wu 6@40Yo s3[bp.42B` (&:38# ]u a;FO6Ƣ .g)q/Up83ؙI!b'Ez0}D,#aȘ:E$Hɓ#b|_Nj0dY#ˈSad?JЀ 5 5ghk]Ry|R#E|q j0,!dds 5; @)WEBXܿ :SexH`f^!P>[wraJyJ(#s<3`ĕBGJN2hboCz\LK3!߈f_)m6-e$gjQ:D|[qmYvRS#AKW'PfZ(@g >vC KVF!0@/[4b;sNtAV\$6 X,"vH4N``t幋`Rn'_"0 \-26].6MLœ* &  Yi buN7j$0U6 +yaK7z̪Bk8\#f JF6N@,Nv䝃@` }qBYTBB|qHzB&te{Fh5l~ (r&.gy#NC*W0jKB"@9sʨq $ Sm>Dhg14?@y"pB  fEEMt jA-G 1W1+m@ 7b-OZFx`D |R ؚ&,{!6VDlh&yet,N|l08ARI , H2") s v v*60W4gs*lNQAG8>&W+ k8-I׈k<GUP:b;Mpt:+wq*` B貢 Wf`S ܠTh ϧɛrlRfN=X*khpxs NzM0@W l}Ŵ6誰*#a2 qtb1ph􀘀u`FE s sD,(|`x`̐l5ERB7fآ$mLf,`PQxXډ|#⅋Сkîp‹@-H{AW#%01m.'D1$aM \ElXr9\@풉7X"lfH &oL\0+\KΣ5QAsԿou͙G*^Dn*[b11SR8r:*`0D=k[)!l@{ Ξn;l|jbj_b,K! C.2+n`40J~e<ƌ8=V*嗛!7wc)҄Zwt)a`a{Pێ܎Dr1)#IQp""T KDN EJH0#ٍL̟$4p Vjv]\!ƨ=L`F\H fІ'чHʎc~ qCgs;8pma22,a7ype&O!O725N#4u8g@QSf `15SBqDZǍĬV@<"Eb~iD%-? Xe] Bꯀ~q1S)?Bܦ X#bb,Vٔp惔|ɜH =`?e/S2,Mp#/X3PR9~&ebcv-b8E-A׊#7% D/1M(LRt*q $ge R懤aM 6YiNc dQǙn`%B%F*[vcud)܏ʘJqʑ|֘ 51.-. T Tu{p~F 쉕Zgda{@3lx|Js*LB|+_K3{4QK,fS e&(2# s0o }a#J)Ƣr)CGk q4 X7y`W \#Q]0^44A1΢]ЂڇGu oD#( L^FXv,ȁIOcgc%45YIRm %։2,=-&SH0>/d?h;i3rF `i jAv#f1@[I3(6w-2šܢS ЇL&9ˀc_h@*`Xp$1E:e=X62?qlw̛$N =OK$f"D)K=ڋ= KDP64x9 KpKG gI5\;O&CΣu8 8:&"p Wq2P{A|C1ۄ(L sRfa6{uEބMȌP8P>0`#^$BRE Di!MP>%x`@pYA l:O3>fݮ% kl Z& TȰ> ̯#)d >>ZpP@ p/Ke >wn)9l$$QuN/I`Y F9V@/ոXF&|y,DVC@`u!;2T(&3~}ۊ#"twY2yu9 ]\!aZQ[JOt Mh4ßBcQc\ЍQ]6'hpQ/2&*4^c9$g'"([ e&D@"! bPjg<-;Fcn,+zؗ8lƦVF spA^ 7aNR"@eKcham dcexBj/C l[m6>Ĥ 5D2:S蕅0+?è7_(+Pu{3V'xsb2\]5`.wᙄ ?pO>N {NbiY{ðxϋQPCQةxEʄ |&XӱN.fP] +kF :hCEvQB-+@n&$60׬VԀ#8 fnV>#63-8pBb ԿB)%L)Efd6*pi(>_ 5P85:Nn(wBނN0(ѱ !}HtOLH%f84 -.a 7 `ls,dZ:>+@23$h,Ԭ/e '2~ tBұp)%/xCp#vzӃ64A,eV%2`{퉑g `hC,4gb:H[z# d}<ƍS sDC71HcsڧlB <+N Ii>| SVyA.=c3 "ƦIU{l @ W=3XÌ(IoG umYZ14dfdx9>;1*Mg'p1SQ/ts3h}ϐ7 0ed|r PT#aT 5b(T{R@.\}sVe2` Yf뷸_M#%^g Qn'DaD9>@}C L>c  ň)a;fSf‹@T $٣&gȏ1q#9v Sz&WC"0"7f# urH #&FZB&dZ&UpX}>&|W`["&΢3\exXpv65@T2IXfa`AyQ9WLX @yz(yx,(rC;W05:W h k0Y`!^flϡ'flr@*~Y&*G);XQ vEA89Yfw XS_5,4"h`.P37pAX{Q0 tj\s< ;Od|M6쀇3"@^2r\ !ù="Z'6a O 6\p=\_ H ~Hx^a)*`7E>2:h%A V^ n;bT-QqHC&<:@J8,h;^V?7+@l(VnZ=+" &g}C`- Jw6f=L A `4faPrr8p5;)`\1%xM` BgPW1s#i"P^[t^ 0-mXC.KRXBoK^Y/PkmbY!bB tWX!E \[++#ea O1#*3Fs/ G9Q< djyDj|Q*/VD~#l161K_14!efpp "T-*i K<1<+(GBnEl\[$"f ~O}%I鮃wLkILh$ "Lͥ6n|dV+$lclh@*LǭNp,n*|yf#`*+Ƃ`wUєa`hWP5 )?6y^'J6[&% !btqY(%$ b2w>|O}Xi kyngwQ N(2=;D Dܼ؏fFzys\%Ǹ}k6 VfO@g_Ѧq0.IX LAZ/o|L?.4r ??vaj%!q*yx ?߂$n!C)+QmLM&n# Lr)Z!{Lx'`a2뉙T_/ XK5 rxPq2 GRJ1j<0kZvrBpqq3!@F›M eܙGn`:O7ݧRHGL+," M T'3,Lg`\9k KnWAqsp,2ؙ+~E&!nMA_b@0Et% gpXhbuf NeE9e[{m`F&sݑenh`CѰe[@ ,dn&h6R"rXMqqm pmBg @HPf#4rt?{8`(g>Hߓ~TYM0P?>DU%#}&e7lRT *k#P_&t<Cxn`6oM]C7aH4AǤ}0hYj-Yr JV+#dun5sc1u\ܤYBqUi>C#^w?}Jm?0K5ָn q| `Pˍ(Zs/1ϟH̰98s.{YU^Gξ9*nSs59JҬ? 0qZK,:`3Vk=Wi 2PL( $<~ K P@hHBbGEfxe`58eB"x6(qAaX~=,v M,! И?}g@1br!,j"x*`&,U l<0 ǏtI`9T1 J( `0W(D؄"L0.:#7 2ItI wVQ ڝx@N:Cgû%s> 3!⛺xD 0LLqfbj L'^VG P@MX! j/5!Dbx!5,f! ,xQ/D{, s͟ xHbObh~DJlq c?蕒l .A@ a2. I.S£bME(Ɏf,QpRJh@+U<~`8v#XD 9 n 7(ńpMfTJ8Gxx"x3•$٠y 4ǖEj bzsZb90\&/7LB%x`CYKpňw }p 1C)25(\,kAXk{ڻ! cĀYR @|3/C2"Y^)0@V.Mc`5ܫcҳ2u`a~.]0  1Cx@ =?X͎xqŞ LH) E3M/ XF8(;b+ x0ņ/ 3S-)& X̩]+pIh0&,Ja\ "|( 3*_h ,*tQŗK8<%MH[=\ųHM6"E;R }<Cׂ,8XgY"qfa ``RN.)0@^k2*DsE1Fo!5r,q RaԸ1bҚMYzfC\ȰnXNȦ1 <"A BI?4tCa H%W,$ }1R,݄ǚBś71&TDx\] ` ,1H0C*Uo1J.w jSBOt  NxϠ b_)00=b<1wkB7,3栈B!tgs1#ܴj!YjI %SL~,+3003T⽂$hl." pUhA&{s#4 D1!H"!& H) {l<[)@ DR@̰5D蘱 Of71j]SL܄BWl!8`;ua&˪bqD|c2)0Ɇ+D$xN),HO = LM1GIpE?XĖD`>Ʉ,uY銊ϧ认 >h*ntJY4eAtD-hkE{J9=ZxI:9'sr9  yMuw xA{,e,t^: Inxc-iS!K!b̎bSRK ⪴4JA )o} yЛbMJZ_D?kd1B8eC I(D7;'2-??VTV6cz\_M"śdWO3!| {?"I5ߧUJ1Wa8@Wf~JD *hG?AH%2oD̀IT,F?a^ `K,!tXG2ffL JYd,♽G;kdTx7(u3:,YgsG3@3V)!1A"Q a#02Bq@R?:g"`p'Z#œd2VVJOksHh9|1$ʈDޑ. * ,䢄{Ki"%L!K;Đ&PG(g?&W%H]pa4/$Cv5,OJ,6AZ8Ӓ[&>΢PӁ~eAZj>OKG!Fe[,k#IQB6lr>2XćDĈPQpQL{ 8ԳL pIKv]jm%(%ƲeTgHe AD!9[s%BX"5Τ)zLc:%.Iv%x(Վ$}ՑbXڡ mC)ٜ6Ί.Clf/^Z$sb!!'z9$. "e YR=YJk,Ee{ &)[3L-C$"1E%Y d^,x(xfYrq2T5ld]Zr7h\t5 blǡ;XD!"S:zyrmS'ʲ˴)װe2 BױĐؗl"\!e 2bJqqVo':N*D.'z q"Wٍq(vLiI928!I-hB ppP%/Xp6ȢOvl^V r;%ظzjHŞbBvk9׬QHLtbv7GLc&g_uS.4䳹2Rv9D7"~Ȓ=d^9e49CZQhkSCI-KG:CNK!P.1"IHb3.Mwe |x5#=Y \lcLO._ rsGTY#b%-X:2Mb#2Iiv.E/rTYc҉$KMrCCPO:BKY.$'Y OLm\=[Җ0$L2ceY.ň},bzزHQ?dY99#$1)Q㌍"%rH1cr>+I5bG+Sq uzzaBG"Fq"Zd,j zF%~ai#NBnqU6ˁ~rm]z$:(LCr9H4KjAP%.D6H?d7(Fl:ؕ9.H$. .Ū. p'LPN;ؚV+p)G_&X. .(GpK&y,Q.d̋e{p}bLO)jbT\ 14bxqE"B|a 7 qJLp6_5OUB줒 DYEO#*b%NY (& ,)hKZSBY8>#)X1h|@mS!&xƱjEYk0SjV 2;8&Y\PC$VJK%lL#J-9QGX9HSLX2̝FyOhQj<HV 7zP@#:c%IPE4CIV3FdI"!L*$gE@'I)ԖζVAT(>:+P$#+W '6CY 3bb\ :&%TBKƎ id$̛?bw%rCX|MKFZ޼Dyx!P؝n)HVxeE!5hK!v,e&{K$J]1>5L6Gm֢= \nN ,[%+]I$:$HB,]-v֐ٖ%y2lYE $|}"p3ܾBC)rؠK_J%BtOG}5EIJ*XNG$Rl[ycvep)<|ȅE8bCdA+,zuE T @9c%p?j8DcZb1 Q$=1*Z $\~{dD(ZQZWD"6N#I)(غ|ؚ1|x6e33TЏ* 6Bid/GJv.ZzDzsʚCeDv_#JPɾH~ڡ%91ϩ- S,8-&K{O Ug$q(dZ$Ή66C-XgR|d9!$f3"2vȉBp9I!H!C(O#\DF\, ;Y G6#ˣbş8.MHԡ)D2 ċ _D*,^$bN9?ቸDijs#T}j9GEAX؞'ZH"^O#\ ƨhsGQ.pB%Dr2u 퍹zJK|%. C^~,EpTyIṙdE2.6Q(cOyBW9$ȒqY*?AХc*E2;g‡1Q2Y[oR-xr'ʓ9P$(Gg)mƜ<"Y=$L,|&GB̡'c"Ke<%)$Ũׇ%Ȅ> (\#VҟD߫9fԱ,9_Q{,p&iFȴsCG4&|*(-.d6%BZ.\"mjeBB)hsb_.u_ yC<=PEI$Ti JaHctSBN- ,#p]<1%-:.XPcjH!ٌKDZ?ġDʈ~i 7]m$B$%XdmKbz2OYS#3T ptpG$4B2|=] R??!r92͑-d}hɳ,ed5͋I,PAZ>IV1gkIPrK@E#bZBG(?j& uZ9 Cu_dI_ v)|U7Iq",d]#)xo|4OI$;,S͕f']5kO /ND \$˂D68?CH I)4YBoN9)~n4b\lx&Jph^_H0M\"-$D%ȠBP<O!tҕgM;c}X:PԘ+[Dp{ɌB'l>#'ƙR%e&g:9v'pdq"K#ZM H_K Lgfe<YfujJ<^HK Ջ'— l\ie%-%[Zs9<MA gGcrYG_ p=}Rc bU"_$V| 0Yd&RL7lx#~<M&^D!,x`&$")B vhXࠝ"^b .f̧pe>|xeA^@B x#Ņ˒VJwxl|@! CX^dsl~Ф>`f(pA+F[+$,! (x8cA+pk*ˇX`h&~b;{+C1?Z `X.CϘl0OLCL3߰QxX(HgT"l'LNOm|4H$>T>q)XwA"Pt M.$JdǎK˂t.!1cAV"Gn.KfjC. Bp?Ʉb!iw7}dO VK+$=͠.RkP\zHp&MMLX 0ay!@>0&,qϘe?uɹY]0K(JEI3e|D,*I3јa3{y,O Ŧ4ç+ZVc?P:j0$y]&ԯlX ,T\Hbxb>(Sٿut:MՖ.i %D'47qax{W!K!)b\CtCxA UMQZ&GI#(VH0]e %% !S/=)ybY)ʼnbض)g&#ఄ}W(GyHFY \&Y=38Bt;˂SJbGbaG9Ǻ T$^dD,tFZJKES?6Y0g6xN S`Sb!3'^BZ)')YeYg$(=rpY*(((LCec"i"O=-5'Ni!̲QYtD SM p5M EBg |$shˆcd}:DʄK ZhIآQ dGJ(񱴑46C& xHse#Gcr.8&[xʽ( uƏ"QG$'޴ȳdhm2opDL2(PBqDQ#XcI$[oJ!uI(9eHtF%X/Jcڛהt'%Ó= o,ٱݔ5J*ĚBMyE$5HLH<|X?ŶE'vAeUh;ChO$!lB! 趤O$p2/s>YZ\Ԑ{ȶTtCz\ lX*^APBCZY*O,I2%IFlV,('╢M"8BC\,ӓBI?-}id%pLX4F)zNL%'u9D19lǔR5"mJ*dDY4M`R!f,%$>L #Y+!(E&'GZScњƆբE6n[#mK;6!C,PN d)8|%+G%ZoObXưO=sd4loBm |pPI]hHOg?(*Ύ+Iw5D ^jU5pI)%- N>L,?dъqI<"Z7[c<'#iΞlBY֓'ƕCL$1i)4b1Ni9Q#|xy':NYOCPۡN#t]5c'[;<`e"90ВxLHXf.IZ~N06hq2e (u##Bk uHҁF 8<^s}x-$UZJHxc$ӛ0n$ؗ ENJE1r۳)J%hޤeP&HbG$:=E&zF8dp+mKXLbS%(Q&1ĩkD%ش잆r==< 4:!$cC!Wi?Gp99'Dt1ܜ1axǷhq.NCS|+lI֍)6䯭F{:7$9w3=F*(Fy)B2jǜB?2kkC-1j!.9|) j =Û(ӟZ!) l_8(X\ ?ce GJQ =2Kl*s2]ftc!ƝIt6g,r^zr9%~ :-,4mkHfI2DZ,8b(>'BLI*2mI%6GmP|1jr'# !AT6r9giz2([,Q,bQ &>E YVdEFI7^H]Ta1&ǵ2GFI4{cx((67ds:%LO\w:YĈlOZ$rJ*н 8ѧb1( rbͬz0Tp̞)Cp&xydF_&;Y P,6c!HrXƸ(! ~܍S@!22i= E({!H|;s)y'G$2s t6egF6<]T#% (G1$hy:$Ĕ%sFKbkK%^SBw#d4Kdر/q6ԙrxaHM-ŹecaEƦb)ɋS&;m KI=bbc&[LK%G?dM1G2.Gfte!(d)?BhZ9ΐLMQ%i<CAJD$dƋcP>xY0' D>89><_ <)jiM"IR'DZ$n&(vʲŶEؗ"u61uފ( \ ";,BT!7"iɎXK2@%'ӧ)(IQPYa> BynlIq=dsmR7țY8ѱj  $O%*1JgSi _(ٚ,| RHpLP+mfR9Sx&ڒ{2y} _hٹ~$BMD Z2NL$Tw֊,˂x)eEP'ZcI1;b]\kz[#X+lI pz?݃5G!4&ƌ}D "fYBβɮ͈*!Rs^ct/dx66)!ǚR5%-tB8cZ+e ֏:Xoʇ ƳYSX_yz'騨? ߢㅅ몪㼼=؞ɽkkk炂ﭭC׆!!kꑑ臇鉉nڿ\R웛o?뗗?)j..zT)L~"'S05W`JCB`vݑD뛲ꔔ錌LJ<<0l7ցAc6"邕^ff8h2"s휩惤j\/j};mqa䅭CttrsxiYY*OtRNS !!a B"$ %B劊a剮rdљ:|{lTR;&18IDATxiAڵv%})EJɋ9;徒)C3 D\zgNc}2~;{yq8p8p8p8p8p8({{j>ʮ@6bWV-b+^ [*Ѽh+)$5J)e(1M_73}V"ǹ2POuZX +\K>Jks9f/j/sea; +ChBa'F(1_Rl*LNo%a*g1DHkle= s!n5M;ef; pbLƌ1)[Ā Y*FlcXHU[ҷ؛v3dG)F.ٰdHlȯP b<jHl-vƌlJ2T&b A2`aib 8@2'S8(o^j1dp1#=(jgw\j h"z hԟz >R_\~ ښ zK@ PqAe oYny악;ªkԕ|#@_$&RŌADc$BmbhkČjABMv?+"!Q05b<\|%X1)NE*ea2TC1xI_5A=\C1V!{3@=\"CD H31PKU @wĨi3E$oEvOSx1ClzNbx0)Hb -Ɗ$[K1`S%UmɇKpẍ́g\:HD2'-)aj1NMՂTAvzL1 SR[b(yFmH릈yڔC^DwĀT'. 3@Љy |@>br6U0e<H1l H1_CB.3 0'}5qbxb0>|k5!}w"bfj[v(1NyuHmH\OSΦ ,XV; |n[AM|A`:{=Rmtד>}+72%aש裬>?vJ\Z(4V%Ka FJڢ;%K `1LBWR@l/_ߜDQiM iRMЧA-@jx[؏h)ۊĹH+iAr3|<> zFqh4)BTǠA{ d1Z[3f J 4oH`B3R9pSb(R>(6Vb, ㉢_,KY~7{}3a 0Ι9}X_ʪ9(m&?c9m'e|73L3_+JQQYf S~|y_t0"֣{Ɛ#=Q-Di"nf:1vǚw1Je݌3u(1cSBϰiǐƇd8bAIߐ5Lށ2Ghq+ G1dx1qU|\gb$ӫ?FVZWCrUU+\ -F8 \ia:B(k33]<(dϾDQ"nƒPH5BR$D%kDY=-k'sk¸3nj|s=qϹ˜S`QahnxEf*yl*;€T!XS>F?*2My-Qm^#u23:9-.CЋ'(puɘ)sg )+d$wNe2?A3>#I\dfb]hMψë7s2?_ɞtd̕8^ m6Ϙ/CDkS={6 z3Cq[NT.CFM[m۶~͛3$02B2V[j тu! JHQD%䀆 ,``ȁ5M0 B/d1FM&ۊւaԠGos} |'"FE6lrR[4ͬޔX$m㺁VTC d0.)$+-3jP'(G$* RTBlʣ…;,+ ` OFxF=S1օr6OYhmVG%%5{.lf yF`Tg~E\;/=c`3B43գH25J2U]].iem6MhUn#||EՒʯV3ӡ-Ϟ!+%C|=R>Ba : 3(gksi䂰2XJC?MM-K%Z%glUͥNMt9sb4UZSL1$Z=]Qӧ m Wf~FkCK1:,97/ܒ=#0/R;vdtsr&d`=?PW3$h#C$?횙 xhЖ%BGeNecrȒG-Nєs9$ xgx|W,>]yU8BaMP>O3ɯ<{*-ϡmmƁׁ3LU"rHQ ;}~֦=dTySϡmڊQT%tw&Ŝצ1!Il,͔ma%;l-g8zC5j n"(QAD!j(k'UBoԒfc΁[ h\=8*- ͵b@gAu1^E 0EMlzFoaQx{iKP=VJ@% M%T!4\(! % ŭkgAMm%tZM)WK5A@tjR3+Pz9Dqxu KGH0> a$a} dPA1J$`Tsw֙[ | R *@- :Z@+ X`fX`BK@ |.HWz#UMV Xh.NQS%`B `Dk$h=h GؤItPes)IrdF;g3ի٫e1|y ε,o]d4/Bw7*Ǻg8[(d@g&5*osgO֐*?!GLq \{mך:홷x3R,/Ƕ=m|"`Lx7$(2Z,\,o7q4 \1Ax(wQ_aSa}oƑy!Ú).qQ7(2.޳IdhWdCX 勝;n)AŤx|R\ttT:  'C>=~ıc;w=hl_ׁ^yEZЍ̔U?s>zԔg ^v 3ܹN%^IC衙3:J Aët>zF 9?IENDB`PKL\3E E 2instagram-feed/admin/builder/assets/css/global.cssnu[/* Global CSS styles Theses styles can be used for different screens & In different SmashBalloon Plugins * Transitions * Default, Hover & Focus Colors & Backgrounds * Social Colors * Buttons * Full Screen Boss * Add Source Popup * Confirm Dialog * Full Screen Loader * Tooltip */ #sbi-settings{ visibility: hidden; opacity: 0; } #sbi-settings[data-app-loaded="true"]{ visibility: visible; opacity: 1; } #sbi-builder-app { -webkit-font-smoothing: antialiased; } /* Transitions */ .sb-tr-1{ -webkit-transition: all .1s ease-in-out; transition: all .1s ease-in-out; } .sb-tr-2{ -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .sb-tr-3{ -webkit-transition: all .3s ease-in-out; transition: all .3s ease-in-out; } .sb-tr-4{ -webkit-transition: all .4s ease-in-out; transition: all .4s ease-in-out; } .sb-tr-5{ -webkit-transition: all .5s ease-in-out; transition: all .5s ease-in-out; } .sb-tr-6{ -webkit-transition: all .6s ease-in-out; transition: all .6s ease-in-out; } .sb-tr-7{ -webkit-transition: all .7s ease-in-out; transition: all .7s ease-in-out; } .sb-tr-8{ -webkit-transition: all .8s ease-in-out; transition: all .8s ease-in-out; } .sb-tr-9{ -webkit-transition: all .9s ease-in-out; transition: all .9s ease-in-out; } .sb-tr-10{ -webkit-transition: all 1s ease-in-out; transition: all 1s ease-in-out; } /* * Default, Hover & Focus Colors & Backgrounds */ .sb-small-p, .sb-standard-p{ font-style: normal; font-weight: normal; font-size: 14px; line-height: 160%; color: #8C8F9A; margin: 0; } .sb-standard-p{ font-size: 16px; color: #141B38; } #sbi-settings h3 { font-style: normal; font-weight: 600; font-size: 24px; line-height: 120%; margin: 0 0 4px 0; letter-spacing: 0; } .sb-caption { font-style: normal; font-weight: normal; font-size: 13px; line-height: 150%; color: #141B38; } .sb-caption.sb-caption-lighter { color: #5F6368; } .sb-small-text { font-size: 12px; } .sb-bold { font-weight: 600; } .sb-dark-text { color: #141B38; } .sb-small { font-style: normal; font-weight: bold; font-size: 10px; line-height: 160%; letter-spacing: 0.08em; text-transform: uppercase; color: #141B38; } .sb-button-no-border { border-radius: 0 !important; border: none !important; } .sb-icon-small svg { height: 10px; } .sb-dark-hover:hover svg, .sb-dark-hover:hover path { fill: #141B38; } /*orange*/ .sb-btn-orange{ background: #FE544F!important; color: #fff!important; } .sb-btn-orange:hover{ background: #EC352F!important; border-color: #EC352F!important; color: #fff!important; } .sb-btn-orange:focus, .sb-btn-orange:active{ background: #BC120E!important; border-color: #BC120E!important; color: #fff!important; } /*red*/ .sb-btn-red{ background: #D72C2C!important; color: #fff!important; } .sb-btn-red:hover{ background: #DF5757!important; color: #fff!important; } .sb-btn-red:focus, .sb-btn-red:active{ background: #841919!important; color: #fff!important; } /*red*/ .sb-btn-blue{ background: #0068A0!important; color: #fff!important; } .sb-btn-blue:hover{ background: #0096CC!important; border-color: #0096CC!important; color: #fff!important; } .sb-btn-blue:focus, .sb-btn-blue:active{ background: #004D77!important; border-color: #004D77!important; color: #fff!important; } /*grey*/ .sb-btn-grey{ background: #F3F4F5!important; color: #141B38!important; border: 1px solid #D0D1D7!important; } .sb-btn-grey:hover{ background: #fff!important; color: #141B38!important; border: 1px solid #DCDDE1!important; } .sb-btn-grey:focus, .sb-btn-grey:active{ background: #E8E8EB!important; color: #141B38!important; border: 1px solid #D0D1D7!important; } /*dark*/ .sb-btn-dark{ background: #2C324C!important; color: #fff!important; } .sb-btn-dark:hover{ background: #434960!important; color: #fff!important; } .sb-btn-dark:focus, .sb-btn-dark:active{ background: #141B38!important; color: #fff!important; } /*orange*/ .sbi-btn-orange{ background: #FE544F!important; color: #fff!important; } .sbi-btn-orange:hover{ background: #F37036!important; color: #fff!important; } .sbi-btn-orange:focus, .sbi-btn-orange:active{ background: #BC120E!important; color: #fff!important; } /*red*/ .sbi-btn-red{ background: #D72C2C!important; color: #fff!important; } .sbi-btn-red:hover{ background: #DF5757!important; color: #fff!important; } .sbi-btn-red:focus, .sbi-btn-red:active{ background: #841919!important; color: #fff!important; } /*red*/ .sbi-btn-blue{ background: #0068A0!important; color: #fff!important; } .sbi-btn-blue:hover{ background: #0096CC!important; color: #fff!important; } .sbi-btn-blue:focus, .sbi-btn-blue:active{ background: #004D77!important; color: #fff!important; } /*grey*/ .sbi-btn-grey{ background: #F3F4F5!important; color: #141B38!important; border: 1px solid #D0D1D7!important; } .sbi-btn-grey:hover{ background: #fff!important; color: #141B38!important; border: 1px solid #DCDDE1!important; } .sbi-btn-grey:focus, .sbi-btn-grey:active{ background: #E8E8EB!important; color: #141B38!important; border: 1px solid #D0D1D7!important; } /*dark*/ .sbi-btn-dark{ background: #2C324C!important; color: #fff!important; } .sbi-btn-dark:hover{ background: #434960!important; color: #fff!important; } .sbi-btn-dark:focus, .sbi-btn-dark:active{ background: #141B38!important; color: #fff!important; } /*disabled*/ .sb-btn-orange[data-active="false"], .sb-btn-blue[data-active="false"], .sb-btn-red[data-active="false"], .sb-btn-grey[data-active="false"], .sb-btn-dark[data-active="false"]{ background: #E8E8EB !important; color: #8C8F9A !important; } /* * Social Colors */ /*Facebook*/ .sb-cl-facebook, .sb-clhv-facebook:hover{ color: #006BFA!important; } .sbi-bg-facebook, .sbi-bghv-facebook:hover{ background: #006BFA!important; } /*Instagram*/ .sb-cl-instagram, .sb-clhv-instagram:hover{ color: #BA03A7!important; } .sbi-bg-instagram, .sbi-bghv-instagram:hover{ background: #BA03A7!important; } /*Twitter*/ .sb-cl-twitter, .sb-clhv-twitter:hover{ color: #1B90EF!important; } .sbi-bg-twitter, .sbi-bghv-twitter:hover{ background: #1B90EF!important; } /*YouTube*/ .sb-cl-youtube, .sb-clhv-youtube:hover{ color: #EB2121!important; } .sbi-bg-youtube, .sbi-bghv-youtube:hover{ background: #EB2121!important; } /*Linkedin*/ .sb-cl-linkedin, .sb-clhv-linkedin:hover{ color: #007bb6!important; } .sbi-bg-linkedin, .sbi-bghv-linkedin:hover{ background: #007bb6!important; } /*Mail*/ .sb-cl-mail, .sb-clhv-mail:hover{ color: #666!important; } .sbi-bg-mail, .sbi-bghv-mail:hover{ background: #666!important; } .sb-cursor-pointer{ cursor: pointer; } .sbi-stck-el.sbi-stck-el-upgrd svg path{ fill: #fff!important; } /*Buttons*/ .sb-btn{ display: flex; flex-direction: row; justify-content: center; align-items: center; padding: 9px 38px; font-style: normal; font-weight: 500; font-size: 14px; line-height: 17px; border-radius: 2px; cursor: pointer; color: #fff; outline: none; box-shadow: none; border: none; gap: 8px; } .sb-btn:focus{ box-shadow: none; } .sbi-small-chevron svg{ width: 6px; height: 8px; top: 14px; left: 18px; } .sb-btn-right-icon{ display: flex; justify-content: flex-start; padding: 15px 12px; } .sb-btn-right-txt{ display: flex; justify-content: flex-start; align-items: center; line-height: 1em; } .sb-btn-right-txt svg{ float: left; margin-right: 10px; } .sb-btn-right-chevron{ width: 7px; height: 7px; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); margin-left: auto; margin-right: 10px; } /*Add Source*/ /* Add new Source Popup */ .sbi-fb-popup-cls{ height: 14px; width: 14px; position: absolute; cursor: pointer; right: 17px; top: 17px; z-index: 3; } .sbi-fb-center-boss{ display: flex; justify-content: center; align-items: center; } .sbi-fb-popup-inside{ left: 80px; max-width: 1172px; width: calc(85% - 200px); background: #fff; color: #141B38; position: relative; box-shadow: 0px 26.7377px 77.2886px rgba(0, 0, 0, 0.107828), 0px 14.2952px 41.3222px rgba(0, 0, 0, 0.0894161), 0px 8.01379px 23.1649px rgba(0, 0, 0, 0.075), 0px 4.25607px 12.3027px rgba(0, 0, 0, 0.0605839), 0px 1.77104px 5.11942px rgba(0, 0, 0, 0.0421718); border-radius: 2px; overflow-y: auto; max-height: 80vh; } .sbi-fb-feedtypes-popup.sbi-fb-popup-inside{ width: 1172px; max-width: calc(85% - 200px); } .sbi-fb-extensions-pp-ctn .sbi-fb-popup-inside{ max-width: 880px!important; } .sbi-fb-popup-inside.sbi-narrower-modal { max-width: 576px; } .sbi-fb-popup-inside.sb-onboarding-tooltip { overflow-y: visible !important; } @media all and (max-width: 960px) { .sbi-fb-popup-inside { left: 20px; max-width: 920px; width: calc(85% - 20px); } } .sbi-fb-embed-popup{ width: 575px; } .sbi-fb-source-pp-customizer h5,.sbi-fb-embed-popup h5{ font-size: 24px; padding: 0 20px; margin-top: 25px; margin-bottom: 15px; } .sbi-fb-feedtypes-popup h5{ font-size: 26px; padding: 0 20px; margin-top: 25px; margin-bottom: 30px; } .sbi-fb-feedtypes-pp-ctn .sbi-fb-adv-types .sbi-fb-types-list{ margin-bottom: 30px !important } .sbi-fb-srcs-update{ background: var(--cl-orange); font-weight: 600; font-size: 14px; line-height: 160%; height: 38px; } .sbi-fb-srcs-update-footer{ display: flex; align-items: center; border-top: 1px solid #DCDDE1; background: #F9F9FA; } .sbi-fb-srcs-update-footer-txt{ font-size: 18px; line-height: 1.7em; } .sbi-fb-srcs-update-footer-image svg{ width: 100%; height: auto; float: left; } .sbi-fb-srcs-update-footer-txt{ box-sizing: border-box; display: flex; justify-content: center; } .sbi-fb-stp1-elm{ margin-bottom: 30px; float: left; display: flex; } .sbi-fb-source-top .sbi-fb-stp1-elm:first-of-type{ justify-content: center; align-items: center; padding-bottom: 30px; border-bottom: 1px solid #D0D1D7; } .sbi-fb-stp1-event{ padding-bottom: 0px!important; border-bottom: none!important; padding-right: 20%; align-items: flex-start!important; } .sbi-fb-stp1-elm-desc > a{ font-weight: 600; text-decoration: underline; color: #2A65DB; } .sbi-fb-stp-src-ctn, .sbi-flex-center-center{ display: flex; justify-content: center; align-content: center; } .sbi-fb-stp-src-type{ display: flex; justify-content: center; align-content: center; font-size: 13px; font-weight:400; cursor: pointer; margin-left: 20px; color: #434960; white-space: nowrap; } .sbi-fb-stp-src-type[data-active="true"]{ font-weight:600; color: #141B38; } .sbi-not-sure-wrap span svg { margin-right: 5px; } .sbi-not-sure-wrap:hover .sbi-not-sure-tooltip{ display: block; } .sbi-fb-stp1-elm-ic{ width: 28px; height: 28px; border-radius: 35px; background: #F3F4F5; display: flex; justify-content: center; align-items: center; font-weight: 500; flex: none; } .sbi-fb-stp1-elm-head{ font-size: 16px; font-weight: 600; } .sbi-fb-stp1-elm-desc{ font-size: 15px; margin-top: 4px; line-height: 1.3em; color: #5F6368; } .sbi-fb-source-btm-hd{ font-size: 15px; font-weight: 500; } .sbi-fb-src-back-top i{ font-size: 12px; margin-right: 10px; } .sbi-fb-source-account-info{ background: #F3F4F5; color: #8C8F9A; display: flex; align-items: center; padding: 6px 6px 6px 12px; font-size: 15px; } .sbi-fb-source-list { display: grid; grid-template-columns: 49.5% 49.5%; grid-column-gap: 1%; margin-top: 10px; max-height: calc(80vh - 360px); overflow-y: auto; min-height: 80px; } .sbi-fb-source-account-info strong{ color: #141B38; } .sbi-fb-source-btn{ margin-top: 60px; color: #fff; display: flex; justify-content: center; align-items: center; background: #0068A0; cursor: pointer; padding: 10px 20px; border-radius: 3px; font-size: 15px; font-weight: 500; border: none; } .sbi-fb-icon-success{ position: relative; width: 30px; height: 20px; margin-right: 10px; } .sbi-fb-icon-success:before{ content: ''; position: absolute; width: 13px; height: 5px; top: 4px; border-left: 3px solid currentColor; border-bottom: 3px solid currentColor; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sbi-fb-source-inp-label,.sbi-fb-wh-label{ font-size: 14px; color: #434960; } .sbi-fb-source-mnl-type .sbi-fb-stp-src-ctn{ justify-content: flex-start; margin-bottom: 20px; margin-top: 10px; } .sbi-fb-source-mnl-type .sbi-fb-stp-src-ctn .sbi-fb-stp-src-type{ margin-left: 0px; margin-right: 20px } .sbi-fb-source-inp,.sbi-fb-wh-inp{ border-radius: 0px !important; outline: none ; margin-top: 5px; border: 1px solid #D0D1D7 !important; margin-bottom: 20px; height: 35px; line-height: 35px; } .sbi-fb-sec-heading span{ font-size:14px; color: #434960; line-height: 1.7em; margin-top: 10px; display: block; } #sbi-builder-app .sbi-fb-sec-heading span { margin-top: 0; } .sbi-fb-sec-heading { margin-bottom: 10px; } .sbi-fb-slctsrc-content,.sbi-fb-section-wh-insd{ padding: 40px; } .sbi-fb-slctsrc-ctn h4,.sbi-fb-section-wh-insd h4{ font-size: 20px; padding: 0px; margin: 0px; } .sbi-fb-srcs-item{ width: 100%; cursor: pointer; height: 62px; margin-top: 10px; border-radius: 3px; border: 1px solid #E7E7E9; display: flex; position: relative; } .sbi-connecting-account-item { display: flex; align-content: center; align-items: center; position: relative; box-sizing: border-box; height: 62px; width: 208px; margin: auto; padding: 12px; background: #fff; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), 0 4px 5px rgba(0, 0, 0, 0.05); border-radius: 4px; } .sbi-fb-source-step4 { max-width: 576px; } .sbi-source-account-box { padding: 32px; background-color: #F3F4F5; } .sb-details-wrap { align-items: center; } .sbi-connecting-account-item .sbi-fb-srcs-item-avatar { margin-right: 8px; } .sbi-fb-srcs-item .sbi-fb-srcs-item-avatar { margin-right: 10px; } .sbi-fb-srcs-item[data-disabled="true"]{ background: #F3F4F5; } .sbi-fb-stp-src-type[data-disabled="true"], .sbi-fb-stp-src-type[data-disabled="true"] .sbi-fb-chbx-round{ color: #8C8F9A !important; cursor: default; } .sbi-fb-stp-src-type[data-disabled="true"] { position: relative; } .sbi-fb-srcs-item[data-disabled="true"] .sbi-fb-srcs-item-inf{ opacity: .55; } .sbi-fb-srcs-item:hover{ border-color: #86D0F9; } .sbi-fb-srcs-item[data-active="true"]{ border-color: #0096cc; } .sbi-fb-source-top .sbi-fb-srcs-item{ margin-bottom: 0px; } .sbi-fb-srcs-new{ display: flex; justify-content: center; align-items: center; font-size: 16px; color: #0096CC; background: #EBF5FF; font-weight: 600; border: 1px solid #EBF5FF; } .sbi-fb-srcs-new i{ font-size: 14px; padding: 0 10px; margin-left: -10px; } .sbi-fb-srcs-item-chkbx{ width: 40px; height: inherit; display: flex; justify-content: center; align-items: center; margin: 0px 7px; } .sbi-fb-srcs-item-chkbx-ic,.sbi-fb-chbx-round{ width: 16px; height: 16px; box-sizing: border-box; position: relative; border-radius: 50px; border: 2px solid #8c8f9a; } [data-multifeed="active"] .sbi-fb-srcs-item-chkbx-ic{ border-radius: 2px; } [data-active="true"] .sbi-fb-srcs-item-chkbx-ic, [data-active="true"] > .sbi-fb-chbx-round, .sbi-fb-source-popup [data-active="true"] > .sbi-fb-chbx-round{ border-color: #0096cc; background: #0096cc; } [data-multifeed="active"] [data-active="true"] .sbi-fb-srcs-item-chkbx-ic:before{ content: ''; position: absolute; width: 8px; height: 3px; border-left: 2px solid #fff; border-bottom: 2px solid #fff; top: 2px; right: 1px; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } [data-multifeed="inactive"] [data-active="true"] .sbi-fb-srcs-item-chkbx-ic:before, [data-active="true"] > .sbi-fb-chbx-round:before, .sbi-fb-source-popup .sbi-fb-source-list [data-active="true"] .sbi-fb-srcs-item-chkbx-ic:before{ content: ''; position: absolute; height: 6px; width: 6px; background: #fff; border-radius: 25px; left: 3px; top: 3px; } .sbi-fb-srcs-item-avatar{ display: flex; width: 42px; height: inherit; justify-content: center; align-items: center; } .sbi-fb-srcs-item-avatar img{ width: 42px; height: 42px; border-radius: 50%; background: #eee; } .sbi-fb-srcs-item-inf{ width: 100%; height: inherit; display: flex; justify-content: center; flex-direction: column; } .sbi-fb-srcs-item-name{ color: #141B38; font-weight: 600; } .sbi-fb-srcs-item-name-event{ font-size: 10px; font-weight: 500; color: #777; } .sbi-fb-srcs-item-type{ color: #434960; font-weight: 600; text-transform: uppercase; display: flex; align-items: center; } .sbi-fb-srcs-item-type svg{ fill: currentColor; } [data-type="page"] .sbi-fb-srcs-item-type svg{ width: 11px; } .sbi-fb-srcs-back{ margin-right: auto; } /*Full Screen Window*/ .sb-fs-boss{ position: fixed; height: 100vh; width: 100%; left: 0; top: 0; bottom: 0; right: 0; background: rgba(0,0,0,.4); z-index: 9989; } .sb-dialog-popup{ width: 575px!important; min-height: 250px; } .sb-dialog-remove-source{ background: #F3F4F5; padding: 40px 20px; display: flex; justify-content: center; align-items: center; } .sb-dialog-remove-source .sbi-fb-srcs-item{ background: #fff; width: 280px; padding-left: 20px; box-sizing: border-box; margin-top: 0px; } .sb-dialog-popup-content{ display: flex; justify-content: center; align-items: center; text-align: center; flex-direction: column; padding: 38px 12%; } .sb-dialog-popup-content strong{ font-size: 22px; color: #141B38; display: block; margin-bottom: 15px; line-height: 160%; } .sb-dialog-popup-content span{ font-size: 16px; line-height: 1.5em; color: #434960; } .sb-dialog-popup-actions{ display: flex; justify-content: center; align-items: center; margin-top: 25px; } .sb-dialog-popup-actions button{ width: 100%; margin: 4px 4px; cursor: pointer; height: 42px; } .sb-full-screen-loader{ position: absolute; width: 100%; height: calc(100vh - 32px); background: #f0f0f1; z-index: 999999; overflow: hidden; display: none; opacity: 0; visibility: hidden; justify-content: center; align-items: center; flex-direction: column; top: 0px; } .sb-full-screen-loader[data-show="shown"]{ display: flex; opacity: 1; visibility: visible; } .sb-full-screen-loader-logo{ width: 190px; height: 190px; position: relative; margin-bottom: 40px; margin-top: -55px; } .sb-full-screen-loader-logo svg { height: auto; } .sb-full-screen-loader-border{ width: inherit; height: inherit; box-sizing: border-box; border: 6px solid green; left: 0; top: 0; position: absolute; border-radius: 50%; } .sb-full-screen-loader-img{ width: inherit; height: inherit; display: flex; justify-content: center; align-items: center; position: absolute; top: 0px; left: 0px; z-index: 2; } .sb-full-screen-loader-img svg{ float: left; width: 60px; fill: #FE544F; } .sb-full-screen-loader-txt{ color: #434960; font-size: 24px; font-weight: 600; } .sb-full-screen-loader-spinner, .sb-full-screen-loader-spinner:before, .sb-full-screen-loader-spinner:after { border-radius: 50%; } .sb-full-screen-loader-spinner { color: #FE544F; position: relative; width: 190px; height: 190px; box-shadow: inset 0 0 0 6px; -webkit-transform: translateZ(0); transform: translateZ(0); } .sb-full-screen-loader-spinner:before, .sb-full-screen-loader-spinner:after { position: absolute; content: ''; } .sb-full-screen-loader-spinner:before { width: 100px; height: 200px; background: #f0f0f1; border-radius: 190px 0 0 190px; top: -1px; left: -8px; -webkit-transform-origin: 5.1em 5.1em; transform-origin: 100px 100px; -webkit-animation: sbi-loader-spinner 2s infinite ease 1.5s; animation: sbi-loader-spinner 2s infinite ease 1.5s; } .sb-full-screen-loader-spinner:after { width: 97px; height: 192px; background: #f0f0f1; border-radius: 0 190px 190px 0; top: -1px; left: 94px; -webkit-transform-origin: 1px 95px; transform-origin: 1px 95px; -webkit-animation: sbi-loader-spinner 2s infinite ease; animation: sbi-loader-spinner 2s infinite ease; } @-webkit-keyframes sbi-loader-spinner { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes sbi-loader-spinner { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } /* Social Wall Popup */ .sbi-fb-extpp-social-wall-graphic { display: flex; flex-direction: column; align-items: center; padding-bottom: 78px } .sbi-graphic-row, .sbi-fb-social-wall-between { position: relative; } .sbi-graphic-row-main { display: flex; justify-content: center; flex-direction: row; align-items: center; } .sbi-fb-social-wall-group { display: flex; flex-direction: column; align-items: center; width: 13%; margin: 1.5%; } .sbi-fb-social-wall-group p { margin: 0; text-align:center; } .sbi-fb-social-wall-between.sbi-fb-social-wall-between-instagram svg { margin-top:120%; } .sbi-fb-social-wall-between.sbi-fb-social-wall-between-facebook svg { margin-top:40%; } .sbi-fb-social-wall-between.sbi-fb-social-wall-between-twitter svg { margin-top:60%; } .sbi-fb-social-wall-end { position: absolute; right: -1%; top: 40%; } .sbi-graphic-bottom { width: 100%; display: flex; justify-content: center; flex-direction: row; align-items: center; margin-top:3%; } .sbi-all-in-same { display: flex; justify-content: center; flex-direction: row; align-items: center; height: 38px; width: 72.5%; /*background: #FFFFFF;*/ /*box-shadow: 0px 6px 7px rgba(0, 26, 119, 0.07), 0px 3px 4px rgba(0, 26, 119, 0.06), 0px 1.80196px 2.25245px rgba(0, 26, 119, 0.05), 0px 0.749837px 0.937296px rgba(0, 26, 119, 0.1137);*/ /*border-radius: 3px;*/ border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; } .sbi-fb-extpp-social-wall .sbi-fb-extpp-bottom { background: #F3F4F5; } .sbi-fb-social-wall-end-arrow { position: relative; } .sbi-arrow-head { position: absolute; bottom: 1%; left: 39%; } /* To Builder */ .sbi-fb-type-el[data-active="true"]:before { content: ''; position: absolute; width: 24px; height: 24px; right: 0px; top: 0px; z-index: 2; border-radius: 0 0 0 2px; background: var(--cl-orange); } .sbi-fb-type-el { display: flex; flex-direction: column; align-items: flex-start; padding: 0; position: relative; background: #fff; border: 1px solid #D8D8D8; border-radius: 3px; cursor: pointer; box-sizing: border-box; } .sbi-fb-slctf-back span { font-weight: 600; } .sbi-fb-slctfd-action { padding: 16px 54px; position: fixed; bottom: 0; background: #f0f0f1; width: calc(100% - 160px); } .sbi-fb-wrapper { max-width: 100%; position: relative; margin: auto; color: #141B38; } .sbi-fb-create-ctn { float: left; margin-top: 104px; padding: 0 54px 65px; } .sbi-fb-extpp-btns a { height: 38px; cursor: pointer; position: relative; border-radius: 3px; font-style: normal; font-weight: 600; font-size: 14px; line-height: 160%; display: flex; justify-content: center; align-items: center; box-sizing: border-box; } .sbi-fb-extpp-lite-btn { display: flex; align-items: self-start; font-size: 14px; font-weight: 600; padding: 6px 11px; color: #0068A0; background: #fff; border: 1px solid #DCDDE1; margin-bottom: 14px; } .sbi-fb-extpp-lite-btn svg { fill: currentColor; width: 17px; height: 16px; float: left; margin-right: 8px; margin-top: 4px; } .sbi-fb-stp-src-type .sbi-fb-chbx-round { margin-right: 8px; margin-top: 2px; } #sbi-builder-app .sbi-fb-stp-src-type { display: flex; justify-content: center; align-content: center; font-size: 14px; font-weight: 400; cursor: pointer; margin-left: 20px; color: #434960; } .sbi-csz-name-ed-btn { width: 28px; height: 28px; cursor: pointer; margin: 0 10px; background: #E8E8EB; border: 1px solid #E8E8EB; outline: none; border-radius: 2px; } .sbi-csz-name-ed-btn svg { width: 16px; height: 14px; fill: #141B38; float: left; margin-left: -1px; } .sbi-csz-name-ed-btn:focus, .sbi-csz-name-ed-btn:hover { outline: none; background-color: #d9d9dc; border-color: #d9d9dc; } .sb-preview-chooser-btn, .sb-preview-chooser-btn:focus { width: 38px; height: 32px; display: flex; justify-content: center; align-items: center; cursor: pointer; float: left; border: 0; background: unset; margin: 0 1px; outline: none; } .sb-customizer-sidebar { position: fixed; z-index: 100; width: 375px; box-shadow: 4px 0px 14px rgb(0 0 0 / 5%), 1px 0px 4px rgb(0 0 0 / 10%); background: #fff; left: 160px; top: 98px; overflow: auto; bottom: 0px; padding-bottom: 50px; } .sb-customizer-sidebar-breadcrumb a, .sb-customizer-sidebar-breadcrumb span { display: inline-block; position: relative; cursor: pointer; color: #434960; text-transform: uppercase; font-size: 10px; line-height: 160%; letter-spacing: 0.02em; padding: 0 5px 0 4px; height: 20px; font-weight: 700; } .sb-control-elem-ctn { display: flex; color: #434960; padding: 20px 20px; } .sb-control-toggle-icon svg { width: 13px; float: left; fill: #434960; } .sb-control-elem-ctn .sb-control-toggle-elm[data-active="true"] { display: flex; color: #141B38; padding: 0 15px; } .sb-control-elem-ctn .sb-control-toggle-elm[data-active="true"] svg { fill: #141B38; } .sb-control-elem-ctn[data-layout="block"] input[type="number"] { height: 36px; background: #FFFFFF; border-radius: 2px 0 0 2px !important; } .sb-control-input-info { display: flex; justify-content: center; align-items: center; background: #F3F4F5; padding: 0 8px; font-weight: normal; font-size: 14px; line-height: 160%; color: #434960; border: 1px solid #D0D1D7; border-left: none; border-radius: 0 2px 2px 0 !important; } .sb-control-elem-output input[type="text"], .sb-control-elem-output input[type="number"]{ border-radius: 1px !important; } .sb-control-colorpicker-ctn .minicolors-theme-default.minicolors-position-right .minicolors-swatch { left: auto; right: 1px; top: 1px; width: 35px; height: 35px; background: #F9F9FA; border: 0px; border-radius: 2px; } .sb-control-colorpicker-ctn[data-picker-style="reset"] .minicolors-input { background: #F3F4F5!important; border: 1px solid #DCDDE1!important; height: 38px; } .sb-customizer-sidebar-breadcrumb svg { position: relative; left: auto; top: auto; margin-right: 9px; } .sb-customizer-sidebar-breadcrumb { display: flex; justify-content: flex-start; align-items: center; margin-bottom: 15px; } .sbi-fb-srcs-info-item span { font-size: 13px; line-height: 1.5em; color: #434960; font-weight: 400; display: inline-block; word-break: break-all; width: calc(100% - 80px); padding: 0 15px; box-sizing: border-box; } /* Onboarding */ #sbi-builder-app .sb-onboarding-tooltip { display: none; position: absolute; min-height: auto; width: 460px; max-width: 100%; padding: 0; border-radius: 2px; z-index: 9999; } #sb-onboarding-tooltip-multiple-2, #sb-onboarding-tooltip-multiple-3{ width: 528px; } #sb-onboarding-tooltip-single-2 { width: 402px; } .sb-onboarding-active .sb-onboarding-highlight .sbi-fb-btn.sbi-fb-btn-new, .sb-onboarding-active .sb-positioning-wrap.sb-onboarding-highlight, .sb-onboarding-active .sbi-fd-lst-bigctn .sbi-table-wrap.sb-onboarding-highlight, .sb-onboarding-active .sbi-fb-lgc-ctn.sb-onboarding-highlight, .sb-onboarding-active .sbi-fb-lgc-ctn .sbi-legacy-table-wrap.sb-onboarding-highlight, .sb-onboarding-active .sb-customizer-sidebar-tab.sb-onboarding-highlight, .sb-onboarding-active .sbi-fb-header.sb-onboarding-highlight{ position: relative; z-index: 100000; } .sb-onboarding-active .sbi-fd-legacy-feed-toggle { display: none; } .sbi-legacy-table-wrap.sb-onboarding-highlight { clear: both; } #sbi-builder-app .sb-onboarding-tooltip-1 { top: 50px; left: 8px; } #sb-onboarding-tooltip-single-2 { bottom: -179px; top: auto; left: 68%; margin-left: -201px; } #sb-onboarding-tooltip-multiple-2, #sb-onboarding-tooltip-multiple-3{ top: -200px; left: 20%; } #sb-onboarding-tooltip-multiple-3 { top: -210px; } #sbi-builder-app .sb-onboarding-tooltip .sbi-fb-wrapper { display: flex; justify-content: flex-end; } #sbi-builder-app .sb-positioning-wrap { width: 432px; } #sbi-builder-app .sb-onboarding-tooltip .sbi-fb-popup-cls { position:absolute; width: 12px; height: 12px; top: 12px; right: 12px; } #sbi-builder-app .sb-onboarding-tooltip .sbi-fb-popup-cls svg { width: 12px; height: 12px; } #sbi-builder-app .sb-onboarding-tooltip h3 { font-size: 16px; color: #141B38; line-height: 160%; font-weight: 600; margin: 0; } #sbi-builder-app .sb-onboarding-step { font-style: normal; font-weight: normal; font-size: 13px; line-height: 160%; color: #434960; margin: 2px 0 20px; display: block; } .sbi-onboarding-next, .sbi-onboarding-previous{ color: #353A41; background: #F3F4F5; border: 1px solid #DCDDE1; margin-left: 10px; } .sbi-onboarding-previous[data-active=false]{ pointer-events: none; } #sbi-builder-app .sb-onboarding-tooltip .sbi-fb-hd-btn { margin-right: 0; } #sbi-builder-app .sb-onboarding-tooltip .sbi-fb-hd-btn i { margin: 0; } .sbi-onboarding-finish{ margin-left: 10px; padding: 0 32px; } #sbi-builder-app .sb-onboarding-tooltip .sbi-fb-hd-btn[data-active="false"] { background-color: #e8e8eb; color: #8c8f99; } #sbi-builder-app .sb-onboarding-tooltip .sbi-fb-hd-btn[data-active="false"]:hover { cursor: default; } .sb-step-counter-wrap span { font-style: normal; font-weight: bold; font-size: 12px; line-height: 160%; letter-spacing: 0.05em; text-transform: uppercase; color: #141B38; } #sbi-builder-app .sb-onboarding-tooltip .sb-pointer { position: absolute; left: 50px; top: -10px; } #sbi-builder-app .sb-pointer.sb-bottom-pointer { top: auto; bottom: -14px; } #sb-onboarding-tooltip-single-2 .sb-pointer { left: 193px; } #sb-onboarding-tooltip-multiple-2:before, #sb-onboarding-tooltip-multiple-3:before{ bottom: -8px; } #sbi-builder-app .sb-onboarding-top-row { padding: 20px 44px 0 24px; } #sbi-builder-app .sb-onboarding-bottom-row { display: flex; flex-direction: row; justify-content: space-between; align-items: center; padding: 8px 16px 12px 24px; } #sbi-builder-app #sb-onboarding-tooltip-customizer-1 { position:absolute; right: 210px; left: auto; top: 84px; } #sbi-builder-app #sb-onboarding-tooltip-customizer-1 .sb-pointer { right: 110px; left: auto; } .sb-customizer-sidebar.sb-onboarding-highlight { z-index: 9999; overflow: visible; } #sb-onboarding-tooltip-customizer-2, #sb-onboarding-tooltip-customizer-3 { z-index: 100000; top: 80px; } #sb-onboarding-tooltip-customizer-3 { left: 171px; } #sbi-builder-app #sb-onboarding-tooltip-customizer-3 .sb-pointer{ left: 100px; } .sb-onboarding-active .sb-customizer-sidebar-tab-ctn, .sb-onboarding-active .sb-customizer-sidebar-sec-ctn, .sb-onboarding-active .sbi-csz-header .sbi-csz-header-insider{ /*pointer-events: none !important;*/ } /* Misc Tooltip */ .sbi-not-sure-tooltip { left: -360px; top: -110px; } .sbi-not-sure-tooltip .sb-pointer { bottom: -17px !important; left: 390px; } .sbi-not-sure-tooltip { display: none; } .sbi-not-sure-tooltip-icon:hover .sbi-not-sure-tooltip { display: block; padding: 12px 16px 16px; width: 400px; } /* Add new Source Popup */ .sbi-fb-popup-cls{ height: 14px; width: 14px; position: absolute; cursor: pointer; right: 17px; top: 17px; z-index: 3; } .sbi-fb-center-boss{ display: flex; justify-content: center; align-items: center; } .sbi-fb-left-boss{ display: flex; justify-content: left; align-items: center; } .sbi-fb-embed-popup,.sbi-fb-dialog-popup{ width: 575px; } .sbi-fb-dialog-popup{ min-height: 250px; } .sbi-fb-source-pp-customizer .sbi-fb-srcslist-ctn{ grid-template-columns: 32.7% 32.7% 32.7%; grid-column-gap: 1%; } .sbi-fb-srcs-desc{ width: 55%; font-style: normal; font-weight: normal; font-size: 14px; line-height: 160%; color: #434960; box-sizing: border-box; margin-bottom: 29px; } #sbi-builder-app .sbi-fb-source-pp-customizer h3{ margin-bottom: 6px; } #sbi-builder-app .sbi-fb-embed-popup h3 { padding: 23px 25px 0; margin-bottom: 0; } #sbi-builder-app .sbi-fb-embed-popup .sbi-fb-embed-step-2 h3 { padding: 0 0 0 29px; } .sbi-fb-feedtypes-popup h5{ font-size: 26px; padding: 0 20px; margin-top: 25px; margin-bottom: 30px; } .sbi-fb-feedtypes-pp-ctn .sbi-fb-adv-types .sbi-fb-types-list{ margin-bottom: 30px !important } .sbi-fb-feedtypes-popup .sbi-fb-types, .sbi-fb-feedtypes-popup .sbi-fb-adv-types { padding: 0; } .sbi-fb-source-top{ padding: 22px 19px 28px; } #sbi-builder-app .sbi-fb-source-step1 .sbi-fb-source-top h3{ margin-bottom: 40px; } #sbi-builder-app .sbi-fb-source-step3 .sbi-fb-source-top h3 { margin-bottom: 30px; } #sbi-settings .sbi-fb-source-step4 .sbi-fb-stp1-elm-desc { max-width: 470px; margin-bottom: 26px; } #sbi-settings .sb-step-text { color: #434960; } .sbi-fb-srcs-update{ background: var(--cl-orange); font-weight: 600; font-size: 14px; line-height: 160%; height: 38px; } .sbi-fb-srcs-update svg{ margin-right: 10px; } .sbi-fb-srcs-update-footer{ display: flex; align-items: center; border-top: 1px solid #DCDDE1; background: #F9F9FA; } .sbi-fb-srcs-update-footer-txt{ font-size: 18px; line-height: 1.7em; } .sbi-fb-srcs-update-footer-btn{ } #sbi-builder-app .sbi-fb-srcs-update-footer-btn a{ height: 48px; padding: 0 20px 0 24px; } .sbi-fb-srcs-update-footer-image{ width: 26%; margin-right: 7%; } #sbi-builder-app .sbi-fb-srcs-update-footer-btn a svg { position: relative; top: auto; right: auto; width: auto; height: auto; margin-left: 15px; } .sbi-fb-srcs-update-footer-image svg{ width: 100%; height: auto; float: left; } .sbi-fb-srcs-update-footer-txt{ box-sizing: border-box; display: flex; justify-content: center; width: 38%; margin-right: 7%; } .sbi-fb-stp1-elm{ margin-bottom: 20px; float: left; display: flex; } .sbi-fb-source-top .sbi-fb-stp1-elm:first-of-type{ justify-content: center; align-items: center; padding-bottom: 24px; border-bottom: 1px solid #D0D1D7; } .sbi-fb-stp1-event{ padding-bottom: 0px!important; border-bottom: none!important; padding-right: 11%; align-items: flex-start!important; } .sbi-fb-stp1-elm-desc > a{ font-weight: 600; text-decoration: underline; color: #2A65DB; } .sbi-fb-stp-src-ctn{ display: flex; justify-content: center; align-content: center; } #sbi-builder-app .sbi-fb-stp-src-type{ display: flex; justify-content: center; align-content: center; font-size: 13px; font-weight:400; cursor: pointer; margin-left: 20px; color: #434960; } .sbi-fb-stp-src-type .sbi-fb-chbx-round{ margin-right: 8px; margin-top: 2px; } .sbi-fb-stp-src-type[data-active="true"]{ font-weight:600; color: #141B38; } .sbi-fb-stp1-elm-ic{ width: 28px; height: 28px; border-radius: 35px; background: #F3F4F5; display: flex; justify-content: center; align-items: center; font-weight: 500; flex: none; transform: translate(0, -2px); } .sbi-fb-stp1-elm-txt{ margin-left: 16px; margin-right: 21%; width: 100%; } .sbi-fb-stp1-elm-head{ font-size: 14px; font-weight: 600; color: #141B38; } .sbi-fb-stp1-elm-desc{ font-size: 13px; margin-top: 4px; line-height: 150%; color: #888a8e; } .sbi-fb-stp1-event .sbi-fb-stp1-elm-desc { margin-top: 4px; } .sbi-fb-stp1-elm-act .sb-btn.sbi-fb-stp1-connect{ padding: 8px 20px 8px 40px; background: #0068A0; position: relative; font-style: normal; font-weight: 600; font-size: 14px; line-height: 160%; } .sbi-fb-stp1-connect svg{ position: absolute; top: 10px; right: 0; bottom: 0; left: 13px; width: 17px; fill: currentColor; } .sbi-fb-stp1-connect path{ fill: currentColor; } .sbi-fb-source-bottom{ padding: 18px 20px; background: #F3F4F5; display: flex; align-items: center; border-radius: 0 0 2px 2px; } .sbi-manual-question { display: flex; align-items: center; } .sbi-manual-question svg{ margin-right: 23px; float: left; } .sbi-fb-source-btm-hd{ font-size: 14px; font-weight: 500; } .sbi-fb-src-add-manual{ margin-left: auto; padding: 8px 20px 8px 40px; } .sbi-fb-src-add-manual svg{ position: absolute; top: 11px; right: 0; bottom: 0; left: 13px; fill: currentColor; } #sbi-builder-app .sbi-fb-source-step2 .sbi-fb-source-top h3 { margin-bottom: 35px; } #sbi-builder-app .sbi-fb-source-step4 .sbi-fb-source-top h3, #sbi-builder-app .sbi-fb-source-step4 .sbi-fb-source-top h4{ margin-bottom: 8px; } #sbi-builder-app .sbi-fb-source-step4 .sbi-fb-stp1-elm-desc { max-width: 470px; margin-bottom: 26px; } .sbi-fb-src-add-manual i{ font-size: 12px; margin-right: 10px; } .sbi-fb-src-back-top{ float: left; font-style: normal; font-weight: 600; font-size: 12px; line-height: 160%; letter-spacing: 0.05em; text-transform: uppercase; cursor: pointer; color: #141B38; margin-bottom: 10px; display: flex; justify-content: center; align-items: center; } .sbi-fb-src-back-top svg{ margin-left: 6px; margin-right: 10px; } .sbi-fb-source-account-info{ background: #F3F4F5; padding: 6px 6px 6px 12px; display: flex; align-items: center; } .sbi-fb-source-list{ display: grid; grid-template-columns: 49.4% 49.4%; grid-column-gap: 1.2%; margin-top: 8px; } .sbi-fb-source-popup.sbi-fb-popup-inside .sbi-fb-srcs-item { box-sizing: border-box; margin: 1.2% 0; } .sbi-fb-source-account-info img{ width: 23px; height: 23px; border-radius: 23px; background: #fafafa; margin-left: 10px; margin-right: 10px; } .sbi-fb-source-account-info strong{ color: #141B38; } .sbi-fb-src-change{ padding: 7px 20px 7px 40px; margin-left: auto; } .sbi-fb-src-change svg{ position: absolute; top: 11px; right: 0; bottom: 0; left: 13px; fill: currentColor; } .sbi-fb-source-btn{ margin-top: 10px; color: #fff; display: flex; justify-content: center; align-items: center; background: #0068A0; cursor: pointer; padding: 8px 20px; line-height: 160%; border-radius: 2px; font-size: 14px; font-weight: 500; border: none; text-decoration: none; } #sbi-builder-app .sbi-fb-source-step3 .sbi-fb-source-btn { margin-top: 45px; } #sbi-builder-app .sbi-fb-source-step3 .sbi-fb-src-back-top { margin-bottom: 4px; } .sbi-fb-icon-success{ position: relative; width: 30px; height: 20px; margin-right: 10px; } .sbi-fb-icon-success:before{ content: ''; position: absolute; width: 13px; height: 5px; top: 4px; border-left: 3px solid currentColor; border-bottom: 3px solid currentColor; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sbi-fb-icon-cancel{ position: relative; width: 25px; height: 25px; margin-right: 10px; } .sbi-fb-icon-cancel:before, .sbi-fb-icon-cancel:after{ content: ''; position: absolute; width: 17px; height: 2px; top: 12px; left: 5px; background: currentColor; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sbi-fb-icon-cancel:after{ -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sbi-fb-source-inp-label,.sbi-fb-wh-label{ font-size: 14px; color: #434960; } .sbi-fb-source-mnl-type .sbi-fb-stp-src-ctn{ justify-content: flex-start; margin-bottom: 22px; margin-top: 8px; } #sbi-builder-app .sbi-fb-source-mnl-type .sbi-fb-stp-src-ctn .sbi-fb-stp-src-type{ margin-left: 0; margin-right: 32px } .sbi-fb-source-inp,.sbi-fb-wh-inp{ border-radius: 0px !important; outline: none ; margin-top: 2px; border: 1px solid #D0D1D7 !important; margin-bottom: 20px; height: 38px; line-height: 38px; } .sbi-fb-source-popup h1 { font-style: normal; font-weight: 600; font-size: 36px; line-height: 125%; color: #141B38; margin: 0; } .sbi-fb-source-popup h2 { font-style: normal; font-weight: 600; font-size: 32px; line-height: 125%; margin: 0; } .sbi-fb-source-popup h3 { font-style: normal; font-weight: 600; font-size: 24px; line-height: 120%; margin: 0 0 40px 0; letter-spacing: 0; } .sbi-fb-source-popup h4 { font-style: normal; font-weight: 600; font-size: 18px; line-height: 140%; margin: 0 0 4px 0; } .sbi-fb-slctf-back svg, .sbi-fb-slctf-nxt svg, .sbi-fb-source-btn-next svg{ width: 6px; height: 10px; } .sbi-fb-source-btn-next span { display: inline-block; margin-right: 15px; line-height: 160%; } .sb-single-step { display: flex; align-items: center; margin-bottom: 16px; } .sb-step-number { display: flex; align-items: center; justify-content: center; background: #F3F4F5; border-radius: 30px; width: 24px; height: 24px; margin-right: 16px; } #sbi-builder-app .sb-step-text { color: #434960; } .sb-two-buttons-wrap { box-sizing:border-box; float: left; display: flex; justify-content: center; align-items: center; width: 100%; padding: 0 19px 28px; } .sb-two-buttons-wrap .sbi-fb-source-btn { margin-top: 0; } .sbi-fb-source-step4 .sbi-fb-source-top { padding: 24px 54px 32px; text-align: center; } .sb-two-buttons-wrap > button:first-of-type { margin-right: 12px; } .sb-two-buttons-wrap .sb-question-circle { margin-right: 9px; } #sbi-group-app-tooltip{ cursor: pointer; } .sbi-group-app-screenshot{ display: none; position: absolute; bottom: 92px; left: 50%; margin-left: -325px; z-index: 10; border: 1px solid rgba(0,0,0,0.3); box-shadow: 0 0 0 5000px rgb(0 0 0 / 20%); border-radius: 5px; } #sbi-group-app-tooltip:hover .sbi-group-app-screenshot{ display: block !important; } .sbi-fb-source-btn[data-active = false] { pointer-events: none !important; } .sbi-fb-source-btn[data-active = false] svg path{ fill: #8C8F9A !important; } .sb-directions-p { margin-bottom: 40px; } .sbi-fb-srcs-item-avatar{ display: flex; width: 42px; height: inherit; justify-content: center; align-items: center; } .sbi-fb-srcs-item-avatar img{ width: 36px; height: 36px; border-radius: 50%; background: #eee; } .sbi-fb-srcs-item-inf{ width: 100%; height: inherit; display: flex; justify-content: center; flex-direction: column; } .sbi-fb-srcs-item-name{ font-weight: 600; } .sbi-fb-srcs-item-name-event{ font-size: 10px; font-weight: 500; color: #777; } .sbi-fb-srcs-item-type{ color: #434960; font-weight: 600; text-transform: uppercase; display: flex; align-items: center; } .sb-source-error-wrap { display: flex; justify-content: left; align-items: center; margin-left: 9px; } .sb-source-error-wrap span { font-weight: 600; font-size: 12px; line-height: 160%; color: #D72C2C; margin-left: 5px; } .sbi-fb-source-popup .sb-source-error-wrap { margin-left: 0; } .sb-source-error-wrap a { margin-left: 8px; font-weight: 600; font-size: 12px; line-height: 160%; text-decoration-line: underline; color: #0068A0; } .sb-is-group .sb-details-wrap { position: relative; display: flex; align-items: center; padding: 2px 6px 2px 22px; background: #F3F4F5; border-radius: 2px; } .sb-highlight-admin .sb-details-wrap { padding: 2px 6px 2px 17px; background: #E2F5FF; color: #0068A0; } .sb-highlight-admin span { color: #0068A0; } .sbi-fb-srcs-item-type i{ margin-right: 5px; } .sbi-fb-srcs-item-type svg{ float: left; margin-right: 5px; fill: currentColor; height: 8px; } .sb-has-details .sbi-fb-srcs-item-type svg{ position: absolute; top: 5px; right: 0; bottom: 0; left: 5px; height: 9px; } .sb-has-details .sbi-fb-srcs-item-type.sb-highlight-admin svg { top: 6px; } [data-type="page"] .sbi-fb-srcs-item-type svg{ height: 9px; } .sbi-fb-srcs-back{ margin-right: auto; } .sbi-groups-connect-actions { float: left; } .sb-alert, .sbi-error-ctn .sb-alert{ position: relative; margin: 0 0 38px; padding: 12px 12px 12px 44px; word-break: break-word; background: #FFEFCC } .sbi-connection-error .sb-alert { margin: 20px; } .sbi-connect-actions .sbi-fb-source-btn { margin-top: 0; } .sbi-connect-actions { float: left; } .sbi-connect-actions.sb-alerts-wrap .sb-alert { clear: left; } .sb-alerts-wrap .sb-alert svg, .sb-alert svg, .sbi-error-ctn .sb-alert svg{ position: absolute; top: 13px; left: 13px; } .sb-alert span, .sbi-error-ctn .sb-alert span{ color: #995C00; } #sbi-builder-app .sb-alert span a, .sbi-error-ctn .sb-alert span a{ color: #663D00; font-weight: 600; text-decoration: underline; } #sbi-settings .sbi-fb-source-step1.sbi-has-alert .sbi-fb-source-top h3 { margin-bottom: 12px; } .sbi-groups-connect-actions .sbi-fb-source-btn { margin-top: 0; } /* Install Plugin Modal on Select Source Flow */ .sbi-install-plugin-modal { max-width: 580px; } .sbi-install-plugin-body .sbi-install-plugin-header { height: 106px; background: #F3F4F5; padding: 20px; display: flex; box-sizing: border-box; flex-wrap: wrap; align-items: center; } .sbi-install-plugin-body .sbi-install-plugin-header .sb-plugin-image { background-color: #fff; box-shadow: 0px 1px 2px rgb(0 0 0 / 5%), 0px 4px 5px rgb(0 0 0 / 5%); border-radius: 2px; padding: 15px; max-height: 66px; box-sizing: border-box; margin-right: 24px; } .sbi-install-plugin-body .sbi-install-plugin-header h3 { font-size: 18px !important; line-height: 25px !important; display: flex; align-items: center; } .sbi-install-plugin-body .sbi-install-plugin-header h3 span { color: #fff; background: #59AB46; border-radius: 2px; font-size: 10px; line-height: 16px; letter-spacing: 0.08em; text-transform: uppercase; padding: 0px 6px; margin-left: 10px; } .sbi-install-plugin-body .sbi-install-plugin-header p { display: flex; font-size: 12px; line-height: 18px; color: #434960; margin: 5px 0 0 0; } .sbi-install-plugin-body .sbi-install-plugin-header p .sb-author-logo { margin-right: 8px; } .sbi-install-plugin-body .sbi-install-plugin-content { padding: 20px 20px 32px 107px; } .sbi-install-plugin-body .sbi-install-plugin-content p { margin: 0px; font-size: 14px; line-height: 22px; color: #434960; padding-right: 20px; } .sbi-install-plugin-body .sbi-install-plugin-content .sbi-install-plugin-btn { display: flex; align-items: center; justify-content: center; height: 38px; padding: 8px 20px; box-sizing: border-box; transition: all .15s ease-in-out; border-radius: 2px; width: 100%; margin-top: 28px; border: none; font-size: 14px; font-weight: 600; line-height: 160%; cursor: pointer; } .sbi-install-plugin-body .sbi-install-plugin-content .sbi-btn-orange:disabled { color: #8C8F9A !important; background: #E8E8EB !important; cursor: not-allowed; } .sbi-install-plugin-body .sbi-install-plugin-content .sbi-install-plugin-btn span { height: 20px; width: 20px; margin-right: 5px; } .sbi-fb-mr-fd-list button { cursor: pointer; display: flex; justify-content: space-between; } /* Tooltips */ .sb-control-elem-tltp{ margin-left: 10px; position: relative; } .sb-control-elem-tltp-icon{ float: left; cursor: pointer; } .sb-control-elem-tltp-icon svg{ width: 14px; float: left; } @media (min-width: 768px) and (max-width: 1079px) { .sbi-fb-mr-fd-img { width: 37%; } .sbi-fb-mr-fd-list button:not(:last-child) { margin-bottom: 8px; } } @media (min-width: 768px) and (max-width: 1023px) { .sbi-fb-srcslist-ctn, .sbi-fb-source-pp-customizer .sbi-fb-srcslist-ctn { grid-template-columns: 49.2% 49.2%; gap: 2%; margin-top: 8px; } .sbi-fb-slctfd-action { width: 100%; } .sbi-fb-srcs-item { margin-top: 3px; } .sbi-manual-question { max-width: 390px; } .sbi-fb-feedtypes-popup { left: 0; max-width: calc(100% - 60px); } .sbi-fb-feedtypes-pp-ctn.sbi-fb-center-boss { top: 40px; } } @media (max-width: 767px) { .sbi-fb-feedtypes-pp-ctn.sbi-fb-center-boss { align-items: baseline; } .sbi-fb-feedtypes-popup { max-width: calc(100% - 40px); top: 50px; } #sbi-builder-app .sb-positioning-wrap { width: 130px; } .sbi-fb-embed-popup, .sbi-fb-dialog-popup { width: 100%; max-width: calc(100% - 40px); } .sbi-fb-popup-inside { left: 0; } .sbi-fb-extensions-pp-ctn .sbi-fb-popup-inside.sbi-fb-extensions-popup, .sbi-fb-source-ctn .sbi-fb-popup-inside { max-width: calc(100% - 40px); } .sbi-fb-source-ctn.sbi-fb-center-boss, .sbi-fb-extensions-pp-ctn.sbi-fb-center-boss{ align-items: baseline; } .sbi-fb-extensions-pp-ctn.sbi-fb-center-boss .sbi-fb-popup-inside{ top: 50px; } .sbi-extension-bullet-list { grid-template-columns: 100%; } .sbi-fb-extpp-bottom { padding: 20px; } .sbi-fb-extpp-info { width: 100%; padding-right: 20px; padding-left: 20px; } .sbi-fb-extpp-img { display: none; } .sbi-fb-extpp-top { height: 195px; } .sbi-fb-source-pp-customizer .sbi-fb-srcslist-ctn { grid-template-columns: 99.2%; gap: 2%; margin-bottom: 50px; } .sbi-fb-source-account-info { flex-wrap: wrap; } .sbi-fb-source-account-info > span { width: 100%; } .sbi-fb-source-account-info img { margin-left: 0; } .sbi-fb-source-btn { margin-top: 25px; } .sbi-fb-source-bottom { flex-wrap: wrap; margin-top: 0; } .sbi-fb-src-add-manual { margin-left: 0; margin-top: 15px; } .sbi-fb-types-list { grid-template-columns: 100%; } .sbi-fb-types-list .sbi-fb-type-el { margin-bottom: 10px; } .sbi-fb-create-ctn { margin-top: 90px; padding: 0 20px 65px; } #sbi-builder-app h1 { font-size: 32px; } .sbi-fb-social-wall-between, .sbi-fb-social-wall-end { display: none; } .sbi-graphic-row-main { justify-content: space-between; } .sbi-fb-slctfd-action { width: 100%; } .sbi-fb-mr-feeds { flex-wrap: wrap; margin-bottom: 60px; } .sbi-fb-mr-feeds .sbi-fb-mr-fd-content, .sbi-fb-slctsrc-content, .sbi-fb-section-wh-insd, .sbi-fb-types, .sbi-fb-adv-types { padding: 20px; } .sbi-fb-source-ctn .sbi-fb-popup-inside.sbi-install-plugin-modal { top: 0; } .sbi-fb-mr-fd-list button:not(:last-child) { margin-bottom: 8px; } .sbi-fb-srcs-item { margin-top: 3px; } #sbi-builder-app h2 { font-size: 26px; } .sbi-fb-srcs-desc { width: 100%; } .sbi-fb-source-list { grid-template-columns: 99%; } .sb-dialog-ctn.sbi-fb-center-boss .sbi-fb-popup-inside { max-width: calc(100% - 40px); } } @media (max-width: 480px) { .sbi-fb-source-ctn .sbi-fb-popup-inside { top: 45px; margin-bottom: 46px; } .sbi-csz-header-insider .sb-button-standard { font-size: 13px; padding: 8px 15px 8px 34px; } .sbi-csz-header-insider .sb-button-standard svg { width: 13px; height: 13px; left: 14px; top: 10px; } .sbi-fb-header.sbi-csz-header { height: 126px; } .sbi-csz-hd-name { height: 30px; margin-top: 5px; } .sb-customizer-ctn .sb-customizer-sidebar { margin-top: 120px; } .sb-fs-boss.sbi-fb-center-boss { overflow: scroll; } .sbi-fb-stp1-elm { flex-wrap: wrap; } .sbi-fb-stp1-elm-txt { margin-right: 0%; width: calc(100% - 50px); } .sbi-fb-stp1-elm .sbi-fb-stp-src-ctn.sbi-fb-stp1-elm-act { margin-left: 24px; } .sbi-fb-stp1-elm .sbi-fb-stp1-elm-act { margin-top: 10px; margin-left: 42px; } } .sb-control-elem-tltp-content{ position: fixed; background: #fff; padding: 8px 11px; text-align: center; line-height: 1.5em; top: 0; left: 0; z-index: 999999999; -webkit-transform: translateX(-50%) translateY(-100%); transform: translateX(-50%) translateY(-100%); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.19); } .sb-control-elem-tltp-content:before{ content: ''; position: absolute; left: 50%; bottom: -10px; border-top: 12px solid #fff; border-right: 12px solid transparent; border-left: 12px solid transparent; -webkit-transform: translateX(-50%); transform: translateX(-50%); z-index: 2; } .sb-control-elem-tltp-content:after{ content: ''; position: absolute; left: 50%; bottom: -12px; margin-left: 0px; border-top: 14px solid #eee; border-right: 15px solid transparent; border-left: 15px solid transparent; -webkit-transform: translateX(-50%); transform: translateX(-50%); } .sb-control-elem-tltp:hover .sb-control-elem-tltp-content{ opacity: 1; visibility: visible; top: 24px; max-width: 300px; width: auto; } .sb-control-elem-tltp-txt{ position: relative; max-width: 300px; width: max-content; } .sb-control-elem-tltp-txt[data-align="left"]{ text-align: left!important; } .sb-tltp-black-link{ text-decoration: underline!important; color: #000; } /* Social Wall Links */ .sb-social-wall-link-wrap { display: flex; font-size: 14px; margin: 10px 0; } .sb-social-wall-link { padding: 0 12px; border-right: 1px solid #ccc; color: #0068A0!important; line-height: 1; } .sb-social-wall-link a { text-decoration: none; } .sb-social-wall-link:first-child { padding-left: 0; border-right: 1px solid #ccc; color: #0068A0!important; line-height: 1; } .sb-social-wall-link:last-child { border-right: none; } .sb-social-wall-link a:focus { outline: none; box-shadow: none; } /* Add Source Loading */ .sb-fb-source-redirect-ld{ text-align: center; } .sb-fb-source-redirect-ld div{ display: inline-block; width: 32px; height: 32px; border-radius: 50px; margin: 0 10px; position: relative; background-color: #0096CC; color: #0096CC; -webkit-animation: sb-source-redirect 1s infinite linear alternate; animation: sb-source-redirect 1s infinite linear alternate; -webkit-animation-delay: .5s; animation-delay: .5s; } .sb-fb-source-redirect-ld div:before, .sb-fb-source-redirect-ld div:after{ content: ''; display: inline-block; position: absolute; top: 0; } .sb-fb-source-redirect-ld div:before{ left: -45px; width: 32px; height: 32px; border-radius: 50px; background-color: #0096CC; color: #0096CC; -webkit-animation: sb-source-redirect 1s infinite alternate; animation: sb-source-redirect 1s infinite alternate; -webkit-animation-delay: 0s; animation-delay: 0s; } .sb-fb-source-redirect-ld div:after{ left: 45px; width: 32px; height: 32px; border-radius: 50px; background-color: #0096CC; color: #0096CC; -webkit-animation: sb-source-redirect 1s infinite alternate; animation: sb-source-redirect 1s infinite alternate; -webkit-animation-delay: 1s; animation-delay: 1s; } @-webkit-keyframes sb-source-redirect { 0% {background-color: #0096CC;} 50%,100% {background-color: #B5E5FF;} } @keyframes sb-source-redirect { 0% {background-color: #0096CC;} 50%,100% {background-color: #B5E5FF;} } .sb-fb-source-redirect-info{ text-align: center; margin-top: 50px; } .sb-fb-source-redirect-info strong{ font-size: 18px; } .sb-fb-source-redirect-info p{ color: #8C8F9A; padding: 0 24%; font-size: 16px; margin-bottom: 0px; } .sbi-fb-popup-inside[data-step="redirect_1"]{ width: 575px; height: 320px; display: flex; justify-content: center; align-items: center; } /*Personal Account Popup*/ .sbi-personal-account-ctn .sbi-source-account-box{ display: flex; justify-content: center; align-items: center; } .sbi-pers-account-icon{ width: 64px; height: 64px; display: flex; justify-content: center; align-items: center; border: 7px solid #bfe8ff; border-radius: 50%; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); } .sbi-pers-account-icon svg{ float: left; } .sbi-personal-account-ctn .sbi-fb-personal-step1 .sbi-fb-source-top { padding: 27px 54px 27px; text-align: center; } .sbi-fb-personal-step2 .sbi-fb-source-btn{ margin-right: 0px !important; } .sbi-personal-account-ctn button{ font-weight: 600; } .sbi-fb-personal-form{ text-align: left; padding-top: 25px; padding-bottom: 20px; } .sbi-fb-personal-step2 > *{ padding-left: 19px; padding-right: 19px; } .sbi-fb-personal-upload-btn{ margin-top: 12px; } .sbi-fb-personal-upload-btn button span{ padding: 0 5px; } .sbi-fb-personal-upload-btn button svg{ float: left; } .sbi-fb-personal-upload-btn input[type="file"]{ display: none; } .sbi-fb-personal-upload-btn > *{ display: inline-flex; margin-right: 7px!important; } .sbi-fb-personal-textarea{ margin-top: 16px; } .sbi-fb-personal-textarea > *{ width: 100%; float: left; } .sbi-fb-personal-textarea label{ font-size: 14px; color: #434960; margin-bottom: 10px; margin-top: 10px; } .sbi-fb-personal-textarea textarea{ height: 77px; border: 1px solid #D0D1D7; border-radius: 1px; padding: 8px 2px 2px 12px; outline: none; } /*** 7.0 Settings CTA ***/ .sbi-settings-cta { background-color: #fff; padding: 24px 20px 20px; box-shadow: 0px 1px 2px rgb(0 0 0 / 5%), 0px 4px 5px rgb(0 0 0 / 5%); margin-top: 12px; } .sbi-settings-cta .sbi-cta-title, .sbi-settings-cta .sbi-cta-head-inner { display: flex; } .sbi-settings-cta .sbi-cta-head-inner { justify-content: space-between; max-width: 820px; } .sbi-settings-cta .sbi-cta-head-inner .sbi-cta-btn a { display: flex; flex-direction: row; justify-content: center; align-items: center; padding: 5px 12px 6px 20px; font-weight: 600; font-size: 14px; line-height: 160%; margin-top: 5px; } .sbi-settings-cta .sbi-cta-head-inner .sbi-cta-btn a svg { margin-left: 12px; width: 10px; } .sbi-settings-cta .sbi-plugin-title-bt { display: flex; } .sbi-settings-cta .sbi-plugin-title-bt .sbi-cta-btn { width: 177px; } .sbi-settings-cta .sbi-cta-title .sbi-plugin-logo { background: #FFFFFF; box-shadow: 0px 6.05242px 7.56552px rgba(0, 26, 119, 0.0415), 0px 3.39293px 4.24117px rgba(0, 26, 119, 0.04), 0px 1.80196px 2.25245px rgba(0, 26, 119, 0.0285), 0px 0.749837px 0.937296px rgba(0, 26, 119, 0.0337); border-radius: 2px; min-width: 60px; width: 65px; height: 65px; display: flex; justify-content: center; align-items: center; margin-right: 30px; border: 1px solid #ecebeb; } #sbi-builder-app .sbi-settings-cta .sbi-cta-title .sbi-plugin-logo{ width: 75px; height: 75px; } .sbi-settings-cta .sbi-cta-title .sbi-cta-discount-label { background: #FFEFCC; border-radius: 2px; padding: 0px 11px 0px 11px; font-weight: 600; font-size: 14px; line-height: 160%; color: #663D00; display: flex; flex-direction: row; justify-content: space-between; align-items: center; max-width: 445px; margin-top: 4px; box-sizing: border-box; margin-right: 10px; height: 35px; } #sbi-builder-app .sbi-settings-cta .sbi-cta-title .sbi-cta-discount-label svg { margin-right: 6px; } .sbi-settings-cta .sbi-cta-title .sbi-cta-discount-label svg path{ fill: #663D00; } #sbi-builder-app .sbi-settings-cta .sbi-cta-title .sbi-cta-discount-label { color: #663D00; background: #FFEFCC; } .sbi-settings-cta .sbi-cta-boxes { margin: 36px 0px 0px 7px; display: flex; background-color: #fff; box-shadow: 0px 1px 2px rgb(0 0 0 / 5%), 0px 4px 5px rgb(0 0 0 / 5%); border: 1px solid #E8E8EB; border-bottom: 0px solid transparent; max-width: 1170px; } .sbi-settings-cta .sbi-cta-box:not(:last-child) { border-right: 1px solid #E8E8EB; } .sbi-settings-cta .sbi-cta-box { padding: 16px 30px 16px 18px; display: flex; } .sbi-settings-cta .sbi-cta-box .sbi-cta-box-icon { margin-right: 24px; max-height: 50px; } .sbi-settings-cta .sbi-cta-box .sbi-cta-box-title { font-weight: 600; font-size: 14px; line-height: 140%; padding-top: 5px; } .sbi-settings-cta .sbi-cta-much-more{ display: flex; padding: 0 14px; flex-wrap: wrap; margin-top: 3px; justify-content: space-between; max-width: 1170px; } .sbi-settings-cta .sbi-cta-much-more .sbi-cta-mm-left { width: 330px; } .sbi-settings-cta .sbi-cta-much-more .sbi-cta-mm-right ul { display: grid; grid-template-columns: 33% 33% 33%; grid-column-gap: 2%; padding-top: 10px; } .sbi-settings-cta .sbi-cta-much-more .sbi-cta-mm-left h4 { font-weight: 600; font-size: 18px; line-height: 140%; color: #141B38; margin: 1.33em 0 !important; } .sbi-settings-cta .sbi-cta-much-more .sbi-cta-mm-right ul li { font-size: 14px; line-height: 160%; color: #434960; width: 260px; position: relative; } .sbi-settings-cta .sbi-cta-much-more .sbi-cta-mm-right ul li::before { background: #0096CC; width: 4px; height: 4px; content: ''; position: absolute; left: -19px; top: 10px; } .sbi-settings-cta .sbi-cta-try-demo { margin-top: 13px; max-width: 1180px; } .sbi-settings-cta .sbi-cta-try-demo a { width: 100%; justify-content: center; display: flex; align-items: center; vertical-align: middle; background: #F3F4F5; border: 1px solid #DCDDE1; box-sizing: border-box; border-radius: 2px; padding: 7px 20px; font-weight: 600; font-size: 14px; line-height: 22px; color: #141B38; letter-spacing: 0.2px; cursor: pointer; transition: all 0.15s ease-in-out; text-decoration: none; } .sbi-settings-cta .sbi-cta-try-demo a span svg { transform: translate(5px, 4px); } .sbi-settings-cta .sbi-cta-try-demo .sbi-btn span { margin-left: 9px; transform: translateY(1px); } .sbi-cta-toggle-features { background: #F3F4F5; width: 100%; display: flex; justify-content: center; padding: 5px 0 4px 15px; box-shadow: 0px 1px 2px rgb(0 0 0 / 5%), 0px 4px 5px rgb(0 0 0 / 5%); box-sizing: border-box; } .sbi-cta-toggle-features .sbi-cta-toggle-btn { font-weight: 600; font-size: 14px; line-height: 160%; border: none; background: none; display: flex; cursor: pointer; } .sbi-cta-toggle-features .sbi-cta-toggle-btn svg { transform: translateY(0px); margin-left: 4px; } @media (min-width: 1170px) and (max-width: 1540px) { .sbi-settings-cta .sbi-cta-much-more .sbi-cta-mm-right ul li { width: 240px; } .sbi-settings-cta .sbi-cta-much-more .sbi-cta-mm-left { width: 220px; } } @media (min-width: 1170px) and (max-width: 1340px) { .sbi-settings-cta .sbi-cta-box .sbi-cta-box-icon { margin-right: 15px; } .sbi-settings-cta .sbi-cta-box { padding: 16px 15px 16px 15px; } } @media (max-width: 1300px) { .sbi-settings-cta .sbi-cta-much-more .sbi-cta-mm-right ul { grid-template-columns: 48% 48%; } } @media (max-width: 1170px) { .sbi-settings-cta .sbi-cta-boxes { flex-wrap: wrap; } .sbi-settings-cta .sbi-cta-boxes .sbi-cta-box { width: 50%; box-sizing: border-box; } .sbi-settings-cta .sbi-cta-box:not(:last-child) { border-right: none; } .sbi-settings-cta .sbi-cta-box:first-child, .sbi-settings-cta .sbi-cta-box:nth-child(2) { border-bottom: 1px solid #E8E8EB; } .sbi-settings-cta .sbi-cta-box:first-child, .sbi-settings-cta .sbi-cta-box:nth-child(3) { border-right: 1px solid #E8E8EB; } .sbi-settings-cta .sbi-cta-much-more .sbi-cta-mm-right { padding-left: 20px; } .sbi-settings-cta .sbi-cta-much-more .sbi-cta-mm-right ul { margin: 0; padding: 0; } } @media (max-width: 770px) { .sbi-settings-cta .sbi-cta-boxes .sbi-cta-box { width: 100%; align-items: center; } .sbi-settings-cta .sbi-cta-box { border: none; } .sbi-settings-cta .sbi-cta-box:not(:last-child) { border-bottom: 1px solid #E8E8EB; } .sbi-settings-cta .sbi-cta-much-more .sbi-cta-mm-right ul { grid-template-columns: 100%; margin-top: 0px; } .sbi-settings-cta .sbi-cta-much-more .sbi-cta-mm-left h4 { margin-bottom: 10px !important; } .sb-tab-content .sb-tab-box .sbi-caching-pro-cta { padding: 8px 25px; } .sbi-settings-cta .sbi-cta-head-inner { flex-wrap: wrap; } .sbi-settings-cta .sbi-cta-title { margin-bottom: 20px; } .sbi-settings-cta .sbi-cta-btn { width: 100%; } .sbi-settings-cta .sbi-plugin-title-bt { flex-direction: column; } .sbi-plugin-title { width: 67%; } } @media (max-width: 580px) { .sbi-settings-cta .sbi-cta-title .sbi-plugin-logo { margin-right: 20px; } } /* Uncanny Automator Integration Popup */ .sbi-integration-popup-modal .sbi-integration-popup { width: 100%; max-width: 580px; box-shadow: 0px 26.7377px 77.2886px rgba(0, 0, 0, 0.107828), 0px 14.2952px 41.3222px rgba(0, 0, 0, 0.0894161), 0px 8.01379px 23.1649px rgba(0, 0, 0, 0.075), 0px 4.25607px 12.3027px rgba(0, 0, 0, 0.0605839), 0px 1.77104px 5.11942px rgba(0, 0, 0, 0.0421718); border-radius: 8px; padding: 25px 0 0 0; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-content-header { text-align: center; padding: 0 100px; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-content-header img { width: 226px; margin-bottom: -55px; } #sbi-settings .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-content-header h3 { font-weight: 600; font-size: 18px; line-height: 140%; text-align: center; color: #141B38; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-content-header p { font-weight: 400; font-size: 12px; line-height: 160%; text-align: center; color: #696D80; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-steps { margin-top: 16px; padding: 33px 43px 48px; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-step { background: #FFFFFF; border: 1px solid #E6E6EB; border-radius: 8px; padding: 21px 100px 27px 20px; position: relative; margin-bottom: 12px; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-step .sbi-step-image { position: absolute; right: -7px; width: 170px; top: 17px; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-setup-step .sbi-step-image { width: 186px; right: -1px; top: 8px; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-step h4 { font-weight: 600; font-size: 14px; line-height: 160%; color: #141B38; margin: 0; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-step p { font-weight: 400; font-size: 12px; line-height: 160%; color: #696D80; margin-top: 0px; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-step .sbi-btn { margin-top: 16px; border-radius: 4px; padding: 6px 8px; font-weight: 600; font-size: 12px; line-height: 160%; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-step .sbi-btn-install { background-color: #0068A0; color: #fff; box-shadow: 0px 2px 5px rgba(60, 66, 87, 0.12), 0px 1px 1px rgba(0, 0, 0, 0.08), inset 0px -1px 1px rgba(0, 0, 0, 0.12); transition: all .2s ease-in; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-step .sbi-btn-install:hover { background-color: #117db7; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-step .sbi-btn-install:disabled { background-color: #117db7 !important; color: white !important; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-step .sbi-btn svg { margin-right: 1px; width: 16px; height: 17px; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-step .sbi-btn svg path { fill: white; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-step .sbi-btn:disabled { background: #F9F9FA; color: #696D80; } @media (max-width: 768px) { .sbi-integration-popup-modal .sbi-integration-popup { width: calc(85% - 20px); left: 0px; } } @media (max-width: 600px) { .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-content-header { padding: 0 50px; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-steps { padding: 33px 25px 48px; } .sbi-integration-popup-modal .sbi-integration-popup .sbi-popup-ua-integration-step { padding: 21px 94px 27px 20px; } }PKL\O8 a{ width: 100%; max-width: 100%; margin-right: 0%; margin-bottom: 5px; text-align: center; float: left; } .sbi-preview-ctn .sbi-post-item-link-info{ line-height: 1.4; } .sbi-preview-ctn .sbi-photos-item-ctn{ margin: 0 0 20px 0; padding: 0; text-align: center; border: 1px solid rgba(0, 0, 0, .1); } [data-feed-layout="grid"] .sbi-photos-item-ctn, [data-feed-layout="grid"] .sbi-albums-item-ctn{ border-radius: unset!important; } .sbi-preview-ctn .sbi-singlemedia-item-info{ display: flex; flex-direction: column; align-items: center; } .sbi-preview-ctn .sbi-singlemedia-item-info a:hover{ text-decoration: underline; } .sbi-preview-ctn .sbi-singlemedia-item-info{ width: 100%; height: 70px; float: left; clear: both; overflow: hidden; } .sbi-preview-ctn .sbi-singlemedia-item-info > h4{ font-size: 14px!important; line-height: 1.2!important; margin: 10px 0 0 0!important; padding: 0!important; } .sbi-preview-ctn .sbi-singlemedia-item-info > p{ font-size: 12px; color: gray; margin: 5px 0 0 0; } .sbi-preview-ctn .sbi-singlemedia-item{ margin: 0 0 20px 0; text-align: center; } .sbi-preview-ctn .sbi-preview-likebox-ctn iframe{ width: 100% !important; margin: 0 !important; border: 0 !important; padding: 0; position: relative; top: 0; left: 0; } /*Event Details*/ .sbi-preview-ctn .sbi-post-event-street{ display: block } /* Featured & Single Album Holder */ .sbi-preview-ctn .sbi-single-holder-ctn{ height: 600px; background: #fff; box-shadow: 0 0px 6px rgba(0,0,0,0.05); display: flex; justify-content: center; align-items: center; flex-direction: column; } .sbi-preview-ctn .sbi-single-holder-img{ width: 130px; height: 130px; background: #F3F4F5; border: 1px dashed #D0D1D7; display: flex; justify-content: center; align-items: center; margin-bottom: 50px; } .sbi-preview-ctn .sbi-single-holder-content{ text-align: center; } .sbi-preview-ctn .sbi-single-holder-content strong{ font-size: 24px; margin-bottom: 10px; } .sbi-preview-ctn .sbi-single-holder-content p{ font-size: 16px; line-height: 1.7em; color: #8C8F9A; margin: 0px; margin-top: 8px; } /*Post Element Overlay */ .sbi-preview-ctn .sbi-post-overlay{ position: absolute; width: 100%; height: 100%; cursor: pointer; left: 0; top: 0; background: rgba(0,0,0,0.4); z-index: 9; opacity: 0; visibility: hidden; -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .sbi-preview-ctn .sbi-post-item-media-wrap:hover .sbi-post-overlay, .sbi-preview-ctn .sbi-post-item-iframe-ctn:hover .sbi-post-overlay, .sbi-preview-ctn .sbi-post-item-video-ctn:hover .sbi-post-overlay, .sbi-preview-ctn .sbi-post-overlay-parent:hover .sbi-post-overlay, .sbi-preview-ctn .sbi-videos-item-source:hover .sbi-post-overlay{ opacity: 1; visibility: visible; } /*Lightbox */ .sbi-lightbox-ctn{ width: 100%; height: 100%; position: absolute; left: 0; top: 2px; background: rgba(0,0,0,0.9); z-index: 9; display: none; justify-content: center; align-items: flex-start; padding-top: 100px; } .sbi-lightbox-ctn[data-visibility="shown"]{ display: flex; } .sbi-lightbox-closer{ position: absolute; left: 0; top: 0; z-index: 1; height: 100%; width: 100%; } .sbi-lightbox-image img{ float: left; max-width:780px; } .sbi-lightbox-content{ max-width: 100%; position: relative; z-index: 2; } .sbi-lightbox-content-insider{ position: relative; padding-right: 300px; display: flex; } [data-comments="false"] .sbi-lightbox-content-insider{ padding-right: 0px; } [data-comments="false"] .sbi-lightbox-content{ max-width: 100%; position: relative; z-index: 2; } .sbi-lightbox-sidebar{ width: 300px; box-sizing: border-box; position: absolute; right: 0px; top: 0px; background: #fff; height: 100%; padding: 15px; overflow: auto; } .sbi-lightbox-caption{ float: left; box-sizing: border-box; padding: 10px; background: #fff; position: relative; position: absolute; } .sbi-lightbox-caption .sbi-lightbox-cls{ top:3px; } .sbi-lightbox-sidebar .sbi-post-item-meta-top{ display: none!important; } .sbi-lightbox-sidebar .sbi-post-item-meta-comments{ display: block!important; } .sbi-lightbox-sidebar .sbi-post-item-meta-wrap{ margin-top: 12px; } .sbi-lightbox-cls{ position: absolute; width: 15px; height: 15px; top: 8px; right: 6px; cursor: pointer; z-index: 8; } .sbi-lightbox-cls:before, .sbi-lightbox-cls:after{ content: ''; position: absolute; height: 3px; width: 13px; left: 1px; top: 6px; background: currentColor; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sbi-lightbox-cls:after{ -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sbi-lightbox-nav{ position: absolute; width: 40px; height: 100%; display: flex; justify-content: center; align-items: center; left: -60px; cursor: pointer; } .sbi-lightbox-next{ left: unset; right:-60px; } .sbi-lightbox-nav-icon{ width: 24px; height: 24px; border-bottom: 4px solid #fff; border-right: 4px solid #fff; -webkit-transform: rotate(135deg); transform: rotate(135deg); opacity: .7; -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .sbi-lightbox-next .sbi-lightbox-nav-icon{ -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sbi-lightbox-nav:hover .sbi-lightbox-nav-icon{ opacity: 1; } .sbi-lightbox-thumbs{ background: #222; } .sbi-lightbox-thumb-item{ float: left; width: 60px; height: 60px; cursor: pointer; box-sizing: border-box; -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; background-size: cover; background-position: center center; margin: 4px; } .sbi-lightbox-thumb-item:hover, .sbi-lightbox-thumb-item[data-active="true"]{ box-shadow: inset 0 0 0 4px rgb(255 255 255 / 70%); border: 1px solid #bbb; } .sbi-lightbox-sidebar .sbi-post-item-text{ line-height: 1.3em } /* COLOR SCHEMES */ /*LIGHT*/ [data-preview-colorscheme="light"] .sbi-post-item-content{ color: rgba(0,0,0,.8); } [data-preview-colorscheme="light"] .sbi-singlemedia-item-info p{ color: rgba(0,0,0,.7); } [data-preview-colorscheme="light"] .sbi-post-item-text a{ color: #141B38; text-decoration: underline; } [data-preview-colorscheme="light"] .sbi-post-item-text-expand, [data-preview-colorscheme="light"] .sbi-post-item-action-link{ color: #141B38; } [data-preview-colorscheme="light"] .sbi-post-item-date{ color: rgba(0,0,0,0.5) } /*DARK*/ [data-preview-colorscheme="dark"] .sbi-post-item-content{ color: rgba(255,255,255,.75); background-color: rgba(0,0,0,.85) } [data-preview-colorscheme="dark"] .sbi-singlemedia-item-info p{ color: rgba(255,255,255,.75); } [data-preview-colorscheme="dark"] .sbi-post-item-text a{ color: #fff; text-decoration: underline; } [data-preview-colorscheme="dark"] .sbi-post-item-text-expand, [data-preview-colorscheme="dark"] .sbi-post-item-action-link{ color: #fff; } [data-preview-colorscheme="dark"] .sbi-post-item-date{ color: rgba(255,255,255,.5); } .sbi-videos-item-ctn,.sbi-albums-item-ctn,.sbi-photos-item-ctn{ border-bottom: 0px!important; } .sbi-preview-posts-grid .sbi-videos-item-ctn .sbi-post-item-content, .sbi-preview-posts-grid .sbi-videos-item-ctn .sbi-post-overlay-parent, .sbi-preview-posts-grid .sbi-videos-item-ctn .sbi-post-overlay-parent > .sbi-fb-fs{ position: absolute; width: 100%; height: 100%; } .sbi-preview-posts-grid .sbi-videos-item-ctn .sbi-post-overlay-parent{ background-size: cover!important; background-position: center center!important; } .sbi-preview-posts-grid .sbi-videos-item-ctn .sbi-post-overlay-parent{ height: calc(100% - 70px) } .sbi-preview-posts-grid .sbi-singlemedia-item-info{ position: absolute; bottom: 0px; } /* Carousel */ .owl-stage{ position: relative; } .owl-stage-outer{ overflow: hidden; } .owl-item{ float: left; } .owl-dots{ width: 100%; height: 35px; text-align: center; margin-top: 10px; margin-bottom: 30px; display: flex; justify-content: center; align-items: center; } .owl-dot{ display: inline-block; width: 12px; height: 12px; margin: 5px 7px; filter: Alpha(Opacity=25); opacity: 0.25; padding:0px !important; border-radius: 20px; background: #000; box-shadow: 0 0 1px 0 rgb(255 255 255 / 80%); outline: none; border: 0px; cursor: pointer; } .owl-dot.active,.owl-dot:hover{ opacity: .5; } .owl-prev, .owl-next{ width: 40px; height: 40px; border-radius: 50px; padding: 0px; outline: none; border: 0px; cursor: pointer; font-size: 22px; display: flex; justify-content: center; align-items: center; background: #000; color: #fff; } .owl-dots .owl-prev, .owl-dots .owl-next{ display: inline-block; } .owl-prev span, .owl-next span{ margin-top: -3px; } .sbi-carousel[data-navigation="none"] .owl-nav{ display: none; } .sbi-carousel[data-navigation="onhover"] .owl-prev, .sbi-carousel[data-navigation="onhover"] .owl-next{ opacity: 0; position: absolute; top: 50%; margin-top: -20px; left: 0px; -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .sbi-carousel[data-navigation="onhover"] .owl-next{ left: unset; right: 0px; } .sbi-carousel[data-navigation="below"] .owl-prev, .sbi-carousel[data-navigation="below"] .owl-next, .sbi-carousel:hover .owl-prev, .sbi-carousel:hover .owl-next{ opacity: .5; } .sbi-carousel .owl-prev:hover, .sbi-carousel .owl-next:hover{ opacity: 1; } .sbi-carousel .cff_carousel-more{ display: block; position: relative; clear: both; width: 100%; text-align: center; border-radius: 0; border-top: 1px solid rgba(0,0,0,0.5); background: #000; filter: Alpha(Opacity=25); opacity: 0.25; color: #fff; padding: 0; border: none; margin-top: 0; height: auto; } .sbi-carousel .cff_carousel-more:hover, .sbi-carousel .cff_carousel-more:focus{ filter: Alpha(Opacity=50); opacity: 0.5; } .sbi-carousel .cff_carousel-more .fa-caret-down { font-size: 50px; line-height: 1; padding: 0; position: relative; top: -19px; } /*Reviews Ratings*/ .sbi-rating { float: none; display: inline-block; margin: 0 0 5px 0 !important; padding: 3px 6px; height: auto; background: #5890FF; color: #fff; white-space: nowrap; border-radius: 100px; line-height: 1em; } span.sbi-rating-num, span.sbi-star { margin: 0 2px 0 0 !important; padding: 0; height: auto; display: inline-block; vertical-align: top; line-height: 1; color: #fff; font-weight: normal; font-size: 12px!important; } span.sbi-rating-num{ margin: 0 2px 0 4px !important; }PKL\ \a 007instagram-feed/admin/builder/assets/css/tooltipster.cssnu[/* This is the core CSS of Tooltipster */ /* GENERAL STRUCTURE RULES (do not edit this section) */ .tooltipster-base { /* this ensures that a constrained height set by functionPosition, if greater that the natural height of the tooltip, will be enforced in browsers that support display:flex */ display: flex; pointer-events: none; /* this may be overriden in JS for fixed position origins */ position: absolute; } .tooltipster-box { /* see .tooltipster-base. flex-shrink 1 is only necessary for IE10- and flex-basis auto for IE11- (at least) */ flex: 1 1 auto; } .tooltipster-content { /* prevents an overflow if the user adds padding to the div */ box-sizing: border-box; /* these make sure we'll be able to detect any overflow */ max-height: 100%; max-width: 100%; overflow: auto; } .tooltipster-ruler { /* these let us test the size of the tooltip without overflowing the window */ bottom: 0; left: 0; overflow: hidden; position: fixed; right: 0; top: 0; visibility: hidden; } /* ANIMATIONS */ /* Open/close animations */ /* fade */ .tooltipster-fade { opacity: 0; -webkit-transition-property: opacity; -moz-transition-property: opacity; -o-transition-property: opacity; -ms-transition-property: opacity; transition-property: opacity; } .tooltipster-fade.tooltipster-show { opacity: 1; } /* grow */ .tooltipster-grow { -webkit-transform: scale(0,0); -moz-transform: scale(0,0); -o-transform: scale(0,0); -ms-transform: scale(0,0); transform: scale(0,0); -webkit-transition-property: -webkit-transform; -moz-transition-property: -moz-transform; -o-transition-property: -o-transform; -ms-transition-property: -ms-transform; transition-property: transform; -webkit-backface-visibility: hidden; } .tooltipster-grow.tooltipster-show { -webkit-transform: scale(1,1); -moz-transform: scale(1,1); -o-transform: scale(1,1); -ms-transform: scale(1,1); transform: scale(1,1); -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); -moz-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); -ms-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); -o-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); } /* swing */ .tooltipster-swing { opacity: 0; -webkit-transform: rotateZ(4deg); -moz-transform: rotateZ(4deg); -o-transform: rotateZ(4deg); -ms-transform: rotateZ(4deg); transform: rotateZ(4deg); -webkit-transition-property: -webkit-transform, opacity; -moz-transition-property: -moz-transform; -o-transition-property: -o-transform; -ms-transition-property: -ms-transform; transition-property: transform; } .tooltipster-swing.tooltipster-show { opacity: 1; -webkit-transform: rotateZ(0deg); -moz-transform: rotateZ(0deg); -o-transform: rotateZ(0deg); -ms-transform: rotateZ(0deg); transform: rotateZ(0deg); -webkit-transition-timing-function: cubic-bezier(0.230, 0.635, 0.495, 1); -webkit-transition-timing-function: cubic-bezier(0.230, 0.635, 0.495, 2.4); -moz-transition-timing-function: cubic-bezier(0.230, 0.635, 0.495, 2.4); -ms-transition-timing-function: cubic-bezier(0.230, 0.635, 0.495, 2.4); -o-transition-timing-function: cubic-bezier(0.230, 0.635, 0.495, 2.4); transition-timing-function: cubic-bezier(0.230, 0.635, 0.495, 2.4); } /* fall */ .tooltipster-fall { -webkit-transition-property: top; -moz-transition-property: top; -o-transition-property: top; -ms-transition-property: top; transition-property: top; -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); -moz-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); -ms-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); -o-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); } .tooltipster-fall.tooltipster-initial { top: 0 !important; } .tooltipster-fall.tooltipster-show { } .tooltipster-fall.tooltipster-dying { -webkit-transition-property: all; -moz-transition-property: all; -o-transition-property: all; -ms-transition-property: all; transition-property: all; top: 0 !important; opacity: 0; } /* slide */ .tooltipster-slide { -webkit-transition-property: left; -moz-transition-property: left; -o-transition-property: left; -ms-transition-property: left; transition-property: left; -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); -moz-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); -ms-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); -o-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); } .tooltipster-slide.tooltipster-initial { left: -40px !important; } .tooltipster-slide.tooltipster-show { } .tooltipster-slide.tooltipster-dying { -webkit-transition-property: all; -moz-transition-property: all; -o-transition-property: all; -ms-transition-property: all; transition-property: all; left: 0 !important; opacity: 0; } /* Update animations */ /* We use animations rather than transitions here because transition durations may be specified in the style tag due to animationDuration, and we try to avoid collisions and the use of !important */ /* fade */ @keyframes tooltipster-fading { 0% { opacity: 0; } 100% { opacity: 1; } } .tooltipster-update-fade { animation: tooltipster-fading 400ms; } /* rotate */ @keyframes tooltipster-rotating { 25% { transform: rotate(-2deg); } 75% { transform: rotate(2deg); } 100% { transform: rotate(0); } } .tooltipster-update-rotate { animation: tooltipster-rotating 600ms; } /* scale */ @keyframes tooltipster-scaling { 50% { transform: scale(1.1); } 100% { transform: scale(1); } } .tooltipster-update-scale { animation: tooltipster-scaling 600ms; } /** * DEFAULT STYLE OF THE SIDETIP PLUGIN * * All styles are "namespaced" with .tooltipster-sidetip to prevent * conflicts between plugins. */ /* .tooltipster-box */ .tooltipster-sidetip .tooltipster-box { background: #565656; border: 2px solid black; border-radius: 4px; } .tooltipster-sidetip.tooltipster-left .tooltipster-box { margin-right: 8px; } .tooltipster-sidetip.tooltipster-right .tooltipster-box { margin-left: 8px; } .tooltipster-sidetip.tooltipster-top .tooltipster-box { margin-bottom: 8px; } /* .tooltipster-content */ .tooltipster-sidetip .tooltipster-content { color: white; line-height: 18px; padding: 6px 14px; } /* .tooltipster-arrow : will keep only the zone of .tooltipster-arrow-uncropped that corresponds to the arrow we want to display */ .tooltipster-sidetip .tooltipster-arrow { overflow: hidden; position: absolute; } .tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow { height: 10px; /* half the width, for centering */ margin-left: -10px; top: 0; width: 20px; } .tooltipster-sidetip.tooltipster-left .tooltipster-arrow { height: 20px; margin-top: -10px; right: 0; /* top 0 to keep the arrow from overflowing .tooltipster-base when it has not been positioned yet */ top: 0; width: 10px; } .tooltipster-sidetip.tooltipster-right .tooltipster-arrow { height: 20px; margin-top: -10px; left: 0; /* same as .tooltipster-left .tooltipster-arrow */ top: 0; width: 10px; } .tooltipster-sidetip.tooltipster-top .tooltipster-arrow { bottom: 0; height: 10px; margin-left: -10px; width: 20px; } /* common rules between .tooltipster-arrow-background and .tooltipster-arrow-border */ .tooltipster-sidetip .tooltipster-arrow-background, .tooltipster-sidetip .tooltipster-arrow-border { height: 0; position: absolute; width: 0; } /* .tooltipster-arrow-background */ .tooltipster-sidetip .tooltipster-arrow-background { border: 10px solid transparent; } .tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-background { border-bottom-color: #565656; left: 0; top: 3px; } .tooltipster-sidetip.tooltipster-left .tooltipster-arrow-background { border-left-color: #565656; left: -3px; top: 0; } .tooltipster-sidetip.tooltipster-right .tooltipster-arrow-background { border-right-color: #565656; left: 3px; top: 0; } .tooltipster-sidetip.tooltipster-top .tooltipster-arrow-background { border-top-color: #565656; left: 0; top: -3px; } /* .tooltipster-arrow-border */ .tooltipster-sidetip .tooltipster-arrow-border { border: 10px solid transparent; left: 0; top: 0; } .tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-border { border-bottom-color: black; } .tooltipster-sidetip.tooltipster-left .tooltipster-arrow-border { border-left-color: black; } .tooltipster-sidetip.tooltipster-right .tooltipster-arrow-border { border-right-color: black; } .tooltipster-sidetip.tooltipster-top .tooltipster-arrow-border { border-top-color: black; } /* tooltipster-arrow-uncropped */ .tooltipster-sidetip .tooltipster-arrow-uncropped { position: relative; } .tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-uncropped { top: -10px; } .tooltipster-sidetip.tooltipster-right .tooltipster-arrow-uncropped { left: -10px; } @media (min-width: 960px) { body .sbi-tooltip-wizard.tooltipster-sidetip { left: 50px !important; top: 74px !important; } } .wp-editor .sbi-tooltip-wizard{ -webkit-transform: translateY(63px) translateX(17px); transform: translateY(63px) translateX(17px); } .sbi-tooltip-wizard.tooltipster-sidetip .tooltipster-box{ background: #fff!important; border: 1px solid #eee!important; border-radius: 2px!important; box-shadow: 0px 1px 18px rgba(0,0,0,0.2)!important; } .sbi-tooltip-wizard.tooltipster-sidetip .tooltipster-content{ color: #434960!important; line-height: 18px; padding: 6px 20px!important; position: relative; } .sbi-tooltip-wizard .sbi-tooltip-wizard-head { color: #141B38; font-size: 15px; margin-bottom: 8px; width: 100%; float: left; display: block } .sbi-tooltip-wizard .sbi-tooltip-wizard-txt{ margin-bottom: 15px; } .sbi-tooltip-wizard .sbi-tooltip-wizard-actions button{ background: #F3F4F5!important; cursor: pointer!important; border: 1px solid #DCDDE1!important; padding: 5px 20px!important; } .sbi-tooltip-wizard .sbi-tooltip-wizard-actions{ margin-bottom: 10px; } .sbi-tooltip-wizard.tooltipster-sidetip .tooltipster-box:before, .sbi-tooltip-wizard.tooltipster-sidetip .tooltipster-box:after { content: ''; position: absolute; width: 20px; height: 20px; left: 20%; top: -8px; background: #fff; box-shadow: 0px 1px 18px rgba(0,0,0,0.2); z-index: 3; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sbi-tooltip-wizard.tooltipster-sidetip .tooltipster-box:after { background: #fff; z-index: 999; top: 2px; margin-left: -10px; width: 40px; box-shadow: unset; -webkit-transform: rotate(0deg); transform: rotate(0deg); } .sbi-tooltip-wizard.tooltipster-sidetip .tooltipster-arrow{ display: none; } #sbi-gutenberg-tooltip-content{ display: none; } .sbi-tlp-wizard-cls{ position: absolute; width: 20px; height: 20px; right: 14px; top: 14px; cursor: pointer; } .sbi-tlp-wizard-cls:before, .sbi-tlp-wizard-cls:after{ content: ''; position: absolute; width: 16px; height: 2px; background: #141B38; left: 3px; top: 7px; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sbi-tlp-wizard-cls:after{ -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sbi-tooltip-wizard.tooltipster-sidetip #sbi-gutenberg-tooltip-content{ display: block; } .sbi-tooltip-wizard.tooltipster-sidetip { margin-top: 40px; margin-left: 74px; } .is-fullscreen-mode .sbi-tooltip-wizard.tooltipster-sidetip { margin-top: 10px; margin-left: -28px; } @media (max-width: 960px) { .sbi-tooltip-wizard.tooltipster-sidetip { margin-left: 0; } } @media (max-width: 782px) { .sbi-tooltip-wizard.tooltipster-sidetip .tooltipster-box:before, .sbi-tooltip-wizard.tooltipster-sidetip .tooltipster-box:after { left: 30px; } } @media (max-width: 599px) { .sbi-tooltip-wizard.tooltipster-sidetip .tooltipster-box:before, .sbi-tooltip-wizard.tooltipster-sidetip .tooltipster-box:after { left: 15px; } }PKL\0y\\3instagram-feed/admin/builder/assets/css/builder.cssnu[body{ background: #red; --cl-orange: #FE544F; --cl-dark:#2C324C; --error-red: #D72C2C; --customizer-blue: #0096CC; --dark-blue: #2A65DB; } .sb-tr-1{-webkit-transition: all .1s ease-in-out; transition: all .1s ease-in-out;} .sb-tr-2{-webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out;} .sb-tr-3{-webkit-transition: all .3s ease-in-out; transition: all .3s ease-in-out;} .sb-tr-4{-webkit-transition: all .4s ease-in-out; transition: all .4s ease-in-out;} .sb-tr-5{-webkit-transition: all .5s ease-in-out; transition: all .5s ease-in-out;} .sb-tr-6{-webkit-transition: all .6s ease-in-out; transition: all .6s ease-in-out;} .sb-tr-7{-webkit-transition: all .7s ease-in-out; transition: all .7s ease-in-out;} .sb-tr-8{-webkit-transition: all .8s ease-in-out; transition: all .8s ease-in-out;} .sb-tr-9{-webkit-transition: all .9s ease-in-out; transition: all .9s ease-in-out;} .sb-tr-10{-webkit-transition: all 1s ease-in-out; transition: all 1s ease-in-out;} .sbi-bg-1{ background: #2A65DB; } /**** Buttons */ .sb-button { display: flex; flex-direction: row; justify-content: center; align-items: center; border-radius: 2px; cursor: pointer; outline: none; box-shadow: none; border: none; -webkit-transition: all .15s ease-in-out; transition: all .15s ease-in-out; } .sb-button-standard{ position: relative; font-style: normal; font-weight: 600; font-size: 14px; padding: 10px 20px 10px 39px; line-height: 16px; border: unset; cursor: pointer; } .sb-button-standard svg { width: 16px; height: 16px; position: absolute; left: 13px; right: auto; top: 10px; bottom: auto; } .sb-button-small.sb-button-left-icon { padding-left: 32px; } .sb-button-small.sb-button-right-icon { padding-right: 32px; } .sb-button-small.sb-button-left-icon svg { position: absolute; left: 13px; } .sb-button-small.sb-button-right-icon svg { position: absolute; right: 13px; } .sb-button-standard.sb-button-right-icon { padding: 10px 39px 10px 20px; } .sb-button-standard.sb-button-right-icon svg { right: 13px; left: auto; } .sb-button-small { position: relative; font-style: normal; font-weight: 600; font-size: 12px; padding: 6px 12px; line-height: 160%; } .sb-button-no-border { border-radius: 0 !important; border: none !important; } /*orange*/ .sbi-btn-orange{ background: #FE544F!important; color: #fff!important; } .sbi-btn-orange:hover{ background: #EC352F!important; color: #fff!important; } .sbi-btn-orange:focus{ background: #BC120E!important; color: #fff!important; } /*red*/ .sbi-btn-red{ background: #D72C2C!important; color: #fff!important; } .sbi-btn-red:hover{ background: #DF5757!important; color: #fff!important; } .sbi-btn-red:focus{ background: #841919!important; color: #fff!important; } /*red*/ .sbi-btn-blue{ background: #0068A0!important; color: #fff!important; } .sbi-btn-blue:hover{ background: #0096CC!important; color: #fff!important; } .sbi-btn-blue:focus{ background: #004D77!important; color: #fff!important; } /*grey*/ .sbi-btn-grey{ background: #F3F4F5!important; color: #141B38!important; border: 1px solid #D0D1D7!important; } .sbi-btn-grey:hover{ background: #fff!important; color: #141B38!important; border: 1px solid #DCDDE1!important; } .sbi-btn-grey:focus{ background: #E8E8EB!important; color: #141B38!important; border: 1px solid #D0D1D7!important; } /*dark*/ .sbi-btn-dark{ background: #2C324C!important; color: #fff!important; } .sbi-btn-dark:hover{ background: #434960!important; color: #fff!important; } .sbi-btn-dark:focus{ background: #141B38!important; color: #fff!important; } .sb-dark-hover:hover svg, .sb-dark-hover:hover path{ fill: #141B38; } /*disabled*/ .sbi-btn-orange[data-active="false"], .sbi-btn-blue[data-active="false"], .sbi-btn-red[data-active="false"], .sbi-btn-grey[data-active="false"], .sbi-btn-dark[data-active="false"]{ background: #E8E8EB !important; color: #8C8F9A !important; } /* Text */ #sb_instagram{ overflow-x: hidden; } #sbi-builder-app h1:not(#sb_instagram h1) { font-style: normal; font-weight: 600; font-size: 36px; line-height: 125%; color: #141B38; margin: 0; letter-spacing: 0; } #sbi-builder-app h2:not(#sb_instagram h2) { font-style: normal; font-weight: 600; font-size: 32px; line-height: 125%; margin: 0; letter-spacing: 0; } #sbi-builder-app h3:not(#sb_instagram h3):not(.sb_instagram_header h3) { font-style: normal; font-weight: 600; font-size: 24px; line-height: 120%; margin: 0 0 4px 0; letter-spacing: 0; } #sbi-builder-app h4:not(#sb_instagram h5) { font-style: normal; font-weight: 600; font-size: 18px; line-height: 140%; margin: 0 0 4px 0; letter-spacing: 0; } .sbi-fb-feedtypes-pp-ctn h4 { font-size: 24px !important; margin-bottom: 28px !important; } #sbi-builder-app .sb-small-p, #sbi-builder-app .sb-standard-p{ font-style: normal; font-weight: normal; font-size: 14px; line-height: 160%; color: #8C8F9A; margin: 0; } #sbi-builder-app .sb-standard-p{ font-size: 16px; color: #141B38; } #sbi-builder-app .sbi-fb-source-inp::placeholder { color: #8C8F9A; font-size: 14px; font-weight: normal; } #sbi-builder-app .sb-bold { font-weight: 600; } #sbi-builder-app .sb-dark-text { color: #141B38; } #sbi-builder-app .sbi-btn-orange .sb-small-p, #sbi-builder-app .sbi-btn-blue .sb-small-p, #sbi-builder-app .sbi-btn-red .sb-small-p, #sbi-builder-app .sbi-btn-dark .sb-small-p{ color: #fff; } #sbi-builder-app .sb-caption { font-style: normal; font-weight: normal; font-size: 13px; line-height: 150%; color: #141B38; } #sbi-builder-app .sb-caption.sb-caption-lighter { color: #5F6368; } #sbi-builder-app .sb-small { font-style: normal; font-weight: bold; font-size: 10px; line-height: 160%; letter-spacing: 0.02em; text-transform: uppercase; color: #141B38; } #sbi-builder-app .sb-lighter { color: #434960; } #sbi-builder-app .sb-lightest { color: #74777D; } #sbi-builder-app .sb-small-text { font-size: 12px; } /* Positioning */ .sb-icon-label { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; } /* Misc Stylings */ .sb-flex-center { display: -ms-flexbox; display: -webkit-flex; display: flex; -ms-flex-align: center; -webkit-align-items: center; -webkit-box-align: center; align-items: center; } .sb-box-shadow { box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); } #sbi-builder-app .sb-icon-small svg { height: 10px; } /* Social Links */ .sbi-cl-facebook, .sbi-clhv-facebook:hover{ color: #006BFA!important; } .sbi-bg-facebook, .sbi-bghv-facebook:hover{ background: #006BFA!important; } .sbi-cl-instagram, .sbi-clhv-instagram:hover{ color: #BA03A7!important; } .sbi-bg-instagram, .sbi-bghv-instagram:hover{ background: #BA03A7!important; } .sbi-cl-twitter, .sbi-clhv-twitter:hover{ color: #1B90EF!important; } .sbi-bg-twitter, .sbi-bghv-twitter:hover{ background: #1B90EF!important; } .sbi-cl-youtube, .sbi-clhv-youtube:hover{ color: #EB2121!important; } .sbi-bg-youtube, .sbi-bghv-youtube:hover{ background: #EB2121!important; } .sbi-cl-linkedin, .sbi-clhv-linkedin:hover{ color: #007bb6!important; } .sbi-bg-linkedin, .sbi-bghv-linkedin:hover{ background: #007bb6!important; } .sbi-cl-mail, .sbi-clhv-mail:hover{ color: #666!important; } .sbi-bg-mail, .sbi-bghv-mail:hover{ background: #666!important; } #sbi-builder-app{ font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;; visibility: hidden; opacity: 0; } #sbi-builder-app[data-app-loaded="true"]{ visibility: visible; opacity: 1; } .sbi-builder-app a, .sbi-builder-app a:focus{ text-decoration: none; /*color: inherit;*/ outline: none; } .sbi-fb-btn{ display: flex; flex-direction: row; justify-content: center; align-items: center; padding: 9px 38px; font-style: normal; font-weight: 500; font-size: 14px; line-height: 17px; border-radius: 2px; cursor: pointer; color: #fff; outline: none; box-shadow: none; border: none;; } .sbi-fb-btn:focus{ box-shadow: none; } .sbi-fb-fs, .sb-fs{ width: 100%; position: relative; float: left; box-sizing: border-box; } .sbi-fs-a{ width: 100%; height: 100%; display: block; position: absolute; left: 0; top: 0; z-index: 1; } .sb-btn:focus{ outline: none; } #wpcontent, .instagram-feed_page_sbi-feed-builder #wpcontent{ padding-left: 0px!important; } #wpfooter{ display: none; } #wpbody-content{ padding-bottom: 0px; } #wpbody{ padding-left: 0px!important; } .sbi-fb-wrapper{ max-width: 92%; position: relative; margin: auto; color: #141B38; } .sbi-fb-fs-boss{ position: fixed; height: 100vh; width: 100%; left: 0; top: 0; bottom: 0; right: 0; background: rgba(0,0,0,.4); z-index: 9989; } /* Header */ .sbi-fb-create-ctn{ margin-top: 104px; padding: 0 54px; box-sizing: border-box; width: 100%; } .sbi-fb-header{ height: 64px; position: absolute; display: flex; flex-direction: row; justify-content: space-between; align-items: center; background: #fff; padding: 0px 52px; z-index: 99; } .sbi-fb-header-left { display: flex; } .sbi-fb-header-left .sb-social-wall-link-wrap { margin-left: 30px; } .sbi-fb-hd-logo { display: flex; vertical-align: middle; align-items: center; gap: 5px; } .sbi-fb-hd-logo .sb-logo-letters-wrap { transform: translate(0px, -2px); } .sbi-fb-hd-logo .breadcrumb-title { font-size: 14px; font-weight: 400; line-height: 22px; letter-spacing: 0em; margin-left: 4px; } .sbi-csz-header.sbi-fb-header{ position: fixed!important; padding: 0 20px; } .sbi-csz-header-insider{ width: calc(100% - 160px); display: flex; flex-direction: row; justify-content: space-between; align-items: center; height: 52px; } body.jetpack-masterbar .sbi-csz-header-insider { width: calc(100% - 272px); } @media all and (max-width: 960px) { .sbi-csz-header-insider{ width: calc(100% - 36px); } .sb-customizer-ctn .sb-customizer-sidebar{ left: 36px; } body.jetpack-masterbar .sb-customizer-sidebar { left: 36px; } body.jetpack-masterbar .sbi-csz-header-insider { width: calc(100% - 36px); } } .sbi-fb-extpp-lite-btn-texts { display: flex; flex-direction: column; } .sbi-fb-extpp-lite-btn .sbi-fb-extpp-lite-btn-discount-applied { font-size: 12px; font-weight: normal; } .sbi-fb-hd-btn{ cursor: pointer; display: flex; flex-direction: row; justify-content: center; align-items: center; position: relative; border: 1px solid; -webkit-transition: all .15s ease-in-out; transition: all .15s ease-in-out; } .sbi-fb-hd-btn i{ margin: 0px 5px; } .sbi-fb-ft-action .sbi-fb-hd-btn { -webkit-transition: background .15s ease-in-out; transition: background .15s ease-in-out; } .sbi-fb-full-wrapper { padding: 0 53px; padding-top: 82px; } .sbi-csz-hd-actions{ display: flex; justify-content: center; align-items: center; } .sbi-csz-hd-actions > button{ margin-left: 10px; } .sbi-csz-btn-embd{ color: #fff; background: var(--cl-dark); border-color: var(--cl-dark); } .sbi-csz-btn-save{ color: #fff; background: var(--cl-orange); border-color: var(--cl-orange); } .sbi-csz-hd-name{ display: flex; justify-content: center; align-items: center; height: 45px; } .sbi-csz-hd-name strong{ font-size: 18px; } .sbi-csz-hd-name[data-edit="true"] strong{ display: none; } .sbi-csz-hd-name input[type="text"]{ border-radius: 0px; border: 0px; background: #CCE7FF; outline: none; font-size: 18px; font-weight: 700; display: none; } .sbi-csz-hd-name[data-edit="true"] input[type="text"]{ display: block; } .sbi-csz-hd-name input[type="text"]:focus{ outline: none!important; border: 0px!important; box-shadow: none!important; } .sbi-csz-name-ed-btn{ width: 22px; height: 22px; cursor: pointer; margin: 0 10px; background: #E8E8EB; border: 1px solid #E8E8EB; outline: none; } .sbi-csz-name-ed-btn:focus, .sbi-csz-name-ed-btn:hover{ outline: none; background-color: #fff; } .sbi-csz-name-ed-btn svg{ width: 11px; fill: #141B38; float: left; margin-left: -1px; } /* Welcome Screen Empty State */ .sbi-fb-wlcm-header{ display: flex; align-items: center; margin-bottom: 28px; margin-top: 23px; } #sbi-fb-full-wrapper .sbi-fb-wlcm-header { margin-bottom: 34px; } .sbi-fb-wlcm-header h3, .sbi-fb-create-ctn h3{ font-weight: 600; font-size: 32px; line-height: 40px; padding: 0; margin: 0; float: left; } .sbi-fb-btn-new{ background: var(--cl-orange); position: relative; float: left; margin-left: 20px; font-size: 12px; padding: 8px 12px 8px 32px; font-weight: 700; } .sbi-fb-btn-new svg{ width: 10px; height: 10px; position: absolute; left: 12px; } .sbi-fb-inf-cnt{ position: relative; background: #fff; padding: 27px; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); border-radius: 2px; max-width: 100%; } .sbi-fb-inf-num{ width: 30px; height: 30px; position: relative; float: left; display: flex; justify-content: center; align-items: center; font-size: 12px; font-weight: 600; color: #141B38; margin-right: 20px; } .sbi-fb-inf-num span{ z-index: 1; } .sbi-fb-inf-num:before{ content: ''; position: absolute; width: 100%; height: 100%; background: #D8DADD; border-radius: 50%; } .sbi-fb-inf-txt{ float: left; } /*.sbi-fb-inf-txt strong{ display: block; font-size: 20px; line-height: 1em; font-weight: bold; margin-bottom: 8px; }*/ .sbi-fb-inf-txt span{ display: block; font-size: 16px; color: #5F6368; line-height: 1.5em; } .sbi-fb-wlcm-inf-1 { padding-left: 297px; } .sbi-fb-wlcm-inf-1 .sbi-fb-inf-svg{ position: absolute; left: 191px; top: 32px; /*float: left; margin-top: 30px; margin-left: 230px; position: relative; margin-right: 25px;*/ } .sbi-fb-wlcm-inf-1 .sbi-fb-inf-svg svg{ margin-top: -45px; } .sb-head { position: absolute; top: -2px; left:-4px; } .sbi-fb-wlcm-inf-1 .sbi-fb-inf-cnt{ float: left; width: 523px; margin-bottom: 24px; } .sbi-fb-wlcm-inf-2{ display: flex; justify-content: space-between; padding-left: 152px; } .sbi-fb-wlcm-inf-2 .sbi-fb-inf-cnt{ float: left; width: 590px; margin-bottom: 29px; height: 67px; display: flex; align-items: center; } .sbi-fb-wlcm-inf-2 .sbi-fb-inf-img{ position: absolute; right: 15px; top: -15px; } .sbi-fb-wlcm-inf-3{ display: flex; justify-content: flex-start; align-items: center; padding-left: 297px; } .sbi-fb-wlcm-inf-3 .sbi-fb-inf-cnt{ float: left; width: 620px; height: 80px; display: flex; justify-content: center; align-items: center; } .sbi-fb-wlcm-inf-3 .sbi-fb-inf-img{ float: left; left: 10px; top: -10px; position: absolute; } .sbi-fb-wlcm-inf-2 .sbi-fb-inf-num, .sbi-fb-wlcm-inf-3 .sbi-fb-inf-num{ margin-top: -20px; } .sbi-fb-types-ctn, .sbi-fb-slctsrc-ctn, .sbi-fb-section-wh{ background: #fff; border: 1px solid #E7E7E9; } .sbi-fb-wrapper h3, .sbi-fb-section-wh h3{ font-size: 32px; line-height: 39px; font-weight: 600; } .sbi-fb-create-ctn h3{ margin-bottom: 30px; } .sbi-fb-types h4, .sbi-fb-section-wh h4 { font-size:20px; line-height: 24px; font-weight: 600; } #sbi-builder-app .sbi-fb-create-ctn h4, #sbi-builder-app .sbi-fb-feedtypes-pp-ctn h4{ margin-bottom: 1px; } #sbi-builder-app .sbi-fb-feedtypes-pp-ctn .sbi-fb-types { margin-top: 20px; } #sbi-builder-app .sbi-fb-adv-types .sbi-adv-types-heading{ font-style: normal; font-weight: bold; font-size: 12px; line-height: 160%; letter-spacing: 0.05em; text-transform: uppercase; color: #8C8F9A; } .sbi-fb-types-desc{ font-size: 14px; color: #434960; margin-bottom: 33px; display: block; } .sbi-fb-types, .sbi-fb-adv-types{ padding: 22px 35px 0; } .sbi-fb-adv-types { padding-top: 0; } #sbi-builder-app .sbi-fb-type-el-info a, .sbi-business-required{ color: #0068A0; font-size: 12px; display: flex; align-self: center; } #sbi-builder-app .sbi-fb-type-el-info a span{ margin-right: 7px; } #sbi-builder-app .sbi-fb-type-el-info a svg, .sbi-business-required svg{ height: 16px; line-height: 12px; vertical-align: top; margin-top: 1px; } .sbi-fb-types-list{ display: grid; grid-template-columns: 24.25% 24.25% 24.25% 25.25%; grid-column-gap: 1%; margin-bottom: 31px; } /* .sbi-fb-adv-types .sbi-fb-types-list{ grid-template-columns: 24.25% 24.25% 24.25% 24.25%; } */ .sbi-fb-heading { margin-bottom: 24px; width: 100%; float: left; } .sbi-fb-heading h1{ float: left; } .sbi-fb-heading .sbi-fb-btn{ float: right!important; } .sbi-fb-adv-types .sbi-fb-types-list{ margin-bottom: 71px; } .sbi-fb-type-el{ display: flex; flex-direction: column; align-items: flex-start; padding: 0; position: relative; background: #fff; border: 1px solid #F1F1F1; border-radius: 3px; cursor: pointer; box-sizing: border-box; } .sbi-fb-type-el:not([data-type="socialwall"]):hover, .sbi-fb-adv-types .sbi-fb-type-el:not([data-type="socialwall"]):hover{ border: 1px solid #F6966B; } .sbi-fb-adv-types .sbi-fb-type-el{ border: 1px solid #FFDBBA; } .sb-control-feedtype-ctn .sbi-fb-type-el{ border: 2px solid #E8E8EB; margin-bottom: 7px; } .sb-control-feedtype-ctn .sbi-fb-type-el-info{ margin-top: 14px } .sbi-fb-type-el[data-active="true"], .sbi-fb-adv-types .sbi-fb-type-el[data-active="true"]{ border: 2px solid var(--cl-orange)!important; } .sbi-fb-type-el[data-active="true"]:not([data-type="socialwall"]):after{ content: ''; position: absolute; width: 10px; height: 4px; border-left: 2px solid #fff; border-bottom: 2px solid #fff; z-index: 3; right: 5px; top: 7px; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sbi-fb-type-el[data-active="true"]:before{ content: ''; position: absolute; width: 24px; height: 24px; right: 0px; top: 0px; z-index: 2; background: #DCDDE1; } .sbi-fb-type-el[data-active="true"]:before{ background: var(--cl-orange) } .sbi-fb-type-el[data-type="socialwall"]:before{ display: none; } .sbi-fb-type-el-img{ display: flex; flex-direction: column; justify-content: center; align-items: center; background: #E2F5FF; border-bottom: 1px solid #fff; } .sbi-fb-type-el[data-active="true"] .sbi-fb-type-el-img{ background-color: #F1F1F1; border-bottom: 2px solid #fff; } .sbi-fb-type-el-img svg { max-width: 100%; } .sbi-fb-adv-types .sbi-fb-type-el-img{ background: #FCF4EF; } .sbi-fb-type-el-info{ display: flex; flex-direction: column; justify-content: flex-start; align-items: center; text-align: center; flex: 1 1 auto; padding: 0 18px 13px; } .sbi-fb-type-el-link{ font-size: 13px; font-weight: 400; margin-bottom: 5px; } .sb-control-feedtype-ctn .sbi-fb-type-el-info{ padding: 15px 70px 25px; } .sb-control-feedtype-ctn .sbi-fb-type-el-info strong{ font-size: 14px; } #sbi-builder-app .sbi-fb-type-el p { margin: 11px 0 4px; } #sbi-builder-app .sbi-fb-type-el[data-active="true"] .sbi-fb-type-el-info { padding-bottom: 12px; } #sbi-builder-app .sbi-fb-type-el p svg { margin-left: 1px; vertical-align: middle; } /*.sbi-fb-type-el-info strong{ font-weight: 600; font-size: 16px; line-height: 19px; margin-bottom: 10px; text-transform: capitalize; display: flex; justify-content: center; align-items: center; } .sbi-fb-type-el-info strong i{ color: #ed8000; margin-left: 5px; font-size: 13px; margin-top: 2px; } .sbi-fb-type-el-info span{ font-size: 13px; line-height: 1.4em; color: #74777D; }*/ .sbi-fb-adv-types .sbi-fb-type-el-img { border-color: #FCF4EF; } .sbi-fb-ft-action { border-top: 1px solid #D8DADD; padding: 30px 40px; margin-top: 63px; } .sbi-fb-slctfd-action .sbi-fb-wrapper{ display: flex; align-items: center; justify-content: flex-end; } .sbi-fb-slctfd-action{ padding: 16px 0; } .sbi-fb-slctf-nxt{ height: auto; padding: 7px 36px 7px 37px; } .sbi-fb-slctf-back{ margin-right: auto; height: auto; padding: 7px 37px 7px 36px; } .sbi-fb-slctf-back svg, .sbi-fb-slctf-nxt svg { width: 6px; height: 10px; } .sbi-fb-slctf-back span { display: inline-block; margin-left: 15px; line-height: 160%; } .sbi-fb-slctf-nxt span { display: inline-block; margin-right: 15px; line-height: 160%; } .sbi-fb-btn-ac{ opacity: 0.6; } .sbi-fb-btn-ac[data-active="true"]{ opacity: 1; } .sb-control-single-id-ctn{ margin-top: 35px; padding: 25px 0px; } .sb-control-single-id-ctn:before, .sb-control-before-brd:before { content: ''; position: absolute; border-top: 1px solid #DCDDE1; height: 2px; top: 0px; left: -20px; width: calc(100% + 40px); } .sb-control-single-id-input{ display: flex; justify-content: center; align-items: center; margin-top: 7px; } .sb-control-single-id-input input{ height: 45px; float: left; background: #fff; margin-top: 6px; margin-right: 7px; } /* Video Type Chooser */ .sbi-fb-section-wh.sbi-fb-section-videos{ padding: 50px 21px 54px 30px; } .sbi-fb-videotype-chooser{ display: grid; grid-template-columns: 49% 49%; grid-column-gap: 1%; } .sbi-fb-section-videos{ flex-direction: column; } .sbi-fb-section-videos .sbi-fb-section-video-playlist{ margin-top: 30px; } .sbi-fb-section-video-playlist .sbi-fb-wh-inp{ margin-top: 10px; margin-bottom: 10px!important; } .sbi-fb-section-videos .sbi-fb-sglelm-left{ padding-right: 0px; } /* Source Screen */ .sbi-fb-sec-heading > span{ font-size:14px; color: #434960; line-height: 1.7em; display: block; } #sbi-builder-app .sbi-fb-sec-heading h4{ margin-bottom: 2px; } #sbi-builder-app .sbi-fb-slctsrc-ctn .sbi-fb-sec-heading h4{ margin-bottom: 2px !important; } .sbi-fb-sec-heading { margin-bottom: 14px; } .sbi-builder-app .sbi-fb-slctsrc-content,.sbi-fb-section-wh-insd{ padding: 23px 30px; } .sbi-fb-slctsrc-ctn h4,.sbi-fb-section-wh-insd h4{ font-size: 20px; padding: 0px; margin: 0px; } .sbi-fb-srcslist-ctn{ display: grid; grid-template-columns: 32.66% 32.66% 32.66%; grid-column-gap: 1%; margin-bottom: 28px; } .sbi-fb-srcs-item{ width: 100%; cursor: pointer; height: 62px; margin: 1% 0; border-radius: 3px; border: 1px solid #E7E7E9; display: flex; position: relative; } .sbi-fb-srcs-item[data-disabled="true"]{ background: #F3F4F5; } .sbi-fb-srcs-item[data-disabled="true"] .sbi-fb-srcs-item-inf{ opacity: .55; } #sbi-builder-app .sbi-fb-srcs-item .sbi-fb-srcs-item-inf .sbi-fb-srcs-item-name { color: #141B38; padding-right: 44px; } /*Disabled Controls*/ .sb-control-elem-ctn[data-disabled="true"] input[type="text"], .sb-control-elem-ctn[data-disabled="true"] input[type="number"], .sb-control-elem-ctn[data-disabled="true"] input[type="date"], .sb-control-elem-ctn[data-disabled="true"] textarea{ background: #f0f0f0!important; border-color: #D0D1D7!important; } .sb-control-elem-ctn[data-disabled="true"] .sb-control-colorpicker-swatch{ background: #D0D1D7!important; } .sb-control-elem-ctn[data-disabled="true"] .sb-control-checkbox{ background: #D0D1D7!important; border-color: #c1c1c1!important; } .sb-control-elem-ctn[data-disabled="true"] .sb-control-toggle-elm{ background: #e5e6e7!important; } .sb-control-elem-ctn[data-disabled="true"] .sb-control-toggle-elm{ border-color: #c1c1c1!important; } .sb-control-elem-ctn[data-disabled="true"] .sb-control-toggle-elm[data-active="true"]{ border-top: 0px; } .sb-control-elem-ctn[data-disabled="true"] .sb-control-toggle-elm .sb-control-toggle-deco{ border-color: #bbb!important; } .sb-control-elem-ctn[data-disabled="true"] .sb-control-toggle-elm[data-active="true"] .sb-control-toggle-deco{ border-color: #8C8F9A!important; } #sbi-builder-app .sbi-fb-srcs-item .sbi-fb-srcs-item-inf .sbi-fb-srcs-item-name span { max-height: 30px; display: block; overflow: hidden; line-height: 1.1; padding-bottom:1px; color: #141B38; } #sbi-builder-app .sbi-fb-srcs-item:hover{ border-color: #86D0F9; } #sbi-builder-app .sbi-fb-srcs-item[data-active="true"]{ border-color: #0096cc; } .sbi-fb-source-top .sbi-fb-srcs-item{ margin-bottom: 0px; } #sbi-builder-app .sbi-fb-srcs-new{ display: flex; justify-content: center; align-items: center; background: #EBF5FF; border: 1px solid #EBF5FF; } #sbi-builder-app .sbi-fb-srcs-new span{ margin-left: 13px; color: #0096CC; } .sbi-fb-srcs-new i{ font-size: 14px; padding: 0 10px; margin-left: -10px; } .sbi-fb-srcs-item-chkbx{ width: 40px; height: inherit; display: flex; justify-content: center; align-items: center; margin: 0 16px 0 7px; } .sbi-fb-srcs-item-chkbx-ic,.sbi-fb-chbx-round{ width: 16px; height: 16px; box-sizing: border-box; position: relative; border-radius: 50px; border: 2px solid #8c8f9a; } [data-source="active"] .sbi-fb-srcs-item-chkbx-ic{ border-radius: 2px; } [data-active="true"] .sbi-fb-srcs-item-chkbx-ic, [data-active="true"] > .sbi-fb-chbx-round, .sbi-fb-source-popup [data-active="true"] > .sbi-fb-chbx-round{ border-color: #0096cc; background: #0096cc; } [data-source="active"] [data-active="true"] .sbi-fb-srcs-item-chkbx-ic:before{ content: ''!important; position: absolute!important; width: 8px!important; height: 3px!important; border-left: 2px solid #fff; border-bottom: 2px solid #fff; top: 2px!important; right: 1px!important; left: unset!important; background: unset!important; border-radius: unset!important; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } [data-multifeed="inactive"] [data-active="true"] .sbi-fb-srcs-item-chkbx-ic:before, [data-active="true"] > .sbi-fb-chbx-round:before, .sbi-fb-source-popup .sbi-fb-source-list [data-active="true"] .sbi-fb-srcs-item-chkbx-ic:before, .sbi-fb-section-videos [data-active="true"] .sbi-fb-srcs-item-chkbx-ic:before{ content: ''; position: absolute; height: 6px; width: 6px; background: #fff; border-radius: 25px; left: 3px; top: 3px; } .sbi-fb-sources-empty-ctn{ padding: 24px 32px 28px 24px; background: #F9F9FA; border: 1px dashed #DCDDE1; margin-top: 10px; display: flex; align-items: center; } .sbi-fb-sources-empty-txt{ font-style: normal; font-weight: normal; font-size: 16px; line-height: 160%; color: #141B38; } .sbi-fb-sources-empty-btn-ctn{ margin-left: auto; } .sb-addsources-btn{ color: #fff; height: 27px; padding: 9px 23px; } .sb-addsources-btn svg{ margin-right: 10px; fill: currentColor; width: 14px; height: 14px; } .sbi-fb-mr-feeds,.sbi-fb-section-wh{ margin-top: 8px; background: #fff; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); display: flex; align-items: center; } .sbi-fb-mr-fd-img { float: left; margin-right: 6%; width: 28%; line-height: 0; } .sbi-fb-mr-fd-img img{ width: 100%; } .sbi-fb-mr-fd-content { display: flex; flex: 1; flex-direction: column; padding-right: 16px; } .sbi-fb-mr-fd-heading{ font-weight:600; font-size: 18px; line-height: 1.7em; margin-bottom: 24px; float: left; } .sbi-fb-mr-fd-list{ margin-bottom: 10px; display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr; justify-items: flex-start; gap: 8px; } .sbi-fb-mr-fd-item{ box-sizing: border-box; position: relative; border: 1px solid #DCDDE1; border-radius: 2px; height: 40px; width: 100%; min-width: 120px; color: #141B38; font-size: 14px; font-weight:600; text-transform: capitalize; display: flex; justify-content: center; align-items: center; transition: all .15s ease-in-out; } .sbi-icon-platform-wrap { width: 100%; display: flex; justify-content: left; align-items: center; padding: 0 5px; } .sbi-fb-mr-fd-ic { margin-right: 9px; } .sbi-fb-mr-fd-ic svg{ height: 16px; fill: currentColor; float: left; } #sbi-builder-app .sbi-fb-mr-fd-heading h3 { margin-bottom: 21px; max-width: 385px; } /*Embed Popup*/ .sbi-fb-embed-step-1{ margin-top: 36px; } .sbi-fb-embed-step-1 > div{ padding: 0 20px; } .sbi-fb-embed-step-1-top{ padding-bottom: 53px!important; border-bottom: 1px solid #E8E8EB; margin-bottom: 42px; } #sbi-builder-app .sbi-fb-embed-step-1 h4{ margin-bottom: 12px; } .sbi-fb-embed-input-ctn{ display: flex; } .sbi-fb-embed-input-ctn input, .sbi-fb-embed-input-ctn input[type="text"]{ position: relative; font-style: normal; font-weight: normal; font-size: 16px; line-height: 160%; color: #141B38; height: 44px; width: 77%; box-sizing: border-box; border-radius: 0px; border: 1px solid #D0D1D7!important; border-right: 0px!important; } .sbi-fb-embed-input-ctn input:focus, .sbi-fb-embed-input-ctn .sbi-fb-hd-btn:focus{ box-shadow: none!important; outline: none!important } .sbi-fb-embed-input-ctn .sbi-fb-hd-btn{ width: 23%; border-bottom-left-radius: 0px; border-top-left-radius: 0px; } .sbi-fb-embed-input-ctn svg{ width: 17px; fill: currentColor; float: left; margin-right: 10px; } .sbi-fb-embed-step-1-bottom h4{ text-align: center; } .sbi-fb-embed-btns-ctn{ display: flex; justify-content: center; gap: 2%; margin-top: 14px; margin-bottom: 60px; } .sbi-fb-embed-btn{ cursor: pointer; width: 100%; max-width: 400px; height: 50px; background: #F3F4F5; border-radius: 2px; border: 1px solid #DCDDE1; display: flex; align-items: center; justify-content: space-between; box-sizing: border-box; padding: 0 20px; position: relative; color: #141B38; font-size: 16px; font-weight: 500; } .sbi-fb-embed-btn .sb-icon-label svg{ fill: currentColor; width: 18px; margin-right: 10px; float: left; } .sbi-fb-embed-popup .sb-embed-breadcrumb { display: flex; align-items: center; padding: 25px 30px 0; margin-bottom: 2px; } .sb-embed-breadcrumb a { font-style: normal; font-weight: bold; font-size: 10px; line-height: 160%; letter-spacing: 0.08em; text-transform: uppercase; color: #434960; cursor: pointer; } .sb-embed-breadcrumb a:hover { color: #141B38; } .sb-embed-breadcrumb svg { margin-right: 8px; } .sbi-fb-embed-step-2 > div{ padding: 0 29px; } .sb-customizer-sidebar-cache-wrapper{ margin-top: 20px; padding: 0 20px; } .sbi-fb-embed-step-2-list{ margin-top: 25px; border-top: 1px solid #DCDDE1; padding-top: 14px !important; } .sbi-fb-embed-step-2-list > strong{ text-transform: uppercase; font-size: 12px; color: #434960; margin-bottom: 10px; } .sbi-fb-embed-step-2-pages{ margin-top: 8px; height: 250px; overflow: auto; } .sbi-fb-embed-step-2-pages .sb-control-toggle-icon svg { width: 11px; } .sbi-fb-embed-step-2-action{ padding: 10px 34px 10px 30px !important; background: #F3F4F5; box-shadow: 0px -4px 5px rgba(0, 0, 0, 0.1); } .sbi-fb-embed-step-2-action a{ color: #fff; } .sbi-fb-embed-step-2-action a[data-active="false"]{ opacity: .75; } /*Dialog Popup*/ .sbi-fb-dialog-remove-source{ background: #F3F4F5; padding: 40px 20px; display: flex; justify-content: center; align-items: center; } .sbi-fb-dialog-remove-source .sbi-fb-srcs-item{ background: #fff; width: 280px; padding-left: 20px; box-sizing: border-box; margin-top: 0px; } .sbi-fb-srcs-item-remove{ position: absolute; width: 35px; height: 35px; border-radius: 50px; background: #fff; border:1px solid #E7E7E9; z-index: 3; right: -13px; bottom: -13px; display: flex; justify-content: center; align-items: center; box-shadow: 0px 26.7377px 77.2886px rgba(0, 0, 0, 0.107828), 0px 14.2952px 41.3222px rgba(0, 0, 0, 0.0894161), 0px 8.01379px 23.1649px rgba(0, 0, 0, 0.075), 0px 4.25607px 12.3027px rgba(0, 0, 0, 0.0605839), 0px 1.77104px 5.11942px rgba(0, 0, 0, 0.0421718); } .sbi-fb-srcs-item-remove svg{ width: 12px; float: left; fill: var(--error-red); } .sbi-fb-dialog-popup-content{ display: flex; justify-content: center; align-items: center; text-align: center; flex-direction: column; padding: 38px 12%; } .sbi-fb-dialog-popup-content strong{ font-size: 22px; color: #141B38; display: block; margin-bottom: 15px; } .sbi-fb-dialog-popup-content span{ font-size: 16px; line-height: 1.5em; color: #434960; } .sbi-fb-dialog-popup-actions{ display: flex; justify-content: center; align-items: center; margin-top: 25px; } .sbi-fb-dialog-popup-actions button{ width: 100%; margin: 4px 4px; cursor: pointer; height: 42px; } /* Footer Sticky Widget */ .sbi-stck-wdg{ position: fixed; right: 21px; z-index: 9; bottom: 20px; } .sbi-stck-wdg-btn{ width: 52px; height: 52px; background: #fff; border-radius: 50%; cursor: pointer; display: flex; justify-content: center; align-items: center; filter: drop-shadow(0px 9px 13px rgba(0, 0, 0, 0.2)); } .sbi-stck-wdg-btn svg{ width: 25px; fill: #FE544F; height: 33px; float: left; } .sbi-stck-wdg[data-active="true"] .sbi-stck-wdg-btn svg,.sbi-stck-wdg-btn-cls{ display: none; } .sbi-stck-wdg[data-active="true"] .sbi-stck-wdg-btn-cls, .sbi-stck-wdg[data-active="true"] .sbi-stck-wdg-btn-cls svg{ display: block; } .sbi-stck-wdg-btn-cls{ width: inherit; height: inherit; position: relative; color: #364152; box-shadow: 0px 1px 6px rgba(0, 0, 0, .05), 0px 9px 12px rgba(0, 0, 0, .05); border-radius: 70px; } .sbi-stck-wdg-btn-cls svg { width: 14px; height: 14px; position: absolute; top: 50%; right: 0; bottom: 0; left: 50%; margin-top: -7px; margin-left: -7px; } .sbi-stck-pop{ position: absolute; width: 292px; height: auto; background: #fff; border: 1px solid #E2E8F0; box-sizing: border-box; box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.15), 0px 3px 14px rgba(0, 0, 0, 0.12); border-radius: 2px; padding: 20px; right: 0px; bottom: 100px; color: #141B38; opacity: 0; padding-bottom: 82px; visibility: hidden; } .sbi-stck-wdg[data-active="true"] .sbi-stck-pop{ bottom: 66px; opacity: 1; visibility: visible; } .sbi-stck-pop svg{ fill: currentColor; } .sbi-stck-el-list{ border: 1px solid #DCDDE1; border-radius: 2px; } .sbi-stck-el{ display: flex; align-items: center; padding: 11px 13px; border-bottom: 1px solid #DCDDE1; } .sbi-stck-el:hover{ background: #F3F4F5; } .sbi-stck-el:last-of-type{ border-bottom: 0px; } .sbi-stck-el-list .sbi-chevron svg{ width: 5px; height: 8px; } .sbi-stck-el-list .sbi-stck-el-icon svg { } .sbi-stck-el .sbi-stck-el-txt{ color: #27303F; } .sbi-stck-el.sbi-stck-el-upgrd{ padding: 8px 14px; font-size: 14px; background: var(--cl-orange); color: #fff; } .sbi-chevron { position: absolute; right: 14px } .sbi-stck-el.sbi-stck-el-upgrd .sbi-stck-el-txt{ color: #fff; } .sbi-stck-el.sbi-stck-el-upgrd:after{ top: 20px; opacity: 1; } .sbi-stck-el-icon{ margin-right: 10px; } .sbi-stck-el-icon svg{ width: 17px; float: left; } .sbi-stck-el.sbi-stck-el-upgrd svg path{ fill: #fff!important; } #sbi-builder-app .sbi-stck-title{ margin-top: 20px; margin-bottom: 10px; } .sbi-stck-follow{ background: #F3F4F5; margin-top: 20px; left: 0px; bottom: 0px; position: absolute; padding: 12px 20px; display: flex; align-items: center; } .sbi-stck-follow span{ font-weight: 600; font-size: 14px; } .sbi-stck-flw-links{ display: flex; justify-content: center; align-items: center; margin-left: auto; } .sbi-stck-flw-links a{ width: 36px; height: 28px; color: inherit; display: inline-flex; justify-content: center; align-items: center; margin-left: 4px; border-radius: 2px; } .sbi-stck-flw-links svg{ width: 17px; color: #141B38; } .sbi-stck-flw-links a:hover{ background: #fff; } .sbi-stck-flw-links a:hover svg{ color: inherit; } /* Builder Footer */ .sbi-bld-footer > div{ background: #fff; color: #141B38; margin: 30px 0; } .sbi-bld-footer{ padding-top: 0px!important } .sbi-bld-ft-content{ display: flex; align-items: center; max-width: 1200px; } .sbi-bld-ft-img{ float: left; width: 15%; margin-right: 5%; /*height: 158px;*/ } .sbi-bld-ft-img svg{ margin-bottom: -4px; } .sbi-bld-ft-txt{ display: flex; justify-content: center; align-items: center; width: 59%; margin-right: 5%; } .sbi-bld-ft-txt strong, .sbi-fb-mr-fd-heading span{ color: var(--cl-orange); } #sbi-builder-app .sbi-bld-ft-info{ width: 44%; color: #434960; } #sb-footer-banner .sbi-bld-ft-title{ width: 63%; margin-right: 6%; } .sbi-bld-ft-action{ width: 17%; display: flex; justify-content: left; align-items: center; } .sbi-bld-ft-action svg{ top: 14px; height: 10px; } @media all and (max-width: 1130px) { #sb-footer-banner .sbi-bld-ft-img{ width: 17%; margin-right: 3%; } #sb-footer-banner .sbi-bld-ft-txt{ display: flex; justify-content: center; align-items: center; width: 61%; margin-right: 3%; } #sbi-builder-app #sb-footer-banner h3 { font-size: 20px; } #sbi-builder-app #sb-footer-banner .sb-small-p { font-size: 13px; } #sb-footer-banner .sb-button-standard { font-size: 13px; padding-left: 16px; line-height: 15px; } } .sbi-bld-ft-btm{ font-size: 14px; display: flex; justify-content: center; align-items: center; padding: 15px 0px; border-top: 1px solid #DCDDE1; } .sbi-bld-ft-btm strong{ padding: 0 5px; } .sbi-bld-ft-btm a{ display: inline-block; padding: 0 10px; font-weight: 500; color: #0068A0; } .sbi-bld-ft-btm a i{ font-size: 12px; margin-left: 5px; } .sbi-bld-ft-bns{ display: inline-block; margin: 0 10px; padding: 5px 10px; border-radius: 5px; font-size: 14px; font-weight: 700; text-transform: uppercase; color: #663D00; background: #FFDF99; } /* Extensions Poup */ .sbi-fb-fs-link{ position: absolute; width: 100%; height: 100%; left: 0; top: 0; right: 0; bottom: 0; z-index: 1; } .sbi-fb-extensions-popup{ } .sbi-fb-extpp-top{ display: flex; justify-content: center; align-items: center; height: 264px; background: #F3F4F5; } .sbi-fb-extpp-img{ width: 50%; float: left; display: flex; justify-content: center; } .sbi-fb-extensions-popup[data-getext-view="featuredpost"] .sbi-fb-extpp-img{ padding: 50px 0px; } .sbi-fb-extensions-popup[data-getext-view="singlealbum"] .sbi-fb-extpp-img{ padding: 65px 0px; } .sbi-fb-extpp-social-wall .sbi-fb-extpp-top { display: flex; flex-direction: column; align-items: center; height: auto; padding-top: 29px; } .sbi-fb-extensions-popup[data-getext-view="socialwall"] .sbi-fb-extpp-head { margin: 0 0 12px; padding-top: 14px; } .sbi-fb-extensions-popup[data-getext-view="socialwall"] .sbi-fb-extpp-head h2 { font-size: 24px !important; line-height: 120% !important; } .sbi-fb-extpp-info{ width: 50%; float: left; display: flex; justify-content: center; flex-direction: column; padding-left: 40px; } .sbi-fb-extensions-popup[data-getext-view="socialwall"] .sbi-fb-extpp-info { width: 40%; padding-right: 50px; } .sbi-fb-extensions-popup[data-getext-view="socialwall"] .sbi-fb-extpp-lite-btn { margin-top: 20px; max-width: 270px; box-sizing: border-box; padding: 7px 11px; } .sbi-fb-extensions-popup[data-getext-view="socialwall"] .sbi-extension-bullet-list { grid-template-columns: 33% 33% 33%; } #sbi-builder-app .sbi-fb-extensions-popup[data-getext-view="socialwall"] .sbi-fb-extpp-head{ margin: 0 0 9px; } #sbi-builder-app .sbi-fb-extpp-desc { color: #475569; display: flex; justify-content: center; align-items: center; } .sbi-fb-extpp-social-wall .sbi-fb-extpp-top { display: flex; flex-direction: column; align-items: center; height: auto; padding-top: 29px; } .sbi-fb-extpp-info{ width: 50%; float: left; display: flex; justify-content: center; flex-direction: column; padding-left: 40px; } .sbi-fb-extpp-info .sbi-fb-extpp-head, .sbi-fb-extpp-info .sbi-fb-extpp-desc{ width: 100%; } #sbi-builder-app .sbi-fb-extpp-head{ margin: 0 0 12px; } #sbi-builder-app .sbi-fb-extpp-desc { color: #475569; display: flex; justify-content: left; align-items: center; width: 105%; } .sbi-fb-extpp-head span{ color: var(--cl-orange); } .sbi-fb-extpp-head span.sb-social-wall{ color: inherit; font-size: 26px; line-height: 120% !important; display: inline-block; } .sbi-fb-extpp-desc .sb-social-wall { width: 90%; } .sbi-fb-extpp-head span{ color: var(--cl-orange); } .sbi-fb-extpp-lite-btn{ float: left; font-size: 15px; font-weight: 500; padding: 10px 20px; color: #0068A0; background: #fff; border: 1px solid #DCDDE1; margin-bottom: 14px; margin-top: 12px; align-items: center; } .sbi-fb-extpp-lite-btn svg{ fill: currentColor; width: 20px; float: left; margin-right: 10px; } .sbi-fb-extpp-inc-list{ border: 1px solid #dcdde1; margin-top: 10px; margin-bottom: 30px; } .sbi-fb-extpp-bottom-strg{ font-size:18px; font-weight: 600; } .sbi-fb-extpp-inc-items{ display: grid; grid-template-columns: 25% 25% 25% 25%; } .sbi-fb-extpp-inc-item, .sbi-fb-extpp-inc-item-bottom{ position: relative; height: 50px; display: flex; justify-content: center; align-items: center; border-right: 1px solid #dcdde1; border-bottom: 1px solid #dcdde1; font-size: 14px; } .sbi-fb-extpp-inc-item-bottom{ border: 0px !important; } .sbi-fb-extpp-inc-item:last-of-type{ border-right: 0px; } .sbi-fb-extpp-inc-item svg, .sbi-fb-extpp-inc-item-bottom svg{ width: 17px; margin-right: 10px; fill: currentColor; float: left; } .sbi-fb-extpp-bottom{ padding: 20px 40px; background: #fff; } .sbi-extension-bullet-list { display: grid; grid-template-columns: 33% 33% 33%; grid-column-gap: 2%; margin-top: 12px; margin-bottom: 40px; } .sbi-extension-single-bullet { display: flex; justify-content: flex-start; align-items: center; margin: 4px 0; } #sbi-builder-app .sbi-extension-single-bullet span { color: #434960; } .sbi-extension-single-bullet svg { margin-right: 12px; } .sbi-fb-extpp-btns{ display: grid; grid-template-columns: 100%; grid-column-gap: 1%; } .sbi-fb-extpp-btns div{ height: 38px; cursor: pointer; position: relative; border-radius: 3px; font-style: normal; font-weight: 600; font-size: 14px; line-height: 160%; display: flex; justify-content: center; align-items: center; box-sizing: border-box; } .sbi-fb-extpp-get-btn{ color: #fff; background: var(--cl-orange); } .sbi-fb-extpp-demo-btn{ border: 2px solid #DCDDE1; background: #F3F4F5; } /* Feed Type Creation Process : Single Album; */ .sbi-fb-section-wh-insd{ display: flex; } .sbi-fb-sglelm-inp-ctn{ margin-top: 100px; } .sbi-fb-sglelm-inp-ctn input[type="text"]{ height: 44px; } .sbi-fb-section-wh.sbi-fb-sglelm-ctn { padding: 20px 21px 24px 30px; } .sbi-fb-section-wh.sbi-fb-sglelm-ctn .sbi-fb-section-wh-insd { padding: 0; } .sbi-fb-sglelm-inp-ctn input[type="text"]::placeholder{ font-style: normal; font-weight: normal; font-size: 16px; line-height: 160%; color: #8C8F9A; } .sbi-fb-sglelm-error-icon{ width: 23px; height: 23px; background: var(--error-red); font-family: monospace; font-weight: 900; color: #fff; font-size: 15px; position: absolute; right: 10px; top: 10px; z-index: 999999999999999999; border-radius: 50px; display: flex; justify-content: center; align-items: center; } .sbi-fb-sglelm-errormsg{ color: var(--error-red); font-weight: 800; } .sbi-fb-sglelm-inp-ctn .sbi-fb-wh-inp{ margin-bottom: 10px; } .sbi-fb-sglelm-left{ padding-right: 100px; } .sbi-fb-sglelm-img-ctn{ background:#E8E8EB; height: 350px; display: flex; justify-content: center; align-items: center; text-align: center; flex-direction: column; padding: 100px 50px; border: 1px solid #D0D1D7; box-sizing: border-box; } .sbi-fb-sglelm-img-ctn.sbi-fb-sglelm-img-pf{ padding: 100px 35px; } .sbi-fb-sglelm-img-ctn strong{ font-size: 16px; color: #434960; margin-bottom: 8px; margin-top: 30px; } .sbi-fb-sglelm-img-ctn span{ font-size: 14px; line-height:1.6em; color: #8C8F9A; } .sbi-fb-sglelm-right{ width: 445px } .sbi-fb-sglelm-img-errorctn span{ padding: 0 20px; color: #434960; font-size: 20px; margin-top: 30px; line-height: 1.2em; } .sbi-fb-sglelm-preview{ height: 375px; background-color: #141B38; background-position: center center; background-size: cover; display: flex; justify-content: center; align-items: flex-end; color: #fff; } .sbi-fb-sglelm-preview:after{ content: ''; position: absolute; width: 100%; height: 100%; background-image: linear-gradient(to bottom, rgba(0,0,0,0) , rgba(0,0,0,.5)); } .sbi-fb-sglelm-prev-info{ width: 100%; padding: 20px 30px; padding-bottom: 40px; display: flex; justify-content: center; align-items: center; text-align: center; flex-direction: column; z-index: 2; } .sbi-fb-sglelm-prev-info strong{ font-size: 18px; margin-bottom: 5px; } .sbi-fb-sglelm-prev-info span{ font-size: 16px; line-height: 1.7em; } /* Feeds List */ #sbi-builder-app .sbi-fb-select, #sbi-builder-app .sbi-fb-select:hover, #sbi-builder-app .sbi-fb-select:focus{ border-radius: 0px!important; border: 1px solid #D0D1D7!important; outline: unset!important; float: left; min-height: auto; padding: 6px 31px 6px 8px; background: #fff url("data:image/svg+xml,%3Csvg width='10' height='5' viewBox='0 0 10 5' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.833252 0.333252L4.99992 4.49992L9.16658 0.333252H0.833252Z' fill='%238C8F9A'/%3E%3C/svg%3E%0A") no-repeat right 13px top 55%; background-size: 10px 6px; } .sbi-fd-lst-bulk-ctn > *{ float: left; margin-right: 10px; } .sbi-fd-lst-bulk-ctn{ margin-bottom: 8px; } .sbi-fd-lst-pagination-ctn{ float: right; display: flex; align-items: center; margin-top: 10px; } .sbi-fd-lst-pgnt-btn{ height: 30px; padding: 0 8px; cursor: pointer; border-radius: 3px; } .sbi-fd-lst-pgnt-info{ display: inline-block; padding: 0 3px; } .sbi-fd-lst-count{ margin-right: 10px; } .sbi-feeds-list table{ width: 100%; text-align: left; border-spacing: 0px; box-sizing: border-box; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); background: #fff; } .sbi-feeds-list table a{ cursor: pointer; } .sbi-fd-lst-tbody tr:nth-child(odd){ background: #F3F4F5; } .sbi-fd-lst-tbody tr td{ position: relative; vertical-align: top; padding: 12px 5px; font-size: 16px; } .sbi-feeds-list table tr td:first-child { width: 30px; } .sbi-fd-lst-thtf{ background: #fff; } .sbi-fd-lst-thtf th, .sbi-fd-lst-thtf td{ padding: 6px 5px; } .sbi-fd-lst-thtf th{ border-bottom: 1px solid #DCDDE1; } .sbi-fd-lst-thtf td{ border-top: 1px solid #DCDDE1; } .sbi-fd-lst-chkbx{ width: 11px; height: 11px; position: relative; border-radius: 2px; border: 1px solid #97A6BA; background: #fff; cursor: pointer; margin-left: 10px; } tbody .sbi-fd-lst-chkbx { position: absolute; top: 15px; left: 5px; bottom: 0; right: 0; } .sbi-fd-lst-thtf .sbi-fd-lst-chkbx{ width: 11px; height: 11px; border: 1px solid #D8DADD; } .sbi-fd-lst-chkbx[data-active="true"]{ background: var(--customizer-blue); border-color: var(--customizer-blue)!important; } .sbi-fd-lst-chkbx[data-active="true"]:before{ content: ''; position: absolute; width: 6px; height: 3px; left: 2px; top: 2px; border-bottom: 2px solid #fff; border-left: 2px solid #fff; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sbi-fd-lst-name{ font-size: 17px; font-weight:500; color: #0068A0!important; } .sbi-fd-lst-type{ display: block; text-transform: capitalize; } .sb-instances-cell { margin-top: 4px; } .sbi-fd-lst-btn{ width: 21px; height: 21px; display: inline-flex; justify-content: center; align-items: center; margin: 0 4px; cursor: pointer; color: #141B38; border-radius: 2px; border: 1px solid #D8DADD; -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; background: #fff; } .sbi-fd-lst-btn svg { height: 13px; } .sbi-fd-lst-actions .sbi-fd-lst-btn, .sbi-fb-inst-tbl-ctn .sbi-fd-lst-btn{ box-sizing: border-box; width: 36px; height: 32px; background: transparent; } .sbi-fd-lst-actions .sbi-fd-lst-btn { margin: 0 4px 0 0; } .sbi-fd-lst-actions .sbi-fd-lst-btn:last-child { margin: 0; } .sbi-fd-lst-actions .sbi-fd-lst-btn svg { width: 12px; height: 16px; } .sbi-fd-lst-btn-delete{ color: #D72C2C; border-color: #FBD5D5; } .sbi-fd-lst-btn svg{ fill: currentColor; width: 14px; float: left; } .sbi-fd-lst-actions .sbi-fd-lst-btn:hover svg, .sbi-feedtype-section .sbi-fd-lst-btn-delete:hover svg{ color: #fff; } .sbi-fd-lst-actions .sbi-fd-lst-btn:hover{ background: #0096CC; border-color: #0096CC; } .sbi-fd-lst-actions .sbi-fd-lst-btn-delete:hover, .sbi-feedtype-section .sbi-fd-lst-btn-delete:hover{ background: #D72C2C; border-color: #D72C2C; } .sbi-fd-lst-dimmed .sbi-fd-lst-btn, .sbi-fd-lst-dimmed .sbi-fd-lst-btn:hover{ background: #F3F4F5!important; border-color:#D8DADD!important; color: #8C8F9A!important; } .sbi-fd-lst-dimmed .sbi-fd-lst-btn:hover svg{ color: #8C8F9A!important; } .sbi-fb-tltp-parent{ position: relative; } .sbi-fb-view-instances[data-active="true"]{ font-weight: 600; text-decoration: underline; cursor: pointer; line-height: 1em; } .sbi-fb-tltp-elem{ position: absolute; color: #fff; background: #434960; font-size: 14px; padding: 7px 10px; border-radius: 3px; font-weight:500; z-index: 9; text-align: center; opacity: 0; visibility: hidden; top: calc(-100% - 30px); left: 50%; -webkit-transform: translateX(-50%); transform: translateX(-50%); -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .sbi-fb-tltp-elem span{ position: relative; z-index: 3; } .sbi-fb-tltp-elem:after{ content: ''; position: absolute; height: 10px; width: 10px; bottom: -5px; left: calc(50% - 5px); background: #434960; transform: rotate(-45deg); } .sbi-fb-tltp-parent:hover .sbi-fb-tltp-elem { top: calc(-100% - 20px); opacity: 1; visibility: visible; } .sbi-fd-lst-shortcode-cp{ margin-left: 10px; } .sbi-fd-lst-act-th{ width: 190px; max-width: 190px; } /* Feed Instance Popup */ .sbi-fb-popup-feedinst .sbi-fb-source-top{ display: flex; align-items: center; } .sbi-fb-popup-feedinst h5{ margin-bottom: 0px; float: left; font-size: 27px; } .sbi-fb-fdinst-type{ padding: 5px 5px; background: #E8E8EB; margin-left: 12px; float: left; } .sbi-fb-inst-tbl-ctn{ padding: 0 23px 63px; } .sbi-fb-inst-tbl-ctn table{ width: 100%; border-spacing: unset; box-sizing: border-box; border: 1px solid #DCDDE1; text-align: left; } .sbi-fb-inst-tbl-ctn tfoot,.sbi-fb-inst-tbl-ctn thead{ background: #F3F4F5 } .sbi-fb-inst-tbl-ctn .sbi-fd-lst-thtf th, .sbi-fb-inst-tbl-ctn .sbi-fd-lst-thtf td{ font-size: 13px; color: #364152; padding: 13px 10px; } .sbi-fb-inst-tbl-ctn .sbi-fd-lst-tbody tr:nth-child(odd){ background: #fff; } .sbi-fb-inst-tbl-ctn .sbi-fd-lst-tbody tr:nth-child(even){ background: #F3F4F5; } .sbi-fb-inst-tbl-ctn .sbi-fd-lst-thtf tr th, .sbi-fb-inst-tbl-ctn .sbi-fd-lst-thtf tr td{ padding: 4px 20px; } .sbi-fb-inst-tbl-ctn .sbi-fd-lst-tbody tr td{ padding: 11px 20px; } .sbi-fb-inst-tbl-ctn .sbi-fd-lst-name{ font-size: 14px; } .sbi-fb-inst-tbl-shrtc{ display: flex; align-items: center; } .sbi-fd-inst-btn{ width: 10px; height: 10px; box-sizing: border-box; border-right: 3px solid #8C8F9A; border-top: 3px solid #8C8F9A; cursor: pointer; -webkit-transform: rotate(45deg); transform: rotate(45deg); } /*Legacy Feeds */ .sbi-fb-lgc-top-new{ color: #141B38; background: #fff; margin: 10px 0px; padding: 15px 20px; display: flex; justify-content: center; align-items: center; font-size: 14px; font-weight: 600; } .sbi-fb-lgc-gr{ font-size: 12px; text-transform: uppercase; font-weight: 500; background: #59AB46; color: #fff; margin-right: 10px; padding: 6px 10px; border-radius: 2px; line-height: 1em; } .sbi-fb-lgc-inf-ctn{ background: #fff; padding: 0 20px; display: flex; align-items: center; height: 58px; } .sbi-fb-lgc-inf-ctn > h4{ margin-right: 10px!important; } .sbi-fb-lgc-inf-ctn > *{ float: left; display: inline-block; position: relative; } #sbi-builder-app .sbi-fb-lgc-inf-ctn > h4{ margin-right: 14px; margin-bottom: 0; } #sbi-builder-app .sbi-fb-lgc-btn-stg{ display: flex; margin-left: auto; } .sbi-fd-legacy-feed-toggle{ height: 34px; display: flex; justify-content: center; align-items: center; background: #E2F5FF; color:#0068A0; cursor: pointer; font-weight: 600; font-size: 14px; line-height: 160%; } .sbi-fd-legacy-feed-toggle:hover { background: #BFE8FF; } .sbi-fd-legacy-feed-toggle span{ display: inline-block; position: relative; padding-right: 20px; margin-left: -20px; } .sbi-fd-legacy-feed-toggle[data-active="true"] span:after{ -webkit-transform: rotate(-225deg); transform: rotate(-225deg); top: 7px; } .sbi-feeds-list .sbi-legacy-table-wrap table{ box-shadow: none; border-top: 1px solid #DCDDE1; } .sbi-fb-lgc-ctn{ box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); margin-bottom: 20px; } .sbi-fb-onbrd-infotxt{ display: flex; align-items: center; } .sbi-fb-onbrd-infotxt svg{ fill: currentColor; width: 16px; display: inline-block; margin-left: 10px; float: left; } .sbi-fb-onbrd-tltp-parent{ position: relative; } .sbi-fb-onbrd-tltp-elem{ position: absolute; z-index: 9; background: #fff; border-radius: 2px; color: #434960; padding: 16px 52px 4px 24px; font-size: 15px; left: -30px; top: calc(100% + 20px); line-height: 1.7em; box-shadow: 0px 1px 18px rgba(0,0,0,.2); display: none; } .sbi-fb-onbrd-tltp-elem[data-active="false"]{ display: none; } .sbi-fb-onbrd-tltp-elem[data-active="true"], .sbi-fb-onbrd-tltp-hover:hover .sbi-fb-onbrd-tltp-elem{ display: block; min-width: 440px; padding-bottom: 15px; } .sbi-fb-onbrd-tltp-elem .sb-pointer { position: absolute; left: 85px; top: -17px; } .sbi-fb-onbrd-tltp-elem-2 .sb-pointer { left: 485px; } .sbi-fb-onbrd-tltp-elem:after{ background: #fff; z-index: 999; top: 0px; margin-left: -10px; width: 40px; box-shadow: unset; -webkit-transform: rotate(0deg); transform: rotate(0deg); } .sbi-fb-onbrd-tltp-parent.sbi-fb-onbrd-tltp-center-top .sbi-fb-onbrd-tltp-elem{ left: 50%; -webkit-transform:translateX(-50%); transform:translateX(-50%); bottom: calc(100% + 15px); top: unset; padding: 8px 11px; width: 100%; text-align: center; box-shadow: 0 5px 9px rgba(0,0,0,.2), 0 -4px 9px rgba(0,0,0,.1); } .sbi-fb-onbrd-tltp-parent.sbi-fb-onbrd-tltp-center-top .sbi-fb-onbrd-tltp-elem:before { content: ''; position: absolute; left: 50%; bottom: -10px; border-top: 12px solid #fff; border-right: 12px solid transparent; border-left: 12px solid transparent; -webkit-transform: translateX(-50%); transform: translateX(-50%); z-index: 2; } .sbi-fb-onbrd-tltp-parent.sbi-fb-onbrd-tltp-center-top .sbi-fb-onbrd-tltp-elem:before, .sbi-fb-onbrd-tltp-parent.sbi-fb-onbrd-tltp-center-top .sbi-fb-onbrd-tltp-elem:after{ left: calc(50% - 10px); top: unset; } .sbi-fb-onbrd-tltp-parent.sbi-fb-onbrd-tltp-center-top .sbi-fb-onbrd-tltp-elem:before{ bottom: -10px; } .sbi-fb-onbrd-tltp-parent.sbi-fb-onbrd-tltp-center-top .sbi-fb-onbrd-tltp-elem:after{ bottom: 0px; } #sbi-builder-app .sbi-fb-onbrd-tltp-txt{ margin: 0px; } .sbi-fb-onbrd-tltp-txt:last-of-type{ margin-bottom: 0px; } .sbi-fb-onbrd-tltp-elem .sbi-fb-popup-cls{ top: 12px; right: 16px; } [data-tltp-pos*="right"] .sbi-fb-onbrd-tltp-elem{ right: 50px; left: unset; } [data-tltp-pos*="right"] .sbi-fb-onbrd-tltp-elem:before, [data-tltp-pos*="right"] .sbi-fb-onbrd-tltp-elem:after{ left: unset; right: 13% } [data-tltp-pos*="right"] .sbi-fb-onbrd-tltp-elem:after{ margin-left: unset; margin-right: -10px; } .sbi-fd-lst-dimmed .sbi-fb-onbrd-tltp-elem{ top: 100%; } .sbi-fb-cp-clpboard{ width: 0px; height: 0px; position: absolute; left: -100000px; } .sbi-fb-copied{ position: fixed; z-index: 9999999; background: #010101; color: #fff; line-height: 1em; font-size: 15px; font-weight: 500; padding: 10px 20px; opacity: 0; visibility: hidden; -webkit-transition: all .2s ease-in-out, opacity .4s ease-in-out; transition: all .2s ease-in-out, opacity .4s ease-in-out; left: 50%; bottom: -20px; -webkit-transform: translateX(-50%); transform: translateX(-50%); } .sbi-fb-copied[data-active="true"]{ opacity: 1; visibility: visible; bottom: 20px; } /* **** customizer Screens **** */ .sb-customizer-ctn{ /*margin-top: 52px;*/ min-height: 100vh; } .sb-customizer-sidebar{ position: fixed; z-index: 100; width: 375px; box-shadow: 4px 0px 14px rgba(0, 0, 0, .05), 1px 0px 4px rgba(0, 0, 0, .1); background: #fff; left: 160px; top: 96px; overflow: auto; bottom: 0px; padding-bottom: 50px; } .jetpack-masterbar .sb-customizer-sidebar { left: 272px; } body.folded .sb-customizer-sidebar{ left: 36px; } .sb-customizer-sidebar-tab-ctn{ display: flex; justify-content: center; align-items: center; margin-bottom: 24px; } .sb-customizer-sidebar-tab{ width: 50%; height: 56px; background: #F3F4F5; border-bottom: 2px solid #F3F4F5; display: flex; justify-content: center; align-items: center; cursor: pointer; } .sb-customizer-sidebar-tab[data-active="true"]{ border-color: #0096CC; } .sb-customizer-sidebar-tab:hover { background: #fff!important; color: #141B38!important; } .sb-customizer-sidebar-sec-el{ height: 52px; cursor: pointer; display: flex; align-items: center; color: #141B38; border-bottom: 1px solid #DCDDE1; -webkit-transition: background .2s ease-in-out; transition: background .2s ease-in-out; padding: 0 20px; } .sb-customizer-sidebar-sec-el:hover{ background: #F3F4F5; border-bottom: 1px solid #F3F4F5; } .sb-customizer-sidebar-sec-el .sb-customizer-chevron svg{ position: absolute; right: 22px; top: 22px; } .sb-customizer-sidebar-sec-el-icon{ margin-right: 15px; width: 30px; height: 30px; display: flex; justify-content: center; align-items: center; } .sb-customizer-sidebar-sec-el-icon svg{ width: 20px; float: left; fill: currentColor; } .sb-customizer-sidebar-sec-elhead{ height: 50px; padding: 0 20px; display: flex; align-items: center; margin-top: 30px; font-style: normal; font-weight: bold; font-size: 12px; line-height: 160%; letter-spacing: 0.05em; text-transform: uppercase; color: #8C8F9A; } .sb-customizer-sidebar-header{ padding: 20px 20px; border-bottom: 1px solid #DCDDE1; } .sb-customizer-sidebar-header[data-separator="none"]{ border-bottom: 0px!important; padding-bottom: 0px; } .sb-customizer-sidebar-breadcrumb{ margin-bottom: 15px; } .sb-customizer-sidebar-sec1 a:hover{ text-decoration: underline; cursor: pointer; } .sb-breadcrumb-pro-label{ color: #fff !important; display: inline-block; background: var(--cl-orange); padding: 5px 8px; font-size: 11px; line-height: 1em !important; border-radius: 4px; -webkit-transform: translateX(5px) translateY(-4px); transform: translateX(8px) translateY(-2px); } .sb-control-elem-label .sb-breadcrumb-pro-label{ -webkit-transform: translateX(5px) translateY(0px); transform: translateX(5px) translateY(0px); } .sb-customizer-sidebar-breadcrumb a, .sb-customizer-sidebar-breadcrumb span{ display: inline-block; position: relative; cursor: pointer; color: #434960; text-transform: uppercase; font-size: 10px; line-height: 160%; letter-spacing: 0.08em; padding: 0 17px; height: 20px; font-weight: 600; } .sb-customizer-sidebar-breadcrumb span{ cursor: text; } .sb-customizer-sidebar-breadcrumb svg { position: absolute; left: 4px; top: 6px; } .sb-customizer-sidebar-header strong{ font-size: 26px; color: #141B38; display: block; margin-bottom: 10px; line-height: 1.1em; } .sb-customizer-sidebar-header span{ line-height: 1em; color: #434960; } .sb-customizer-sidebar-intro { display: block; padding: 5px 0 10px 0; line-height: 1.7 !important; } .sb-customizer-ctrl-link{ text-decoration: underline!important; } /* Controls Style */ .sb-control-label[data-title="true"]{ font-weight: 600; } .sb-control-elem-ctn{ display: flex; color: #141B38; padding: 20px 20px; } .sb-control-elem-ctn[data-stacked="true"]{ padding: 5px 20px; } .sb-control-elem-ctn[data-type="heading"]{ padding-bottom: 0; } .sb-control-elem-overlay{ width: 100%!important; height: 100%!important; position: absolute!important; left: 0!important; top: 0!important; z-index: 5!important; background: rgba(255,255,255,0.4)!important; } #sbi-builder-app .sb-control-elem-ctn[data-type="heading"] .sb-small-p{ font-weight: 600; } #sbi-builder-app .sb-control-elem-ctn[data-type="heading"] .sb-control-elem-description{ font-style: normal; font-weight: normal; font-size: 12px; line-height: 150%; color: #434960; } #sbi-builder-app .sb-control-elem-ctn[data-type="heading"] .sb-control-elem-label { margin-bottom: 0; } .sb-control-elem-heading svg { margin-left: 8px; } .sb-control-elem-ctn[data-separator="top"],.sb-control-elem-ctn[data-separator="both"]{ border-top: 1px solid #DCDDE1; } .sb-control-elem-ctn[data-separator="bottom"],.sb-control-elem-ctn[data-separator="both"]{ border-bottom: 1px solid #DCDDE1; } .sb-control-elem-ctn[data-type="separator"]{ padding: 0; } .sb-control-elem-separator{ height: 2px; border-top: 1px solid #DCDDE1; } .sb-control-elem-ctn[data-reverse="true"]{ flex-direction: row-reverse; } .sb-control-elem-ctn svg{ fill: currentColor; } .sb-control-elem-output{ padding-left: 20px; } .sb-control-elem-ctn[data-reverse="true"] .sb-control-elem-output{ padding-right: 20px; padding-left: 0px; } .sb-control-elem-ctn[data-layout="block"]{ display: block; } .sb-control-elem-ctn[data-layout="block"] .sb-control-elem-label{ width: 100%; float: left; margin-bottom: 8px; } .sb-control-elem-ctn[data-layout="block"] .sb-control-elem-output{ padding: 0px; } .sb-control-elem-ctn[data-layout="block"] input[type="number"] { height: 36px; background: #FFFFFF; border-radius: 1px 0 0 1px !important; /*border-right-color: #F3F4F5 !important;*/ } .sb-control-elem-ctn[data-layout="block"] [data-contains-suffix="true"] input[type="number"]{ border-right-color: #F3F4F5 !important; } .sb-control-elem-ctn[data-child="true"]{ padding-left: 70px; } .sb-control-elem-ctn[data-layout="half"]{ align-items: center; justify-content: flex-start; } .sb-control-elem-ctn[data-layout="half"][data-switcher-top="true"]{ align-items: flex-start!important; } .sb-control-elem-ctn[data-layout="half"][data-switcher-top="true"] .sb-control-switcher-ctn{ margin-top: 5px; } .sb-control-elem-ctn[data-layout="half"] > div{ width: 100%; } .sb-control-elem-ctn[data-type="switcher"][data-reverse="true"][data-layout="half"] > div{ width: unset; } .sb-control-elem-ctn[data-layout="half"][data-reverse="true"]{ justify-content: flex-end; } [data-type="switcher"][data-reverse="true"][data-layout="half"] .sb-control-elem-output{ padding-right: 5px; } .sb-control-elem-label-title{ display: flex; align-items: center; } .sb-control-elem-description{ color: #434960; font-size: 13px; float: left; margin-top: 4px; } .sb-control-elem-description a{ cursor: pointer; } .sb-control-elem-ctn[data-heading="strong"] .sb-control-elem-heading{ font-weight: 500!important; } .sb-control-elem-heading[data-underline="true"]{ text-decoration: underline; } .sb-control-elem-icon{ display: flex; justify-content: center; align-items: center; } .sb-control-elem-icon svg{ width: 16px; float: left; margin-right: 10px; } .sb-control-elem-tltp{ margin-left: 10px; position: relative; } .sb-control-elem-tltp-icon{ float: left; cursor: pointer; } .sb-control-elem-tltp-icon svg{ width: 14px; float: left; } /*Switcher Control*/ .sb-control-switcher-ctn{ cursor: pointer; display: flex; align-items: center; float: left; } .sb-control-switcher{ width: 36px; height: 18px; border-radius: 25px; background: #D0D1D7; position: relative; margin-right: 10px; } .sb-control-switcher:before{ content: ''; position: absolute; height: 14px; width: 14px; left: 3px; top: 2px; border-radius: 25px; background: #fff; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25); -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .sb-control-switcher-ctn[data-active="true"] .sb-control-switcher{ background: var(--customizer-blue); } .sb-control-switcher-ctn[data-active="true"] .sb-control-switcher:before{ left: 19px; } /*Toggle SINGLE Control*/ .sb-control-toggle-elm{ display: flex; align-items: center; cursor: pointer; height: 46px; padding: 0 15px; border-right: 1px solid #E8E8EB; border-left: 1px solid #E8E8EB; border-bottom: 1px solid #E8E8EB; } .sb-control-toggle-elm:first-child { border-top: 1px solid #E8E8EB; } .sb-control-toggle-extension-cover{ width: 100%; height: 100%; position: absolute; left: 0px; top: 0; cursor: pointer; z-index: 4; } .sb-control-toggle-deco{ width: 16px; height: 16px; margin-right: 13px; box-sizing: border-box; border-radius: 50%; border: 2px solid #d0d1d7; } .sb-control-toggle-icon{ display: flex; justify-content: center; align-items: center; margin-right: 13px; } .sb-control-toggle-icon svg{ width: 16px; float: left; fill: #141B38; } .sb-control-toggle-elm .sb-control-label span { display: flex; align-items: center; gap: 10px; } .sb-control-toggle-elm[data-active="true"]{ background: #F7FDFF; border-radius: 2px; border: 1px solid var(--customizer-blue); } .sb-control-toggle-elm[data-active="true"]{ background: #F7FDFF; border-radius: 2px; border: 1px solid var(--customizer-blue); } .sb-control-toggle-elm:hover:not(.sb-control-toggle-elm[data-disabled="true"]) .sb-control-toggle-deco, .sb-control-toggle-elm[data-active="true"]:not(.sb-control-toggle-elm[data-disabled="true"]):hover .sb-control-toggle-deco{ border: 4px solid var(--customizer-blue); background: #fff; } .sb-control-toggle-elm[data-active="true"] .sb-control-toggle-deco{ border: 6px solid var(--customizer-blue); background: #fff; } /*Toggle SET Control*/ .sb-control-toggle-set-ctn .sb-control-toggle-elm[data-active="true"]{ border-radius: 0px; } /*Toggle Button Control*/ .sb-control-togglebutton-ctn{ display: flex; align-items: center; justify-content: center; padding: 3px; background: #f3f4f5; border-radius: 4px; border: 1px solid #eee; height: 40px; } .sb-control-togglebutton-elm{ width: 100%; display: flex; justify-content: center; align-items: center; height: 33px; cursor: pointer; font-weight: 600; border-radius: 4px; text-transform: capitalize; line-height: 1em; } .sb-control-togglebutton-elm[data-active="true"]{ color: var(--dark-blue); background: #fff; } .sb-control-togglebutton-elm:hover{ color: var(--dark-blue); } .sb-control-toggle-set-desc-ctn .sb-control-label{ font-weight: 600; } .sb-control-toggle-set-desc-ctn .sb-control-toggle-elm{ height: 82px; } .sb-control-toggle-set-desc-ctn .sb-control-toggle-deco{ flex-grow: 0; flex-shrink: 0; } .sb-control-moderatiomode-selement .sb-control-elem-label-title{ margin-bottom: 15px; } .sb-control-moderatiomode-selement{ margin-bottom: 20px; padding: 20px 0px; } /*Input Control*/ .sb-control-input-ctn{ display: flex; } .sb-control-input,.sb-control-input-textrea{ height: 40px; background: #fff; border: 1px solid #D0D1D7!important; border-radius: unset!important; outline: unset!important; padding: 0 10px!important; line-height: 1em; margin: 0px; } .sb-control-input-textrea{ padding: 10px!important; height: 120px; line-height: 1.5em; } .sb-control-input:hover{ color: inherit!important; } .sb-control-input:focus,.sb-control-input-textrea:focus{ border: 1px solid #8C8F9A!important; border-radius: unset!important; box-shadow: unset!important; outline: unset!important; } .sb-control-input[disabled],.sb-control-input-textrea[disabled]{ background-color: #F3F4F5; border: 1px solid #E8E8EB; } .sb-control-input-info{ display: flex; justify-content: center; align-items: center; background: #F3F4F5; padding: 0 8px; font-weight: normal; font-size: 14px; line-height: 160%; color: #434960; border: 1px solid #D0D1D7; border-left: none; border-radius: 0 1px 1px 0 !important; } /*ImageChooser Control*/ .sb-control-imagechooser-ctn{ display: flex; background: #F3F4F5; border: 1px solid #ccc!important; height: 40px; } .sb-control-imagechooser-input, .sb-control-imagechooser-input:focus{ outline: none!important; border: none!important; box-shadow: none!important; background: none!important; height: 40px; } .sb-control-imagechooser-btn svg{ width: 18px; margin-right: 5px; float: left; } .sb-control-imagechooser-btn{ display: flex; justify-content: center; align-items: center; padding: 0 10px; cursor: pointer; border-left: 1px solid #ccc!important; font-weight: 500; color: #141B38; } .sb-control-imagechooser-clear{ position: absolute; right: 4px; top: 10px; } .sb-control-imagechooser-clear-icon{ position: relative; width: 20px; height: 20px; color: #141B38; cursor: pointer; opacity: 0.5; } .sb-control-imagechooser-clear-icon:hover{ opacity: 1; } .sb-control-imagechooser-clear-icon:before, .sb-control-imagechooser-clear-icon:after{ content: ''; position: absolute; width: 16px; height: 2px; background: currentColor; left: 2px; top: 9px; -webkit-transform:rotate(45deg); transform:rotate(45deg); } .sb-control-imagechooser-clear-icon:after{ -webkit-transform:rotate(-45deg); transform:rotate(-45deg); } .sb-control-imagechooser-padding{ padding-right: 31px!important; } /*CheckBox Control*/ .sb-control-checkbox-ctn{ cursor: pointer; display: flex; } [data-disabled="true"] .sb-control-checkbox{ z-index: -1!important; } .sb-control-checkbox{ width: 18px; height: 18px; border-radius: 2px; float: left; border: 2px solid #D0D1D7; box-sizing: border-box; position: relative; margin-right: 10px; flex: none; } .sb-control-checkbox-ctn > div{ z-index: 3; } .sb-control-checkbox-ctn:hover .sb-control-checkbox-hover{ opacity: 1; } .sb-control-checkbox-hover{ position: absolute; left: -20px; top: 0px; width: calc(100% + 40px); height: 100%; background:#F3F4F5; z-index: 1; opacity: 0; } .sb-control-checkbox{ z-index: 5!important; } .sb-control-checkbox[data-active="true"]{ background: var(--customizer-blue); border-color: var(--customizer-blue); color: #fff; } .sb-control-checkbox[data-active="true"]:before{ content: ''; position: absolute; width: 8px; height: 4px; top: 2px; left: 2px; border-left: 2px solid currentColor; border-bottom: 2px solid currentColor; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } /*Action Button Control*/ .sb-control-action-button{ height: 38px; cursor: pointer; display: flex; flex-direction: row; justify-content: center; align-items: center; background: #F3F4F5; border-radius: 2px; border: 1px solid #DCDDE1; position: relative; line-height: 1em; margin-top: 7px; } .sb-control-action-button div{ float: left; width: 20px; height: 20px; display: flex; justify-content: center; align-items: center; margin-right: 8px; } .sb-control-action-button svg{ width: 17px; } /* WPColorPicker Control Redesign */ .sb-control-colorpicker-ctn .wp-picker-default{ display: none!important; } .sb-control-colorpicker-ctn .minicolors-theme-default.minicolors{ width: 100%; } .sb-control-colorpicker-ctn .minicolors-theme-default.minicolors-position-right .minicolors-swatch { /* left: auto; right: 6px; top: 6px; width: 26px; height: 26px; background: #F9F9FA; border: 0px; */ left: auto; right: 1px; top: 1px; width: 35px; height: 35px; background: #F9F9FA; border: 0px; } .minicolors-swatch-color{ box-shadow: none; } .sb-control-colorpicker-ctn .minicolors-input,.sb-control-colorpicker-ctn .minicolors-input:focus{ height: 37px; width: 100%!important; background: #fff; border: 1px solid #D0D1D7!important; border-radius: unset!important; outline: unset!important; box-shadow: unset!important; padding: 0 10px!important; line-height: 1em; margin: 0px; } .sb-control-colorpicker-ctn .minicolors-input:focus{ border: 1px solid #0096CC!important; } [data-type="colorpicker"] .minicolors-input{ font-size: 13px; } [data-type="colorpicker"] .minicolors-input{ font-style: normal; font-weight: normal; font-size: 12px; line-height: 150%; color: #434960; } .sb-control-colorpicker-btn{ height: 38px; display: flex; justify-content: center; align-items: center; border: 1px solid #DCDDE1; border-left: 0px; padding: 0 10px; background: #F3F4F5; font-style: normal; font-weight: 600; font-size: 12px; line-height: 160%; color: #141B38; cursor: pointer; box-sizing: border-box; } .sb-control-colorpicker-ctn[data-picker-style="reset"] .minicolors-input, .sb-control-coloroverride-ctn{ background: #F3F4F5!important; border: 1px solid #DCDDE1!important; } .sb-control-colorpicker-ctn[data-picker-style="reset"] .minicolors-theme-default.minicolors-position-right .minicolors-swatch, .sb-control-coloroverride-ctn .sb-control-coloroverride-swatch{ top: 8px; width: 22px; height: 22px; } .sb-control-coloroverride-ctn .sb-control-coloroverride-swatch{ position: absolute; right: 10px; } .sb-control-coloroverride-ctn .sb-control-colorpicker-btn{ margin-left: auto; border: 0px!important; border-left: 1px solid #DCDDE1!important; } .sb-control-coloroverride-ctn .sb-control-coloroverride-content{ width: 100%; display: flex; align-items: center; position: relative; } .sb-control-coloroverride-ctn .sb-control-coloroverride-txt{ padding-left: 9px; box-sizing: border-box; } /* Customizer Preview */ .sb-customizer-preview{ min-height: 100px; width: calc(100% - 375px); float: right; box-sizing: border-box; padding: 0 20px; display: flex; justify-content: center; margin-top: 64px; position: relative; flex-wrap: wrap; } .sb-customizer-preview .sbi-admin-notices{ margin-top: 20px; width: 100%; } .sb-customizer-preview .license-details-modal .sbi-modal-content { max-height: none; height: auto; } .sb-customizer-preview .sbi-sb-modal-body .sb-why-renew-list:nth-child(3) { margin-bottom: 0; } .sb-customizer-preview .sbi-sb-modal-body .sb-why-renew-list:last-child { margin-bottom: 0; } .sb-customizer-preview[data-preview-device="desktop"] .sb-preview-ctn{ width: 100%; max-width: 1200px; } .sb-customizer-preview[data-preview-device="tablet"] .sb-preview-ctn{ max-width: 100%; width: 800px; } .sb-customizer-preview[data-preview-device="mobile"] .sb-preview-ctn{ max-width: 100%; width: 400px; } .sbi-preview-ctn { padding: 10px; } .sb-preview-top-chooser{ padding: 18px 0 16px; display: flex; color: #434960; align-items: center; } .sb-preview-top-chooser strong{ font-style: normal; font-weight: bold; font-size: 12px; line-height: 160%; letter-spacing: 0.05em; text-transform: uppercase; color: #434960; display: inline-flex; } .sbi-moderate-heading{ margin-top: 21px; } .sb-preview-top-chooser strong > svg{ margin-right: 10px; margin-left: 16px; fill: currentColor; width: 20px; } .sb-preview-chooser{ height: 36px; background: #E8E8EB; margin-left: auto; padding: 0 2px; border-radius: 1px; display: flex; justify-content: center; align-items: center; } .sb-preview-chooser-btn,.sb-preview-chooser-btn:focus{ width: 40px; height: 32px; display: flex; justify-content: center; align-items: center; cursor: pointer; float: left; border: 0; background: unset; outline: none; } .sb-preview-chooser-btn svg{ width: 15px; fill: currentColor; float: left; } .sb-preview-chooser-btn.sb-mobilee svg{ width: 9px; fill: currentColor; float: left; } .sb-preview-chooser-btn[data-active="true"], .sb-preview-chooser-btn:hover{ background: #fff!important; box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.25); border-radius: 1px; } .sb-control-checkboxsection-header{ width: 100%; margin-top: 25px; display: flex; align-items: center; text-transform: uppercase; font-size: 13px; padding-bottom: 15px; position: relative; } .sb-control-checkboxsection-header:before{ content: ''; position: absolute; left: -20px; width: calc(100% + 40px); height: 1px; background: #DCDDE1; bottom: 0px; } .sb-control-checkboxsection-name{ display: flex; align-items: center; } .sb-control-checkboxsection-header svg{ width: 20px; margin-right: 7px; fill: #434960; float: left; } .sb-control-checkboxsection-header > strong{ margin-left: auto; } [data-type="checkboxsection"] .sb-control-checkbox-ctn{ align-items: center; height: 50px; } [data-type="checkboxsection"] { padding: 0 20px !important; } [data-type="checkboxsection"] .sb-control-elem-label{ display: none; } [data-type="checkboxsection"] strong{ color: #434960 } [data-type="checkboxsection"] [data-active="true"] strong{ color: #141B38; } .sb-control-checkboxsection-btn{ width: 21px; height: 21px; position: relative; cursor: pointer; } .sb-control-checkboxsection-btn:before{ content: ''; position: absolute; width: 7px; height: 7px; left: 5px; top: 7px; border-right: 2px solid #8C8F9A; border-bottom: 2px solid #8C8F9A; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } /*CheckBox List*/ [data-type="checkboxlist"] .sb-control-checkbox-ctn{ margin-bottom: 10px!important; } [data-type="checkboxlist"] .sb-control-checkbox-ctn .sb-control-label{ font-style: normal; font-weight: normal; font-size: 14px; line-height: 160%; } /*Source Controls*/ .sb-control-sources-ctn .sbi-fb-srcs-item{ box-sizing: border-box; position: relative; cursor: auto; display: block; height: auto; border: 1px solid #E7E7E9; min-height: 60px; overflow: auto; margin-top: 0px; } .sbi-fb-srcs-item-ins{ cursor: pointer; display: flex; height: 62px; padding: 0 10px; position: relative; } .sb-control-src-icon{ width: 20px; height: 20px; position: absolute; right: 10px; top: 10px; z-index: 2; cursor: pointer; display: flex; justify-content: center; align-items: center; } .sb-control-src-icon svg{ width: 13px; float: left; } [data-expanded="true"] .sb-control-src-expand svg,.sbi-fb-srcs-info { display: none } .sb-control-src-expand-chevron{ width: 7px; height: 7px; border-left: 2px solid currentColor; border-top: 2px solid currentColor; -webkit-transform: rotate(45deg); transform: rotate(45deg); display: none; } [data-expanded="true"] .sb-control-src-expand-chevron,[data-expanded="true"] .sbi-fb-srcs-info { display: block; } .sb-control-src-remove svg{ width: 11px; fill: var(--error-red); } .sb-control-sources-ctn[data-multifeed="true"] .sb-control-src-expand { right: 30px; } .sb-control-elem-output .sb-control-src-expand:hover { background: #F3F4F5; border-radius: 3px; } .sb-control-elem-output .sb-control-src-expand:hover path{ fill: #111; } .sb-control-sources-ctn .sbi-fb-srcs-item .sbi-fb-srcs-item-name{ font-size: 17px; line-height: 1em; margin-bottom: 3px; } .sbi-fb-srcs-info-item{ display: flex; border-top: 1px solid #E7E7E9; box-sizing: border-box; width: 100%; float: left; padding: 8px 10px; } .sbi-fb-srcs-info-item:first-of-type{ align-items: center; } .sbi-fb-srcs-info-item strong{ font-size: 14px; width: 50px; } .sbi-fb-srcs-info-item span{ font-size: 13px; line-height: 1.1em; color: #434960; font-weight: 400; display: inline-block; word-break: break-all; width: calc(100% - 80px); padding: 0 15px; box-sizing: border-box; } .sbi-fb-srcs-info-icon{ width: 26px; height: 26px; display: flex; justify-content: center; align-items: center; cursor: pointer; margin-left: auto; border: 1px solid #D0D1D7; border-radius: 2px; } .sbi-fb-srcs-info-icon svg{ width: 15px; float: left; } .sb-control-sources-ctn .sb-control-action-button{ margin-top: 8px; margin-bottom: 16px; } .sb-control-sources-promo-ctn{ padding: 16px 0; } .sb-control-sources-promo-ctn:before{ content: ''; position: absolute; height: 1px; width: calc(100% + 40px); left: -20px; top: 0px; background: #E7E7E9; } .sb-control-sources-promo-top{ width: 100%; box-sizing: border-box; padding: 30px 20px; border: 1px solid #E8E8EB; float: left; background: #F9F9FA; } .sb-control-sources-promo-top > div{ width: 100%; float: left; text-align: center; display: flex; justify-content: center; align-items: center; box-sizing: border-box; line-height: 1.6em; } .sb-btn-chevron{ display: inline-block; width: 7px; height: 7px; border-right: 2px solid currentColor; border-top: 2px solid currentColor; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sb-control-sources-promo-text{ font-size: 15px; font-weight: 600; } .sb-control-sources-promo-btn{ display: flex; align-items: center; justify-content: center; padding: 16px 20px; color: #fff !important; background: #0068A0; font-size: 15px; } .sb-control-sources-promo-btn div{ margin-left: 10px; } .sb-control-sources-promo-icon{ margin-bottom: 20px; } /*Loading Bar*/ .sb-loadingbar-ctn{ position: absolute; height: 5px; width: 100%; left: 0px; bottom: 0px; background: rgba(227, 79, 14, 0.25); z-index: 999999999999999; } .sb-loadingbar-ctn:before, .sb-loadingbar-ctn:after{ content: ''; position: absolute; height: 5px; background: #FE544F; z-index: 9; top: 0; } .sb-loadingbar-ctn:before{ -webkit-animation: sbi-loading-animation 4s infinite; animation: sbi-loading-animation 4s infinite; } .sb-loadingbar-ctn:after{ -webkit-animation: sbi-loading-animation 4s 2s infinite; animation: sbi-loading-animation 4s 2s infinite; } @-webkit-keyframes sbi-loading-animation { from { left: -5%; width: 0%; } to { left: 130%; width: 50%;} } @keyframes sbi-loading-animation { from { left: -5%; width: 0%; } to { left: 130%; width: 50%;} } /*Notification Element*/ .sb-notification-ctn{ position: fixed; bottom: -100px; left: 200px; z-index: 99999; background: #fff; display: flex; justify-content: center; align-items: center; border-left: 3px solid #fff; line-height: 1em; padding: 10px 20px; padding-left: 0px; border-radius: 4px; box-shadow: 0px 26.7377px 77.2886px rgba(0, 0, 0, 0.107828), 0px 14.2952px 41.3222px rgba(0, 0, 0, 0.0894161), 0px 8.01379px 23.1649px rgba(0, 0, 0, 0.075), 0px 4.25607px 12.3027px rgba(0, 0, 0, 0.0605839), 0px 1.77104px 5.11942px rgba(0, 0, 0, 0.0421718); } .sb-notification-ctn[data-active="hidden"]{ -webkit-animation: sbi-notification-hide .5s forwards linear; animation: sbi-notification-hide .5s forwards linear; } .sb-notification-ctn[data-active="shown"]{ -webkit-animation: sbi-notification-show .5s forwards linear; animation: sbi-notification-show .5s forwards linear; } @-webkit-keyframes sbi-notification-show { 0%{bottom: -100px;} 50%{bottom: 70px;} 70%{bottom: 60px;} 85%{bottom: 65px;} 100%{bottom: 50px;}} @keyframes sbi-notification-show { 0%{bottom: -100px;} 50%{bottom: 70px;} 70%{bottom: 60px;} 85%{bottom: 65px;} 100%{bottom: 50px;}} @-webkit-keyframes sbi-notification-hide {0%{bottom: 50px;}55%{bottom: 65px;}70%{bottom: 60px;}85%{bottom: 70px;}100%{bottom: -100px;}} @keyframes sbi-notification-hide {0%{bottom: 50px;}55%{bottom: 65px;}70%{bottom: 60px;}85%{bottom: 70px;}100%{bottom: -100px;}} .sb-notification-ctn[data-type="success"]{ border-color: #59AB46; } .sb-notification-ctn[data-type="error"]{ border-color: #D72C2C; } .sb-notification-ctn[data-type="message"]{ border-color: #141B38; } .sb-notification-icon{ width: 25px; height: 25px; display: flex; justify-content: center; align-items: center; margin-left: 10px; margin-right: 15px; } .sb-notification-icon svg{ width: 22px; height: 22px; float: left; fill: currentColor; } .sb-notification-ctn[data-type="success"] .sb-notification-icon{ color: #59AB46; } .sb-notification-ctn[data-type="error"] .sb-notification-icon{ color: #D72C2C; } .sb-notification-ctn[data-type="message"] .sb-notification-icon{ color: #141B38; } .sb-notification-ctn span{ font-size: 14px; color: #141B38; font-weight:500; } /* Onboarding */ .sb-onboarding-tooltip { display: none; position: absolute; min-height: auto; width: 432px; max-width: 100%; padding: 0; border-radius: 2px; } #sb-onboarding-tooltip-multiple-2, #sb-onboarding-tooltip-multiple-3{ width: 528px; } #sb-onboarding-tooltip-single-2 { width: 402px; } .sb-onboarding-active .sb-onboarding-highlight .sbi-fb-btn.sbi-fb-btn-new, .sb-onboarding-active .sb-positioning-wrap.sb-onboarding-highlight, .sb-onboarding-active .sbi-fd-lst-bigctn .sbi-table-wrap.sb-onboarding-highlight, .sb-onboarding-active .sbi-fb-lgc-ctn.sb-onboarding-highlight, .sb-onboarding-active .sbi-fb-lgc-ctn .sbi-legacy-table-wrap.sb-onboarding-highlight{ position: relative; z-index: 100000; } .sb-onboarding-active .sbi-fd-legacy-feed-toggle { display: none; } .sbi-legacy-table-wrap.sb-onboarding-highlight { clear: both; } .sb-onboarding-tooltip-1 { top: 50px; left: 8px; } #sb-onboarding-tooltip-single-2 { bottom: -179px; top: auto; left: 68%; margin-left: -201px; } #sb-onboarding-tooltip-multiple-2, #sb-onboarding-tooltip-multiple-3{ top: -200px; left: 20%; } #sb-onboarding-tooltip-multiple-3 { top: -210px; } .sb-onboarding-tooltip .sbi-fb-wrapper { display: flex; justify-content: flex-end; } .sb-positioning-wrap { width: 432px; } .sb-onboarding-tooltip .sbi-fb-popup-cls { position:absolute; width: 12px; height: 12px; top: 12px; right: 12px; } .sb-onboarding-tooltip .sbi-fb-popup-cls svg { width: 12px; height: 12px; } .sb-onboarding-tooltip h3 { font-size: 16px; color: #141B38; line-height: 160%; font-weight: 600; margin: 0; } .sb-onboarding-step { font-style: normal; font-weight: normal; font-size: 12px; line-height: 160%; color: #434960; margin: 2px 0 20px; display: block; } .sbi-onboarding-next, .sbi-onboarding-previous{ color: #353A41; background: #F3F4F5; border: 1px solid #DCDDE1; margin-left: 10px; } .sb-onboarding-tooltip .sbi-fb-hd-btn { margin-right: 0; } .sb-onboarding-tooltip .sbi-fb-hd-btn i { margin: 0; } .sbi-onboarding-finish{ margin-left: 10px; padding: 0 32px; } .sb-onboarding-tooltip .sbi-fb-hd-btn[data-active="false"] { background-color: #e8e8eb; color: #8c8f99; } .sb-onboarding-tooltip .sbi-fb-hd-btn[data-active="false"]:hover { cursor: default; } .sb-step-counter-wrap span { font-style: normal; font-weight: bold; font-size: 12px; line-height: 160%; letter-spacing: 0.05em; text-transform: uppercase; color: #141B38; } .sb-onboarding-tooltip .sb-pointer { position: absolute; left: 50px; top: -14px; } .sb-onboarding-tooltip .sb-pointer.sb-bottom-pointer { top: auto;; bottom: -14px; } #sb-onboarding-tooltip-single-2 .sb-pointer { left: 193px; } #sb-onboarding-tooltip-multiple-2:before, #sb-onboarding-tooltip-multiple-3:before{ bottom: -8px; } .sb-onboarding-top-row { padding: 20px 44px 0 24px; } .sb-onboarding-bottom-row { display: flex; flex-direction: row; justify-content: space-between; align-items: center; padding: 8px 16px 12px 24px; } /*Vue Color Picker*/ .sb-control-colorpicker-ctn .vc-sketch{ box-shadow: none!important; } .sb-control-colorpicker-popup{ box-shadow: 0px 0px 10px rgba(0,0,0,0.2); position: absolute; z-index: 99; top: 100%; background: #fff; right: 0px; } .sb-control-colorpicker-popup .sb-colorpicker-reset-btn{ width: calc(100% - 20px); margin-left: 10px; margin-bottom: 15px; } .sb-control-colorpicker-swatch{ width: 38px; height: 38px; position: absolute; right: 1px; top: 1px; background: #f7f7f7; } .sb-control-colorpicker-ctn .sb-control-input{ width: 100%; } @media (min-width: 768px) and (max-width: 1023px) { .sbi-csz-header-insider .sb-button-standard { padding: 10px 14px 10px 30px; } } @media (min-width: 1024px) and (max-width: 1200px) { .sbi-fb-wlcm-inf-3 { padding-left: 120px; } } @media (max-width: 767px) { .sbi-fd-lst-thtf th:nth-child(3), .sbi-fd-lst-thtf th:nth-child(4), .sbi-fd-lst-tbody tr td:nth-child(3), .sbi-fd-lst-tbody tr td:nth-child(4), .sbi-fd-lst-thtf tr td:nth-child(3), .sbi-fd-lst-thtf tr td:nth-child(4) { display: none; } .sbi-fd-lst-thtf th:last-child, .sbi-fd-lst-thtf tr td:last-child { padding-right: 15px; text-align: right; } .sbi-fd-lst-tbody tr td.sbi-fd-lst-actions .sb-flex-center{ justify-content: flex-end; padding-right: 8px; } .sbi-fb-full-wrapper { padding: 70px 20px 0 20px; } .sbi-fb-header { padding: 0px 20px; } .sbi-bld-ft-content { flex-wrap: wrap; } #sb-footer-banner .sbi-bld-ft-img { width: 100%; height: 140px; } #sb-footer-banner .sbi-bld-ft-img img { height: 100%; width: auto; } #sb-footer-banner .sbi-bld-ft-txt { justify-content: center; align-items: center; width: 100%; margin-right: 3%; padding: 20px; } .sbi-bld-ft-action { width: 100%; padding: 0 20px 20px; } .sbi-bld-footer > div { margin-bottom: 60px; } /* single feed page */ .sbi-csz-header-insider { flex-wrap: wrap; height: auto; width: 100%; } .sbi-fb-header.sbi-csz-header { height: 110px; } .sbi-csz-header.sbi-fb-header { padding-bottom: 6px; } .sbi-csz-header .sbi-csz-hd-actions { margin-top: 10px; } .sb-customizer-preview { display: none; } .sb-customizer-ctn .sb-customizer-sidebar { position: initial; margin-top: 110px; width: 100%; } .sb-notification-ctn { left: 20px; } .sbi-fb-header .sb-button-standard{ padding: 10px 10px 10px 31px; } .sbi-fb-embed-ctn.sb-fs-boss.sbi-fb-center-boss .sbi-fb-popup-inside { top: 35px; } .sbi-fb-embed-btns-ctn { grid-template-columns: 100%; } .sbi-fb-embed-btns-ctn .sbi-fb-embed-btn { margin-bottom: 10px; } .sbi-fb-embed-ctn.sb-fs-boss.sbi-fb-center-boss .sbi-fb-popup-inside .sbi-fb-embed-step-1-top { margin-bottom: 10px; } .sbi-fb-embed-ctn.sb-fs-boss.sbi-fb-center-boss .sbi-fb-popup-inside .sbi-fb-embed-input-ctn { flex-wrap: wrap; } .sbi-fb-embed-input-ctn input, .sbi-fb-embed-input-ctn input[type="text"] { width: 100%; border-right: 1px solid #D0D1D7!important; } .sbi-fb-embed-input-ctn .sbi-fb-hd-btn { width: 32%; max-width: 120px; margin-top: 10px !important; padding: 8px; } .sb-fs-boss.sbi-fb-center-boss { z-index: 100001 !important; } #sb-footer-banner .sbi-bld-ft-txt { flex-wrap: wrap; } #sbi-builder-app #sb-footer-banner h3, #sbi-builder-app #sb-footer-banner .sb-small-p { width: 100%; } #sbi-builder-app #sb-footer-banner h3 { margin-bottom: 10px; } .sbi-fb-srcslist-ctn { grid-template-columns: 100% } .sbi-fb-mr-fd-img { width: 100%; margin-right: 0; } .sbi-fb-mr-fd-img svg { max-width: 100%; } .sbi-fd-lst-tbody tr td:nth-child(2) { width: 50%; } .sbi-fb-wlcm-inf-1, .sbi-fb-wlcm-inf-2, .sbi-fb-wlcm-inf-3 { padding-left: 0; } .sbi-fb-wlcm-inf-3 .sbi-fb-inf-img, .sbi-fb-wlcm-inf-2 .sbi-fb-inf-img, .sbi-fb-wlcm-inf-1 .sbi-fb-inf-svg { display: none; } .sbi-fb-wlcm-inf-3 .sbi-fb-inf-cnt { justify-content: flex-start; } .sbi-fb-wlcm-inf-1 .sbi-fb-inf-cnt { width: calc(100% - 53px); } .sbi-fb-wlcm-inf-2 .sbi-fb-inf-cnt, .sbi-fb-wlcm-inf-3 .sbi-fb-inf-cnt { width: 100%; } .sbi-fb-wlcm-inf-1 .sbi-fb-inf-cnt .sbi-fb-inf-txt{ width: 80%; } .sbi-fb-wlcm-inf-2 .sbi-fb-inf-cnt { margin-bottom: 24px; } .sbi-fb-mr-fd-list { grid-template-columns: 1fr 1fr; } } @media (min-width: 768px) and (max-width: 1023px) { .sbi-fb-wlcm-inf-3 { padding-left: 7px; } .sbi-fb-wlcm-inf-2 { padding-left: 52px; } .sbi-fb-wlcm-inf-1 { padding-left: 85px; } .sbi-fb-wlcm-inf-1 .sbi-fb-inf-svg { display: none; } } @media (min-width: 768px) and (max-width: 1366px) { .sbi-fb-mr-fd-list { grid-template-columns: 1fr 1fr 1fr; } } /* Multiple Sources Sections */ #sbi-multiple-sources-ctn .sbi-fb-slctsrc-content{ padding: 25px 30px; border-bottom: 1px solid #E8E9EA; } .sbi-feedtype-section{ padding: 30px; border-bottom: 1px solid #E8E9EA; } .sbi-feedtype-sec-icon-heading{ display: flex; align-self: center; } .sbi-feedtype-icon-wrap svg{ width: 16px!important; height: 16px!important; float: left; fill: #0096CC; margin-right: 6px; } .sbi-feedtype-sec-icon-heading span{ color: #141B38; font-weight:600; font-size: 18px; } .sbi-feedtype-sec-icon-heading a{ font-size: 12px; display: inline-block; margin-top: 2px; margin-left: 6px; } .sbi-feedtype-sec-desc{ font-size: 12px; } #sbi-multiple-sources-ctn .sbi-fb-hd-btn svg{ fill: #141B38; } .sbi-addsource-type-btn{ display: flex; justify-content: center; align-self: center; padding: 12px 20px; color: #8C8F9A; cursor: pointer; font-size: 14px; font-weight: 600; } .sbi-addsource-type-btn svg{ margin-right: 12px; margin-top: 2px; fill: #8C8F9A; } .sbi-addsource-type-btn:hover, .sbi-addsource-type-btn:hover svg{ color: #434960; fill: #434960; } .sbi-feedtype-section .sbi-fd-lst-btn-delete{ height: 32px; width: 36px; position: absolute; right: 20px; top: 20px; z-index: 2; } .sbi-feedtype-icon-wrap { position: absolute; top: 0; left: 0; } .sbi-feedtype-sec-wrap { margin-left: 28px; } .sbi-feedtype-section .sbi-fd-lst-btn-delete{ border-color: #D8DADD; } .sbi-fb-type-el[data-checked="true"]{ border: 1px solid #D8D8D8 } .sbi-fb-type-el[data-checked="true"]:before{ content: ''!important; position: absolute!important; height: 100%!important; width: 100%!important; left: 0!important; top: 0!important; background: #f1f1f1!important; opacity: .35!important; cursor: default!important; } .sbi-fb-type-el[data-checked="true"]:after{ display: none!important; } .sbi-fb-type-el[data-checked="true"] .sbi-fb-type-el-info *{ color: #8C8F9A!important; } .sbi-fb-type-el-info .sb-control-elem-tltp, .sbi-fb-type-el-info .sb-control-elem-tltp-icon{ display: inline-block; color: inherit; fill: currentColor; margin: 0px; } .sbi-fb-feedtypes-pp-ctn .sbi-fb-type-el-info{ padding: 0 45px 20px!important; } .sbi-fb-feedtypes-pp-ctn .sbi-fb-types-list{ grid-template-columns: 24% 24% 24% 24%; } #sbi-builder-app .sbi-fb-feedtypes-pp-ctn .sbi-fb-types{ padding: 23px 30px 10px!important;; padding-bottom: 0px!important; } .sbi-fb-feedtypes-popup .sb-button-no-border { position: absolute; z-index: 99; top: 20px; left: 33px; font-weight: bold; font-size: 12px; line-height: 160%; letter-spacing: 0.05em; text-transform: uppercase; cursor: pointer; } .sbi-fb-feedtypes-popup .sb-button-no-border svg { margin-right: 9px; } .sbi-fb-addsourtype-ctn{ margin-bottom: 30px; padding: 0px 30px!important; } .sbi-fb-addsourtype-ctn .sbi-fb-source-btn{ margin-top: 0px; } .sbi-fb-feedtypes-pp-ctn h4{ margin-bottom: 20px; } .sbi-fb-sourcelist-pp-ctn .sbi-fb-source-top{ padding: 22px 19px 0px; } .sbi-fb-sourcelist-pp-ctn .sbi-fb-sourcelist-pp{ float: left; width: 100%; box-sizing: border-box; padding: 0 20px; } .sbi-fb-sourcelist-pp-ctn .sbi-fb-addsourtype-ctn{ padding: 0px 20px!important; } .sbi-fb-sourcelist-pp-ctn .sbi-fb-srcs-desc{ margin-bottom: 20px; } .sbi-fb-sourcelist-pp-ctn .sbi-fb-source-pp-customizer .sbi-fb-srcslist-ctn{ grid-template-columns: 49% 49%; min-height: 80px; overflow: auto; } .sbi-selected-sources-ctn .sbi-fb-hd-btn{ display: inline-flex; margin-bottom: 7px; float: left; } .sbi-selected-source-item{ width: auto; height: 38px; border: 1px solid #D0D1D7; border-radius: 2px; display: inline-flex; align-items: center; margin-right: 10px; margin-bottom: 7px; box-sizing: border-box; float: left; } .sbi-selected-source-item-avatar, .sbi-selected-source-item-avatar img{ width: 36px; height: 36px; } .sbi-selected-source-item-avatar { border-right: 1px solid #F3F4F5; } .sbi-selected-source-item span{ font-weight:600; margin: 0px 10px; font-size: 13px; } .sbi-selected-source-item-icon{ margin-left: auto; width: 36px; height: 36px; display: flex; justify-content: center; align-items: center; cursor: pointer; } .sbi-selected-source-item-icon svg{ fill: #D72C2C; width: 14px; height: 14px; float: left; } #sbi-multiple-sources-ctn .sbi-feedtype-sec-desc{ margin: 4px 0 16px; } .sbi-hashtag-item{ display: inline-flex; font-weight: 400; height: 26px; font-size: 12px; align-items: center; padding: 0px 6px 1px 10px; border-radius: 50px; background: #f3f1f1; margin-right: 10px; margin-bottom: 10px; } .sbi-hashtag-item-delete{ width: 16px; height: 16px; background: #8C8F9A; color: #fff; margin-left: 5px; border-radius:50px; cursor: pointer; position: relative; } .sbi-hashtag-item-delete:before, .sbi-hashtag-item-delete:after{ content: ''; position: absolute; height: 2px; width: 8px; background: currentColor; left: 4px; top: 7px; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sbi-hashtag-item-delete:after{ -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sbi-hashtag-fetchby-chbx{ display: flex; margin-bottom: 15px; margin-top: 10px; } .sbi-hashtag-fetchby-chbx .sbi-fb-stp-src-type{ margin-left: 0px!important; margin-right: 20px!important; } /* Custom View Control With Image & info */ .sb-control-imginfo-elem{ background: #F9F9FA; border: 1px solid #E8E8EB; padding: 20px 30px; } .sb-control-imginfo-icon svg{ fill: none!important; } .sb-control-imginfo-icon{ display: flex; justify-content: center; align-self: center; } .sb-control-imginfo-text{ display: flex; flex-direction: column; padding-top: 20px; } .sb-control-imginfo-text [data-textalign="center"]{ justify-content: center; } .sb-control-imginfo-text strong{ font-size: 18px; margin-bottom: 20px; line-height: 1.3; } .sb-control-shoppbale-enbaled-ctn .sb-control-imginfo-text strong{ font-size: 14px; text-align: center; line-height: 1.4em; } .sb-control-imginfo-text span{ color: #434960; font-size: 14px; } .sb-shoppable-edit-btn{ position: absolute; right: 10px; top: 10px; cursor: pointer; z-index: 9; padding: 7px 13px 8px 35px; border: 2px solid rgba(255,255,255,.1); } .sb-shoppable-edit-btn-link svg{ width: 16px; height: 10px; top: 10px; fill: currentColor; } .sb-control-selectedpost-info{ display: flex; align-items: center; box-sizing: border-box; padding: 10px; border: 1px solid #D0D1D7; margin-bottom: 30px; margin-top: 10px; } .sb-control-selectedpost-info img{ width: 77px; height: 77px; } .sb-control-selectedpost-info span{ padding: 0 15px; color: #141B38; font-size: 13px; line-height: 1.6em; } .sb-control-selectedpost-input span{ color: #434960; font-size: 13px; margin-bottom: 5px; } .sb-control-selectedpost-btns{ display: grid; grid-template-columns: 48% 48%; grid-column-gap: 4%; margin-top: 10px; } .sb-control-selectedpost-btns button{ cursor: pointer; font-weight: 600; display: flex; justify-content: center; align-items: center; padding: 9px; } .sb-control-selectedpost-btns button svg{ margin-right: 10px; } /* Feed Type Customizer */ .sb-control-feedtype-item{ margin-bottom: 30px; padding-bottom: 20px; } .sb-control-feedtype-item:after{ content: ''; position: absolute; height: 1px; width: calc(100% + 40px); left: -20px; background: #DCDDE1; bottom: 0px; } .sb-control-feedtype-item:last-of-type:after{ display: none; } .sb-control-feedtype-list{ margin-top: 10px; } .sb-control-feedtype-list-item{ float: left; height: 30px; display: flex; justify-content: center; align-items: center; background: #F3F4F5; border-radius: 50px; padding: 0 14px; margin-right: 10px; margin-bottom: 10px; } .sb-control-feedtype-list-item-icon{ display: flex; justify-content: center; align-items: center; } .sb-control-feedtype-list-item svg{ width: 12px; margin-right: 4px; fill: #0096CC; } .sbi-fb-extppcustomizer-btns{ display: grid; grid-template-columns: 49% 49%; grid-column-gap: 1%; } .sbi-fb-feedtypescustomizer-pp-ctn .sbi-fb-feedtypes-popup{ padding: 22px 20px; } .sbi-fb-feedtypescustomizer-pp-ctn .sbi-fb-source-top{ padding: 0px; padding-bottom: 22px; } .sbi-fb-feedtypescustomizer-pp-ctn .sbi-fb-feedtypescustomizer-content{ background: #F9F9FA; border: 1px solid #E8E8EB; margin-bottom: 20px; border-radius: 4px; } .sbi-fb-feedtypescustomizer-pp-ctn .sbi-feedtype-section{ box-shadow: unset; border-bottom: 1px solid #E8E8EB; } .sbi-fb-feedtypescustomizer-pp-ctn .sbi-feedtype-section:last-of-type{ border-bottom: 0px; } .sbi-fb-feedtypescustomizer-pp-ctn .sbi-feedtype-sec-desc{ margin-bottom: 20px; } .sbi-fb-feedtypescustomizer-pp-ctn .sbi-hashtag-fetchby .sbi-feedtype-sec-desc{ margin-bottom: 0px; } .sbi-fb-feedtypescustomizer-pp-ctn .sbi-selected-source-item{ border: 1px solid #e1e1e1; } .sbi-fb-feedtypescustomizer-content .sbi-fb-hd-btn svg{ fill: #141B38; } .sbi-fb-feedtypescustomizer-content .sbi-feedtype-icon-wrap svg{ width: 20px!important; height: 20px!important; } .sbi-fb-feedtypescustomizer-content .sbi-feedtype-section{ padding: 24px; } /* Moderation Mode */ .sb-control-moderationmode-action-btns{ padding-top: 30px; } .sb-control-moderationmode-action-btns button{ margin-bottom: 20px; } .sbi-moderation-overlay-ctn{ position: absolute; width: 100%; height: 100%; left: 0; top: 0; z-index: 8; cursor: pointer; } .sbi-moderation-toggle{ position: absolute; width: 66px; height: 22px; top: 10px; right: 10px; background: #FFFFFF; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.05), 0px 4px 5px rgba(0, 0, 0, 0.05); border-radius: 2px; padding: 2px; } .sbi-moderation-toggle-icon{ width: 33px; height: 22px; position: relative; float: left; border-radius: 2px; color: #8C8F9A; } .sbi-moderation-toggle[data-type="active"] .sbi-moderation-checkmark{ background: #59AB46; color: #fff!important; } .sbi-moderation-toggle[data-type="inactive"] .sbi-moderation-x{ background: #D72C2C; color: #fff!important; } .sbi_expand{ cursor: pointer; } .sbi-moderation-checkmark:before{ content: ''; position: absolute; width: 13px; height: 5px; left: 8px; top: 5px; border-bottom: 2px solid currentColor; border-left: 2px solid currentColor; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sbi-moderation-x:before, .sbi-moderation-x:after{ content: ''; position: absolute; width: 15px; height: 2px; left: 9px; top: 10px; background: currentColor; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sbi-moderation-x:after{ -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sb-control-moderationmode-elements > .sb-control-switcher-ctn{ margin-bottom: 25px; } .sbi_header_text h3{ color: inherit; } .sbi-customizer-ms-modes .sbi_link, .sbi-customizer-ms-modes .sb_instagram_header{ display: none!important; } .sbi-moderation-pagination{ display: flex; margin-top: 20px; justify-content: flex-end; } .sbi-moderation-pagination-btn{ margin-left: 20px; } #sb_instagram .sbi_item:not(.sbi_transition) .sbi_photo, #sb_instagram.sbi_highlight #sbi_images, #sb_instagram.sbi_masonry #sbi_images, #sb_instagram #sbi_images .sbi_item{ -webkit-transition: unset!important; transition: unset!important; } #sb_instagram .sbi_item:not(.sbi_transition):hover .sbi_photo{ -webkit-transition: all .5s!important; transition: all .5s!important; } #sb_instagram .sbi_item .sbi_photo_shady{ position: absolute; left: 0; top: 0; height: 100%; width: 100%; z-index: 2; background-position: inherit; background-size: inherit; } /* FREE */ .sbi-fb-types-list-pro{ display: grid; grid-template-columns: 24.5% 24.5% 24.5% 24.5%; grid-column-gap: 0.5%; margin-top: 10px; } .sbi-fb-type-el-pro{ display: flex; flex-direction: row; align-items: center; padding: 12px 20px 12px 12px; background: #F9F9FA; border: 1px solid #D0D1D7; box-sizing: border-box; border-radius: 2px; color: #141B38; font-weight: 600; font-size: 14px; margin-bottom: 10px; cursor: pointer; } .sbi-fb-type-el-pro:hover{ background: #E2F5FF; border: 1px solid #E2F5FF; } .sbi-fb-type-el-pro-img svg{ float: left; } .sbi-fb-type-el-pro-img{ margin-right: 20px; } /*Lite Top Banner Dismiss*/ .sbi-builder-app-lite-dismiss .sbi-header-notice{ position: fixed!important; top: 32px; width: 100%; z-index: 2; left: 0; } .sbi-builder-app-lite-dismiss .sbi-fb-header{ top: 64px; } .sbi-builder-app-lite-dismiss .sb-customizer-sidebar{ top: 128px; } .sbi-builder-app-lite-dismiss .sb-customizer-preview{ margin-top: 100px; } .sbi-fb-feedtypescustomizer-pp-ctn .sbi-addsource-type-btn{ color: #0068A0; } .sbi-fb-feedtypescustomizer-pp-ctn .sbi-addsource-type-btn svg{ fill: #0068A0; } .sb-control-label-pro-toggle{ display: inline-block; background: #b9b9b9; color: #fff; border-radius: 3px; padding: 1px 8px; text-transform: uppercase; font-size: 11px; margin-left: 2px; } /*Lightbox */ .sbi-lightbox-ctn{ width: 100%; height: 100%; position: absolute!important; left: 0; top: 2px; z-index: 9; justify-content: center; align-items: flex-start; padding-top: 100px; opacity: 0; visibility: hidden; } .sbi-lightbox-dummy-overlay{ background: rgba(0,0,0,0.9); position: absolute; width: 100%; height: 100vh; left: 0; top: 0; } .sbi-lightbox-ctn[data-visibility="true"]{ display: flex; } .sbi-lightbox-ctn[data-visibility="true"].sbi_lightbox-active{ display: flex!important; } .sbi-lightbox-ctn.sbi_lightbox-disabled{ display: none!important; } #sbi_lightbox.sbi-lightbox-dummy-ctn .sbi_lb-outerContainer{ width: calc(100% - 140px)!important; height: auto!important; left: calc(50% - 70px)!important; transform: translateX(-50%); max-height: 585px!important; padding-right: 0px!important; } #sbi_lightbox.sbi-lightbox-dummy-ctn .sbi_lb-container-wrapper{ width: calc(100% - 300px); } #sbi_lightbox.sbi-lightbox-dummy-ctn.sbi_lb-comments-disabled .sbi_lb-container-wrapper{ width: 100%; } #sbi_lightbox.sbi-lightbox-dummy-ctn .sbi_lb-image1{ width: 100%!important; height: auto!important; } #sbi_lightbox.sbi-lightbox-dummy-ctn .sbi_lb-nav a{ pointer-events: none; } #sbi_lightbox.sbi-lightbox-dummy-ctn.sbi_lb-comments-disabled .sbi_lb-outerContainer{ width: calc(60% - 140px)!important; left: 50%!important; position: absolute!important; background: none; } #sbi_lightbox.sbi-lightbox-ctn{ top: 0px!important } body #sbi_lightboxOverlay.sbi_lightboxOverlay, body #sbi_lightbox.sbi_lightbox:not(.sbi-lightbox-dummy-ctn){ display: none!important; opacity: 0!important; visibility: hidden!important; } #sbi-builder-app[data-app-loaded="true"] .sbi-lightbox-ctn{ opacity: 1; visibility: visible; height: auto; } .sbi_lb-comments-disabled .sbi_lb-commentBox{ display: none!important; } /* Onboarding Wizard */ .sb-onboarding-wizard-ctn { width: calc(100% + 160px); position: absolute; background: #E6E6EB; padding: 0 20px; box-sizing: border-box; border-top: 2px solid #434960; min-height: 100vh; left: -160px; top: -34px; z-index: 9999999; padding-top: 100px; padding-bottom: 100px; margin-top: 0px; } .sb-onboarding-wizard-ctn[data-step="0"]{ z-index: 1; } .instagram-feed_page_sbi-setup .sbi-fb-source-ctn, .instagram-feed_page_sbi-setup .sb-dialog-ctn { z-index: 999999999999999999999; } .folded .sb-onboarding-wizard-ctn { width: calc(100% + 36px); left: -36px; } .sb-onboarding-wizard-ctn[data-step="0"]{ position: relative; width: 100%!important; left: 0!important; top: 0!important; padding-top:0px!important; border-color: transparent!important; margin-top: 63px; } .sb-onboarding-wizard-wrapper { width: 850px; max-width: 100%; margin: auto; margin-top: 50px; } .sb-onboarding-wizard-wrapper[data-step="0"]{ width: 1200px; margin-top: 100px; } .sb-onboarding-wizard-wrapper>div { width: 100%; box-sizing: border-box; float: left; position: relative; } .sb-onboarding-wizard-top { display: flex; justify-content: center; align-items: center; } .sb-onboarding-wizard-logo-ctn { display: flex; justify-content: center; align-items: center; width: 68px; height: 68px; position: relative; margin-right: 35px; margin-left: -35px; } .sb-onboarding-wizard-logo1-ctn { display: flex; justify-content: center; align-items: center; width: 46px; height: 68px; position: relative; margin-right: 15px; margin-left: -15px; } .sb-onboarding-wizard-logo-balloon1{ width: 100%; float: left; } .sb-onboarding-wizard-logo-ctn:after { content: ''; position: absolute; width: 100%; height: 100%; background: #fff; border-radius: 10px; box-shadow: 0px 1.4945039749145508px 2.0379600524902344px 0px #00000012, 0px 4.1321120262146px 5.634698390960693px 0px #0000000C, 0px 9.94853401184082px 13.566183090209961px 0px #00000009, 0px 33px 45px 0px #00000006; -webkit-transform: rotate(-10deg); transform: rotate(-10deg); } .sb-onboarding-wizard-logo-ctn img { z-index: 2; } .sb-onboarding-wizard-logo-balloon { position: absolute; right: -15px; bottom: -13px; } .sb-onboarding-wizard-plugin-name h3 { font-weight: 600 !important; color: #141B38; font-size: 32px !important; line-height: 1.1em !important; } .sb-onboarding-wizard-plugin-name span { font-weight: 600; color: #141B38; font-size: 20px; opacity: .6; margin-top: 6px; float: left; } .sb-onboarding-wizard-steps { margin-top: 50px; height: 20px; display: flex; align-items: center; justify-content: space-between; } .sb-onboarding-wizard-steps:before { content: ''; position: absolute; width: 100%; height: 2px; background: #CED0D9; margin-top: -1px; } .sb-onboarding-wizard-step-icon { width: 20px; height: 20px; position: relative; background: #fff; border: 4px solid #CED0D9; border-radius: 25px; box-sizing: border-box; } .sb-onboarding-wizard-step-icon:before { content: ''; position: absolute; width: calc(100% + 6px); height: calc(100% + 6px); border: 3px solid #E6E6EB; left: -6px; top: -6px; border-radius: inherit; z-index: 1; } .sb-onboarding-wizard-step-icon[data-active="true"] { border-color: #0096CC; } .sb-onboarding-wizard-step-icon[data-active="done"] { background: #2C324C; border-color: #2C324C; } .sb-onboarding-wizard-step-icon[data-active="done"]:after { content: ''; position: absolute; height: 3px; width: 8px; color: #fff; border-left: 2px solid currentColor; border-bottom: 2px solid currentColor; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); top: 2px; left: 1px; } .sb-onboarding-wizard-step-ctn { width: 100%; float: left; margin-top: 30px; } .sb-onboarding-wizard-step-wrapper { background: #fff; border-radius: 5px; padding-bottom: 20px; box-shadow: 0px 4px 5px 0px #0000000D, 0px 1px 2px 0px #0000000D; } /* .sb-onboarding-wizard-step-welcome { display: flex; justify-content: center; align-items: center; flex-direction: column; text-align: center; padding: 100px 20%; } */ .sb-onboarding-wizard-step-welcome { display: grid; grid-template-columns: 55% 45%; padding-bottom: 0px; } .sb-onboarding-wizard-welcome-text{ padding: 0px 10%; display: flex; flex-direction: column; justify-content: center; } .sb-onboarding-wizard-welcome-banner { background-color:#0068A0; border-top-right-radius: 5px; border-bottom-right-radius: 5px; } .sb-onboarding-wizard-welcome-banner img{ width: 100%; height: auto; float: left; border-radius: inherit; } .sb-onboarding-wizard-welcome-btns { display: flex; column-gap: 15px; } .sb-onboarding-wizard-step-welcome h3 { font-size: 24px !important; font-weight: 600 !important; line-height: 29px !important; margin-top: 0px !important; margin-bottom: 5px !important; } .sb-onboarding-wizard-step-welcome p { font-size: 14px; font-weight: 400; line-height: 22px; margin-bottom: 45px; color: #696D80; } .sb-onboarding-wizard-step-welcome button { padding: 16px 25px; font-weight: 600; border-radius: 4px; flex-grow: 1; position: relative; } .sb-onboarding-wizard-step-welcome button.sb-btn-wizard-next:before, .sb-onboarding-wizard-upgrade-btns a.sb-btn-wizard-next:before{ left: unset; top: 21px; right: 40px; } .sb-onboarding-wizard-step-top { display: flex; flex-direction: column; padding: 20px 20px; border-bottom: 1px solid #E6E6EB; } .sb-onboarding-wizard-step-top[data-large="true"] { padding: 30px 20px; } .sb-onboarding-wizard-step-top strong { font-size: 12px; font-weight: 700; line-height: 19px; letter-spacing: 0.05em; color: #696D80; } .sb-onboarding-wizard-step-top h4 { font-size: 18px !important; font-weight: 600 !important; line-height: 25px !important; color: #000; } .sb-onboarding-wizard-step-top[data-large="true"] h4 { font-size: 20px !important; } .sb-onboarding-wizard-step-top span { font-size: 14px; font-weight: 400; line-height: 22px; color: #696D80; } .sb-onboarding-wizard-step-pag-btns { display: flex; justify-content: flex-end; margin-top: 30px; } .sb-onboarding-wizard-step-pag-btns button { padding: 10px 20px 10px 33px !important; margin-left: 20px !important; border-radius: 5px; position: relative; } .sb-btn-wizard-next:before, .sb-btn-wizard-back:before { content: ''; position: absolute; width: 5px; height: 5px; border-left: 2px solid currentColor; border-bottom: 2px solid currentColor; left: 15px; top: 15px; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sb-btn-wizard-next:before { left: 15px; top: 15px; -webkit-transform: rotate(230deg); transform: rotate(230deg); } .sb-onboarding-wizard-ctn button { -webkit-transition: unset !important; transition: unset !important; } .sb-onboarding-wizard-elements-list>div { padding: 25px; } .sb-onboarding-wizard-elements-list>div:nth-child(odd), .sb-onboarding-wizard-success-list>div:nth-child(odd) { background: #F9F9FA; } .sb-onboarding-wizard-elem-info { display: inline-flex; width: calc(100% - 50px); float: left; align-content: flex-start; } .sb-onboarding-wizard-elem-icon { width: 28px; height: 28px; margin-right: 20px; display: flex; justify-content: center; align-items: center; } .sb-onboarding-wizard-elem-icon img{ width: 28px; height: 28px; float: left; } .sb-onboarding-wizard-elem-text { display: flex; flex-direction: column; } .sb-onboarding-wizard-elem-text strong { font-size: 16px; font-weight: 600; line-height: 26px; display: flex; align-items: center; } .sb-onboarding-wizard-elem-text > span { font-size: 14px; font-weight: 400; line-height: 22px; color: #434960; } .sb-onboarding-wizard-elem-text-installs{ font-size: 12px; font-weight: 400; font-style: italic; color: #005B8C; display: inline-flex; height: 20px; align-items: center; justify-content: center; column-gap: 5px; margin-left: 14px; } .sb-onboarding-wizard-elem-toggle { width: 50px; float: right; } .sb-onboarding-wizard-elem-toggle>div { width: 36px; height: 16px; padding: 2px; border-radius: 31px; background-color: #9295A6; position: relative; cursor: pointer; } .sb-onboarding-wizard-elem-toggle>div[data-color="green"][data-active="true"] { background-color: #59AB46; } .sb-onboarding-wizard-elem-toggle>div[data-uncheck="true"] { opacity: .5; cursor: auto; } .sb-onboarding-wizard-elem-toggle>div:before { content: ''; position: absolute; width: 16px; height: 16px; border-radius: 50px; top: 2px; left: 3px; background-color: #fff; box-shadow: 0px 1px 2px 0px #00000040; -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .sb-onboarding-wizard-elem-toggle>div[data-active="true"]:before { left: 22px; } .sb-onboarding-wizard-elem-toggle>div[data-color="blue"][data-active="true"]{ background-color: #0096CC; } .sb-onboarding-wizard-elements-list-hd { padding: 20px !important; padding-top: 25px !important; background-color: #fff !important; border-bottom: 1px solid #E6E6EB !important; font-size: 18px !important; font-weight: 600 !important; line-height: 25px !important; } .sb-onboarding-wizard-step-configuref { padding-bottom: 30px; } .sb-onboarding-wizard-success-list{ overflow: hidden; } .sb-onboarding-wizard-step-success{ padding-bottom: 0px; } .sb-onboarding-wizard-succes-elem { padding: 0px 22px; display: flex; align-items: center; column-gap: 10px; visibility: hidden; opacity: 0; height: 0px; transform: translateX(-20px); transition: all .3s ease-in-out; } .sb-onboarding-wizard-success-list[data-done="true"] .sb-onboarding-wizard-succes-elem { height: 54px; visibility: visible; opacity: 1; transform: translateX(0px); } .sb-onboarding-wizard-success-list[data-done="true"] .sb-onboarding-wizard-succes-elem:last-of-type { margin-bottom: 20px; } .sb-onboarding-wizard-succes-icon { width: 20px; height: 20px; color: #468737; } .sb-onboarding-wizard-succes-icon svg path { stroke: currentColor; } .sb-onboarding-wizard-succes-text { font-size: 16px; font-weight: 400; line-height: 26px; color: #2C324C; } .sb-onboarding-wizard-upgrader { margin-top: 30px; /* background: #F9F9FA; */ padding: 30px 10%; box-shadow: 0px 4px 50px 0px #0000000D, 0px 1px 2px 0px #0000000D; border-radius: 5px; } .sb-onboarding-wizard-features-ctn, .sb-onboarding-wizard-license-ctn { background: #fff; border: 1px solid #E6E6EB; box-shadow: 0px 4px 5px 0px #0000000D, 0px 1px 2px 0px #0000000D; margin-bottom: 20px; border-radius: 5px; } .sb-onboarding-wizard-upgrader-features { background: #F9F9FA; display: flex; justify-content: center; align-items: center; padding: 15px 40px; column-gap: 8px; border-top-right-radius: 8px; border-top-left-radius: 8px; } .sb-onboarding-wizard-upgrader-feature-el { display: inline-flex; font-size: 13px; font-weight: 600; line-height: 21px; column-gap: 10px; justify-content: center; align-items: center; padding: 4px 8px; background: #FFFFFF; box-shadow: 0px 4px 10px 0px #0000000D, 0px 1px 2px 0px #0000000D; border-radius: 6px; margin: 3px 0px; } .sb-onboarding-wizard-upgrader-feature-el svg { float: left; } .sb-onboarding-wizard-upgrader-action-ctn { display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 40px 20px; } .sb-onboarding-wizard-upgrader-action-ctn h4 { font-size: 18px !important; font-weight: 600 !important; line-height: 25px !important; } .sb-onboarding-wizard-upgrader-action-ctn p { font-size: 15px; font-weight: 400; line-height: 21px; color: #696D80; padding: 0 20%; margin-bottom: 22px; text-align: center; } .sb-onboarding-wizard-upgrader-action-ctn a { font-size: 16px; font-weight: 600; line-height: 26px; text-align: left; padding: 10px 35px; border: 0px; border-radius: 4px; } .sb-onboarding-wizard-upgrader-bonus { display: flex; justify-content: center; align-items: center; background: #FFEFCC; border-bottom-right-radius: 8px; border-bottom-left-radius: 8px; font-size: 13px; font-weight: 400; line-height: 21px; padding: 8px 10px; column-gap: 5px; } .sb-onboarding-wizard-license-ctn { display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 40px 60px; } .sb-onboarding-wizard-license-ctn strong { font-size: 20px; font-weight: 600; line-height: 25px; text-align: center; color: #000; } .sb-onboarding-wizard-license-ctn p { font-size: 14px; font-weight: 400; line-height: 21px; text-align: center; color: #696D80; margin-top: 5px; margin-bottom: 22px; } .sb-onboarding-wizard-license-inp-ctn { display: flex; width: 100%; padding: 0 5%; align-items: center; justify-content: center; box-sizing: border-box; column-gap: 12px; } .sb-onboarding-wizard-license-inp-ctn input { flex: 1; padding: 5px 10px!important; border: 1px solid #E6E6EB } .sb-onboarding-wizard-license-inp-ctn button { height: 40px; font-size: 14px; font-weight: 600; line-height: 22px; } .sb-onboarding-wizard-finish-ctn { display: flex; justify-content: center; align-items: center; } .sb-onboarding-wizard-finish-ctn button { font-weight: 600; font-size: 12px; color: #141B38 !important; padding: 13px 23px; line-height: 1em; } .sb-onboarding-wizard-finish-ctn button svg{ margin-left: 10px; float: left; margin-top: 3px; } .sb-onboarding-wizard-sources-list{ display: grid; grid-template-columns: 32.66% 32.66% 32.66%; grid-column-gap: 1%; margin-bottom: 10px; padding: 10px 20px; } .sb-onboarding-wizard-sources-list > div { display: flex; height: 52px; position: relative; border-radius: 3px; margin-bottom: 10px; } .sb-onboarding-wizard-source-newitem{ justify-content: center; align-items: center; background: #EBF5FF; border: 1px solid #EBF5FF; color: #0096CC; cursor: pointer; } .sb-onboarding-wizard-source-newitem span{ color: inherit!important; margin-left: 10px !important; } .sb-onboarding-wizard-source-item { align-items: center; box-sizing: border-box; padding: 0 10px; border: 1px solid #CED0D9; padding-bottom: 2px; } .sb-onboarding-wizard-source-item strong{ color: #000; } .sb-onboarding-wizard-source-item-avatar{ position: relative; width: 32px; height: 32px; border-radius: 50px; margin-right: 12px; } .sb-onboarding-wizard-source-item-avatar img{ width: inherit; height: inherit; border-radius: 50px; float: left; } .sb-onboarding-wizard-source-item-avatar svg{ position: absolute; right: -5px; bottom: -3px; } .sb-onboarding-wizard-source-item-delete{ display: flex; width: 20px; height: 20px; justify-content: center; align-items: center; cursor: pointer; margin-left: auto; } .sb-onboarding-wizard-source-item-delete svg{ float: left; } .sb-onboarding-wizard-succes-name{ text-transform: capitalize; } .sb-onboarding-wizard-upgrade-ctn{ display: grid; grid-template-columns: 54% 46%; background-color: #0068A0; box-shadow: 0px 4px 5px 0px #0000000D, 0px 1px 2px 0px #0000000D; margin-top: 20px; margin-bottom: 20px; border-radius: 5px; } .sb-onboarding-wizard-upgrade-banner img{ width: 100%; float: left; border-top-right-radius: 5px; border-bottom-right-radius: 5px; } .sb-onboarding-wizard-upgrade-text{ padding: 0px 10%; display: flex; flex-direction: column; justify-content: center; } .sb-onboarding-wizard-upgrade-text h3{ color: #fff; } .sb-onboarding-wizard-upgrade-text p { color: #fff; margin: 25px 0px; } .sb-onboarding-wizard-upgrade-btns a, .sb-onboarding-wizard-upgrade-btns a:hover{ color: #0068A0; background: #fff; padding: 16px 25px; position: relative; } .sb-onboarding-wizard-upgrade-off{ padding: 12px 20px; display: grid; grid-template-columns: 50px calc(100% - 50px); background: #FFDF99; margin-top: 18px; border-radius: 4px; } .sb-onboarding-wizard-upgrade-off div{ display: flex; width: 35px; height: 35px; justify-content: center; align-items: center; } .sb-onboarding-wizard-upgrade-off div svg{ float: left; } .sb-onboarding-wizard-upgrade-off span{ color:#331F00; } .sb-onboarding-wizard-close{ top: 0px; position: fixed; display: flex; justify-content: center; align-items: center; width: 120px; height: 40px; right: 100px; background-color: #434960; color: #fff; font-size: 14px; font-weight: 600; column-gap: 10px; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; cursor: pointer; z-index: 99; } .instagram-feed_page_sbi-setup .sbi-header-notice{ display: none; } .instagram-feed_page_sbi-setup .sbi-stck-wdg { z-index: 99999999999; } .sb-btn-wizard-next:before, .sb-btn-wizard-install:before{ left: unset !important; right: 16px !important; } button.sb-btn-wizard-install, div:not(.sb-onboarding-wizard-welcome-btns) > button.sb-btn-wizard-next{ padding: 10px 33px 10px 20px !important; } .sb-onboarding-wizard-step-wrapper.sb-onboarding-wizard-step-installp{ padding-bottom: 0px; } .sb-onboarding-wizard-elem:last-of-type{ border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; } .sb-onboarding-wizard-license-error{ color: #D72C2C; display: flex; margin-top: 20px; font-weight: 500; } .sb-onboarding-wizard-license-error a{ text-decoration: underline; } .sb-onboarding-wizard-license-inp-ctn button svg{ fill: currentColor!important; margin-right: 10px; } .sb-onboarding-wizard-license-inp-ctn button svg path{ fill: currentColor !important; } @media (min-width: 760px) and (max-width: 960px) { .sb-onboarding-wizard-step-welcome { grid-template-columns: 70% 30%; } .sb-onboarding-wizard-welcome-text{ padding: 100px 10%; } .sb-onboarding-wizard-welcome-banner{ justify-content: center; display: flex; align-items: center; } } @media all and (max-width: 760px) { .sb-onboarding-wizard-step-welcome { display: flex; flex-direction: column-reverse; margin-bottom: 20px; } .sb-onboarding-wizard-welcome-text{ padding: 100px 10%; } } @media all and (max-width: 960px) { .sb-onboarding-wizard-ctn{ width: 100%; left: 0px; top: 0; } .sb-onboarding-wizard-sources-list{ grid-template-columns: 49% 49%; } } .sb-onboarding-wizard-smash-list{ display: flex; align-items: center; margin-top: 10px; } .sb-onboarding-wizard-smash-inside{ display: flex; padding: 6px 10px; border: 1px solid #E6E6EB; border-radius: 4px; column-gap: 10px; align-items: center; } .sb-onboarding-wizard-smash-list svg{ float: left; fill: #888; } .sb-onboarding-wizard-smash-elem{ display: flex; align-items: center; column-gap: 5px; text-transform: capitalize; } .sb-onboarding-wizard-smash-elem span { color: #333; font-size: 14px; font-weight: 500; } .sb-onboarding-wizard-smash-elem img{ width: 20px; height: auto; float: left; } .sb-onboarding-wizard-smash-inside .sb-control-elem-tltp{ margin-left: unset; width: 14px; height: 14px; cursor: pointer; } .sb-onboarding-wizard-smash-inside .sb-control-elem-tltp-content{ position: absolute; opacity: 0; visibility: hidden; top: -30px; left: 7px; -webkit-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .sb-onboarding-wizard-smash-inside .sb-control-elem-tltp:hover .sb-control-elem-tltp-content{ opacity: 1; visibility: visible; top: -16px; max-width: 300px; width: auto; left: 7px; } .sb-onboarding-wizard-clicking{ width: 300px; font-size: 14px; color: #3b4262; line-height: 1.7em; position: absolute; bottom: -65px; display: flex; column-gap: 10px; } .sb-onboarding-wizard-clicking svg{ fill: currentColor; margin-top: 5px; } .sb-onboarding-wizard-clicking span > span{ text-transform: capitalize; }PKL\̇ :instagram-feed/admin/builder/assets/js/personal-account.jsnu[/** * Personal Account Popup * * @since 6.1 */ Vue.component('sb-personal-account-component', { name: 'sb-personal-account-component', template: '#sb-personal-account-component', props: [ 'genericText', 'svgIcons', 'parentType', 'parent' ], data: function() { return{ personalAccountModalText : sbi_personal_account.personalAccountScreen, nonce : sbi_personal_account.nonce, ajaxHandler : sbi_personal_account.ajaxHandler, step : 1, personalAccountPopup : false, personalAccountInfo : { id : null, username : null, avatar : null, bio : '', fileName : '' }, loading : false } }, mounted : function(){ }, computed : { }, methods : { /* * Click Cancel Button * */ cancelMaybeLater : function(){ let self = this; self.personalAccountPopup = false; self.$parent.cancelPersonalAccountUpdate(); }, /* * Open File Chooser * When clicking the upload button * */ openFileChooser : function(){ document.getElementById("avatar_file").click(); }, /* * On File chooser change * Update the file name * */ onFileChooserChange : function(){ let self = this; self.personalAccountInfo.fileName = self.$refs.file.files[0].name; }, /* * Update Personal account info * send ajax info * */ addUpdatePersonalSourceInfo: function(){ let self = this, formData = new FormData(); formData.append( 'action', 'sbi_update_personal_account' ); formData.append( 'id', self.personalAccountInfo.id ); formData.append( 'bio', self.personalAccountInfo.bio ); formData.append( 'username', self.personalAccountInfo.username ); formData.append( 'nonce', self.nonce ); if( self.$refs.file.files[0] ){ formData.append( 'avatar', self.$refs.file.files[0] ); } self.loading = true; fetch(self.ajaxHandler, { method: "POST", credentials: 'same-origin', body: formData }) .then(response => response.json()) .then(data => { if( data.success ) { self.$parent.sourcesList = data.sourcesList; self.personalAccountPopup = false; self.$parent.successPersonalAccountUpdate(); } self.loading = false; }); }, } });PKL\D. . 8instagram-feed/admin/builder/assets/js/confirm-dialog.jsnu[/** * Confirm Dialog Box Popup * * @since 4.0 */ Vue.component('sb-confirm-dialog-component', { name: 'sb-confirm-dialog-component', template: '#sb-confirm-dialog-component', props: [ 'dialogBox', 'sourceToDelete', 'genericText', 'svgIcons', 'parentType', 'parent' ], computed : { dialogBoxElement :function(){ return this.dialogBox; } }, methods : { /** * Confirm Dialog Button text * * @since 4.0 */ getButtonText : function(type, dialogBoxElement){ if(type == 'confirm'){ if(dialogBoxElement.customButtons != undefined){ return dialogBoxElement.customButtons.confirm.text; } return this.genericText.confirm; } if(type == 'cancel'){ if(dialogBoxElement.customButtons != undefined){ return dialogBoxElement.customButtons.cancel.text; } return this.genericText.cancel; } }, /** * Confirm Dialog Box Button Background * * @since 4.0 */ getButtonBackground : function(type, dialogBoxElement){ var color = ''; if(type == 'confirm'){ if(dialogBoxElement.customButtons != undefined){ color = dialogBoxElement.customButtons.confirm.color; }else{ color = 'red'; } } if(type == 'cancel'){ if(dialogBoxElement.customButtons != undefined){ color = dialogBoxElement.customButtons.cancel.color; }else{ color = 'grey'; } } return 'sb-btn-' + color; }, /** * Confirm Dialog Box * * @since 4.0 */ confirmDialogAction : function(){ var self = this; self.$parent.confirmDialogAction(); self.closeConfirmDialog(); }, /** * Close Dialog Box * * @since 4.0 */ closeConfirmDialog : function(){ var self = this; if( self.parentType == 'builder' ){ self.$parent.sourceToDelete = {}; self.$parent.feedToDelete = {}; } if(self.dialogBoxElement.type == 'unsavedFeedSources'){ self.$parent.viewsActive.feedtypesCustomizerPopup = false; } if(self.dialogBoxElement.type == 'backAllToFeed'){ window.location.href = self.$parent.builderUrl; } var dialogBox = { active : false, type : null, heading : null, description : null, customButtons : undefined }; self.$emit('update:dialogBox', dialogBox) }, } });PKL\b>instagram-feed/admin/builder/assets/js/install-plugin-popup.jsnu[/** * Install Plugin Popup Popup * * @since 4.0 */ Vue.component('install-plugin-popup', { name: 'install-plugin-popup', template: '#install-plugin-popup', props: [ 'genericText', 'svgIcons', 'viewsActive', 'plugins' ], data: function() { return{ installerStatus: null } }, methods : { /** * Install or Activate Plugin * * @since 4.0 * * @return void */ installOrActivatePlugin : function( plugin, pluginPath, action ){ this.installerStatus = 'loading'; let data = new FormData(); data.append( 'action', action ); data.append( 'nonce', sbi_builder.nonce ); data.append( 'plugin', pluginPath ); data.append( 'type', 'plugin' ); fetch(sbi_builder.ajax_handler, { method: "POST", credentials: 'same-origin', body: data }) .then(response => response.json()) .then(data => { if( data.success == true ) { this.installerStatus = null; plugin.installed = true; plugin.activated = true; } return; }); }, }, }); PKL\CH#t8instagram-feed/admin/builder/assets/js/owl.autoheight.jsnu[!function(o,i){var s=function(t){this._core=t,this._previousHeight=null,this._handlers={"initialized.owl.carousel refreshed.owl.carousel":o.proxy(function(t){t.namespace&&this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":o.proxy(function(t){t.namespace&&this._core.settings.autoHeight&&"position"===t.property.name&&this.update()},this),"loaded.owl.lazy":o.proxy(function(t){t.namespace&&this._core.settings.autoHeight&&t.element.closest("."+this._core.settings.itemClass).index()===this._core.current()&&this.update()},this)},this._core.options=o.extend({},s.Defaults,this._core.options),this._core.$element.on(this._handlers),this._intervalId=null;var e=this;o(i).on("load",function(){e._core.settings.autoHeight&&e.update()}),o(i).resize(function(){e._core.settings.autoHeight&&(null!=e._intervalId&&clearTimeout(e._intervalId),e._intervalId=setTimeout(function(){e.update()},250))})};s.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},s.prototype.update=function(){var t=this._core._current,e=t+this._core.settings.items,i=this._core.settings.lazyLoad,t=this._core.$stage.children().toArray().slice(t,e),s=[],e=0;o.each(t,function(t,e){s.push(o(e).height())}),(e=Math.max.apply(null,s))<=1&&i&&this._previousHeight&&(e=this._previousHeight),this._previousHeight=e,this._core.$stage.parent().height(e).addClass(this._core.settings.autoHeightClass)},s.prototype.destroy=function(){var t,e;for(t in this._handlers)this._core.$element.off(t,this._handlers[t]);for(e in Object.getOwnPropertyNames(this))"function"!=typeof this[e]&&(this[e]=null)},o.fn.owlCarousel.Constructor.Plugins.AutoHeight=s}(window.Zepto||window.jQuery,window,document);PKL\R!!8instagram-feed/admin/builder/assets/js/tooltip-wizard.jsnu[/** * Custom Facebook Tooltip Manager * * @since 4.0 */ 'use strict'; var SBITooltipWizard = window.SBITooltipWizard || ( function( document, window, $ ) { /** * Public functions and properties. * * @since 4.0 * * @type {object} */ var app = { /** * Start the engine. * * @since 4.0 */ init: function() { //$( app.ready ); $( window ).on( 'load', function() { if ( $.isFunction( $.ready.then ) ) { $.ready.then( app.load ); } else { app.load(); } } ); }, /** * Window load. * * @since 4.0 */ load: function() { if(sbi_admin_tooltip_wizard.sbi_wizard_gutenberg){ app.initGutenbergTooltip(); } }, initGutenbergTooltip : function(){ if ( typeof $.fn.tooltipster === 'undefined' ) { return; } var $dot = $( ' ' ); var anchor = '.block-editor .edit-post-header-toolbar__inserter-toggle'; var tooltipsterArgs = { content : $( '#sbi-gutenberg-tooltip-content' ), trigger : 'custom', interactive : true, animationDuration: 0, delay : 0, theme : [ 'tooltipster-default', 'sbi-tooltip-wizard' ], side : 'bottom', distance : 3, functionReady : function( instance, helper ) { instance._$tooltip.on( 'click', '.sbi-tlp-wizard-close', function() { instance.close(); } ); instance.reposition(); }, }; $('.components-button.edit-post-header-toolbar__inserter-toggle').on('click',function() { $('.sbi-tooltip-wizard.tooltipster-sidetip').hide(); }); $dot.insertAfter( anchor ).tooltipster( tooltipsterArgs ).tooltipster( 'open' ); }, /** * Check if we're in Gutenberg editor. * * @since 4.0 * * @returns {boolean} Is Gutenberg or not. */ isGutenberg: function() { return typeof wp !== 'undefined' && Object.prototype.hasOwnProperty.call( wp, 'blocks' ); }, } return app; }( document, window, jQuery ) ); SBITooltipWizard.init(); PKL\_Q{G8 8 3instagram-feed/admin/builder/assets/js/date_i18n.jsnu[function date_i18n(n,t){function e(n,t){return i[n]?i[n]():t}function r(n,t){for(n=String(n);n.length0?e=c.__plugins[d]:a.each(c.__plugins,function(a,b){return b.name.substring(b.name.length-d.length-1)=="."+d?(e=b,!1):void 0}),e}if(b.name.indexOf(".")<0)throw new Error("Plugins must be namespaced");return c.__plugins[b.name]=b,b.core&&c.__bridge(b.core,c,b.name),this},_trigger:function(){var a=Array.prototype.slice.apply(arguments);return"string"==typeof a[0]&&(a[0]={type:a[0]}),this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,a),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,a),this},instances:function(b){var c=[],d=b||".tooltipstered";return a(d).each(function(){var b=a(this),d=b.data("tooltipster-ns");d&&a.each(d,function(a,d){c.push(b.data(d))})}),c},instancesLatest:function(){return this.__instancesLatestArr},off:function(){return this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},origins:function(b){var c=b?b+" ":"";return a(c+".tooltipstered").toArray()},setDefaults:function(b){return a.extend(f,b),this},triggerHandler:function(){return this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},a.tooltipster=new i,a.Tooltipster=function(b,c){this.__callbacks={close:[],open:[]},this.__closingTime,this.__Content,this.__contentBcr,this.__destroyed=!1,this.__$emitterPrivate=a({}),this.__$emitterPublic=a({}),this.__enabled=!0,this.__garbageCollector,this.__Geometry,this.__lastPosition,this.__namespace="tooltipster-"+Math.round(1e6*Math.random()),this.__options,this.__$originParents,this.__pointerIsOverOrigin=!1,this.__previousThemes=[],this.__state="closed",this.__timeouts={close:[],open:null},this.__touchEvents=[],this.__tracker=null,this._$origin,this._$tooltip,this.__init(b,c)},a.Tooltipster.prototype={__init:function(b,c){var d=this;if(d._$origin=a(b),d.__options=a.extend(!0,{},f,c),d.__optionsFormat(),!h.IE||h.IE>=d.__options.IEmin){var e=null;if(void 0===d._$origin.data("tooltipster-initialTitle")&&(e=d._$origin.attr("title"),void 0===e&&(e=null),d._$origin.data("tooltipster-initialTitle",e)),null!==d.__options.content)d.__contentSet(d.__options.content);else{var g,i=d._$origin.attr("data-tooltip-content");i&&(g=a(i)),g&&g[0]?d.__contentSet(g.first()):d.__contentSet(e)}d._$origin.removeAttr("title").addClass("tooltipstered"),d.__prepareOrigin(),d.__prepareGC(),a.each(d.__options.plugins,function(a,b){d._plug(b)}),h.hasTouchCapability&&a(h.window.document.body).on("touchmove."+d.__namespace+"-triggerOpen",function(a){d._touchRecordEvent(a)}),d._on("created",function(){d.__prepareTooltip()})._on("repositioned",function(a){d.__lastPosition=a.position})}else d.__options.disabled=!0},__contentInsert:function(){var a=this,b=a._$tooltip.find(".tooltipster-content"),c=a.__Content,d=function(a){c=a};return a._trigger({type:"format",content:a.__Content,format:d}),a.__options.functionFormat&&(c=a.__options.functionFormat.call(a,a,{origin:a._$origin[0]},a.__Content)),"string"!=typeof c||a.__options.contentAsHTML?b.empty().append(c):b.text(c),a},__contentSet:function(b){return b instanceof a&&this.__options.contentCloning&&(b=b.clone(!0)),this.__Content=b,this._trigger({type:"updated",content:b}),this},__destroyError:function(){throw new Error("This tooltip has been destroyed and cannot execute your method call.")},__geometry:function(){var b=this,c=b._$origin,d=b._$origin.is("area");if(d){var e=b._$origin.parent().attr("name");c=a('img[usemap="#'+e+'"]')}var f=c[0].getBoundingClientRect(),g=a(h.window.document),i=a(h.window),j=c,k={available:{document:null,window:null},document:{size:{height:g.height(),width:g.width()}},window:{scroll:{left:h.window.scrollX||h.window.document.documentElement.scrollLeft,top:h.window.scrollY||h.window.document.documentElement.scrollTop},size:{height:i.height(),width:i.width()}},origin:{fixedLineage:!1,offset:{},size:{height:f.bottom-f.top,width:f.right-f.left},usemapImage:d?c[0]:null,windowOffset:{bottom:f.bottom,left:f.left,right:f.right,top:f.top}}};if(d){var l=b._$origin.attr("shape"),m=b._$origin.attr("coords");if(m&&(m=m.split(","),a.map(m,function(a,b){m[b]=parseInt(a)})),"default"!=l)switch(l){case"circle":var n=m[0],o=m[1],p=m[2],q=o-p,r=n-p;k.origin.size.height=2*p,k.origin.size.width=k.origin.size.height,k.origin.windowOffset.left+=r,k.origin.windowOffset.top+=q;break;case"rect":var s=m[0],t=m[1],u=m[2],v=m[3];k.origin.size.height=v-t,k.origin.size.width=u-s,k.origin.windowOffset.left+=s,k.origin.windowOffset.top+=t;break;case"poly":for(var w=0,x=0,y=0,z=0,A="even",B=0;By&&(y=C,0===B&&(w=y)),w>C&&(w=C),A="odd"):(C>z&&(z=C,1==B&&(x=z)),x>C&&(x=C),A="even")}k.origin.size.height=z-x,k.origin.size.width=y-w,k.origin.windowOffset.left+=w,k.origin.windowOffset.top+=x}}var D=function(a){k.origin.size.height=a.height,k.origin.windowOffset.left=a.left,k.origin.windowOffset.top=a.top,k.origin.size.width=a.width};for(b._trigger({type:"geometry",edit:D,geometry:{height:k.origin.size.height,left:k.origin.windowOffset.left,top:k.origin.windowOffset.top,width:k.origin.size.width}}),k.origin.windowOffset.right=k.origin.windowOffset.left+k.origin.size.width,k.origin.windowOffset.bottom=k.origin.windowOffset.top+k.origin.size.height,k.origin.offset.left=k.origin.windowOffset.left+k.window.scroll.left,k.origin.offset.top=k.origin.windowOffset.top+k.window.scroll.top,k.origin.offset.bottom=k.origin.offset.top+k.origin.size.height,k.origin.offset.right=k.origin.offset.left+k.origin.size.width,k.available.document={bottom:{height:k.document.size.height-k.origin.offset.bottom,width:k.document.size.width},left:{height:k.document.size.height,width:k.origin.offset.left},right:{height:k.document.size.height,width:k.document.size.width-k.origin.offset.right},top:{height:k.origin.offset.top,width:k.document.size.width}},k.available.window={bottom:{height:Math.max(k.window.size.height-Math.max(k.origin.windowOffset.bottom,0),0),width:k.window.size.width},left:{height:k.window.size.height,width:Math.max(k.origin.windowOffset.left,0)},right:{height:k.window.size.height,width:Math.max(k.window.size.width-Math.max(k.origin.windowOffset.right,0),0)},top:{height:Math.max(k.origin.windowOffset.top,0),width:k.window.size.width}};"html"!=j[0].tagName.toLowerCase();){if("fixed"==j.css("position")){k.origin.fixedLineage=!0;break}j=j.parent()}return k},__optionsFormat:function(){return"number"==typeof this.__options.animationDuration&&(this.__options.animationDuration=[this.__options.animationDuration,this.__options.animationDuration]),"number"==typeof this.__options.delay&&(this.__options.delay=[this.__options.delay,this.__options.delay]),"number"==typeof this.__options.delayTouch&&(this.__options.delayTouch=[this.__options.delayTouch,this.__options.delayTouch]),"string"==typeof this.__options.theme&&(this.__options.theme=[this.__options.theme]),null===this.__options.parent?this.__options.parent=a(h.window.document.body):"string"==typeof this.__options.parent&&(this.__options.parent=a(this.__options.parent)),"hover"==this.__options.trigger?(this.__options.triggerOpen={mouseenter:!0,touchstart:!0},this.__options.triggerClose={mouseleave:!0,originClick:!0,touchleave:!0}):"click"==this.__options.trigger&&(this.__options.triggerOpen={click:!0,tap:!0},this.__options.triggerClose={click:!0,tap:!0}),this._trigger("options"),this},__prepareGC:function(){var b=this;return b.__options.selfDestruction?b.__garbageCollector=setInterval(function(){var c=(new Date).getTime();b.__touchEvents=a.grep(b.__touchEvents,function(a,b){return c-a.time>6e4}),d(b._$origin)||b.close(function(){b.destroy()})},2e4):clearInterval(b.__garbageCollector),b},__prepareOrigin:function(){var a=this;if(a._$origin.off("."+a.__namespace+"-triggerOpen"),h.hasTouchCapability&&a._$origin.on("touchstart."+a.__namespace+"-triggerOpen touchend."+a.__namespace+"-triggerOpen touchcancel."+a.__namespace+"-triggerOpen",function(b){a._touchRecordEvent(b)}),a.__options.triggerOpen.click||a.__options.triggerOpen.tap&&h.hasTouchCapability){var b="";a.__options.triggerOpen.click&&(b+="click."+a.__namespace+"-triggerOpen "),a.__options.triggerOpen.tap&&h.hasTouchCapability&&(b+="touchend."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){a._touchIsMeaningfulEvent(b)&&a._open(b)})}if(a.__options.triggerOpen.mouseenter||a.__options.triggerOpen.touchstart&&h.hasTouchCapability){var b="";a.__options.triggerOpen.mouseenter&&(b+="mouseenter."+a.__namespace+"-triggerOpen "),a.__options.triggerOpen.touchstart&&h.hasTouchCapability&&(b+="touchstart."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){!a._touchIsTouchEvent(b)&&a._touchIsEmulatedEvent(b)||(a.__pointerIsOverOrigin=!0,a._openShortly(b))})}if(a.__options.triggerClose.mouseleave||a.__options.triggerClose.touchleave&&h.hasTouchCapability){var b="";a.__options.triggerClose.mouseleave&&(b+="mouseleave."+a.__namespace+"-triggerOpen "),a.__options.triggerClose.touchleave&&h.hasTouchCapability&&(b+="touchend."+a.__namespace+"-triggerOpen touchcancel."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){a._touchIsMeaningfulEvent(b)&&(a.__pointerIsOverOrigin=!1)})}return a},__prepareTooltip:function(){var b=this,c=b.__options.interactive?"auto":"";return b._$tooltip.attr("id",b.__namespace).css({"pointer-events":c,zIndex:b.__options.zIndex}),a.each(b.__previousThemes,function(a,c){b._$tooltip.removeClass(c)}),a.each(b.__options.theme,function(a,c){b._$tooltip.addClass(c)}),b.__previousThemes=a.merge([],b.__options.theme),b},__scrollHandler:function(b){var c=this;if(c.__options.triggerClose.scroll)c._close(b);else if(d(c._$origin)&&d(c._$tooltip)){var e=null;if(b.target===h.window.document)c.__Geometry.origin.fixedLineage||c.__options.repositionOnScroll&&c.reposition(b);else{e=c.__geometry();var f=!1;if("fixed"!=c._$origin.css("position")&&c.__$originParents.each(function(b,c){var d=a(c),g=d.css("overflow-x"),h=d.css("overflow-y");if("visible"!=g||"visible"!=h){var i=c.getBoundingClientRect();if("visible"!=g&&(e.origin.windowOffset.lefti.right))return f=!0,!1;if("visible"!=h&&(e.origin.windowOffset.topi.bottom))return f=!0,!1}return"fixed"==d.css("position")?!1:void 0}),f)c._$tooltip.css("visibility","hidden");else if(c._$tooltip.css("visibility","visible"),c.__options.repositionOnScroll)c.reposition(b);else{var g=e.origin.offset.left-c.__Geometry.origin.offset.left,i=e.origin.offset.top-c.__Geometry.origin.offset.top;c._$tooltip.css({left:c.__lastPosition.coord.left+g,top:c.__lastPosition.coord.top+i})}}c._trigger({type:"scroll",event:b,geo:e})}return c},__stateSet:function(a){return this.__state=a,this._trigger({type:"state",state:a}),this},__timeoutsClear:function(){return clearTimeout(this.__timeouts.open),this.__timeouts.open=null,a.each(this.__timeouts.close,function(a,b){clearTimeout(b)}),this.__timeouts.close=[],this},__trackerStart:function(){var a=this,b=a._$tooltip.find(".tooltipster-content");return a.__options.trackTooltip&&(a.__contentBcr=b[0].getBoundingClientRect()),a.__tracker=setInterval(function(){if(d(a._$origin)&&d(a._$tooltip)){if(a.__options.trackOrigin){var e=a.__geometry(),f=!1;c(e.origin.size,a.__Geometry.origin.size)&&(a.__Geometry.origin.fixedLineage?c(e.origin.windowOffset,a.__Geometry.origin.windowOffset)&&(f=!0):c(e.origin.offset,a.__Geometry.origin.offset)&&(f=!0)),f||(a.__options.triggerClose.mouseleave?a._close():a.reposition())}if(a.__options.trackTooltip){var g=b[0].getBoundingClientRect();g.height===a.__contentBcr.height&&g.width===a.__contentBcr.width||(a.reposition(),a.__contentBcr=g)}}else a._close()},a.__options.trackerInterval),a},_close:function(b,c,d){var e=this,f=!0;if(e._trigger({type:"close",event:b,stop:function(){f=!1}}),f||d){c&&e.__callbacks.close.push(c),e.__callbacks.open=[],e.__timeoutsClear();var g=function(){a.each(e.__callbacks.close,function(a,c){c.call(e,e,{event:b,origin:e._$origin[0]})}),e.__callbacks.close=[]};if("closed"!=e.__state){var i=!0,j=new Date,k=j.getTime(),l=k+e.__options.animationDuration[1];if("disappearing"==e.__state&&l>e.__closingTime&&e.__options.animationDuration[1]>0&&(i=!1),i){e.__closingTime=l,"disappearing"!=e.__state&&e.__stateSet("disappearing");var m=function(){clearInterval(e.__tracker),e._trigger({type:"closing",event:b}),e._$tooltip.off("."+e.__namespace+"-triggerClose").removeClass("tooltipster-dying"),a(h.window).off("."+e.__namespace+"-triggerClose"),e.__$originParents.each(function(b,c){a(c).off("scroll."+e.__namespace+"-triggerClose")}),e.__$originParents=null,a(h.window.document.body).off("."+e.__namespace+"-triggerClose"),e._$origin.off("."+e.__namespace+"-triggerClose"),e._off("dismissable"),e.__stateSet("closed"),e._trigger({type:"after",event:b}),e.__options.functionAfter&&e.__options.functionAfter.call(e,e,{event:b,origin:e._$origin[0]}),g()};h.hasTransitions?(e._$tooltip.css({"-moz-animation-duration":e.__options.animationDuration[1]+"ms","-ms-animation-duration":e.__options.animationDuration[1]+"ms","-o-animation-duration":e.__options.animationDuration[1]+"ms","-webkit-animation-duration":e.__options.animationDuration[1]+"ms","animation-duration":e.__options.animationDuration[1]+"ms","transition-duration":e.__options.animationDuration[1]+"ms"}),e._$tooltip.clearQueue().removeClass("tooltipster-show").addClass("tooltipster-dying"),e.__options.animationDuration[1]>0&&e._$tooltip.delay(e.__options.animationDuration[1]),e._$tooltip.queue(m)):e._$tooltip.stop().fadeOut(e.__options.animationDuration[1],m)}}else g()}return e},_off:function(){return this.__$emitterPrivate.off.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_on:function(){return this.__$emitterPrivate.on.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_one:function(){return this.__$emitterPrivate.one.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_open:function(b,c){var e=this;if(!e.__destroying&&d(e._$origin)&&e.__enabled){var f=!0;if("closed"==e.__state&&(e._trigger({type:"before",event:b,stop:function(){f=!1}}),f&&e.__options.functionBefore&&(f=e.__options.functionBefore.call(e,e,{event:b,origin:e._$origin[0]}))),f!==!1&&null!==e.__Content){c&&e.__callbacks.open.push(c),e.__callbacks.close=[],e.__timeoutsClear();var g,i=function(){"stable"!=e.__state&&e.__stateSet("stable"),a.each(e.__callbacks.open,function(a,b){b.call(e,e,{origin:e._$origin[0],tooltip:e._$tooltip[0]})}),e.__callbacks.open=[]};if("closed"!==e.__state)g=0,"disappearing"===e.__state?(e.__stateSet("appearing"),h.hasTransitions?(e._$tooltip.clearQueue().removeClass("tooltipster-dying").addClass("tooltipster-show"),e.__options.animationDuration[0]>0&&e._$tooltip.delay(e.__options.animationDuration[0]),e._$tooltip.queue(i)):e._$tooltip.stop().fadeIn(i)):"stable"==e.__state&&i();else{if(e.__stateSet("appearing"),g=e.__options.animationDuration[0],e.__contentInsert(),e.reposition(b,!0),h.hasTransitions?(e._$tooltip.addClass("tooltipster-"+e.__options.animation).addClass("tooltipster-initial").css({"-moz-animation-duration":e.__options.animationDuration[0]+"ms","-ms-animation-duration":e.__options.animationDuration[0]+"ms","-o-animation-duration":e.__options.animationDuration[0]+"ms","-webkit-animation-duration":e.__options.animationDuration[0]+"ms","animation-duration":e.__options.animationDuration[0]+"ms","transition-duration":e.__options.animationDuration[0]+"ms"}),setTimeout(function(){"closed"!=e.__state&&(e._$tooltip.addClass("tooltipster-show").removeClass("tooltipster-initial"),e.__options.animationDuration[0]>0&&e._$tooltip.delay(e.__options.animationDuration[0]),e._$tooltip.queue(i))},0)):e._$tooltip.css("display","none").fadeIn(e.__options.animationDuration[0],i),e.__trackerStart(),a(h.window).on("resize."+e.__namespace+"-triggerClose",function(b){var c=a(document.activeElement);(c.is("input")||c.is("textarea"))&&a.contains(e._$tooltip[0],c[0])||e.reposition(b)}).on("scroll."+e.__namespace+"-triggerClose",function(a){e.__scrollHandler(a)}),e.__$originParents=e._$origin.parents(),e.__$originParents.each(function(b,c){a(c).on("scroll."+e.__namespace+"-triggerClose",function(a){e.__scrollHandler(a)})}),e.__options.triggerClose.mouseleave||e.__options.triggerClose.touchleave&&h.hasTouchCapability){e._on("dismissable",function(a){a.dismissable?a.delay?(m=setTimeout(function(){e._close(a.event)},a.delay),e.__timeouts.close.push(m)):e._close(a):clearTimeout(m)});var j=e._$origin,k="",l="",m=null;e.__options.interactive&&(j=j.add(e._$tooltip)),e.__options.triggerClose.mouseleave&&(k+="mouseenter."+e.__namespace+"-triggerClose ",l+="mouseleave."+e.__namespace+"-triggerClose "),e.__options.triggerClose.touchleave&&h.hasTouchCapability&&(k+="touchstart."+e.__namespace+"-triggerClose",l+="touchend."+e.__namespace+"-triggerClose touchcancel."+e.__namespace+"-triggerClose"),j.on(l,function(a){if(e._touchIsTouchEvent(a)||!e._touchIsEmulatedEvent(a)){var b="mouseleave"==a.type?e.__options.delay:e.__options.delayTouch;e._trigger({delay:b[1],dismissable:!0,event:a,type:"dismissable"})}}).on(k,function(a){!e._touchIsTouchEvent(a)&&e._touchIsEmulatedEvent(a)||e._trigger({dismissable:!1,event:a,type:"dismissable"})})}e.__options.triggerClose.originClick&&e._$origin.on("click."+e.__namespace+"-triggerClose",function(a){e._touchIsTouchEvent(a)||e._touchIsEmulatedEvent(a)||e._close(a)}),(e.__options.triggerClose.click||e.__options.triggerClose.tap&&h.hasTouchCapability)&&setTimeout(function(){if("closed"!=e.__state){var b="",c=a(h.window.document.body);e.__options.triggerClose.click&&(b+="click."+e.__namespace+"-triggerClose "),e.__options.triggerClose.tap&&h.hasTouchCapability&&(b+="touchend."+e.__namespace+"-triggerClose"),c.on(b,function(b){e._touchIsMeaningfulEvent(b)&&(e._touchRecordEvent(b),e.__options.interactive&&a.contains(e._$tooltip[0],b.target)||e._close(b))}),e.__options.triggerClose.tap&&h.hasTouchCapability&&c.on("touchstart."+e.__namespace+"-triggerClose",function(a){e._touchRecordEvent(a)})}},0),e._trigger("ready"),e.__options.functionReady&&e.__options.functionReady.call(e,e,{origin:e._$origin[0],tooltip:e._$tooltip[0]})}if(e.__options.timer>0){var m=setTimeout(function(){e._close()},e.__options.timer+g);e.__timeouts.close.push(m)}}}return e},_openShortly:function(a){var b=this,c=!0;if("stable"!=b.__state&&"appearing"!=b.__state&&!b.__timeouts.open&&(b._trigger({type:"start",event:a,stop:function(){c=!1}}),c)){var d=0==a.type.indexOf("touch")?b.__options.delayTouch:b.__options.delay;d[0]?b.__timeouts.open=setTimeout(function(){b.__timeouts.open=null,b.__pointerIsOverOrigin&&b._touchIsMeaningfulEvent(a)?(b._trigger("startend"),b._open(a)):b._trigger("startcancel")},d[0]):(b._trigger("startend"),b._open(a))}return b},_optionsExtract:function(b,c){var d=this,e=a.extend(!0,{},c),f=d.__options[b];return f||(f={},a.each(c,function(a,b){var c=d.__options[a];void 0!==c&&(f[a]=c)})),a.each(e,function(b,c){void 0!==f[b]&&("object"!=typeof c||c instanceof Array||null==c||"object"!=typeof f[b]||f[b]instanceof Array||null==f[b]?e[b]=f[b]:a.extend(e[b],f[b]))}),e},_plug:function(b){var c=a.tooltipster._plugin(b);if(!c)throw new Error('The "'+b+'" plugin is not defined');return c.instance&&a.tooltipster.__bridge(c.instance,this,c.name),this},_touchIsEmulatedEvent:function(a){for(var b=!1,c=(new Date).getTime(),d=this.__touchEvents.length-1;d>=0;d--){var e=this.__touchEvents[d];if(!(c-e.time<500))break;e.target===a.target&&(b=!0)}return b},_touchIsMeaningfulEvent:function(a){return this._touchIsTouchEvent(a)&&!this._touchSwiped(a.target)||!this._touchIsTouchEvent(a)&&!this._touchIsEmulatedEvent(a)},_touchIsTouchEvent:function(a){return 0==a.type.indexOf("touch")},_touchRecordEvent:function(a){return this._touchIsTouchEvent(a)&&(a.time=(new Date).getTime(),this.__touchEvents.push(a)),this},_touchSwiped:function(a){for(var b=!1,c=this.__touchEvents.length-1;c>=0;c--){var d=this.__touchEvents[c];if("touchmove"==d.type){b=!0;break}if("touchstart"==d.type&&a===d.target)break}return b},_trigger:function(){var b=Array.prototype.slice.apply(arguments);return"string"==typeof b[0]&&(b[0]={type:b[0]}),b[0].instance=this,b[0].origin=this._$origin?this._$origin[0]:null,b[0].tooltip=this._$tooltip?this._$tooltip[0]:null,this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,b),a.tooltipster._trigger.apply(a.tooltipster,b),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,b),this},_unplug:function(b){var c=this;if(c[b]){var d=a.tooltipster._plugin(b);d.instance&&a.each(d.instance,function(a,d){c[a]&&c[a].bridged===c[b]&&delete c[a]}),c[b].__destroy&&c[b].__destroy(),delete c[b]}return c},close:function(a){return this.__destroyed?this.__destroyError():this._close(null,a),this},content:function(a){var b=this;if(void 0===a)return b.__Content;if(b.__destroyed)b.__destroyError();else if(b.__contentSet(a),null!==b.__Content){if("closed"!==b.__state&&(b.__contentInsert(),b.reposition(),b.__options.updateAnimation))if(h.hasTransitions){var c=b.__options.updateAnimation;b._$tooltip.addClass("tooltipster-update-"+c),setTimeout(function(){"closed"!=b.__state&&b._$tooltip.removeClass("tooltipster-update-"+c)},1e3)}else b._$tooltip.fadeTo(200,.5,function(){"closed"!=b.__state&&b._$tooltip.fadeTo(200,1)})}else b._close();return b},destroy:function(){var b=this;if(b.__destroyed)b.__destroyError();else{"closed"!=b.__state?b.option("animationDuration",0)._close(null,null,!0):b.__timeoutsClear(),b._trigger("destroy"),b.__destroyed=!0,b._$origin.removeData(b.__namespace).off("."+b.__namespace+"-triggerOpen"),a(h.window.document.body).off("."+b.__namespace+"-triggerOpen");var c=b._$origin.data("tooltipster-ns");if(c)if(1===c.length){var d=null;"previous"==b.__options.restoration?d=b._$origin.data("tooltipster-initialTitle"):"current"==b.__options.restoration&&(d="string"==typeof b.__Content?b.__Content:a("

").append(b.__Content).html()),d&&b._$origin.attr("title",d),b._$origin.removeClass("tooltipstered"),b._$origin.removeData("tooltipster-ns").removeData("tooltipster-initialTitle")}else c=a.grep(c,function(a,c){return a!==b.__namespace}),b._$origin.data("tooltipster-ns",c);b._trigger("destroyed"),b._off(),b.off(),b.__Content=null,b.__$emitterPrivate=null,b.__$emitterPublic=null,b.__options.parent=null,b._$origin=null,b._$tooltip=null,a.tooltipster.__instancesLatestArr=a.grep(a.tooltipster.__instancesLatestArr,function(a,c){return b!==a}),clearInterval(b.__garbageCollector)}return b},disable:function(){return this.__destroyed?(this.__destroyError(),this):(this._close(),this.__enabled=!1,this)},elementOrigin:function(){return this.__destroyed?void this.__destroyError():this._$origin[0]},elementTooltip:function(){return this._$tooltip?this._$tooltip[0]:null},enable:function(){return this.__enabled=!0,this},hide:function(a){return this.close(a)},instance:function(){return this},off:function(){return this.__destroyed||this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},open:function(a){return this.__destroyed?this.__destroyError():this._open(null,a),this},option:function(b,c){return void 0===c?this.__options[b]:(this.__destroyed?this.__destroyError():(this.__options[b]=c,this.__optionsFormat(),a.inArray(b,["trigger","triggerClose","triggerOpen"])>=0&&this.__prepareOrigin(),"selfDestruction"===b&&this.__prepareGC()),this)},reposition:function(a,b){var c=this;return c.__destroyed?c.__destroyError():"closed"!=c.__state&&d(c._$origin)&&(b||d(c._$tooltip))&&(b||c._$tooltip.detach(),c.__Geometry=c.__geometry(),c._trigger({type:"reposition",event:a,helper:{geo:c.__Geometry}})),c},show:function(a){return this.open(a)},status:function(){return{destroyed:this.__destroyed,enabled:this.__enabled,open:"closed"!==this.__state,state:this.__state}},triggerHandler:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},a.fn.tooltipster=function(){var b=Array.prototype.slice.apply(arguments),c="You are using a single HTML element as content for several tooltips. You probably want to set the contentCloning option to TRUE.";if(0===this.length)return this;if("string"==typeof b[0]){var d="#*$~&";return this.each(function(){var e=a(this).data("tooltipster-ns"),f=e?a(this).data(e[0]):null;if(!f)throw new Error("You called Tooltipster's \""+b[0]+'" method on an uninitialized element');if("function"!=typeof f[b[0]])throw new Error('Unknown method "'+b[0]+'"');this.length>1&&"content"==b[0]&&(b[1]instanceof a||"object"==typeof b[1]&&null!=b[1]&&b[1].tagName)&&!f.__options.contentCloning&&f.__options.debug&&console.log(c);var g=f[b[0]](b[1],b[2]);return g!==f||"instance"===b[0]?(d=g,!1):void 0}),"#*$~&"!==d?d:this}a.tooltipster.__instancesLatestArr=[];var e=b[0]&&void 0!==b[0].multiple,g=e&&b[0].multiple||!e&&f.multiple,h=b[0]&&void 0!==b[0].content,i=h&&b[0].content||!h&&f.content,j=b[0]&&void 0!==b[0].contentCloning,k=j&&b[0].contentCloning||!j&&f.contentCloning,l=b[0]&&void 0!==b[0].debug,m=l&&b[0].debug||!l&&f.debug;return this.length>1&&(i instanceof a||"object"==typeof i&&null!=i&&i.tagName)&&!k&&m&&console.log(c),this.each(function(){var c=!1,d=a(this),e=d.data("tooltipster-ns"),f=null;e?g?c=!0:m&&(console.log("Tooltipster: one or more tooltips are already attached to the element below. Ignoring."),console.log(this)):c=!0,c&&(f=new a.Tooltipster(this,b[0]),e||(e=[]),e.push(f.__namespace),d.data("tooltipster-ns",e),d.data(f.__namespace,f),f.__options.functionInit&&f.__options.functionInit.call(f,f,{origin:this}),f._trigger("init")),a.tooltipster.__instancesLatestArr.push(f)}),this},b.prototype={__init:function(b){this.__$tooltip=b,this.__$tooltip.css({left:0,overflow:"hidden",position:"absolute",top:0}).find(".tooltipster-content").css("overflow","auto"),this.$container=a('
').append(this.__$tooltip).appendTo(h.window.document.body)},__forceRedraw:function(){var a=this.__$tooltip.parent();this.__$tooltip.detach(),this.__$tooltip.appendTo(a)},constrain:function(a,b){return this.constraints={width:a,height:b},this.__$tooltip.css({display:"block",height:"",overflow:"auto",width:a}),this},destroy:function(){this.__$tooltip.detach().find(".tooltipster-content").css({display:"",overflow:""}),this.$container.remove()},free:function(){return this.constraints=null,this.__$tooltip.css({display:"",height:"",overflow:"visible",width:""}),this},measure:function(){this.__forceRedraw();var a=this.__$tooltip[0].getBoundingClientRect(),b={size:{height:a.height||a.bottom-a.top,width:a.width||a.right-a.left}};if(this.constraints){var c=this.__$tooltip.find(".tooltipster-content"),d=this.__$tooltip.outerHeight(),e=c[0].getBoundingClientRect(),f={height:d<=this.constraints.height,width:a.width<=this.constraints.width&&e.width>=c[0].scrollWidth-1};b.fits=f.height&&f.width}return h.IE&&h.IE<=11&&b.size.width!==h.window.document.documentElement.clientWidth&&(b.size.width=Math.ceil(b.size.width)+1),b}};var j=navigator.userAgent.toLowerCase();-1!=j.indexOf("msie")?h.IE=parseInt(j.split("msie")[1]):-1!==j.toLowerCase().indexOf("trident")&&-1!==j.indexOf(" rv:11")?h.IE=11:-1!=j.toLowerCase().indexOf("edge/")&&(h.IE=parseInt(j.toLowerCase().split("edge/")[1]));var k="tooltipster.sideTip";return a.tooltipster._plugin({name:k,instance:{__defaults:function(){return{arrow:!0,distance:6,functionPosition:null,maxWidth:null,minIntersection:16,minWidth:0,position:null,side:"top",viewportAware:!0}},__init:function(a){var b=this;b.__instance=a,b.__namespace="tooltipster-sideTip-"+Math.round(1e6*Math.random()),b.__previousState="closed",b.__options,b.__optionsFormat(),b.__instance._on("state."+b.__namespace,function(a){"closed"==a.state?b.__close():"appearing"==a.state&&"closed"==b.__previousState&&b.__create(),b.__previousState=a.state}),b.__instance._on("options."+b.__namespace,function(){b.__optionsFormat()}),b.__instance._on("reposition."+b.__namespace,function(a){b.__reposition(a.event,a.helper)})},__close:function(){this.__instance.content()instanceof a&&this.__instance.content().detach(),this.__instance._$tooltip.remove(),this.__instance._$tooltip=null},__create:function(){var b=a('
');this.__options.arrow||b.find(".tooltipster-box").css("margin",0).end().find(".tooltipster-arrow").hide(),this.__options.minWidth&&b.css("min-width",this.__options.minWidth+"px"),this.__options.maxWidth&&b.css("max-width",this.__options.maxWidth+"px"), this.__instance._$tooltip=b,this.__instance._trigger("created")},__destroy:function(){this.__instance._off("."+self.__namespace)},__optionsFormat:function(){var b=this;if(b.__options=b.__instance._optionsExtract(k,b.__defaults()),b.__options.position&&(b.__options.side=b.__options.position),"object"!=typeof b.__options.distance&&(b.__options.distance=[b.__options.distance]),b.__options.distance.length<4&&(void 0===b.__options.distance[1]&&(b.__options.distance[1]=b.__options.distance[0]),void 0===b.__options.distance[2]&&(b.__options.distance[2]=b.__options.distance[0]),void 0===b.__options.distance[3]&&(b.__options.distance[3]=b.__options.distance[1]),b.__options.distance={top:b.__options.distance[0],right:b.__options.distance[1],bottom:b.__options.distance[2],left:b.__options.distance[3]}),"string"==typeof b.__options.side){var c={top:"bottom",right:"left",bottom:"top",left:"right"};b.__options.side=[b.__options.side,c[b.__options.side]],"left"==b.__options.side[0]||"right"==b.__options.side[0]?b.__options.side.push("top","bottom"):b.__options.side.push("right","left")}6===a.tooltipster._env.IE&&b.__options.arrow!==!0&&(b.__options.arrow=!1)},__reposition:function(b,c){var d,e=this,f=e.__targetFind(c),g=[];e.__instance._$tooltip.detach();var h=e.__instance._$tooltip.clone(),i=a.tooltipster._getRuler(h),j=!1,k=e.__instance.option("animation");switch(k&&h.removeClass("tooltipster-"+k),a.each(["window","document"],function(d,k){var l=null;if(e.__instance._trigger({container:k,helper:c,satisfied:j,takeTest:function(a){l=a},results:g,type:"positionTest"}),1==l||0!=l&&0==j&&("window"!=k||e.__options.viewportAware))for(var d=0;d=h.outerSize.width&&c.geo.available[k][n].height>=h.outerSize.height?h.fits=!0:h.fits=!1:h.fits=p.fits,"window"==k&&(h.fits?"top"==n||"bottom"==n?h.whole=c.geo.origin.windowOffset.right>=e.__options.minIntersection&&c.geo.window.size.width-c.geo.origin.windowOffset.left>=e.__options.minIntersection:h.whole=c.geo.origin.windowOffset.bottom>=e.__options.minIntersection&&c.geo.window.size.height-c.geo.origin.windowOffset.top>=e.__options.minIntersection:h.whole=!1),g.push(h),h.whole)j=!0;else if("natural"==h.mode&&(h.fits||h.size.width<=c.geo.available[k][n].width))return!1}})}}),e.__instance._trigger({edit:function(a){g=a},event:b,helper:c,results:g,type:"positionTested"}),g.sort(function(a,b){if(a.whole&&!b.whole)return-1;if(!a.whole&&b.whole)return 1;if(a.whole&&b.whole){var c=e.__options.side.indexOf(a.side),d=e.__options.side.indexOf(b.side);return d>c?-1:c>d?1:"natural"==a.mode?-1:1}if(a.fits&&!b.fits)return-1;if(!a.fits&&b.fits)return 1;if(a.fits&&b.fits){var c=e.__options.side.indexOf(a.side),d=e.__options.side.indexOf(b.side);return d>c?-1:c>d?1:"natural"==a.mode?-1:1}return"document"==a.container&&"bottom"==a.side&&"natural"==a.mode?-1:1}),d=g[0],d.coord={},d.side){case"left":case"right":d.coord.top=Math.floor(d.target-d.size.height/2);break;case"bottom":case"top":d.coord.left=Math.floor(d.target-d.size.width/2)}switch(d.side){case"left":d.coord.left=c.geo.origin.windowOffset.left-d.outerSize.width;break;case"right":d.coord.left=c.geo.origin.windowOffset.right+d.distance.horizontal;break;case"top":d.coord.top=c.geo.origin.windowOffset.top-d.outerSize.height;break;case"bottom":d.coord.top=c.geo.origin.windowOffset.bottom+d.distance.vertical}"window"==d.container?"top"==d.side||"bottom"==d.side?d.coord.left<0?c.geo.origin.windowOffset.right-this.__options.minIntersection>=0?d.coord.left=0:d.coord.left=c.geo.origin.windowOffset.right-this.__options.minIntersection-1:d.coord.left>c.geo.window.size.width-d.size.width&&(c.geo.origin.windowOffset.left+this.__options.minIntersection<=c.geo.window.size.width?d.coord.left=c.geo.window.size.width-d.size.width:d.coord.left=c.geo.origin.windowOffset.left+this.__options.minIntersection+1-d.size.width):d.coord.top<0?c.geo.origin.windowOffset.bottom-this.__options.minIntersection>=0?d.coord.top=0:d.coord.top=c.geo.origin.windowOffset.bottom-this.__options.minIntersection-1:d.coord.top>c.geo.window.size.height-d.size.height&&(c.geo.origin.windowOffset.top+this.__options.minIntersection<=c.geo.window.size.height?d.coord.top=c.geo.window.size.height-d.size.height:d.coord.top=c.geo.origin.windowOffset.top+this.__options.minIntersection+1-d.size.height):(d.coord.left>c.geo.window.size.width-d.size.width&&(d.coord.left=c.geo.window.size.width-d.size.width),d.coord.left<0&&(d.coord.left=0)),e.__sideChange(h,d.side),c.tooltipClone=h[0],c.tooltipParent=e.__instance.option("parent").parent[0],c.mode=d.mode,c.whole=d.whole,c.origin=e.__instance._$origin[0],c.tooltip=e.__instance._$tooltip[0],delete d.container,delete d.fits,delete d.mode,delete d.outerSize,delete d.whole,d.distance=d.distance.horizontal||d.distance.vertical;var l=a.extend(!0,{},d);if(e.__instance._trigger({edit:function(a){d=a},event:b,helper:c,position:l,type:"position"}),e.__options.functionPosition){var m=e.__options.functionPosition.call(e,e.__instance,c,l);m&&(d=m)}i.destroy();var n,o;"top"==d.side||"bottom"==d.side?(n={prop:"left",val:d.target-d.coord.left},o=d.size.width-this.__options.minIntersection):(n={prop:"top",val:d.target-d.coord.top},o=d.size.height-this.__options.minIntersection),n.valo&&(n.val=o);var p;p=c.geo.origin.fixedLineage?c.geo.origin.windowOffset:{left:c.geo.origin.windowOffset.left+c.geo.window.scroll.left,top:c.geo.origin.windowOffset.top+c.geo.window.scroll.top},d.coord={left:p.left+(d.coord.left-c.geo.origin.windowOffset.left),top:p.top+(d.coord.top-c.geo.origin.windowOffset.top)},e.__sideChange(e.__instance._$tooltip,d.side),c.geo.origin.fixedLineage?e.__instance._$tooltip.css("position","fixed"):e.__instance._$tooltip.css("position",""),e.__instance._$tooltip.css({left:d.coord.left,top:d.coord.top,height:d.size.height,width:d.size.width}).find(".tooltipster-arrow").css({left:"",top:""}).css(n.prop,n.val),e.__instance._$tooltip.appendTo(e.__instance.option("parent")),e.__instance._trigger({type:"repositioned",event:b,position:d})},__sideChange:function(a,b){a.removeClass("tooltipster-bottom").removeClass("tooltipster-left").removeClass("tooltipster-right").removeClass("tooltipster-top").addClass("tooltipster-"+b)},__targetFind:function(a){var b={},c=this.__instance._$origin[0].getClientRects();if(c.length>1){var d=this.__instance._$origin.css("opacity");1==d&&(this.__instance._$origin.css("opacity",.99),c=this.__instance._$origin[0].getClientRects(),this.__instance._$origin.css("opacity",1))}if(c.length<2)b.top=Math.floor(a.geo.origin.windowOffset.left+a.geo.origin.size.width/2),b.bottom=b.top,b.left=Math.floor(a.geo.origin.windowOffset.top+a.geo.origin.size.height/2),b.right=b.left;else{var e=c[0];b.top=Math.floor(e.left+(e.right-e.left)/2),e=c.length>2?c[Math.ceil(c.length/2)-1]:c[0],b.right=Math.floor(e.top+(e.bottom-e.top)/2),e=c[c.length-1],b.bottom=Math.floor(e.left+(e.right-e.left)/2),e=c.length>2?c[Math.ceil((c.length+1)/2)-1]:c[c.length-1],b.left=Math.floor(e.top+(e.bottom-e.top)/2)}return b}}}),a});PKL\+%)1MM7instagram-feed/admin/builder/assets/js/vue-color.min.jsnu[!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.VueColor=t():e.VueColor=t()}("undefined"!=typeof self?self:this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=60)}([function(e,t){function n(e,t){var n=e[1]||"",i=e[3];if(!i)return n;if(t&&"function"==typeof btoa){var o=r(i);return[n].concat(i.sources.map(function(e){return"/*# sourceURL="+i.sourceRoot+e+" */"})).concat([o]).join("\n")}return[n].join("\n")}function r(e){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e))))+" */"}e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var r=n(t,e);return t[2]?"@media "+t[2]+"{"+r+"}":r}).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var r={},i=0;in.parts.length&&(r.parts.length=n.parts.length)}else{for(var a=[],i=0;i0?(0,o.default)(e.hex):e&&e.hsv?(0,o.default)(e.hsv):e&&e.rgba?(0,o.default)(e.rgba):e&&e.rgb?(0,o.default)(e.rgb):(0,o.default)(e))||void 0!==n._a&&null!==n._a||n.setAlpha(r||1);var i=n.toHsl(),a=n.toHsv();return 0===i.s&&(a.h=i.h=e.h||e.hsl&&e.hsl.h||t||0),{hsl:i,hex:n.toHexString().toUpperCase(),hex8:n.toHex8String().toUpperCase(),rgba:n.toRgb(),hsv:a,oldHue:e.h||t||i.h,source:e.source,a:e.a||n.getAlpha()}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(65),o=function(e){return e&&e.__esModule?e:{default:e}}(i);t.default={props:["value"],data:function(){return{val:r(this.value)}},computed:{colors:{get:function(){return this.val},set:function(e){this.val=e,this.$emit("input",e)}}},watch:{value:function(e){this.val=r(e)}},methods:{colorChange:function(e,t){this.oldHue=this.colors.hsl.h,this.colors=r(e,t||this.oldHue)},isValidHex:function(e){return(0,o.default)(e).isValid()},simpleCheckForValidColor:function(e){for(var t=["r","g","b","a","h","s","l","v"],n=0,r=0,i=0;i0?r:n)(e)}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){var r=n(12);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},function(e,t){e.exports={}},function(e,t,n){var r=n(46),i=n(30);e.exports=Object.keys||function(e){return r(e,i)}},function(e,t,n){var r=n(29)("keys"),i=n(19);e.exports=function(e){return r[e]||(r[e]=i(e))}},function(e,t,n){var r=n(15),i=n(4),o=i["__core-js_shared__"]||(i["__core-js_shared__"]={});(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:r.version,mode:n(14)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var r=n(8).f,i=n(6),o=n(11)("toStringTag");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},function(e,t,n){t.f=n(11)},function(e,t,n){var r=n(4),i=n(15),o=n(14),a=n(32),s=n(8).f;e.exports=function(e){var t=i.Symbol||(i.Symbol=o?{}:r.Symbol||{});"_"==e.charAt(0)||e in t||s(t,e,{value:a.f(e)})}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(3),o=r(i),a=n(5),s=r(a),c=["#4D4D4D","#999999","#FFFFFF","#F44E3B","#FE9200","#FCDC00","#DBDF00","#A4DD00","#68CCCA","#73D8FF","#AEA1FF","#FDA1FF","#333333","#808080","#CCCCCC","#D33115","#E27300","#FCC400","#B0BC00","#68BC00","#16A5A5","#009CE0","#7B64FF","#FA28FF","#000000","#666666","#B3B3B3","#9F0500","#C45100","#FB9E00","#808900","#194D33","#0C797D","#0062B1","#653294","#AB149E"];t.default={name:"Compact",mixins:[o.default],props:{palette:{type:Array,default:function(){return c}}},components:{"ed-in":s.default},computed:{pick:function(){return this.colors.hex.toUpperCase()}},methods:{handlerClick:function(e){this.colorChange({hex:e,source:"hex"})}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={name:"editableInput",props:{label:String,labelText:String,desc:String,value:[String,Number],max:Number,min:Number,arrowOffset:{type:Number,default:1}},computed:{val:{get:function(){return this.value},set:function(e){if(!(void 0!==this.max&&+e>this.max))return e;this.$refs.input.value=this.max}},labelId:function(){return"input__label__"+this.label+"__"+Math.random().toString().slice(2,5)},labelSpanText:function(){return this.labelText||this.label}},methods:{update:function(e){this.handleChange(e.target.value)},handleChange:function(e){var t={};t[this.label]=e,void 0===t.hex&&void 0===t["#"]?this.$emit("change",t):e.length>5&&this.$emit("change",t)},handleKeyDown:function(e){var t=this.val,n=Number(t);if(n){var r=this.arrowOffset||1;38===e.keyCode&&(t=n+r,this.handleChange(t),e.preventDefault()),40===e.keyCode&&(t=n-r,this.handleChange(t),e.preventDefault())}}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(3),i=function(e){return e&&e.__esModule?e:{default:e}}(r),o=["#FFFFFF","#F2F2F2","#E6E6E6","#D9D9D9","#CCCCCC","#BFBFBF","#B3B3B3","#A6A6A6","#999999","#8C8C8C","#808080","#737373","#666666","#595959","#4D4D4D","#404040","#333333","#262626","#0D0D0D","#000000"];t.default={name:"Grayscale",mixins:[i.default],props:{palette:{type:Array,default:function(){return o}}},components:{},computed:{pick:function(){return this.colors.hex.toUpperCase()}},methods:{handlerClick:function(e){this.colorChange({hex:e,source:"hex"})}}}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(5),o=r(i),a=n(3),s=r(a);t.default={name:"Material",mixins:[s.default],components:{"ed-in":o.default},methods:{onChange:function(e){e&&(e.hex?this.isValidHex(e.hex)&&this.colorChange({hex:e.hex,source:"hex"}):(e.r||e.g||e.b)&&this.colorChange({r:e.r||this.colors.rgba.r,g:e.g||this.colors.rgba.g,b:e.b||this.colors.rgba.b,a:e.a||this.colors.rgba.a,source:"rgba"}))}}}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(81),o=r(i),a=n(3),s=r(a),c=n(13),l=r(c);t.default={name:"Slider",mixins:[s.default],props:{swatches:{type:Array,default:function(){return[{s:.5,l:.8},{s:.5,l:.65},{s:.5,l:.5},{s:.5,l:.35},{s:.5,l:.2}]}}},components:{hue:l.default},computed:{normalizedSwatches:function(){return this.swatches.map(function(e){return"object"!==(void 0===e?"undefined":(0,o.default)(e))?{s:.5,l:e}:e})}},methods:{isActive:function(e,t){var n=this.colors.hsl;return 1===n.l&&1===e.l||(0===n.l&&0===e.l||Math.abs(n.l-e.l)<.01&&Math.abs(n.s-e.s)<.01)},hueChange:function(e){this.colorChange(e)},handleSwClick:function(e,t){this.colorChange({h:this.colors.hsl.h,s:t.s,l:t.l,source:"hsl"})}}}},function(e,t,n){"use strict";var r=n(14),i=n(41),o=n(44),a=n(7),s=n(26),c=n(88),l=n(31),u=n(95),f=n(11)("iterator"),d=!([].keys&&"next"in[].keys()),h=function(){return this};e.exports=function(e,t,n,p,v,g,b){c(n,t,p);var x,m,_,w=function(e){if(!d&&e in F)return F[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},y=t+" Iterator",C="values"==v,k=!1,F=e.prototype,S=F[f]||F["@@iterator"]||v&&F[v],A=S||w(v),O=v?C?w("entries"):A:void 0,E="Array"==t?F.entries||S:S;if(E&&(_=u(E.call(new e)))!==Object.prototype&&_.next&&(l(_,y,!0),r||"function"==typeof _[f]||a(_,f,h)),C&&S&&"values"!==S.name&&(k=!0,A=function(){return S.call(this)}),r&&!b||!d&&!k&&F[f]||a(F,f,A),s[t]=A,s[y]=h,v)if(x={values:C?A:w("values"),keys:g?A:w("keys"),entries:O},b)for(m in x)m in F||o(F,m,x[m]);else i(i.P+i.F*(d||k),t,x);return x}},function(e,t,n){var r=n(4),i=n(15),o=n(86),a=n(7),s=n(6),c=function(e,t,n){var l,u,f,d=e&c.F,h=e&c.G,p=e&c.S,v=e&c.P,g=e&c.B,b=e&c.W,x=h?i:i[t]||(i[t]={}),m=x.prototype,_=h?r:p?r[t]:(r[t]||{}).prototype;h&&(n=t);for(l in n)(u=!d&&_&&void 0!==_[l])&&s(x,l)||(f=u?_[l]:n[l],x[l]=h&&"function"!=typeof _[l]?n[l]:g&&u?o(f,r):b&&_[l]==f?function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(f):v&&"function"==typeof f?o(Function.call,f):f,v&&((x.virtual||(x.virtual={}))[l]=f,e&c.R&&m&&!m[l]&&a(m,l,f)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},function(e,t,n){e.exports=!n(9)&&!n(17)(function(){return 7!=Object.defineProperty(n(43)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){var r=n(12),i=n(4).document,o=r(i)&&r(i.createElement);e.exports=function(e){return o?i.createElement(e):{}}},function(e,t,n){e.exports=n(7)},function(e,t,n){var r=n(16),i=n(89),o=n(30),a=n(28)("IE_PROTO"),s=function(){},c=function(){var e,t=n(43)("iframe"),r=o.length;for(t.style.display="none",n(94).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write("'; $js_option_html .= ""; return $js_option_html; } /** * Overwritten in the Pro version * * @param $feed_types_and_terms * * @return string * * @since 2.1/5.2 */ public function get_first_user( $feed_types_and_terms ) { if ( isset( $feed_types_and_terms['users'][0] ) ) { return $feed_types_and_terms['users'][0]['term']; } if ( isset( $feed_types_and_terms['tagged'][0] ) ) { return $feed_types_and_terms['tagged'][0]['term']; } else { return ''; } } /** * Adds recorded strings to an array * * @param $to_add * * @since 2.0/5.0 */ public function add_report( $to_add ) { $this->report[] = $to_add; } /** * @return array * * @since 2.0/5.0 */ public function get_report() { return $this->report; } /** * Additional options/settings added to the main div * for the feed * * Overwritten in the Pro version * * @param $other_atts * @param $settings * * @return string */ protected function add_other_atts( $other_atts, $settings ) { return $other_atts; } /** * Used for filtering a single API request worth of posts * * Overwritten in the Pro version * * @param array $post_set a single set of post data from the api * * @return mixed|array * * @since 2.0/5.0 */ protected function filter_posts( $post_set, $settings = array() ) { // array_unique( $post_set, SORT_REGULAR); if ( $settings['media'] === 'all' ) { return $post_set; } $media_filter = $settings['media'] !== 'all' ? $settings['media'] : false; if ( $media_filter ) { $media_filter = is_array( $media_filter ) ? $media_filter : array( $media_filter ); } $video_types = ! empty( $settings['videotypes'] ) ? explode( ',', str_replace( ' ', '', strtolower( $settings['videotypes'] ) ) ) : array( 'igtv', 'regular', 'reels' ); $filtered_posts = array(); foreach ( $post_set as $post ) { $keep_post = false; $is_hidden = false; $passes_media_filter = true; if ( $media_filter ) { $media_type = SB_Instagram_Parse::get_media_type( $post ); if ( $media_type === 'video' && in_array( 'videos', $media_filter, true ) ) { if ( ! empty( $video_types ) ) { $video_type = SB_Instagram_Parse::get_media_product_type( $post ); $video_type = 'feed' === $video_type ? 'regular' : $video_type; if ( ! in_array( $video_type, $video_types, true ) ) { $passes_media_filter = false; } } } elseif ( $media_type === 'video' && ! in_array( 'videos', $media_filter, true ) ) { $passes_media_filter = false; } elseif ( $media_type === 'image' && ! in_array( 'photos', $media_filter, true ) ) { $passes_media_filter = false; } elseif ( $media_type === 'carousel' && ! in_array( 'photos', $media_filter, true ) ) { $passes_media_filter = false; } } if ( ! $is_hidden && $passes_media_filter ) { $keep_post = true; } $keep_post = apply_filters( 'sbi_passes_filter', $keep_post, $post, $settings ); if ( $keep_post ) { $filtered_posts[] = $post; } } return $filtered_posts; } protected function handle_no_posts_found( $settings = array(), $feed_types_and_terms = array() ) { global $sb_instagram_posts_manager; $error_message_return = array( 'error_message' => __( 'Error: No posts found.', 'instagram-feed' ), 'admin_only' => __( 'Make sure this account has posts available on instagram.com.', 'instagram-feed' ), 'frontend_directions' => '' . __( 'Click here to troubleshoot', 'instagram-feed' ) . '', 'backend_directions' => '' . __( 'Click here to troubleshoot', 'instagram-feed' ) . '' ); $sb_instagram_posts_manager->maybe_set_display_error( 'configuration', $error_message_return ); } protected function remove_duplicate_posts() { $posts = $this->post_data; $ids_in_feed = array(); $non_duplicate_posts = array(); $removed = array(); foreach ( $posts as $post ) { $post_id = SB_Instagram_Parse::get_post_id( $post ); if ( ! in_array( $post_id, $ids_in_feed, true ) ) { $ids_in_feed[] = $post_id; $non_duplicate_posts[] = $post; } else { $removed[] = $post_id; } } $this->add_report( 'removed duplicates: ' . implode(', ', $removed ) ); $this->set_post_data( $non_duplicate_posts ); } /** * Used for limiting the cache size * * @since 2.0/5.1.1 */ protected function trim_posts_to_max() { if ( ! is_array( $this->post_data ) ) { return; } $max = apply_filters( 'sbi_max_cache_size', 500 ); $this->set_post_data( array_slice( $this->post_data , 0, $max ) ); } /** * Used for permanent feeds or white list feeds to * stop pagination if all posts are already added * * Overwritten in the Pro version * * @param array $settings * @param int $offset * * @return bool * * @since 2.0/5.0 */ protected function feed_is_complete( $settings, $offset = 0 ) { return false; } /** * @param $connected_account_for_term * * @since 2.0/5.1.2 */ private function clear_expired_access_token_notice( $connected_account_for_term ) { InstagramFeed\Builder\SBI_Source::clear_error( $connected_account_for_term['user_id'] ); } /** * Iterates through post data and tracks the index of the current post. * The actual post ids of the posts are stored in an array so the plugin * can search for local images that may be available. * * @param array $posts final filtered post data for the feed * @param array $settings * @param int $offset * * @since 2.0/5.0 */ private function posts_loop( $posts, $settings, $offset = 0 ) { $image_ids = array(); $post_index = $offset; $icon_type = 'svg'; $resized_images = $this->get_resized_images(); foreach ( $posts as $post ) { $image_ids[] = SB_Instagram_Parse::get_post_id( $post ); $account_type = SB_Instagram_Parse::get_account_type( $post ); include sbi_get_feed_template_part( 'item', $settings ); $post_index++; } $this->image_ids_post_set = $image_ids; } private function get_account_term( $term_and_params ) { if ( isset( $term_and_params['hashtag_name'] ) ) { return '#' . $term_and_params['hashtag_name']; } else { return ''; } } /** * Uses array of API request results and merges them based on how * the feed should be sorted. Mixed feeds are always sorted alternating * since there is no post date for hashtag feeds. * * * @param array $post_sets an array of single API request worth * of posts * @param array $settings * * @return array * * @since 2.0/5.0 */ private function merge_posts( $post_sets, $settings ) { $merged_posts = array(); if ( $settings['sortby'] === 'alternate' || $settings['sortby'] === 'api' && isset( $post_sets[1] ) ) { // don't bother merging posts if there is only one post set if ( isset( $post_sets[1] ) ) { $min_cycles = $settings['sortby'] === 'api' ? min( 200 / count( $post_sets ) + 5, 50 ) : max( 1, (int)$settings['minnum'] ); $terms = array(); for( $i = 0; $i <= $min_cycles; $i++ ) { $ii = 0; foreach ( $post_sets as $post_set ) { if ( isset( $post_sets[ $ii ]['term'] ) ) { $term = $post_sets[ $ii ]['term']; unset( $post_sets[ $ii ]['term'] ); if ( ! isset( $terms[ $ii ] ) ) { $terms[ $ii ] = $term; // } if ( strpos( $term, '#' ) !== false ) { $post_index = 0; foreach ( $post_sets[ $ii ] as $post ) { $post_sets[ $ii ][ $post_index ]['term'] = $term; $post_index++; } } } if ( isset( $post_set[ $i ] ) && isset( $post_set[ $i ]['id'] ) ) { $post_set[ $i ]['term'] = $terms[ $ii ]; $merged_posts[] = $post_set[ $i ]; } $ii++; } } } else { if ( isset( $post_sets[0]['term'] ) ) { $term = $post_sets[0]['term']; unset( $post_sets[0]['term'] ); if ( strpos( $term, '#' ) !== false ) { $post_index = 0; foreach ( $post_sets[0] as $post ) { $post_sets[0][ $post_index ]['term'] = $term; $post_index++; } } } $merged_posts = isset( $post_sets[0] ) ? $post_sets[0] : array(); } } elseif ( $settings['sortby'] === 'api' ) { if ( isset( $post_sets[0] ) ) { if ( isset( $post_sets[0]['term'] ) ) { $term = $post_sets[0]['term']; unset( $post_sets[0]['term'] ); if ( strpos( $term, '#' ) !== false ) { $post_index = 0; foreach ( $post_sets[0] as $post ) { $post_sets[0][ $post_index ]['term'] = $term; $post_index++; } } } $post_set_index = 0; foreach ( $post_sets as $post_set ) { if ( isset( $post_sets[ $post_set_index ]['term'] ) ) { $term = $post_sets[ $post_set_index ]['term']; unset( $post_sets[ $post_set_index ]['term'] ); if ( strpos( $term, '#' ) !== false ) { $post_index = 0; foreach ( $post_sets[0] as $post ) { $post_sets[ $post_set_index ][ $post_index ]['term'] = $term; $post_index++; } } } $merged_posts = array_merge( $merged_posts, $post_set ); $post_set_index ++; } } } else { // don't bother merging posts if there is only one post set if ( isset( $post_sets[1] ) ) { $terms = array(); $ii = 0; foreach ( $post_sets as $post_set ) { if ( isset( $post_set[0]['id'] ) ) { if ( isset( $post_sets[ $ii ]['term'] ) ) { if ( ! isset( $terms[ $ii ] ) ) { $terms[ $ii ] = $post_set['term']; } unset( $post_sets[ $ii ]['term'] ); $iii = 0; foreach ( $post_sets[ $ii ] as $post ) { $post_sets[ $ii ][ $iii ]['term'] = $terms[ $ii ]; $iii++; } } $merged_posts = array_merge( $merged_posts, $post_sets[ $ii ] ); $ii++; } } } else { if ( isset( $post_sets[0]['term'] ) ) { $term = $post_sets[0]['term']; unset( $post_sets[0]['term'] ); if ( strpos( $term, '#' ) !== false ) { $post_index = 0; foreach ( $post_sets[0] as $post ) { $post_sets[0][ $post_index ]['term'] = $term; $post_index++; } } } $merged_posts = isset( $post_sets[0] ) ? $post_sets[0] : array(); } } if ( isset( $merged_posts['term'] ) ) { unset( $merged_posts['term'] ); } return $merged_posts; } /** * Sorting by date will be more accurate for multi-term * feeds if posts are merged before sorting. * * @param array $settings * * @return bool * * @since 5.10.1 */ protected function should_merge_after( $settings ) { if ( ! isset( $settings['sortby'] ) ) { return false; } $merge_befores = array( 'alternate', 'api', 'random', 'likes' ); if ( ! in_array( $settings['sortby'], $merge_befores, true ) ) { return false; } return true; } /** * Sorts a post set based on sorting settings. Sorting by "alternate" * is done when merging posts for efficiency's sake so the post set is * just returned as it is. * * Overwritten in the Pro version. * * @param array $post_set * @param array $settings * * @return mixed|array * * @since 2.0/5.0 * @since 2.1/5.2 added filter hook for applying custom sorting */ protected function sort_posts( $post_set, $settings ) { if ( empty( $post_set ) ) { return $post_set; } // sorting done with "merge_posts" to be more efficient if ( $settings['sortby'] === 'alternate' || $settings['sortby'] === 'api' ) { $return_post_set = $post_set; } elseif ( $settings['sortby'] === 'random' ) { /* * randomly selects posts in a random order. Cache saves posts * in this random order so paginating does not cause some posts to show up * twice or not at all */ usort($post_set, 'sbi_rand_sort' ); $return_post_set = $post_set; } else { // compares posted on dates of posts usort($post_set, 'sbi_date_sort' ); $return_post_set = $post_set; } /** * Apply a custom sorting of posts * * @param array $return_post_set Ordered set of filtered posts * @param array $settings Settings for this feed * * @since 2.1/5.2 */ return apply_filters( 'sbi_sorted_posts', $return_post_set, $settings ); } /** * Can trigger a second attempt at getting posts from the API * * Overwritten in the Pro version * * @param string $type * @param array $connected_account_with_error * @param int $attempts * * @return bool * * @since 2.0/5.1.1 */ protected function can_try_another_request( $type, $connected_account_with_error, $attempts = 0 ) { return false; } /** * returns a second connected account if it exists * * Overwritten in the Pro version * * @param string $type * @param array $attempted_connected_accounts * * @return bool * * @since 2.0/5.1.1 */ protected function get_different_connected_account( $type, $attempted_connected_accounts ) { return false; } /** * Generates The Feed Container CSS classes * * @param array $settings * * @return string * * @since 6.0 */ function get_feed_container_css_classes( $settings ){ $customizer = $settings['customizer']; if($customizer){ }else{ $classes = array(); if ( empty( $settings['widthresp'] ) || $settings['widthresp'] == 'on' || $settings['widthresp'] == 'true' || $settings['widthresp'] === true ) { if ( $settings['widthresp'] !== 'false' ) { $classes[] = 'sbi_width_resp'; } } if ( ! empty( $settings['class'] ) ) { $classes[] = esc_attr( $settings['class'] ); } if ( ! empty( $settings['height'] ) && (((int)$settings['height'] < 100 && $settings['heightunit'] === '%') || $settings['heightunit'] === 'px') ) { $classes[] = 'sbi_fixed_height'; } if ( ! empty( $settings['disablemobile'] ) && ($settings['disablemobile'] == 'on' || $settings['disablemobile'] == 'true' || $settings['disablemobile'] == true) ) { if ( $settings['disablemobile'] !== 'false' ) { $classes[] = 'sbi_disable_mobile'; } } $additional_classes = ''; if ( ! empty( $classes ) ) { $additional_classes = ' ' . implode( ' ', $classes ); } return $additional_classes; } return ''; } } PKL\M̧GKGK.instagram-feed/inc/class-sb-instagram-post.phpnu[prefix . SBI_INSTAGRAM_POSTS_TYPE; $feed_id_match = $wpdb->get_results( $wpdb->prepare( "SELECT id, media_id, top_time_stamp, images_done FROM $table_name WHERE instagram_id = %s LIMIT 1", $instagram_post_id ), ARRAY_A ); $this->db_id = ! empty( $feed_id_match ) ? $feed_id_match[0]['id'] : ''; $this->media_id = ! empty( $feed_id_match ) ? $feed_id_match[0]['media_id'] : ''; $this->top_time_stamp = ! empty( $feed_id_match ) && isset( $feed_id_match[0]['top_time_stamp'] ) ? $feed_id_match[0]['top_time_stamp'] : ''; $this->images_done = ! empty( $feed_id_match ) && isset( $feed_id_match[0]['images_done'] ) ? $feed_id_match[0]['images_done'] === '1' : 0; $this->instagram_post_id = $instagram_post_id; $this->encryption = new SB_Instagram_Data_Encryption(); } /** * Whether or not this post has already been saved in the custom table * * @return bool * * @since 2.0/4.0 */ public function exists_in_posts_table() { return ! empty( $this->db_id ); } /** * Whether or not resized image files have already been recorded as being created * in the database table * * @return bool|int * * @since 2.0/4.0 */ public function images_done_resizing() { return $this->images_done; } /** * @param array $instagram_api_data * * @since 2.0/4.0 */ public function set_instagram_api_data( $instagram_api_data ) { $this->instagram_api_data = $instagram_api_data; } /** * Used for sorting top posts since they don't have a posted on date * * @return string * * @since 2.0/4.0 */ public function get_top_time_stamp() { return $this->top_time_stamp; } /** * Record newly created images so they can be returned and used right away. * * Not used in version 2.0/5.0 but can be used to resize and use * images "on the fly" when the feed is being displayed. * * @param string $key * @param string $val * * @since 2.0/4.0 */ public function add_resized_image_to_obj_array( $key, $val ) { $this->resized_image_array[ $key ] = $val; } /** * Used to save information about the post before image resizing is done to * prevent a potentially storing multiple entries for the same post * * @param mixed|string|bool $transient_name (optional) * @param null $timestamp_override (optional) * * @return bool * * @since 2.0/4.0 */ public function save_in_db( $transient_name = false, $timestamp_override = null ) { global $wpdb; $parsed_data = $this->get_parsed_post_data(); $timestamp = ! empty( $timestamp_override ) && empty( $parsed_data['timestamp'] ) ? $timestamp_override : $parsed_data['timestamp']; $entry_data = array( "'" . date( 'Y-m-d H:i:s' ) . "'", "'" . esc_sql( $parsed_data['id'] ) . "'", "'" . esc_sql( $timestamp ) . "'", "'" . esc_sql( $timestamp ) . "'", "'" . esc_sql( $this->encryption->encrypt( sbi_json_encode( $this->instagram_api_data ) ) ) . "'", "'pending'", "'pending'", 0, "'" . date( 'Y-m-d H:i:s' ) . "'", ); $entry_string = implode( ',', $entry_data ); $table_name = $wpdb->prefix . SBI_INSTAGRAM_POSTS_TYPE; $timestamp_column = 'time_stamp'; if ( substr( $transient_name, 4, 1 ) === '+' ) { $timestamp_column = 'top_time_stamp'; } $error = $wpdb->query( "INSERT INTO $table_name (created_on,instagram_id,time_stamp,top_time_stamp,json_data,media_id,sizes,images_done,last_requested) VALUES ($entry_string);" ); if ( $error !== false ) { $this->db_id = $wpdb->insert_id; $this->insert_sbi_instagram_feeds_posts( $transient_name ); } else { global $sb_instagram_posts_manager; $error = $wpdb->last_error; $query = $wpdb->last_query; $sb_instagram_posts_manager->add_error( 'storage', __( 'Error inserting post.', 'instagram-feed' ) . ' ' . $error . '
' . $query . '' ); } return true; } /** * Uses the post's data to get a relevant full size image url and resize it * * @param array $image_sizes * @param string $upload_dir * @param string $upload_url * * @since 2.0/4.0 * @since 2.0/5.0 loop through assoc array (res setting => desired width of image) to * accommodate personal accounts and possible * custom sizes in the future */ public function resize_and_save_image( $image_sizes, $upload_dir, $upload_url ) { $sbi_statuses_option = get_option( 'sbi_statuses', array() ); $options = sbi_get_database_settings(); $image_format = isset($options['image_format']) ? $options['image_format'] : 'webp'; $webp_supported = false; if ($image_format == 'webp') { $webp_supported = wp_image_editor_supports(array('mime_type' => 'image/webp')); } $extension = $webp_supported ? '.webp' : '.jpg'; if ( isset( $this->instagram_api_data['id'] ) ) { $image_source_set = SB_Instagram_Parse::get_media_src_set( $this->instagram_api_data ); $account_type = SB_Instagram_Parse::get_account_type( $this->instagram_api_data ); $image_sizes_to_make = isset( $image_sizes[ $account_type ] ) ? $image_sizes[ $account_type ] : array(); // if it's a personal account or a weird url, the post id is used, otherwise the last part of the image url is used if ( $account_type === 'business' ) { $new_file_name = explode( '?', SB_Instagram_Parse::get_media_url( $this->instagram_api_data, 'lightbox' ) ); if ( strlen( basename( $new_file_name[0], '.jpg' ) ) > 10 ) { $new_file_name = basename( $new_file_name[0], '.jpg' ); } else { $new_file_name = $this->instagram_api_data['id']; } $new_file_name = str_replace('.webp', '', $new_file_name); } else { $new_file_name = $this->instagram_api_data['id']; } // the process is considered a success if one image is successfully resized $one_successful_image_resize = false; foreach ( $image_sizes_to_make as $res_setting => $image_size ) { if ( $account_type === 'business' ) { $file_name = SB_Instagram_Parse::get_media_url( $this->instagram_api_data, 'lightbox' ); } else { $file_name = isset( $image_source_set[ $image_size ] ) ? $image_source_set[ $image_size ] : SB_Instagram_Parse::get_media_url( $this->instagram_api_data, 'lightbox' ); } if ( strpos( $file_name, 'placeholder' ) !== false ) { $file_name = ''; } if ( ! empty( $file_name ) ) { $sizes = array( 'height' => 1, 'width' => 1, ); $suffix = $res_setting; $this_image_file_name = $new_file_name . $suffix . $extension; $image_editor = wp_get_image_editor( $file_name ); // If there is an error then lets try a fallback approach if ( is_wp_error( $image_editor ) ) { // Gives us access to the download_url() and wp_handle_sideload() functions. require_once ABSPATH . 'wp-admin/includes/file.php'; $timeout_seconds = 5; // Download file to temp dir. $temp_file = download_url( $file_name, $timeout_seconds ); $image_editor = wp_get_image_editor( $temp_file ); global $sb_instagram_posts_manager; $details = 'Using backup editor method.' . $file_name; $sb_instagram_posts_manager->add_error( 'image_editor', $details ); } // not uncommon for the image editor to not work using it this way if ( ! is_wp_error( $image_editor ) ) { $image_editor->set_quality( 80 ); $sizes = $image_editor->get_size(); $image_editor->resize( $image_size, null ); $full_file_name = trailingslashit( $upload_dir ) . $this_image_file_name; $mime_type = $webp_supported ? 'image/webp' : 'image/jpeg'; $saved_image = $image_editor->save( $full_file_name, $mime_type ); if ( ! $saved_image ) { global $sb_instagram_posts_manager; $details = __( 'Error saving edited image.', 'instagram-feed' ) . ' ' . $full_file_name; $sb_instagram_posts_manager->add_error( 'image_editor', $details ); } else { $one_successful_image_resize = true; } } else { $message = __( 'Error editing image.', 'instagram-feed' ); if ( isset( $image_editor ) && isset( $image_editor->errors ) ) { foreach ( $image_editor->errors as $key => $item ) { $message .= ' ' . $key . ' - ' . $item[0] . ' |'; } if ( isset( $image_editor ) && isset( $image_editor->error_data ) ) { $message .= ' ' . sbi_json_encode( $image_editor->error_data ) . ' |'; } } global $sb_instagram_posts_manager; $sb_instagram_posts_manager->add_error( 'image_editor', $message ); } if ( ! empty( $temp_file ) ) { @unlink( $temp_file ); } } } if ( $one_successful_image_resize ) { $aspect_ratio = round( $sizes['width'] / $sizes['height'], 2 ); $this->update_sbi_instagram_posts( array( 'media_id' => $new_file_name, 'sizes' => maybe_serialize( $image_sizes_to_make ), 'aspect_ratio' => $aspect_ratio, 'images_done' => 1, 'mime_type' => $saved_image['mime-type'] ) ); $this->add_resized_image_to_obj_array( 'id', $new_file_name ); } else { // an error status means that image resizing won't be attempted again for this post $this->update_sbi_instagram_posts( array( 'media_id' => 'error', 'sizes' => maybe_serialize( $image_sizes_to_make ), 'aspect_ratio' => 1, 'images_done' => 1, ) ); } } } /** * Return relevant data for resized images for this post * * @return array * * @since 2.0/4.0 */ public function get_resized_image_array() { if ( empty( $this->resized_image_array ) ) { global $wpdb; $posts_table_name = $wpdb->prefix . SBI_INSTAGRAM_POSTS_TYPE; $stored = $wpdb->get_results( $wpdb->prepare( "SELECT media_id, aspect_ratio FROM $posts_table_name WHERE instagram_id = %s LIMIT 1", $this->instagram_post_id ), ARRAY_A ); if ( isset( $stored[0] ) ) { $return = array( 'id' => $stored[0]['media_id'], 'ratio' => $stored[0]['aspect_ratio'], ); $this->resized_image_array = $return; return $return; } else { return array(); } } else { return $this->resized_image_array; } } /** * Controls whether or not the database record will be updated for this post. * Called after images are successfully created. * * @param bool $update_last_requested * @param bool $transient_name * @param array $image_sizes * @param string $upload_dir * @param string $upload_url * @param bool $timestamp_for_update * * @return bool * * @since 2.0/4.0 */ public function update_db_data( $update_last_requested = true, $transient_name = false, $image_sizes = array(), $upload_dir = '', $upload_url = '', $timestamp_for_update = false ) { if ( empty( $this->db_id ) ) { return false; } $to_update = array( 'json_data' => $this->encryption->encrypt( sbi_json_encode( $this->instagram_api_data ) ), ); if ( $update_last_requested ) { $to_update['last_requested'] = date( 'Y-m-d H:i:s' ); } if ( $timestamp_for_update ) { $to_update['top_time_stamp'] = $timestamp_for_update; } if ( $transient_name ) { $this->maybe_add_feed_id( $transient_name ); } if ( $this->media_id === 'pending' ) { $this->resize_and_save_image( $image_sizes, $upload_dir, $upload_url ); } else { $this->update_sbi_instagram_posts( $to_update ); } return true; } /** * Updates columns that need to be updated in the posts types table. * Called after images successfully resized and if any information * needs to be updated. * * @param array $to_update assoc array of columns and values to update * * @since 2.0/4.0 */ public function update_sbi_instagram_posts( $to_update ) { global $wpdb; $table_name = $wpdb->prefix . SBI_INSTAGRAM_POSTS_TYPE; foreach ( $to_update as $column => $value ) { $query = $wpdb->query( $wpdb->prepare( "UPDATE $table_name SET $column = %s WHERE id = %d;", $value, $this->db_id ) ); if ( $query === false ) { global $sb_instagram_posts_manager; $error = $wpdb->last_error; $query = $wpdb->last_query; $sb_instagram_posts_manager->add_error( 'storage', __( 'Error updating post.', 'instagram-feed' ) . ' ' . $error . '
' . $query . '' ); } } } /** * Checks database for matching record for post and feed ID. * There shouldn't be duplicate records * * @param string $transient_name * * @return bool * * @since 2.0/4.1 */ public function exists_in_feeds_posts_table( $transient_name ) { global $wpdb; $table_name = $wpdb->prefix . SBI_INSTAGRAM_FEEDS_POSTS; $feed_id_array = explode( '#', $transient_name ); $feed_id = $feed_id_array[0]; $results = $wpdb->get_results( $wpdb->prepare( "SELECT feed_id FROM $table_name WHERE instagram_id = %s AND feed_id = %s LIMIT 1", $this->instagram_post_id, $feed_id ), ARRAY_A ); if ( isset( $results[0]['feed_id'] ) ) { return true; } if ( isset( $this->instagram_api_data['term'] ) ) { $results = $wpdb->get_results( $wpdb->prepare( "SELECT hashtag FROM $table_name WHERE instagram_id = %s AND hashtag = %s LIMIT 1", $this->instagram_post_id, strtolower( str_replace( '#', '', $this->instagram_api_data['term'] ) ) ), ARRAY_A ); return isset( $results[0]['hashtag'] ); } return false; } /** * Add a record of this post being used for the specified transient name (feed id) * * @param string $transient_name * * @return int * * @since 2.0/4.0 */ public function insert_sbi_instagram_feeds_posts( $transient_name ) { global $wpdb; $table_name = $wpdb->prefix . SBI_INSTAGRAM_FEEDS_POSTS; // the number is removed from the transient name for backwards compatibilty. $feed_id_array = explode( '#', $transient_name ); $feed_id = $feed_id_array[0]; if ( ! empty( $this->db_id ) ) { $entry_data = array( $this->db_id, "'" . esc_sql( $this->instagram_api_data['id'] ) . "'", "'" . esc_sql( $feed_id ) . "'", ); if ( ! empty( $this->instagram_api_data['term'] ) ) { $entry_data[] = "'" . esc_sql( strtolower( str_replace( '#', '', $this->instagram_api_data['term'] ) ) ) . "'"; $entry_string = implode( ',', $entry_data ); $error = $wpdb->query( "INSERT INTO $table_name (id,instagram_id,feed_id,hashtag) VALUES ($entry_string);" ); } else { $entry_string = implode( ',', $entry_data ); $error = $wpdb->query( "INSERT INTO $table_name (id,instagram_id,feed_id) VALUES ($entry_string);" ); } } else { global $sb_instagram_posts_manager; $sb_instagram_posts_manager->add_error( 'storage', __( 'Error inserting post.', 'instagram-feed' ) . ' ' . __( 'No database ID.', 'instagram-feed' ) ); return false; } if ( $error !== false ) { return $wpdb->insert_id; } else { global $sb_instagram_posts_manager; $error = $wpdb->last_error; $query = $wpdb->last_query; $sb_instagram_posts_manager->add_error( 'storage', __( 'Error inserting post.', 'instagram-feed' ) . ' ' . $error . '
' . $query . '' ); } } /** * Uses the saved json for the post to be used for updating records * * @param bool $all * * @return array * * @since 2.0/4.0 */ private function get_parsed_post_data( $all = true ) { $instagram_post_id = isset( $this->instagram_api_data['id'] ) ? $this->instagram_api_data['id'] : ''; $comments_count = isset( $this->instagram_api_data['comments_count'] ) ? $this->instagram_api_data['comments_count'] : ''; $like_count = isset( $this->instagram_api_data['like_count'] ) ? $this->instagram_api_data['like_count'] : ''; $parsed_data = array( 'comments_count' => $comments_count, 'like_count' => $like_count, ); if ( $all ) { $caption = isset( $this->instagram_api_data['caption'] ) ? $this->instagram_api_data['caption'] : ''; $media_url = isset( $this->instagram_api_data['media_url'] ) ? $this->instagram_api_data['media_url'] : ''; $media_type = isset( $this->instagram_api_data['media_type'] ) ? $this->instagram_api_data['media_type'] : ''; $timestamp = ''; if ( isset( $this->instagram_api_data['timestamp'] ) ) { $timestamp_parts = explode( ' ', $this->instagram_api_data['timestamp'] ); $timestamp = str_replace( 'T', ' ', $timestamp_parts[0] ); } $username = isset( $this->instagram_api_data['username'] ) ? $this->instagram_api_data['username'] : ''; $permalink = isset( $this->instagram_api_data['permalink'] ) ? $this->instagram_api_data['permalink'] : ''; $children = isset( $this->instagram_api_data['children'] ) ? sbi_json_encode( $this->instagram_api_data['children'] ) : ''; $parsed_data['caption'] = $caption; $parsed_data['media_url'] = $media_url; $parsed_data['id'] = $instagram_post_id; $parsed_data['media_type'] = $media_type; $parsed_data['timestamp'] = $timestamp; $parsed_data['username'] = $username; $parsed_data['permalink'] = $permalink; $parsed_data['children'] = $children; } return $parsed_data; } /** * If a record hasn't been made for this transient name/feed id, * make a record * * @param string $feed_id * * @since 2.0/4.0 */ private function maybe_add_feed_id( $feed_id ) { if ( empty( $this->instagram_post_id ) ) { return; } global $wpdb; $table_name = $wpdb->prefix . SBI_INSTAGRAM_FEEDS_POSTS; // the number is removed from the transient name for backwards compatibilty. $feed_id_array = explode( '#', $feed_id ); $feed_id = str_replace( '+', '', $feed_id_array[0] ); $feed_id_match = $wpdb->get_col( $wpdb->prepare( "SELECT feed_id FROM $table_name WHERE feed_id = %s AND instagram_id = %s", $feed_id, $this->instagram_post_id ) ); if ( ! isset( $feed_id_match[0] ) ) { $entry_data = array( $this->db_id, "'" . esc_sql( $this->instagram_post_id ) . "'", "'" . esc_sql( $feed_id ) . "'", ); $entry_string = implode( ',', $entry_data ); $error = $wpdb->query( "INSERT INTO $table_name (id,instagram_id,feed_id) VALUES ($entry_string);" ); } } } PKL\##0instagram-feed/inc/class-sb-instagram-oembed.phpnu[' . $exchanged . ''; } } return $html; } /** * Extend the "time to live" for oEmbeds created with access tokens that expire * * @param int $ttl time to live. * @param string $url oEmbed url. * @param string $attr additional attributes. * @param int $post_ID ID of the post that contains the oEmbed URL. * * @return float|int * * @since 2.5/5.8 */ public static function oembed_ttl($ttl, $url, $attr, $post_ID) { if (preg_match('#https?://(www\.)?instagr(\.am|am\.com)/(p|tv|reel)/.*#i', $url) === 1) { $ttl = 30 * YEAR_IN_SECONDS; } return $ttl; } /** * Depending on whether a business or personal account is connected, * a different oembed endpoint is used * * @return string * * @since 2.5/5.8 */ public static function oembed_url() { return 'https://graph.facebook.com/instagram_oembed'; } /** * Any access token will work for oembeds so the most recently connected account's * access token is returned * * @return bool|string * * @since 2.5/5.8 */ public static function last_access_token() { $oembed_token_settings = get_option('sbi_oembed_token', array()); $will_expire = self::oembed_access_token_will_expire(); if ( ! empty($oembed_token_settings['access_token']) && ( ! $will_expire || $will_expire > time() ) ) { return sbi_maybe_clean($oembed_token_settings['access_token']); } else { $if_database_settings = sbi_get_database_settings(); if (isset($if_database_settings['connected_accounts'])) { $connected_accounts = $if_database_settings['connected_accounts']; foreach ($connected_accounts as $connected_account) { if (empty($oembed_token_settings['access_token']) && isset($connected_account['type']) && $connected_account['type'] === 'business') { $oembed_token_settings['access_token'] = $connected_account['access_token']; } } } if (! empty($oembed_token_settings['access_token'])) { return sbi_maybe_clean($oembed_token_settings['access_token']); } if (class_exists('CFF_Oembed')) { $cff_oembed_token_settings = get_option('cff_oembed_token', array()); if (! empty($cff_oembed_token_settings['access_token'])) { return $cff_oembed_token_settings['access_token']; } } } return false; } /** * Access tokens created from FB accounts not connected to an * FB page expire after 60 days. * * @return bool|int */ public static function oembed_access_token_will_expire() { $oembed_token_settings = get_option('sbi_oembed_token', array()); $will_expire = false; if (isset($oembed_token_settings['expiration_date']) && (int) $oembed_token_settings['expiration_date'] > 0) { $will_expire = (int) $oembed_token_settings['expiration_date']; } return $will_expire; } /** * Loop through post meta data and if it's an oembed and has content * that looks like an Instagram oembed, delete it * * @param int $post_ID the ID of the post containing the oEmbed. * * @return int number of old oembed caches found * * @since 2.5/5.8 */ public static function delete_instagram_oembed_caches($post_ID) { $post_metas = get_post_meta($post_ID); if (empty($post_metas)) { return 0; } $total_found = 0; foreach ($post_metas as $post_meta_key => $post_meta_value) { if ('_oembed_' === substr($post_meta_key, 0, 8)) { if ( strpos($post_meta_value[0], 'class="instagram-media"') !== false && strpos($post_meta_value[0], 'sbi-embed-wrap') === false ) { ++$total_found; delete_post_meta($post_ID, $post_meta_key); if ('_oembed_time_' !== substr($post_meta_key, 0, 13)) { delete_post_meta($post_ID, str_replace('_oembed_', '_oembed_time_', $post_meta_key)); } } } } return $total_found; } /** * Used for clearing the oembed update check flag for all posts * * @since 2.5/5.8 */ public static function clear_checks() { global $wpdb; $table_name = esc_sql($wpdb->prefix . 'postmeta'); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared $wpdb->query( " DELETE FROM $table_name WHERE meta_key = '_sbi_oembed_done_checking';" ); $sbi_statuses = get_option('sbi_statuses', array()); $sbi_statuses['clear_old_oembed_checks'] = true; update_option('sbi_statuses', $sbi_statuses); } } /** * Start the oEmbed adaptation * * @return SB_Instagram_Oembed */ function sbiOembedInit() { return new SB_Instagram_Oembed(); } sbiOembedInit(); PKL\?2instagram-feed/inc/class-sb-instagram-post-set.phpnu[ array( 'full' => 640, 'low' => 320, 'thumb' => 150, ), 'business' => array( 'full' => 640, 'low' => 320, 'thumb' => 150, ), ), $upload_dir = null, $upload_url = null ) { $this->post_data = $post_data; $this->image_sizes = $image_sizes; if ( ! isset( $upload_dir ) || ! isset( $upload_url ) ) { $upload = wp_upload_dir(); $upload_dir = $upload['basedir']; $upload_dir = trailingslashit( $upload_dir ) . SBI_UPLOADS_NAME; $upload_url = trailingslashit( $upload['baseurl'] ) . SBI_UPLOADS_NAME; } $this->upload_dir = $upload_dir; $this->upload_url = $upload_url; $this->transient_name = $transient_name; $this->fill_in_timestamp = $fill_in_timestamp; } /** * @return array * * @since 2.0/4.0 */ public function get_post_data() { if ( is_array( $this->post_data ) ) { return $this->post_data; } else { return array(); } } /** * @return array * * @since 2.0/4.0 */ public function get_resized_image_data_for_set() { return $this->resized_image_data_for_set; } /** * Loop through set of posts and update or create resized images based on * whether or not they have been created and whether or not a record has been * saved for this feed id * * @since 2.0/4.0 */ public function maybe_save_update_and_resize_images_for_posts() { global $sb_instagram_posts_manager; $posts_iterated_through = 0; $number_resized = 0; $number_updated = 0; $resized_image_data_for_set = array(); $resizing_disabled = $sb_instagram_posts_manager->image_resizing_disabled( $this->transient_name ) || $sb_instagram_posts_manager->max_resizing_per_time_period_reached(); $is_top_post_feed = ( substr( $this->transient_name, 4, 1 ) === '+' ); foreach ( $this->post_data as $single_instagram_post_data ) { if ( isset( $single_instagram_post_data['id'] ) && $posts_iterated_through < 100 ) { $single_post = new SB_Instagram_Post( $single_instagram_post_data['id'] ); $single_post->set_instagram_api_data( $single_instagram_post_data ); $resized_image_data_for_set[ $single_instagram_post_data['id'] ] = array(); if ( $is_top_post_feed ) { if ( empty( $this->first_post_top_time_stamp ) ) { $this_post_top_time_stamp = $single_post->get_top_time_stamp(); if ( empty( $this_post_top_time_stamp ) ) { $this->first_post_top_time_stamp = $this->fill_in_timestamp; } else { $this->first_post_top_time_stamp = $single_post->get_top_time_stamp(); } } } if ( ! $resizing_disabled ) { if ( ( ! $single_post->exists_in_posts_table() || ! $single_post->images_done_resizing() ) && $number_resized < 30 ) { if ( $sb_instagram_posts_manager->max_total_records_reached() ) { $sb_instagram_posts_manager->delete_least_used_image(); } if ( ! $single_post->images_done_resizing() && $single_post->exists_in_posts_table() ) { $single_post->resize_and_save_image( $this->image_sizes, $this->upload_dir, $this->upload_url ); } else { if ( $is_top_post_feed ) { if ( $single_post->save_in_db( $this->transient_name, date( 'Y-m-d H:i:s', strtotime( $this->first_post_top_time_stamp ) - ( 120 * $posts_iterated_through ) - 1 ) ) ) { $single_post->resize_and_save_image( $this->image_sizes, $this->upload_dir, $this->upload_url ); } } else { if ( $single_post->save_in_db( $this->transient_name, date( 'Y-m-d H:i:s', strtotime( $this->fill_in_timestamp ) - ( 120 * $posts_iterated_through ) ) ) ) { $single_post->resize_and_save_image( $this->image_sizes, $this->upload_dir, $this->upload_url ); } } } $number_resized++; } else { if ( $is_top_post_feed ) { $single_post->update_db_data( true, $this->transient_name, $this->image_sizes, $this->upload_dir, $this->upload_url, date( 'Y-m-d H:i:s', strtotime( $this->first_post_top_time_stamp ) - ( 120 * $posts_iterated_through ) ) ); } else { $single_post->update_db_data( true, $this->transient_name, $this->image_sizes, $this->upload_dir, $this->upload_url ); } if ( ! $single_post->exists_in_feeds_posts_table( $this->transient_name ) ) { $single_post->insert_sbi_instagram_feeds_posts( $this->transient_name ); } $number_updated++; } $resized_image_data_for_set[ $single_instagram_post_data['id'] ] = $single_post->get_resized_image_array(); } } $posts_iterated_through++; } $this->resized_image_data_for_set = $resized_image_data_for_set; } } PKL\\h6instagram-feed/inc/class-sb-instagram-cron-updater.phpnu[ true ) ); $num = count( $cron_records ); if ( $num === \InstagramFeed\Builder\SBI_Db::RESULTS_PER_CRON_UPDATE ) { wp_schedule_single_event( time() + 120, 'sbi_cron_additional_batch' ); } self::update_batch( $cron_records ); } /** * @param $cron_records * * @since 6.0 */ public static function update_batch( $cron_records ) { $report = array( 'notes' => array( 'time_ran' => date( 'Y-m-d H:i:s' ), 'num_found_transients' => count( $cron_records ), ), ); $settings = sbi_get_database_settings(); foreach ( $cron_records as $feed_cache ) { $feed_id = $feed_cache['feed_id']; $report[ $feed_id ] = array(); $cache = new SB_Instagram_Cache( $feed_id ); $cache->retrieve_and_set(); $cache->update_last_updated(); $posts_cache = $cache->get( 'posts' ); if ( $posts_cache ) { $feed_data = json_decode( $posts_cache, true ); $atts = isset( $feed_data['atts'] ) ? $feed_data['atts'] : false; $last_retrieve = isset( $feed_data['last_retrieve'] ) ? (int) $feed_data['last_retrieve'] : 0; $last_requested = isset( $feed_data['last_requested'] ) ? (int) $feed_data['last_requested'] : false; $report[ $feed_id ]['last_retrieve'] = date( 'Y-m-d H:i:s', $last_retrieve ); if ( $atts !== false ) { // not needed after v6? if ( ! $last_requested || $last_requested > ( time() - 60 * 60 * 24 * 30 ) ) { $instagram_feed_settings = new SB_Instagram_Settings( $atts, $settings ); self::do_single_feed_cron_update( $instagram_feed_settings, $feed_data, $atts ); $report[ $feed_id ]['did_update'] = 'yes'; } else { $report[ $feed_id ]['did_update'] = 'no - not recently requested'; } } else { $report[ $feed_id ]['did_update'] = 'no - missing atts'; } } else { $report[ $feed_id ]['did_update'] = 'no - no post cache found'; } } update_option( 'sbi_cron_report', $report, false ); } /** * Update a single feed cache based on settings. Local image storing and * resizing is done in the background here as well unless this is the initial * time the feed is created and no cached data exists yet. * * Overwritten in the Pro version * * @param array $instagram_feed_settings associative array generated from * the sb_instagram_settings class * @param array $feed_data post, header, shortcode settings, and other info * associated with the feed that is saved in the cache * @param array $atts shortcode settings * @param bool $include_resize whether or not to resize images during the update since * images can also be resized with an ajax call when the feed is viewed on the frontend * * @return object * * @since 2.0/5.0 */ public static function do_single_feed_cron_update( $instagram_feed_settings, $feed_data, $atts, $include_resize = true ) { $instagram_feed_settings->set_feed_type_and_terms(); $instagram_feed_settings->set_transient_name(); $transient_name = $instagram_feed_settings->get_transient_name(); $settings = $instagram_feed_settings->get_settings(); $feed_type_and_terms = $instagram_feed_settings->get_feed_type_and_terms(); $instagram_feed = new SB_Instagram_Feed( $transient_name ); $instagram_feed->set_cache( $instagram_feed_settings->get_cache_time_in_seconds(), $settings ); while ( $instagram_feed->need_posts( $settings['num'] ) && $instagram_feed->can_get_more_posts() ) { $instagram_feed->add_remote_posts( $settings, $feed_type_and_terms, $instagram_feed_settings->get_connected_accounts_in_feed() ); } $to_cache = array( 'atts' => $atts, 'last_requested' => $feed_data['last_requested'], 'last_retrieve' => time() ); $instagram_feed->set_cron_cache( $to_cache, $instagram_feed_settings->get_cache_time_in_seconds(), $settings['backup_cache_enabled'] ); if ( $instagram_feed->need_header( $settings, $feed_type_and_terms ) ) { $instagram_feed->set_remote_header_data( $settings, $feed_type_and_terms, $instagram_feed_settings->get_connected_accounts_in_feed() ); $instagram_feed->cache_header_data( $instagram_feed_settings->get_cache_time_in_seconds(), $settings['backup_cache_enabled'] ); } if ( $include_resize ) { $post_data = $instagram_feed->get_post_data(); $post_data = array_slice( $post_data, 0, $settings['num'] ); $image_sizes = array( 'personal' => array( 'full' => 640, 'low' => 320, 'thumb' => 150 ), 'business' => array( 'full' => 640, 'low' => 320, 'thumb' => 150 ) ); $post_set = new SB_Instagram_Post_Set( $post_data, $transient_name, NULL, $image_sizes ); $post_set->maybe_save_update_and_resize_images_for_posts(); } sbi_delete_image_cache( $transient_name ); return $instagram_feed; } /** * Retrieve option name column values for all feed cache transients * * @return array * * @since 2.0/5.0 */ public static function get_feed_cache_option_names() { global $wpdb; $feed_caches = apply_filters( 'sbi_feed_cache_option_names', array() ); if ( ! empty( $feed_caches ) ) { return $feed_caches; } $results = $wpdb->get_results( " SELECT option_name FROM $wpdb->options WHERE `option_name` LIKE ('%\_transient\_sbi\_%') AND `option_name` NOT LIKE ('%\_transient\_sbi\_header%');", ARRAY_A ); if ( isset( $results[0] ) ) { $feed_caches = $results; } return $feed_caches; } /** * Start cron jobs based on user's settings for cron cache update frequency. * This is triggered when settings are saved on the "Configure" tab. * * @param string $sbi_cache_cron_interval arbitrary name from one of the * settings on the "Configure" tab * @param string $sbi_cache_cron_time hour of the day (1 = 1:00) * @param string $sbi_cache_cron_am_pm am or pm (time of day) * * @since 2.0/5.0 */ public static function start_cron_job( $sbi_cache_cron_interval, $sbi_cache_cron_time, $sbi_cache_cron_am_pm ) { wp_clear_scheduled_hook( 'sbi_feed_update' ); if ( $sbi_cache_cron_interval === '12hours' || $sbi_cache_cron_interval === '24hours' ) { $relative_time_now = time() + sbi_get_utc_offset(); $base_day = strtotime( date( 'Y-m-d', $relative_time_now ) ); $add_time = $sbi_cache_cron_am_pm === 'pm' ? (int)$sbi_cache_cron_time + 12 : (int)$sbi_cache_cron_time; $utc_start_time = $base_day + (($add_time * 60 * 60) - sbi_get_utc_offset()); if ( $utc_start_time < time() ) { if ( $sbi_cache_cron_interval === '12hours' ) { $utc_start_time += 60*60*12; } else { $utc_start_time += 60*60*24; } } if ( $sbi_cache_cron_interval === '12hours' ) { wp_schedule_event( $utc_start_time, 'twicedaily', 'sbi_feed_update' ); } else { wp_schedule_event( $utc_start_time, 'daily', 'sbi_feed_update' ); } } else { if ( $sbi_cache_cron_interval === '30mins' ) { wp_schedule_event( time(), 'sbi30mins', 'sbi_feed_update' ); } else { wp_schedule_event( time(), 'hourly', 'sbi_feed_update' ); } } } } PKL\쉃7instagram-feed/inc/class-sb-instagram-posts-manager.phpnu[sbi_options = get_option( 'sb_instagram_settings' ); $this->errors = get_option( 'sb_instagram_errors', array() ); if ( ! isset( $this->errors['connection'] ) ) { $this->errors = array( 'connection' => array(), 'hashtag' => array(), 'resizing' => array(), 'database_create' => array(), 'upload_dir' => array(), 'accounts' => array(), 'error_log' => array(), 'action_log' => array(), 'revoked' => array(), ); } $this->display_error = array(); if ( $this->does_resizing_tables_exist() ) { $this->resizing_tables_exist = true; } require_once( trailingslashit( dirname( __FILE__ ) ) . '/Platform_Data.php' ); $platform_data_manager = new \InstagramFeed\Platform_Data(); $platform_data_manager->register_hooks(); } /** * Stores information about an encountered error related to a connected account * * @param $connected_account array * @param $error_type string * @param $details mixed/array/string * * @since 2.7/5.10 */ public function add_connected_account_error( $connected_account, $error_type, $details ) { $account_id = $connected_account['user_id']; $this->errors['accounts'][ $account_id ][ $error_type ] = $details; if ( $error_type === 'api' ) { $this->errors['accounts'][ $account_id ][ $error_type ]['clear_time'] = time() + 60 * 3; } if ( isset( $details['error']['code'] ) && (int) $details['error']['code'] === 18 ) { $this->errors['accounts'][ $account_id ][ $error_type ]['clear_time'] = time() + 60 * 15; } \InstagramFeed\Builder\SBI_Source::add_error( $account_id, $details ); } /** * Stores errors so they can be retrieved and explained to users * in messages as well as temporarily disable certain features * * @param string $type * @param array $details * @param mixed/bool/array $connected_account_term * * @since 2.7/5.10 */ public function add_error( $type, $details, $connected_account_term = false ) { $connected_account = false; $log_item = date( 'm-d H:i:s' ) . ' - '; if ( $connected_account_term ) { if ( ! is_array( $connected_account_term ) ) { $connected_account = SB_Instagram_Connected_Account::lookup( $connected_account_term ); } else { $connected_account = $connected_account_term; } $this->add_connected_account_error( $connected_account, $type, $details ); } // is it connection? or what type? if ( $type === 'api' || $type === 'wp_remote_get' ) { $connection_details = array( 'error_id' => '', ); $connection_details['critical'] = false; if ( isset( $details['error']['code'] ) ) { $connection_details['error_id'] = $details['error']['code']; if ( $this->is_critical_error( $details ) ) { $connection_details['critical'] = true; } if ( $this->is_app_permission_related( $details ) ) { if ( ! in_array( $connected_account['user_id'], $this->errors['revoked'], true ) ) { $this->errors['revoked'][] = $connected_account['user_id']; } /** * Fires when an app permission related error is encountered * * @param array $connected_account The connected account that encountered the error * * @since 6.0.6 */ do_action( 'sbi_app_permission_revoked', $connected_account ); } } elseif ( isset( $details['response'] ) && is_wp_error( $details['response'] ) ) { foreach ( $details['response']->errors as $key => $item ) { $connection_details['error_id'] = $key; } $connection_details['critical'] = true; } if ( get_the_ID() !== 0 ) { $connection_details['post_id'] = get_the_ID(); } $connection_details['error_message'] = $this->generate_error_message( $details, $connected_account ); $log_item .= $connection_details['error_message']['admin_only']; $this->maybe_set_display_error( 'connection', $connection_details ); $this->errors['connection'] = $connection_details; } if ( $type === 'hashtag' ) { $hashtag_details = array( 'error_id' => '', 'hashtag' => isset( $details['hashtag'] ) ? $details['hashtag'] : '', ); if ( isset( $details['error']['code'] ) ) { if ( (int) $details['error']['code'] === 24 ) { $hashtag_details['clear_time'] = time() + 60 * 5; } } if ( isset( $details['error']['code'] ) ) { $hashtag_details['error_id'] = $details['error']['code']; } elseif ( isset( $details['response'] ) && is_wp_error( $details['response'] ) ) { foreach ( $details['response']->errors as $key => $item ) { $hashtag_details['error_id'] = $key; } } if ( get_the_ID() !== 0 ) { $hashtag_details['post_id'] = get_the_ID(); } $hashtag_details['error_message'] = $this->generate_error_message( $details, $connected_account ); $log_item .= $hashtag_details['error_message']['admin_only']; $this->maybe_set_display_error( 'hashtag', $hashtag_details ); $found = false; if ( isset( $details['hashtag'] ) ) { foreach ( $this->errors['hashtag'] as $hashtag_error_item ) { if ( isset( $hashtag_error_item['hashtag'] ) && strtolower( $hashtag_error_item['hashtag'] ) === strtolower( $details['hashtag'] ) && $hashtag_error_item['error_id'] === $details['error_id'] ) { $found = true; } } } if ( ! $found ) { $this->errors['hashtag'][] = $hashtag_details; } } if ( $type === 'image_editor' || $type === 'storage' ) { $this->errors['resizing'] = $details; $log_item .= $details; } if ( $type === 'database_create' ) { $this->errors['database_create'] = $details; $log_item .= $details; } if ( $type === 'upload_dir' ) { $this->errors['upload_dir'] = $details; $log_item .= $details; } if ( $type === 'unused_feed' ) { $this->errors['unused_feed'] = $details; $log_item .= $details; } if ( $type === 'platform_data_deleted' ) { $this->errors['platform_data_deleted'] = $details; $log_item .= $details; } $current_log = $this->errors['error_log']; if ( is_array( $current_log ) && count( $current_log ) >= 10 ) { reset( $current_log ); unset( $current_log[ key( $current_log ) ] ); } $current_log[] = $log_item; $this->errors['error_log'] = $current_log; update_option( 'sb_instagram_errors', $this->errors, false ); } /** * Stores a time stamped string of information about * actions that might lead to correcting an error * * @param string $log_item * * @since 2.7/5.10 */ public function add_action_log( $log_item ) { $current_log = $this->errors['action_log']; if ( is_array( $current_log ) && count( $current_log ) >= 10 ) { reset( $current_log ); unset( $current_log[ key( $current_log ) ] ); } $current_log[] = date( 'm-d H:i:s' ) . ' - ' . $log_item; $this->errors['action_log'] = $current_log; update_option( 'sb_instagram_errors', $this->errors, false ); } /** * @return mixed * * @since 2.7/5.10 */ public function get_error_log() { return $this->errors['error_log']; } /** * @return mixed * * @since 2.7/5.10 */ public function get_action_log() { return $this->errors['action_log']; } /** * Certain API errors are considered critical and will trigger * the various notifications to users to correct them. * * @param $details * * @return bool * * @since 2.7/5.10 */ public function is_critical_error( $details ) { $error_code = (int) $details['error']['code']; $critical_codes = array( 803, // ID doesn't exist 100, // access token or permissions 190, // access token or permissions 10, // app permissions or scopes ); return in_array( $error_code, $critical_codes, true ); } /** * Should clear platform data * * @param $details * * @return bool * * @since 2.7/5.10 */ public function is_app_permission_related( $details ) { $error_code = (int) $details['error']['code']; $error_subcode = isset( $details['error']['error_subcode'] ) ? (int) $details['error']['error_subcode'] : 0; $critical_codes = array( 190, // access token or permissions ); $critical_subcodes = array( 458, // access token or permissions ); if ( in_array( $error_code, $critical_codes, true ) ) { if ( strpos( $details['error']['message'], 'user has not authorized application' ) !== false ) { return true; } return in_array( $error_subcode, $critical_subcodes, true ); } return false; } /** * Creates an array of information for easy display of API errors * * @param $response * @param array $connected_account * * @return array * * @since 2.7/5.10 */ public function generate_error_message( $response, $connected_account = array( 'username' => '' ) ) { $error_message_return = array( 'error_message' => '', 'admin_only' => '', 'frontend_directions' => '', 'backend_directions' => '', 'time' => time(), ); $hash = isset( $response['error']['code'] ) ? '#' . (int) $response['error']['code'] : ''; if ( isset( $response['response'] ) && is_wp_error( $response['response'] ) ) { $error_message_return['error_message'] = __( 'HTTP Error. Unable to connect to the Instagram API.', 'instagram-feed' ) . ' ' . __( 'Feed will not update.', 'instagram-feed' ); $error_message_return['admin_only'] = sprintf( __( 'Error connecting to %s.', 'instagram-feed' ), $response['url'] ); $error_message_return['frontend_directions'] = '' . __( 'Directions on how to resolve this issue', 'instagram-feed' ) . ''; if ( isset( $response['response'] ) && isset( $response['response']->errors ) ) { $num = count( $response['response']->errors ); $i = 1; foreach ( $response['response']->errors as $key => $item ) { $error_message_return['admin_only'] .= ' ' . $key . ' - ' . $item[0]; if ( $i < $num ) { $error_message_return['admin_only'] .= ','; } $num++; } } return $error_message_return; } $hash = '#' . (int) $response['error']['code']; $link = admin_url( 'admin.php?page=sbi-settings' ); if ( isset( $response['error']['message'] ) ) { if ( (int) $response['error']['code'] === 100 ) { $error_message_return['error_message'] = __( 'Error: Access Token is not valid or has expired.', 'instagram-feed' ) . ' ' . __( 'Feed will not update.', 'instagram-feed' ); $error_message_return['admin_only'] = sprintf( __( 'API error %s:', 'instagram-feed' ), $response['error']['code'] ) . ' ' . $response['error']['message']; $error_message_return['frontend_directions'] = '' . __( 'Directions on how to resolve this issue', 'instagram-feed' ) . ''; } elseif ( (int) $response['error']['code'] === 18 ) { $error_message_return['error_message'] = __( 'Error: Hashtag limit of 30 unique hashtags per week has been reached.', 'instagram-feed' ); $error_message_return['admin_only'] = __( 'If you need to display more than 30 hashtag feeds on your site, consider connecting an additional business account from a separate Instagram Identity and Facebook page. Connecting an additional Instagram business account from the same Facebook page will not raise the limit.', 'instagram-feed' ); $error_message_return['frontend_directions'] = '' . __( 'Directions on how to resolve this issue', 'instagram-feed' ) . ''; } elseif ( (int) $response['error']['code'] === 10 ) { $error_message_return['error_message'] = sprintf( __( 'Error: Connected account for the user %s does not have permission to use this feed type.', 'instagram-feed' ), $connected_account['username'] ); $error_message_return['admin_only'] = __( 'Try using the big blue button on the "Configure" tab to reconnect the account and update its permissions.', 'instagram-feed' ); $error_message_return['frontend_directions'] = '' . __( 'Directions on how to resolve this issue', 'instagram-feed' ) . ''; } elseif ( (int) $response['error']['code'] === 24 ) { $error_message_return['error_message'] = __( 'Error: Cannot retrieve posts for this hashtag.', 'instagram-feed' ); $error_message_return['admin_only'] = $response['error']['error_user_msg']; $error_message_return['frontend_directions'] = '' . __( 'Directions on how to resolve this issue', 'instagram-feed' ) . ''; } else { $error_message_return['error_message'] = __( 'There has been a problem with your Instagram Feed.', 'instagram-feed' ); $error_message_return['admin_only'] = sprintf( __( 'API error %s:', 'instagram-feed' ), $response['error']['code'] ) . ' ' . $response['error']['message']; $error_message_return['frontend_directions'] = '' . __( 'Directions on how to resolve this issue', 'instagram-feed' ) . ''; } } else { $error_message_return['error_message'] = __( 'An unknown error has occurred.', 'instagram-feed' ); $error_message_return['admin_only'] = json_encode( $response ); } return $error_message_return; } /** * Display errors are saved with the feed cache so they will still be displayed * on the frontend * * @param string $type * @param array $error * * @since 2.7/5.10 */ public function maybe_set_display_error( $type, $error ) { if ( $type === 'connection' ) { if ( empty( $this->display_error['connection'] ) ) { $this->display_error['connection'] = $error; } } elseif ( $type === 'configuration' ) { if ( empty( $this->display_error['configuration'] ) ) { $this->display_error['configuration'] = $error; } } elseif ( $type === 'hashtag' ) { $this->display_error['hashtag'][] = $error; } elseif ( $type === 'hashtag_limit' ) { if ( empty( $this->display_error['connection'] ) ) { $this->display_error['hashtag_limit'] = $error; } } } /** * @param string $type * * @since 2.7/5.10 */ public function maybe_remove_display_error( $type ) { if ( isset( $this->display_error[ $type ] ) ) { unset( $this->display_error[ $type ] ); } } /** * The plugin has a limit on how many post records can be stored and * images resized to avoid overloading servers. This function deletes the post that * has the longest time passed since it was retrieved. * * @since 2.0/4.0 */ public function delete_least_used_image() { global $wpdb; $table_name = $wpdb->prefix . SBI_INSTAGRAM_POSTS_TYPE; $feeds_posts_table_name = esc_sql( $wpdb->prefix . SBI_INSTAGRAM_FEEDS_POSTS ); $max = isset( $this->limit ) && $this->limit > 1 ? $this->limit : 1; $oldest_posts = $wpdb->get_results( "SELECT id, media_id, mime_type FROM $table_name ORDER BY last_requested ASC LIMIT $max", ARRAY_A ); $upload = wp_upload_dir(); $file_suffixes = array( 'thumb', 'low', 'full' ); foreach ( $oldest_posts as $post ) { $extension = isset( $post['mime_type'] ) && $post['mime_type'] === 'image/webp' ? '.webp' : '.jpg'; foreach ( $file_suffixes as $file_suffix ) { $file_name = trailingslashit( $upload['basedir'] ) . trailingslashit( SBI_UPLOADS_NAME ) . $post['media_id'] . $file_suffix . $extension; if ( is_file( $file_name ) ) { unlink( $file_name ); } } $wpdb->query( $wpdb->prepare( "DELETE FROM $table_name WHERE id = %d", $post['id'] ) ); $wpdb->query( $wpdb->prepare( "DELETE FROM $feeds_posts_table_name WHERE record_id = %d", $post['id'] ) ); } } /** * Calculates how many records are in the database and whether or not it exceeds the limit * * @return bool * * @since 2.0/4.0 */ public function max_total_records_reached() { global $wpdb; $table_name = $wpdb->prefix . SBI_INSTAGRAM_POSTS_TYPE; $num_records = $wpdb->get_var( "SELECT COUNT(*) FROM $table_name" ); if ( ! isset( $this->limit ) && (int) $num_records > SBI_MAX_RECORDS ) { $this->limit = (int) $num_records - SBI_MAX_RECORDS; } return ( (int) $num_records > SBI_MAX_RECORDS ); } /** * The plugin caps how many new images are created in a 15 minute window to * avoid overloading servers * * @return bool * * @since 2.0/4.0 */ public function max_resizing_per_time_period_reached() { global $wpdb; $table_name = $wpdb->prefix . SBI_INSTAGRAM_POSTS_TYPE; $fifteen_minutes_ago = date( 'Y-m-d H:i:s', time() - 15 * 60 ); $num_new_records = $wpdb->get_var( "SELECT COUNT(*) FROM $table_name WHERE created_on > '$fifteen_minutes_ago'" ); return ( (int) $num_new_records > 100 ); } /** * @return bool * * @since 2.0/4.0 */ public function image_resizing_disabled( $data = false ) { $options = sbi_get_database_settings(); $disable_resizing = isset( $options['sb_instagram_disable_resize'] ) ? $options['sb_instagram_disable_resize'] === 'on' || $options['sb_instagram_disable_resize'] === true : false; $disable_resizing = apply_filters( 'sbi_image_resizing_disabled', $disable_resizing, $data ); if ( ! $disable_resizing ) { $disable_resizing = isset( $this->resizing_tables_exist ) ? ! $this->resizing_tables_exist : ! $this->does_resizing_tables_exist(); } return $disable_resizing; } /** * Used to skip image resizing if the tables were never successfully * created * * @return bool * * @since 2.0/5.0 */ public function does_resizing_tables_exist() { global $wpdb; $table_name = esc_sql( $wpdb->prefix . SBI_INSTAGRAM_FEEDS_POSTS ); $resizing_key = 'sbi_resizing_exists'; $sbi_resizing_cache = wp_cache_get( $resizing_key ); if ( false === $sbi_resizing_cache ) { if ( $wpdb->get_var( "show tables like '$table_name'" ) == $table_name ) { wp_cache_set( $resizing_key, true ); } else { wp_cache_set( $resizing_key, false ); } } return $sbi_resizing_cache; } /** * Resets the custom tables and deletes all image files * * @since 2.0/4.0 */ public function delete_all_sbi_instagram_posts() { $upload = wp_upload_dir(); global $wpdb; $posts_table_name = $wpdb->prefix . SBI_INSTAGRAM_POSTS_TYPE; $image_files = glob( trailingslashit( $upload['basedir'] ) . trailingslashit( SBI_UPLOADS_NAME ) . '*' ); // get all file names foreach ( $image_files as $file ) { // iterate files if ( is_file( $file ) ) { unlink( $file ); } } $connected_accounts = SB_Instagram_Connected_Account::get_all_connected_accounts(); foreach ( $connected_accounts as $account_id => $data ) { if ( isset( $data['local_avatar'] ) ) { unset( $connected_accounts[ $account_id ]['local_avatar'] ); } } $options = sbi_get_database_settings(); $options['connected_accounts'] = $connected_accounts; update_option( 'sb_instagram_settings', $options ); //Delete tables $wpdb->query( "DROP TABLE IF EXISTS $posts_table_name" ); $feeds_posts_table_name = esc_sql( $wpdb->prefix . SBI_INSTAGRAM_FEEDS_POSTS ); $wpdb->query( "DROP TABLE IF EXISTS $feeds_posts_table_name" ); $table_name = $wpdb->prefix . 'options'; $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%\_transient\_\$sbi\_%') " ); $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%\_transient\_timeout\_\$sbi\_%') " ); delete_option( 'sbi_hashtag_ids' ); delete_option( 'sbi_local_avatars' ); delete_option( 'sbi_local_avatars_info' ); $upload = wp_upload_dir(); $upload_dir = $upload['basedir']; $upload_dir = trailingslashit( $upload_dir ) . SBI_UPLOADS_NAME; global $sbi_notices; if ( ! file_exists( $upload_dir ) ) { $created = wp_mkdir_p( $upload_dir ); if ( $created ) { $this->remove_error( 'upload_dir' ); $sbi_notices->remove_notice( 'upload_dir' ); } else { $this->add_error( 'upload_dir', __( 'There was an error creating the folder for storing resized images.', 'instagram-feed' ) . ' ' . $upload_dir ); } } else { $this->remove_error( 'upload_dir' ); $sbi_notices->remove_notice( 'upload_dir' ); } sbi_create_database_table(); } /** * Whether or not the one time request to the "top posts" endpoint for the hashtag * was made * * @param string $hashtag * * @return bool */ public static function top_post_request_already_made( $hashtag ) { $list_of_top_hashtags = get_option( 'sbi_top_api_calls', array() ); return in_array( $hashtag, $list_of_top_hashtags, true ); } /** * @param $hashtag */ public static function maybe_update_list_of_top_hashtags( $hashtag ) { $list_of_top_hashtags = get_option( 'sbi_top_api_calls', array() ); if ( ! in_array( $hashtag, $list_of_top_hashtags, true ) ) { $list_of_top_hashtags[] = $hashtag; update_option( 'sbi_top_api_calls', $list_of_top_hashtags ); } } /** * @return array * * @since 2.0/4.0 */ public function get_errors() { return $this->errors; } /** * @param string $type * @param mixed/array/bool $connected_account * * @since 2.0/4.0 */ public function remove_error( $type, $connected_account = false ) { $update = false; if ( ! empty( $this->errors[ $type ] ) ) { $this->errors[ $type ] = array(); $this->add_action_log( 'Cleared ' . $type . ' error.' ); $update = true; } if ( ! empty( $connected_account ) ) { if ( $this->remove_connected_account_error( $connected_account, $type, false ) ) { $this->add_action_log( 'Cleared connected account error ' . $connected_account['username'] . '.' ); } if ( $type === 'connection' ) { if ( $this->remove_connected_account_error( $connected_account, 'api', false ) ) { $this->add_action_log( 'Cleared connected account error ' . $connected_account['username'] . '.' ); } } if ( ! empty( $this->errors['revoked'] ) ) { if ( ( $key = array_search( $connected_account['user_id'], $this->errors['revoked'] ) ) !== false ) { unset( $this->errors['revoked'][ $key ] ); } } $update = true; } if ( $update ) { update_option( 'sb_instagram_errors', $this->errors, false ); } } /** * @param array $clearing_account * @param string $clearing_error_type * @param bool $update * * @return bool * * @since 2.7/5.10 */ public function remove_connected_account_error( $clearing_account, $clearing_error_type = 'all', $update = true ) { $cleared = false; if ( isset( $this->errors['accounts'] ) ) { if ( ! isset( $clearing_account['user_id'] ) ) { return $cleared; } $clearing_account_id = $clearing_account['user_id']; foreach ( $this->errors['accounts'] as $account_id => $error_types ) { if ( ! SB_Instagram_Connected_Account::lookup( $account_id ) ) { unset( $this->errors['accounts'][ $account_id ] ); } else { foreach ( $error_types as $error_type => $details ) { if ( (string) $account_id === (string) $clearing_account_id ) { if ( $error_type === $clearing_error_type || $clearing_error_type === 'all' ) { unset( $this->errors['accounts'][ $account_id ][ $error_type ] ); $cleared = true; } } else { if ( isset( $details['username'] ) ) { if ( $details['username'] === $clearing_account['username'] ) { if ( $error_type === $clearing_error_type || $clearing_error_type === 'all' ) { unset( $this->errors['accounts'][ $account_id ][ $error_type ] ); $cleared = true; } } } if ( isset( $this->errors['accounts'][ $account_id ] ) && isset( $details['access_token'] ) ) { if ( $details['access_token'] === $clearing_account['access_token'] ) { if ( $error_type === $clearing_error_type || $clearing_error_type === 'all' ) { unset( $this->errors['accounts'][ $account_id ][ $error_type ] ); $cleared = true; } } } } } if ( empty( $this->errors['accounts'][ $account_id ] ) ) { unset( $this->errors['accounts'][ $account_id ] ); } } } if ( $update ) { update_option( 'sb_instagram_errors', $this->errors, false ); } } return $cleared; } /** * * @since 2.7/5.10 */ public function remove_all_errors() { delete_option( 'sb_instagram_errors' ); sb_instagram_cron_clear_cache(); } /** * When an account is used to make a successful connection * * @since 2.7/5.10 */ public function reset_api_errors() { $this->errors['connection'] = array(); $this->errors['accounts'] = array(); update_option( 'sb_instagram_errors', $this->errors, false ); sb_instagram_cron_clear_cache(); global $sbi_notices; $sbi_notices->remove_notice( 'critical_error' ); } /** * @deprecated */ public function update_error_page( $id ) { if ( $id !== 0 ) { update_option( 'sb_instagram_error_page', $id, false ); } } /** * @return bool * * @since 2.7/5.10 */ public function get_error_page() { if ( isset( $this->errors['connection']['post_id'] ) ) { return $this->errors['connection']['post_id']; } return false; } /** * @return array * * @since 2.0/5.0 */ public function get_frontend_errors( $instagram_feed = false ) { if ( $instagram_feed ) { $cached_errors = $instagram_feed->get_cached_feed_error(); if ( ! empty( $cached_errors ) ) { return $cached_errors; } } $error_messages = array(); if ( ! empty( $this->display_error['connection']['error_message'] ) ) { $error_messages[] = $this->display_error['connection']['error_message']; } if ( ! empty( $this->display_error['configuration'] ) ) { $error_messages[] = $this->display_error['configuration']; } if ( ! empty( $this->display_error['hashtag'][0] ) ) { $error_24 = array(); $error_24_message = array(); foreach ( $this->display_error['hashtag'] as $hashtag_error ) { if ( $hashtag_error['error_id'] === 24 ) { if ( ! in_array( $hashtag_error['hashtag'], $error_24, true ) ) { $error_24[] = $hashtag_error['hashtag']; } if ( empty( $error_24_message ) ) { $error_24_message = $hashtag_error['error_message']; $error_24_message['admin_only'] = str_replace( $hashtag_error['hashtag'], '###', $error_24_message['admin_only'] ); } } else { $error_messages[] = $hashtag_error['error_message']; } } if ( ! empty( $error_24_message ) ) { $hashtag_string = count( $error_24 ) > 1 ? implode( '", "', $error_24 ) : $error_24[0]; $error_24_message['admin_only'] = str_replace( '###', $hashtag_string, $error_24_message['admin_only'] ); $error_messages[] = $error_24_message; } } if ( ! empty( $this->display_error['hashtag_limit'] ) ) { $response = array( 'error' => $this->display_error['hashtag_limit']['error'], ); $error_messages[] = $this->generate_error_message( $response ); } return $error_messages; } /** * @param $account * * @return bool * * @since 2.7/5.10 */ public function account_over_hashtag_limit( $account ) { if ( ! isset( $this->errors['accounts'][ $account['user_id'] ] ) ) { return false; } if ( isset( $this->errors['accounts'][ $account['user_id'] ]['hashtag_limit'] ) ) { if ( $this->errors['accounts'][ $account['user_id'] ]['hashtag_limit']['clear_time'] < time() ) { $this->remove_connected_account_error( $account, 'hashtag_limit', true ); return false; } else { $this->maybe_set_display_error( 'hashtag_limit', $this->errors['accounts'][ $account['user_id'] ]['hashtag_limit'] ); return true; } } return false; } /** * @param $connected_account * * @return bool * * @since 2.7/5.10 */ public function connected_account_has_error( $connected_account ) { if ( ! isset( $connected_account['user_id'] ) ) { return false; } if ( empty( $this->errors['accounts'] ) ) { return false; } $account_id = $connected_account['user_id']; if ( ! empty( $this->errors['accounts'][ $account_id ] ) ) { foreach ( $this->errors['accounts'][ $account_id ] as $error_key => $error_info ) { if ( strpos( $error_key, 'hashtag' ) === false ) { if ( $this->is_critical_error( $error_info ) ) { return true; } } } } return false; } /** * Whether or not the hashtag is unvailable in the API for some reason * * @param $hashtag * * @return bool * * @since 2.7/5.10 */ public function hashtag_has_error( $hashtag ) { if ( ! isset( $this->errors['hashtag'][0] ) ) { return false; } $to_save = array(); $changed = false; $return = false; foreach ( $this->errors['hashtag'] as $hashtag_error ) { if ( ! empty( $hashtag_error['hashtag'] ) && strtolower( $hashtag_error['hashtag'] ) === strtolower( $hashtag ) ) { if ( ! empty( $hashtag_error['clear_time'] ) ) { if ( $hashtag_error['clear_time'] < time() ) { $changed = true; $return = false; // clear the error, return false } else { $to_save[] = $hashtag_error; $this->maybe_set_display_error( 'hashtag', $hashtag_error ); $return = true; } } } else { if ( ! empty( $hashtag_error['clear_time'] ) ) { if ( $hashtag_error['clear_time'] < time() ) { $changed = true; } else { $to_save[] = $hashtag_error; } } else { $to_save[] = $hashtag_error; } } } if ( $changed ) { $this->errors['hashtag'] = $to_save; update_option( 'sb_instagram_errors', $this->errors, false ); } return $return; } /** * Only some errors should cause the user to be notified using email and site health * * @return string */ public function get_critical_errors() { if ( ! $this->are_critical_errors() ) { return ''; } $accounts_revoked_string = ''; $accounts_revoked = ''; if ( $this->was_app_permission_related_error() ) { $accounts_revoked = $this->get_app_permission_related_error_ids(); if ( count( $accounts_revoked ) > 1 ) { $accounts_revoked = implode( ', ', $accounts_revoked ); } else { $accounts_revoked = $accounts_revoked[0]; } $accounts_revoked_string = sprintf( __( 'Instagram Feed related data for the account(s) %s was removed due to permission for the Smash Balloon App on Facebook or Instagram being revoked.

To prevent the automated data deletion for the account, please reconnect your account within 7 days.', 'instagram-feed' ), $accounts_revoked ); } if ( isset( $this->errors['connection']['critical'] ) ) { $errors = $this->get_errors(); $error_message = ''; if ( $errors['connection']['error_id'] === 190 ) { $error_message .= '' . __( 'Action Required Within 7 Days', 'instagram-feed' ) . '
'; $error_message .= __( 'An account admin has deauthorized the Smash Balloon app used to power the Instagram Feed plugin.', 'instagram-feed' ); $error_message .= ' ' . sprintf( __( 'If the Instagram source is not reconnected within 7 days then all Instagram data will be automatically deleted on your website for this account (ID: %s) due to Facebook data privacy rules.', 'instagram-feed' ), $accounts_revoked ); $error_message .= __( '

To prevent the automated data deletion for the source, please reconnect your source within 7 days.', 'instagram-feed' ); $error_message .= '

' . __( 'More Information', 'instagram-feed' ) . ''; } else { $error_message_array = $errors['connection']['error_message']; $error_message .= '' . $error_message_array['error_message'] . '
'; $error_message .= $error_message_array['admin_only'] . '

'; if ( ! empty( $accounts_revoked_string ) ) { $error_message .= $accounts_revoked_string . '

'; } if ( ! empty( $error_message_array['backend_directions'] ) ) { $error_message .= $error_message_array['backend_directions']; } else { $retry = ''; if ( is_admin() ) { $retry = ''; } $hash = isset( $errors['connection']['error_id'] ) ? '#' . (int) $errors['connection']['error_id'] : ''; $error_message .= ''; } } } else { $connected_accounts = SB_Instagram_Connected_Account::get_all_connected_accounts(); foreach ( $connected_accounts as $connected_account ) { if ( isset( $connected_account['private'] ) && sbi_private_account_near_expiration( $connected_account ) ) { $link_1 = ''; $link_2 = ''; $error_message_array = array( 'error_message' => __( 'Error: Private Instagram Account.', 'instagram-feed' ), 'admin_only' => sprintf( __( 'It looks like your Instagram account is private. Instagram requires private accounts to be reauthenticated every 60 days. Refresh your account to allow it to continue updating, or %1$smake your Instagram account public%2$s.', 'instagram-feed' ), $link_1, $link_2 ), 'frontend_directions' => '' . __( 'Click here to troubleshoot', 'instagram-feed' ) . '', 'backend_directions' => '', ); } if ( isset( $this->errors['accounts'][ $connected_account['user_id'] ]['api'] ) ) { if ( isset( $this->errors['accounts'][ $connected_account['user_id'] ]['api']['error'] ) ) { if ( $this->is_critical_error( $this->errors['accounts'][ $connected_account['user_id'] ]['api'] ) ) { $error_message_array = $this->generate_error_message( $this->errors['accounts'][ $connected_account['user_id'] ]['api'], $connected_account ); } } } if ( ! isset( $error_message ) && isset( $error_message_array ) ) { $error_message = $error_message_array['admin_only'] . '

'; if ( ! empty( $error_message_array['backend_directions'] ) ) { $error_message .= $error_message_array['backend_directions']; } else { $retry = ''; if ( is_admin() ) { $retry = ''; } $error_message .= '

' . __( 'Directions on how to resolve this issue', 'instagram-feed' ) . '' . $retry. '

'; } } } } if ( isset( $error_message ) ) { $error_message = str_replace( 'Please read the Graph API documentation at https://developers.facebook.com/docs/graph-api', '', $error_message ); } else { $error_message = ''; } // remove link to FB docs return $error_message; } /** * @since 2.0/5.0 */ public function reset_frontend_errors() { $this->display_error = array(); } /** * Remove all API request delays, triggered after saving settings * * @since 2.7/5.10 */ public function clear_api_request_delays() { if ( empty( $this->errors['accounts'] ) && empty( $this->errors['hashtag'] ) ) { return; } $changed = false; foreach ( $this->errors['accounts'] as $account_id => $account_error ) { if ( ! empty( $account_error['api']['clear_time'] ) ) { $this->errors['accounts'][ $account_id ]['api']['clear_time'] = 0; } $changed = true; } foreach ( $this->errors['hashtag'] as $key => $hashtag_error ) { if ( ! empty( $hashtag_error['hashtag'] ) ) { if ( ! empty( $hashtag_error['clear_time'] ) ) { $this->errors['hashtag'][ $key ]['clear_time'] = 0; $changed = true; } } } if ( $changed ) { update_option( 'sb_instagram_errors', $this->errors, false ); } } /** * @since 2.0/5.1.2 */ public function are_current_api_request_delays( $connected_account ) { if ( empty( $this->errors['accounts'] ) ) { return false; } $account_id = $connected_account['user_id']; $is_delay = false; if ( isset( $this->errors['accounts'][ $account_id ]['api'] ) ) { if ( ! empty( $this->errors['accounts'][ $account_id ]['api']['clear_time'] ) ) { if ( $this->errors['accounts'][ $account_id ]['api']['clear_time'] < time() ) { $is_delay = false; return apply_filters( 'sbi_is_api_delay', $is_delay ); } else { $is_delay = true; return apply_filters( 'sbi_is_api_delay', $is_delay ); } } } return apply_filters( 'sbi_is_api_delay', $is_delay ); } /** * Whether or not there is at least one critical error * * @return bool */ public function are_critical_errors() { if ( isset( $this->errors['connection']['critical'] ) ) { return true; } else { $connected_accounts = SB_Instagram_Connected_Account::get_all_connected_accounts(); foreach ( $connected_accounts as $connected_account ) { if ( isset( $connected_account['private'] ) && sbi_private_account_near_expiration( $connected_account ) ) { return true; } $user_id = ! empty( $connected_account['user_id'] ) ? $connected_account['user_id'] : 0; $user_id = empty( $user_id ) && ! empty( $connected_account['account_id'] ) ? $connected_account['account_id'] : 0; if ( isset( $this->errors['accounts'][ $user_id ]['api'] ) ) { if ( isset( $this->errors['accounts'][ $user_id ]['api']['error'] ) ) { return $this->is_critical_error( $this->errors['accounts'][ $user_id ]['api'] ); } } } } return false; } /** * Whether or not there was a platform data clearing error * * @return bool */ public function was_app_permission_related_error() { return ! empty( $this->errors['revoked'] ); } public function get_app_permission_related_error_ids() { return $this->errors['revoked']; } /** * Delete any data associated with the Instagram API and the * connected account being deleted. * * @param $to_delete_connected_account */ public function delete_platform_data( $to_delete_connected_account ) { $are_other_business_accounts = false; $all_connected_accounts = SB_Instagram_Connected_Account::get_all_connected_accounts(); $to_update = array(); foreach ( $all_connected_accounts as $connected_account ) { if ( (int) $connected_account['user_id'] !== (int) $to_delete_connected_account['user_id'] ) { $to_update[ $connected_account['user_id'] ] = $connected_account; if ( isset( $connected_account['type'] ) && $connected_account['type'] === 'business' ) { $are_other_business_accounts = true; } } } SB_Instagram_Connected_Account::update_connected_accounts( $to_update ); \InstagramFeed\Builder\SBI_Db::delete_source_by_account_id( $to_delete_connected_account['user_id'] ); $manager = new SB_Instagram_Data_Manager(); $manager->delete_caches(); $manager->delete_comments_data(); if ( empty( $to_update ) || ! $are_other_business_accounts ) { $manager->delete_hashtag_data(); } else { $manager->delete_non_hashtag_sbi_instagram_posts( $to_delete_connected_account['username'] ); } } } PKL\NJ zz#instagram-feed/inc/if-functions.phpnu[get_settings();; if ( empty( $early_settings ) && ! sbi_doing_customizer( $atts ) ) { $style = current_user_can( 'manage_instagram_feed_options' ) ? ' style="display: block;"' : ''; $id = isset( $atts['feed'] ) ? (int)$atts['feed'] : false; if ( $id ) { $message = sprintf( __( 'Error: No feed with the ID %s found.', 'instagram-feed' ), $id ); } else { $message = __( 'Error: No feed found.', 'instagram-feed' ); } ob_start(); ?>
>

set_feed_type_and_terms(); $instagram_feed_settings->set_transient_name(); $transient_name = $instagram_feed_settings->get_transient_name(); $settings = $instagram_feed_settings->get_settings(); $feed_type_and_terms = $instagram_feed_settings->get_feed_type_and_terms(); $instagram_feed = new SB_Instagram_Feed( $transient_name ); $instagram_feed->set_cache( $instagram_feed_settings->get_cache_time_in_seconds(), $settings ); if ( $settings['caching_type'] === 'background' ) { $instagram_feed->add_report( 'background caching used' ); if ( $instagram_feed->regular_cache_exists() ) { $instagram_feed->add_report( 'setting posts from cache' ); $instagram_feed->set_post_data_from_cache(); } if ( $instagram_feed->need_to_start_cron_job() ) { $instagram_feed->add_report( 'setting up feed for cron cache' ); $to_cache = array( 'atts' => $atts, 'last_requested' => time(), ); $instagram_feed->set_cron_cache( $to_cache, $instagram_feed_settings->get_cache_time_in_seconds() ); SB_Instagram_Cron_Updater::do_single_feed_cron_update( $instagram_feed_settings, $to_cache, $atts, false ); $instagram_feed->set_cache( $instagram_feed_settings->get_cache_time_in_seconds(), $settings ); $instagram_feed->set_post_data_from_cache(); } elseif ( $instagram_feed->should_update_last_requested() ) { $instagram_feed->add_report( 'updating last requested' ); $to_cache = array( 'last_requested' => time(), ); $instagram_feed->set_cron_cache( $to_cache, $instagram_feed_settings->get_cache_time_in_seconds(), $settings['backup_cache_enabled'] ); } } elseif ( $instagram_feed->regular_cache_exists() ) { $instagram_feed->add_report( 'page load caching used and regular cache exists' ); $instagram_feed->set_post_data_from_cache(); if ( $instagram_feed->need_posts( $settings['num'] ) && $instagram_feed->can_get_more_posts() ) { while ( $instagram_feed->need_posts( $settings['num'] ) && $instagram_feed->can_get_more_posts() ) { $instagram_feed->add_remote_posts( $settings, $feed_type_and_terms, $instagram_feed_settings->get_connected_accounts_in_feed() ); } $instagram_feed->cache_feed_data( $instagram_feed_settings->get_cache_time_in_seconds(), $settings['backup_cache_enabled'] ); } } else { $instagram_feed->add_report( 'no feed cache found' ); while ( $instagram_feed->need_posts( $settings['num'] ) && $instagram_feed->can_get_more_posts() ) { $instagram_feed->add_remote_posts( $settings, $feed_type_and_terms, $instagram_feed_settings->get_connected_accounts_in_feed() ); } if ( ! $instagram_feed->should_use_backup() ) { $instagram_feed->cache_feed_data( $instagram_feed_settings->get_cache_time_in_seconds(), $settings['backup_cache_enabled'] ); } } if ( $instagram_feed->should_use_backup() ) { $instagram_feed->add_report( 'trying to use backup' ); $instagram_feed->maybe_set_post_data_from_backup(); $instagram_feed->maybe_set_header_data_from_backup(); } // if need a header if ( $instagram_feed->need_header( $settings, $feed_type_and_terms ) ) { if ( $instagram_feed->should_use_backup() && $settings['minnum'] > 0 ) { $instagram_feed->add_report( 'trying to set header from backup' ); $header_cache_success = $instagram_feed->maybe_set_header_data_from_backup(); } elseif ( $instagram_feed->regular_header_cache_exists() ) { // set_post_data_from_cache $instagram_feed->add_report( 'page load caching used and regular header cache exists' ); $instagram_feed->set_header_data_from_cache(); } else { $instagram_feed->add_report( 'no header cache exists' ); $instagram_feed->set_remote_header_data( $settings, $feed_type_and_terms, $instagram_feed_settings->get_connected_accounts_in_feed() ); $instagram_feed->cache_header_data( $instagram_feed_settings->get_cache_time_in_seconds(), $settings['backup_cache_enabled'] ); } } else { $instagram_feed->add_report( 'no header needed' ); } if ( $settings['resizeprocess'] === 'page' ) { $instagram_feed->add_report( 'resizing images for post set' ); $post_data = $instagram_feed->get_post_data(); $post_data = array_slice( $post_data, 0, $settings['num'] ); $post_set = new SB_Instagram_Post_Set( $post_data, $transient_name ); $post_set->maybe_save_update_and_resize_images_for_posts(); } if ( $settings['disable_js_image_loading'] || $settings['imageres'] !== 'auto' ) { global $sb_instagram_posts_manager; $post_data = $instagram_feed->get_post_data(); if ( ! $sb_instagram_posts_manager->image_resizing_disabled() ) { $image_ids = array(); foreach ( $post_data as $post ) { $image_ids[] = SB_Instagram_Parse::get_post_id( $post ); } $resized_images = SB_Instagram_Feed::get_resized_images_source_set( $image_ids, 0, $transient_name ); $instagram_feed->set_resized_images( $resized_images ); } } return $instagram_feed->get_the_feed_html( $settings, $atts, $instagram_feed_settings->get_feed_type_and_terms(), $instagram_feed_settings->get_connected_accounts_in_feed() ); } /** * For efficiency, local versions of image files available for the images actually displayed on the page * are added at the end of the feed. * * @param object $instagram_feed * @param string $feed_id */ function sbi_add_resized_image_data( $instagram_feed, $feed_id ) { global $sb_instagram_posts_manager; if ( ! $sb_instagram_posts_manager->image_resizing_disabled() ) { if ( $instagram_feed->should_update_last_requested() ) { SB_Instagram_Feed::update_last_requested( $instagram_feed->get_image_ids_post_set() ); } } ?> set_feed_type_and_terms(); $instagram_feed_settings->set_transient_name(); $transient_name = $instagram_feed_settings->get_transient_name(); if ( $transient_name !== $feed_id ) { die( 'id does not match' ); } $settings = $instagram_feed_settings->get_settings(); $location = isset( $_POST['location'] ) && in_array( $_POST['location'], array( 'header', 'footer', 'sidebar', 'content' ), true ) ? sanitize_text_field( wp_unslash( $_POST['location'] ) ) : 'unknown'; $post_id = isset( $_POST['post_id'] ) && $_POST['post_id'] !== 'unknown' ? (int)$_POST['post_id'] : 'unknown'; $feed_details = array( 'feed_id' => $transient_name, 'atts' => $atts, 'location' => array( 'post_id' => $post_id, 'html' => $location ) ); $can_do_background_tasks = false; if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { $nonce = isset( $_POST['locator_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['locator_nonce'] ) ) : ''; if ( wp_verify_nonce( $nonce, esc_attr( 'sbi-locator-nonce-' . $post_id . '-' . $transient_name ) ) ) { $can_do_background_tasks = true; } } else { $can_do_background_tasks = true; } if ( $can_do_background_tasks ) { sbi_do_background_tasks( $feed_details ); } $feed_type_and_terms = $instagram_feed_settings->get_feed_type_and_terms(); $instagram_feed = new SB_Instagram_Feed( $transient_name ); $instagram_feed->set_cache( $instagram_feed_settings->get_cache_time_in_seconds(), $settings ); if ( $settings['caching_type'] === 'background' ) { $instagram_feed->add_report( 'background caching used' ); if ( $instagram_feed->regular_cache_exists() ) { $instagram_feed->add_report( 'setting posts from cache' ); $instagram_feed->set_post_data_from_cache(); } if ( $instagram_feed->need_posts( $settings['minnum'], $offset, $page ) && $instagram_feed->can_get_more_posts() ) { while ( $instagram_feed->need_posts( $settings['minnum'], $offset, $page ) && $instagram_feed->can_get_more_posts() ) { $instagram_feed->add_remote_posts( $settings, $feed_type_and_terms, $instagram_feed_settings->get_connected_accounts_in_feed() ); } $normal_method = true; if ( $instagram_feed->need_to_start_cron_job() ) { $instagram_feed->add_report( 'needed to start cron job' ); $to_cache = array( 'atts' => $atts, 'last_requested' => time(), ); $normal_method = false; } else { $instagram_feed->add_report( 'updating last requested and adding to cache' ); $to_cache = array( 'last_requested' => time(), ); } if ( $normal_method ) { $instagram_feed->set_cron_cache( $to_cache, $instagram_feed_settings->get_cache_time_in_seconds(), $settings['backup_cache_enabled'] ); } else { $instagram_feed->set_cron_cache( $to_cache, $instagram_feed_settings->get_cache_time_in_seconds() ); } } } elseif ( $instagram_feed->regular_cache_exists() ) { $instagram_feed->add_report( 'regular cache exists' ); $instagram_feed->set_post_data_from_cache(); if ( $instagram_feed->need_posts( $settings['minnum'], $offset, $page ) && $instagram_feed->can_get_more_posts() ) { while ( $instagram_feed->need_posts( $settings['minnum'], $offset, $page ) && $instagram_feed->can_get_more_posts() ) { $instagram_feed->add_remote_posts( $settings, $feed_type_and_terms, $instagram_feed_settings->get_connected_accounts_in_feed() ); } $instagram_feed->add_report( 'adding to cache' ); $instagram_feed->cache_feed_data( $instagram_feed_settings->get_cache_time_in_seconds(), $settings['backup_cache_enabled'] ); } } else { $instagram_feed->add_report( 'no feed cache found' ); while ( $instagram_feed->need_posts( $settings['num'], $offset ) && $instagram_feed->can_get_more_posts() ) { $instagram_feed->add_remote_posts( $settings, $feed_type_and_terms, $instagram_feed_settings->get_connected_accounts_in_feed() ); } if ( $instagram_feed->should_use_backup() ) { $instagram_feed->add_report( 'trying to use a backup cache' ); $instagram_feed->maybe_set_post_data_from_backup(); } else { $instagram_feed->add_report( 'transient gone, adding to cache' ); $instagram_feed->cache_feed_data( $instagram_feed_settings->get_cache_time_in_seconds(), $settings['backup_cache_enabled'] ); } } if ( $settings['disable_js_image_loading'] || $settings['imageres'] !== 'auto' ) { global $sb_instagram_posts_manager; $post_data = array_slice( $instagram_feed->get_post_data(), $offset, $settings['minnum'] ); if ( ! $sb_instagram_posts_manager->image_resizing_disabled() ) { $image_ids = array(); foreach ( $post_data as $post ) { $image_ids[] = SB_Instagram_Parse::get_post_id( $post ); } $resized_images = SB_Instagram_Feed::get_resized_images_source_set( $image_ids, 0, $feed_id ); $instagram_feed->set_resized_images( $resized_images ); } } $feed_status = array( 'shouldPaginate' => $instagram_feed->should_use_pagination( $settings, $offset ) ); $return = array( 'html' => $instagram_feed->get_the_items_html( $settings, $offset, $instagram_feed_settings->get_feed_type_and_terms(), $instagram_feed_settings->get_connected_accounts_in_feed() ), 'feedStatus' => $feed_status, 'report' => $instagram_feed->get_report(), 'resizedImages' => SB_Instagram_Feed::get_resized_images_source_set( $instagram_feed->get_image_ids_post_set(), 1, $feed_id ) ); header( 'Content-Type: application/json; charset=utf-8' ); echo sbi_json_encode( $return ); die(); } add_action( 'wp_ajax_sbi_load_more_clicked', 'sbi_get_next_post_set' ); add_action( 'wp_ajax_nopriv_sbi_load_more_clicked', 'sbi_get_next_post_set' ); /** * Posts that need resized images are processed after being sent to the server * using AJAX * * @return string */ function sbi_process_submitted_resize_ids() { if ( ! sbi_current_user_can( 'manage_instagram_feed_options') ) { if ( ! isset( $_POST['feed_id'] ) || (strpos( $_POST['feed_id'], 'sbi' ) === false && strpos( $_POST['feed_id'], '*' ) === false ) ) { die( 'invalid feed ID'); } } $feed_id = sanitize_text_field( $_POST['feed_id'] ); $images_need_resizing_raw = isset( $_POST['needs_resizing'] ) ? $_POST['needs_resizing'] : array(); if ( is_array( $images_need_resizing_raw ) ) { array_map( 'sbi_sanitize_instagram_ids', $images_need_resizing_raw ); } else { $images_need_resizing_raw = array(); } $images_need_resizing = $images_need_resizing_raw; $atts_raw = isset( $_POST['atts'] ) ? json_decode( wp_unslash( $_POST['atts'] ), true ) : array(); if ( is_array( $atts_raw ) ) { $atts_raw = SB_Instagram_Settings::sanitize_raw_atts( $atts_raw ); } else { $atts_raw = array(); } $atts = $atts_raw; // now sanitized $offset = isset( $_POST['offset'] ) ? (int)$_POST['offset'] : 0; $cache_all = isset( $_POST['cache_all'] ) ? $_POST['cache_all'] === 'true' : false; $database_settings = sbi_get_database_settings(); $instagram_feed_settings = new SB_Instagram_Settings( $atts, $database_settings ); $instagram_feed_settings->set_feed_type_and_terms(); $instagram_feed_settings->set_transient_name(); $transient_name = $instagram_feed_settings->get_transient_name(); $settings = $instagram_feed_settings->get_settings(); $location = isset( $_POST['location'] ) && in_array( $_POST['location'], array( 'header', 'footer', 'sidebar', 'content' ), true ) ? sanitize_text_field( $_POST['location'] ) : 'unknown'; $post_id = isset( $_POST['post_id'] ) && $_POST['post_id'] !== 'unknown' ? (int)$_POST['post_id'] : 'unknown'; $feed_details = array( 'feed_id' => $transient_name, 'atts' => $atts, 'location' => array( 'post_id' => $post_id, 'html' => $location ) ); $can_do_background_tasks = false; if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { $nonce = isset( $_POST['locator_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['locator_nonce'] ) ) : ''; if ( wp_verify_nonce( $nonce, esc_attr( 'sbi-locator-nonce-' . $post_id . '-' . $transient_name ) ) ) { $can_do_background_tasks = true; } } else { $can_do_background_tasks = true; } if ( $can_do_background_tasks ) { sbi_do_background_tasks( $feed_details ); } if ( $cache_all ) { $settings['cache_all'] = true; } if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { if ( $transient_name !== $feed_id ) { die( 'id does not match' ); } } sbi_resize_posts_by_id( $images_need_resizing, $transient_name, $settings ); sbi_delete_image_cache( $transient_name ); global $sb_instagram_posts_manager; if ( ! $sb_instagram_posts_manager->image_resizing_disabled( $transient_name ) ) { $num = $settings['minnum'] * 2 + 5; header( 'Content-Type: application/json; charset=utf-8' ); echo sbi_json_encode( SB_Instagram_Feed::get_resized_images_source_set( $num, $offset - $settings['minnum'], $feed_id, false ) ); die(); } die( 'resizing success' ); } add_action( 'wp_ajax_sbi_resized_images_submit', 'sbi_process_submitted_resize_ids' ); add_action( 'wp_ajax_nopriv_sbi_resized_images_submit', 'sbi_process_submitted_resize_ids' ); function sbi_do_locator() { if ( ! sbi_current_user_can( 'manage_instagram_feed_options') ) { if ( ! isset( $_POST['feed_id'] ) || (strpos( $_POST['feed_id'], 'sbi' ) === false && strpos( $_POST['feed_id'], '*' ) === false ) ) { die( 'invalid feed ID'); } } $feed_id = sanitize_text_field( wp_unslash( $_POST['feed_id'] ) ); $atts_raw = isset( $_POST['atts'] ) ? json_decode( wp_unslash( $_POST['atts'] ), true ) : array(); if ( is_array( $atts_raw ) ) { $atts_raw = SB_Instagram_Settings::sanitize_raw_atts( $atts_raw ); } else { $atts_raw = array(); } $atts = $atts_raw; // now sanitized $database_settings = sbi_get_database_settings(); $instagram_feed_settings = new SB_Instagram_Settings( $atts, $database_settings ); $instagram_feed_settings->set_feed_type_and_terms(); $instagram_feed_settings->set_transient_name(); $transient_name = $instagram_feed_settings->get_transient_name(); $location = isset( $_POST['location'] ) && in_array( $_POST['location'], array( 'header', 'footer', 'sidebar', 'content' ), true ) ? sanitize_text_field( $_POST['location'] ) : 'unknown'; $post_id = isset( $_POST['post_id'] ) && $_POST['post_id'] !== 'unknown' ? (int)$_POST['post_id'] : 'unknown'; $feed_details = array( 'feed_id' => $feed_id, 'atts' => $atts, 'location' => array( 'post_id' => $post_id, 'html' => $location ) ); $can_do_background_tasks = false; if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { $nonce = isset( $_POST['locator_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['locator_nonce'] ) ) : ''; if ( wp_verify_nonce( $nonce, esc_attr( 'sbi-locator-nonce-' . $post_id . '-' . $transient_name ) ) ) { $can_do_background_tasks = true; } } else { $can_do_background_tasks = true; } if ( $can_do_background_tasks ) { sbi_do_background_tasks( $feed_details ); wp_die( 'locating success' ); } wp_die( 'skipped locating' ); } add_action( 'wp_ajax_sbi_do_locator', 'sbi_do_locator' ); add_action( 'wp_ajax_nopriv_sbi_do_locator', 'sbi_do_locator' ); function sbi_do_background_tasks( $feed_details ) { if ( is_admin() && isset( $_GET['page'] ) && $_GET['page'] === 'sbi-feed-builder') { return; } $locator = new SB_Instagram_Feed_Locator( $feed_details ); $locator->add_or_update_entry(); if ( $locator->should_clear_old_locations() ) { $locator->delete_old_locations(); } } /** * Outputs an organized error report for the front end. * This hooks into the end of the feed before the closing div * * @param object $instagram_feed * @param string $feed_id */ function sbi_error_report( $instagram_feed, $feed_id ) { global $sb_instagram_posts_manager; if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { $sb_instagram_posts_manager->reset_frontend_errors(); return; } $error_messages = $sb_instagram_posts_manager->get_frontend_errors( $instagram_feed ); if ( ! empty( $error_messages ) ) {?>

' . esc_html( $error_message['error_message'] ) . ''; if ( sbi_current_user_can( 'manage_instagram_feed_options' ) ) { echo '
' . $error_message['admin_only']; echo '
' . $error_message['frontend_directions']; } echo '
'; } ?> reset_frontend_errors(); } add_action( 'sbi_before_feed_end', 'sbi_error_report', 10, 2 ); function sbi_delete_image_cache( $transient_name ) { $cache = new SB_Instagram_Cache( $transient_name ); $cache->clear( 'resized_images' ); } function sbi_current_user_can( $cap ) { if ( $cap === 'manage_instagram_feed_options' ) { $cap = current_user_can( 'manage_instagram_feed_options' ) ? 'manage_instagram_feed_options' : 'manage_options'; } $cap = apply_filters( 'sbi_settings_pages_capability', $cap ); return current_user_can( $cap ); } function sbi_doing_openssl() { return extension_loaded( 'openssl' ); } /** * Debug report added at the end of the feed when sbi_debug query arg is added to a page * that has the feed on it. * * @param object $instagram_feed * @param string $feed_id */ function sbi_debug_report( $instagram_feed, $feed_id ) { if ( ! isset( $_GET['sbi_debug'] ) && ! isset( $_GET['sb_debug'] ) ) { return; } global $sb_instagram_posts_manager; $feed = $instagram_feed->get_feed_id(); $atts = array('feed' => ! empty( $feed ) ? $feed : 1); $settings_obj = new SB_Instagram_Settings( $atts, sbi_get_database_settings() ); $settings = $settings_obj->get_settings(); $public_settings_keys = SB_Instagram_Settings::get_public_db_settings_keys(); ?>

Status

  • Time:
  • get_report() as $item ) : ?>

Settings

  • :
      $value ) { echo '
    • ' . esc_html( $sub_key ). ': '. esc_html( $value ) . '
    • '; } ?>

GDPR

    $value) : ?>
  • :
  • Enabled:
$settings['custombgcolor1'], 'text1' => $settings['customtextcolor1'], 'text2' => $settings['customtextcolor2'], 'link1' => $settings['customlinkcolor1'], 'button1' => $settings['custombuttoncolor1'], 'button2' => $settings['custombuttoncolor2'] ); ?> set_cache( MONTH_IN_SECONDS, $settings ); if ( $instagram_feed->regular_cache_exists() ) { // set_post_data_from_cache $instagram_feed->set_post_data_from_cache(); $cached_post_data = $instagram_feed->get_post_data(); } elseif ( sbi_current_user_can( 'manage_instagram_feed_options' ) && is_admin() ) { $customizer_cache = new SB_Instagram_Cache( $transient_name, 1, MONTH_IN_SECONDS ); $cached_post_data = $customizer_cache->get_customizer_cache(); } else { return array(); } if ( ! isset( $settings['cache_all'] ) || ! $settings['cache_all'] ) { $num_ids = count( $ids ); $found_posts = array(); $i = 0; while ( count( $found_posts) < $num_ids && isset( $cached_post_data[ $i ] ) ) { if ( ! empty( $cached_post_data[ $i ]['id'] ) && in_array( $cached_post_data[ $i ]['id'], $ids, true ) ) { $found_posts[] = $cached_post_data[ $i ]; } $i++; } } else { $found_posts = array_slice( $cached_post_data, 0, 50 ); } $fill_in_timestamp = date( 'Y-m-d H:i:s', time() + 120 ); if ( $offset !== 0 ) { $fill_in_timestamp = date( 'Y-m-d H:i:s', strtotime( $instagram_feed->get_earliest_time_stamp( $transient_name ) ) - 120 ); } $image_sizes = array( 'personal' => array( 'full' => 640, 'low' => 320, 'thumb' => 150 ), 'business' => array( 'full' => 640, 'low' => 320, 'thumb' => 150 ) ); $post_set = new SB_Instagram_Post_Set( $found_posts, $transient_name, $fill_in_timestamp, $image_sizes ); $post_set->maybe_save_update_and_resize_images_for_posts(); } function sbi_create_local_avatar( $username, $file_name ) { return SB_Instagram_Connected_Account::create_local_avatar( $username, $file_name ); } /** * Get the settings in the database with defaults * * @return array */ function sbi_get_database_settings() { $sbi_settings = get_option( 'sb_instagram_settings', array() ); if ( ! is_array( $sbi_settings ) ) { $sbi_settings = array(); } $return_settings = array_merge( sbi_defaults(), $sbi_settings ); $return_settings = apply_filters( 'sbi_database_settings', $return_settings ); return $return_settings; } /** * May include support for templates in theme folders in the future * * @since 2.1 custom templates supported */ function sbi_get_feed_template_part( $part, $settings = array() ) { $file = ''; $using_custom_templates_in_theme = apply_filters( 'sbi_use_theme_templates', $settings['customtemplates'] ); $generic_path = trailingslashit( SBI_PLUGIN_DIR ) . 'templates/'; if ( $using_custom_templates_in_theme ) { $custom_header_template = locate_template( 'sbi/header.php', false, false ); $custom_item_template = locate_template( 'sbi/item.php', false, false ); $custom_footer_template = locate_template( 'sbi/footer.php', false, false ); $custom_feed_template = locate_template( 'sbi/feed.php', false, false ); } else { $custom_header_template = false; $custom_item_template = false; $custom_footer_template = false; $custom_feed_template = false; } if ( $part === 'header' ) { if ( $custom_header_template ) { $file = $custom_header_template; } else { $file = $generic_path . 'header.php'; } } elseif ( $part === 'item' ) { if ( $custom_item_template ) { $file = $custom_item_template; } else { $file = $generic_path . 'item.php'; } } elseif ( $part === 'footer' ) { if ( $custom_footer_template ) { $file = $custom_footer_template; } else { $file = $generic_path . 'footer.php'; } } elseif ( $part === 'feed' ) { if ( $custom_feed_template ) { $file = $custom_feed_template; } else { $file = $generic_path . 'feed.php'; } } // Allow 3rd party plugins to filter template file from their plugin. $file = apply_filters( 'sbi_feed_template_part', $file, $part, $settings ); return $file; } /** * Triggered by a cron event to update feeds */ function sbi_cron_updater() { $cron_updater = new SB_Instagram_Cron_Updater(); $cron_updater->do_feed_updates(); sbi_do_background_tasks( array() ); \InstagramFeed\Admin\SBI_Support_Tool::delete_expired_users(); } add_action( 'sbi_feed_update', 'sbi_cron_updater' ); /** * @param $maybe_dirty * * @return string */ function sbi_maybe_clean( $maybe_dirty ) { $encryption = new SB_Instagram_Data_Encryption(); $decrypted = $encryption->decrypt( $maybe_dirty ); if ( $decrypted ) { $maybe_dirty = $decrypted; } if ( substr_count ( $maybe_dirty , '.' ) < 3 ) { return str_replace( '634hgdf83hjdj2', '', $maybe_dirty ); } $parts = explode( '.', trim( $maybe_dirty ) ); $last_part = $parts[2] . $parts[3]; $cleaned = $parts[0] . '.' . base64_decode( $parts[1] ) . '.' . base64_decode( $last_part ); return $cleaned; } /** * If there are more feeds than a single batch */ function sbi_process_additional_batch() { $sbi_settings = sbi_get_database_settings(); $args = array( 'cron_update' => true, 'additional_batch' => true, ); $cron_records = \InstagramFeed\Builder\SBI_Db::feed_caches_query( $args ); $num = count( $cron_records ); if ( $num === \InstagramFeed\Builder\SBI_Db::RESULTS_PER_CRON_UPDATE ) { wp_schedule_single_event( time() + 120, 'sbi_cron_additional_batch' ); } SB_Instagram_Cron_Updater::update_batch( $cron_records ); sbi_do_background_tasks( array() ); } add_action( 'sbi_cron_additional_batch', 'sbi_process_additional_batch' ); /** * @param $whole * * @return string */ function sbi_get_parts( $whole ) { if ( substr_count ( $whole , '.' ) !== 2 ) { return $whole; } $parts = explode( '.', trim( $whole ) ); $return = $parts[0] . '.' . base64_encode( $parts[1] ). '.' . base64_encode( $parts[2] ); return substr( $return, 0, 40 ) . '.' . substr( $return, 40, 100 ); } /** * @param $a * @param $b * * @return false|int */ function sbi_date_sort( $a, $b ) { $time_stamp_a = SB_Instagram_Parse::get_timestamp( $a ); $time_stamp_b = SB_Instagram_Parse::get_timestamp( $b ); if ( isset( $time_stamp_a ) ) { return $time_stamp_b - $time_stamp_a; } else { return rand ( -1, 1 ); } } function sbi_code_check( $code ) { if ( strpos( $code, '634hgdf83hjdj2') !== false ) { return true; } return false; } function sbi_fixer( $code ) { if ( strpos( $code, '634hgdf83hjdj2') !== false ) { return $code; } else { return substr_replace( $code , '634hgdf83hjdj2', 15, 0 ); } } /** * @param $a * @param $b * * @return false|int */ function sbi_rand_sort( $a, $b ) { return rand ( -1, 1 ); } /** * @return string * * @since 2.1.1 */ function sbi_get_resized_uploads_url() { $upload = wp_upload_dir(); $base_url = $upload['baseurl']; $home_url = home_url(); if ( strpos( $home_url, 'https:' ) !== false ) { $base_url = str_replace( 'http:', 'https:', $base_url ); } $resize_url = apply_filters( 'sbi_resize_url', trailingslashit( $base_url ) . trailingslashit( SBI_UPLOADS_NAME ) ); return $resize_url; } /** * Converts a hex code to RGB so opacity can be * applied more easily * * @param $hex * * @return string */ function sbi_hextorgb( $hex ) { // allows someone to use rgb in shortcode if ( strpos( $hex, ',' ) !== false ) { return $hex; } $hex = str_replace( '#', '', $hex ); if ( strlen( $hex ) === 3 ) { $r = hexdec( substr( $hex,0,1 ).substr( $hex,0,1 ) ); $g = hexdec( substr( $hex,1,1 ).substr( $hex,1,1 ) ); $b = hexdec( substr( $hex,2,1 ).substr( $hex,2,1 ) ); } else { $r = hexdec( substr( $hex,0,2 ) ); $g = hexdec( substr( $hex,2,2 ) ); $b = hexdec( substr( $hex,4,2 ) ); } $rgb = array( $r, $g, $b ); return implode( ',', $rgb ); // returns the rgb values separated by commas } function sbi_is_url( $input ) { return (bool) filter_var( $input, FILTER_VALIDATE_URL ); } /** * Added to workaround MySQL tables that don't use utf8mb4 character sets * * @since 2.2.1/5.3.1 */ function sbi_sanitize_emoji( $string ) { $encoded = array( 'jsonencoded' => $string ); return sbi_json_encode( $encoded ); } /** * Added to workaround MySQL tables that don't use utf8mb4 character sets * * @since 2.2.1/5.3.1 */ function sbi_decode_emoji( $string ) { if ( strpos( $string, '{"' ) !== false ) { $decoded = json_decode( $string, true ); return $decoded['jsonencoded']; } return $string; } function sbi_sanitize_instagram_ids( $raw_id ) { return preg_replace( '/[^0-9_]/', '', $raw_id ); } function sbi_sanitize_alphanumeric_and_equals( $value ) { return preg_replace( '/[^A-Za-z0-9=]/', '', $value ); } function sbi_sanitize_username( $value ) { return preg_replace( '/[^A-Za-z0-9_.]/', '', $value ); } /** * @return int */ function sbi_get_utc_offset() { return get_option( 'gmt_offset', 0 ) * HOUR_IN_SECONDS; } /** * Deletes any cache or setting that may contain Instagram platform data */ function sbi_delete_all_platform_data() { global $sb_instagram_posts_manager; $manager = new SB_Instagram_Data_Manager(); $sb_instagram_posts_manager->add_action_log( 'Deleted all platform data.' ); $sb_instagram_posts_manager->reset_api_errors(); $manager->delete_caches(); $manager->delete_comments_data(); $manager->delete_hashtag_data(); SB_Instagram_Connected_Account::update_connected_accounts( array() ); } function sbi_get_current_timestamp() { $current_time = time(); //$current_time = strtotime( 'November 25, 2022' ) + 1; return $current_time; } function sbi_get_current_time() { return sbi_get_current_timestamp(); } function sbi_is_after_deprecation_deadline() { return true; } function sbi_json_encode( $thing ) { if ( function_exists( 'wp_json_encode' ) ) { return wp_json_encode( $thing ); } else { return json_encode( $thing ); } } function sbi_private_account_near_expiration( $connected_account ) { $expires_in = max( 0, floor( ($connected_account['expires_timestamp'] - time()) / DAY_IN_SECONDS ) ); return $expires_in < 10; } function sbi_update_connected_account( $account_id, $to_update ) { $args = [ 'id' => $account_id ]; $results = InstagramFeed\Builder\SBI_Db::source_query( $args ); if ( ! empty( $results ) ) { $source = $results[0]; $info = ! empty( $source['info'] ) ? json_decode( $source['info'], true ) : array(); if ( isset( $to_update['private'] ) ) { $info['private'] = $to_update['private']; } foreach ( $to_update as $key => $value ) { if ( isset( $source[ $key ] ) ) { $source[ $key ] = $value; } } $source['id'] = $account_id; InstagramFeed\Builder\SBI_Source::update_or_insert( $source ); } } /** * Used to clear caches when transients aren't working * properly */ function sb_instagram_cron_clear_cache() { } function sbi_clear_caches() { global $wpdb; $cache_table_name = $wpdb->prefix . 'sbi_feed_caches'; $sql = " UPDATE $cache_table_name SET cache_value = '' WHERE cache_key NOT IN ( 'posts_backup', 'header_backup' );"; $wpdb->query( $sql ); } /** * When certain events occur, page caches need to * clear or errors occur or changes will not be seen */ function sb_instagram_clear_page_caches() { $clear_page_caches = apply_filters( 'sbi_clear_page_caches', true ); if ( ! $clear_page_caches ) { return; } if ( isset( $GLOBALS['wp_fastest_cache'] ) && method_exists( $GLOBALS['wp_fastest_cache'], 'deleteCache' ) ){ /* Clear WP fastest cache*/ $GLOBALS['wp_fastest_cache']->deleteCache(); } if ( function_exists( 'wp_cache_clear_cache' ) ) { wp_cache_clear_cache(); } if ( class_exists('W3_Plugin_TotalCacheAdmin') ) { $plugin_totalcacheadmin = & w3_instance('W3_Plugin_TotalCacheAdmin'); $plugin_totalcacheadmin->flush_all(); } if ( function_exists( 'rocket_clean_domain' ) ) { rocket_clean_domain(); } if ( class_exists( 'autoptimizeCache' ) ) { /* Clear autoptimize */ autoptimizeCache::clearall(); } // Litespeed Cache if ( method_exists( 'LiteSpeed_Cache_API', 'purge' ) ) { LiteSpeed_Cache_API::purge( 'esi.instagram-feed' ); } } /** * Makes the JavaScript file available and enqueues the stylesheet * for the plugin */ function sb_instagram_scripts_enqueue( $enqueue = false ) { //Register the script to make it available //Options to pass to JS file $sb_instagram_settings = get_option( 'sb_instagram_settings' ); // legacy settings $path = ! is_admin() && Util::sbi_legacy_css_enabled() ? 'legacy/' : ''; $js_file = 'js/' . $path . 'sbi-scripts.min.js'; $css_file = 'css/' . $path . 'sbi-styles.min.css'; if ( Util::isDebugging() || Util::is_script_debug() ) { $js_file = 'js/' . $path . 'sbi-scripts.js'; $css_file = 'css/' . $path . 'sbi-styles.css'; } if ( isset( $sb_instagram_settings['enqueue_js_in_head'] ) && $sb_instagram_settings['enqueue_js_in_head'] ) { wp_enqueue_script( 'sbi_scripts', trailingslashit( SBI_PLUGIN_URL ) . $js_file, array('jquery'), SBIVER, false ); } else { wp_register_script( 'sbi_scripts', trailingslashit( SBI_PLUGIN_URL ) . $js_file, array('jquery'), SBIVER, true ); } if ( isset( $sb_instagram_settings['enqueue_css_in_shortcode'] ) && $sb_instagram_settings['enqueue_css_in_shortcode'] ) { wp_register_style( 'sbi_styles', trailingslashit( SBI_PLUGIN_URL ) . $css_file, array(), SBIVER ); } else { wp_enqueue_style( 'sbi_styles', trailingslashit( SBI_PLUGIN_URL ) . $css_file, array(), SBIVER ); } $data = array( 'font_method' => 'svg', 'resized_url' => sbi_get_resized_uploads_url(), 'placeholder' => trailingslashit( SBI_PLUGIN_URL ) . 'img/placeholder.png', 'ajax_url' => admin_url( 'admin-ajax.php' ), ); //Pass option to JS file wp_localize_script('sbi_scripts', 'sb_instagram_js_options', $data ); if ( $enqueue || SB_Instagram_Blocks::is_gb_editor() ) { wp_enqueue_style( 'sbi_styles' ); wp_enqueue_script( 'sbi_scripts' ); } } add_action( 'wp_enqueue_scripts', 'sb_instagram_scripts_enqueue', 2 ); /** * Adds the ajax url and custom JavaScript to the page */ function sb_instagram_custom_js() { $options = get_option('sb_instagram_settings'); isset($options[ 'sb_instagram_custom_js' ]) ? $sb_instagram_custom_js = trim($options['sb_instagram_custom_js']) : $sb_instagram_custom_js = ''; echo ''; echo "\r\n"; echo ''; echo "\r\n"; } add_action( 'wp_footer', 'sb_instagram_custom_js' ); add_action( 'wp_footer', function() { if (is_user_logged_in()) { $current_user = wp_get_current_user(); if (user_can($current_user, 'administrator')) { InstagramFeed\Admin\SBI_Callout::print_callout(); } } }); //Custom CSS add_action( 'wp_head', 'sb_instagram_custom_css' ); function sb_instagram_custom_css() { $options = get_option( 'sb_instagram_settings', array() ); isset($options[ 'sb_instagram_custom_css' ]) ? $sb_instagram_custom_css = trim($options['sb_instagram_custom_css']) : $sb_instagram_custom_css = ''; //Show CSS if an admin (so can see Hide Photos link), if including Custom CSS or if hiding some photos ( current_user_can( 'edit_posts' ) || !empty($sb_instagram_custom_css) ) ? $sbi_show_css = true : $sbi_show_css = false; if( $sbi_show_css ) echo ''; if( $sbi_show_css ) echo "\r\n"; if( $sbi_show_css ) echo ''; if( $sbi_show_css ) echo "\r\n"; } /** * Used to change the number of posts in the api request. Useful for filtered posts * or special caching situations. * * @param int $num * @param array $settings * * @return int */ function sbi_raise_num_in_request( $num, $settings ) { if ( $settings['sortby'] === 'random' ) { if ( $num > 5 ) { return min( $num * 4, 100 ); } else { return 20; } } return $num; } add_filter( 'sbi_num_in_request', 'sbi_raise_num_in_request', 5, 2 ); /** * Load the critical notice for logged in users. */ function sbi_critical_error_notice() { // Don't do anything for guests. if ( ! is_user_logged_in() ) { return; } // Only show this to users who are not tracked. if ( ! current_user_can( 'manage_instagram_feed_options' ) ) { return; } global $sb_instagram_posts_manager; if ( ! $sb_instagram_posts_manager->are_critical_errors() ) { return; } // Don't show if already dismissed. if ( get_option( 'sbi_dismiss_critical_notice', false ) ) { return; } $db_settings = sbi_get_database_settings(); if ( isset( $db_settings['disable_admin_notice'] ) && ($db_settings['disable_admin_notice'] === 'on' || $db_settings['disable_admin_notice'] === true) ) { return; } ?>
Instagram Feed icon

', '' ); ?>

×
'; $header_from = "From: " . $email_from; $headers = array( 'Content-Type: text/html; charset=utf-8', $header_from ); $header_image = SBI_PLUGIN_URL . 'img/balloon-120.png'; $link = admin_url( 'admin.php?page=sbi-settings' ); //&tab=customize-advanced $footer_link = admin_url('admin.php?page=sbi-settings&flag=emails'); $is_expiration_notice = false; if ( isset( $options['connected_accounts'] ) ) { foreach ( $options['connected_accounts'] as $account ) { if ( $account['type'] === 'basic' && isset( $account['private'] ) && sbi_private_account_near_expiration( $account ) ) { $is_expiration_notice = true; } } } if ( ! $is_expiration_notice ) { $title = sprintf( __( 'Instagram Feed Report for %s', 'instagram-feed' ), str_replace( array( 'http://', 'https://' ), '', home_url() ) ); $bold = __( 'There\'s an Issue with an Instagram Feed on Your Website', 'instagram-feed' ); $details = '

' . __( 'An Instagram feed on your website is currently unable to connect to Instagram to retrieve new posts. Don\'t worry, your feed is still being displayed using a cached version, but is no longer able to display new posts.', 'instagram-feed' ) . '

'; $details .= '

' . sprintf( __( 'This is caused by an issue with your Instagram account connecting to the Instagram API. For information on the exact issue and directions on how to resolve it, please visit the %sInstagram Feed settings page%s on your website.', 'instagram-feed' ), '', '' ). '

'; } else { $title = __( 'Your Private Instagram Feed Account Needs to be Reauthenticated', 'instagram-feed' ); $bold = __( 'Access Token Refresh Needed', 'instagram-feed' ); $details = '

' . __( 'As your Instagram account is set to be "Private", Instagram requires that you reauthenticate your account every 60 days. This a courtesy email to let you know that you need to take action to allow the Instagram feed on your website to continue updating. If you don\'t refresh your account, then a backup cache will be displayed instead.', 'instagram-feed' ) . '

'; $details .= '

' . sprintf( __( 'To prevent your account expiring every 60 days %sswitch your account to be public%s. For more information and to refresh your account, click here to visit the %sInstagram Feed settings page%s on your website.', 'instagram-feed' ), '', '', '', '' ). '

'; } $message_content = '
' . $bold . '
' . $details; include_once SBI_PLUGIN_DIR . 'inc/class-sb-instagram-education.php'; $educator = new SB_Instagram_Education(); $dyk_message = $educator->dyk_display(); ob_start(); include SBI_PLUGIN_DIR . 'inc/email.php'; $email_body = ob_get_contents(); ob_get_clean(); $sent = wp_mail( $to_array, $title, $email_body, $headers ); return $sent; } function sbi_maybe_send_feed_issue_email() { global $sb_instagram_posts_manager; if ( ! $sb_instagram_posts_manager->are_critical_errors() ) { return; } $options = get_option('sb_instagram_settings' ); if ( isset( $options['enable_email_report'] ) && empty( $options['enable_email_report'] ) ) { return; } sbi_send_report_email(); } add_action( 'sb_instagram_feed_issue_email', 'sbi_maybe_send_feed_issue_email' ); function sbi_update_option( $option_name, $option_value, $autoload = true ) { return update_option( $option_name, $option_value, $autoload = true ); } function sbi_get_option( $option_name, $default ) { return get_option( $option_name, $default ); } function sbi_is_pro_version() { return ! defined( 'SBI_PLUGIN_NAME' ) || SBI_PLUGIN_NAME !== 'Instagram Feed Free'; } function sbi_defaults() { $defaults = array( 'sb_instagram_at' => '', 'sb_instagram_user_id' => '', 'sb_instagram_preserve_settings' => '', 'sb_instagram_ajax_theme' => false, 'sb_instagram_disable_resize' => false, 'image_format' => 'webp', 'sb_instagram_cache_time' => 1, 'sb_instagram_cache_time_unit' => 'hours', 'sbi_caching_type' => 'background', 'sbi_cache_cron_interval' => '12hours', 'sbi_cache_cron_time' => '1', 'sbi_cache_cron_am_pm' => 'am', 'sb_instagram_width' => '100', 'sb_instagram_width_unit' => '%', 'sb_instagram_feed_width_resp' => false, 'sb_instagram_height' => '', 'sb_instagram_num' => '20', 'sb_instagram_height_unit' => '', 'sb_instagram_cols' => '4', 'sb_instagram_disable_mobile' => false, 'sb_instagram_image_padding' => '5', 'sb_instagram_image_padding_unit' => 'px', 'sb_instagram_sort' => 'none', 'sb_instagram_background' => '', 'sb_instagram_show_btn' => true, 'sb_instagram_btn_background' => '', 'sb_instagram_btn_text_color' => '', 'sb_instagram_btn_text' => __( 'Load More...', 'instagram-feed' ), 'sb_instagram_image_res' => 'auto', 'sb_instagram_lightbox_comments' => true, 'sb_instagram_num_comments' => 20, 'sb_instagram_show_bio' => true, 'sb_instagram_show_followers' => true, //Header 'sb_instagram_show_header' => true, 'sb_instagram_header_size' => 'small', 'sb_instagram_header_color' => '', 'sb_instagram_stories' => true, 'sb_instagram_stories_time' => 5000, //Follow button 'sb_instagram_show_follow_btn' => true, 'sb_instagram_folow_btn_background' => '', 'sb_instagram_follow_btn_text_color' => '', 'sb_instagram_follow_btn_text' => __( 'Follow on Instagram', 'instagram-feed' ), //Misc 'sb_instagram_custom_css' => '', 'sb_instagram_custom_js' => '', 'sb_instagram_cron' => 'no', 'sb_instagram_backup' => true, 'sb_ajax_initial' => false, 'enqueue_css_in_shortcode' => false, 'enqueue_js_in_head' => false, 'disable_js_image_loading' => false, 'disable_admin_notice' => false, 'enable_email_report' => true, 'email_notification' => 'monday', 'email_notification_addresses' => get_option( 'admin_email' ), 'sb_instagram_disable_mob_swipe' => false, 'sb_instagram_disable_awesome' => false, 'sb_instagram_disable_font' => false, 'gdpr' => 'auto', 'enqueue_legacy_css' => false, ); return $defaults; } function sbi_doing_customizer( $settings ) { return ! empty( $settings['customizer'] ) && $settings['customizer'] == true; } function sbi_header_html( $settings, $header_data, $location = 'inside' ) { $customizer = sbi_doing_customizer( $settings ); if ( ! $customizer && ($location === 'inside' && $settings['headeroutside']) ) { return; } elseif ( ! $customizer && ($location === 'outside' && ! $settings['headeroutside']) ) { return; } elseif ( ! $customizer && empty( $header_data ) ) { return; } if ( $location === 'inside' ) { $settings['vue_args'] = [ 'condition' => ' && !$parent.valueIsEnabled($parent.customizerFeedData.settings.headeroutside)' ]; } else { $settings['vue_args'] = [ 'condition' => ' && $parent.valueIsEnabled($parent.customizerFeedData.settings.headeroutside)' ]; } include sbi_get_feed_template_part( 'header', $settings ); } /** * Check if there are critical errors. * * @return bool */ function sbi_has_critical_errors() { return Util::sbi_has_admin_errors(); } add_filter( 'sb_instagram_feed_has_admin_errors', 'sbi_has_critical_errors' );PKL\5 v+.+.4instagram-feed/inc/Helpers/SB_Instagram_Tracking.phpnu[Name; $data['themeversion'] = $theme_data->Version; $data['settings'] = array(); $data['pro'] = (int) sbi_is_pro_version(); $data['sites'] = $count_b; $data['usagetracking'] = get_option( 'sbi_usage_tracking_config', false ); $num_users = function_exists( 'count_users' ) ? count_users() : 'Not Set'; $data['usercount'] = is_array( $num_users ) ? $num_users['total_users'] : 1; $data['timezoneoffset'] = date( 'P' ); $settings_to_send = array(); $raw_settings = get_option( 'sb_instagram_settings', array() ); $feeds = SBI_Db::feeds_query(); $feed_settings = []; if ( ! empty( $feeds ) ) { //recursive json decode $feed_settings = array_map( static function($item) { return json_decode($item, true); }, json_decode($feeds[0]['settings'], true)); //map array values to key => value pairs in the $feed_settings array array_walk($feed_settings, static function($value, $key) use(&$feed_settings) { if(is_array($value)) { unset($feed_settings[$key]); foreach($value as $value_key => $value_item) { $feed_settings[$key . '_' . $value_key] = $value_item; } } }, []); } $settings_to_send = array_merge($settings_to_send, $feed_settings); $con_bus_accounts = 0; $recently_searched_hashtags = 0; $access_tokens_tried = array(); $sources = SBI_Db::source_query(); if ( !empty($sources) ) { $sources = SBI_Source::convert_sources_to_connected_accounts( $sources ); foreach ( $sources as $source ) { if ( isset( $source['account_type'] ) && $source['account_type'] === 'business' ) { $con_bus_accounts++; $source['type'] = $source['account_type']; if ( ! in_array( $source['access_token'], $access_tokens_tried, true ) && class_exists( 'SB_Instagram_API_Connect' ) ) { $access_tokens_tried[] = $source['access_token']; $connection = new \SB_Instagram_API_Connect( $source, 'recently_searched_hashtags', array( 'hashtag' => '' ) ); $connection->connect(); $recently_searched_data = ! $connection->is_wp_error() ? $connection->get_data() : false; $num_hashatags_searched = $recently_searched_data && isset( $recently_searched_data ) && ! isset( $recently_searched_data['data'] ) && is_array( $recently_searched_data ) ? count( $recently_searched_data ) : 0; $recently_searched_hashtags = $recently_searched_hashtags + $num_hashatags_searched; } } } } $settings_to_send['business_accounts'] = $con_bus_accounts; $settings_to_send['recently_searched_hashtags'] = $recently_searched_hashtags; $sbi_cache = new \SB_Instagram_Cache(null); $settings_to_send['num_found_feed_caches'] = (int)$sbi_cache->get_cache_count(); $settings_to_send['recently_requested_caches'] = (int)$sbi_cache->get_cache_count(true); $settings_to_send['custom_header_template'] = '' !== locate_template( 'sbi/header.php', false, false ) ? 1 : 0; $settings_to_send['custom_header_boxed_template'] = '' !== locate_template( 'sbi/header-boxed.php', false, false ) ? 1 : 0; $settings_to_send['custom_header_generic_template'] = '' !== locate_template( 'sbi/header-generic.php', false, false ) ? 1 : 0; $settings_to_send['custom_item_template'] = '' !== locate_template( 'sbi/item.php', false, false ) ? 1 : 0; $settings_to_send['custom_footer_template'] = '' !== locate_template( 'sbi/footer.php', false, false ) ? 1 : 0; $settings_to_send['custom_feed_template'] = '' !== locate_template( 'sbi/feed.php', false, false ) ? 1 : 0; $settings_to_send['num_found_feeds'] = count($feeds); $sbi_current_white_names = get_option( 'sb_instagram_white_list_names', array() ); if ( empty( $sbi_current_white_names ) ) { $settings_to_send['num_white_lists'] = 0; } else { $settings_to_send['num_white_lists'] = count( $sbi_current_white_names ); } $data['settings'] = $settings_to_send; // Retrieve current plugin information if ( ! function_exists( 'get_plugins' ) ) { include ABSPATH . '/wp-admin/includes/plugin.php'; } $plugins = get_plugins(); $active_plugins = get_option( 'active_plugins', array() ); $plugins_to_send = array(); foreach ( $plugins as $plugin_path => $plugin ) { // If the plugin isn't active, don't show it. if ( ! in_array( $plugin_path, $active_plugins ) ) { continue; } $plugins_to_send[] = $plugin['Name']; } $data['active_plugins'] = $plugins_to_send; $data['locale'] = get_locale(); return $data; } public function send_checkin( $override = false, $ignore_last_checkin = false ) { $home_url = trailingslashit( home_url() ); if ( strpos( $home_url, 'smashballoon.com' ) !== false ) { return false; } if ( ! $this->tracking_allowed() && ! $override ) { return false; } // Send a maximum of once per week $usage_tracking = get_option( 'sbi_usage_tracking', array( 'last_send' => 0, 'enabled' => sbi_is_pro_version(), ) ); if ( is_numeric( $usage_tracking['last_send'] ) && $usage_tracking['last_send'] > strtotime( '-1 week' ) && ! $ignore_last_checkin ) { return false; } $request = wp_remote_post( 'https://usage.smashballoon.com/v1/checkin/', array( 'method' => 'POST', 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.1', 'blocking' => false, 'body' => $this->get_data(), 'user-agent' => 'MI/' . SBIVER . '; ' . get_bloginfo( 'url' ), ) ); // If we have completed successfully, recheck in 1 week $usage_tracking['last_send'] = time(); update_option( 'sbi_usage_tracking', $usage_tracking, false ); return true; } private function tracking_allowed() { $usage_tracking = get_option( 'sbi_usage_tracking', array( 'last_send' => 0, 'enabled' => sbi_is_pro_version(), ) ); $tracking_allowed = isset( $usage_tracking['enabled'] ) ? $usage_tracking['enabled'] : sbi_is_pro_version(); return $tracking_allowed; } public function schedule_send() { if ( ! wp_next_scheduled( 'sbi_usage_tracking_cron' ) ) { $tracking = array(); $tracking['day'] = rand( 0, 6 ); $tracking['hour'] = rand( 0, 23 ); $tracking['minute'] = rand( 0, 59 ); $tracking['second'] = rand( 0, 59 ); $tracking['offset'] = ( $tracking['day'] * DAY_IN_SECONDS ) + ( $tracking['hour'] * HOUR_IN_SECONDS ) + ( $tracking['minute'] * MINUTE_IN_SECONDS ) + $tracking['second']; $last_sunday = strtotime( 'next sunday' ) - ( 7 * DAY_IN_SECONDS ); if ( ( $last_sunday + $tracking['offset'] ) > time() + 6 * HOUR_IN_SECONDS ) { $tracking['initsend'] = $last_sunday + $tracking['offset']; } else { $tracking['initsend'] = strtotime( 'next sunday' ) + $tracking['offset']; } wp_schedule_event( $tracking['initsend'], 'weekly', 'sbi_usage_tracking_cron' ); update_option( 'sbi_usage_tracking_config', $tracking ); } } public function add_schedules( $schedules = array() ) { // Adds once weekly to the existing schedules. $schedules['weekly'] = array( 'interval' => 604800, 'display' => __( 'Once Weekly', 'instagram-feed' ), ); return $schedules; } } PKL\ ]++#instagram-feed/inc/Helpers/Util.phpnu[ $is_facebook_installed, 'is_instagram_installed' => $is_instagram_installed, 'is_twitter_installed' => $is_twitter_installed, 'is_youtube_installed' => $is_youtube_installed, 'is_social_wall_installed' => $is_social_wall_installed, 'is_uncanny_automator_installed' => $is_uncanny_automator_installed, 'facebook_plugin' => $facebook_plugin, 'instagram_plugin' => $instagram_plugin, 'twitter_plugin' => $twitter_plugin, 'youtube_plugin' => $youtube_plugin, 'social_wall_plugin' => $social_wall_plugin, 'uncanny_automator_plugin' => $uncanny_automator_plugin, 'uncanny_automator_download_plugin' => $uncanny_automator_download_plugin, 'installed_plugins' => $installed_plugins, ); } /** * Get a valid timestamp to avoid Year 2038 problem. * * @param mixed $timestamp * @return int */ public static function get_valid_timestamp( $timestamp ) { // check if timestamp is negative and set to maximum value if ( $timestamp < 0 ) { $timestamp = 2147483647; } if( is_numeric( $timestamp ) ) { $timestamp = (int) $timestamp; return $timestamp; } $new_timestamp = new \DateTime( $timestamp ); $year = $new_timestamp->format( 'Y' ); if ( (int) $year >= 2038 ) { $new_timestamp->setDate( 2037, 12, 30 )->setTime( 00, 00, 00 ); $timestamp = $new_timestamp->getTimestamp(); } else { $timestamp = strtotime( $timestamp ); } return $timestamp; } /** * Checks if the user has custom templates, CSS or JS added * * @return bool * @since 6.3 */ public static function sbi_has_custom_templates() { // Check if the user has sbi custom templates in their theme $templates = array( 'feed.php', 'footer.php', 'header.php', 'item.php', ); foreach ( $templates as $template ) { if ( locate_template( 'sbi/' . $template ) ) { return true; } } // Check if the user has custom CSS and or JS added in the settings $settings = get_option( 'sb_instagram_settings', array() ); if ( isset( $settings['sb_instagram_custom_css'] ) && ! empty( $settings['sb_instagram_custom_css'] ) ) { return true; } if ( isset( $settings['sb_instagram_custom_js'] ) && ! empty( $settings['sb_instagram_custom_js'] ) ) { return true; } return false; } /** * Checks if the user has custom templates, CSS or JS added and if they have dismissed the notice * * @return bool * @since 6.3 */ public static function sbi_show_legacy_css_settings() { $show_legacy_css_settings = false; $sbi_statuses = get_option( 'sbi_statuses', array() ); if ( ( isset( $sbi_statuses['custom_templates_notice'] ) && self::sbi_has_custom_templates() ) || self::sbi_legacy_css_enabled() ) { $show_legacy_css_settings = true; } $show_legacy_css_settings = apply_filters( 'sbi_show_legacy_css_settings', $show_legacy_css_settings ); return $show_legacy_css_settings; } /** * Checks if the user has legacy CSS enabled * * @return bool * @since 6.3 */ public static function sbi_legacy_css_enabled() { $legacy_css_enabled = false; $settings = get_option( 'sb_instagram_settings', array() ); if ( isset( $settings['enqueue_legacy_css'] ) && $settings['enqueue_legacy_css'] ) { $legacy_css_enabled = true; } $legacy_css_enabled = apply_filters( 'sbi_legacy_css_enabled', $legacy_css_enabled ); return $legacy_css_enabled; } /** * Checks if sb_instagram_posts_manager errors exists. * * @return bool */ public static function sbi_has_admin_errors() { global $sb_instagram_posts_manager; $are_critical_errors = $sb_instagram_posts_manager->are_critical_errors(); if ( $are_critical_errors ) { return true; } $errors = $sb_instagram_posts_manager->get_errors(); if( ! empty( $errors ) ) { foreach ( $errors as $type => $error ) { if ( in_array( $type, array( 'database_create', 'upload_dir', 'unused_feed', 'platform_data_deleted' ) ) && ! empty( $error ) ) { return true; } } } return false; } }PKL\|UL9instagram-feed/inc/class-sb-instagram-data-encryption.phpnu[key = $remote['key']; $this->salt = $remote['salt']; } else { $this->key = $this->get_default_key(); $this->salt = $this->get_default_salt(); } } /** * Encrypts a value. * * If a user-based key is set, that key is used. Otherwise the default key is used. * * @since 2.9.4/5.12.4 * * @param string $value Value to encrypt. * @return string|bool Encrypted value, or false on failure. */ public function encrypt( $value ) { if ( ! sbi_doing_openssl() ) { return $value; } $method = 'aes-256-ctr'; $ivlen = openssl_cipher_iv_length( $method ); $iv = openssl_random_pseudo_bytes( $ivlen ); $raw_value = openssl_encrypt( $value . $this->salt, $method, $this->key, 0, $iv ); if ( ! $raw_value ) { return false; } return base64_encode( $iv . $raw_value ); } /** * Decrypts a value. * * If a user-based key is set, that key is used. Otherwise the default key is used. * * @since 2.9.4/5.12.4 * * @param string $raw_value Value to decrypt. * @return string|bool Decrypted value, or false on failure. */ public function decrypt( $raw_value ) { if ( ! sbi_doing_openssl() ) { return $raw_value; } $raw_value = base64_decode( $raw_value, true ); $method = 'aes-256-ctr'; $ivlen = openssl_cipher_iv_length( $method ); $iv = substr( $raw_value, 0, $ivlen ); $raw_value = substr( $raw_value, $ivlen ); $value = openssl_decrypt( $raw_value, $method, $this->key, 0, $iv ); if ( ! $value || substr( $value, - strlen( $this->salt ) ) !== $this->salt ) { return false; } return substr( $value, 0, - strlen( $this->salt ) ); } /** * Encrypts a value that may already be encrypted. * * If a user-based key is set, that key is used. Otherwise the default key is used. * * @since 6.0 * * @param string $raw_value Value to encrypt. * @return string|bool encrypted value, or false on failure. */ public function maybe_encrypt( $raw_value ) { $maybe_decrypted = $this->decrypt( $raw_value ); if ( $maybe_decrypted ) { return $this->encrypt( $maybe_decrypted ); } return $this->encrypt( $raw_value ); } /** * Uses a raw value and attempts to decrypt it * * @since 6.0.8 * * @param $value * @return bool|string */ public function maybe_decrypt( $value ) { if ( ! is_string( $value ) ) { return $value; } if ( strpos( $value, '{' ) === 0 ) { return $value; } $decrypted = $this->decrypt( $value ); if ( ! $decrypted ) { return $value; } return $decrypted; } /** * Gets the default encryption key to use. * * @since 2.9.4/5.12.4 * * @return string Default (not user-based) encryption key. */ private function get_default_key() { if ( defined( 'SBI_ENCRYPTION_KEY' ) && '' !== SBI_ENCRYPTION_KEY ) { return SBI_ENCRYPTION_KEY; } if ( defined( 'LOGGED_IN_KEY' ) && '' !== LOGGED_IN_KEY ) { return LOGGED_IN_KEY; } // If this is reached, you're either not on a live site or have a serious security issue. return 'das-ist-kein-geheimer-schluessel'; } /** * Gets the default encryption salt to use. * * @since 2.9.4/5.12.4 * * @return string Encryption salt. */ private function get_default_salt() { if ( defined( 'SBI_ENCRYPTION_SALT' ) && '' !== SBI_ENCRYPTION_SALT ) { return SBI_ENCRYPTION_SALT; } if ( defined( 'LOGGED_IN_SALT' ) && '' !== LOGGED_IN_SALT ) { return LOGGED_IN_SALT; } // If this is reached, you're either not on a live site or have a serious security issue. return 'das-ist-kein-geheimes-salz'; } } PKL\y455;instagram-feed/inc/class-sb-instagram-gdpr-integrations.phpnu[=' ) ) ) { return 'Borlabs Cookie by Borlabs'; } return false; } /** * GDPR features can be added automatically, forced enabled, * or forced disabled. * * @param $settings * * @return bool */ public static function doing_gdpr( $settings ) { $gdpr = isset( $settings['gdpr'] ) ? $settings['gdpr'] : 'auto'; if ( $gdpr === 'no' ) { return false; } if ( $gdpr === 'yes' ) { return true; } return ( self::gdpr_plugins_active() !== false ); } public static function blocking_cdn( $settings ) { $gdpr = isset( $settings['gdpr'] ) ? $settings['gdpr'] : 'auto'; if ( $gdpr === 'no' ) { return false; } if ( $gdpr === 'yes' ) { return true; } $sbi_statuses_option = get_option( 'sbi_statuses', array() ); if ( $sbi_statuses_option['gdpr']['from_update_success'] ) { return ( self::gdpr_plugins_active() !== false ); } return false; } /** * GDPR features are reliant on the image resizing features * * @param bool $retest * * @return bool */ public static function gdpr_tests_successful( $retest = false ) { $sbi_statuses_option = get_option( 'sbi_statuses', array() ); if ( ! isset( $sbi_statuses_option['gdpr']['image_editor'] ) || $retest ) { $test_image = trailingslashit( SBI_PLUGIN_URL ) . 'img/placeholder.png'; $image_editor = wp_get_image_editor( $test_image ); $sbi_statuses_option['gdpr']['image_editor'] = false; // not uncommon for the image editor to not work using it this way if ( ! is_wp_error( $image_editor ) ) { $sbi_statuses_option['gdpr']['image_editor'] = true; } else { $test_image = 'https://plugin.smashballoon.com/editor-test.png'; $image_editor = wp_get_image_editor( $test_image ); if ( ! is_wp_error( $image_editor ) ) { $sbi_statuses_option['gdpr']['image_editor'] = true; } else { if ( ! function_exists( 'download_url' ) ) { include_once ABSPATH . 'wp-admin/includes/file.php'; } // Set a timeout for downloading the image $timeout_seconds = 5; // Download file to temp dir. $temp_file = download_url( $test_image, $timeout_seconds ); $image_editor = wp_get_image_editor( $temp_file ); if ( ! is_wp_error( $image_editor ) ) { $sbi_statuses_option['gdpr']['image_editor'] = true; } @unlink( $temp_file ); } } $upload = wp_upload_dir(); $upload_dir = $upload['basedir']; $upload_dir = trailingslashit( $upload_dir ) . SBI_UPLOADS_NAME; if ( file_exists( $upload_dir ) ) { $sbi_statuses_option['gdpr']['upload_dir'] = true; } else { $sbi_statuses_option['gdpr']['upload_dir'] = false; } global $wpdb; $table_name = $wpdb->prefix . SBI_INSTAGRAM_POSTS_TYPE; $sbi_statuses_option['gdpr']['tables'] = true; if ( $wpdb->get_var( "show tables like '$table_name'" ) !== $table_name ) { $sbi_statuses_option['gdpr']['tables'] = false; } $feeds_posts_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEEDS_POSTS; if ( $wpdb->get_var( "show tables like '$feeds_posts_table_name'" ) !== $feeds_posts_table_name ) { $sbi_statuses_option['gdpr']['tables'] = false; } update_option( 'sbi_statuses', $sbi_statuses_option ); } if ( $retest ) { global $sb_instagram_posts_manager; $sb_instagram_posts_manager->add_action_log( 'Retesting GDPR features.' ); } if ( ! $sbi_statuses_option['gdpr']['upload_dir'] || ! $sbi_statuses_option['gdpr']['tables'] || ! $sbi_statuses_option['gdpr']['image_editor'] ) { return false; } return true; } public static function gdpr_tests_error_message() { $sbi_statuses_option = get_option( 'sbi_statuses', array() ); $errors = array(); if ( ! $sbi_statuses_option['gdpr']['upload_dir'] ) { $errors[] = __( 'A folder for storing resized images was not successfully created.', 'instagram-feed' ); } if ( ! $sbi_statuses_option['gdpr']['tables'] ) { $errors[] = __( 'Tables used for storing information about resized images were not successfully created.', 'instagram-feed' ); } if ( ! $sbi_statuses_option['gdpr']['image_editor'] ) { $errors[] = sprintf( __( 'An image editor is not available on your server. Instagram Feed is unable to create local resized images. See %1$sthis FAQ%2$s for more information', 'instagram-feed' ), '', '' ); } if ( isset( $_GET['tab'] ) && $_GET['tab'] !== 'support' ) { $tab = sbi_is_pro_version() ? 'customize-advanced' : 'customize'; $errors[] = '' . __( 'Retest', 'instagram-feed' ) . ''; } return implode( '
', $errors ); } public static function statuses() { $sbi_statuses_option = get_option( 'sbi_statuses', array() ); $return = isset( $sbi_statuses_option['gdpr'] ) ? $sbi_statuses_option['gdpr'] : array(); return $return; } } PKL\W@@)instagram-feed/inc/Email_Notification.phpnu['; $header_from = "From: " . $email_from; $headers = array( 'Content-Type: text/html; charset=utf-8', $header_from ); $header_image = SBI_PLUGIN_URL . 'img/balloon-120.png'; $footer_link = admin_url('admin.php?page=sbi-settings&view=advanced&flag=emails'); $message_content = '
' . $bold . '
' . $details; include_once SBI_PLUGIN_DIR . 'inc/class-sb-instagram-education.php'; $educator = new SB_Instagram_Education(); $dyk_message = $educator->dyk_display(); ob_start(); include SBI_PLUGIN_DIR . 'inc/email.php'; $email_body = ob_get_contents(); ob_get_clean(); return wp_mail( $valid_emails, $title, $email_body, $headers ); } }PKL\-U]U]5instagram-feed/inc/Builder/SBI_Feed_Saver_Manager.phpnu[ $source_ids ); $source_query = SBI_Db::source_query( $args ); $sources = array(); if ( ! empty( $source_query ) ) { foreach ( $source_query as $source ) { $sources[] = $source['account_id']; } } $settings_data['sources'] = $sources; if ( $feed_id !== 'legacy' ) { unset( $settings_data['sources'] ); $settings_data['id'] = implode(',', $sources ); } else { if ( isset( $settings_data['feed'] ) ) { unset( $settings_data['feed'] ); } $settings_data['id'] = implode(',', $source_ids ); \SB_Instagram_Cache::clear_legacy(); } $feed_saver = new SBI_Feed_Saver( $feed_id ); $feed_saver->set_feed_name( $feed_name ); $settings_data = self::filter_save_data( $settings_data ); $feed_saver->set_data( $settings_data ); $return = array( 'success' => false, 'feed_id' => false ); if ( $feed_saver->update_or_insert() ) { $return = array( 'success' => true, 'feed_id' => $feed_saver->get_feed_id() ); if($is_new_feed){ echo wp_json_encode( $return ); wp_die(); } else{ $feed_cache = new \SB_Instagram_Cache( $feed_id ); $feed_cache->clear( 'all' ); $feed_cache->clear( 'posts' ); echo wp_json_encode( $return ); wp_die(); } } } /** * Retrieve comments AJAX call * * @since 6.0 */ public static function retrieve_comments() { check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } wp_send_json_success(); } /** * Clear comments cache AJAX call * * @since 6.0 */ public static function clear_comments_cache() { check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $manager = new \SB_Instagram_Data_Manager(); $manager->delete_comments_data(); echo "success"; wp_die(); } /** * Used in an AJAX call to delete feeds from the Database * $_POST data. * * @since 6.0 */ public static function delete_feed() { check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } if ( ! empty( $_POST['feeds_ids'] ) && is_array( $_POST['feeds_ids'] )) { SBI_Db::delete_feeds_query( $_POST['feeds_ids'] ); } } /** * Used in an AJAX call to delete Soureces from the Database * $_POST data. * * @since 6.0 */ public static function delete_source() { check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } if ( ! empty( $_POST['source_id'] ) ) { if ( isset( $_POST['username'] ) && ! empty( $_POST['username'] ) ) { $username = sanitize_text_field( $_POST['username'] ); $args = array( 'username' => $username ); $source_query = SBI_Db::source_query( $args ); \SB_Instagram_Connected_Account::delete_local_avatar( $source_query['username'] ); } $source_id = absint( $_POST['source_id'] ); SBI_Db::delete_source_query( $source_id ); } } public static function recache_feed() { check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $feed_id = sanitize_key( $_POST['feedID'] ); $feed_cache = new \SB_Instagram_Cache( $feed_id ); $feed_cache->clear( 'all' ); $feed_cache->clear( 'posts' ); } /** * Used in an AJAX call to delete a feed cache from the Database * $_POST data. * * @since 6.0 */ public static function clear_single_feed_cache() { check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $feed_id = sanitize_key( $_POST['feedID'] ); if ( $feed_id === 'legacy' ) { \SB_Instagram_Cache::clear_legacy( true ); } else { $feed_cache = new \SB_Instagram_Cache( $feed_id ); $feed_cache->clear( 'all' ); $feed_cache->clear( 'posts' ); } SBI_Feed_Saver_Manager::feed_customizer_fly_preview(); wp_die(); } /** * Used in an AJAX call to duplicate a Feed * $_POST data. * * @since 6.0 */ public static function duplicate_feed() { check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } if ( ! empty( $_POST['feed_id'] ) ) { SBI_Db::duplicate_feed_query( sanitize_key( $_POST['feed_id'] ) ); } } /** * Import a feed from JSON data * * @since 6.0 */ public static function importer() { check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } if ( ! empty( $_POST['feed_json'] ) && strpos( $_POST['feed_json'], '{' ) === 0 ) { echo json_encode( SBI_Feed_Saver_Manager::import_feed( stripslashes( $_POST['feed_json'] ) ) ); } else { echo json_encode( array( 'success' => false, 'message' => __( 'Invalid JSON. Must have brackets "{}"', 'instagram-feed' ) ) ); } wp_die(); } /** * Used To check if it's customizer Screens * Returns Feed info or false! * * @param bool $include_comments * * @return array|bool * * @since 6.0 */ public static function maybe_feed_customizer_data( $include_comments = false ) { if ( isset( $_GET['feed_id'] ) ){ $feed_id = sanitize_key( $_GET['feed_id'] ); $feed_saver = new SBI_Feed_Saver( $feed_id ); $settings = $feed_saver->get_feed_settings(); $feed_db_data = $feed_saver->get_feed_db_data(); if ( $settings !== false ){ $return = array( 'feed_info' => $feed_db_data, 'headerData' => $feed_db_data, 'settings' => $settings, 'posts' => array() ); if ( intval( $feed_id ) > 0 ) { $instagram_feed_settings = new \SB_Instagram_Settings( array( 'feed' => $feed_id, 'customizer' => true ), sbi_defaults() ); } else { $instagram_feed_settings = new \SB_Instagram_Settings( array(), sbi_get_database_settings() ); } $instagram_feed_settings->set_feed_type_and_terms(); $instagram_feed_settings->set_transient_name(); $transient_name = $instagram_feed_settings->get_transient_name(); $settings = $instagram_feed_settings->get_settings(); $feed_type_and_terms = $instagram_feed_settings->get_feed_type_and_terms(); if ( $feed_id === 'legacy' ) { $transient_name = 'sbi_*legacy'; } $instagram_feed = new \SB_Instagram_Feed( $transient_name ); $instagram_feed->set_cache( $instagram_feed_settings->get_cache_time_in_seconds(), $settings ); if ( $instagram_feed->regular_cache_exists() ) { $instagram_feed->set_post_data_from_cache(); if ( $instagram_feed->need_posts( $settings['num'] ) && $instagram_feed->can_get_more_posts() ) { while ( $instagram_feed->need_posts( $settings['num'] ) && $instagram_feed->can_get_more_posts() ) { $instagram_feed->add_remote_posts( $settings, $feed_type_and_terms, $instagram_feed_settings->get_connected_accounts_in_feed() ); } $instagram_feed->cache_feed_data( $instagram_feed_settings->get_cache_time_in_seconds(), $settings['backup_cache_enabled'] ); } } else { while ( $instagram_feed->need_posts( $settings['num'] ) && $instagram_feed->can_get_more_posts() ) { $instagram_feed->add_remote_posts( $settings, $feed_type_and_terms, $instagram_feed_settings->get_connected_accounts_in_feed() ); } if ( ! $instagram_feed->should_use_backup() ) { $instagram_feed->cache_feed_data( $instagram_feed_settings->get_cache_time_in_seconds(), $settings['backup_cache_enabled'] ); } elseif ( $instagram_feed->should_cache_error() ) { $cache_time = min( $instagram_feed_settings->get_cache_time_in_seconds(), 15 * 60 ); $instagram_feed->cache_feed_data( $cache_time, false ); } } $return['posts'] = $instagram_feed->get_post_data(); $instagram_feed->set_remote_header_data( $settings, $feed_type_and_terms, $instagram_feed_settings->get_connected_accounts_in_feed() ); $header_data = $instagram_feed->get_header_data(); if ( sbi_is_pro_version() && $settings['stories'] && ! empty( $header_data ) ) { $instagram_feed->set_remote_stories_data( $settings, $feed_type_and_terms, $instagram_feed_settings->get_connected_accounts_in_feed() ); } $instagram_feed->cache_header_data( $instagram_feed_settings->get_cache_time_in_seconds(), $settings['backup_cache_enabled'] ); if ( ! empty( $header_data ) && \SB_Instagram_Connected_Account::local_avatar_exists( $header_data['username'] ) ) { $header_data['local_avatar_url'] = \SB_Instagram_Connected_Account::get_local_avatar_url( $header_data['username'] ); $header_data['local_avatar'] = \SB_Instagram_Connected_Account::get_local_avatar_url( $header_data['username'] ); } else { $header_data['local_avatar'] = false; } $header_data['local_avatar'] = false; $return['header'] = $header_data; $return['headerData'] = $header_data; return $return; } } return false; } /** * Used to retrieve Feed Posts for preview screen * Returns Feed info or false! * * * * @since 6.0 */ public static function feed_customizer_fly_preview() { check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } if( isset( $_POST['feedID'] ) && isset( $_POST['previewSettings'] ) ){ $feed_id = sanitize_key( $_POST['feedID'] ); $preview_settings = $_POST['previewSettings']; $feed_name = sanitize_text_field( wp_unslash( $_POST['feedName'] ) ); if(isset($_POST['moderationShoppableMode']) && $_POST['moderationShoppableMode'] == true){ $preview_settings['num'] = 10; $preview_settings['layout'] = 'grid'; $preview_settings['cols'] = 4; $preview_settings['offset'] = intval($_POST['offset']) * 10; $preview_settings['enablemoderationmode'] = false; $preview_settings['shoppablelist'] = isset( $preview_settings['shoppablelist'] ) ? json_encode($preview_settings['shoppablelist']) : []; $preview_settings['moderationlist'] = isset( $preview_settings['moderationlist'] ) ? json_encode($preview_settings['moderationlist']) : []; } if ( $feed_id === 'legacy' ) { \SB_Instagram_Cache::clear_legacy( true ); } else { $feed_cache = new \SB_Instagram_Cache( $feed_id ); $feed_cache->clear( 'all' ); $feed_cache->clear( 'posts' ); } $feed_saver = new SBI_Feed_Saver( $feed_id ); $feed_saver->set_feed_name( $feed_name ); $feed_saver->set_data( $preview_settings ); $atts = SBI_Feed_Builder::add_customizer_att( [ 'feed' => $feed_id, 'customizer' => true ] ); if ( ! empty( $preview_settings['id'] ) ) { $preview_settings['id'] = implode( ',', $preview_settings['id'] ); if ( isset( $preview_settings['user'] ) ) { unset( $preview_settings['user'] ); } } $return['feed_html'] = display_instagram( $atts, $preview_settings ); echo $return['feed_html']; } wp_die(); } /** * Used in AJAX call to return settings for an existing feed. * * @since 6.0 */ public static function get_feed_settings() { check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $feed_id = ! empty( $_POST['feed_id'] ) ? sanitize_key( $_POST['feed_id'] ) : false; if ( ! $feed_id ) { wp_die( 'no feed id' ); } $feed_saver = new SBI_Feed_Saver( $feed_id ); $settings = $feed_saver->get_feed_settings(); $return = array( 'settings' => $settings, 'feed_html' => '' ); if ( isset( $_POST['include_post_set'] ) && ! empty( $_POST['include_post_set'] ) ) { $atts = SBI_Feed_Builder::add_customizer_att( [ 'feed' => $return['feed_id'] ] ); $return['feed_html'] = display_instagram( $atts ); } echo sbi_json_encode( $return ); wp_die(); } /** * Get a list of feeds with a limit and offset like a page * * @since 6.0 */ public static function get_feed_list_page() { check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $args = array( 'page' => (int)$_POST['page'] ); $feeds_data = SBI_Feed_Builder::get_feed_list($args); echo sbi_json_encode( $feeds_data ); wp_die(); } /** * Get a list of locations with a limit and offset like a page * * @since 6.0 */ public static function get_locations_page() { check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $args = array( 'page' => (int)$_POST['page'] ); if ( ! empty( $_POST['is_legacy'] ) ) { $args['feed_id'] = sanitize_key( $_POST['feed_id'] ); } else { $args['feed_id'] = '*' . (int)$_POST['feed_id']; } $feeds_data = \SB_Instagram_Feed_Locator::instagram_feed_locator_query( $args ); if ( count( $feeds_data ) < SBI_Db::RESULTS_PER_PAGE ) { $args['html_location'] = array( 'footer', 'sidebar', 'header' ); $args['group_by'] = 'html_location'; $args['page'] = 1; $non_content_data = \SB_Instagram_Feed_Locator::instagram_feed_locator_query( $args ); $feeds_data = array_merge( $feeds_data, $non_content_data ); } echo sbi_json_encode( $feeds_data ); wp_die(); } /** * Return a single JSON string for importing a feed * * @param int $feed_id * * @return string * * @since 6.0 */ public static function get_export_json( $feed_id ) { $feed_saver = new SBI_Feed_Saver( $feed_id ); $settings = $feed_saver->get_feed_settings(); return sbi_json_encode( $settings ); } /** * All export strings for all feeds on the first 'page' * * @return array * * @since 6.0 */ public static function get_all_export_json() { $args = array( 'page' => 1 ); $feeds_data = SBI_Db::feeds_query( $args ); $return = array(); foreach ( $feeds_data as $single_feed ) { $return[ $single_feed['id'] ] = SBI_Feed_Saver_Manager::get_export_json( $single_feed['id'] ); } return $return; } /** * Use a JSON string to import a feed with settings and sources. The return * is whether or not the import was successful * * @param string $json * * @return array * * @since 6.0 */ public static function import_feed( $json ) { $settings_data = json_decode( $json, true ); $return = array( 'success' => false, 'message' => '' ); if ( empty( $settings_data['sources'] ) ) { $return['message'] = __( 'No feed source is included. Cannot upload feed.', 'instagram-feed' ); return $return; } $sources = $settings_data['sources']; unset( $settings_data['sources'] ); $settings_source = array(); foreach ( $sources as $source ) { if ( isset( $source['user_id'] ) ) { $source['account_id'] = $source['user_id']; $source['id'] = $source['user_id']; } if ( isset( $source['account_id'] ) ) { if ( isset( $source['record_id'] ) ) { unset( $source['record_id'] ); } $settings_source[] = $source['account_id']; // don't update or insert the access token if there is an API error if ( ! empty( $source['access_token'] ) && ! empty( $source['info'] ) ) { SBI_Source::update_or_insert( $source ); } } } $settings_data['sources'] = $settings_source; /* unset pro features if exists */ $settings_data = self::filter_save_data( $settings_data ); $feed_saver = new SBI_Feed_Saver( false ); $feed_saver->set_data( $settings_data ); if ( $feed_saver->update_or_insert() ) { $return = array( 'success' => true, 'feed_id' => $feed_saver->get_feed_id() ); return $return; } else { $return['message'] = __( 'Could not import feed. Please try again', 'instagram-feed' ); } return $return; } /** * Determines what table and sanitization should be used * when handling feed setting data. * * TODO: Add settings that need something other than sanitize_text_field * * @param string $key * * @return array * * @since 6.0 */ public static function get_data_type( $key ) { switch ( $key ) { case 'sources' : $return = array( 'table' => 'feed_settings', 'sanitization' => 'sanitize_text_field' ); break; case 'feed_title' : $return = array( 'table' => 'feeds', 'sanitization' => 'sanitize_text_field' ); break; case 'feed_name' : $return = array( 'table' => 'feeds', 'sanitization' => 'sanitize_text_field' ); break; case 'status' : $return = array( 'table' => 'feeds', 'sanitization' => 'sanitize_text_field' ); break; case 'author' : $return = array( 'table' => 'feeds', 'sanitization' => 'int' ); break; default: $return = array( 'table' => 'feed_settings', 'sanitization' => 'sanitize_text_field' ); break; } return $return; } /** * Uses the appropriate sanitization function and returns the result * for a value * * @param string $type * @param int|string $value * * @return int|string * * @since 6.0 */ public static function sanitize( $type, $value ) { switch ( $type ) { case 'int' : $return = intval( $value ); break; case 'boolean' : $return = self::cast_boolean($value); break; default: $return = sanitize_text_field( stripslashes($value) ); break; } return $return; } /** * Check if boolean * for a value * * @param string $type * @param int|string $value * * @return int|string * * @since 6.0 */ public static function is_boolean( $value ) { return ( $value === 'true' || $value === 'false' || is_bool($value) ) ? true : false; } public static function cast_boolean( $value ) { if($value === 'true' || $value === true || $value === 'on') return true; return false; } public static function filter_save_data( $save_data ) { if ( sbi_is_pro_version() ) { return $save_data; } $unsets = array( 'hoverdisplay', 'igtvposts', 'lightboxcomments', 'numcomments', 'stories', 'videosposts', 'videotypes', 'disablelightbox' ); foreach ( $unsets as $unset ) { if ( isset( $save_data[ $unset ] ) ) { unset( $save_data[ $unset ] ); } } return $save_data; } /** * Update Personal Account Info * Setting Avatar + Bio * * @return json * * @since 6.0.8 */ public static function sbi_update_personal_account(){ check_ajax_referer( 'sbi-admin' , 'nonce'); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } if( isset( $_FILES['avatar']['tmp_name'] ) && isset( $_POST['username'] ) ) { $account_avatar = sanitize_text_field( $_FILES['avatar']['tmp_name'] ); $username = sanitize_text_field( $_POST['username'] ); $created = \SB_Instagram_Connected_Account::create_local_avatar( $username, $account_avatar ); \SB_Instagram_Connected_Account::update_local_avatar_status( $username, $created ); } if( isset( $_POST['bio'] ) && isset( $_POST['id'] ) ){ $account_bio = sanitize_text_field( stripslashes( $_POST['bio'] ) ); $id = sanitize_text_field( wp_unslash( $_POST['id'] ) ); SBI_Source::update_personal_account_bio( $id, $account_bio ); } $response = array( 'success' => true, 'sourcesList' => SBI_Feed_Builder::get_source_list() ); echo sbi_json_encode( $response ); wp_die(); } } PKL\{``%instagram-feed/inc/Builder/SBI_Db.phpnu[prefix . 'sbi_sources'; $feeds_table_name = $wpdb->prefix . 'sbi_feeds'; $page = 0; if ( isset( $args['page'] ) ) { $page = (int) $args['page'] - 1; unset( $args['page'] ); } $offset = max( 0, $page * 400 ); if ( empty( $args ) ) { $limit = 400; $sql = "SELECT s.id, s.account_id, s.account_type, s.privilege, s.access_token, s.username, s.info, s.error, s.expires, count(f.id) as used_in FROM $sources_table_name s LEFT JOIN $feeds_table_name f ON f.settings LIKE CONCAT('%', s.account_id, '%') GROUP BY s.id, s.account_id LIMIT $limit OFFSET $offset; "; $results = $wpdb->get_results( $sql, ARRAY_A ); if ( empty( $results ) ) { return array(); } $i = 0; foreach ( $results as $result ) { if ( (int) $result['used_in'] > 0 ) { $results[ $i ]['instances'] = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $feeds_table_name WHERE settings LIKE CONCAT('%', %s, '%') GROUP BY id LIMIT 100; ", $result['account_id'] ), ARRAY_A ); } $i++; } return $results; } if ( ! empty( $args['expiring'] ) ) { $sql = $wpdb->prepare( " SELECT * FROM $sources_table_name WHERE account_type = 'personal' AND expires < %s AND last_updated < %s ORDER BY expires ASC LIMIT 5; ", gmdate( 'Y-m-d H:i:s', time() + SBI_REFRESH_THRESHOLD_OFFSET ), gmdate( 'Y-m-d H:i:s', time() - SBI_MINIMUM_INTERVAL ) ); return $wpdb->get_results( $sql, ARRAY_A ); } if ( ! empty( $args['username'] ) ) { return $wpdb->get_results( $wpdb->prepare( " SELECT * FROM $sources_table_name WHERE username = %s; ", $args['username'] ), ARRAY_A ); } if ( isset( $args['access_token'] ) && ! isset( $args['id'] ) ) { return $wpdb->get_results( $wpdb->prepare( " SELECT * FROM $sources_table_name WHERE access_token = %s; ", $args['access_token'] ), ARRAY_A ); } if ( ! isset( $args['id'] ) ) { return false; } if ( is_array( $args['id'] ) ) { $id_array = array(); foreach ( $args['id'] as $id ) { $id_array[] = esc_sql( $id ); } } elseif ( strpos( $args['id'], ',' ) !== false ) { $id_array = explode( ',', str_replace( ' ', '', esc_sql( $args['id'] ) ) ); } if ( isset( $id_array ) ) { $id_string = "'" . implode( "' , '", array_map( 'esc_sql', $id_array ) ) . "'"; } if ( ! empty( $args['all_business'] ) ) { $id_string = empty( $id_string ) ? '0' : $id_string; $sql = " SELECT * FROM $sources_table_name WHERE account_id IN ($id_string) OR account_type = 'business' "; return $wpdb->get_results( $sql, ARRAY_A ); } $privilege = ''; if ( ! empty( $privilege ) ) { if ( isset( $id_string ) ) { $sql = $wpdb->prepare( " SELECT * FROM $sources_table_name WHERE account_id IN ($id_string) AND privilege = %s; ", $privilege ); } else { $sql = $wpdb->prepare( " SELECT * FROM $sources_table_name WHERE account_id = %s AND privilege = %s; ", $args['id'], $privilege ); } } else { if ( isset( $id_string ) ) { $sql = " SELECT * FROM $sources_table_name WHERE account_id IN ($id_string); "; } else { $sql = $wpdb->prepare( " SELECT * FROM $sources_table_name WHERE account_id = %s; ", $args['id'] ); } } return $wpdb->get_results( $sql, ARRAY_A ); } /** * Update a source (connected account) * * @param array $to_update * @param array $where_data * * @return false|int * * @since 6.0 */ public static function source_update( $to_update, $where_data ) { global $wpdb; $sources_table_name = $wpdb->prefix . 'sbi_sources'; $encryption = new \SB_Instagram_Data_Encryption(); $data = array(); $where = array(); $format = array(); $where_format = array(); if ( isset( $to_update['type'] ) ) { $data['account_type'] = $to_update['type']; $format[] = '%s'; } if ( isset( $to_update['privilege'] ) ) { $data['privilege'] = $to_update['privilege']; $format[] = '%s'; } if ( isset( $to_update['id'] ) ) { $where['account_id'] = $to_update['id']; $where_format[] = '%s'; } if ( isset( $to_update['access_token'] ) ) { $data['access_token'] = $encryption->maybe_encrypt( $to_update['access_token'] ); $format[] = '%s'; } if ( isset( $to_update['username'] ) ) { $data['username'] = $to_update['username']; $format[] = '%s'; } if ( isset( $to_update['info'] ) ) { $data['info'] = $encryption->maybe_encrypt( $to_update['info'] ); $format[] = '%s'; } if ( isset( $to_update['error'] ) ) { $data['error'] = $to_update['error']; $format[] = '%s'; } if ( isset( $to_update['expires'] ) ) { $data['expires'] = $to_update['expires']; $format[] = '%s'; } if ( isset( $to_update['last_updated'] ) ) { $data['last_updated'] = $to_update['last_updated']; $format[] = '%s'; } if ( isset( $to_update['author'] ) ) { $data['author'] = $to_update['author']; $format[] = '%d'; } if ( isset( $where_data['type'] ) ) { $where['account_type'] = $where_data['type']; $where_format[] = '%s'; } if ( isset( $where_data['privilege'] ) ) { $where['privilege'] = $where_data['privilege']; $where_format[] = '%s'; } if ( isset( $where_data['author'] ) ) { $where['author'] = $where_data['author']; $where_format[] = '%d'; } if ( isset( $where_data['id'] ) ) { $where['account_id'] = $where_data['id']; $where_format[] = '%s'; } if ( isset( $where_data['record_id'] ) ) { $where['id'] = $where_data['record_id']; $where_format[] = '%d'; } $affected = $wpdb->update( $sources_table_name, $data, $where, $format, $where_format ); return $affected; } /** * New source (connected account) data is added to the * sbi_sources table and the new insert ID is returned * * @param array $to_insert * * @return false|int * * @since 6.0 */ public static function source_insert( $to_insert ) { global $wpdb; $sources_table_name = $wpdb->prefix . 'sbi_sources'; $encryption = new \SB_Instagram_Data_Encryption(); $data = array(); $format = array(); if ( isset( $to_insert['id'] ) ) { $data['account_id'] = $to_insert['id']; $format[] = '%s'; } if ( isset( $to_insert['type'] ) ) { $data['account_type'] = $to_insert['type']; $format[] = '%s'; } else { $data['account_type'] = 'page'; $format[] = '%s'; } if ( isset( $to_insert['privilege'] ) ) { $data['privilege'] = $to_insert['privilege']; $format[] = '%s'; } if ( isset( $to_insert['access_token'] ) ) { $data['access_token'] = $encryption->maybe_encrypt( $to_insert['access_token'] ); $format[] = '%s'; } if ( isset( $to_insert['username'] ) ) { $data['username'] = $to_insert['username']; $format[] = '%s'; } if ( isset( $to_insert['info'] ) ) { $data['info'] = $encryption->maybe_encrypt( $to_insert['info'] ); $format[] = '%s'; } if ( isset( $to_insert['error'] ) ) { $data['error'] = $to_insert['error']; $format[] = '%s'; } if ( isset( $to_insert['expires'] ) ) { $data['expires'] = $to_insert['expires']; $format[] = '%s'; } else { $data['expires'] = '2037-12-30 00:00:00'; $format[] = '%s'; } $data['last_updated'] = gmdate( 'Y-m-d H:i:s' ); $format[] = '%s'; if ( isset( $to_insert['author'] ) ) { $data['author'] = $to_insert['author']; $format[] = '%d'; } else { $data['author'] = get_current_user_id(); $format[] = '%d'; } return $wpdb->insert( $sources_table_name, $data, $format ); } /** * Query the to get feeds list for Elementor * * @param bool $default - if true, add a default option. * @return array * * @since 6.0 */ public static function elementor_feeds_query($default = false) { global $wpdb; $feeds_elementor = array(); $feeds_table_name = $wpdb->prefix . 'sbi_feeds'; $feeds_list = $wpdb->get_results( " SELECT id, feed_name FROM $feeds_table_name; " ); if ( ! empty( $feeds_list ) ) { foreach ( $feeds_list as $feed ) { $feeds_elementor[ $feed->id ] = $feed->feed_name; } } if ( $default ){ $feeds_elementor[0] = esc_html__( 'Choose a Feed', 'instagram-feed' ); } return $feeds_elementor; } /** * Count the sbi_feeds table * * @return int * * @since 6.0 */ public static function feeds_count() { global $wpdb; $feeds_table_name = $wpdb->prefix . 'sbi_feeds'; $results = $wpdb->get_results( "SELECT COUNT(*) AS num_entries FROM $feeds_table_name", ARRAY_A ); return isset( $results[0]['num_entries'] ) ? (int) $results[0]['num_entries'] : 0; } /** * Query the sbi_feeds table * * @param array $args * * @return array|bool * * @since 6.0 */ public static function feeds_query( $args = array() ) { global $wpdb; $feeds_table_name = $wpdb->prefix . 'sbi_feeds'; $page = 0; if ( isset( $args['page'] ) ) { $page = (int) $args['page'] - 1; unset( $args['page'] ); } $offset = max( 0, $page * self::RESULTS_PER_PAGE ); if ( isset( $args['id'] ) ) { $sql = $wpdb->prepare( " SELECT * FROM $feeds_table_name WHERE id = %d; ", $args['id'] ); } else { $sql = $wpdb->prepare( " SELECT * FROM $feeds_table_name LIMIT %d OFFSET %d;", self::RESULTS_PER_PAGE, $offset ); } return $wpdb->get_results( $sql, ARRAY_A ); } /** * Update feed data in the sbi_feed table * * @param array $to_update * @param array $where_data * * @return false|int * * @since 6.0 */ public static function feeds_update( $to_update, $where_data ) { global $wpdb; $feeds_table_name = $wpdb->prefix . 'sbi_feeds'; $data = array(); $where = array(); $format = array(); foreach ( $to_update as $single_insert ) { if ( $single_insert['key'] ) { $data[ $single_insert['key'] ] = $single_insert['values'][0]; $format[] = '%s'; } } if ( isset( $where_data['id'] ) ) { $where['id'] = $where_data['id']; $where_format = array( '%d' ); } elseif ( isset( $where_data['feed_name'] ) ) { $where['feed_name'] = $where_data['feed_name']; $where_format = array( '%s' ); } else { return false; } $data['last_modified'] = gmdate( 'Y-m-d H:i:s' ); $format[] = '%s'; $affected = $wpdb->update( $feeds_table_name, $data, $where, $format, $where_format ); return $affected; } /** * New feed data is added to the sbi_feeds table and * the new insert ID is returned * * @param array $to_insert * * @return false|int * * @since 6.0 */ public static function feeds_insert( $to_insert ) { global $wpdb; $feeds_table_name = $wpdb->prefix . 'sbi_feeds'; $data = array(); $format = array(); foreach ( $to_insert as $single_insert ) { if ( $single_insert['key'] ) { $data[ $single_insert['key'] ] = $single_insert['values'][0]; $format[] = '%s'; } } $data['last_modified'] = gmdate( 'Y-m-d H:i:s' ); $format[] = '%s'; $data['author'] = get_current_user_id(); $format[] = '%d'; $wpdb->insert( $feeds_table_name, $data, $format ); return $wpdb->insert_id; } /** * Query the sbi_feeds table * Porcess to define the name of the feed when adding new * * @param string $sourcename * * @return array|bool * * @since 6.0 */ public static function feeds_query_name( $sourcename ) { global $wpdb; $feeds_table_name = $wpdb->prefix . 'sbi_feeds'; $sql = $wpdb->prepare( "SELECT * FROM $feeds_table_name WHERE feed_name LIKE %s;", $wpdb->esc_like( $sourcename ) . '%' ); $count = count( $wpdb->get_results( $sql, ARRAY_A ) ); return ( $count === 0 ) ? $sourcename : $sourcename . ' (' . ( $count + 1 ) . ')'; } /** * Query to Remove Feeds from Database * * @param array $feed_ids_array * * @since 6.0 */ public static function delete_feeds_query( $feed_ids_array ) { global $wpdb; $feeds_table_name = $wpdb->prefix . 'sbi_feeds'; $feed_caches_table_name = $wpdb->prefix . 'sbi_feed_caches'; $sanitized_feed_ids_array = array(); foreach ( $feed_ids_array as $id ) { $sanitized_feed_ids_array[] = absint( $id ); } $feed_ids_array = implode( ',', $sanitized_feed_ids_array ); $wpdb->query( "DELETE FROM $feeds_table_name WHERE id IN ($feed_ids_array)" ); $wpdb->query( "DELETE FROM $feed_caches_table_name WHERE feed_id IN ($feed_ids_array)" ); echo sbi_json_encode( SBI_Feed_Builder::get_feed_list() ); wp_die(); } /** * Query to Remove Source from Database * * @param array $source_id * * @since 6.0.6 */ public static function delete_source( $source_id ) { global $wpdb; $sources_table_name = $wpdb->prefix . 'sbi_sources'; return $wpdb->query( $wpdb->prepare( "DELETE FROM $sources_table_name WHERE id = %d; ", $source_id ) ); } /** * Query to Remove Source from Database * * @param array $source_id * * @since 6.0 */ public static function delete_source_query( $source_id ) { global $wpdb; $sources_table_name = $wpdb->prefix . 'sbi_sources'; $wpdb->query( $wpdb->prepare( "DELETE FROM $sources_table_name WHERE id = %d; ", $source_id ) ); echo sbi_json_encode( SBI_Feed_Builder::get_source_list() ); wp_die(); } /** * Query to Remove Source from Database * * @param array $source_id * * @since 6.0 */ public static function delete_source_by_account_id( $source_id ) { global $wpdb; $sources_table_name = $wpdb->prefix . 'sbi_sources'; $wpdb->query( $wpdb->prepare( "DELETE FROM $sources_table_name WHERE account_id = %s; ", $source_id ) ); } /** * Query to Duplicate a Single Feed * * @param int $feed_id * * @since 6.0 */ public static function duplicate_feed_query( $feed_id ) { global $wpdb; $feeds_table_name = $wpdb->prefix . 'sbi_feeds'; $wpdb->query( $wpdb->prepare( "INSERT INTO $feeds_table_name (feed_name, settings, author, status) SELECT CONCAT(feed_name, ' (copy)'), settings, author, status FROM $feeds_table_name WHERE id = %d; ", $feed_id ) ); echo sbi_json_encode( SBI_Feed_Builder::get_feed_list() ); wp_die(); } /** * Get cache records in the sbi_feed_caches table * * @param array $args * * @return array|object|null */ public static function feed_caches_query( $args ) { global $wpdb; $feed_cache_table_name = $wpdb->prefix . 'sbi_feed_caches'; if ( ! isset( $args['cron_update'] ) ) { $sql = " SELECT * FROM $feed_cache_table_name;"; } else { if ( ! isset( $args['additional_batch'] ) ) { $sql = $wpdb->prepare( " SELECT * FROM $feed_cache_table_name WHERE cron_update = 'yes' ORDER BY last_updated ASC LIMIT %d;", self::RESULTS_PER_CRON_UPDATE ); } else { $sql = $wpdb->prepare( " SELECT * FROM $feed_cache_table_name WHERE cron_update = 'yes' AND last_updated < %s ORDER BY last_updated ASC LIMIT %d;", gmdate( 'Y-m-d H:i:s', time() - HOUR_IN_SECONDS ), self::RESULTS_PER_CRON_UPDATE ); } } return $wpdb->get_results( $sql, ARRAY_A ); } /** * Creates all database tables used in the new admin area in * the 6.0 update. * * TODO: Add error reporting * * @since 6.0 */ public static function create_tables( $include_charset_collate = true ) { if ( ! function_exists( 'dbDelta' ) ) { require_once ABSPATH . '/wp-admin/includes/upgrade.php'; } global $wpdb; $max_index_length = 191; $charset_collate = ''; if ( $include_charset_collate && method_exists( $wpdb, 'get_charset_collate' ) ) { // get_charset_collate introduced in WP 3.5 $charset_collate = $wpdb->get_charset_collate(); } $feeds_table_name = $wpdb->prefix . 'sbi_feeds'; if ( $wpdb->get_var( "show tables like '$feeds_table_name'" ) !== $feeds_table_name ) { $sql = " CREATE TABLE $feeds_table_name ( id bigint(20) unsigned NOT NULL auto_increment, feed_name text NOT NULL default '', feed_title text NOT NULL default '', settings longtext NOT NULL default '', author bigint(20) unsigned NOT NULL default '1', status varchar(255) NOT NULL default '', last_modified datetime NOT NULL, PRIMARY KEY (id), KEY author (author) ) $charset_collate; "; $wpdb->query( $sql ); } $error = $wpdb->last_error; $query = $wpdb->last_query; $had_error = false; if ( $wpdb->get_var( "show tables like '$feeds_table_name'" ) !== $feeds_table_name ) { $had_error = true; } if ( ! $had_error ) { } $feed_caches_table_name = $wpdb->prefix . 'sbi_feed_caches'; if ( $wpdb->get_var( "show tables like '$feed_caches_table_name'" ) !== $feed_caches_table_name ) { $sql = ' CREATE TABLE ' . $feed_caches_table_name . " ( id bigint(20) unsigned NOT NULL auto_increment, feed_id varchar(255) NOT NULL default '', cache_key varchar(255) NOT NULL default '', cache_value longtext NOT NULL default '', cron_update varchar(20) NOT NULL default 'yes', last_updated datetime NOT NULL, PRIMARY KEY (id), KEY feed_id (feed_id($max_index_length)) ) $charset_collate;"; $wpdb->query( $sql ); } $error = $wpdb->last_error; $query = $wpdb->last_query; $had_error = false; if ( $wpdb->get_var( "show tables like '$feed_caches_table_name'" ) !== $feed_caches_table_name ) { $had_error = true; } if ( ! $had_error ) { } $sources_table_name = $wpdb->prefix . 'sbi_sources'; if ( $wpdb->get_var( "show tables like '$sources_table_name'" ) !== $sources_table_name ) { $sql = ' CREATE TABLE ' . $sources_table_name . " ( id bigint(20) unsigned NOT NULL auto_increment, account_id varchar(255) NOT NULL default '', account_type varchar(255) NOT NULL default '', privilege varchar(255) NOT NULL default '', access_token varchar(1000) NOT NULL default '', username varchar(255) NOT NULL default '', info text NOT NULL default '', error text NOT NULL default '', expires datetime NOT NULL, last_updated datetime NOT NULL, author bigint(20) unsigned NOT NULL default '1', PRIMARY KEY (id), KEY account_type (account_type($max_index_length)), KEY author (author) ) $charset_collate;"; $wpdb->query( $sql ); } $error = $wpdb->last_error; $query = $wpdb->last_query; $had_error = false; if ( $wpdb->get_var( "show tables like '$sources_table_name'" ) !== $sources_table_name ) { $had_error = true; } if ( ! $had_error ) { } } public static function create_sources_database() { // not needed } public static function clear_sbi_feed_caches() { global $wpdb; $feed_caches_table_name = $wpdb->prefix . 'sbi_feed_caches'; if ( $wpdb->get_var( "show tables like '$feed_caches_table_name'" ) === $feed_caches_table_name ) { $wpdb->query( "DELETE FROM $feed_caches_table_name" ); } } public static function clear_sbi_sources() { global $wpdb; $sources_table_name = $wpdb->prefix . 'sbi_sources'; if ( $wpdb->get_var( "show tables like '$sources_table_name'" ) === $sources_table_name ) { $wpdb->query( "DELETE FROM $sources_table_name" ); } } public static function reset_tables() { global $wpdb; $feeds_table_name = $wpdb->prefix . 'sbi_feeds'; $wpdb->query( "DROP TABLE IF EXISTS $feeds_table_name" ); $feed_caches_table_name = $wpdb->prefix . 'sbi_feed_caches'; $wpdb->query( "DROP TABLE IF EXISTS $feed_caches_table_name" ); $sources_table_name = $wpdb->prefix . 'sbi_sources'; $wpdb->query( "DROP TABLE IF EXISTS $sources_table_name" ); } public static function reset_db_update() { update_option( 'sbi_db_version', 1.9 ); delete_option( 'sbi_legacy_feed_settings' ); // are there existing feeds to toggle legacy onboarding? $sbi_statuses_option = get_option( 'sbi_statuses', array() ); if ( isset( $sbi_statuses_option['legacy_onboarding'] ) ) { unset( $sbi_statuses_option['legacy_onboarding'] ); } if ( isset( $sbi_statuses_option['support_legacy_shortcode'] ) ) { unset( $sbi_statuses_option['support_legacy_shortcode'] ); } global $wpdb; $table_name = $wpdb->prefix . 'usermeta'; $wpdb->query( " DELETE FROM $table_name WHERE `meta_key` LIKE ('sbi\_%') " ); $feed_locator_table_name = esc_sql( $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR ); $results = $wpdb->query( " DELETE FROM $feed_locator_table_name WHERE feed_id LIKE '*%';" ); update_option( 'sbi_statuses', $sbi_statuses_option ); } public static function reset_legacy() { //Settings delete_option( 'sbi_statuses' ); delete_option( 'sb_instagram_settings' ); delete_option( 'sbi_ver' ); delete_option( 'sb_expired_tokens' ); delete_option( 'sbi_cron_report' ); delete_option( 'sb_instagram_errors' ); delete_option( 'sb_instagram_ajax_status' ); delete_option( 'sbi_db_version' ); // Clear backup caches global $wpdb; $table_name = $wpdb->prefix . 'options'; $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%!sbi\_%') " ); $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%\_transient\_&sbi\_%') " ); $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%\_transient\_timeout\_&sbi\_%') " ); $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%sb_wlupdated_%') " ); //image resizing $upload = wp_upload_dir(); $posts_table_name = $wpdb->prefix . 'sbi_instagram_posts'; $feeds_posts_table_name = esc_sql( $wpdb->prefix . 'sbi_instagram_feeds_posts' ); $image_files = glob( trailingslashit( $upload['basedir'] ) . trailingslashit( SBI_UPLOADS_NAME ) . '*' ); // get all file names foreach ( $image_files as $file ) { // iterate files if ( is_file( $file ) ) { unlink( $file ); } // delete file } //Delete tables $wpdb->query( "DROP TABLE IF EXISTS $posts_table_name" ); $wpdb->query( "DROP TABLE IF EXISTS $feeds_posts_table_name" ); $locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; $wpdb->query( "DROP TABLE IF EXISTS $locator_table_name" ); $table_name = $wpdb->prefix . 'options'; $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%\_transient\_\$sbi\_%') " ); $wpdb->query( " DELETE FROM $table_name WHERE `option_name` LIKE ('%\_transient\_timeout\_\$sbi\_%') " ); delete_option( 'sbi_hashtag_ids' ); delete_option( 'sb_instagram_errors' ); delete_option( 'sbi_usage_tracking_config' ); delete_option( 'sbi_usage_tracking' ); delete_option( 'sbi_oembed_token' ); delete_option( 'sbi_top_api_calls' ); delete_option( 'sbi_rating_notice' ); delete_option( 'sbi_refresh_report' ); delete_option( 'sbi_welcome_seen' ); delete_option( 'sbi_notifications' ); delete_option( 'sbi_newuser_notifications' ); global $wp_roles; $wp_roles->remove_cap( 'administrator', 'manage_instagram_feed_options' ); wp_clear_scheduled_hook( 'sbi_feed_update' ); wp_clear_scheduled_hook( 'sbi_usage_tracking_cron' ); } /** * Query to Get Single source * * @param array $source_id * * @since 6.0.8 */ public static function get_source_by_account_id( $source_id ) { global $wpdb; $sources_table_name = $wpdb->prefix . 'sbi_sources'; $sql = $wpdb->prepare( "SELECT * FROM $sources_table_name WHERE account_id = %s; ", $source_id ); return $wpdb->get_row( $sql, ARRAY_A ); } } PKL\1J/instagram-feed/inc/Builder/SBI_Feed_Builder.phpnu[init(); } /** * Init the Builder. * * @since 6.0 */ function init() { if ( is_admin() ) { add_action( 'admin_menu', array( $this, 'register_menu' ) ); // add ajax listeners SBI_Feed_Saver_Manager::hooks(); SBI_Source::hooks(); self::hooks(); } } /** * Mostly AJAX related hooks * * @since 6.0 */ public static function hooks() { add_action( 'wp_ajax_sbi_dismiss_onboarding', array( 'InstagramFeed\Builder\SBI_Feed_Builder', 'after_dismiss_onboarding' ) ); add_action( 'wp_ajax_sbi_other_plugins_modal', array( 'InstagramFeed\Builder\SBI_Feed_Builder', 'sb_other_plugins_modal' ) ); } /** * Register Menu. * * @since 6.0 */ public function register_menu() { $cap = current_user_can( 'manage_instagram_feed_options' ) ? 'manage_instagram_feed_options' : 'manage_options'; $cap = apply_filters( 'sbi_settings_pages_capability', $cap ); $feed_builder = add_submenu_page( 'sb-instagram-feed', __( 'All Feeds', 'instagram-feed' ), __( 'All Feeds', 'instagram-feed' ), $cap, 'sbi-feed-builder', array( $this, 'feed_builder' ), 0 ); add_action( 'load-' . $feed_builder, array( $this, 'builder_enqueue_admin_scripts' ) ); } /** * Enqueue Builder CSS & Script. * * Loads only for builder pages * * @since 6.0 */ public function builder_enqueue_admin_scripts() { if ( get_current_screen() ) : $screen = get_current_screen(); if ( strpos( $screen->id, 'sbi-feed-builder' ) !== false || strpos( $screen->id, 'sbi-setup' ) !== false ) : $installed_plugins = get_plugins(); $newly_retrieved_source_connection_data = SBI_Source::maybe_source_connection_data(); $license_key = get_option( 'sbi_license_key', '' ); $upgrade_url = 'https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free&utm_source=lite-upgrade-bar'; $active_extensions = array( // Fake 'feedLayout' => false, 'headerLayout' => false, 'postStyling' => false, 'lightbox' => false, 'filtermoderation' => false, 'shoppablefeed' => false, ); $sbi_builder = array( 'ajax_handler' => admin_url( 'admin-ajax.php' ), 'pluginType' => 'free', 'licenseType' => sbi_is_pro_version() ? 'pro' : 'free', 'isSetupPage' => strpos( $screen->id, 'sbi-setup' ) !== false ? 'true' : 'false', 'builderUrl' => admin_url( 'admin.php?page=sbi-feed-builder' ), 'setUpUrl' => admin_url( 'admin.php?page=sbi-setup' ), 'upgradeUrl' => $upgrade_url, 'activeExtensions' => $active_extensions, 'pluginUrl' => trailingslashit( SBI_PLUGIN_URL ), 'nonce' => wp_create_nonce( 'sbi-admin' ), 'admin_nonce' => wp_create_nonce( 'sbi_admin_nonce' ), 'adminPostURL' => admin_url( 'post.php' ), 'widgetsPageURL' => admin_url( 'widgets.php' ), 'themeSupportsWidgets' => current_theme_supports( 'widgets' ), 'supportPageUrl' => admin_url( 'admin.php?page=sbi-support' ), 'genericText' => self::get_generic_text(), 'welcomeScreen' => array( 'mainHeading' => __( 'All Feeds', 'instagram-feed' ), 'createFeed' => __( 'Create your Feed', 'instagram-feed' ), 'createFeedDescription' => __( 'Connect your Instagram account and choose a feed type', 'instagram-feed' ), 'customizeFeed' => __( 'Customize your feed type', 'instagram-feed' ), 'customizeFeedDescription' => __( 'Choose layouts, color schemes, styles and more', 'instagram-feed' ), 'embedFeed' => __( 'Embed your feed', 'instagram-feed' ), 'embedFeedDescription' => __( 'Easily add the feed anywhere on your website', 'instagram-feed' ), 'customizeImgPath' => SBI_BUILDER_URL . 'assets/img/welcome-1.png', 'embedImgPath' => SBI_BUILDER_URL . 'assets/img/welcome-2.png', ), 'pluginsInfo' => array( 'social_wall' => array( 'installed' => isset( $installed_plugins['social-wall/social-wall.php'] ) ? true : false, 'activated' => is_plugin_active( 'social-wall/social-wall.php' ), 'settingsPage' => admin_url( 'admin.php?page=sbsw' ), ) ), 'allFeedsScreen' => array( 'mainHeading' => __( 'All Feeds', 'instagram-feed' ), 'columns' => array( 'nameText' => __( 'Name', 'instagram-feed' ), 'shortcodeText' => __( 'Shortcode', 'instagram-feed' ), 'instancesText' => __( 'Instances', 'instagram-feed' ), 'actionsText' => __( 'Actions', 'instagram-feed' ), ), 'bulkActions' => __( 'Bulk Actions', 'instagram-feed' ), 'legacyFeeds' => array( 'heading' => __( 'Legacy Feeds', 'instagram-feed' ), 'toolTip' => __( 'What are Legacy Feeds?', 'instagram-feed' ), 'toolTipExpanded' => array( __( 'Legacy feeds are older feeds from before the version 6 update. You can edit settings for these feeds by using the "Settings" button to the right. These settings will apply to all legacy feeds, just like the settings before version 6, and work in the same way that they used to.', 'instagram-feed' ), __( 'You can also create a new feed, which will now have it\'s own individual settings. Modifying settings for new feeds will not affect other feeds.', 'instagram-feed' ), ), 'toolTipExpandedAction' => array( __( 'Legacy feeds represent shortcodes of old feeds found on your website before
the version 6 update.', 'instagram-feed' ), __( 'To edit Legacy feed settings, you will need to use the "Settings" button above
or edit their shortcode settings directly. To delete a legacy feed, simply remove the
shortcode wherever it is being used on your site.', 'instagram-feed' ), ), 'show' => __( 'Show Legacy Feeds', 'instagram-feed' ), 'hide' => __( 'Hide Legacy Feeds', 'instagram-feed' ), ), 'socialWallLinks' => self::get_social_wall_links(), 'onboarding' => $this->get_onboarding_text() ), 'dialogBoxPopupScreen' => array( 'deleteSource' => array( 'heading' => __( 'Delete "#"?', 'instagram-feed' ), 'description' => __( 'This source is being used in a feed on your site. If you delete this source then new posts can no longer be retrieved for these feeds.', 'instagram-feed' ), ), 'deleteSourceCustomizer' => array( 'heading' => __( 'Delete "#"?', 'instagram-feed' ), 'description' => __( 'You are going to delete this source. To retrieve it, you will need to add it again. Are you sure you want to continue?', 'instagram-feed' ), ), 'deleteSingleFeed' => array( 'heading' => __( 'Delete "#"?', 'instagram-feed' ), 'description' => __( 'You are going to delete this feed. You will lose all the settings. Are you sure you want to continue?', 'instagram-feed' ), ), 'deleteMultipleFeeds' => array( 'heading' => __( 'Delete Feeds?', 'instagram-feed' ), 'description' => __( 'You are going to delete these feeds. You will lose all the settings. Are you sure you want to continue?', 'instagram-feed' ), ), 'backAllToFeed' => array( 'heading' => __( 'Are you Sure?', 'instagram-feed' ), 'description' => __( 'Are you sure you want to leave this page, all unsaved settings will be lost, please make sure to save before leaving.', 'instagram-feed' ), 'customButtons' => array( 'confirm' => array( 'text' => __( 'Save and Exit', 'instagram-feed' ), 'color' => 'blue', ), 'cancel' => array( 'text' => __( 'Exit without Saving', 'instagram-feed' ), 'color' => 'red', ), ), ), 'unsavedFeedSources' => array( 'heading' => __( 'You have unsaved changes', 'instagram-feed' ), 'description' => __( 'If you exit without saving, all the changes you made will be reverted.', 'instagram-feed' ), 'customButtons' => array( 'confirm' => array( 'text' => __( 'Save and Exit', 'instagram-feed' ), 'color' => 'blue' ), 'cancel' => array( 'text' => __( 'Exit without Saving', 'instagram-feed' ), 'color' => 'red' ) ) ) ), 'selectFeedTypeScreen' => array( 'mainHeading' => __( 'Create an Instagram Feed', 'instagram-feed' ), 'feedTypeHeading' => __( 'Select Feed Type', 'instagram-feed' ), 'mainDescription' => __( 'Select one or more feed types. You can add or remove them later.', 'instagram-feed' ), 'updateHeading' => __( 'Update Feed Type', 'instagram-feed' ), 'advancedHeading' => __( 'Advanced Feeds', 'instagram-feed' ), 'anotherFeedTypeHeading' => __( 'Add Another Source Type', 'instagram-feed' ), ), 'mainFooterScreen' => array( 'heading' => sprintf( __( 'Upgrade to the %1$sAll Access Bundle%2$s to get all of our Pro Plugins', 'instagram-feed' ), '', '' ), 'description' => __( 'Includes all Smash Balloon plugins for one low price: Instagram, Facebook, Twitter, YouTube, and Social Wall', 'instagram-feed' ), 'promo' => sprintf( __( '%1$sBonus%2$s Lite users get %3$s50% Off%4$s automatically applied at checkout', 'instagram-feed' ), '', '', '', '' ), ), 'embedPopupScreen' => array( 'heading' => __( 'Embed Feed', 'instagram-feed' ), 'description' => __( 'Add the unique shortcode to any page, post, or widget:', 'instagram-feed' ), 'description_2' => current_theme_supports( 'widgets' ) ? __( 'Or use the built in WordPress block or widget', 'instagram-feed' ) : __( 'Or use the built in WordPress block', 'instagram-feed' ), 'addPage' => __( 'Add to a Page', 'instagram-feed' ), 'addWidget' => __( 'Add to a Widget', 'instagram-feed' ), 'selectPage' => __( 'Select Page', 'instagram-feed' ), ), 'links' => self::get_links_with_utm(), 'pluginsInfo' => array( 'social_wall' => array( 'installed' => isset( $installed_plugins['social-wall/social-wall.php'] ) ? true : false, 'activated' => is_plugin_active( 'social-wall/social-wall.php' ), 'settingsPage' => admin_url( 'admin.php?page=sbsw' ), ) ), 'selectSourceScreen' => self::select_source_screen_text(), 'feedTypes' => $this->get_feed_types(), 'advancedFeedTypes' => $this->get_advanced_feed_types(), 'socialInfo' => $this->get_smashballoon_info(), 'svgIcons' => $this->builder_svg_icons(), 'installPluginsPopup' => $this->install_plugins_popup(), 'feeds' => self::get_feed_list(), 'itemsPerPage' => SBI_Db::RESULTS_PER_PAGE, 'feedsCount' => SBI_Db::feeds_count(), 'sources' => self::get_source_list(), 'sourceConnectionURLs' => SBI_Source::get_connection_urls(), 'legacyFeeds' => $this->get_legacy_feed_list(), 'extensionsPopup' => array( 'hashtag' => array( 'heading' => __( 'Upgrade to Pro to get Hashtag Feeds', 'instagram-feed' ), 'description' => __( 'Display posts from any public hashtag with an Instagram hashtag feed. Great for pulling in user-generated content associated with your brand, running promotional hashtag campaigns, engaging audiences at events, and more.', 'instagram-feed' ), 'img' => '', 'bullets' => array( 'heading' => __( 'And get much more!', 'instagram-feed' ), 'content' => array( __( 'Display Hashtag & Tagged feeds', 'instagram-feed' ), __( 'Powerful visual moderation', 'instagram-feed' ), __( 'Comments and Likes', 'instagram-feed' ), __( 'Highlight specific posts', 'instagram-feed' ), __( 'Multiple layout options', 'instagram-feed' ), __( 'Popup photo/video lightbox', 'instagram-feed' ), __( 'Instagram Stories', 'instagram-feed' ), __( 'Shoppable feeds', 'instagram-feed' ), __( 'Pro support', 'instagram-feed' ), __( 'Post captions', 'instagram-feed' ), __( 'Combine multiple feed types', 'instagram-feed' ), __( '30 day money back guarantee', 'instagram-feed' ), ) ), 'buyUrl' => sprintf( 'https://smashballoon.com/instagram-feed/demo/hashtag?utm_campaign=instagram-free&utm_source=feed-type&utm_medium=hashtag' ) ), 'tagged' => array( 'heading' => __( 'Upgrade to Pro to get Tagged Posts Feed', 'instagram-feed' ), 'description' => __( 'Display posts that you\'ve been tagged in by other users allowing you to increase your audience\'s engagement with your Instagram account.', 'instagram-feed' ), 'img' => '', 'bullets' => array( 'heading' => __( 'And get much more!', 'instagram-feed' ), 'content' => array( __( 'Display Hashtag & Tagged feeds', 'instagram-feed' ), __( 'Powerful visual moderation', 'instagram-feed' ), __( 'Comments and Likes', 'instagram-feed' ), __( 'Highlight specific posts', 'instagram-feed' ), __( 'Multiple layout options', 'instagram-feed' ), __( 'Popup photo/video lightbox', 'instagram-feed' ), __( 'Instagram Stories', 'instagram-feed' ), __( 'Shoppable feeds', 'instagram-feed' ), __( 'Pro support', 'instagram-feed' ), __( 'Post captions', 'instagram-feed' ), __( 'Combine multiple feed types', 'instagram-feed' ), __( '30 day money back guarantee', 'instagram-feed' ), ) ), 'buyUrl' => sprintf( 'https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free&utm_source=feed-type&utm_medium=tagged' ) ), 'socialwall' => array( // Combine all your social media channels into one Social Wall 'heading' => '' . __( 'Combine all your social media channels into one', 'instagram-feed' ) .' '. __( 'Social Wall', 'instagram-feed' ).'', 'description' => '' . __( 'A dash of Instagram, a sprinkle of Facebook, a spoonful of Twitter, and a dollop of YouTube, all in the same feed.', 'instagram-feed' ) . '', 'img' => '', 'demoUrl' => 'https://smashballoon.com/social-wall/demo/?utm_campaign=instagram-free&utm_source=feed-type&utm_medium=social-wall&utm_content=learn-more', 'buyUrl' => sprintf( 'https://smashballoon.com/social-wall/demo/?license_key=%s&upgrade=true&utm_campaign=instagram-free&utm_source=feed-type&utm_medium=social-wall&utm_content=Try Demo', $license_key ), 'bullets' => array( 'heading' => __( 'Upgrade to the All Access Bundle and get:', 'instagram-feed' ), 'content' => array( __( 'Instagram Feed Pro', 'instagram-feed' ), __( 'Custom Twitter Feeds Pro', 'instagram-feed' ), __( 'YouTube Feeds Pro', 'instagram-feed' ), __( 'Custom Facebook Feed Pro', 'instagram-feed' ), __( 'All Pro Facebook Extensions', 'instagram-feed' ), __( 'Social Wall Pro', 'instagram-feed' ), ) ), ), // Other Types 'feedLayout' => array( 'heading' => __( 'Upgrade to Pro to get Feed Layouts', 'instagram-feed' ), 'description' => __( 'Choose from one of our built-in layout options; grid, carousel, masonry, and highlight to allow you to showcase your content in any way you want.', 'instagram-feed' ), 'img' => '', 'bullets' => array( 'heading' => __( 'And get much more!', 'instagram-feed' ), 'content' => array( __( 'Display Hashtag & Tagged feeds', 'instagram-feed' ), __( 'Powerful visual moderation', 'instagram-feed' ), __( 'Comments and Likes', 'instagram-feed' ), __( 'Highlight specific posts', 'instagram-feed' ), __( 'Multiple layout options', 'instagram-feed' ), __( 'Popup photo/video lightbox', 'instagram-feed' ), __( 'Instagram Stories', 'instagram-feed' ), __( 'Shoppable feeds', 'instagram-feed' ), __( 'Pro support', 'instagram-feed' ), __( 'Post captions', 'instagram-feed' ), __( 'Combine multiple feed types', 'instagram-feed' ), __( '30 day money back guarantee', 'instagram-feed' ), ) ), 'buyUrl' => sprintf( 'https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free&utm_source=customizer&utm_medium=feed-layouts' ) ), 'headerLayout' => array( 'heading' => __( 'Get Stories, Followers and Advanced Header Options', 'instagram-feed' ), 'description' => __( 'Got stories to tell? We want to help you share them. Display Instagram stories right on your website in a pop-up lightbox to keep your users engaged and on your website for longer.', 'instagram-feed' ), 'img' => '', 'bullets' => array( 'heading' => __( 'And get much more!', 'instagram-feed' ), 'content' => array( __( 'Display Hashtag & Tagged feeds', 'instagram-feed' ), __( 'Powerful visual moderation', 'instagram-feed' ), __( 'Comments and Likes', 'instagram-feed' ), __( 'Highlight specific posts', 'instagram-feed' ), __( 'Multiple layout options', 'instagram-feed' ), __( 'Popup photo/video lightbox', 'instagram-feed' ), __( 'Instagram Stories', 'instagram-feed' ), __( 'Shoppable feeds', 'instagram-feed' ), __( 'Pro support', 'instagram-feed' ), __( 'Post captions', 'instagram-feed' ), __( 'Combine multiple feed types', 'instagram-feed' ), __( '30 day money back guarantee', 'instagram-feed' ), ) ), 'buyUrl' => sprintf( 'https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free&utm_source=customizer&utm_medium=header' ) ), 'postStyling' => array( 'heading' => __( 'Display Captions, Likes, and Comments', 'instagram-feed' ), 'description' => __( 'Upgrade to Pro to display post captions below each post and in the lightbox, which can be crawled by search engines to help boost SEO.', 'instagram-feed' ), 'img' => '', 'bullets' => array( 'heading' => __( 'And get much more!', 'instagram-feed' ), 'content' => array( __( 'Display Hashtag & Tagged feeds', 'instagram-feed' ), __( 'Powerful visual moderation', 'instagram-feed' ), __( 'Comments and Likes', 'instagram-feed' ), __( 'Highlight specific posts', 'instagram-feed' ), __( 'Multiple layout options', 'instagram-feed' ), __( 'Popup photo/video lightbox', 'instagram-feed' ), __( 'Instagram Stories', 'instagram-feed' ), __( 'Shoppable feeds', 'instagram-feed' ), __( 'Pro support', 'instagram-feed' ), __( 'Post captions', 'instagram-feed' ), __( 'Combine multiple feed types', 'instagram-feed' ), __( '30 day money back guarantee', 'instagram-feed' ), ) ), 'buyUrl' => sprintf( 'https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free&utm_source=customizer&utm_medium=posts' ) ), 'lightbox' => array( 'heading' => __( 'Upgrade to Pro to enable the popup Lightbox', 'instagram-feed' ), 'description' => __( 'Allow visitors to view your photos and videos in a beautiful full size lightbox, keeping them on your site for longer to discover more of your content.', 'instagram-feed' ), 'img' => '', 'bullets' => array( 'heading' => __( 'And get much more!', 'instagram-feed' ), 'content' => array( __( 'Display Hashtag & Tagged feeds', 'instagram-feed' ), __( 'Powerful visual moderation', 'instagram-feed' ), __( 'Comments and Likes', 'instagram-feed' ), __( 'Highlight specific posts', 'instagram-feed' ), __( 'Multiple layout options', 'instagram-feed' ), __( 'Popup photo/video lightbox', 'instagram-feed' ), __( 'Instagram Stories', 'instagram-feed' ), __( 'Shoppable feeds', 'instagram-feed' ), __( 'Pro support', 'instagram-feed' ), __( 'Post captions', 'instagram-feed' ), __( 'Combine multiple feed types', 'instagram-feed' ), __( '30 day money back guarantee', 'instagram-feed' ), ) ), 'buyUrl' => sprintf( 'https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free&utm_source=customizer&utm_medium=lightbox' ) ), 'filtermoderation' => array( 'heading' => __( 'Get Advanced Moderation and Filters with Pro', 'instagram-feed' ), 'description' => __( 'Use powerful moderation tools to create feeds of only specific chosen posts, or exclude specific chosen posts. You can also automatically include or exclude posts based on a word or hashtag found in the caption.', 'instagram-feed' ), 'img' => '', 'bullets' => array( 'heading' => __( 'And get much more!', 'instagram-feed' ), 'content' => array( __( 'Display Hashtag & Tagged feeds', 'instagram-feed' ), __( 'Powerful visual moderation', 'instagram-feed' ), __( 'Comments and Likes', 'instagram-feed' ), __( 'Highlight specific posts', 'instagram-feed' ), __( 'Multiple layout options', 'instagram-feed' ), __( 'Popup photo/video lightbox', 'instagram-feed' ), __( 'Instagram Stories', 'instagram-feed' ), __( 'Shoppable feeds', 'instagram-feed' ), __( 'Pro support', 'instagram-feed' ), __( 'Post captions', 'instagram-feed' ), __( 'Combine multiple feed types', 'instagram-feed' ), __( '30 day money back guarantee', 'instagram-feed' ), ) ), 'buyUrl' => sprintf( 'https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free&utm_source=customizer&utm_medium=filters' ) ), 'shoppablefeed' => array( 'heading' => __( 'Upgrade to Pro to Get Shoppable Feeds', 'instagram-feed' ), 'description' => __( 'Automatically link Instagram posts to custom URLs of your choosing by adding the URL in the caption, or manually add links to specific pages or products on your site (or other sites) in a quick and easy way.', 'instagram-feed' ), 'img' => '', 'bullets' => array( 'heading' => __( 'And get much more!', 'instagram-feed' ), 'content' => array( __( 'Display Hashtag & Tagged feeds', 'instagram-feed' ), __( 'Powerful visual moderation', 'instagram-feed' ), __( 'Comments and Likes', 'instagram-feed' ), __( 'Highlight specific posts', 'instagram-feed' ), __( 'Multiple layout options', 'instagram-feed' ), __( 'Popup photo/video lightbox', 'instagram-feed' ), __( 'Instagram Stories', 'instagram-feed' ), __( 'Shoppable feeds', 'instagram-feed' ), __( 'Pro support', 'instagram-feed' ), __( 'Post captions', 'instagram-feed' ), __( 'Combine multiple feed types', 'instagram-feed' ), __( '30 day money back guarantee', 'instagram-feed' ), ) ), 'buyUrl' => sprintf( 'https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free&utm_source=customizer&utm_medium=shoppable' ) ), ), 'personalAccountScreen' => self::personal_account_screen_text(), 'onboardingWizardContent' => \InstagramFeed\admin\SBI_Onboarding_wizard::get_onboarding_wizard_content() ); if ( $newly_retrieved_source_connection_data ) { $sbi_builder['newSourceData'] = $newly_retrieved_source_connection_data; } if ( isset( $_GET['manualsource'] ) && $_GET['manualsource'] == true ) { $sbi_builder['manualSourcePopupInit'] = true; } $maybe_feed_customizer_data = SBI_Feed_Saver_Manager::maybe_feed_customizer_data(); if ( $maybe_feed_customizer_data ) { sb_instagram_scripts_enqueue( true ); $sbi_builder['customizerFeedData'] = $maybe_feed_customizer_data; $sbi_builder['customizerSidebarBuilder'] = \InstagramFeed\Builder\Tabs\SBI_Builder_Customizer_Tab::get_customizer_tabs(); $sbi_builder['wordpressPageLists'] = $this->get_wp_pages(); $sbi_builder['instagram_feed_dismiss_lite'] = get_transient( 'instagram_feed_dismiss_lite' ); if ( ! isset( $_GET['feed_id'] ) || $_GET['feed_id'] === 'legacy' ) { $feed_id = 'legacy'; $customizer_atts = array( 'feed' => 'legacy', 'customizer' => true ); } elseif ( intval( $_GET['feed_id'] ) > 0 ) { $feed_id = intval( $_GET['feed_id'] ); $customizer_atts = array( 'feed' => $feed_id, 'customizer' => true ); } if ( ! empty( $feed_id ) ) { $settings_preview = self::add_customizer_att( $customizer_atts ); if ( $feed_id === 'legacy' ) { $preview_settings = \SB_Instagram_Settings::get_legacy_feed_settings(); $preview_settings['customizer'] = true; $sbi_builder['feedInitOutput'] = htmlspecialchars( display_instagram( $customizer_atts, $preview_settings ) ); } else { $sbi_builder['feedInitOutput'] = htmlspecialchars( display_instagram( $settings_preview, true ) ); } } // Date global $wp_locale; wp_enqueue_script( 'sbi-date_i18n', SBI_PLUGIN_URL . 'admin/builder/assets/js/date_i18n.js', null, SBIVER, true ); $monthNames = array_map( array( &$wp_locale, 'get_month' ), range( 1, 12 ) ); $monthNamesShort = array_map( array( &$wp_locale, 'get_month_abbrev' ), $monthNames ); $dayNames = array_map( array( &$wp_locale, 'get_weekday' ), range( 0, 6 ) ); $dayNamesShort = array_map( array( &$wp_locale, 'get_weekday_abbrev' ), $dayNames ); wp_localize_script( 'sbi-date_i18n', 'DATE_I18N', array( 'month_names' => $monthNames, 'month_names_short' => $monthNamesShort, 'day_names' => $dayNames, 'day_names_short' => $dayNamesShort ) ); } wp_enqueue_style( 'sbi-builder-style', SBI_PLUGIN_URL . 'admin/builder/assets/css/builder.css', false, SBIVER ); self::global_enqueue_ressources_scripts(); wp_enqueue_script( 'sbi-builder-app', SBI_PLUGIN_URL . 'admin/builder/assets/js/builder.js', null, SBIVER, true ); // Customize screens $sbi_builder['customizeScreens'] = $this->get_customize_screens_text(); wp_localize_script( 'sbi-builder-app', 'sbi_builder', $sbi_builder ); wp_enqueue_media(); endif; endif; } /** * Get WP Pages List * * @return array * * @since 6.0 */ public function get_wp_pages() { $pagesList = get_pages(); $pagesResult = array(); if ( is_array( $pagesList ) ) { foreach ( $pagesList as $page ) { array_push( $pagesResult, array( 'id' => $page->ID, 'title' => $page->post_title ) ); } } return $pagesResult; } /** * Global JS + CSS Files * * Shared JS + CSS ressources for the admin panel * * @since 6.0 */ public static function global_enqueue_ressources_scripts( $is_settings = false ) { wp_enqueue_style( 'feed-global-style', SBI_PLUGIN_URL . 'admin/builder/assets/css/global.css', false, SBIVER ); wp_enqueue_script( 'sb-vue', SBI_PLUGIN_URL . 'js/vue.min.js', null, '2.6.12', true ); wp_enqueue_script( 'feed-colorpicker-vue', SBI_PLUGIN_URL . 'admin/builder/assets/js/vue-color.min.js', null, SBIVER, true ); wp_enqueue_script( 'feed-builder-ressources', SBI_PLUGIN_URL . 'admin/builder/assets/js/ressources.js', null, SBIVER, true ); wp_enqueue_script( 'sb-dialog-box', SBI_PLUGIN_URL . 'admin/builder/assets/js/confirm-dialog.js', null, SBIVER, true ); wp_enqueue_script( 'install-plugin-popup', SBI_PLUGIN_URL . 'admin/builder/assets/js/install-plugin-popup.js', null, SBIVER, true ); wp_enqueue_script( 'sb-add-source', SBI_PLUGIN_URL . 'admin/builder/assets/js/add-source.js', null, SBIVER, true ); $newly_retrieved_source_connection_data = SBI_Source::maybe_source_connection_data(); $sbi_source = array( 'sources' => self::get_source_list(), 'sourceConnectionURLs' => SBI_Source::get_connection_urls( $is_settings ), 'nonce' => wp_create_nonce( 'sbi-admin' ), ); if ( $newly_retrieved_source_connection_data ) { $sbi_source['newSourceData'] = $newly_retrieved_source_connection_data; } if ( isset( $_GET['manualsource'] ) && $_GET['manualsource'] == true ) { $sbi_source['manualSourcePopupInit'] = true; } wp_localize_script( 'sb-add-source', 'sbi_source', $sbi_source ); wp_enqueue_script( 'sb-personal-account', SBI_PLUGIN_URL . 'admin/builder/assets/js/personal-account.js', null, SBIVER, true ); $sbi_personal_account = array( 'personalAccountScreen' => self::personal_account_screen_text(), 'nonce' => wp_create_nonce( 'sbi-admin' ), 'ajaxHandler' => admin_url( 'admin-ajax.php' ), ); wp_localize_script( 'sb-personal-account', 'sbi_personal_account', $sbi_personal_account ); } /** * Get Generic text * * @return array * * @since 6.0 */ public static function get_generic_text() { $icons = self::builder_svg_icons(); return array( 'done' => __( 'Done', 'instagram-feed' ), 'title' => __( 'Settings', 'instagram-feed' ), 'dashboard' => __( 'Dashboard', 'instagram-feed' ), 'setup' => __( 'Setup', 'instagram-feed' ), 'addNew' => __( 'Add New', 'instagram-feed' ), 'addSource' => __( 'Add Source', 'instagram-feed' ), 'addAnotherSource' => __( 'Add another Source', 'instagram-feed' ), 'addSourceType' => __( 'Add Another Source Type', 'instagram-feed' ), 'previous' => __( 'Previous', 'instagram-feed' ), 'next' => __( 'Next', 'instagram-feed' ), 'finish' => __( 'Finish', 'instagram-feed' ), 'new' => __( 'New', 'instagram-feed' ), 'update' => __( 'Update', 'instagram-feed' ), 'upgrade' => __( 'Try the Pro Demo', 'instagram-feed' ), 'settings' => __( 'Settings', 'instagram-feed' ), 'back' => __( 'Back', 'instagram-feed' ), 'backAllFeeds' => __( 'Back to all feeds', 'instagram-feed' ), 'createFeed' => __( 'Create Feed', 'instagram-feed' ), 'add' => __( 'Add', 'instagram-feed' ), 'change' => __( 'Change', 'instagram-feed' ), 'getExtention' => __( 'Get Extension', 'instagram-feed' ), 'viewDemo' => __( 'View Demo', 'instagram-feed' ), 'includes' => __( 'Includes', 'instagram-feed' ), 'photos' => __( 'Photos', 'instagram-feed' ), 'photo' => __( 'Photo', 'instagram-feed' ), 'apply' => __( 'Apply', 'instagram-feed' ), 'copy' => __( 'Copy', 'instagram-feed' ), 'edit' => __( 'Edit', 'instagram-feed' ), 'duplicate' => __( 'Duplicate', 'instagram-feed' ), 'delete' => __( 'Delete', 'instagram-feed' ), 'remove' => __( 'Remove', 'instagram-feed' ), 'removeSource' => __( 'Remove Source', 'instagram-feed' ), 'shortcode' => __( 'Shortcode', 'instagram-feed' ), 'clickViewInstances' => __( 'Click to view Instances', 'instagram-feed' ), 'usedIn' => __( 'Used in', 'instagram-feed' ), 'place' => __( 'place', 'instagram-feed' ), 'places' => __( 'places', 'instagram-feed' ), 'item' => __( 'Item', 'instagram-feed' ), 'items' => __( 'Items', 'instagram-feed' ), 'learnMore' => __( 'Learn More', 'instagram-feed' ), 'location' => __( 'Location', 'instagram-feed' ), 'page' => __( 'Page', 'instagram-feed' ), 'copiedClipboard' => __( 'Copied to Clipboard', 'instagram-feed' ), 'feedImported' => __( 'Feed imported successfully', 'instagram-feed' ), 'failedToImportFeed' => __( 'Failed to import feed', 'instagram-feed' ), 'timeline' => __( 'Timeline', 'instagram-feed' ), 'help' => __( 'Help', 'instagram-feed' ), 'admin' => __( 'Admin', 'instagram-feed' ), 'member' => __( 'Member', 'instagram-feed' ), 'reset' => __( 'Reset', 'instagram-feed' ), 'preview' => __( 'Preview', 'instagram-feed' ), 'name' => __( 'Name', 'instagram-feed' ), 'id' => __( 'ID', 'instagram-feed' ), 'token' => __( 'Token', 'instagram-feed' ), 'confirm' => __( 'Confirm', 'instagram-feed' ), 'cancel' => __( 'Cancel', 'instagram-feed' ), 'clear' => __( 'Clear', 'instagram-feed' ), 'clearFeedCache' => __( 'Clear Feed Cache', 'instagram-feed' ), 'saveSettings' => __( 'Save Changes', 'instagram-feed' ), 'feedName' => __( 'Feed Name', 'instagram-feed' ), 'shortcodeText' => __( 'Shortcode', 'instagram-feed' ), 'general' => __( 'General', 'instagram-feed' ), 'feeds' => __( 'Feeds', 'instagram-feed' ), 'translation' => __( 'Translation', 'instagram-feed' ), 'advanced' => __( 'Advanced', 'instagram-feed' ), 'error' => __( 'Error:', 'instagram-feed' ), 'errorNotice' => __( 'There was an error when trying to connect to Instagram.', 'instagram-feed' ), 'errorDirections' => '' . __( 'Directions on How to Resolve This Issue', 'instagram-feed' ) . '', 'errorSource' => __( 'Source Invalid', 'instagram-feed' ), 'errorEncryption' => __( 'Encryption Error', 'instagram-feed' ), 'invalid' => __( 'Invalid', 'instagram-feed' ), 'reconnect' => __( 'Reconnect', 'instagram-feed' ), 'feed' => __( 'feed', 'instagram-feed' ), 'sourceNotUsedYet' => __( 'Source is not used yet', 'instagram-feed' ), 'addImage' => __( 'Add Image', 'instagram-feed' ), 'businessRequired' => __( 'Business Account required', 'instagram-feed' ), 'selectedPost' => __( 'Selected Post', 'instagram-feed' ), 'productLink' => __( 'Product Link', 'instagram-feed' ), 'enterProductLink' => __( 'Add your product URL here', 'instagram-feed' ), 'editSources' => __( 'Edit Sources', 'instagram-feed' ), 'moderateFeed' => __( 'Moderate your feed', 'instagram-feed' ), 'moderateFeedSaveExit' => __( 'Save and Exit', 'instagram-feed' ), 'moderationMode' => __( 'Moderation Mode', 'instagram-feed' ), 'moderationModeEnterPostId' => __( 'Or Enter Post IDs to hide manually', 'instagram-feed' ), 'moderationModeTextareaPlaceholder' => __( 'Add words here to hide any posts containing these words', 'instagram-feed' ), 'filtersAndModeration' => __( 'Filters & Moderation', 'instagram-feed' ), 'topRated' => __( 'Top Rated', 'instagram-feed' ), 'mostRecent' => __( 'Most recent', 'instagram-feed' ), 'moderationModePreview' => __( 'Moderation Mode Preview', 'instagram-feed' ), 'exitSetup' => __( 'Exit Setup', 'instagram-feed' ), 'notification' => array( 'feedSaved' => array( 'type' => 'success', 'text' => __( 'Feed saved successfully', 'instagram-feed' ) ), 'feedSavedError' => array( 'type' => 'error', 'text' => __( 'Error saving Feed', 'instagram-feed' ) ), 'previewUpdated' => array( 'type' => 'success', 'text' => __( 'Preview updated successfully', 'instagram-feed' ) ), 'carouselLayoutUpdated' => array( 'type' => 'success', 'text' => __( 'Carousel updated successfully', 'instagram-feed' ) ), 'unkownError' => array( 'type' => 'error', 'text' => __( 'Unknown error occurred', 'instagram-feed' ) ), 'cacheCleared' => array( 'type' => 'success', 'text' => __( 'Feed cache cleared', 'instagram-feed' ) ), 'selectSourceError' => array( 'type' => 'error', 'text' => __( 'Please select a source for your feed', 'instagram-feed' ) ), 'commentCacheCleared' => array( 'type' => 'success', 'text' => __( 'Comment cache cleared', 'instagram-feed' ) ), 'personalAccountUpdated' => array( 'type' => 'success', 'text' => __( 'Personal account updated', 'instagram-feed' ) ) ), 'install' => __( 'Install', 'instagram-feed' ), 'installed' => __( 'Installed', 'instagram-feed' ), 'activate' => __( 'Activate', 'instagram-feed' ), 'installedAndActivated' => __( 'Installed & Activated', 'instagram-feed' ), 'free' => __( 'Free', 'instagram-feed' ), 'invalidLicenseKey' => __( 'Invalid license key', 'instagram-feed' ), 'licenseActivated' => __( 'License activated', 'instagram-feed' ), 'licenseDeactivated' => __( 'License Deactivated', 'instagram-feed' ), 'carouselLayoutUpdated' => array( 'type' => 'success', 'text' => __( 'Carousel Layout updated', 'instagram-feed' ) ), 'getMoreFeatures' => __( 'Get more features with Instagram Feed Pro', 'instagram-feed' ), 'liteFeedUsers' => __( 'Lite users get 50% OFF', 'instagram-feed' ), 'liteFeedUsersAutoApply' => __( 'Lite Feed Users get a 50% OFF (auto-applied at checkout)', 'instagram-feed' ), 'liteFeedUsersSimpleText' => __( 'Lite Feed Users get a 50% OFF', 'instagram-feed' ), 'liteFeedUsersAutoCheckout' => __( 'auto-applied at checkout', 'instagram-feed' ), 'tryDemo' => __( 'Try Demo', 'instagram-feed' ), 'displayImagesVideos' => __( 'Display images and videos in posts', 'instagram-feed' ), 'viewLikesShares' => __( 'View likes, shares and comments', 'instagram-feed' ), 'allFeedTypes' => __( 'All Feed Types: Photos, Albums, Events and more', 'instagram-feed' ), 'abilityToLoad' => __( 'Ability to “Load More” posts', 'instagram-feed' ), 'ctaHashtag' => __( 'Display Hashtag Feeds', 'instagram-feed' ), 'ctaLayout' => __( 'Carousel, Masonry, & Highlight layouts', 'instagram-feed' ), 'ctaPopups' => __( 'View posts in a pop-up lightbox', 'instagram-feed' ), 'ctaFilter' => __( 'Powerful post filtering and moderation', 'instagram-feed' ), 'andMuchMore' => __( 'And Much More!', 'instagram-feed' ), 'sbiFreeCTAFeatures' => array( __( 'Create shoppable feeds', 'instagram-feed' ), __( 'Combine multiple feed types', 'instagram-feed' ), __( 'Display likes, captions & comments', 'instagram-feed' ), __( 'Instagram Stories', 'instagram-feed' ), __( 'Play videos in your feed', 'instagram-feed' ), __( 'Highlight specific posts', 'instagram-feed' ), __( 'Display tagged posts', 'instagram-feed' ), __( '30 day money back guarantee', 'instagram-feed' ), __( 'Fast, friendly, and effective support', 'instagram-feed' ), ), 'ctaShowFeatures' => __( 'Show Features', 'instagram-feed' ), 'ctaHideFeatures' => __( 'Hide Features', 'instagram-feed' ), 'upgradeToPro' => __( 'Upgrade to Pro', 'instagram-feed' ), 'redirectLoading' => array( 'heading' => __( 'Redirecting to connect.smashballoon.com', 'instagram-feed' ), 'description' => __( 'You will be redirected to our app so you can connect your account in 5 seconds', 'instagram-feed' ), ), 'addAccountInfo' => __( 'Add Avatar and Bio', 'instagram-feed' ), 'updateAccountInfo' => __( 'Update Avatar and Bio', 'instagram-feed' ), 'personalAccountUpdated' => __( 'Personal account updated', 'instagram-feed' ), ); } /** * Select Source Screen Text * * @return array * * @since 4.0 */ public static function select_source_screen_text() { return array( 'mainHeading' => __( 'Select one or more sources', 'instagram-feed' ), 'description' => __( 'Sources are Instagram accounts your feed will display content from', 'instagram-feed' ), 'emptySourceDescription' => __( 'Looks like you have not added any source.
Use “Add Source” to add a new one.', 'instagram-feed' ), 'mainHashtagHeading' => __( 'Enter Public Hashtags', 'instagram-feed' ), 'hashtagDescription' => __( 'Add one or more hashtag separated by comma', 'instagram-feed' ), 'hashtagGetBy' => __( 'Fetch posts that are', 'instagram-feed' ), 'sourcesListPopup' => array( 'user' => array( 'mainHeading' => __( 'Add a source for Timeline', 'instagram-feed' ), 'description' => __( 'Select or add an account you want to display the timeline for', 'instagram-feed' ), ), 'tagged' => array( 'mainHeading' => __( 'Add a source for Mentions', 'instagram-feed' ), 'description' => __( 'Select or add an account you want to display the mentions for', 'instagram-feed' ), ) ), 'perosnalAccountToolTipTxt' => array( __( 'Due to changes in Instagram’s new API, we can no
longer get mentions for personal accounts. To
enable this for your account, you will need to convert it to
a Business account. Learn More', 'instagram-feed' ), ), 'groupsToolTip' => array( __( 'Due to Facebook limitations, it\'s not possible to display photo feeds from a Group, only a Page.', 'instagram-feed' ) ), 'updateHeading' => __( 'Update Source', 'instagram-feed' ), 'updateDescription' => __( 'Select a source from your connected Facebook Pages and Groups. Or, use "Add New" to connect a new one.', 'instagram-feed' ), 'updateFooter' => __( 'Add multiple Facebook Pages or Groups to a feed with our Multifeed extension', 'instagram-feed' ), 'noSources' => __( 'Please add a source in order to display a feed. Go to the "Settings" tab -> "Sources" section -> Click "Add New" to connect a source.', 'instagram-feed' ), 'multipleTypes' => array( 'user' => array( 'heading' => __( 'User Timeline', 'instagram-feed' ), 'icon' => 'user', 'description' => __( 'Connect an account to show posts for it.', 'instagram-feed' ), 'actionType' => 'addSource' ), 'hashtag' => array( 'heading' => __( 'Hashtag', 'instagram-feed' ), 'icon' => 'hashtag', 'description' => __( 'Add one or more hashtag separated by comma.', 'instagram-feed' ), 'businessRequired' => true, 'actionType' => 'inputHashtags' ), 'tagged' => array( 'heading' => __( 'Tagged', 'instagram-feed' ), 'icon' => 'mention', 'description' => __( 'Connect an account to show tagged posts. This does not give us any permission to manage your Instagram account.', 'instagram-feed' ), 'businessRequired' => true, 'actionType' => 'addSource' ) ), 'modal' => array( 'addNew' => __( 'Connect your Instagram Account', 'instagram-feed' ), 'selectSourceType' => __( 'Select Account Type', 'instagram-feed' ), 'connectAccount' => __( 'Connect an Instagram Account', 'instagram-feed' ), 'connectAccountDescription' => __( 'This does not give us permission to manage your Instagram account, it simply allows the plugin to see a list of them and retrieve their public content from the API.', 'instagram-feed' ), 'connect' => __( 'Connect', 'instagram-feed' ), 'alreadyHave' => __( 'Already have a API Token and Access Key for your account?', 'instagram-feed' ), 'addManuallyLink' => __( 'Add Account Manually', 'instagram-feed' ), 'selectAccount' => __( 'Select an Instagram Account', 'instagram-feed' ), 'showing' => __( 'Showing', 'instagram-feed' ), 'facebook' => __( 'Facebook', 'instagram-feed' ), 'businesses' => __( 'Businesses', 'instagram-feed' ), 'groups' => __( 'Groups', 'instagram-feed' ), 'connectedTo' => __( 'connected to', 'instagram-feed' ), 'addManually' => __( 'Add a Source Manually', 'instagram-feed' ), 'addSource' => __( 'Add Source', 'instagram-feed' ), 'sourceType' => __( 'Source Type', 'instagram-feed' ), 'accountID' => __( 'Instagram Account ID', 'instagram-feed' ), 'fAccountID' => __( 'Instagram Account ID', 'instagram-feed' ), 'eventAccessToken' => __( 'Event Access Token', 'instagram-feed' ), 'enterID' => __( 'Enter ID', 'instagram-feed' ), 'accessToken' => __( 'Instagram Access Token', 'instagram-feed' ), 'enterToken' => __( 'Enter Token', 'instagram-feed' ), 'addApp' => __( 'Add Instagram App to your group', 'instagram-feed' ), 'addAppDetails' => __( 'To get posts from your group, Instagram requires the "Smash Balloon Plugin" app to be added in your group settings. Just follow the directions here:', 'instagram-feed' ), 'addAppSteps' => array( __( 'Go to your group settings page by ', 'instagram-feed' ), sprintf( __( 'Search for "Smash Balloon" and select our app %1$s(see screenshot)%2$s', 'instagram-feed' ), '', 'Thumbnail Layout' ), __( 'Click "Add" and you are done.', 'instagram-feed' ) ), 'alreadyExists' => __( 'Account already exists', 'instagram-feed' ), 'alreadyExistsExplanation' => __( 'The Instagram account you added is already connected as a “Business” account. Would you like to replace it with a “Personal“ account? (Note: Personal accounts cannot be used to display Tagged or Hashtag feeds.)', 'instagram-feed' ), 'replaceWithPersonal' => __( 'Replace with Personal', 'instagram-feed' ), 'notAdmin' => __( 'For groups you are not an administrator of', 'instagram-feed' ), 'disclaimerMentions' => __( 'Due to Instagram’s limitations, you need to connect a business account to display a Mentions timeline', 'instagram-feed' ), 'disclaimerHashtag' => __( 'Due to Instagram’s limitations, you need to connect a business account to display a Hashtag feed', 'instagram-feed' ), 'notSureToolTip' => __( 'Select "Personal" if displaying a regular feed of posts, as this can display feeds from either a Personal or Business account. For displaying a Hashtag or Tagged feed, you must have an Instagram Business account. If needed, you can convert a Personal account into a Business account by following the directions {link}here{link}.', 'instagram-feed' ) ), 'footer' => array( 'heading' => __( 'Add feeds for popular social platforms with our other plugins', 'instagram-feed' ), ), 'personal' => __( 'Personal', 'instagram-feed' ), 'business' => __( 'Business', 'instagram-feed' ), 'notSure' => __( "I'm not sure", 'instagram-feed' ), ); } /** * For Other Platforms listed on the footer widget * * @return array * * @since 6.0 */ public static function builder_svg_icons() { $builder_svg_icons = array( 'rocketPremiumBlue' => '', 'youtube' => '', 'tiktok' => ' ', 'twitter' => '', 'instagram' => '', 'facebook' => '', 'reviews' => ' ', 'smash' => '', 'tag' => '', 'copy' => '', 'duplicate' => '', 'edit' => '', 'delete' => '', 'checkmark' => '', 'checkmarklarge' => '', 'information' => '', 'cog' => '', 'angleUp' => '', 'user_check' => '', 'users' => '', 'info' => '', 'list' => '', 'grid' => '', 'masonry' => '', 'carousel' => '', 'highlight' => '', 'desktop' => '', 'tablet' => '', 'mobile' => '', 'feed_layout' => '', 'color_scheme' => '', 'header' => '', 'article' => '', 'article_2' => '', 'like_box' => '', 'load_more' => '', 'lightbox' => '', 'source' => '', 'filter' => '', 'update' => '', 'sun' => '', 'moon' => '', 'visual' => '', 'text' => '', 'background' => '', 'cursor' => '', 'link' => '', 'thumbnail' => '', 'halfwidth' => '', 'fullwidth' => '', 'boxed' => '', 'corner' => '', 'preview' => '', 'flag' => '', 'copy2' => '', 'timelineIcon' => ' ', 'photosIcon' => ' ', 'videosIcon' => ' ', 'albumsIcon' => ' ', 'eventsIcon' => ' ', 'reviewsIcon' => ' ', 'featuredpostIcon' => ' ', 'singlealbumIcon' => ' ', 'socialwallIcon' => ' ', 'addPage' => '', 'addWidget' => '', 'plus' => '', 'eye1' => '', 'eyePreview' => '', 'facebookShare' => '', 'twitterShare' => '', 'linkedinShare' => '', 'mailShare' => '', 'successNotification' => '', 'errorNotification' => '', 'messageNotification' => '', 'albumsPreview' => ' ', 'featuredPostPreview' => ' ', 'issueSinglePreview' => ' ', 'playButton' => '', 'spinner' => '', 'rocket' => '', 'follow' => '', 'picture' => '', 'caption' => '', 'heart' => '', 'sort' => '', 'shop' => '', 'headerUser' => '', 'headerPhoto' => '', 'imageChooser' => '', 'usertimelineIcon' => ' ', 'publichashtagIcon' => ' ', 'taggedpostsIcon' => ' ', 'socialwall1Icon' => ' ', 'publichashtagIconFree' => '', 'taggedpostsIconFree' => '', 'socialwall1IconFree' => ' ', 'user' => '', 'hashtag' => '', 'mention' => '', 'tooltipHelpSvg' => '', 'shoppableDisabled' => ' ', 'shoppableEnabled' => ' ', 'ctaBoxes' => array( 'hashtag' => '', 'layout' => '', 'popups' => '', 'filter' => '' ), 'camera' => '', 'uploadFile' => '', 'addRoundIcon' =>'', 'loaderSVG' => '' ); return $builder_svg_icons; } public static function sb_other_plugins_modal() { check_ajax_referer( 'sbi_nonce', 'sbi_nonce' ); if ( ! current_user_can( 'activate_plugins' ) || ! current_user_can( 'install_plugins' ) ) { wp_send_json_error(); } $plugin = isset( $_POST['plugin'] ) ? sanitize_key( $_POST['plugin'] ) : ''; $sb_other_plugins = self::install_plugins_popup(); $plugin = isset( $sb_other_plugins[ $plugin ] ) ? $sb_other_plugins[ $plugin ] : false; if ( ! $plugin ) { wp_send_json_error(); } // Build the content for modals $output = '
' . $plugin['svgIcon'] . '

' . $plugin['name'] . 'Free

' . $plugin['author'] . '

' . $plugin['description'] . '

'; $plugin_install_data = array( 'step' => 'install', 'action' => 'sbi_install_addon', 'nonce' => wp_create_nonce( 'sbi-admin' ), 'plugin' => $plugin['plugin'], 'download_plugin' => $plugin['download_plugin'], ); if ( ! $plugin['installed'] ) { $output .= sprintf( "
", sbi_json_encode( $plugin_install_data ), __( 'Install', 'instagram-feed' ) ); } if ( $plugin['installed'] && ! $plugin['activated'] ) { $plugin_install_data['step'] = 'activate'; $plugin_install_data['action'] = 'sbi_activate_addon'; $output .= sprintf( "", sbi_json_encode( $plugin_install_data ), __( 'Activate', 'instagram-feed' ) ); } if ( $plugin['installed'] && $plugin['activated'] ) { $output .= sprintf( "", __( 'Plugin installed & activated', 'instagram-feed' ) ); } wp_send_json_success( ['output' => $output] ); wp_die(); } /** * Plugins information for plugin install modal in all feeds page on select source flow * * @since 6.0 * * @return array */ public static function install_plugins_popup() { // get the WordPress's core list of installed plugins if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $installed_plugins = get_plugins(); $is_tiktok_installed = false; $tiktok_plugin = 'feeds-for-tiktok/feeds-for-tiktok.php'; if ( isset( $installed_plugins['tiktok-feeds-pro/tiktok-feeds-pro.php'] ) ) { $is_tiktok_installed = true; $tiktok_plugin = 'tiktok-feeds-pro/tiktok-feeds-pro.php'; } elseif ( isset( $installed_plugins['feeds-for-tiktok/feeds-for-tiktok.php'] ) ) { $is_tiktok_installed = true; } $is_reviews_installed = false; $reviews_plugin = 'reviews-feed/sb-reviews.php'; if ( isset( $installed_plugins['reviews-feed-pro/sb-reviews-pro.php'] ) ) { $is_reviews_installed = true; $reviews_plugin = 'reviews-feed-pro/sb-reviews-pro.php'; } elseif ( isset( $installed_plugins['reviews-feed/sb-reviews.php'] ) ) { $is_reviews_installed = true; } $is_facebook_installed = false; $facebook_plugin = 'custom-facebook-feed/custom-facebook-feed.php'; if ( isset( $installed_plugins['custom-facebook-feed-pro/custom-facebook-feed.php'] ) ) { $is_facebook_installed = true; $facebook_plugin = 'custom-facebook-feed/custom-facebook-feed.php'; } elseif ( isset( $installed_plugins['custom-facebook-feed/custom-facebook-feed.php'] ) ) { $is_facebook_installed = true; } $is_twitter_installed = false; $twitter_plugin = 'custom-twitter-feeds/custom-twitter-feed.php'; if ( isset( $installed_plugins['custom-twitter-feeds-pro/custom-twitter-feed.php'] ) ) { $is_twitter_installed = true; $twitter_plugin = 'custom-twitter-feeds-pro/custom-twitter-feed.php'; } elseif ( isset( $installed_plugins['custom-twitter-feeds/custom-twitter-feed.php'] ) ) { $is_twitter_installed = true; } $is_youtube_installed = false; $youtube_plugin = 'feeds-for-youtube/youtube-feed.php'; if ( isset( $installed_plugins['youtube-feed-pro/youtube-feed.php'] ) ) { $is_youtube_installed = true; $youtube_plugin = 'youtube-feed-pro/youtube-feed.php'; } elseif ( isset( $installed_plugins['feeds-for-youtube/youtube-feed.php'] ) ) { $is_youtube_installed = true; } $return = array( 'reviews' => array( 'displayName' => __( 'Reviews', 'instagram-feed' ), 'name' => __( 'Reviews Feed', 'instagram-feed' ), 'author' => __( 'By Smash Balloon', 'instagram-feed' ), 'description' => __( 'To display a Reviews feed, our Reviews plugin is required.
Increase conversions and build positive brand trust through Google and Yelp reviews from your customers. Provide social proof needed to turn visitors into customers.', 'instagram-feed' ), 'dashboard_permalink' => admin_url( 'admin.php?page=sbr' ), 'svgIcon' => ' ', 'installed' => $is_reviews_installed, 'activated' => is_plugin_active( $reviews_plugin ), 'plugin' => $reviews_plugin, 'download_plugin' => 'https://downloads.wordpress.org/plugin/reviews-feed.zip', ), 'facebook' => array( 'displayName' => __( 'Facebook', 'instagram-feed' ), 'name' => __( 'Facebook Feed', 'instagram-feed' ), 'author' => __( 'By Smash Balloon', 'instagram-feed' ), 'description' => __( 'To display a Facebook feed, our Facebook plugin is required.
It provides a clean and beautiful way to add your Facebook posts to your website. Grab your visitors attention and keep them engaged with your site longer.', 'instagram-feed' ), 'dashboard_permalink' => admin_url( 'admin.php?page=cff-feed-builder' ), 'svgIcon' => '', 'installed' => $is_facebook_installed, 'activated' => is_plugin_active( $facebook_plugin ), 'plugin' => $facebook_plugin, 'download_plugin' => 'https://downloads.wordpress.org/plugin/custom-facebook-feed.zip', ), 'twitter' => array( 'displayName' => __( 'Twitter', 'instagram-feed' ), 'name' => __( 'Twitter Feed', 'instagram-feed' ), 'author' => __( 'By Smash Balloon', 'instagram-feed' ), 'description' => __( 'Custom Twitter Feeds is a highly customizable way to display tweets from your Twitter account. Promote your latest content and update your site content automatically.', 'instagram-feed' ), 'dashboard_permalink' => admin_url( 'admin.php?page=custom-twitter-feeds' ), 'svgIcon' => '', 'installed' => $is_twitter_installed, 'activated' => is_plugin_active( $twitter_plugin ), 'plugin' => $twitter_plugin, 'download_plugin' => 'https://downloads.wordpress.org/plugin/custom-twitter-feeds.zip', ), 'youtube' => array( 'displayName' => __( 'YouTube', 'instagram-feed' ), 'name' => __( 'Feeds for YouTube', 'instagram-feed' ), 'author' => __( 'By Smash Balloon', 'instagram-feed' ), 'description' => __( 'To display a YouTube feed, our YouTube plugin is required. It provides a simple yet powerful way to display videos from YouTube on your website, Increasing engagement with your channel while keeping visitors on your website.', 'instagram-feed' ), 'dashboard_permalink' => admin_url( 'admin.php?page=youtube-feed' ), 'svgIcon' => '', 'installed' => $is_youtube_installed, 'activated' => is_plugin_active( $youtube_plugin ), 'plugin' => $youtube_plugin, 'download_plugin' => 'https://downloads.wordpress.org/plugin/feeds-for-youtube.zip', ), 'tiktok' => array( 'displayName' => __( 'TikTok', 'instagram-feed' ), 'name' => __( 'Feeds for TikTok', 'instagram-feed' ), 'author' => __( 'By Smash Balloon', 'instagram-feed' ), 'description' => __( "To display a TikTok feed, our TikTok plugin is required. It allows you to seamlessly integrate your TikTok account’s videos into your WordPress website.", 'instagram-feed' ), 'dashboard_permalink' => admin_url( 'admin.php?page=sbtt' ), 'svgIcon' => '', 'installed' => $is_tiktok_installed, 'activated' => is_plugin_active( $tiktok_plugin ), 'plugin' => $tiktok_plugin, 'download_plugin' => "https://downloads.wordpress.org/plugin/feeds-for-tiktok.zip", ) ); if ( version_compare(PHP_VERSION, '7.1.0') < 0 ) { $incompatible_plugins = array('reviews', 'tiktok'); foreach ( $incompatible_plugins as $plugin ) { if( isset( $return[$plugin] ) ) { unset( $return[$plugin] ); } } } return $return; } /** * Gets a list of info * Used in multiple places in the feed creator * Other Platforms + Social Links * Upgrade links * * @return array * * @since 6.0 */ public static function get_smashballoon_info() { $smash_info = array( 'colorSchemes' => array( 'facebook' => '#006BFA', 'twitter' => '#1B90EF', 'instagram' => '#BA03A7', 'youtube' => '#EB2121', 'linkedin' => '#007bb6', 'mail' => '#666', 'smash' => '#EB2121' ), 'upgrade' => array( 'name' => __( 'Upgrade to Pro', 'instagram-feed' ), 'icon' => 'instagram', 'link' => 'https://smashballoon.com/instagram-feed/' ), 'platforms' => array( array( 'name' => __( 'Facebook Feed', 'instagram-feed' ), 'icon' => 'facebook', 'link' => 'https://smashballoon.com/custom-facebook-feed/?utm_campaign=instagram-free&utm_source=balloon&utm_medium=facebook' ), array( 'name' => __( 'Twitter Feed', 'instagram-feed' ), 'icon' => 'twitter', 'link' => 'https://smashballoon.com/custom-twitter-feeds/?utm_campaign=instagram-free&utm_source=balloon&utm_medium=twitter' ), array( 'name' => __( 'YouTube Feed', 'instagram-feed' ), 'icon' => 'youtube', 'link' => 'https://smashballoon.com/youtube-feed/?utm_campaign=instagram-free&utm_source=balloon&utm_medium=youtube' ), array( 'name' => __( 'Social Wall Plugin', 'instagram-feed' ), 'icon' => 'smash', 'link' => 'https://smashballoon.com/social-wall/?utm_campaign=instagram-free&utm_source=balloon&utm_medium=social-wall ', ) ), 'socialProfiles' => array( 'facebook' => 'https://www.facebook.com/SmashBalloon/', 'twitter' => 'https://twitter.com/smashballoon', ), 'morePlatforms' => array( 'instagram', 'youtube', 'twitter' ) ); return $smash_info; } /** * Text specific to onboarding. Will return an associative array 'active' => false * if onboarding has been dismissed for the user or there aren't any legacy feeds. * * @return array * * @since 4.0 */ public function get_onboarding_text() { // TODO: return if no legacy feeds $sbi_statuses_option = get_option( 'sbi_statuses', array() ); if ( ! isset( $sbi_statuses_option['legacy_onboarding'] ) ) { return array( 'active' => false ); } if ( $sbi_statuses_option['legacy_onboarding']['active'] === false || self::onboarding_status() === 'dismissed' ) { return array( 'active' => false ); } $type = $sbi_statuses_option['legacy_onboarding']['type']; $text = array( 'active' => true, 'type' => $type, 'legacyFeeds' => array( 'heading' => __( 'Legacy Feed Settings', 'instagram-feed' ), 'description' => sprintf( __( 'These settings will impact %1$s legacy feeds on your site. You can learn more about what legacy feeds are and how they differ from new feeds %2$shere%3$s.', 'instagram-feed' ), '', '', '' ), ), 'getStarted' => __( 'You can now create and customize feeds individually. Click "Add New" to get started.', 'instagram-feed' ), ); if ( $type === 'single' ) { $text['tooltips'] = array( array( 'step' => 1, 'heading' => __( 'How you create a feed has changed', 'instagram-feed' ), 'p' => __( 'You can now create and customize feeds individually without using shortcode options.', 'instagram-feed' ) . ' ' . __( 'Click "Add New" to get started.', 'instagram-feed' ), 'pointer' => 'top' ), array( 'step' => 2, 'heading' => __( 'Your existing feed is here', 'instagram-feed' ), 'p' => __( 'You can edit your existing feed from here, and all changes will only apply to this feed.', 'instagram-feed' ), 'pointer' => 'top' ) ); } else { $text['tooltips'] = array( array( 'step' => 1, 'heading' => __( 'How you create a feed has changed', 'instagram-feed' ), 'p' => __( 'You can now create and customize feeds individually without using shortcode options.', 'instagram-feed' ) . ' ' . __( 'Click "Add New" to get started.', 'instagram-feed' ), 'pointer' => 'top' ), array( 'step' => 2, 'heading' => __( 'Your existing feeds are under "Legacy" feeds', 'instagram-feed' ), 'p' => __( 'You can edit the settings for any existing "legacy" feed (i.e. any feed created prior to this update) here.', 'instagram-feed' ) . ' ' . __( 'This works just like the old settings page and affects all legacy feeds on your site.', 'instagram-feed' ) ), array( 'step' => 3, 'heading' => __( 'Existing feeds work as normal', 'instagram-feed' ), 'p' => __( 'You don\'t need to update or change any of your existing feeds. They will continue to work as usual.', 'instagram-feed' ) . ' ' . __( 'This update only affects how new feeds are created and customized.', 'instagram-feed' ) ) ); } return $text; } public function get_customizer_onboarding_text() { if ( self::onboarding_status( 'customizer' ) === 'dismissed' ) { return array( 'active' => false ); } $text = array( 'active' => true, 'type' => 'customizer', 'tooltips' => array( array( 'step' => 1, 'heading' => __( 'Embedding a Feed', 'instagram-feed' ), 'p' => __( 'After you are done customizing the feed, click here to add it to a page or a widget.', 'instagram-feed' ), 'pointer' => 'top' ), array( 'step' => 2, 'heading' => __( 'Customize', 'instagram-feed' ), 'p' => __( 'Change your feed layout, color scheme, or customize individual feed sections here.', 'instagram-feed' ), 'pointer' => 'top' ), array( 'step' => 3, 'heading' => __( 'Settings', 'instagram-feed' ), 'p' => __( 'Update your feed source, filter your posts, or change advanced settings here.', 'instagram-feed' ), 'pointer' => 'top' ) ) ); return $text; } /** * Text related to the feed customizer * * @return array * * @since 6.0 */ public function get_customize_screens_text() { $text = array( 'common' => array( 'preview' => __( 'Preview', 'instagram-feed' ), 'help' => __( 'Help', 'instagram-feed' ), 'embed' => __( 'Embed', 'instagram-feed' ), 'save' => __( 'Save', 'instagram-feed' ), 'sections' => __( 'Sections', 'instagram-feed' ), 'enable' => __( 'Enable', 'instagram-feed' ), 'background' => __( 'Background', 'instagram-feed' ), 'text' => __( 'Text', 'instagram-feed' ), 'inherit' => __( 'Inherit from Theme', 'instagram-feed' ), 'size' => __( 'Size', 'instagram-feed' ), 'color' => __( 'Color', 'instagram-feed' ), 'height' => __( 'Height', 'instagram-feed' ), 'placeholder' => __( 'Placeholder', 'instagram-feed' ), 'select' => __( 'Select', 'instagram-feed' ), 'enterText' => __( 'Enter Text', 'instagram-feed' ), 'hoverState' => __( 'Hover State', 'instagram-feed' ), 'sourceCombine' => __( 'Combine sources from multiple platforms using our Social Wall plugin', 'instagram-feed' ), ), 'tabs' => array( 'customize' => __( 'Customize', 'instagram-feed' ), 'settings' => __( 'Settings', 'instagram-feed' ), ), 'overview' => array( 'feedLayout' => __( 'Feed Layout', 'instagram-feed' ), 'colorScheme' => __( 'Color Scheme', 'instagram-feed' ), 'header' => __( 'Header', 'instagram-feed' ), 'posts' => __( 'Posts', 'instagram-feed' ), 'likeBox' => __( 'Like Box', 'instagram-feed' ), 'loadMore' => __( 'Load More Button', 'instagram-feed' ), ), 'feedLayoutScreen' => array( 'layout' => __( 'Layout', 'instagram-feed' ), 'list' => __( 'List', 'instagram-feed' ), 'grid' => __( 'Grid', 'instagram-feed' ), 'masonry' => __( 'Masonry', 'instagram-feed' ), 'carousel' => __( 'Carousel', 'instagram-feed' ), 'feedHeight' => __( 'Feed Height', 'instagram-feed' ), 'number' => __( 'Number of Posts', 'instagram-feed' ), 'columns' => __( 'Columns', 'instagram-feed' ), 'desktop' => __( 'Desktop', 'instagram-feed' ), 'tablet' => __( 'Tablet', 'instagram-feed' ), 'mobile' => __( 'Mobile', 'instagram-feed' ), 'bottomArea' => array( 'heading' => __( 'Tweak Post Styles', 'instagram-feed' ), 'description' => __( 'Change post background, border radius, shadow etc.', 'instagram-feed' ), ) ), 'colorSchemeScreen' => array( 'scheme' => __( 'Scheme', 'instagram-feed' ), 'light' => __( 'Light', 'instagram-feed' ), 'dark' => __( 'Dark', 'instagram-feed' ), 'custom' => __( 'Custom', 'instagram-feed' ), 'customPalette' => __( 'Custom Palette', 'instagram-feed' ), 'background2' => __( 'Background 2', 'instagram-feed' ), 'text2' => __( 'Text 2', 'instagram-feed' ), 'link' => __( 'Link', 'instagram-feed' ), 'bottomArea' => array( 'heading' => __( 'Overrides', 'instagram-feed' ), 'description' => __( 'Colors that have been overridden from individual post element settings will not change. To change them, you will have to reset overrides.', 'instagram-feed' ), 'ctaButton' => __( 'Reset Overrides.', 'instagram-feed' ), ) ), 'shoppableFeedScreen' => array( 'heading1' => __( 'Upgrade to Pro and make your Instagram Feed Shoppable', 'instagram-feed' ), 'description1' => __( 'This feature links the post to the one specified in your caption.

Don’t want to add links to the caption? You can add links manually to each post.


', 'instagram-feed' ), 'heading2' => __( 'Tap “Add” or “Update” on an
image to add/update it’s URL', 'instagram-feed' ), ) ); $text['onboarding'] = $this->get_customizer_onboarding_text(); return $text; } /** * Returns an associate array of all existing sources along with their data * * @param int $page * * @return array * * @since 6.0 */ public static function get_source_list( $page = 1 ) { $args['page'] = $page; $source_data = SBI_Db::source_query( $args ); $encryption = new \SB_Instagram_Data_Encryption(); $return = array(); foreach ( $source_data as $source ) { $info = ! empty( $source['info'] ) ? json_decode( $encryption->decrypt( $source['info'] ), true ) : array(); $source['header_data'] = $info; $settings = array( 'gdpr' => 'no' ); $avatar = \SB_Instagram_Parse::get_avatar( $info, $settings ); if ( \SB_Instagram_Connected_Account::local_avatar_exists( $source['username'] ) ) { $source['local_avatar_url'] = \SB_Instagram_Connected_Account::get_local_avatar_url( $source['username'] ); $source['local_avatar'] = \SB_Instagram_Connected_Account::get_local_avatar_url( $source['username'] ); } else { $source['local_avatar'] = false; } $source['avatar_url'] = is_bool( $avatar ) ? \SB_Instagram_Parse::get_avatar_url( $info, $settings ) : false; $source['just_added'] = ( ! empty( $_GET['sbi_username'] ) && isset( $info['username'] ) && $info['username'] === $_GET['sbi_username'] ); $source['error_encryption'] = false; if ( isset( $source['access_token'] ) && strpos( $source['access_token'], 'IG' ) === false && strpos( $source['access_token'], 'EA' ) === false && ! $encryption->decrypt( $source['access_token'] ) ) { $source['error_encryption'] = true; } $return[] = $source; } return $return; } /** * Get Links with UTM * * @return array * * @since 4.0 */ public static function get_links_with_utm() { $license_key = null; if ( get_option( 'sbi_license_key' ) ) { $license_key = get_option( 'sbi_license_key' ); } $all_access_bundle = sprintf( 'https://smashballoon.com/all-access/?license_key=%s&upgrade=true&utm_campaign=instagram-free&utm_source=all-feeds&utm_medium=footer-banner&utm_content=learn-more', $license_key ); $all_access_bundle_popup = sprintf( 'https://smashballoon.com/all-access/?license_key=%s&upgrade=true&utm_campaign=instagram-free&utm_source=balloon&utm_medium=all-access', $license_key ); $sourceCombineCTA = sprintf( 'https://smashballoon.com/social-wall/?license_key=%s&upgrade=true&utm_campaign=instagram-free&utm_source=customizer&utm_medium=sources&utm_content=social-wall', $license_key ); return array( 'allAccessBundle' => $all_access_bundle, 'popup' => array( 'allAccessBundle' => $all_access_bundle_popup, 'fbProfile' => 'https://www.facebook.com/SmashBalloon/', 'twitterProfile' => 'https://twitter.com/smashballoon', ), 'sourceCombineCTA' => $sourceCombineCTA, 'multifeedCTA' => 'https://smashballoon.com/extensions/multifeed/?utm_campaign=instagram-free&utm_source=customizer&utm_medium=sources&utm_content=multifeed', 'doc' => 'https://smashballoon.com/docs/instagram/?utm_campaign=instagram-free&utm_source=support&utm_medium=view-documentation-button&utm_content=view-documentation', 'blog' => 'https://smashballoon.com/blog/?utm_campaign=instagram-free&utm_source=support&utm_medium=view-blog-button&utm_content=view-blog', 'gettingStarted' => 'https://smashballoon.com/docs/getting-started/?instagram&utm_campaign=instagram-free&utm_source=support&utm_medium=getting-started-button&utm_content=getting-started', ); } public static function get_social_wall_links() { return array( '' . __( 'All Feeds', 'instagram-feed' ) . '', '' . __( 'Settings', 'instagram-feed' ) . '', '' . __( 'oEmbeds', 'instagram-feed' ) . '', '' . __( 'Extensions', 'instagram-feed' ) . '', '' . __( 'About Us', 'instagram-feed' ) . '', '' . __( 'Support', 'instagram-feed' ) . '', ); } /** * Returns an associate array of all existing feeds along with their data * * @return array * * @since 6.0 */ public static function get_feed_list( $feeds_args = array() ) { if ( ! empty( $_GET['feed_id'] ) ) { return array(); } $feeds_data = SBI_Db::feeds_query( $feeds_args ); $i = 0; foreach ( $feeds_data as $single_feed ) { $args = array( 'feed_id' => '*' . $single_feed['id'], 'html_location' => array( 'content' ), ); $count = \SB_Instagram_Feed_Locator::count( $args ); $content_locations = \SB_Instagram_Feed_Locator::instagram_feed_locator_query( $args ); // if this is the last page, add in the header footer and sidebar locations if ( count( $content_locations ) < SBI_Db::RESULTS_PER_PAGE ) { $args = array( 'feed_id' => '*' . $single_feed['id'], 'html_location' => array( 'header', 'footer', 'sidebar' ), 'group_by' => 'html_location', ); $other_locations = \SB_Instagram_Feed_Locator::instagram_feed_locator_query( $args ); $locations = array(); $combined_locations = array_merge( $other_locations, $content_locations ); } else { $combined_locations = $content_locations; } foreach ( $combined_locations as $location ) { $page_text = get_the_title( $location['post_id'] ); if ( $location['html_location'] === 'header' ) { $html_location = __( 'Header', 'instagram-feed' ); } elseif ( $location['html_location'] === 'footer' ) { $html_location = __( 'Footer', 'instagram-feed' ); } elseif ( $location['html_location'] === 'sidebar' ) { $html_location = __( 'Sidebar', 'instagram-feed' ); } else { $html_location = __( 'Content', 'instagram-feed' ); } $shortcode_atts = json_decode( $location['shortcode_atts'], true ); $shortcode_atts = is_array( $shortcode_atts ) ? $shortcode_atts : array(); $full_shortcode_string = '[instagram-feed'; foreach ( $shortcode_atts as $key => $value ) { if ( ! empty( $value ) ) { $full_shortcode_string .= ' ' . esc_html( $key ) . '="' . esc_html( $value ) . '"'; } } $full_shortcode_string .= ']'; $locations[] = array( 'link' => esc_url( get_the_permalink( $location['post_id'] ) ), 'page_text' => $page_text, 'html_location' => $html_location, 'shortcode' => $full_shortcode_string ); } $feeds_data[ $i ]['instance_count'] = $count; $feeds_data[ $i ]['location_summary'] = $locations; $settings = json_decode( $feeds_data[ $i ]['settings'], true ); $settings['feed'] = $single_feed['id']; $instagram_feed_settings = new \SB_Instagram_Settings( $settings, sbi_defaults() ); $feeds_data[ $i ]['settings'] = $instagram_feed_settings->get_settings(); $i++; } return $feeds_data; } /** * Returns an associate array of all existing sources along with their data * * @return array * * @since 4.0 */ public function get_legacy_feed_list() { if ( ! empty( $_GET['feed_id'] ) ) { return array(); } $sbi_statuses = get_option( 'sbi_statuses', array() ); $sources_list = self::get_source_list(); if ( empty( $sbi_statuses['support_legacy_shortcode'] ) ) { return array(); } $args = array( 'html_location' => array( 'header', 'footer', 'sidebar', 'content' ), 'group_by' => 'shortcode_atts', 'page' => 1 ); $feeds_data = \SB_Instagram_Feed_Locator::legacy_instagram_feed_locator_query( $args ); if ( empty( $feeds_data ) ) { $args = array( 'html_location' => array( 'header', 'footer', 'sidebar', 'content' ), 'group_by' => 'shortcode_atts', 'page' => 1 ); $feeds_data = \SB_Instagram_Feed_Locator::legacy_instagram_feed_locator_query( $args ); } $feed_saver = new SBI_Feed_Saver( 'legacy' ); $settings = $feed_saver->get_feed_settings(); $default_type = 'timeline'; if ( isset( $settings['feedtype'] ) ) { $default_type = $settings['feedtype']; } elseif ( isset( $settings['type'] ) ) { if ( strpos( $settings['type'], ',' ) === false ) { $default_type = $settings['type']; } } $i = 0; $reindex = false; foreach ( $feeds_data as $single_feed ) { $args = array( 'shortcode_atts' => $single_feed['shortcode_atts'], 'html_location' => array( 'content' ), ); $content_locations = \SB_Instagram_Feed_Locator::instagram_feed_locator_query( $args ); $count = \SB_Instagram_Feed_Locator::count( $args ); if ( count( $content_locations ) < SBI_Db::RESULTS_PER_PAGE ) { $args = array( 'feed_id' => $single_feed['feed_id'], 'html_location' => array( 'header', 'footer', 'sidebar' ), 'group_by' => 'html_location' ); $other_locations = \SB_Instagram_Feed_Locator::instagram_feed_locator_query( $args ); $combined_locations = array_merge( $other_locations, $content_locations ); } else { $combined_locations = $content_locations; } $locations = array(); foreach ( $combined_locations as $location ) { $page_text = get_the_title( $location['post_id'] ); if ( $location['html_location'] === 'header' ) { $html_location = __( 'Header', 'instagram-feed' ); } elseif ( $location['html_location'] === 'footer' ) { $html_location = __( 'Footer', 'instagram-feed' ); } elseif ( $location['html_location'] === 'sidebar' ) { $html_location = __( 'Sidebar', 'instagram-feed' ); } else { $html_location = __( 'Content', 'instagram-feed' ); } $shortcode_atts = json_decode( $location['shortcode_atts'], true ); $shortcode_atts = is_array( $shortcode_atts ) ? $shortcode_atts : array(); $full_shortcode_string = '[instagram-feed'; foreach ( $shortcode_atts as $key => $value ) { if ( ! empty( $value ) ) { if ( is_array( $value ) ) { $value = implode( ',', $value ); } $full_shortcode_string .= ' ' . esc_html( $key ) . '="' . esc_html( $value ) . '"'; } } $full_shortcode_string .= ']'; $locations[] = array( 'link' => esc_url( get_the_permalink( $location['post_id'] ) ), 'page_text' => $page_text, 'html_location' => $html_location, 'shortcode' => $full_shortcode_string ); } $shortcode_atts = json_decode( $feeds_data[ $i ]['shortcode_atts'], true ); $shortcode_atts = is_array( $shortcode_atts ) ? $shortcode_atts : array(); $full_shortcode_string = '[instagram-feed'; foreach ( $shortcode_atts as $key => $value ) { if ( ! empty( $value ) ) { if ( is_array( $value ) ) { $value = implode( ',', $value ); } $full_shortcode_string .= ' ' . esc_html( $key ) . '="' . esc_html( $value ) . '"'; } } $full_shortcode_string .= ']'; $feeds_data[ $i ]['shortcode'] = $full_shortcode_string; $feeds_data[ $i ]['instance_count'] = $count; $feeds_data[ $i ]['location_summary'] = $locations; $feeds_data[ $i ]['feed_name'] = self::get_legacy_feed_name( $sources_list, $feeds_data[ $i ]['feed_id'] ); $feeds_data[ $i ]['feed_type'] = $default_type; if ( isset( $shortcode_atts['feedtype'] ) ) { $feeds_data[ $i ]['feed_type'] = $shortcode_atts['feedtype']; } elseif ( isset( $shortcode_atts['type'] ) ) { if ( strpos( $shortcode_atts['type'], ',' ) === false ) { $feeds_data[ $i ]['feed_type'] = $shortcode_atts['type']; } } if ( isset( $feeds_data[ $i ]['id'] ) ) { unset( $feeds_data[ $i ]['id'] ); } if ( isset( $feeds_data[ $i ]['html_location'] ) ) { unset( $feeds_data[ $i ]['html_location'] ); } if ( isset( $feeds_data[ $i ]['last_update'] ) ) { unset( $feeds_data[ $i ]['last_update'] ); } if ( isset( $feeds_data[ $i ]['post_id'] ) ) { unset( $feeds_data[ $i ]['post_id'] ); } if ( ! empty( $shortcode_atts['feed'] ) ) { $reindex = true; unset( $feeds_data[ $i ] ); } if ( isset( $feeds_data[ $i ]['shortcode_atts'] ) ) { unset( $feeds_data[ $i ]['shortcode_atts'] ); } $i++; } if ( $reindex ) { $feeds_data = array_values( $feeds_data ); } // if there were no feeds found in the locator table we still want the legacy settings to be available // if it appears as though they had used version 3.x or under at some point. if ( empty( $feeds_data ) && ! is_array( $sbi_statuses['support_legacy_shortcode'] ) && ( $sbi_statuses['support_legacy_shortcode'] ) ) { $feeds_data = array( array( 'feed_id' => __( 'Legacy Feed', 'instagram-feed' ) . ' ' . __( '(unknown location)', 'instagram-feed' ), 'feed_name' => __( 'Legacy Feed', 'instagram-feed' ) . ' ' . __( '(unknown location)', 'instagram-feed' ), 'shortcode' => '[instagram-feed]', 'feed_type' => '', 'instance_count' => false, 'location_summary' => array() ) ); } return $feeds_data; } public static function get_legacy_feed_name( $sources_list, $source_id ) { foreach ( $sources_list as $source ) { if ( $source['account_id'] == $source_id ) { return $source['username']; } } return $source_id; } /** * Status of the onboarding sequence for specific user * * @return string|boolean * * @since 6.0 */ public static function onboarding_status( $type = 'newuser' ) { $onboarding_statuses = get_user_meta( get_current_user_id(), 'sbi_onboarding', true ); $status = false; if ( ! empty( $onboarding_statuses ) ) { $statuses = maybe_unserialize( $onboarding_statuses ); $status = isset( $statuses[ $type ] ) ? $statuses[ $type ] : false; } return $status; } /** * Update status of onboarding sequence for specific user * * @return string|boolean * * @since 6.0 */ public static function update_onboarding_meta( $value, $type = 'newuser' ) { $onboarding_statuses = get_user_meta( get_current_user_id(), 'sbi_onboarding', true ); if ( ! empty( $onboarding_statuses ) ) { $statuses = maybe_unserialize( $onboarding_statuses ); $statuses[ $type ] = $value; } else { $statuses = array( $type => $value ); } $statuses = maybe_serialize( $statuses ); update_user_meta( get_current_user_id(), 'sbi_onboarding', $statuses ); } /** * Used to dismiss onboarding using AJAX * * @since 6.0 */ public static function after_dismiss_onboarding() { check_ajax_referer( 'sbi-admin', 'nonce' ); $cap = current_user_can( 'manage_instagram_feed_options' ) ? 'manage_instagram_feed_options' : 'manage_options'; $cap = apply_filters( 'sbi_settings_pages_capability', $cap ); if ( current_user_can( $cap ) ) { $type = 'newuser'; if ( isset( $_POST['was_active'] ) ) { $type = sanitize_key( $_POST['was_active'] ); } self::update_onboarding_meta( 'dismissed', $type ); } wp_die(); } public static function add_customizer_att( $atts ) { if ( ! is_array( $atts ) ) { $atts = array(); } $atts['feedtype'] = 'customizer'; return $atts; } /** * Feed Builder Wrapper. * * @since 6.0 */ public function feed_builder() { include_once SBI_BUILDER_DIR . 'templates/builder.php'; } /** * For types listed on the top of the select feed type screen * * @return array * * @since 6.0 */ public function get_feed_types() { $feed_types = array( array( 'type' => 'user', 'title' => __( 'User Timeline', 'instagram-feed' ), 'description' => __( 'Fetch posts from your Instagram profile', 'instagram-feed' ), 'icon' => 'usertimelineIcon' ), array( 'type' => 'hashtag', 'title' => __( 'Public Hashtag', 'instagram-feed' ), 'description' => __( 'Fetch posts from a public Instagram hashtag', 'instagram-feed' ), 'tooltip' => __( 'Hashtag feeds require a connected Instagram business account', 'instagram-feed' ), 'businessRequired' => true, 'icon' => 'publichashtagIcon' ), array( 'type' => 'tagged', 'title' => __( 'Tagged Posts', 'instagram-feed' ), 'description' => __( 'Display posts your Instagram account has been tagged in', 'instagram-feed' ), 'tooltip' => __( 'Tagged posts feeds require a connected Instagram business account', 'instagram-feed' ), 'businessRequired' => true, 'icon' => 'taggedpostsIcon' ), array( 'type' => 'socialwall', 'title' => __( 'Social Wall', 'instagram-feed' ), 'description' => __( 'Create a feed with sources from different social platforms', 'instagram-feed' ), 'icon' => 'socialwall1Icon' ) ); return $feed_types; } /** * For types listed on the bottom of the select feed type screen * * @return array * * @since 6.0 */ public function get_advanced_feed_types() { $feed_types = array( array( 'type' => 'hashtag', 'title' => __( 'Public Hashtag', 'instagram-feed' ), 'description' => __( 'Fetch posts from a public Instagram hashtag', 'instagram-feed' ), 'tooltip' => __( 'Hashtag feeds require a connected Instagram business account', 'instagram-feed' ), 'businessRequired' => true, 'icon' => 'publichashtagIcon' ), array( 'type' => 'tagged', 'title' => __( 'Tagged Posts', 'instagram-feed' ), 'description' => __( 'Display posts your Instagram account has been tagged in', 'instagram-feed' ), 'tooltip' => __( 'Tagged posts feeds require a connected Instagram business account', 'instagram-feed' ), 'businessRequired' => true, 'icon' => 'taggedpostsIcon' ), array( 'type' => 'socialwall', 'title' => __( 'Social Wall', 'instagram-feed' ), 'description' => __( 'Create a feed with sources from different social platforms', 'instagram-feed' ), 'icon' => 'socialwall1Icon' ), ); return $feed_types; } /** * Personal Account * * @return array * * @since 6.0.8 */ public static function personal_account_screen_text() { return array( 'mainHeading1' => __( 'We’re almost there...', 'instagram-feed' ), 'mainHeading2' => __( 'Update Personal Account', 'instagram-feed' ), 'mainHeading3' => __( 'Add Instagram Profile Picture and Bio', 'instagram-feed' ), 'mainDescription' => __( 'Instagram does not provide us access to your profile picture or bio for personal accounts. Would you like to set up a custom profile photo and bio?.', 'instagram-feed' ), 'bioLabel' => __( 'Bio (140 Characters)', 'instagram-feed' ), 'bioPlaceholder' => __( 'Add your profile bio here', 'instagram-feed' ), 'confirmBtn' => __( 'Yes, let\'s do it', 'instagram-feed' ), 'cancelBtn' => __( 'No, maybe later', 'instagram-feed' ), 'uploadBtn' => __( 'Upload Profile Picture', 'instagram-feed' ) ); } /** * Get Smahballoon Plugins Info * * @since 6.2.9 */ public static function get_smashballoon_plugins_info() { $active_sb_plugins = Util::get_sb_active_plugins_info(); return [ 'facebook' => [ 'installed' => $active_sb_plugins['is_facebook_installed'], 'class' => 'CFF_Elementor_Widget', 'link' => 'https://smashballoon.com/custom-facebook-feed/', 'icon' => '', 'description' => __('Custom Facebook Feeds is a highly customizable way to display tweets from your Facebook account. Promote your latest content and update your site content automatically.', 'instagram-feed'), 'download_plugin' => 'https://downloads.wordpress.org/plugin/custom-facebook-feed.zip', ], 'instagram' => [ 'installed' => $active_sb_plugins['is_instagram_installed'], 'class' => 'SBI_Elementor_Widget', 'link' => 'https://smashballoon.com/instagram-feed/', 'icon' => '', 'description' => __('Instagram Feeds is a highly customizable way to display tweets from your Instagram account. Promote your latest content and update your site content automatically.', 'instagram-feed'), 'download_plugin' => 'https://downloads.wordpress.org/plugin/instagram-feed.zip', ], 'twitter' => [ 'installed' => $active_sb_plugins['is_twitter_installed'], 'class' => 'CTF_Elementor_Widget', 'link' => 'https://smashballoon.com/custom-twitter-feeds/', 'icon' => '', 'description' => __('Custom Twitter Feeds is a highly customizable way to display tweets from your Twitter account. Promote your latest content and update your site content automatically.', 'instagram-feed'), 'download_plugin' => 'https://downloads.wordpress.org/plugin/custom-twitter-feeds.zip', ], 'youtube' => [ 'installed' => $active_sb_plugins['is_youtube_installed'], 'class' => 'SBY_Elementor_Widget', 'link' => 'https://smashballoon.com/youtube-feed/', 'icon' => '', 'description' => __('YouTube Feeds is a highly customizable way to display tweets from your YouTube account. Promote your latest content and update your site content automatically.', 'instagram-feed'), 'download_plugin' => 'https://downloads.wordpress.org/plugin/feeds-for-youtube.zip', ] ]; } } PKL\Ɓ竈+instagram-feed/inc/Builder/SBI_Post_Set.phpnu[feed_id = $feed_id; $this->transient_name = '*' . $feed_id; $this->data = array(); } /** * @return array|object * * @since 6.0 */ public function get_data() { return $this->data; } /** * @return array|object * * @since 6.0 */ public function get_comments_data() { return $this->comments_data; } /** * @return array * * @since 6.0 */ public function get_feed_settings() { return $this->feed_settings; } /** * @return array * * @since 6.0 */ public function get_converted_settings() { return $this->converted_settings; } /** * Sets the settings in builder form as well as converted * settings for general use in the plugin * * @since 6.0 */ public function init( $customizerBuilder = false, $previewSettings = false ) { $saver = new SBI_Feed_Saver( $this->feed_id ); if( $customizerBuilder && $previewSettings != false){ $this->feed_settings = $saver->get_feed_settings_preview( $previewSettings ); } else{ $this->feed_settings = $saver->get_feed_settings(); } $this->converted_settings = SBI_Post_Set::builder_to_general_settings_convert( $this->feed_settings ); } /** * Gathers posts from the API until the minimum number of posts * for the feed are retrieved then stores the results * * @since 6.0 */ public function fetch() { $post_data = []; $this->data = $post_data; } /** * Gathers comments for posts. * * @return array * * @since 6.0 */ public function fetch_comments() { if ( empty( $this->data ) ) { return array(); } $comments = []; $this->comments_data = $comments; return $comments; } /** * Converts raw settings from the cff_feed_settings table into the * more general way that the "CFF_Shortcode" class, * "cff_get_processed_options" method does * * @param array $builder_settings * * @return array * * @since 6.0 */ public static function builder_to_general_settings_convert( $builder_settings ) { $settings_with_multiples = array(); foreach ( $settings_with_multiples as $array_setting ) { if ( is_array( $builder_settings[ $array_setting ] ) ) { $builder_settings[ $array_setting ] = implode( ',', $builder_settings[ $array_setting ] ); } } if ( isset( $builder_settings['sources'] ) && is_array($builder_settings['sources'])) { $access_tokens = array(); $ids = array(); $id_access_tokens = array(); $sources_setting = array(); foreach ( $builder_settings['sources'] as $source ) { $source_array = array(); if ( ! is_array( $source ) ) { $args = array( 'id' => $source ); if ( isset( $builder_settings['feedtype'] ) && $builder_settings['feedtype'] == 'events' ){ $args['privilege'] = 'events'; } $source_query = SBI_Db::source_query( $args ); if ( isset( $source_query[0] ) ) { $source_array = $source_query[0]; $sources_setting[] = $source_query[0]; } } else { $source_array = $source; } if ( ! empty( $source_array ) ) { $access_tokens[] = $source_array['access_token']; } } if ( ! empty( $sources_setting ) ) { $builder_settings['sources'] = $sources_setting; } } return $builder_settings; } /** * Convert settings from 3.x for use in the builder in 6.0+ * * @param array $atts * * @return array * * @since 6.0 */ public static function legacy_to_builder_convert( $atts = array() ) { $processed_settings = []; return $processed_settings; } /** * Settings that can include an array of values * * @return array * * @since 6.0 */ public static function get_settings_with_multiple() { $settings_with_multiples = []; return $settings_with_multiples; } /** * Used for changing the settings used for general front end feeds * * @param array $builder_settings * * @return array * * @since 6.0 */ public static function filter_general_settings( $builder_settings ) { return $builder_settings; } /** * Used for changing the settings for feeds being edited in the customizer * * @param array $processed_settings * * @return array * * @since 6.0 */ public static function filter_builder_settings( $processed_settings ) { return $processed_settings; } }PKL\׭,instagram-feed/inc/Builder/SBI_Theme_CSS.phpnu[file = $file; } /** * Whether or not a cache exists for this stylesheet. Updates daily or when the theme's stylesheet changes * * @return bool * * @since 6.0 */ public function is_cached() { $stored_styles = get_option( 'sbi_theme_styles', array( 'file' => '', 'last_checked' => 0, 'styles' => array() ) ); if ( empty( $stored_styles['file'] ) || $stored_styles['file'] !== $this->file ) { return false; } if ( empty( $stored_styles['last_checked'] ) || $stored_styles['last_checked'] < (time() - DAY_IN_SECONDS) ) { return false; } $this->styles = $stored_styles['styles']; return true; } /** * Stores the styles in a wp_option * * @return bool * * @since 6.0 */ public function cache() { $stored_styles = get_option( 'sbi_theme_styles', array( 'file' => '', 'last_checked' => 0, 'styles' => array() ) ); $stored_styles['file'] = $this->file; $stored_styles['styles'] = $this->styles; $stored_styles['last_checked'] = time(); return update_option( 'sbi_theme_styles', $stored_styles, false ); } /** * @return array * * @since 6.0 */ public function get_styles() { return $this->styles; } /** * Makes an HTTP request to get the contents of the stylesheet * * @since 6.0 */ public function load_css() { $url = $this->file; $args = array( 'timeout' => 60, ); $response = wp_remote_get( esc_url_raw( $url ), $args ); if ( ! is_wp_error( $response ) ) { // certain ways of representing the html for double quotes causes errors so replaced here. $this->css = $response['body']; } else { $this->css = false; } } /** * Uses a regex to detect selectors and styles and coverts them to key => value pairs * * @return bool * * @since 6.0 */ public function parse() { if ( empty( $this->css ) ) { return false; } $css = $this->css; preg_match_all( '/(?ims)([a-z0-9\s\.\:#_\-@,]+)\{([^\}]*)\}/', $css, $arr); $result = array(); foreach ( $arr[0] as $i => $x ){ $selector = trim( $arr[1][ $i ] ); $rules = explode( ';', trim( $arr[2][ $i ] ) ); $rules_arr = array(); foreach ( $rules as $strRule ) { if ( !empty( $strRule ) ) { $rule = explode( ":", $strRule ); $rule_0 = isset( $rule[0] ) ? $rule[0] : 'null'; $rule_1 = isset( $rule[1] ) ? $rule[1] : ''; $rules_arr[ trim($rule_0) ] = trim( $rule_1 ); } } $selectors = explode(',', trim( $selector ) ); foreach ( $selectors as $strSel ) { if ( ! isset( $result[ $strSel ] ) ) { $result[ $strSel ] = $rules_arr; } else { $result[ $strSel . '_2' ] = $rules_arr; } } } $this->parsed = $result; } /** * Looks for styles based on specified selectors that are used * in generating the style HTML * * @return array * * @since 6.0 */ public function find_styles() { if ( empty( $this->css ) ) { return array(); } foreach ( $this->parsed as $selector => $property_array ) { foreach ( $property_array as $property => $style ) { $this->process( $selector, $property, $style ); } } } /** * Loop through all selectors and see if they can be used in our generated * style HTML * * @param string $selector * @param string $property * @param string $style * * @since 6.0 */ public function process( $selector, $property, $style ) { $selector = trim( $selector ); if ( $selector === 'body' ) { if ( in_array( $property, array( 'color', 'background-color', 'background', 'font-size' ), true ) ) { if ( ! isset( $this->styles[ $selector ]['properties'][ $property ]['style'] ) ) { $this->styles[ $selector ]['properties'][ $property ]['style'] = $style; } } } elseif ( $selector === 'a' ) { if ( in_array( $property, array( 'color', 'font-weight', 'text-decoration' ), true ) ) { if ( ! isset( $this->styles[ $selector ]['properties'][ $property ]['style'] ) ) { $this->styles[ $selector ]['properties'][ $property ]['style'] = $style; } } } elseif ( $selector === 'a:hover' ) { if ( in_array( $property, array( 'color', 'font-weight', 'text-decoration' ), true ) ) { if ( ! isset( $this->styles[ $selector ]['properties'][ $property ]['style'] ) ) { $this->styles[ $selector ]['properties'][ $property ]['style'] = $style; } } } elseif ( $selector === 'p' ) { if ( in_array( $property, array( 'color', 'font-weight', 'font-size' ), true ) ) { if ( ! isset( $this->styles[ $selector ]['properties'][ $property ]['style'] ) ) { $this->styles[ $selector ]['properties'][ $property ]['style'] = $style; } } } elseif ( $selector === 'h3' ) { if ( in_array( $property, array( 'color', 'font-weight', 'font-size' ), true ) ) { if ( ! isset( $this->styles[ $selector ]['properties'][ $property ]['style'] ) ) { $this->styles[ $selector ]['properties'][ $property ]['style'] = $style; } } } elseif ( $selector === '.entry-content' ) { if ( in_array( $property, array( 'color', 'font-size' ), true ) ) { if ( ! isset( $this->styles[ $selector ]['properties'][ $property ]['style'] ) ) { $this->styles[ $selector ]['properties'][ $property ]['style'] = $style; } } } elseif ( $selector === '.entry-content a' ) { if ( in_array( $property, array( 'color', 'font-weight', 'text-decoration' ), true ) ) { if ( ! isset( $this->styles[ $selector ]['properties'][ $property ]['style'] ) ) { $this->styles[ $selector ]['properties'][ $property ]['style'] = $style; } } } } /** * Creates the actual style HTML as a string * * @return string * * @since 6.0 */ public function generate_style_html() { if ( empty( $this->styles ) ) { return ''; } $wrap_selector = self::WRAP_SELECTOR; $html = ''; return $html; } } PKL\/U}rr7instagram-feed/inc/Builder/Controls/SB_Text_Control.phpnu[
{{control.fieldPrefix.replace(/ /g," ")}}
{{control.fieldSuffix.replace(/ /g," ")}}
{{genericText.clear.replace(/ /g," ")}}
{{genericText.name}}
{{genericText.edit}}
{{control.label}}
{{control.toggle.label}}
{{control.label}}
{{toggle.label}}
{{control.fieldPrefix.replace(/ /g," ")}}
{{control.fieldSuffix.replace(/ /g," ")}}
{{control.label}}
Pro
instagram-feed/inc/Builder/Controls/SB_Colorpicker_Control.phpnu[
{{genericText.reset}}
{{genericText.reset}}
'', 'type' => '', 'modelname' => '', 'layout' => 'full', 'reverse' => 'false', 'default' => '', 'seperator' => 'none', 'heading' => '', 'description' => '', 'tooltip' => '', ]; } /** * Control Output * * * @since 4.0 * @access public * * @return HTML */ public function get_control_output($controlEditingTypeModel){} /** * Getting Editing Control Type * * * @since 1.0.0 * @access public * * @return String */ public function get_control_edit_type($editingType){ switch ($editingType) { case 'settings': return 'customizerFeedData.settings'; break; } } /** * Get Control HTML. * * * @since 4.0 * @access public * * @return HTML */ public function print_control_wrapper($editingType){ $control_type = $this->get_type(); $controlEditingTypeModel = $this->get_control_edit_type($editingType); ?>
get_control_output($controlEditingTypeModel); ?>
get_control_sources_output($controlEditingTypeModel); $this->get_control_shoppable_disabled_output($controlEditingTypeModel); $this->get_control_shoppable_enabled_output($controlEditingTypeModel); $this->get_control_shoppable_selected_post_output($controlEditingTypeModel); $this->get_control_moderation_mode_output($controlEditingTypeModel); } /** * Shoppable Feed Disabled Output Control * * * @since 4.0 * @access public * * @return HTML */ public function get_control_shoppable_disabled_output($controlEditingTypeModel){ ?>
{{control.switcher.label}}
{{genericText.moderationMode}}
{{moderationItem.label}}
{{moderationItem.description}}
{{genericText.moderationModeEnterPostId}}
is_legacy = true; $this->insert_id = 0; } else { $this->is_legacy = false; $this->insert_id = $insert_id; } } /** * Feed insert ID if it exists * * @return bool|int * * @since 6.0 */ public function get_feed_id() { if ( $this->is_legacy ) { return 'legacy'; } if ( ! empty( $this->insert_id ) ) { return $this->insert_id; } else { return false; } } /** * @param array $data * * @since 6.0 */ public function set_data( $data ) { $this->data = $data; } /** * @param string $feed_name * * @since 6.0 */ public function set_feed_name( $feed_name ) { $this->feed_name = $feed_name; } /** * @param array $feed_db_data * * @return array * * @since 6.0 */ public function get_feed_db_data() { return $this->feed_db_data; } /** * Adds a new feed if there is no associated feed * found. Otherwise updates the exiting feed. * * @return false|int * * @since 6.0 */ public function update_or_insert() { $this->sanitize_and_sort_data(); if ( $this->exists_in_database() ) { return $this->update(); } else { return $this->insert(); } } /** * Whether or not a feed exists with the * associated insert ID * * @return bool * * @since 6.0 */ public function exists_in_database() { if ( $this->is_legacy ) { return true; } if ( $this->insert_id === false ) { return false; } $args = array( 'id' => $this->insert_id ); $results = SBI_Db::feeds_query( $args ); return isset( $results[0] ); } /** * Inserts a new feed from sanitized and sorted data. * Some data is saved in the sbi_feeds table and some is * saved in the sbi_feed_settings table. * * @return false|int * * @since 6.0 */ public function insert() { if ( $this->is_legacy ) { return $this->update(); } if ( ! isset( $this->sanitized_and_sorted_data ) ) { return false; } $settings_array = SBI_Feed_Saver::format_settings( $this->sanitized_and_sorted_data['feed_settings'] ); $this->sanitized_and_sorted_data['feeds'][] = array( 'key' => 'settings', 'values' => array( sbi_json_encode( $settings_array ) ) ); if ( ! empty( $this->feed_name ) ) { $this->sanitized_and_sorted_data['feeds'][] = array( 'key' => 'feed_name', 'values' => array( $this->feed_name ) ); } $this->sanitized_and_sorted_data['feeds'][] = array( 'key' => 'status', 'values' => array( 'publish' ) ); $insert_id = SBI_Db::feeds_insert( $this->sanitized_and_sorted_data['feeds'] ); if ( $insert_id ) { $this->insert_id = $insert_id; return $insert_id; } return false; } /** * Updates an existing feed and related settings from * sanitized and sorted data. * * @return false|int * * @since 6.0 */ public function update() { if ( ! isset( $this->sanitized_and_sorted_data ) ) { return false; } $args = array( 'id' => $this->insert_id ); $settings_array = SBI_Feed_Saver::format_settings( $this->sanitized_and_sorted_data['feed_settings'] ); if ( $this->is_legacy ) { $to_save_json = sbi_json_encode( $settings_array ); return update_option( 'sbi_legacy_feed_settings', $to_save_json, false ); } $this->sanitized_and_sorted_data['feeds'][] = array( 'key' => 'settings', 'values' => array( sbi_json_encode( $settings_array ) ) ); $this->sanitized_and_sorted_data['feeds'][] = array( 'key' => 'feed_name', 'values' => [sanitize_text_field($this->feed_name)] ); $success = SBI_Db::feeds_update( $this->sanitized_and_sorted_data['feeds'], $args ); return $success; } /** * Converts settings that have been sanitized into an associative array * that can be saved as JSON in the database * * @param $raw_settings * * @return array * * @since 6.0 */ public static function format_settings( $raw_settings ) { $settings_array = array(); foreach ( $raw_settings as $single_setting ) { if ( count( $single_setting['values'] ) > 1 ) { $settings_array[ $single_setting['key'] ] = $single_setting['values']; } else { $settings_array[ $single_setting['key'] ] = isset( $single_setting['values'][0] ) ? $single_setting['values'][0] : ''; } } return $settings_array; } /** * Gets the Preview Settings * for the Feed Fly Preview * * @return array|bool * * @since 6.0 */ public function get_feed_preview_settings( $preview_settings ){ } /** * Retrieves and organizes feed setting data for easy use in * the builder * * @return array|bool * * @since 6.0 */ public function get_feed_settings() { if ( $this->is_legacy ) { if ( sbi_is_pro_version() ) { $instagram_feed_settings = new \SB_Instagram_Settings_Pro( array(), sbi_get_database_settings() ); } else { $instagram_feed_settings = new \SB_Instagram_Settings( array(), sbi_get_database_settings() ); } $instagram_feed_settings->set_feed_type_and_terms(); $instagram_feed_settings->set_transient_name(); $return = $instagram_feed_settings->get_settings(); $this->feed_db_data = array( 'id' => 'legacy', 'feed_name' => __( 'Legacy Feeds', 'instagram-feed' ), 'feed_title' => __( 'Legacy Feeds', 'instagram-feed' ), 'status' => 'publish', 'last_modified' => date( 'Y-m-d H:i:s' ), ); } else if ( empty( $this->insert_id ) ) { return false; } else { $args = array( 'id' => $this->insert_id, ); $settings_db_data = SBI_Db::feeds_query( $args ); if ( false === $settings_db_data || sizeof($settings_db_data) == 0) { return false; } $this->feed_db_data = array( 'id' => $settings_db_data[0]['id'], 'feed_name' => $settings_db_data[0]['feed_name'], 'feed_title' => $settings_db_data[0]['feed_title'], 'status' => $settings_db_data[0]['status'], 'last_modified' => $settings_db_data[0]['last_modified'], ); $return = json_decode( $settings_db_data[0]['settings'], true ); $return['feed_name'] = $settings_db_data[0]['feed_name']; } $return = wp_parse_args( $return, SBI_Feed_Saver::settings_defaults() ); if ( empty( $return['id'] ) ) { return $return; } if ( ! is_array( $return['id'] ) ) { $return['id'] = explode( ',', str_replace( ' ', '', $return['id'] ) ); } if ( ! is_array( $return['tagged'] ) ) { $return['tagged'] = explode( ',', str_replace( ' ', '', $return['tagged'] ) ); } if ( ! is_array( $return['hashtag'] ) ) { $return['hashtag'] = explode( ',', str_replace( ' ', '', $return['hashtag'] ) ); } $args = array( 'id' => $return['id'] ); $source_query = SBI_Db::source_query( $args ); $return['sources'] = array(); if ( ! empty( $source_query ) ) { foreach ( $source_query as $source ) { $user_id = $source['account_id']; $return['sources'][ $user_id ] = self::get_processed_source_data( $source ); } } else { $found_sources = array(); foreach ( $return['id'] as $id_or_slug ) { $maybe_source_from_connected = SBI_Source::maybe_one_off_connected_account_update( $id_or_slug ); if ( $maybe_source_from_connected ) { $found_sources[] = $maybe_source_from_connected; } } if ( ! empty( $found_sources ) ) { foreach ( $found_sources as $source ) { $user_id = $source['account_id']; $return['sources'][ $user_id ] = self::get_processed_source_data( $source ); } } else { $source_query = SBI_Db::source_query( $args ); if ( isset( $source_query[0] ) ) { $source = $source_query[0]; $user_id = $source['account_id']; $return['sources'][ $user_id ] = self::get_processed_source_data( $source ); } } } return $return; } public static function get_processed_source_data( $source ) { $encryption = new \SB_Instagram_Data_Encryption(); $user_id = $source['account_id']; $info = ! empty( $source['info'] ) ? json_decode( $encryption->decrypt( $source['info'] ), true ) : array(); $cdn_avatar_url = \SB_Instagram_Parse::get_avatar_url( $info ); $processed = array( 'record_id' => stripslashes( $source['id'] ), 'user_id' => $user_id, 'type' => stripslashes( $source['account_type'] ), 'privilege' => stripslashes( $source['privilege'] ), 'access_token' => stripslashes( $encryption->decrypt( $source['access_token'] ) ), 'username' => stripslashes( $source['username'] ), 'name' => stripslashes( $source['username'] ), 'info' => stripslashes( $encryption->decrypt( $source['info'] ) ), 'error' => stripslashes( $source['error'] ), 'expires' => stripslashes( $source['expires'] ), 'profile_picture' => $cdn_avatar_url, 'local_avatar_url' => \SB_Instagram_Connected_Account::maybe_local_avatar( $source['username'], $cdn_avatar_url ) ); return $processed; } /** * Retrieves and organizes feed setting data for easy use in * the builder * It will NOT get the settings from the DB, but from the Customizer builder * To be used for updating feed preview on the fly * * @return array|bool * * @since 6.0 */ public function get_feed_settings_preview( $settings_db_data ) { if ( false === $settings_db_data || sizeof($settings_db_data) == 0) { return false; } $return = $settings_db_data; $return = wp_parse_args( $return, SBI_Feed_Saver::settings_defaults() ); if ( empty( $return['sources'] ) ) { return $return; } $sources = []; foreach ($return['sources'] as $single_source) { array_push($sources, $single_source['account_id']); } $args = array( 'id' => $sources ); $source_query = SBI_Db::source_query( $args ); $return['sources'] = array(); if ( ! empty( $source_query ) ) { foreach ( $source_query as $source ) { $user_id = $source['account_id']; $return['sources'][ $user_id ] = self::get_processed_source_data( $source ); } } return $return; } /** * Default settings, $return_array equalling false will return * the settings in the general way that the "SBI_Shortcode" class, * "sbi_get_processed_options" method does * * @param bool $return_array * * @return array * * @since 6.0 */ public static function settings_defaults( $return_array = true ) { { $defaults = array( //V6 'customizer' => false, //Feed general 'type' => 'user', //user - hashtag - 'order' => 'recent', 'id' => [], 'hashtag' => [], 'tagged' => [], 'width' => '', 'widthunit' => '', 'widthresp' => true, 'height' => '', 'heightunit' => '', 'sortby' => 'none', 'disablelightbox' => true, 'captionlinks' => false, 'offset' => 0, 'num' => 20, 'apinum' => '', 'nummobile' => 20, 'cols' => 4, 'colstablet' => 2, 'colsmobile' => 1, 'disablemobile' => false, 'imagepadding' => '5', 'imagepaddingunit' => 'px', 'layout' => 'grid', //Lightbox comments 'lightboxcomments' => true, 'numcomments' => 20, //Photo hover styles 'hovereffect' => '', 'hovercolor' => '', 'hovertextcolor' => '', 'hoverdisplay' => 'username,date,instagram', //Item misc 'background' => '', 'imageres' => 'auto', 'media' => 'all', 'videotypes' => 'regular,igtv,reels', 'showcaption' => true, 'captionlength' => '', 'captioncolor' => '', 'captionsize' => '', 'showlikes' => true, 'likescolor' => '', 'likessize' => '13', 'hidephotos' => '', //Footer 'showbutton' => true, 'buttoncolor' => '', 'buttonhovercolor' => '', // to be tested 'buttontextcolor' => '', 'buttontext' => 'Load More', 'showfollow' => true, 'followcolor' => '#408bd1', 'followhovercolor' => '#359dff', // to be tested 'followtextcolor' => '', 'followtext' => 'Follow on Instagram', //Header 'showheader' => true, 'headertextsize' => '', //to be tested 'headercolor' => '', 'headerstyle' => 'standard', 'showfollowers' => false, 'showbio' => true, 'custombio' => '', 'customavatar' => '', 'headerprimarycolor' => '#517fa4', 'headersecondarycolor' => '#eeeeee', 'headersize' => 'medium', 'stories' => true, 'storiestime' => '', 'headeroutside' => false, 'class' => '', 'ajaxtheme' => '', 'excludewords' => '', 'includewords' => '', 'maxrequests' => 5, //Carousel 'carouselrows' => 1, 'carouselloop' => 'rewind', 'carouselarrows' => false, 'carouselpag' => true, 'carouselautoplay' => false, 'carouseltime' => 5000, //Highlight 'highlighttype' => 'pattern', 'highlightoffset' => 0, 'highlightpattern' => '', 'highlighthashtag' => '', 'highlightids' => '', //WhiteList 'whitelist' => '', //Load More on Scroll 'autoscroll' => false, 'autoscrolldistance' => '', //Permanent 'permanent' => false, 'accesstoken' => '', 'user' => '', //Misc 'feedid' => false, 'resizeprocess' => 'background', 'mediavine' => '', 'customtemplates' => false, 'moderationmode' => false, //NEWLY ADDED //TO BE CHECKED 'colstablet' => 2, 'colorpalette' => 'inherit', 'custombgcolor1' => '', 'customtextcolor1' => '', 'customtextcolor2' => '', 'customlinkcolor1' => '', 'custombuttoncolor1' => '', 'custombuttoncolor2' => '', 'photosposts' => true, 'videosposts' => true, 'igtvposts' => true, 'reelsposts' => true, 'shoppablefeed' => false, 'shoppablelist' => '{}', 'moderationlist' => '{"list_type_selected" : "allow", "allow_list" : [], "block_list" : [] }', 'customBlockModerationlist' => '', 'enablemoderationmode' => false, 'fakecolorpicker' => '' ); $defaults = SBI_Feed_Saver::filter_defaults( $defaults ); // some settings are comma separated and not arrays when the feed is created if ( $return_array ) { $settings_with_multiples = array( 'sources' ); foreach ( $settings_with_multiples as $multiple_key ) { if ( isset( $defaults[ $multiple_key ] ) ) { $defaults[ $multiple_key ] = explode( ',', $defaults[ $multiple_key ] ); } } } return $defaults; } } /** * Provides backwards compatibility for extensions * * @param array $defaults * * @return array * * @since 6.0 */ public static function filter_defaults( $defaults ) { return $defaults; } /** * Saves settings for legacy feeds. Runs on first update automatically. * * @since 6.0 */ public static function set_legacy_feed_settings() { $to_save = SBI_Post_Set::legacy_to_builder_convert(); $to_save_json = sbi_json_encode( $to_save ); update_option( 'sbi_legacy_feed_settings', $to_save_json, false ); } /** * Used for taking raw post data related to settings * an sanitizing it and sorting it to easily use in * the database tables * * @since 6.0 */ private function sanitize_and_sort_data() { $data = $this->data; $sanitized_and_sorted = array( 'feeds' => array(), 'feed_settings' => array() ); foreach ( $data as $key => $value ) { $data_type = SBI_Feed_Saver_Manager::get_data_type( $key ); $sanitized_values = array(); if ( is_array( $value ) ) { foreach ( $value as $item ) { $type = SBI_Feed_Saver_Manager::is_boolean( $item ) ? 'boolean' : $data_type['sanitization']; $sanitized_values[] = SBI_Feed_Saver_Manager::sanitize( $type , $item ); } } else { $type = SBI_Feed_Saver_Manager::is_boolean( $value ) ? 'boolean' : $data_type['sanitization']; $sanitized_values[] = SBI_Feed_Saver_Manager::sanitize( $type, $value ); } $single_sanitized = array( 'key' => $key, 'values' => $sanitized_values ); $sanitized_and_sorted[ $data_type['table'] ][] = $single_sanitized; } $this->sanitized_and_sorted_data = $sanitized_and_sorted; } } PKL\yşş5instagram-feed/inc/Builder/Tabs/SBI_Customize_Tab.phpnu[ [ 'heading' => __( 'Feed Layout', 'instagram-feed' ), 'icon' => 'feed_layout', 'controls' => self::get_customize_feedlayout_controls() ], 'customize_colorschemes' => [ 'heading' => __( 'Color Scheme', 'instagram-feed' ), 'icon' => 'color_scheme', 'controls' => self::get_customize_colorscheme_controls() ], 'customize_sections' => [ 'heading' => __( 'Sections', 'instagram-feed' ), 'isHeader' => true, ], 'customize_header' => [ 'heading' => __( 'Header', 'instagram-feed' ), 'icon' => 'header', 'separator' => 'none', 'controls' => self::get_customize_header_controls() ], 'customize_posts' => [ 'heading' => __( 'Posts', 'instagram-feed' ), 'icon' => 'article', 'controls' => self::get_customize_posts_controls(), 'nested_sections' => [ 'images_videos' => [ 'heading' => __( 'Images and Videos', 'instagram-feed' ), 'icon' => 'picture', 'isNested' => 'true', 'separator' => 'none', 'controls' => self::get_nested_images_videos_controls(), ], ] ], 'customize_loadmorebutton' => [ 'heading' => __( 'Load More Button', 'instagram-feed' ), 'description' => '
', 'icon' => 'load_more', 'separator' => 'none', 'controls' => self::get_customize_loadmorebutton_controls() ], 'customize_followbutton' => [ 'heading' => __( 'Follow Button', 'instagram-feed' ), 'description' => '
', 'icon' => 'follow', 'separator' => 'none', 'controls' => self::get_customize_followbutton_controls() ], 'customize_lightbox' => [ 'heading' => __( 'Lightbox', 'instagram-feed' ), 'description' => __( 'Upgrade to Pro to add a modal when user clicks on a post.', 'custom-facebook-feed' ), 'proLabel' => true, 'icon' => 'lightbox', 'separator' => 'none', 'checkExtensionPopup' => 'lightbox', 'controls' => self::get_customize_lightbox_controls() ] ]; } /** * Get Customize Tab Feed Layout Section * @since 6.0 * @return array */ public static function get_customize_feedlayout_controls(){ $svg_icons = SBI_Feed_Builder::builder_svg_icons(); $svg_rocket_icon = $svg_icons['rocketPremiumBlue']; return [ [ 'type' => 'toggleset', 'id' => 'layout', 'heading' => __( 'Layout', 'instagram-feed' ), 'separator' => 'bottom', 'options' => [ [ 'value' => 'grid', 'icon' => 'grid', 'label' => __( 'Grid', 'instagram-feed' ) ], [ 'value' => 'carousel', 'icon' => 'carousel', 'checkExtension' => 'feedLayout', 'label' => __( 'Carousel', 'instagram-feed' ) . $svg_rocket_icon ], [ 'value' => 'masonry', 'icon' => 'masonry', 'checkExtension' => 'feedLayout', 'label' => __( 'Masonry', 'instagram-feed' ) . $svg_rocket_icon ], [ 'value' => 'highlight', 'icon' => 'highlight', 'checkExtension' => 'feedLayout', 'label' => __( 'Highlight', 'instagram-feed' ) . $svg_rocket_icon ] ] ], //Carousel Settings [ 'type' => 'heading', 'heading' => __( 'Carousel Settings', 'instagram-feed' ), 'condition' => ['layout' => ['carousel']], 'conditionHide' => true, ], /* [ 'type' => 'number', 'id' => 'carouselrows', 'layout' => 'half', 'condition' => ['layout' => ['carousel']], 'conditionHide' => true, 'ajaxAction' => 'feedFlyPreview', 'strongHeading' => 'false', 'stacked' => 'true', 'heading' => __( 'Rows', 'instagram-feed' ), ], */ [ 'type' => 'select', 'id' => 'carouselrows', 'layout' => 'half', 'condition' => ['layout' => ['carousel']], 'conditionHide' => true, 'ajaxAction' => 'feedFlyPreview', 'strongHeading' => 'false', 'stacked' => 'true', 'heading' => __( 'Rows', 'instagram-feed' ), 'options' => [ 1 => '1', 2 => '2' ] ], [ 'type' => 'select', 'id' => 'carouselloop', 'condition' => ['layout' => ['carousel']], 'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Loop Type', 'instagram-feed' ), 'stacked' => 'true', 'options' => [ 'rewind' => __( 'Rewind', 'instagram-feed' ), 'infinity' => __( 'Infinity', 'instagram-feed' ), ] ], [ 'type' => 'number', 'id' => 'carouseltime', 'condition' => ['layout' => ['carousel']], 'conditionHide' => true, 'stacked' => 'true', 'layout' => 'half', 'fieldSuffix' => 'ms', 'heading' => __( 'Interval Time', 'instagram-feed' ), ], [ 'type' => 'checkbox', 'id' => 'carouselarrows', 'condition' => ['layout' => ['carousel']], 'conditionHide' => true, 'label' => __( 'Show Navigation Arrows', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', #'disabledInput' => true, 'options' => [ 'enabled' => 'true', 'disabled' => 'false' ] ], [ 'type' => 'checkbox', 'id' => 'carouselpag', 'condition' => ['layout' => ['carousel']], 'conditionHide' => true, 'label' => __( 'Show Pagination', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', #'disabledInput' => true, 'options' => [ 'enabled' => 'true', 'disabled' => 'false' ] ], [ 'type' => 'checkbox', 'id' => 'carouselautoplay', 'condition' => ['layout' => ['carousel']], 'conditionHide' => true, 'label' => __( 'Enable Autoplay', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', #'disabledInput' => true, 'options' => [ 'enabled' => 'true', 'disabled' => 'false' ] ], //HighLight Settings [ 'type' => 'heading', 'heading' => __( 'HighLight Settings', 'instagram-feed' ), 'condition' => ['layout' => ['highlight']], 'conditionHide' => true, ], [ 'type' => 'select', 'id' => 'highlighttype', 'condition' => ['layout' => ['highlight']], 'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Type', 'instagram-feed' ), 'stacked' => 'true', 'options' => [ 'pattern' => __( 'Pattern', 'instagram-feed' ), 'id' => __( 'Post ID', 'instagram-feed' ), 'hashtag' => __( 'Hashtag', 'instagram-feed' ), ] ], [ 'type' => 'number', 'id' => 'highlightoffset', 'condition' => ['layout' => ['highlight'],'highlighttype' => ['pattern']], 'conditionHide' => true, 'stacked' => 'true', 'layout' => 'half', 'heading' => __( 'Offset', 'instagram-feed' ), ], [ 'type' => 'number', 'id' => 'highlightpattern', 'condition' => ['layout' => ['highlight'],'highlighttype' => ['pattern']], 'conditionHide' => true, 'stacked' => 'true', 'layout' => 'half', 'fieldSuffix' => 'posts', 'heading' => __( 'Highlight every', 'instagram-feed' ), ], [ 'type' => 'textarea', 'id' => 'highlightids', 'description' => __( 'Highlight posts with these IDs', 'instagram-feed' ), 'placeholder' => 'id1, id2', 'condition' => ['layout' => ['highlight'],'highlighttype' => ['id']], 'conditionHide' => true, 'stacked' => 'true' ], [ 'type' => 'textarea', 'id' => 'highlighthashtag', 'description' => __( 'Highlight posts with these hashtags', 'instagram-feed' ), 'placeholder' => '#hashtag1, #hashtag2', 'condition' => ['layout' => ['highlight'],'highlighttype' => ['hashtag']], 'conditionHide' => true, 'stacked' => 'true' ], [ 'type' => 'separator', 'top' => 20, 'bottom' => 10, 'condition' => ['layout' => ['highlight']], 'conditionHide' => true, ], [ 'type' => 'number', 'id' => 'height', 'fieldSuffix' => 'px', 'separator' => 'bottom', 'strongHeading' => 'true', 'heading' => __( 'Feed Height', 'instagram-feed' ), 'style' => ['#sb_instagram' => 'height:{{value}}px!important;overflow-y:auto;'], ], [ 'type' => 'number', 'id' => 'imagepadding', 'fieldSuffix' => 'px', 'separator' => 'bottom', 'strongHeading' => 'true', 'heading' => __( 'Padding', 'instagram-feed' ), 'style' => ['#sbi_images' => 'gap:calc({{value}}px * 2)!important;'], ], [ 'type' => 'heading', 'heading' => __( 'Number of Posts', 'instagram-feed' ), ], [ 'type' => 'number', 'id' => 'num', 'icon' => 'desktop', 'layout' => 'half', 'ajaxAction' => 'feedFlyPreview', 'strongHeading' => 'false', 'stacked' => 'true', 'heading' => __( 'Desktop', 'instagram-feed' ), ], [ 'type' => 'number', 'id' => 'nummobile', 'icon' => 'mobile', 'layout' => 'half', 'strongHeading' => 'false', 'stacked' => 'true', 'heading' => __( 'Mobile', 'instagram-feed' ), ], [ 'type' => 'separator', 'top' => 10, 'bottom' => 10, ], [ 'type' => 'heading', 'heading' => __( 'Columns', 'instagram-feed' ), 'condition' => ['layout' => ['grid','masonry']], 'conditionHide' => true, ], [ 'type' => 'select', 'id' => 'cols', 'conditionHide' => true, 'icon' => 'desktop', 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Desktop', 'instagram-feed' ), 'stacked' => 'true', 'options' => [ '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', '10' => '10', ] ], [ 'type' => 'select', 'id' => 'colstablet', 'conditionHide' => true, 'icon' => 'tablet', 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Tablet', 'instagram-feed' ), 'stacked' => 'true', 'options' => [ '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', '10' => '10', ] ], [ 'type' => 'select', 'id' => 'colsmobile', 'conditionHide' => true, 'icon' => 'mobile', 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Mobile', 'instagram-feed' ), 'stacked' => 'true', 'options' => [ '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', '10' => '10', ] ], ]; } /** * Get Customize Tab Color Scheme Section * @since 6.0 * @return array */ public static function get_customize_colorscheme_controls(){ $feed_id = isset( $_GET['feed_id'] ) ? sanitize_key( $_GET['feed_id'] ) : ''; $color_scheme_array = [ [ 'type' => 'toggleset', 'id' => 'colorpalette', 'separator' => 'bottom', 'options' => [ [ 'value' => 'inherit', 'label' => __( 'Inherit from Theme', 'instagram-feed' ) ], [ 'value' => 'light', 'icon' => 'sun', 'label' => __( 'Light', 'instagram-feed' ) ], [ 'value' => 'dark', 'icon' => 'moon', 'label' => __( 'Dark', 'instagram-feed' ) ], [ 'value' => 'custom', 'icon' => 'cog', 'label' => __( 'Custom', 'instagram-feed' ) ] ] ], //Custom Color Palette [ 'type' => 'heading', 'condition' => ['colorpalette' => ['custom']], 'conditionHide' => true, 'heading' => __( 'Custom Palette', 'instagram-feed' ), ], [ 'type' => 'colorpicker', 'id' => 'custombgcolor1', 'condition' => ['colorpalette' => ['custom']], 'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Background', 'custom-facebook-feed' ), 'style' => ['.sbi_header_palette_custom_'.$feed_id.',#sb_instagram.sbi_palette_custom_'.$feed_id.',#sbi_lightbox .sbi_lb-outerContainer .sbi_lb-dataContainer,#sbi_lightbox .sbi_lightbox_tooltip,#sbi_lightbox .sbi_share_close' => 'background:{{value}}!important;'], 'stacked' => 'true' ], /* [ 'type' => 'colorpicker', 'id' => 'customtextcolor1', 'condition' => ['colorpalette' => ['custom']], 'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Text', 'custom-facebook-feed' ), 'style' => ['#sb_instagram.sbi_palette_custom_'.$feed_id.' .sbi_caption,#sbi_lightbox .sbi_lb-outerContainer .sbi_lb-dataContainer .sbi_lb-details .sbi_lb-caption,#sbi_lightbox .sbi_lb-outerContainer .sbi_lb-dataContainer .sbi_lb-number,#sbi_lightbox.sbi_lb-comments-enabled .sbi_lb-commentBox p' => 'color:{{value}}!important;'], 'stacked' => 'true' ], [ 'type' => 'colorpicker', 'id' => 'customtextcolor2', 'condition' => ['colorpalette' => ['custom']], 'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Text 2', 'custom-facebook-feed' ), 'style' => ['.sbi_header_palette_custom_'.$feed_id.' .sbi_bio,#sb_instagram.sbi_palette_custom_'.$feed_id.' .sbi_meta' => 'color:{{value}}!important;'], 'stacked' => 'true' ], [ 'type' => 'colorpicker', 'id' => 'customlinkcolor1', 'condition' => ['colorpalette' => ['custom']], 'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Link', 'custom-facebook-feed' ), 'style' => ['.sbi_header_palette_custom_'.$feed_id.' a,#sb_instagram.sbi_palette_custom_'.$feed_id.' .sbi_expand a,#sbi_lightbox .sbi_lb-outerContainer .sbi_lb-dataContainer .sbi_lb-details a,#sbi_lightbox.sbi_lb-comments-enabled .sbi_lb-commentBox .sbi_lb-commenter' => 'color:{{value}};'], 'stacked' => 'true' ], */ [ 'type' => 'colorpicker', 'id' => 'custombuttoncolor1', 'condition' => ['colorpalette' => ['custom']], 'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Button 1', 'custom-facebook-feed' ), 'style' => ['#sb_instagram.sbi_palette_custom_'.$feed_id.' #sbi_load .sbi_load_btn' => 'background:{{value}}!important;'], 'stacked' => 'true' ], [ 'type' => 'colorpicker', 'id' => 'custombuttoncolor2', 'condition' => ['colorpalette' => ['custom']], 'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Button 2', 'custom-facebook-feed' ), 'style' => ['#sb_instagram.sbi_palette_custom_'.$feed_id.' #sbi_load .sbi_follow_btn a' => 'background:{{value}}!important;'], 'stacked' => 'true' ], ]; $color_overrides = []; $color_overrides_array = []; return array_merge($color_scheme_array,$color_overrides_array); } /** * Get Customize Tab Header Section * @since 6.0 * @return array */ public static function get_customize_header_controls(){ return [ [ 'type' => 'switcher', 'id' => 'showheader', 'label' => __( 'Enable', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'separator', 'condition' => ['showheader' => [true]], 'top' => 20, 'bottom' => 0, ], [ 'type' => 'select', 'id' => 'headersize', 'condition' => ['showheader' => [true]], //'conditionHide' => true, 'strongHeading' => 'true', 'separator' => 'bottom', 'heading' => __( 'Header Size', 'instagram-feed' ), 'options' => [ 'small' => __( 'Small', 'instagram-feed' ), 'medium' => __( 'Medium', 'instagram-feed' ), 'large' => __( 'Large', 'instagram-feed' ), ] ], [ 'type' => 'imagechooser', 'id' => 'customavatar', 'condition' => ['showheader' => [true]], //'conditionHide' => true, 'strongHeading' => 'true', 'separator' => 'bottom', 'heading' => __( 'Use Custom Avatar', 'instagram-feed' ), 'tooltip' => __( 'Upload your own custom image to use for the avatar. This is automatically retrieved from Instagram for Business accounts, but is not available for Personal accounts.', 'instagram-feed' ), 'placeholder' => __( 'No Image Added', 'instagram-feed' ) ], [ 'type' => 'heading', 'heading' => __( 'Text', 'instagram-feed' ), 'condition' => ['showheader' => [true]], ], /* [ 'type' => 'select', 'id' => 'headertextsize', 'condition' => ['showheader' => [true]], //'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Size', 'instagram-feed' ), 'stacked' => 'true', 'style' => ['h3.sbi-preview-header-name' => 'font-size:{{value}}px!important;'], 'options' => SBI_Builder_Customizer_Tab::get_text_size_options() ], */ [ 'type' => 'colorpicker', 'id' => 'headercolor', 'condition' => ['showheader' => [true]], //'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Color', 'instagram-feed' ), 'style' => ['.sbi_header_text > *, .sbi_bio_info > *' => 'color:{{value}}!important;'], 'stacked' => 'true' ], [ 'type' => 'colorpicker', 'id' => 'headerprimarycolor', 'condition' => ['showheader' => [true], 'headerstyle' => 'boxed'], 'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Primary Color', 'instagram-feed' ), 'style' => [ '.sbi_header_style_boxed .sbi_bio_info > *' => 'color:{{value}}!important;', '.sbi_header_style_boxed' => 'background:{{value}}!important;' ], 'stacked' => 'true' ], [ 'type' => 'colorpicker', 'id' => 'headersecondarycolor', 'condition' => ['showheader' => [true], 'headerstyle' => 'boxed'], 'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Secondary Color', 'instagram-feed' ), 'style' => ['.sbi_header_style_boxed .sbi_header_bar' => 'background:{{value}}!important;'], 'stacked' => 'true' ], [ 'type' => 'separator', 'condition' => ['showheader' => [true]], 'top' => 10, 'bottom' => 10, ], [ 'type' => 'switcher', 'id' => 'showbio', 'condition' => ['showheader' => [true]], //'conditionHide' => true, 'label' => __( 'Show Bio Text', 'instagram-feed' ), 'tooltip' => __( 'Use your own custom bio text in the feed header. This is automatically retrieved from Instagram for Business accounts, but it not available for Personal accounts.', 'instagram-feed' ), 'stacked' => 'true', 'labelStrong' => 'true', 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'textarea', 'id' => 'custombio', 'placeholder' => __( 'Add custom bio', 'instagram-feed' ), 'condition' => ['showheader' => [true],'showbio' => [true]], //'conditionHide' => true, 'child' => 'true', 'stacked' => 'true' ], [ 'type' => 'separator', 'condition' => ['showheader' => [true]], 'top' => 10, 'bottom' => 10, ], [ 'type' => 'switcher', 'id' => 'headeroutside', 'condition' => ['showheader' => [true]], //'conditionHide' => true, 'label' => __( 'Show outside scrollable area', 'instagram-feed' ), 'stacked' => 'true', 'labelStrong' => 'true', 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'separator', 'condition' => ['showheader' => [true]], 'top' => 10, 'bottom' => 10, ], [ 'type' => 'heading', 'heading' => __( 'Advanced', 'instagram-feed' ), 'proLabel' => true, 'checkExtensionPopupLearnMore' => 'headerLayout', 'description' => __( 'Tweak the header styles and show your follower count with Instagram Feed Pro.', 'instagram-feed' ), ], [ 'type' => 'separator', 'condition' => ['showheader' => [true]], 'top' => 30, 'bottom' => 10, ], [ 'type' => 'switcher', 'id' => 'stories', 'condition' => ['showheader' => [true]], 'switcherTop' => true, //'conditionHide' => true, 'checkExtensionDimmed' => 'headerLayout', 'checkExtensionPopup' => 'headerLayout', 'heading' => __( 'Include Stories', 'instagram-feed' ), 'description' => __( 'You can view active stories by clicking the profile picture in the header. Instagram Business accounts only.

', 'instagram-feed' ), 'tooltip' => __( 'Show your active stories from Instagram when your header avatar is clicked. Displays a colored ring around your avatar when a story is available.', 'instagram-feed' ), 'stacked' => 'true', 'labelStrong' => 'true', 'layout' => 'half', 'reverse' => 'true', 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'number', 'id' => 'storiestime', 'condition' => ['showheader' => [true],'stories' => [true]], 'conditionHide' => true, 'strongHeading' => false, 'stacked' => 'true', 'placeholder' => '500', 'child' => true, 'checkExtensionDimmed' => 'headerLayout', 'checkExtensionPopup' => 'headerLayout', 'fieldSuffix' => 'milliseconds', 'heading' => __( 'Change Interval', 'instagram-feed' ), 'description' => __( 'This is the time a story displays for, before displaying the next one. Videos always change when the video is finished.', 'instagram-feed' ), 'descriptionPosition' => 'bottom' ], [ 'type' => 'separator', 'condition' => ['showheader' => [true]], 'top' => 25, 'bottom' => 10, ], [ 'type' => 'switcher', 'id' => 'showfollowers', 'condition' => ['showheader' => [true]], 'checkExtensionDimmed' => 'headerLayout', 'checkExtensionPopup' => 'headerLayout', //'conditionHide' => true, 'label' => __( 'Show number of followers', 'instagram-feed' ), 'stacked' => 'true', 'labelStrong' => 'true', 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'separator', 'condition' => ['showheader' => [true]], 'top' => 10, 'bottom' => 10, ], [ 'type' => 'toggleset', 'id' => 'headerstyle', 'condition' => ['showheader' => [true]], 'heading' => __( 'Header Style', 'instagram-feed' ), 'options' => [ [ 'value' => 'standard', 'label' => __( 'Standard', 'instagram-feed' ) ], [ 'value' => 'boxed', 'checkExtension' => 'headerLayout', 'label' => __( 'Boxed', 'instagram-feed' ) ], [ 'value' => 'centered', 'checkExtension' => 'headerLayout', 'label' => __( 'Centered', 'instagram-feed' ) ] ] ], ]; } /** * Get Customize Tab Posts Section * @since 6.0 * @return array */ public static function get_customize_posts_controls(){ return [ [ 'type' => 'heading', 'heading' => __( 'Advanced', 'instagram-feed' ), 'proLabel' => true, 'checkExtensionPopupLearnMore' => 'postStyling', 'description' => __( 'These properties are available in the PRO version.', 'instagram-feed' ), ], [ 'type' => 'checkbox', 'id' => 'showcaption', 'label' => __( 'Caption', 'instagram-feed' ), 'labelStrong' => 'true', 'separator' => 'bottom', 'checkExtensionDimmed' => 'postStyling', 'checkExtensionPopup' => 'postStyling', 'disabledInput' => true, 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'checkbox', 'id' => 'showlikes', 'label' => __( 'Like and Comment Summary', 'instagram-feed' ), 'labelStrong' => 'true', 'checkExtensionDimmed' => 'postStyling', 'checkExtensionPopup' => 'postStyling', 'separator' => 'bottom', 'disabledInput' => true, 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'checkbox', 'id' => 'showlikes', 'label' => __( 'Hover State', 'instagram-feed' ), 'labelStrong' => 'true', 'checkExtensionDimmed' => 'postStyling', 'checkExtensionPopup' => 'postStyling', 'separator' => 'bottom', 'disabledInput' => true, 'options' => [ 'enabled' => true, 'disabled' => false ] ], ]; } /** * Get Customize Tab Posts Section * @since 6.0 * @return array */ public static function get_nested_images_videos_controls(){ return [ [ 'type' => 'separator', 'top' => 20, 'bottom' => 20, ], [ 'type' => 'select', 'id' => 'imageres', 'strongHeading' => 'true', 'conditionHide' => true, 'stacked' => 'true', 'heading' => __( 'Resolution', 'instagram-feed' ), 'description' => __( 'By default we auto-detect image width and fetch a optimal resolution.', 'instagram-feed' ), 'options' => [ 'auto' => __( 'Auto-detect (recommended)', 'instagram-feed' ), 'thumb' => __( 'Thumbnail (150x150)', 'instagram-feed' ), 'medium' => __( 'Medium (320x320)', 'instagram-feed' ), 'full' => __( 'Full size (640x640)', 'instagram-feed' ), ] ] ]; } /** * Get Customize Tab Posts Section * @since 6.0 * @return array */ public static function get_nested_caption_controls(){ return [ [ 'type' => 'switcher', 'id' => 'showcaption', 'label' => __( 'Enable', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'separator', 'top' => 15, 'bottom' => 15, 'condition' => ['showcaption' => [true]], #'conditionHide' => true, ], [ 'type' => 'number', 'id' => 'captionlength', 'condition' => ['showcaption' => [true]], #'conditionHide' => true, 'stacked' => 'true', 'fieldSuffix' => 'characters', 'heading' => __( 'Maximum Text Length', 'instagram-feed' ), 'description' => __( 'Caption will truncate after reaching the length', 'instagram-feed' ), ], [ 'type' => 'separator', 'top' => 25, 'bottom' => 15, 'condition' => ['showcaption' => [true]], #'conditionHide' => true, ], [ 'type' => 'heading', 'condition' => ['showcaption' => [true]], #'conditionHide' => true, 'heading' => __( 'Text', 'instagram-feed' ), ], [ 'type' => 'select', 'id' => 'captionsize', 'condition' => ['showcaption' => [true]], #'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Size', 'instagram-feed' ), 'stacked' => 'true', 'style' => ['.sbi_caption_wrap .sbi_caption' => 'font-size:{{value}}px!important;'], 'options' => SBI_Builder_Customizer_Tab::get_text_size_options() ], [ 'type' => 'colorpicker', 'id' => 'captioncolor', 'condition' => ['showcaption' => [true]], #'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Color', 'instagram-feed' ), 'style' => ['.sbi_caption_wrap .sbi_caption' => 'color:{{value}}!important;'], 'stacked' => 'true' ], ]; } /** * Get Customize Tab Posts Section * @since 6.0 * @return array */ public static function get_nested_like_comment_summary_controls(){ return [ [ 'type' => 'switcher', 'id' => 'showlikes', 'label' => __( 'Enable', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'separator', 'top' => 15, 'bottom' => 15, 'condition' => ['showlikes' => [true]], #'conditionHide' => true, ], [ 'type' => 'heading', 'condition' => ['showlikes' => [true]], #'conditionHide' => true, 'heading' => __( 'Icon', 'instagram-feed' ), ], [ 'type' => 'select', 'id' => 'likessize', 'condition' => ['showlikes' => [true]], #'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Size', 'instagram-feed' ), 'stacked' => 'true', 'style' => ['.sbi_likes, .sbi_comments, .sbi_likes svg, .sbi_comments svg' => 'font-size:{{value}}px!important;'], 'options' => SBI_Builder_Customizer_Tab::get_text_size_options() ], [ 'type' => 'colorpicker', 'id' => 'likescolor', 'condition' => ['showlikes' => [true]], #'conditionHide' => true, 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Color', 'instagram-feed' ), 'style' => ['.sbi_likes, .sbi_comments' => 'color:{{value}};'], 'stacked' => 'true' ], ]; } /** * Get Customize Tab Posts Section * @since 6.0 * @return array */ public static function get_nested_hover_state_controls(){ return [ [ 'type' => 'colorpicker', 'id' => 'hovercolor', 'icon' => 'background', 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Background', 'instagram-feed' ), 'style' => ['.sbi_link' => 'background:{{value}}!important;'], 'stacked' => 'true' ], [ 'type' => 'colorpicker', 'id' => 'hovertextcolor', 'icon' => 'text', 'layout' => 'half', 'strongHeading' => 'false', 'heading' => __( 'Text', 'instagram-feed' ), 'style' => ['.sbi_photo_wrap .sbi_username > a, .sbi_photo_wrap .sbi_caption,.sbi_photo_wrap .sbi_instagram_link,.sbi_photo_wrap .sbi_hover_bottom,.sbi_photo_wrap .sbi_location,.sbi_photo_wrap .sbi_meta,.sbi_photo_wrap .sbi_comments' => 'color:{{value}}!important;'], 'stacked' => 'true' ], [ 'type' => 'heading', 'heading' => __( 'Information to display', 'instagram-feed' ), ], [ 'type' => 'checkboxlist', 'id' => 'hoverdisplay', 'options' => [ [ 'value' => 'username', 'label' => __( 'Username', 'instagram-feed' ), ], [ 'value' => 'date', 'label' => __( 'Date', 'instagram-feed' ), ], [ 'value' => 'instagram', 'label' => __( 'Instagram Icon', 'instagram-feed' ), ], [ 'value' => 'caption', 'label' => __( 'Caption', 'instagram-feed' ), ], [ 'value' => 'likes', 'label' => __( 'Like/Comment Icons
(Business account only)', 'instagram-feed' ), ] ], 'reverse' => 'true', ], ]; } /** * Get Customize Tab Load More Button Section * @since 6.0 * @return array */ public static function get_customize_loadmorebutton_controls(){ return [ [ 'type' => 'switcher', 'id' => 'showbutton', 'label' => __( 'Enable', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'separator', 'condition' => ['showbutton' => [true]], 'top' => 20, 'bottom' => 5, ], [ 'type' => 'text', 'id' => 'buttontext', 'condition' => ['showbutton' => [true]], //'conditionHide' => true, 'strongHeading' => 'true', 'heading' => __( 'Text', 'instagram-feed' ), ], [ 'type' => 'separator', 'condition' => ['showbutton' => [true]], 'top' => 15, 'bottom' => 15, ], [ 'type' => 'heading', 'heading' => __( 'Color', 'instagram-feed' ), 'condition' => ['showbutton' => [true]], ], [ 'type' => 'colorpicker', 'id' => 'buttoncolor', 'condition' => ['showbutton' => [true]], 'layout' => 'half', 'icon' => 'background', 'strongHeading' => 'false', 'heading' => __( 'Background', 'instagram-feed' ), 'style' => ['.sbi_load_btn' => 'background:{{value}}!important;'], 'stacked' => 'true' ], [ 'type' => 'colorpicker', 'id' => 'buttonhovercolor', 'condition' => ['showbutton' => [true]], 'layout' => 'half', 'icon' => 'cursor', 'strongHeading' => 'false', 'heading' => __( 'Hover State', 'instagram-feed' ), 'style' => ['.sbi_load_btn:hover' => 'background:{{value}}!important;'], 'stacked' => 'true' ], [ 'type' => 'colorpicker', 'id' => 'buttontextcolor', 'condition' => ['showbutton' => [true]], 'layout' => 'half', 'icon' => 'text', 'strongHeading' => 'false', 'heading' => __( 'Text', 'instagram-feed' ), 'style' => ['.sbi_load_btn' => 'color:{{value}}!important;'], 'stacked' => 'true' ], [ 'type' => 'separator', 'condition' => ['showbutton' => [true]], 'top' => 15, 'bottom' => 5, ], [ 'type' => 'heading', 'heading' => __( 'Advanced', 'instagram-feed' ), 'proLabel' => true, 'checkExtensionPopupLearnMore' => 'postStyling', 'utmLink' => 'https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free&utm_source=customizer&utm_medium=load-more', 'description' => __( 'These properties are available in the PRO version.', 'instagram-feed' ), ], [ 'type' => 'separator', 'condition' => ['showheader' => [true]], 'top' => 30, 'bottom' => 10, ], [ 'type' => 'switcher', 'id' => 'autoscroll', 'condition' => ['showbutton' => [true]], 'switcherTop' => true, 'checkExtensionDimmed' => 'postStyling', 'checkExtensionPopup' => 'postStyling', 'utmLink' => 'https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free&utm_source=customizer&utm_medium=load-more', //'conditionHide' => true, 'heading' => __( 'Infinite Scroll', 'instagram-feed' ), 'description' => __( 'This will load more posts automatically when the users reach the end of the feed', 'instagram-feed' ), 'stacked' => 'true', 'labelStrong' => 'true', 'layout' => 'half', 'reverse' => 'true', 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'number', 'id' => 'autoscrolldistance', 'condition' => ['showbutton' => [true],'autoscroll' => ['true']], 'conditionHide' => true, 'strongHeading' => false, 'stacked' => 'true', 'layout' => 'half', 'placeholder' => '200', 'child' => true, 'fieldSuffix' => 'px', 'heading' => __( 'Trigger Distance', 'instagram-feed' ), ], ]; } /** * Get Customize Tab Follow Button Section * @since 6.0 * @return array */ public static function get_customize_followbutton_controls(){ return [ [ 'type' => 'switcher', 'id' => 'showfollow', 'label' => __( 'Enable', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'separator', 'condition' => ['showfollow' => [true]], 'top' => 20, 'bottom' => 5, ], [ 'type' => 'text', 'id' => 'followtext', 'condition' => ['showfollow' => [true]], //'conditionHide' => true, 'strongHeading' => 'true', 'heading' => __( 'Text', 'instagram-feed' ), ], [ 'type' => 'separator', 'condition' => ['showfollow' => [true]], 'top' => 15, 'bottom' => 15, ], [ 'type' => 'heading', 'heading' => __( 'Color', 'instagram-feed' ), 'condition' => ['showfollow' => [true]], ], [ 'type' => 'colorpicker', 'id' => 'followcolor', 'condition' => ['showfollow' => [true]], 'layout' => 'half', 'icon' => 'background', 'strongHeading' => 'false', 'heading' => __( 'Background', 'instagram-feed' ), 'style' => ['.sbi_follow_btn a' => 'background:{{value}}!important;'], 'stacked' => 'true' ], [ 'type' => 'colorpicker', 'id' => 'followhovercolor', 'condition' => ['showfollow' => [true]], 'layout' => 'half', 'icon' => 'cursor', 'strongHeading' => 'false', 'heading' => __( 'Hover State', 'instagram-feed' ), 'style' => ['.sbi_follow_btn a:hover' => 'box-shadow:inset 0 0 10px 20px {{value}}!important;'], 'stacked' => 'true' ], [ 'type' => 'colorpicker', 'id' => 'followtextcolor', 'condition' => ['showbutton' => [true]], 'layout' => 'half', 'icon' => 'text', 'strongHeading' => 'false', 'heading' => __( 'Text', 'instagram-feed' ), 'style' => ['.sbi_follow_btn a' => 'color:{{value}}!important;'], 'stacked' => 'true' ] ]; } /** * Get Customize Tab LightBox Section * @since 6.0 * @return array */ public static function get_customize_lightbox_controls(){ return [ [ 'type' => 'separator', 'checkExtensionDimmed' => 'lightbox', 'checkExtensionPopup' => 'lightbox', 'top' => 40, 'bottom' => 5, ], [ 'type' => 'heading', 'heading' => __( 'Color', 'instagram-feed' ), 'checkExtensionDimmed' => 'lightbox', 'checkExtensionPopup' => 'lightbox', ], [ 'type' => 'colorpicker', 'id' => 'fakecolorpicker', 'icon' => 'background', 'layout' => 'half', 'strongHeading' => 'false', 'checkExtensionDimmed' => 'lightbox', 'checkExtensionPopup' => 'lightbox', 'heading' => __( 'Background', 'instagram-feed' ), 'stacked' => 'true' ], [ 'type' => 'colorpicker', 'id' => 'fakecolorpicker', 'icon' => 'text', 'layout' => 'half', 'strongHeading' => 'false', 'checkExtensionDimmed' => 'lightbox', 'checkExtensionPopup' => 'lightbox', 'heading' => __( 'Text', 'instagram-feed' ), 'stacked' => 'true' ], [ 'type' => 'colorpicker', 'id' => 'fakecolorpicker', 'icon' => 'link', 'layout' => 'half', 'strongHeading' => 'false', 'checkExtensionDimmed' => 'lightbox', 'checkExtensionPopup' => 'lightbox', 'heading' => __( 'Link Color', 'instagram-feed' ), 'stacked' => 'true' ], [ 'type' => 'separator', 'checkExtensionDimmed' => 'lightbox', 'checkExtensionPopup' => 'lightbox', 'top' => 30, 'bottom' => 10, ], [ 'type' => 'heading', 'heading' => __( 'Comments', 'instagram-feed' ), 'tooltip' => __( 'Display comments for your posts inside the lightbox. Comments are only available for User feeds from Business accounts.', 'instagram-feed' ), 'checkExtensionDimmed' => 'lightbox', 'checkExtensionPopup' => 'lightbox', ], [ 'type' => 'number', 'id' => 'numcomments', 'condition' => ['disablelightbox' => [false],'lightboxcomments' => [true]], 'checkExtensionDimmed' => 'lightbox', 'checkExtensionPopup' => 'lightbox', 'strongHeading' => false, 'stacked' => 'true', 'placeholder' => '20', 'fieldSuffixAction' => 'clearCommentCache', 'fieldSuffix' => 'Clear Cache', 'heading' => __( 'No. of Comments', 'instagram-feed' ), 'description' => __( 'Clearing cache will remove all the saved comments in the database', 'instagram-feed' ), 'descriptionPosition' => 'bottom' ], ]; } } PKL\~**4instagram-feed/inc/Builder/Tabs/SBI_Settings_Tab.phpnu[ [ 'heading' => __( 'Sources', 'instagram-feed' ), 'icon' => 'source', 'controls' => self::get_settings_sources_controls() ], 'settings_filters_moderation' => [ 'heading' => __( 'Filters and Moderation', 'instagram-feed' ), 'icon' => 'filter', 'controls' => self::get_settings_filters_moderation_controls() ], 'settings_sort' => [ 'heading' => __( 'Sort', 'instagram-feed' ), 'icon' => 'sort', 'controls' => self::get_settings_sort_controls() ], 'settings_shoppable_feed' => [ 'heading' => __( 'Shoppable Feed', 'instagram-feed' ), 'icon' => 'shop', 'separator' => 'none', 'controls' => self::get_settings_shoppable_feed_controls() ], 'empty_sections' => [ 'heading' => '', 'isHeader' => true, ], 'settings_advanced' => [ 'heading' => __( 'Advanced', 'instagram-feed' ), 'icon' => 'cog', 'controls' => self::get_settings_advanced_controls() ] ]; } /** * Get Settings Tab Filters & Moderation Section * @since 4.0 * @return array */ public static function get_settings_filters_moderation_controls(){ return [ [ 'type' => 'heading', 'strongHeading' => 'true', 'heading' => __( 'Show specific types of posts', 'instagram-feed' ) ], [ 'type' => 'checkbox', 'id' => 'reelsposts', 'label' => __( 'Reels', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', 'checkViewDisabled' => 'moderationMode', 'ajaxAction' => 'feedFlyPreview', 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'separator', 'top' => 20, 'bottom' => 20 ], [ 'type' => 'heading', 'heading' => __( 'Advanced', 'instagram-feed' ), 'proLabel' => true, 'description' => __( 'Visually moderate your feed or hide specific posts with Instagram Feed Pro.', 'instagram-feed' ), 'checkExtensionPopup' => 'filtermoderation', 'checkExtensionPopupLearnMore' => 'filtermoderation' ], [ 'type' => 'customview', 'viewId' => 'moderationmode', 'checkExtensionDimmed' => 'filtermoderation', 'checkExtensionPopup' => 'filtermoderation', 'disabledInput' => true, 'switcher' => [ 'id' => 'enablemoderationmode', 'label' => __( 'Enable', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', 'labelStrong' => true, 'options' => [ 'enabled' => true, 'disabled' => false ] ], 'moderationTypes' => [ 'allow' => [ 'label' => __( 'Allow List', 'instagram-feed' ), 'description' => __( 'Hides post by default so you can select the ones you want to show', 'instagram-feed' ), ], 'block' => [ 'label' => __( 'Block List', 'instagram-feed' ), 'description' => __( 'Show all posts by default so you can select the ones you want to hide', 'instagram-feed' ), ] ] ], [ 'type' => 'heading', 'strongHeading' => 'true', 'heading' => __( 'Filters', 'instagram-feed' ), 'checkExtensionDimmed' => 'filtermoderation', 'checkExtensionPopup' => 'filtermoderation', 'disabledInput' => true, 'checkViewDisabled' => 'moderationMode' ], [ 'type' => 'textarea', 'id' => 'includewords', 'heading' => __( 'Only show posts containing', 'instagram-feed' ), 'tooltip' => __( 'Show your active stories from Instagram when your header avatar is clicked. Displays a colored ring around your avatar when a story is available.', 'instagram-feed' ), 'placeholder' => __( 'Add words here to only show posts containing these words', 'instagram-feed' ), 'checkExtensionDimmed' => 'filtermoderation', 'checkExtensionPopup' => 'filtermoderation', 'disabledInput' => true, 'checkViewDisabled' => 'moderationMode' ], [ 'type' => 'separator', 'top' => 10, 'bottom' => 10, 'checkExtensionDimmed' => 'filtermoderation', 'checkExtensionPopup' => 'filtermoderation', 'disabledInput' => true, 'checkViewDisabled' => 'moderationMode' ], [ 'type' => 'textarea', 'id' => 'excludewords', 'disabledInput' => true, 'heading' => __( 'Do not show posts containing', 'instagram-feed' ), 'tooltip' => __( 'Remove any posts containing these text strings, separating multiple strings using commas.', 'instagram-feed' ), 'placeholder' => __( 'Add words here to hide any posts containing these words', 'instagram-feed' ), 'checkExtensionDimmed' => 'filtermoderation', 'checkExtensionPopup' => 'filtermoderation', 'disabledInput' => true, 'checkViewDisabled' => 'moderationMode' ], [ 'type' => 'heading', 'strongHeading' => 'true', 'stacked' => 'true', 'heading' => __( 'Show specific types of posts', 'instagram-feed' ), 'checkExtensionDimmed' => 'filtermoderation', 'checkExtensionPopup' => 'filtermoderation', 'disabledInput' => true, 'checkViewDisabled' => 'moderationMode' ], [ 'type' => 'checkbox', 'id' => 'photosposts', 'label' => __( 'Photos', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', 'checkViewDisabled' => 'moderationMode', 'ajaxAction' => 'feedFlyPreview', 'checkExtensionDimmed' => 'filtermoderation', 'checkExtensionPopup' => 'filtermoderation', 'disabledInput' => true, 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'checkbox', 'id' => 'videosposts', 'label' => __( 'Feed Videos', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', 'checkViewDisabled' => 'moderationMode', 'ajaxAction' => 'feedFlyPreview', 'checkExtensionDimmed' => 'filtermoderation', 'checkExtensionPopup' => 'filtermoderation', 'disabledInput' => true, 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'checkbox', 'id' => 'igtvposts', 'label' => __( 'IGTV Videos', 'instagram-feed' ), 'reverse' => 'true', 'stacked' => 'true', 'checkViewDisabled' => 'moderationMode', 'ajaxAction' => 'feedFlyPreview', 'checkExtensionDimmed' => 'filtermoderation', 'checkExtensionPopup' => 'filtermoderation', 'disabledInput' => true, 'options' => [ 'enabled' => true, 'disabled' => false ] ], [ 'type' => 'separator', 'top' => 10, 'bottom' => 10, 'checkExtensionDimmed' => 'filtermoderation', 'checkExtensionPopup' => 'filtermoderation', 'disabledInput' => true, 'checkViewDisabled' => 'moderationMode' ], [ 'type' => 'number', 'id' => 'offset', 'strongHeading' => 'true', 'stacked' => 'true', 'placeholder' => '0', 'fieldSuffix' => 'posts', 'heading' => __( 'Post Offset', 'instagram-feed' ), 'description' => __( 'This will skip the specified number of posts from displaying in the feed', 'instagram-feed' ), 'checkExtensionDimmed' => 'filtermoderation', 'checkExtensionPopup' => 'filtermoderation', 'disabledInput' => true, 'checkViewDisabled' => 'moderationMode' ], ]; } /** * Get Settings Tab Sort Section * @since 4.0 * @return array */ public static function get_settings_sort_controls(){ return [ [ 'type' => 'toggleset', 'id' => 'sortby', 'heading' => __( 'Sort Posts by', 'instagram-feed' ), 'strongHeading' => 'true', 'ajaxAction' => 'feedFlyPreview', 'options' => [ [ 'value' => 'none', 'label' => __( 'Newest', 'instagram-feed' ) ], [ 'value' => 'likes', 'checkExtension' => 'postStyling', 'utmLink' => 'https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free&utm_source=customizer&utm_medium=load-more', 'proLabel' => true, 'label' => __( 'Likes', 'instagram-feed' ) ], [ 'value' => 'random', 'label' => __( 'Random', 'instagram-feed' ) ] ] ], ]; } /** * Get Settings Tab Shoppable Feed Section * @since 4.0 * @return array */ public static function get_settings_shoppable_feed_controls(){ return [ [ 'type' => 'customview', 'condition' => ['shoppablefeed' => [false]], 'conditionHide' => true, 'viewId' => 'shoppabledisabled' ], [ 'type' => 'customview', 'condition' => ['shoppablefeed' => [true]], 'conditionHide' => true, 'viewId' => 'shoppableenabled' ], [ 'type' => 'customview', 'condition' => ['shoppablefeed' => [true]], 'conditionHide' => true, 'viewId' => 'shoppableselectedpost' ] ]; } /** * Get Settings Tab Advanced Section * @since 4.0 * @return array */ public static function get_settings_advanced_controls(){ return [ [ 'type' => 'number', 'id' => 'maxrequests', 'strongHeading' => 'true', 'heading' => __( 'Max Concurrent API Requests', 'instagram-feed' ), 'description' => __( 'Change the number of maximum concurrent API requests. Not recommended unless directed by the support team.', 'instagram-feed' ), ], [ 'type' => 'switcher', 'id' => 'customtemplates', 'label' => __( 'Custom Templates', 'instagram-feed' ), 'description' => sprintf( __( 'The default HTML for the feed can be replaced with custom templates added to your theme\'s folder. Enable this setting to use these templates. Custom templates are not used in the feed editor. %sLearn More%s', 'instagram-feed' ), '', '' ), 'descriptionPosition' => 'bottom', 'reverse' => 'true', 'strongHeading' => 'true', 'labelStrong' => 'true', 'options' => [ 'enabled' => true, 'disabled' => false ] ], ]; } /** * Get Settings TabSources Section * @since 6.0 * @return array */ public static function get_settings_sources_controls(){ return [ [ 'type' => 'customview', 'viewId' => 'sources' ], ]; } } PKL\HD 4 4 >instagram-feed/inc/Builder/Tabs/SBI_Builder_Customizer_Tab.phpnu[ [ 'id' => 'customize', 'heading' => __( 'Customize', 'instagram-feed' ), 'sections' => SBI_Customize_Tab::get_sections() ], 'settings' => [ 'id' => 'settings', 'heading' => __( 'Settings', 'instagram-feed' ), 'sections' => SBI_Settings_Tab::get_sections() ] ]; } /** * Text Size Options * * * @since 4.0 * @access public * * @return array */ public static function get_text_size_options(){ return [ 'inherit' => __( 'Inherit', 'instagram-feed' ), '10' => '10px', '11' => '11px', '12' => '12px', '13' => '13px', '14' => '14px', '15' => '15px', '16' => '16px', '18' => '18px', '20' => '20px', '24' => '24px', '28' => '28px', '32' => '32px', '36' => '36px', '42' => '42px', '48' => '48px', '54' => '54px', '60' => '60px', ]; } /** * header Icons Options * * * @since 4.0 * @access public * * @return array */ public static function get_header_icons_options(){ return [ 'facebook-square' => 'Facebook 1', 'facebook' => 'Facebook 2', 'calendar' => 'Events 1', 'calendar-o' => 'Events 2', 'picture-o' => 'Photos', 'users' => 'People', 'thumbs-o-up' => 'Thumbs Up 1', 'thumbs-up' => 'Thumbs Up 2', 'comment-o' => 'Speech Bubble 1', 'comment' => 'Speech Bubble 2', 'ticket' => 'Ticket', 'list-alt' => 'News List', 'file' => 'File 1', 'file-o' => 'File 2', 'file-text' => 'File 3', 'file-text-o' => 'File 4', 'youtube-play ' => 'Video', 'youtube-play' => 'YouTube', 'vimeo-square' => 'Vimeo', ]; } /** * Date Format Options * * * @since 4.0 * @access public * * @return array */ public static function get_date_format_options(){ $original = strtotime('2016-07-25T17:30:00+0000'); return [ '1' => __('2 days ago','instagram-feed'), '2' => date('F jS, g:i a', $original), '3' => date('F jS', $original), '4' => date('D F jS', $original), '5' => date('l F jS', $original), '6' => date('D M jS, Y', $original), '7' => date('l F jS, Y', $original), '8' => date('l F jS, Y - g:i a', $original), '9' => date("l M jS, 'y", $original), '10' => date('m.d.y', $original), '18' => date('m.d.y - G:i', $original), '11' => date('m/d/y', $original), '12' => date('d.m.y', $original), '19' => date('d.m.y - G:i', $original), '13' => date('d/m/y', $original), '14' => date('d-m-Y, G:i', $original), '15' => date('jS F Y, G:i', $original), '16' => date('d M Y, G:i', $original), '17' => date('l jS F Y, G:i', $original), '18' => date('Y-m-d', $original), 'custom' => __('Custom','instagram-feed') ]; } }PKL\i 1instagram-feed/inc/Builder/SBI_Tooltip_Wizard.phpnu[init(); } /** * Initialize class. * * @since 6.0 */ public function init() { /* if ( ! wpforms_is_admin_page( 'builder' ) && ! wp_doing_ajax() && ! $this->is_form_embed_page() ) { return; } */ $this->hooks(); } /** * Register hooks. * * @since 6.0 */ public function hooks() { add_action( 'admin_enqueue_scripts', [ $this, 'enqueues' ] ); add_action( 'admin_footer', [ $this, 'output' ] ); } /** * Enqueue assets. * * @since 6.0 */ public function enqueues() { wp_enqueue_style( 'sbi_tooltipster', SBI_PLUGIN_URL . 'admin/builder/assets/css/tooltipster.css', null, SBIVER ); wp_enqueue_script( 'sbi_tooltipster', SBI_PLUGIN_URL . 'admin/builder/assets/js/jquery.tooltipster.min.js', [ 'jquery' ], SBIVER, true ); wp_enqueue_script( 'sbi-admin-tooltip-wizard', SBI_PLUGIN_URL . 'admin/builder/assets/js/tooltip-wizard.js', [ 'jquery' ], SBIVER ); $wp_localize_data = []; if( $this->check_gutenberg_wizard() ){ $wp_localize_data['sbi_wizard_gutenberg'] = true; } wp_localize_script( 'sbi-admin-tooltip-wizard', 'sbi_admin_tooltip_wizard', $wp_localize_data ); } /** * Output HTML. * * @since 6.0 */ public function output() { if( $this->check_gutenberg_wizard() ){ $this->gutenberg_tooltip_output(); } } /** * Gutenberg Tooltip Output HTML. * * @since 6.0 */ public function check_gutenberg_wizard() { global $pagenow; return ( ( $pagenow == 'post.php' ) || (get_post_type() == 'page') ) && ! empty( $_GET['sbi_wizard'] ); } /** * Gutenberg Tooltip Output HTML. * * @since 6.0 */ public function gutenberg_tooltip_output() { ?>

and click the block to embed it.','instagram-feed'); ?>

print_control_wrapper($editingType); } } }PKL\v)instagram-feed/inc/Builder/SBI_Source.phpnu[ array(12) { ["access_token"]=> string(177) "2VuX2HJb9MhA743QVp8GxZAxQZDZD" ["user_id"]=> string(17) "438429" ["username"]=> string(14) "egel" ["is_valid"]=> bool(true) ["last_checked"]=> int(1627935580) ["type"]=> string(8) "business" ["account_type"]=> string(8) "business" ["profile_picture"]=> string(308) "https://scontent.ffcm1-1.fna.fbcdn.net/v/t51.2885-15/11337206_1687352168145969_640230547_a.jpg?_nc_cat=100&ccb=1-3&_nc_sid=86c713&_nc_ohc=jwEvCq4EZ4EAX9CG3Wc&_nc_oc=AQm6GtCuqAmo9vexkGd0lk2HV9cB1R7UzXhdufRwLnSoL_QSGKgZXgoX7G4sCS3P5sw&_nc_ht=scontent.ffcm1-1.fna&oh=82ec797eaa624bd02fbdeef335a3f77f&oe=610DEE95" ["use_tagged"]=> string(1) "1" ["name"]=> string(57) "{"jsonencoded":"Example \ud83c\udfd4\ud83d\udc1f"}" ["page_access_token"]=> string(186) "V6BuEgJN9vCJzZBE3AGsZBITmXj57" ["local_avatar"]=> bool(false) } */ namespace InstagramFeed\Builder; use function DI\value; use InstagramFeed\Helpers\Util; class SBI_Source { const BATCH_SIZE = 10; /** * AJAX hooks for various feed data related functionality * * @since 6.0 */ public static function hooks() { add_action( 'wp_ajax_sbi_source_builder_update', array( 'InstagramFeed\Builder\SBI_Source', 'builder_update' ) ); add_action( 'wp_ajax_sbi_source_builder_update_multiple', array( 'InstagramFeed\Builder\SBI_Source', 'builder_update_multiple' ) ); add_action( 'wp_ajax_sbi_source_get_page', array( 'InstagramFeed\Builder\SBI_Source', 'get_page' ) ); add_action( 'admin_init', array( 'InstagramFeed\Builder\SBI_Source', 'batch_process_legacy_source_queue' ) ); } /** * Used in an AJAX call to update sources based on selections or * input from a user. Makes an API request to add additiona info * about the connected source. * * @since 6.0 */ public static function builder_update() { if ( ! check_ajax_referer( 'sbi-admin', 'nonce', false ) ) { wp_send_json_error(); } if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $source_data = array( 'access_token' => sanitize_text_field( $_POST['access_token'] ), 'id' => sanitize_text_field( $_POST['id'] ), 'type' => sanitize_text_field( $_POST['type'] ), 'username' => isset( $_POST['username'] ) ? sanitize_text_field( $_POST['username'] ) : '', ); $return = sbi_connect_new_account( $source_data['access_token'], $source_data['id'] ); if ( empty( $return ) ) { $return = array( 'error' => '
' . esc_html__( 'Something went wrong. Please make sure the ID and access token are correct.', 'instagram-feed' ) . '
' . '' . '
', ); } if ( empty( $return['error'] ) ) { wp_send_json_success( SBI_Feed_Builder::get_source_list() ); } wp_send_json_error( array( 'message' => $return['error'] ) ); } /** * Add our update a source from raw API data. * * @param $source_data * * @return string */ public static function process_connecting_source_data( $source_data ) { $connected_account = array( 'id' => $source_data['id'], 'user_id' => $source_data['id'], 'type' => $source_data['type'], 'account_type' => $source_data['type'], 'username' => $source_data['username'], 'access_token' => $source_data['access_token'], 'privilege' => $source_data['privilege'], ); $single_source = self::update_single_source( $connected_account, false ); if ( ! empty( $single_source['error'] ) ) { $message = ! empty( $single_source['error']['error']['message'] ) ? esc_html( $single_source['error']['error']['message'] ) : ''; $code = ! empty( $single_source['error']['error']['code'] ) ? esc_html( $single_source['error']['error']['code'] ) : ''; if ( isset( $single_source['error']['response'] ) && is_wp_error( $single_source['error']['response'] ) ) { $response = $single_source['error']['response']; $message = sprintf( __( 'Error connecting to %s.', 'instagram-feed' ), $single_source['error']['url'] ); if ( isset( $response ) && isset( $response->errors ) ) { foreach ( $response->errors as $key => $item ) { $code = $key; $message .= $item[0]; } } } $message .= ' ' . __( 'Directions on how to resolve this issue', 'instagram-feed' ) . ''; $return_html = '
'; $return_html .= ''; $return_html .= ''; $return_html .= ''; $return_html .= '' . sprintf( __( 'Connection Error: %s ', 'instagram-feed' ), $code ) . '
' . $message . '
'; $return = array( 'success' => false, 'message' => $return_html, ); return sbi_json_encode( $return ); } else { global $sb_instagram_posts_manager; $sb_instagram_posts_manager->remove_error( 'connection' ); } $manager = new \SB_Instagram_Data_Manager(); $manager->update_last_used(); return sbi_json_encode( SBI_Feed_Builder::get_source_list() ); } /** * Used in an AJAX call to update Multiple sources based on selections or * input from a user. Makes an API request to add additiona info * about the connected source. * * @since 6.0 */ public static function builder_update_multiple() { if ( ! check_ajax_referer( 'sbi-admin', 'nonce', false ) ) { wp_send_json_error(); } if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } if ( isset( $_POST['sourcesList'] ) && ! empty( $_POST['sourcesList'] ) && is_array( $_POST['sourcesList'] ) ) { foreach ( $_POST['sourcesList'] as $single_source ) : $source_data = array( 'access_token' => sanitize_text_field( $single_source['access_token'] ), 'id' => sanitize_text_field( $single_source['id'] ), 'type' => sanitize_text_field( $single_source['type'] ), 'username' => isset( $single_source['username'] ) ? sanitize_text_field( $single_source['username'] ) : '', ); if ( $single_source['type'] === 'business' ) { $source_data['privilege'] = 'tagged'; } if ( ! empty( $single_source['name'] ) ) { $source_data['name'] = sanitize_text_field( $single_source['name'] ); } self::process_connecting_source_data( $source_data ); endforeach; } echo sbi_json_encode( SBI_Feed_Builder::get_source_list() ); wp_die(); } /** * Get a list of sources with a limit and offset like a page * * @since 6.0 */ public static function get_page() { if ( ! check_ajax_referer( 'sbi-admin', 'nonce', false ) ) { wp_send_json_error(); } if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } $args = array( 'page' => $_POST['page'] ); $source_data = SBI_Db::source_query( $args ); echo sbi_json_encode( $source_data ); wp_die(); } /** * Connection URLs are based on the website connecting accounts so that is * configured here and returned * * @param bool $is_settings * * @return array * * @since 6.0 */ public static function get_connection_urls( $is_settings = false ) { $urls = array(); $admin_url_state = $is_settings ? admin_url( 'admin.php?page=sbi-settings' ) : admin_url( 'admin.php?page=sbi-feed-builder' ); $nonce = wp_create_nonce( 'sbi_con' ); //If the admin_url isn't returned correctly then use a fallback if ( $admin_url_state === '/wp-admin/admin.php?page=sbi-feed-builder' || $admin_url_state === '/wp-admin/admin.php?page=sbi-feed-builder&tab=configuration' ) { $admin_url_state = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; } $admin_email = get_option( 'admin_email', '' ); if ( is_user_logged_in() ) { $current_user = wp_get_current_user(); $user_email = $current_user->user_email; } $user_email = isset( $user_email ) ? $user_email : $admin_email; $urls['personal'] = array( 'connect' => SBI_CONNECT_URL, 'wordpress_user' => sanitize_email( $user_email ), 'v' => 'free', 'vn' => SBIVER, 'sbi_con' => $nonce, ); $urls['business'] = array( 'connect' => SBI_CONNECT_URL, 'wordpress_user' => sanitize_email( $user_email ), 'v' => 'free', 'vn' => SBIVER, 'sbi_con' => $nonce, ); $urls['stateURL'] = $admin_url_state; return $urls; } /** * Used as a listener for the account connection process. If * data is returned from the account connection processed it's used * to generate the list of possible sources to chose from. * * @return array|bool * * @since 6.0 */ public static function maybe_source_connection_data() { $nonce = ! empty( $_GET['sbi_con'] ) ? sanitize_key( $_GET['sbi_con'] ) : ''; if ( ! wp_verify_nonce( $nonce, 'sbi_con' ) ) { return false; } if ( isset( $_GET['sbi_access_token'] ) && isset( $_GET['sbi_graph_api'] ) ) { $return = self::retrieve_available_business_accounts(); return $return; } elseif ( isset( $_GET['sbi_access_token'] ) && isset( $_GET['sbi_account_type'] ) ) { $return = self::retrieve_available_personal_accounts(); return $return; } return false; } /** * Uses the Instagram Basic Display API to get available personal * accounts * * @return array|bool * * @since 6.0 */ public static function retrieve_available_personal_accounts() { $encryption = new \SB_Instagram_Data_Encryption(); $return = array( 'type' => 'personal', 'unconnectedAccounts' => array(), 'matchingExistingAccounts' => array(), 'didQuickUpdate' => false, ); $access_token = sanitize_text_field( $_GET['sbi_access_token'] ); if ( empty( $access_token ) ) { return array(); } $user_id = sanitize_text_field( $_GET['sbi_id'] ); $user_name = sanitize_text_field( $_GET['sbi_username'] ); $expires_in = (int) $_GET['sbi_expires_in']; $expires_timestamp = time() + $expires_in; $source_data = array( 'access_token' => $access_token, 'id' => $user_id, 'user_id' => $user_id, 'type' => 'basic', 'username' => $user_name, 'privilege' => '', 'expires' => date( 'Y-m-d H:i:s', $expires_timestamp ), ); $connection = new \SB_Instagram_API_Connect( $source_data, 'header', array() ); $connection->connect(); $header_details = '{}'; $source_data['error'] = ''; if ( ! $connection->is_wp_error() && ! $connection->is_instagram_error() ) { $header_details_array = $connection->get_data(); $header_details_array = self::merge_account_details( $header_details_array, $source_data ); $source_data['username'] = $header_details_array['username']; $header_details = sbi_json_encode( $header_details_array ); } else { $source_data['error'] = $connection; if ( $connection->is_wp_error() ) { $page_error = $connection->get_wp_error(); if ( ! empty( $page_error ) && isset( $page_error['response']->errors ) ) { $error_message = ''; foreach ( $page_error['response']->errors as $key => $item ) { $error_message .= $key . ': ' . $item[0] . ' '; } return array( 'error' => array( 'code' => 'HTTP Request', 'message' => $error_message, 'details' => $error_message, ), ); } } else { $error = $connection->get_data(); return array( 'error' => array( 'code' => $error['error']['code'], 'message' => $error['error']['message'], 'details' => $error['error']['message'], ), ); } } $source_data['info'] = $header_details; $return['unconnectedAccounts'][] = $source_data; $args = array( 'id' => $user_id, ); $results = SBI_Db::source_query( $args ); $already_connected_as_business_account = ( isset( $results[0] ) && $results[0]['account_type'] === 'business' ); $matches_existing_personal = ( isset( $results[0] ) && $results[0]['account_type'] !== 'business' ); if ( $already_connected_as_business_account ) { $return['matchingExistingAccounts'] = $results[0]; $instagram_account_data = json_decode( $encryption->decrypt( $results[0]['info'] ), true ); $return['matchingExistingAccounts']['avatar'] = isset( $instagram_account_data['profile_picture_url'] ) ? $instagram_account_data['profile_picture_url'] : false; $return['notice'] = __( 'The Instagram account you are logged into is already connected as a "business" account. Remove the business account if you\'d like to connect as a basic account instead (not recommended).', 'instagram-feed' ); } elseif ( $matches_existing_personal ) { $return['matchingExistingAccounts'] = $results[0]; SBI_Db::delete_source( $results[0]['id'] ); self::update_or_insert( $source_data ); $return['notice'] = ''; $return['didQuickUpdate'] = true; } else { self::update_or_insert( $source_data ); $return['didQuickUpdate'] = true; } return $return; } /** * Uses the Facebook API to retrieve a list of business accounts * * @return array|bool * * @since 6.0 */ public static function retrieve_available_business_accounts() { $return = array( 'type' => 'business', 'unconnectedAccounts' => array(), 'matchingExistingAccounts' => array(), 'didQuickUpdate' => false, ); $access_token = sbi_maybe_clean( urldecode( $_GET['sbi_access_token'] ) ); if ( empty( $access_token ) ) { return array(); } $url = 'https://graph.facebook.com/me/accounts?fields=instagram_business_account,access_token&limit=500&access_token=' . $access_token; $args = array( 'timeout' => 60, ); $result = wp_remote_get( $url, $args ); $pages_data = '{}'; if ( ! is_wp_error( $result ) ) { $pages_data = $result['body']; } else { $page_error = $result; } if ( isset( $page_error ) && isset( $page_error->errors ) ) { $error_message = ''; foreach ( $page_error->errors as $key => $item ) { $error_message .= $key . ': ' . $item[0] . ' '; } return array( 'error' => array( 'code' => 'HTTP Request', 'message' => __( 'Your server could not complete a remote request to Facebook\'s API. Your host may be blocking access or there may be a problem with your server.', 'instagram-feed' ), 'details' => $error_message, ), ); } $pages_data_arr = json_decode( $pages_data, true ); if ( empty( $pages_data_arr['data'] ) ) { return array( 'error' => array( 'code' => 'No Accounts Found', 'message' => __( 'Couldn\'t find Business Profile', 'instagram-feed' ), 'details' => sprintf( __( 'Uh oh. It looks like this Facebook account is not currently connected to an Instagram Business profile. Please check that you are logged into the %1$sFacebook account%2$s in this browser which is associated with your Instagram Business Profile.', 'instagram-feed' ), '', '' ), ), ); } $user_url = 'https://graph.facebook.com/me?fields=name,id,picture&access_token=' . $access_token; $args = array( 'timeout' => 60, ); $result = wp_remote_get( $user_url, $args ); if ( ! is_wp_error( $result ) ) { $user_data = $result['body']; $user_data_arr = json_decode( $user_data, true ); $return['user'] = $user_data_arr; } $return['numFound'] = count( $pages_data_arr['data'] ); foreach ( $pages_data_arr['data'] as $page_data ) { if ( isset( $page_data['instagram_business_account'] ) ) { $instagram_business_id = $page_data['instagram_business_account']['id']; $page_access_token = isset( $page_data['access_token'] ) ? $page_data['access_token'] : ''; $instagram_account_url = 'https://graph.facebook.com/' . $instagram_business_id . '?fields=name,username,profile_picture_url&access_token=' . $access_token; $args = array( 'timeout' => 60, ); $result = wp_remote_get( $instagram_account_url, $args ); if ( ! is_wp_error( $result ) ) { $instagram_account_info = $result['body']; $instagram_account_data = json_decode( $instagram_account_info, true ); $instagram_biz_img = isset( $instagram_account_data['profile_picture_url'] ) ? $instagram_account_data['profile_picture_url'] : false; $source_data = array( 'access_token' => $access_token, 'id' => $instagram_business_id, 'user_id' => $instagram_business_id, 'type' => 'business', 'username' => $instagram_account_data['username'], 'avatar' => $instagram_biz_img, 'privilege' => 'tagged', ); $source_data['info'] = sbi_json_encode( $instagram_account_data ); $return['unconnectedAccounts'][] = $source_data; $args = array( 'id' => $instagram_business_id, ); $results = SBI_Db::source_query( $args ); $already_connected_as_business_account = ( isset( $results[0] ) && $results[0]['account_type'] === 'business' ); $matches_existing_personal = ( isset( $results[0] ) && $results[0]['account_type'] !== 'business' ); if ( $already_connected_as_business_account ) { SBI_Db::delete_source( $results[0]['id'] ); self::update_or_insert( $source_data ); } elseif ( $matches_existing_personal && $return['numFound'] === 1 ) { $return['didQuickUpdate'] = true; SBI_Db::delete_source( $results[0]['id'] ); self::update_or_insert( $source_data ); } } else { $page_error = $result; } } } if ( empty( $return['unconnectedAccounts'] ) ) { return array( 'error' => array( 'code' => 'No Accounts Found', 'message' => __( 'Couldn\'t find Business Profile', 'instagram-feed' ), 'details' => sprintf( __( 'Uh oh. It looks like this Facebook account is not currently connected to an Instagram Business profile. Please check that you are logged into the %1$sFacebook account%2$s in this browser which is associated with your Instagram Business Profile. If you are, in fact, logged-in to the correct account please make sure you have Instagram accounts connected with your Facebook account by following %3$sthis FAQ%4$s', 'instagram-feed' ), '', '', '', '' ), ), ); } return $return; } /** * Used to update or insert connected accounts (sources) * * @param array $source_data * * @return bool * * @since 6.0 */ public static function update_or_insert( $source_data ) { if ( ! isset( $source_data['id'] ) ) { return false; } if ( isset( $source_data['info'] ) ) { // data from an API request related to the source is saved as a JSON string if ( is_object( $source_data['info'] ) || is_array( $source_data['info'] ) ) { $source_data['info'] = sbi_json_encode( $source_data['info'] ); } } if ( self::exists_in_database( $source_data ) ) { $source_data['last_updated'] = date( 'Y-m-d H:i:s' ); self::update( $source_data, false ); } else { if ( ! isset( $source_data['access_token'] ) ) { return false; } self::insert( $source_data ); } return true; } /** * Whether or not the source exists in the database * * @param array $args * * @return bool * * @since 6.0 */ public static function exists_in_database( $args ) { $results = SBI_Db::source_query( $args ); return isset( $results[0] ); } /** * Add a new source as a row in the sbi_sources table * * @param array $source_data * * @return false|int * * @since 6.0 */ public static function insert( $source_data ) { if ( isset( $source_data['name'] ) ) { $source_data['username'] = $source_data['name']; } $data = $source_data; return SBI_Db::source_insert( $data ); } /** * Update info in rows that match the source data * * @param array $source_data * * @return false|int * * @since 6.0 */ public static function update( $source_data, $where_privilige = true ) { $where = array( 'id' => $source_data['id'] ); unset( $source_data['id'] ); if ( $where_privilige && isset( $source_data['privilege'] ) ) { $where['privilege'] = $source_data['privilege']; } // usernames are more common in the other plugins so // that is the name of the column that is used as the // page or group "name" data if ( isset( $source_data['name'] ) ) { $source_data['username'] = $source_data['name']; } $data = $source_data; return SBI_Db::source_update( $data, $where ); } /** * Creates a queue of connected accounts that need to be added to * the sources table * * @since 6.0 */ public static function set_legacy_source_queue() { $sbi_statuses_option = get_option( 'sbi_statuses', array() ); $options = get_option( 'sb_instagram_settings', array() ); $connected_accounts = isset( $options['connected_accounts'] ) ? $options['connected_accounts'] : array(); $sbi_statuses_option['legacy_source_queue'] = array_chunk( array_keys( $connected_accounts ), self::BATCH_SIZE ); update_option( 'sbi_statuses', $sbi_statuses_option ); return $sbi_statuses_option['legacy_source_queue']; } /** * Whether or not there are still sources in the queue and * this isn't disabled * * @return bool * * @since 6.0 */ public static function should_do_source_updates() { $sbi_statuses_option = get_option( 'sbi_statuses', array() ); $should_do_source_updates = isset( $sbi_statuses_option['legacy_source_queue'] ) ? ! empty( $sbi_statuses_option['legacy_source_queue'] ) : false; return apply_filters( 'should_do_source_updates', $should_do_source_updates ); } /** * Processes one set of connected accounts * * @since 6.0 */ public static function batch_process_legacy_source_queue() { if ( ! self::should_do_source_updates() ) { return; } $sbi_statuses_option = get_option( 'sbi_statuses', array() ); $batch = array_shift( $sbi_statuses_option['legacy_source_queue'] ); update_option( 'sbi_statuses', $sbi_statuses_option ); // updated early just in case there is a fatal error if ( empty( $batch ) ) { return; } $options = get_option( 'sb_instagram_settings', array() ); $connected_accounts = isset( $options['connected_accounts'] ) ? $options['connected_accounts'] : array(); foreach ( $batch as $account_key ) { $connected_account = isset( $connected_accounts[ $account_key ] ) ? $connected_accounts[ $account_key ] : false; if ( $connected_account ) { self::update_single_source( $connected_account ); } } return $sbi_statuses_option['legacy_source_queue']; } /** * Transfer data from a connected account to the sources table * after it's been validated with an API call * * @param array $connected_account * @param bool $connect_if_error * * @return array * * @since 6.0 */ public static function update_single_source( $connected_account, $connect_if_error = true ) { $account_type = isset( $connected_account['account_type'] ) ? $connected_account['account_type'] : 'business'; $connection = new \SB_Instagram_API_Connect( $connected_account, 'header', array() ); $connection->connect(); if ( isset( $connected_account['privilege'] ) && $connected_account['privilege'] === 'tagged' ) { $connected_account['use_tagged'] = true; } $source_data = array( 'access_token' => $connected_account['access_token'], 'id' => $connected_account['user_id'], 'type' => $account_type, 'username' => $connected_account['username'], 'privilege' => ! empty( $connected_account['use_tagged'] ) ? 'tagged' : '', ); if ( ! empty( $connected_account['expires_timestamp'] ) ) { $source_data['expires'] = date( 'Y-m-d H:i:s', $connected_account['expires_timestamp'] ); } if ( isset( $connected_account['local_avatar'] ) && $connected_account['local_avatar'] ) { \SB_Instagram_Connected_Account::update_local_avatar_status( $connected_account['username'], true ); } $header_details = '{}'; $source_data['error'] = ''; if ( ! $connection->is_wp_error() && ! $connection->is_instagram_error() ) { $header_array = $connection->get_data(); $header_array = self::merge_account_details( $header_array, $connected_account ); $cdn_avatar_url = \SB_Instagram_Parse::get_avatar( $header_array, array(), true ); if ( ! empty( $cdn_avatar_url ) ) { $created = \SB_Instagram_Connected_Account::create_local_avatar( $header_array['username'], $cdn_avatar_url ); \SB_Instagram_Connected_Account::update_local_avatar_status( $header_array['username'], $created ); if($created){ $header_array['local_avatar_url'] = \SB_Instagram_Connected_Account::get_local_avatar_url( $header_array['username'] ); $header_array['local_avatar'] = \SB_Instagram_Connected_Account::get_local_avatar_url( $header_array['username'] ); } } else { \SB_Instagram_Connected_Account::delete_local_avatar( $header_array['username'] ); $header_array['local_avatar'] = false; } $source_data['username'] = $header_array['username']; $header_details = sbi_json_encode( $header_array ); $source_data['local_avatar'] = $header_array['local_avatar']; $source_data['local_avatar_url'] = $header_array['local_avatar']; } else { $source_data['error'] = $connection; if ( $connection->is_wp_error() ) { $source_data['error'] = $connection->get_wp_error(); } else { $source_data['error'] = $connection->get_data(); } } $source_data['info'] = $header_details; if ( ! empty( $connected_account['private'] ) ) { $source_data['info']['private'] = $connected_account['private']; } if ( empty( $source_data['error'] ) || $connect_if_error ) { self::update_or_insert( $source_data ); } $source_data['record_id'] = 0; $source_data['account_id'] = $connected_account['user_id']; $source_data['account_type'] = $account_type; return $source_data; } /** * Creates a source from the access token and * source ID saved in 3.x settings * * @since 6.0 */ public static function update_source_from_legacy_settings() { // not needed } public static function merge_account_details( $header_details_array, $connected_account ) { $header_details_array['local_avatar'] = ! empty( $connected_account['local_avatar'] ); $header_details_array['name'] = ! empty( $connected_account['name'] ) ? $connected_account['name'] : '{}'; $header_details_array['page_access_token'] = ! empty( $connected_account['page_access_token'] ) ? $connected_account['page_access_token'] : ''; return $header_details_array; } /** * If the plugin is still updating legacy sources this function * can be used to udpate a single source if needed before * the update is done. * * @param string $slug_or_id * * @return array|bool */ public static function maybe_one_off_connected_account_update( $slug_or_id ) { if ( ! self::should_do_source_updates() ) { return false; } $connected_accounts = (array) json_decode( stripcslashes( get_option( 'sbi_connected_accounts' ) ), true ); $connected_account = isset( $connected_accounts[ $slug_or_id ] ) ? $connected_accounts[ $slug_or_id ] : false; if ( $connected_account ) { return self::update_single_source( $connected_account ); } return false; } /** * Clears the "error" column in the sbi_sources table for a specific * account * * @param string $account_id * * @return bool * * @since 6.0 */ public static function clear_error( $account_id ) { $source_data = array( 'id' => $account_id, 'error' => '', ); return self::update_or_insert( $source_data ); } /** * Adds an error to the error table by account ID * * @param string $account_id * @param string|object|array $error * * @return bool * * @since 6.0 */ public static function add_error( $account_id, $error ) { $source_data = array( 'id' => $account_id, 'error' => is_string( $error ) ? $error : sbi_json_encode( $error ), ); return self::update_or_insert( $source_data ); } /** * Uses query results from the sbi_sources table to convert them * into connected account data and return them as a connected account * array as would be used in versions 5.x and below * * @param array $source_data * * @return array * * @since 6.0 */ public static function convert_sources_to_connected_accounts( $source_data ) { $encryption = new \SB_Instagram_Data_Encryption(); $connected_accounts = array(); foreach ( $source_data as $source_datum ) { $info = ! empty( $source_datum['info'] ) ? json_decode( $encryption->decrypt( $source_datum['info'] ), true ) : array(); $settings = array( 'gdpr' => 'no' ); $avatar = \SB_Instagram_Parse::get_avatar( $info, $settings, true ); $connected_account = array( 'id' => $source_datum['account_id'], 'user_id' => $source_datum['account_id'], 'type' => $source_datum['account_type'], 'account_type' => $source_datum['account_type'], 'username' => $source_datum['username'], 'access_token' => sbi_maybe_clean( $source_datum['access_token'] ), 'privilege' => $source_datum['privilege'], 'expires_timestamp' => Util::get_valid_timestamp( $source_datum['expires'] ), 'is_valid' => empty( $source_datum['error'] ), 'profile_picture' => $avatar, 'last_checked' => isset( $source_datum['last_updated'] ) ? strtotime( $source_datum['last_updated'] ) : time(), ); if ( ! empty( $info['private'] ) ) { $connected_account['private'] = $info['private']; } if ( ! empty( $info['biography'] ) ) { $connected_account['bio'] = $info['biography']; } $connected_account['local_avatar_url'] = \SB_Instagram_Connected_Account::maybe_local_avatar( $source_datum['username'], $avatar ); $connected_accounts[ $source_datum['account_id'] ] = $connected_account; } return $connected_accounts; } /** * Returns a batch of accounts that have expiring access tokens * * @return array|bool * * @since 6.0 */ public static function get_expiring() { $args = array( 'expiring' => true ); $results = SBI_Db::source_query( $args ); return $results; } /** * Updates Personal Account Bio * * @return array|bool * * @since 6.0.8 */ public static function update_personal_account_bio( $account_id, $bio ) { $source = SBI_Db::get_source_by_account_id( $account_id ); if ( isset( $source['info'] ) ) { $encryption = new \SB_Instagram_Data_Encryption(); $info = json_decode( $encryption->maybe_decrypt( $source['info'] ), true ); $info = array( 'biography' => $bio ) + $info; $to_update = array(); $to_update['info'] = json_encode( $info ); SBI_Db::source_update( $to_update, array( 'id' => $account_id ) ); } } } PKL\8instagram-feed/inc/Integrations/Divi/SBInstagramFeed.phpnu[name = esc_html__('Instagram Feed', 'instagram-feed'); } /** * Module's specific fields. * * @since 6.2.9 * * @return array */ public function get_fields() { $feeds_list = SBI_Db::elementor_feeds_query($default = true); return [ 'feed_id' => [ 'label' => esc_html__('Feed', 'instagram-feed'), 'type' => 'select', 'option_category' => 'basic_option', 'toggle_slug' => 'main_content', 'options' => $feeds_list, ] ]; } /** * Module's advanced fields. * * @since 6.2.9 * * @return array */ public function get_advanced_fields_config() { return [ 'link_options' => false, 'text' => false, 'background' => false, 'borders' => false, 'box_shadow' => false, 'button' => false, 'filters' => false, 'fonts' => false, ]; } /** * Render module. * * @since 6.2.9 * * @param array $attrs Module attributes. * @param string $content Module content. * @param string $render_slug Module slug. * * @return string */ public function render($attrs, $content, $render_slug) { $feed_id = $this->props['feed_id']; if (empty($feed_id)) { return ''; } return do_shortcode( sprintf( '[instagram-feed feed="%1$s"]', absint($feed_id) ) ); } } PKL\۾ 9instagram-feed/inc/Integrations/Divi/SBI_Divi_Handler.phpnu[load(); } /** * Load an integration. * * @since 6.2.9 */ public function load() { if ($this->allow_load()) { $this->hooks(); } } /** * Indicate if current integration is allowed to load. * * @since 6.2.9 * * @return bool */ public function allow_load() { if (function_exists('et_divi_builder_init_plugin')) { return true; } $allow_themes = [ 'Divi' ]; $theme = wp_get_theme(); $theme_name = $theme->get_template(); $theme_parent = $theme->parent(); return (bool) array_intersect([ $theme_name, $theme_parent ], $allow_themes); } /** * Hooks. * * @since 6.2.9 */ public function hooks() { add_action('et_builder_ready', [ $this, 'register_module' ]); if (wp_doing_ajax()) { add_action('wp_ajax_sb_instagramfeed_divi_preview', [ $this, 'preview' ]); } if ($this->is_divi_builder()) { add_action('wp_enqueue_scripts', [ $this, 'builder_scripts' ]); } } /** * Load scripts. * * @since 6.2.9 */ public function builder_scripts() { wp_enqueue_script( 'sbinstagram-divi', // The unminified version is not supported by the browser. SBI_PLUGIN_URL . 'admin/assets/js/divi-handler.min.js', [ 'react', 'react-dom', 'jquery' ], SBIVER, true ); wp_localize_script( 'sbinstagram-divi', 'sb_divi_builder', [ 'ajax_handler' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('sbi-admin'), 'feed_splash' => htmlspecialchars(SBI_Integration::get_widget_cta('button')) ] ); $upload = wp_upload_dir(); $resized_url = trailingslashit($upload['baseurl']) . trailingslashit(SBI_UPLOADS_NAME); $js_options = array( 'font_method' => 'svg', 'placeholder' => trailingslashit(SBI_PLUGIN_URL) . 'img/placeholder.png', 'resized_url' => $resized_url, 'ajax_url' => admin_url('admin-ajax.php'), ); // legacy settings $path = Util::sbi_legacy_css_enabled() ? 'js/legacy/' : 'js/'; wp_enqueue_script( 'sbiscripts', SBI_PLUGIN_URL . $path . 'sbi-scripts.min.js', array('jquery'), SBIVER, true ); wp_localize_script('sbiscripts', 'sb_instagram_js_options', $js_options); } /** * Register Divi module. * * @since 6.2.9 */ public function register_module() { if (! class_exists('ET_Builder_Module')) { return; } new SBInstagramFeed(); } /** * Ajax handler for the Feed preview. * * @since 6.2.9 */ public function preview() { check_ajax_referer('sbi-admin', 'nonce'); if (! sbi_current_user_can('manage_instagram_feed_options')) { wp_send_json_error(); } $feed_id = absint(filter_input(INPUT_POST, 'feed_id', FILTER_SANITIZE_NUMBER_INT)); wp_send_json_success( do_shortcode( sprintf( '[instagram-feed feed="%1$s"]', absint($feed_id) ) ) ); } /** * Determine if a current page is opened in the Divi Builder. * * @since 6.2.9 * * @return bool */ private function is_divi_builder() { return ! empty($_GET['et_fb']); // phpcs:ignore WordPress.Security.NonceVerification.Recommended } } PKL\܉I@@Binstagram-feed/inc/Integrations/Elementor/SBY_Elementor_Widget.phpnu[start_controls_section( 'section_content', [ 'label' => esc_html__('Instagram Feed Settings', 'instagram-feed'), ] ); $this->add_control( 'feed_id', [ 'label' => esc_html__('Select a Feed', 'instagram-feed'), 'type' => 'sbi_feed_control', 'label_block' => true, 'dynamic' => ['active' => true], 'options' => SBI_Db::elementor_feeds_query($default = true), 'default' => 0, 'description' => esc_html__('Select a feed to display. If you don\'t have any feeds yet then you can create one in the Instagram Feed settings page.', 'instagram-feed'), ] ); $this->end_controls_section(); } /** * Render Instagram Feed widget output on the frontend. * * Written in PHP and used to generate the final HTML. * * @since 6.2.9 * @access protected */ protected function render() { $settings = $this->get_settings_for_display(); if (!empty($settings['feed_id']) && $settings['feed_id'] != 0) { $output = do_shortcode(shortcode_unautop('[instagram-feed feed=' . $settings['feed_id'] . ']')); } else { $output = is_admin() ? SBI_Integration::get_widget_cta() : esc_html__('No feed selected to display.', 'instagram-feed'); } echo apply_filters('sbi_output', $output, $settings); } } PKL\q@instagram-feed/inc/Integrations/Elementor/SBI_Elementor_Base.phpnu[apply_hooks(); } return self::$instance; } /** * Compatibility check. * * Check if the current environment is compatible with the plugin. * * @since 6.2.9 * * @return bool True if the plugin can run, false otherwise. */ public static function is_compatible() { // Check if Elementor is installed and activated. if (!did_action('elementor/loaded')) { return false; } // Check for required Elementor version. if (!version_compare(ELEMENTOR_VERSION, self::MINIMUM_ELEMENTOR_VERSION, '>=')) { return false; } // Check for required PHP version. if (version_compare(PHP_VERSION, self::MINIMUM_PHP_VERSION, '<')) { return false; } return true; } /** * Apply hooks. * * @since 6.2.9 * @access private */ private function apply_hooks() { add_action('elementor/frontend/after_register_scripts', array( $this, 'register_frontend_scripts' )); add_action('elementor/frontend/after_register_styles', array( $this, 'register_frontend_styles' ), 10); add_action('elementor/frontend/after_enqueue_styles', array( $this, 'enqueue_frontend_styles' ), 10); add_action('elementor/controls/register', array( $this, 'register_controls' )); add_action('elementor/widgets/register', array( $this, 'register_widgets' )); add_action('elementor/elements/categories_registered', array( $this, 'add_smashballon_categories' )); } /** * Add Smash Balloon categories. * * Add the Smash Balloon category to the Elementor widget categories. * * @since 6.2.9 * @access public * * @param object $elements_manager The Elementor elements manager. */ public function add_smashballon_categories($elements_manager) { $elements_manager->add_category( 'smash-balloon', [ 'title' => esc_html__('Smash Balloon', 'instagram-feed'), 'icon' => 'fa fa-plug', ] ); } /** * Register widgets. * * Register the Elementor widgets. * * @since 6.2.9 * @access public */ public function register_widgets($widgets_manager) { $widgets_manager->register(new SBI_Elementor_Widget()); $installed_plugins = SBI_Feed_Builder::get_smashballoon_plugins_info(); unset($installed_plugins['instagram']); foreach ($installed_plugins as $plugin) { if (!$plugin['installed']) { $plugin_class = str_replace('.', '\\', self::NAME_SPACE) . $plugin['class']; $widgets_manager->register(new $plugin_class()); } } do_action('sbi_elementor_widgets_registered'); } /** * Register controls. * * Register the Elementor controls. * * @since 6.2.9 * @access public */ public function register_controls($controls_manager) { $controls_manager->register(new SBI_Feed_Elementor_Control()); } /** * Register frontend scripts. * * Register the frontend scripts. * * @since 6.2.9 * @access public */ public function register_frontend_scripts() { $upload = wp_upload_dir(); $resized_url = trailingslashit($upload['baseurl']) . trailingslashit(SBI_UPLOADS_NAME); $js_options = array( 'font_method' => 'svg', 'placeholder' => trailingslashit(SBI_PLUGIN_URL) . 'img/placeholder.png', 'resized_url' => $resized_url, 'ajax_url' => admin_url('admin-ajax.php'), ); // legacy settings. $path = Util::sbi_legacy_css_enabled() ? 'js/legacy/' : 'js/'; wp_register_script( 'sbiscripts', SBI_PLUGIN_URL . $path . 'sbi-scripts.min.js', array('jquery'), SBIVER, true ); wp_localize_script('sbiscripts', 'sb_instagram_js_options', $js_options); $data_handler = array( 'smashPlugins' => SBI_Feed_Builder::get_smashballoon_plugins_info(), 'nonce' => wp_create_nonce('sbi-admin'), 'ajax_handler' => admin_url('admin-ajax.php'), ); wp_register_script( 'elementor-handler', SBI_PLUGIN_URL . 'admin/assets/js/elementor-handler.js', array('jquery'), SBIVER, true ); wp_localize_script('elementor-handler', 'sbHandler', $data_handler); wp_register_script( 'elementor-preview', SBI_PLUGIN_URL . 'admin/assets/js/elementor-preview.js', array('jquery'), SBIVER, true ); } /** * Register frontend styles. * * Register the frontend styles. * * @since 6.2.9 * @access public */ public function register_frontend_styles() { // legacy settings $path = Util::sbi_legacy_css_enabled() ? 'css/legacy/' : 'css/'; wp_register_style( 'sbistyles', SBI_PLUGIN_URL . $path . 'sbi-styles.min.css', array(), SBIVER ); } /** * Enqueue frontend styles. * * Enqueue the frontend styles. * * @since 6.2.9 * @access public */ public function enqueue_frontend_styles() { wp_enqueue_style('sbistyles'); } } PKL\ÀHHBinstagram-feed/inc/Integrations/Elementor/CFF_Elementor_Widget.phpnu[ false, ]; } /** * Render control output in the editor. * * Used to generate the control HTML in the editor using Underscore JS * template. * * @since 6.2.9 * @access public */ public function content_template() { $control_uid = $this->get_control_uid(); ?>
<# if ( data.label ) {#> <# } #>
<# if ( data.description ) { #>
{{{ data.description }}}
<# } #>
<# if( data.controlValue != undefined && data.controlValue != '0' ) { #> | <# } #>
'instagram', 'cta_header' => __('Get started with your first feed from Instagram', 'instagram-feed'), 'cta_header2' => __('Select an Instagram feed to embed', 'instagram-feed'), 'cta_description_free' => __('You can display feeds of Instagram photos, videos, albums, events and more using the Pro version', 'instagram-feed'), 'cta_description_pro' => __('You can also add Facebook, Twitter, and YouTube posts into your feed using our Social Wall plugin', 'instagram-feed'), 'plugins' => SBI_Feed_Builder::get_smashballoon_plugins_info() ]; } /** * Widget CTA * * @param string $type - dropdown or button. * @since 6.1 * * @return HTML */ public static function get_widget_cta($type = 'dropdown') { $widget_cta_html = ''; $feeds_list = SBI_Db::elementor_feeds_query(); ob_start(); self::get_widget_cta_html($feeds_list, $type); $widget_cta_html .= ob_get_contents(); ob_get_clean(); return $widget_cta_html; } /** * CTA HTML * * @param [type] $feeds_list - list of feeds. * @param string $type - dropdown or button. * @return void */ public static function get_widget_cta_html($feeds_list, $type = 'dropdown') { $info = self::get_widget_info(); $feeds_exist = is_array($feeds_list) && sizeof($feeds_list) > 0; $cta_heading = $feeds_exist ? $info['cta_header2'] : $info['cta_header']; $cta_description = sbi_is_pro_version() ? $info['cta_description_pro'] : $info['cta_description_free']; ?>

$plugin) : ?>
set_url( $connected_account_or_url, $endpoint, $params ); } elseif ( ! is_array( $connected_account_or_url ) && strpos( $connected_account_or_url, 'https' ) !== false ) { $this->url = $connected_account_or_url; } else { $this->url = ''; } } /** * Returns the response from Instagram * * @return array|object * * @since 2.0/5.0 */ public function get_data() { if ( $this->is_wp_error() ) { return array(); } if ( ! empty($this->response['data'] ) ) { return $this->response['data']; } else { return $this->response; } } /** * Returns the error response and the url that was trying to be connected to * or false if no error * * @return array|bool * * @since 2.0/5.0 */ public function get_wp_error() { if ( $this->is_wp_error() ) { return array( 'response' => $this->response, 'url' => $this->url ); } else { return false; } } /** * Certain endpoints don't include the "next" URL so * this method allows using the "cursors->after" data instead * * @param $type * * @return bool * * @since 2.2.2/5.3.3 */ public function type_allows_after_paging( $type ) { return false; } /** * Returns the full url for the next page of the API request * * @param $type * * @return string * * @since 2.0/5.0 */ public function get_next_page( $type = '' ) { if ( ! empty( $this->response['pagination']['next_url'] ) ) { return $this->response['pagination']['next_url']; } elseif ( ! empty( $this->response['paging']['next'] ) ) { return $this->response['paging']['next']; } else { if ( $this->type_allows_after_paging( $type ) ) { if ( isset( $this->response['paging']['cursors']['after'] ) ) { return $this->response['paging']['cursors']['after']; } } return ''; } } /** * If url needs to be generated from the connected account, endpoint, * and params, this function is used to do so. * * @param $url */ public function set_url_from_args( $url ) { $this->url = $url; } /** * @return string * * @since 2.0/5.0 */ public function get_url() { return $this->url; } /** * If the server is unable to connect to the url, returns true * * @return bool * * @since 2.0/5.0 */ public function is_wp_error() { return is_wp_error( $this->response ); } /** * If the server can connect but Instagram returns an error, returns true * * @return bool * * @since 2.0/5.0 */ public function is_instagram_error( $response = false ) { if ( ! $response ) { $response = $this->response; } return (isset( $response['error'] )); } /** * Connect to the Instagram API and record the response * * @since 2.0/5.0 */ public function connect() { if ( empty( $this->url ) ) { $this->response = array(); return; } $args = array( 'timeout' => 20 ); $response = wp_remote_get( $this->url, $args ); /** * Api response for instagram connection * * @since 6.0.6 */ do_action( 'sbi_api_connect_response', $response, $this->url ); if ( ! is_wp_error( $response ) ) { // certain ways of representing the html for double quotes causes errors so replaced here. $response = json_decode( str_replace( '%22', '”', $response['body'] ), true ); if ( empty( $response ) ) { $response = array( 'error' => array( 'code' => 'unknown', 'message' => __( "An unknown error occurred when trying to connect to Instagram's API.", 'instagram-feed' ) ) ); } } $this->response = $response; } /** * Determines how and where to record an error from Instagram's API response * * @param array $response response from the API request * @param array $error_connected_account the connected account that is associated * with the error * @param string $request_type key used to determine the endpoint (ex. "header") * * @since 2.0/5.0 */ public static function handle_instagram_error( $response, $error_connected_account, $request_type ) { global $sb_instagram_posts_manager; delete_option( 'sbi_dismiss_critical_notice' ); $type = isset( $response['error']['code'] ) && (int)$response['error']['code'] === 18 ? 'hashtag_limit' : 'api'; $sb_instagram_posts_manager->add_error( $type, $response, $error_connected_account ); if ( $type === 'hashtag_limit' ) { $sb_instagram_posts_manager->maybe_set_display_error( $type, $response ); } } /** * Determines how and where to record an error connecting to a specified url * * @param $response * * @since 2.0/5.0 */ public static function handle_wp_remote_get_error( $response ) { global $sb_instagram_posts_manager; delete_option( 'sbi_dismiss_critical_notice' ); $sb_instagram_posts_manager->add_error( 'wp_remote_get', $response ); } /** * Determines how and where to record an error connecting to a specified url * * @since 2.0/5.0 */ public function has_encryption_error() { return isset( $this->encryption_error ) && $this->encryption_error; } /** * Sets the url for the API request based on the account information, * type of data needed, and additional parameters. * * Overwritten in the Pro version. * * @param array $connected_account connected account to be used in the request * @param string $endpoint_slug header or user * @param array $params additional params related to the request * * @since 2.0/5.0 * @since 2.2/5.3 added endpoints for the basic display API */ protected function set_url( $connected_account, $endpoint_slug, $params ) { $account_type = ! empty( $connected_account['type'] ) ? $connected_account['type'] : 'personal'; $num = ! empty( $params['num'] ) ? (int) $params['num'] : 33; if ( $account_type === 'basic' || $account_type === 'personal' ) { $access_token = sbi_maybe_clean( $connected_account['access_token'] ); if ( strpos( $access_token, 'IG' ) !== 0 ) { $this->encryption_error = true; $url = ''; } else { if ( $endpoint_slug === 'access_token' ) { $url = 'https://graph.instagram.com/refresh_access_token?grant_type=ig_refresh_token&access_token=' . $access_token; } elseif ( $endpoint_slug === 'header' ) { $url = 'https://graph.instagram.com/me?fields=id,username,media_count,account_type&access_token=' . $access_token; } else { $num = min( $num, 200 ); $url = 'https://graph.instagram.com/' . $connected_account['user_id'] . '/media?fields=media_url,thumbnail_url,caption,id,media_type,timestamp,username,permalink,children%7Bmedia_url,id,media_type,timestamp,permalink,thumbnail_url%7D&limit=' . $num . '&access_token=' . $access_token; } } } else { $access_token = sbi_maybe_clean( $connected_account['access_token'] ); if ( strpos( $access_token, 'EA' ) !== 0 ) { $this->encryption_error = true; $url = ''; } else { if ( 'header' === $endpoint_slug ) { $url = 'https://graph.facebook.com/' . $connected_account['user_id'] . '?fields=biography,id,username,website,followers_count,media_count,profile_picture_url,name&access_token=' . sbi_maybe_clean( $connected_account['access_token'] ); } else { $num = min( $num, 200 ); $url = 'https://graph.facebook.com/' . $connected_account['user_id'] . '/media?fields=media_url,media_product_type,thumbnail_url,caption,id,media_type,timestamp,username,comments_count,like_count,permalink,children%7Bmedia_url,id,media_type,timestamp,permalink,thumbnail_url%7D&limit=' . $num . '&access_token=' . sbi_maybe_clean( $connected_account['access_token'] ); } } } $this->set_url_from_args( $url ); } } PKL\8&n:instagram-feed/inc/class-sb-instagram-display-elements.phpnu[init(); $post = $single->get_post(); if ( isset( $post['thumbnail_url'] ) ) { return $post['thumbnail_url']; } elseif ( isset( $post['media_url'] ) && strpos( $post['media_url'], '.mp4' ) === false ) { return $post['media_url']; } return trailingslashit( SBI_PLUGIN_URL ) . 'img/thumb-placeholder.png'; } } else { if ( isset( $post['media_url'] ) ) { return $post['media_url']; } return trailingslashit( SBI_PLUGIN_URL ) . 'img/thumb-placeholder.png'; } } } return $media_url; } /** * Images are normally styles with the imgLiquid plugin * with JavaScript. If this is disabled, the plugin will * attempt to square all images using CSS. * * @param array $post * @param array $settings * @param array $resized_images * * @return string * * @since 2.0/5.0 * @since 2.1.1/5.2.1 added support for resized images */ public static function get_sbi_photo_style_element( $post, $settings, $resized_images = array() ) { if ( ! $settings['disable_js_image_loading'] ) { return ''; } else { $full_res_image = self::get_optimum_media_url( $post, $settings, $resized_images ); /* * By setting the height to "0" the bottom padding can be used * as a percent to square the images. Since it needs to be a percent * this guesses what the percent would be based on static padding. */ $padding_bottom = '100%'; if ( $settings['imagepaddingunit'] === '%' ) { $padding_bottom = 100 - ( $settings['imagepadding'] * 2 ) . '%'; } else { $padding_percent = $settings['imagepadding'] > 0 ? 100 - ( $settings['cols'] / 2 * $settings['imagepadding'] / 5 ) : 100; $padding_bottom = $padding_percent . '%'; } return ' style="background-image: url("' . esc_url( $full_res_image ) . '"); background-size: cover; background-position: center center; background-repeat: no-repeat; opacity: 1;height: 0;padding-bottom: ' . esc_attr( $padding_bottom ) . ';"'; } } /** * Creates a style attribute that contains all of the styles for * the main feed div. * * @param $settings * * @return string * * @since 6.0 */ public static function get_feed_style( $settings ) { $styles = ''; if ( ! empty( $settings['imagepadding'] ) || ! empty( $settings['background'] ) || ! empty( $settings['width'] ) || ! empty( $settings['height'] ) ) { $styles = ' style="'; if ( ! empty( $settings['imagepadding'] ) ) { $styles .= 'padding-bottom: ' . ( (int) $settings['imagepadding'] * 2 ) . esc_attr( $settings['imagepaddingunit'] ) . ';'; } if ( ! empty( $settings['background'] ) ) { $styles .= 'background-color: rgb(' . esc_attr( sbi_hextorgb( $settings['background'] ) ) . ');'; } if ( ! empty( $settings['width'] ) ) { $width_unit = ! empty( $settings['widthunit'] ) && $settings['widthunit'] === '%' ? '%' : 'px'; $styles .= 'width: ' . (int) $settings['width'] . $width_unit . ';'; } if ( ! empty( $settings['height'] ) ) { $height_unit = ! empty( $settings['heightunit'] ) && $settings['heightunit'] === '%' ? '%' : 'px'; $styles .= 'height: ' . (int) $settings['height'] . $height_unit . ';'; } $styles .= '"'; } return $styles; } /** * Layout for mobile feeds altered with the class added here based on settings. * * @param $settings * * @return string * * @since 5.0 */ public static function get_mobilecols_class( $settings ) { $customizer = sbi_doing_customizer( $settings ); if ( $customizer ) { return ' $parent.getMobileColsClass() '; } else { $disable_mobile = $settings['disablemobile']; ( $disable_mobile == 'on' || $disable_mobile == 'true' || $disable_mobile == true ) ? $disable_mobile = true : $disable_mobile = false; if ( $settings['disablemobile'] === 'false' ) { $disable_mobile = ''; } if ( $disable_mobile !== ' sbi_disable_mobile' && $settings['colsmobile'] !== 'same' ) { $colsmobile = (int) ( $settings['colsmobile'] ) > 0 ? (int) $settings['colsmobile'] : 'auto'; return ' sbi_mob_col_' . $colsmobile; } else { $colsmobile = (int) ( $settings['cols'] ) > 0 ? (int) $settings['cols'] : 4; return ' sbi_disable_mobile sbi_mob_col_' . $colsmobile; } } } /** * Layout for mobile feeds altered with the class added here based on settings. * * @param $settings * * @return string * * @since 6.0 */ public static function get_tabletcols_class( $settings ) { $customizer = sbi_doing_customizer( $settings ); if ( $customizer ) { return ' $parent.getTabletColsClass() '; } else { $colstablet = (int) ( $settings['colstablet'] ) > 0 ? (int) $settings['colstablet'] : 3; return ' sbi_tab_col_' . $colstablet; } } /** * Creates a style attribute for the sbi_images div * * @param $settings * * @return string * * @since 6.0 */ public static function get_sbi_images_style( $settings ) { if ( ! empty( $settings['imagepadding'] ) ) { if ( ! is_admin() && Util::sbi_legacy_css_enabled() ) { return ' style="padding: ' . (int) $settings['imagepadding'] . esc_attr( $settings['imagepaddingunit'] ) . ';"'; } else { return ' style="gap: ' . (int) $settings['imagepadding'] * 2 . esc_attr( $settings['imagepaddingunit'] ) . ';"'; } } return ''; } /** * Creates a style attribute for the header. Can be used in * several places based on the header style * * @param $settings * * @return string * * @since 6.0 */ public static function get_header_text_color_styles( $settings ) { if ( ! empty( $settings['headercolor'] ) ) { return ' style="color: rgb(' . esc_attr( sbi_hextorgb( $settings['headercolor'] ) ) . ');"'; } return ''; } /** * Header icon and text size is styled using the class added here. * * @param $settings * * @return string * * @since 2.0.1/5.0 */ public static function get_header_size_class( $settings ) { $header_size_class = in_array( strtolower( $settings['headersize'] ), array( 'medium', 'large' ) ) ? ' sbi_' . strtolower( $settings['headersize'] ) : ''; return $header_size_class; } /** * Creates a style attribute for the follow button. Can be in * the feed footer or in a boxed header. * * @param $settings * * @return string * * @since 6.0 */ public static function get_follow_styles( $settings ) { $styles = ''; if ( ! self::doing_custom_palettes_for_button( $settings ) && ( ! empty( $settings['followcolor'] ) || ! empty( $settings['followtextcolor'] ) ) ) { $styles = ' style="'; if ( ! empty( $settings['followcolor'] ) ) { $styles .= 'background: rgb(' . esc_attr( sbi_hextorgb( $settings['followcolor'] ) ) . ');'; } if ( ! empty( $settings['followtextcolor'] ) ) { $styles .= 'color: rgb(' . esc_attr( sbi_hextorgb( $settings['followtextcolor'] ) ) . ');'; } $styles .= '"'; } return $styles; } public static function doing_custom_palettes_for_button( $settings ) { if ( ( empty( $settings['colorpalette'] ) || $settings['colorpalette'] === 'inherit' ) ) { return false; } if ( $settings['colorpalette'] === 'custom' && ! empty( $settings['custombuttoncolor2'] ) ) { return true; } return false; } public static function get_follow_hover_color( $settings ) { if ( ! empty( $settings['followhovercolor'] ) && $settings['followhovercolor'] !== '#359dff' ) { return esc_attr($settings['followhovercolor']); } return ''; } /** * Creates a style attribute for styling the load more button. * * @param $settings * * @return string * * @since 6.0 */ public static function get_load_button_styles( $settings ) { $styles = ''; if ( ! empty( $settings['buttoncolor'] ) || ! empty( $settings['buttontextcolor'] ) ) { $styles = ' style="'; if ( ! empty( $settings['buttoncolor'] ) ) { $styles .= 'background: rgb(' . esc_attr( sbi_hextorgb( $settings['buttoncolor'] ) ) . ');'; } if ( ! empty( $settings['buttontextcolor'] ) ) { $styles .= 'color: rgb(' . esc_attr( sbi_hextorgb( $settings['buttontextcolor'] ) ) . ');'; } $styles .= '"'; } return $styles; } public static function get_load_button_hover_color( $settings ) { if ( ! empty( $settings['buttonhovercolor'] ) && $settings['buttonhovercolor'] !== '#000' ) { return esc_attr($settings['buttonhovercolor']); } return ''; } /** * Returns the html for an icon based on the kind requested * * @param string $type kind of icon needed (ex "video" is a play button * @param string $icon_type svg or font * * @return string * * @since 2.0/5.0 */ protected static function get_basic_icons( $type, $icon_type ) { if ( $type === 'carousel' ) { if ( $icon_type === 'svg' ) { return ''; } else { return ''; } } elseif ( $type === 'video' ) { if ( $icon_type === 'svg' ) { return ''; } else { return ''; } } elseif ( $type === 'instagram' ) { if ( $icon_type === 'svg' ) { return ''; } else { return ''; } } elseif ( $type === 'newlogo' ) { if ( $icon_type === 'svg' ) { return ''; } else { return ''; } } else { return ''; } } /** * Returns the list of CSS classes * * @param array $settings * * @return string * * @since 6.0 */ public static function get_feed_container_css_classes( $settings, $additional_classes ) { $customizer = sbi_doing_customizer( $settings ); $mobilecols_class = self::get_mobilecols_class( $settings ); $tabletcols_class = self::get_tabletcols_class( $settings ); $cols_setting = ( $customizer ) ? ' $parent.getColsPreviewScreen() ' : $settings['cols']; $additional_customizer_classes = ( $customizer ) ? ' $parent.getAdditionalCustomizerClasses() ' : ''; $palette_class = self::get_palette_class( $settings ); if ( $customizer ) { return ' :class="\'sbi \' + ' . esc_attr( $mobilecols_class ) . ' + \' \' + ' . esc_attr( $tabletcols_class ) . ' + \' sbi_col_\' + ' . esc_attr( $cols_setting ) . ' + \' \' + ' . esc_attr( $palette_class ) . ' + \' \' + ' . esc_attr( $additional_customizer_classes ) . '" '; } else { $classes = 'sbi' . esc_attr( $mobilecols_class ) . esc_attr( $tabletcols_class ) . ' sbi_col_' . esc_attr( $cols_setting ) . esc_attr( $additional_classes ) . esc_attr( $palette_class ); $classes = ' class="' . $classes . '"'; } return $classes; } /** * Palette class * * @param array $settings * @param string $context * * @return string * * @since 6.0 */ public static function get_palette_class( $settings, $context = '' ) { $customizer = sbi_doing_customizer( $settings ); if ( $customizer ) { return ' $parent.getPaletteClass() '; } else { $feed_id_addition = ! empty( $settings['colorpalette'] ) && $settings['colorpalette'] === 'custom' ? '_' . $settings['feed'] : ''; $palette_class = ! empty( $settings['colorpalette'] ) && $settings['colorpalette'] !== 'inherit' ? ' sbi' . $context . '_palette_' . $settings['colorpalette'] . $feed_id_addition : ''; return esc_attr($palette_class); } } /** * Palette type * * @param array $settings * * @return string * * @since 6.0 */ public static function palette_type( $settings ) { return ! empty( $settings['colorpalette'] ) ? esc_attr($settings['colorpalette']) : 'inherit'; } /** * Returns the list of CSS classes * * @param array $settings * * @return string * * @since 6.0 */ public static function get_feed_container_data_attributes( $settings ) { $customizer = sbi_doing_customizer( $settings ); $atts = ''; $atts .= self::print_element_attribute( $customizer, array( 'attr' => 'data-res', 'vue_content' => '$parent.customizerFeedData.settings.imageres', 'php_content' => $settings['imageres'], ) ); $atts .= self::print_element_attribute( $customizer, array( 'attr' => 'data-cols', 'vue_content' => '$parent.getColsPreviewScreen()', 'php_content' => $settings['cols'], ) ); $atts .= self::print_element_attribute( $customizer, array( 'attr' => 'data-colsmobile', 'vue_content' => '$parent.customizerFeedData.settings.colsmobile', 'php_content' => $settings['colsmobile'], ) ); $atts .= self::print_element_attribute( $customizer, array( 'attr' => 'data-colstablet', 'vue_content' => '$parent.customizerFeedData.settings.colstablet', 'php_content' => $settings['colstablet'], ) ); $atts .= self::print_element_attribute( $customizer, array( 'attr' => 'data-num', 'vue_content' => '$parent.getModerationShoppableMode ? 10 : $parent.getPostNumberPreviewScreen()', 'php_content' => $settings['num'], ) ); $atts .= self::print_element_attribute( $customizer, array( 'attr' => 'data-nummobile', 'vue_content' => '$parent.customizerFeedData.settings.nummobile', 'php_content' => $settings['nummobile'], ) ); $atts .= self::print_element_attribute( $customizer, array( 'attr' => 'data-item-padding', 'vue_content' => '$parent.customizerFeedData.settings.imagepadding', 'php_content' => $settings['imagepadding'], ) ); return $atts; } /** * Global header classes * * @param $settings * * @return string * * @since 5.0 */ public static function get_header_class( $settings, $avatar, $type = 'normal' ) { $customizer = sbi_doing_customizer( $settings ); if ( $customizer ) { return ' :class="$parent.getHeaderClass(\'' . $type . '\')" '; } else { $size_class = self::get_header_size_class( $settings ); $avatar_class = $avatar !== '' ? '' : ' sbi_no_avatar'; $palette_class = self::get_palette_class( $settings, '_header' ); $outside_class = $settings['headeroutside'] ? ' sbi_header_outside' : ''; return ' class="sb_instagram_header ' . esc_attr( $size_class ) . esc_attr( $avatar_class ) . esc_attr( $outside_class ) . esc_attr( $palette_class ) . '" '; } } /** * Header Link * * @param array $settings * @param string $username * * @return string * * @since 6.0 */ public static function get_header_link( $settings, $username ) { if ( sbi_doing_customizer( $settings ) ) { return ' :href="\'https://www.instagram.com/\' + $parent.getHeaderUserName() "'; } else { return ' href="' . esc_url( 'https://www.instagram.com/' . $username . '/' ) . '"'; } } /** * Header Link Title * * @param array $settings * @param string $username * * @return string * * @since 6.0 */ public static function get_header_link_title( $settings, $username ) { return self::print_element_attribute( sbi_doing_customizer( $settings ), array( 'attr' => 'title', 'vue_content' => '$parent.getHeaderUserNameTitle()', 'php_content' => '@' . esc_attr( $username ), ) ); } /** * Follow button attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_follow_attribute( $settings ) { return self::should_print_element_vue( sbi_doing_customizer( $settings ), '$parent.customizerFeedData.settings.followtext' ); } /** * Load more button attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_button_attribute( $settings ) { return self::should_print_element_vue( sbi_doing_customizer( $settings ), '$parent.customizerFeedData.settings.buttontext' ); } /** * Photo wrap prepended HTML * * @param array $post * @param array $settings * * @return string * * @since 6.0 */ public static function get_photo_wrap_content( $post, $settings ) { return ''; } /** * Header data attributes * * @param array $settings * @param array $header_data * * @return string * * @since 6.0 */ public static function get_header_data_attributes( $settings, $header_data ) { $atts = ''; if ( sbi_doing_customizer( $settings ) ) { if ( isset( $settings['generic_header'] ) ) { return self::vue_check_header_enabled( $settings, 'header-generic', $settings['vue_args'] ); } $header_vue = $settings['vue_args']; $header_vue['condition'] = $settings['vue_args']['condition']; $header_enabeld_vue = self::vue_check_header_enabled( $settings, 'header', $header_vue ); $atts .= ' ' . $header_enabeld_vue; } $avatar = SB_Instagram_Parse::get_avatar( $header_data, $settings ); $story_data_att = ''; if ( sbi_is_pro_version() ) { $story_data_att = SB_Instagram_Display_Elements_Pro::get_story_attributes( sbi_doing_customizer( $settings ), $settings, $header_data, $avatar ); } $atts .= ' ' . $story_data_att; return $atts; } /** * Header image data attributes * * @param array $settings * @param array $header_data * @param string $location * * @return string * * @since 6.0 */ public static function get_header_img_data_attributes( $settings, $header_data = array(), $location = 'default' ) { $instagram_cdn_avatar = SB_Instagram_Parse::get_avatar( $header_data, $settings, true ); $doing_customizer = sbi_doing_customizer( $settings ); $return = ''; if ( $settings['headerstyle'] === 'boxed' ) { if ( ! empty( $instagram_cdn_avatar ) ) { $return = self::print_element_attribute( $doing_customizer, array( 'attr' => 'data-avatar-url', 'vue_content' => '$parent.getHeaderAvatar()', 'php_content' => $instagram_cdn_avatar, ) ); } else { $return = self::create_condition_vue( $doing_customizer, '$parent.getHeaderAvatar() === false' ); } } else { if ( $location !== 'centered' ) { if ( ! empty( $instagram_cdn_avatar ) || $doing_customizer ) { $return = self::print_element_attribute( $doing_customizer, array( 'attr' => 'data-avatar-url', 'vue_content' => '$parent.getHeaderAvatar()', 'php_content' => $instagram_cdn_avatar, ) ) . self::create_condition_vue( $doing_customizer, ' $parent.customizerFeedData.settings.headerstyle !== \'centered\'' ); } } else { if ( ! empty( $instagram_cdn_avatar ) || $doing_customizer ) { $return = self::print_element_attribute( $doing_customizer, array( 'attr' => 'data-avatar-url', 'vue_content' => '$parent.getHeaderAvatar()', 'php_content' => $instagram_cdn_avatar, ) ) . self::create_condition_vue( $doing_customizer, ' $parent.customizerFeedData.settings.headerstyle === \'centered\'' ); } } } if ( empty( $return ) ) { return $return; } return ' ' . $return; } /** * Header text classes * * @param array $header_data * @param array $settings * * @return string * * @since 6.0 */ public static function get_header_text_class( $header_data, $settings ) { $bio = SB_Instagram_Parse::get_bio( $header_data, $settings ); $should_show_bio = $settings['showbio'] && $bio !== ''; $bio_class = ! $should_show_bio ? ' sbi_no_bio' : ''; return self::print_element_attribute( sbi_doing_customizer( $settings ), array( 'attr' => 'class', 'vue_content' => '$parent.getTextHeaderClass()', 'php_content' => 'sbi_header_text' . esc_attr( $bio_class ), ) ); } /** * Avatar header image element data attribute * * @param array $settings * @param array $header_data * * @return string * * @since 6.0 */ public static function get_avatar_element_data_attributes( $settings, $header_data = array() ) { $avatar = SB_Instagram_Parse::get_avatar( $header_data, $settings ); $name = SB_Instagram_Parse::get_name( $header_data ); return ' ' . self::print_element_attribute( sbi_doing_customizer( $settings ), array( 'attr' => 'src', 'vue_content' => '$parent.getHeaderAvatar()', 'php_content' => $avatar, ) ) . self::print_element_attribute( sbi_doing_customizer( $settings ), array( 'attr' => 'alt', 'vue_content' => '$parent.getHeaderName()', 'php_content' => $name, ) ) . self::create_condition_vue( sbi_doing_customizer( $settings ), '$parent.getHeaderAvatar() !== false' ); } /** * Hover Avatar Attributes * * @param array $settings * * @return string * * @since 6.0 */ public static function get_avatar_hover_data_attributes( $settings ) { return ' ' . self::create_condition_vue( sbi_doing_customizer( $settings ), '$parent.getHeaderAvatar() !== false' ); } /** * HEader Avatar SVG Icon Attributes * * @param array $settings * * @return string * * @since 6.0 */ public static function get_avatar_svg_data_attributes( $settings ) { return ' ' . self::create_condition_vue( sbi_doing_customizer( $settings ), '$parent.getHeaderAvatar() === false' ); } /** * Post count in header data attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_post_count_data_attributes( $settings ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } return ' ' . self::should_show_element_vue( $settings, 'showfollowers' ) . self::should_print_element_vue( sbi_doing_customizer( $settings ), ' $parent.svgIcons[\'headerPhoto\']+ \' \' + $parent.getHeaderMediaCount()' ); } /** * Follower count in header data attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_follower_count_data_attributes( $settings ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } return ' ' . self::should_show_element_vue( $settings, 'showfollowers' ) . self::should_print_element_vue( sbi_doing_customizer( $settings ), ' $parent.svgIcons[\'headerUser\'] + \' \' + $parent.getHeaderFollowersCount()' ); } /** * Heading in header data attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_header_heading_data_attributes( $settings ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } return ' ' . self::should_print_element_vue( sbi_doing_customizer( $settings ), '$parent.customizerFeedData.headerData.username' ); } /** * Bio in header data attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_bio_data_attributes( $settings ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } return ' ' . self::create_condition_vue( sbi_doing_customizer( $settings ), '$parent.checkNotEmpty( $parent.getHeaderBio() ) ? $parent.valueIsEnabled( $parent.customizerFeedData.settings[\'showbio\'] ) : false' ); } /** * Hover display vue condiition * * @param array $setting_name * * @return string * * @since 6.0 */ public static function hoverdisplay_vue_condition( $setting_name ) { return self::create_condition_vue( true, '$parent.customizerFeedData.settings.hoverdisplay.includes(\'' . $setting_name . '\')' ); } /** * Display vue condition * * @param array $setting_name * * @return string * * @since 6.0 */ public static function display_vue_condition( $setting_name ) { return self::create_condition_vue( true, '$parent.valueIsEnabled( $parent.customizerFeedData.settings.' . $setting_name . ' )' ); } /** * Hover username data attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_hoverusername_data_attributes( $settings ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } return ' ' . self::hoverdisplay_vue_condition( 'username' ); } /** * Caption data attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_caption_data_attributes( $settings, $caption, $post_id ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } $caption = self::sanitize_caption( $caption ); return ' ' . self::display_vue_condition( 'showcaption' ) . ' v-html="$parent.getPostCaption(\'' . htmlspecialchars( $caption ) . '\', ' . $post_id . ')"'; } /** * Hover caption data attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_hovercaption_data_attributes( $settings ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } return ' ' . self::hoverdisplay_vue_condition( 'caption' ); } /** * Some characters in captions are breaking the customizer. * * @param $caption * * @return mixed */ public static function sanitize_caption( $caption ) { $caption = str_replace( array( "'" ), '`', $caption ); $caption = str_replace( '&', '&', $caption ); $caption = str_replace( '<', '<', $caption ); $caption = str_replace( '>', '>', $caption ); $caption = str_replace( '"', '"', $caption ); $caption = str_replace( ''', '/', $caption ); $caption = str_replace( '\', '\/', $caption ); $caption = str_replace( array( "\r", "\n" ), '
', $caption ); $caption = str_replace( '<br />', '
', nl2br( $caption ) ); return $caption; } /** * Hover instagram data attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_hoverinstagram_data_attributes( $settings ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } return ' ' . self::hoverdisplay_vue_condition( 'instagram' ); } /** * Hover date data attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_hoverdate_data_attributes( $settings ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } return ' ' . self::hoverdisplay_vue_condition( 'date' ); } /** * Hover likes data attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_hoverlikes_data_attributes( $settings ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } return ' ' . self::hoverdisplay_vue_condition( 'likes' ); } /** * Hover meta data attribute * * @param array $settings * * @return string * * @since 6.0 */ public static function get_meta_data_attributes( $settings ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } return ' ' . self::display_vue_condition( 'showlikes' ); } /** * Load button data attributes * * @param array $settings * * @return string * * @since 6.0 */ public static function get_button_data_attributes( $settings ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } return ' ' . self::display_vue_condition( 'showbutton' ); } /** * Follow data attributes * * @param array $settings * * @return string * * @since 6.0 */ public static function get_follow_data_attributes( $settings ) { if ( ! sbi_doing_customizer( $settings ) ) { return ''; } return ' ' . self::display_vue_condition( 'showfollow' ); } /** * Show header section * * @param string $section * @param array $settings * * @return bool * * @since 6.0 */ public static function should_show_header_section( $section, $settings ) { if ( sbi_doing_customizer( $settings ) ) { return true; } if ( $section === 'image-top' ) { return $settings['headerstyle'] === 'centered'; } elseif ( $section === 'image-bottom' ) { return $settings['headerstyle'] !== 'centered'; } return true; } /** * Returns & Checks if Header is Enabled * Shows & Hides * * @param array $settings * @param string $header_type * * @return string * * @since 6.0 */ public static function vue_check_header_enabled( $settings, $header_type, $vue_args ) { $customizer = sbi_doing_customizer( $settings ); $vue_args = !empty($vue_args['condition']) ? $vue_args['condition'] : false; if ( $customizer && $vue_args ) { $result_vue = '$parent.valueIsEnabled($parent.customizerFeedData.settings.showheader) ' . esc_attr($vue_args); return ' v-if=" ' . esc_attr($result_vue) . '" '; } return ''; } /** * Should Show Element * * @param array $settings * @param string $setting_name * @param bool $custom_condition * * @return string */ public static function should_show_element_vue( $settings, $setting_name, $custom_condition = false ) { $customizer = sbi_doing_customizer( $settings ); $setting_name = !empty($setting_name) ? $setting_name : false; $custom_condition = $custom_condition != false ? $custom_condition : ''; if ( $customizer ) { return ' v-if="$parent.valueIsEnabled($parent.customizerFeedData.settings.' . esc_attr($setting_name) . ')' . ( esc_attr($custom_condition) ) . '" '; } return ''; } /** * Should Print HTML * * @param bool $customizer * @param string $content * * @return string * * @since 6.0 */ public static function should_print_element_vue( $customizer, $content ) { if ( $customizer ) { return ' v-html="' . esc_html($content) . '" '; } return ''; } /** * Should Print HTML * * @param bool $customizer * @param string $condition * * @return string * * @since 6.0 */ public static function create_condition_vue( $customizer, $condition ) { if ( $customizer ) { return ' v-if="' . esc_attr($condition) . '" '; } return ''; } /** * Print Element HTML Attribute * * @param bool $customizer * @param array $args * * @return string * * @since 6.0 */ public static function print_element_attribute( $customizer, $args ) { $print_element = ' ' . sanitize_key($args['attr']) . '="' . esc_attr($args['php_content']) . '"'; if ( $customizer ) { $print_element = ' :' . sanitize_key($args['attr']) . '="' . esc_attr($args['vue_content']) . '"'; } return $print_element; } /** * Get Footer Attributes * * @param bool $customizer * @param array $args * * @return string * * @since 6.0 */ public static function get_footer_attributes( $settings ) { $customizer = sbi_doing_customizer( $settings ); if ( $customizer ) { return self::create_condition_vue( $customizer, '!$parent.getModerationShoppableMode' ); } return ''; } } PKL\XGG6instagram-feed/inc/class-sb-instagram-feed-locator.phpnu[ $transient_name, * 'atts' => $atts, * 'location' => array( * 'post_id' => get_the_ID(), * 'html' => 'unknown' * ) * ); */ $this->feed_details = $feed_details; $this->matching_entries = array(); $this->expiration_time = time() - 2 * WEEK_IN_SECONDS; } /** * Returns records that match the post ID and feed ID * of the feed being located * * @return array * * @since 5.11 */ public function retrieve_matching_entries() { global $wpdb; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; $results = $wpdb->get_results( $wpdb->prepare( " SELECT * FROM $feed_locator_table_name WHERE post_id = %d AND feed_id = %s", $this->feed_details['location']['post_id'], $this->feed_details['feed_id'] ), ARRAY_A ); return $results; } /** * Add feed being located to the database * * @since 5.11 */ public function insert_entry() { global $wpdb; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; $two_minutes_ago = date( 'Y-m-d H:i:s', time() - 120 ); $results_recent_entries = $wpdb->get_results( $wpdb->prepare(" SELECT COUNT(*) AS num_entries FROM $feed_locator_table_name WHERE last_update > %s; ", $two_minutes_ago ), ARRAY_A ); // Only allow 5 new entries within 5 minutes if ( isset( $results_recent_entries[0]['num_entries'] ) && (int)$results_recent_entries[0]['num_entries'] > 5 ) { return; } // Only allow 1000 total entries $results_total_entries = $wpdb->get_results( " SELECT COUNT(*) AS num_entries FROM $feed_locator_table_name", ARRAY_A ); if ( isset( $results_total_entries[0]['num_entries'] ) && (int)$results_total_entries[0]['num_entries'] > 1000 ) { $this->delete_oldest_entry(); } $affected = $wpdb->query( $wpdb->prepare( "INSERT INTO $feed_locator_table_name (feed_id, post_id, html_location, shortcode_atts, last_update) VALUES ( %s, %d, %s, %s, %s);", $this->feed_details['feed_id'], $this->feed_details['location']['post_id'], $this->feed_details['location']['html'], sbi_json_encode( $this->feed_details['atts'] ), date( 'Y-m-d H:i:s' ) ) ); } /** * Update a record based on the existing "id" column. Location can change * from "unknown" to one of footer, content, header, or sidebar. * * @param $id * @param $location * * @since 5.11 */ public function update_entry( $id, $location ) { global $wpdb; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; $query = $wpdb->query( $wpdb->prepare( " UPDATE $feed_locator_table_name SET last_update = %s, html_location = %s WHERE id = %d;", date( 'Y-m-d H:i:s' ), $location, $id ) ); } /** * Processes a feed being located based on whether or not the record * exists as well as whether or not an unknown location needs to be * updated. * * @since 5.11 */ public function add_or_update_entry() { if ( empty( $this->feed_details['feed_id'] ) ) { return; } if ( empty( $this->feed_details['location']['post_id'] ) ) { return; } $this->matching_entries = $this->retrieve_matching_entries(); if ( empty( $this->matching_entries ) ) { $this->insert_entry(); } else { $matching_indices = array(); $matched_location = false; $non_unknown_match = false; $unknown_match = false; foreach ( $this->matching_entries as $index => $matching_entry ) { $details_atts = is_array( $this->feed_details['atts'] ) ? $this->feed_details['atts'] : array(); $matching_atts = json_decode( $matching_entry['shortcode_atts'], true ); if ( ! is_array( $matching_atts ) ) { $matching_atts = array(); } $atts_diff = array_diff( $matching_atts, $details_atts ); // determines if the shortcode settings match the shortcode settings of an existing feed if ( empty( $atts_diff ) ) { $matching_indices[] = $matching_entry['id']; if ( $matching_entry['html_location'] === $this->feed_details['location']['html'] ) { $matched_location = $index; $this->update_entry( $matching_entry['id'], $matching_entry['html_location'] ); } if ( $matching_entry['html_location'] !== 'unknown' ) { $non_unknown_match = $index; } else { $unknown_match = $index; } } } if ( false === $matched_location ) { // if there is no matched location, there is only one feed on the page, and the feed being checked has an unknown location, update the known location if ( count( $matching_indices ) === 1 && $this->feed_details['location']['html'] === 'unknown' && false !== $non_unknown_match ) { $this->update_entry( $this->matching_entries[ $non_unknown_match ]['id'], $this->matching_entries[ $non_unknown_match ]['html_location'] ); } else { if ( $this->feed_details['location']['html'] !== 'unknown' && false !== $unknown_match ) { $this->update_entry( $this->matching_entries[ $unknown_match ]['id'], $this->feed_details['location']['html'] ); } else { $this->insert_entry(); } } } } } public function delete_oldest_entry() { global $wpdb; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; $affected = $wpdb->query( "DELETE FROM $feed_locator_table_name ORDER BY last_update ASC LIMIT 1;" ); } /** * Queries the locator table for feeds by feed_id * * @param $args * * @return array|object|null * * @since 4.0 */ public static function instagram_feed_locator_query( $args ) { global $wpdb; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; $group_by = isset( $args['group_by'] ) ? self::sanitize_group_by( $args['group_by'] ) : ''; $location_string = 'content'; if ( isset( $args['html_location'] ) ) { $locations = array_map( 'esc_sql', $args['html_location'] ); $location_string = implode( "', '", $locations ); } $page = 0; if ( isset( $args['page'] ) ) { $page = (int) $args['page'] - 1; unset( $args['page'] ); } $offset = max( 0, $page * InstagramFeed\Builder\SBI_Db::RESULTS_PER_PAGE ); if ( isset( $args['shortcode_atts'] ) ) { $results = $wpdb->get_results( $wpdb->prepare( " SELECT * FROM $feed_locator_table_name WHERE shortcode_atts = %s AND html_location IN ( '$location_string' ) $group_by LIMIT %d OFFSET %d;", $args['shortcode_atts'], InstagramFeed\Builder\SBI_Db::RESULTS_PER_PAGE, $offset ), ARRAY_A ); } else { $results = $wpdb->get_results( $wpdb->prepare( " SELECT * FROM $feed_locator_table_name WHERE feed_id = %s AND html_location IN ( '$location_string' ) $group_by LIMIT %d OFFSET %d;", $args['feed_id'], InstagramFeed\Builder\SBI_Db::RESULTS_PER_PAGE, $offset ), ARRAY_A ); } return $results; } /** * Queries all legacy feeds that have been located * * @param $args * * @return array|object|null * * @since 4.0 */ public static function legacy_instagram_feed_locator_query( $args ) { global $wpdb; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; $group_by = isset( $args['group_by'] ) ? self::sanitize_group_by( $args['group_by'] ) : ''; $location_string = 'content'; if ( isset( $args['html_location'] ) ) { $locations = array_map( 'esc_sql', $args['html_location'] ); $location_string = implode( "', '", $locations ); } $page = 0; if ( isset( $args['page'] ) ) { $page = (int) $args['page'] - 1; unset( $args['page'] ); } $offset = max( 0, $page * InstagramFeed\Builder\SBI_Db::RESULTS_PER_PAGE ); $limit = InstagramFeed\Builder\SBI_Db::RESULTS_PER_PAGE; $results = $wpdb->get_results( " SELECT * FROM $feed_locator_table_name WHERE feed_id NOT LIKE '*%' AND html_location IN ( '$location_string' ) $group_by LIMIT $limit OFFSET $offset;", ARRAY_A ); return $results; } public static function update_legacy_to_builder( $args ) { global $wpdb; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; $data = array( 'feed_id' => '*' . $args['new_feed_id'], 'shortcode_atts' => '{"feed":"' . $args['new_feed_id'] . '"}', ); $affected = $wpdb->query( $wpdb->prepare( "UPDATE $feed_locator_table_name SET feed_id = %s, shortcode_atts = %s", $data['feed_id'], $data['shortcode_atts'] ) ); return $affected; } /** * Simple count of rows based on args * * @param array $args * * @return int * * @since 4.0 */ public static function count( $args ) { global $wpdb; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; if ( isset( $args['shortcode_atts'] ) ) { $results = $wpdb->get_results( $wpdb->prepare( " SELECT COUNT(*) AS num_entries FROM $feed_locator_table_name WHERE shortcode_atts = %s ", $args['shortcode_atts'] ), ARRAY_A ); } else { $results = $wpdb->get_results( $wpdb->prepare( " SELECT COUNT(*) AS num_entries FROM $feed_locator_table_name WHERE feed_id = %s ", $args['feed_id'] ), ARRAY_A ); } if ( isset( $results[0]['num_entries'] ) ) { return (int) $results[0]['num_entries']; } return 0; } /** * Old feeds are only detected once a day to keep load on the server low. * * @return bool * * @since 5.11 */ public static function should_clear_old_locations() { $sbi_statuses_option = get_option( 'sbi_statuses', array() ); $last_old_feed_check = isset( $sbi_statuses_option['feed_locator']['last_check'] ) ? $sbi_statuses_option['feed_locator']['last_check'] : 0; return $last_old_feed_check < time() - DAY_IN_SECONDS; } /** * Old feeds are removed if they haven't been updated in two weeks. * * @since 5.11 */ public static function delete_old_locations() { global $wpdb; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; $two_weeks_ago = date( 'Y-m-d H:i:s', time() - 2 * WEEK_IN_SECONDS ); $affected = $wpdb->query( $wpdb->prepare( "DELETE FROM $feed_locator_table_name WHERE last_update < %s;", $two_weeks_ago ) ); $sbi_statuses_option = get_option( 'sbi_statuses', array() ); $sbi_statuses_option['feed_locator']['last_check'] = time(); if ( ! isset( $sbi_statuses_option['feed_locator']['initialized'] ) ) { $sbi_statuses_option['feed_locator']['initialized'] = time(); } update_option( 'sbi_statuses', $sbi_statuses_option, true ); } /** * Feeds are located with the page load randomly (5% or 1/30 loads) * to decrease load on the server. * * If the locating just started (within 5 minutes) it is run more often * to collect feed locations quickly. * * @return bool * * @since 5.11 */ public static function should_do_locating() { if ( is_admin() || isset( $_GET['page'] ) && strpos( $_GET['page'], 'sbi' ) !== false ) { return false; } $sbi_statuses_option = get_option( 'sbi_statuses', array() ); if ( isset( $sbi_statuses_option['feed_locator']['initialized'] ) && $sbi_statuses_option['feed_locator']['initialized'] < ( time() - 300 ) ) { $should_do_locating = rand( 1, 10 ) === 10; } else { $should_do_locating = rand( 1, 30 ) === 30; } $should_do_locating = apply_filters( 'sbi_should_do_locating', $should_do_locating ); return $should_do_locating; } /** * Simliar to the should_do_locating method but will add an additional * database query to see if there is a feed with an unknown location that * matches the details of the feed in question. * * @param $feed_id * @param $post_id * * @return bool * * @since 5.11 */ public static function should_do_ajax_locating( $feed_id, $post_id ) { if ( is_admin() || isset( $_GET['page'] ) && strpos( $_GET['page'], 'sbi' ) !== false ) { return false; } $sbi_statuses_option = get_option( 'sbi_statuses', array() ); if ( isset( $sbi_statuses_option['feed_locator']['initialized'] ) && $sbi_statuses_option['feed_locator']['initialized'] < ( time() - 300 ) ) { $should_do_locating = rand( 1, 10 ) === 10; } else { $should_do_locating = rand( 1, 30 ) === 30; } if ( $should_do_locating ) { $should_do_locating = self::entries_need_locating( $feed_id, $post_id ); } $should_do_locating = apply_filters( 'sbi_should_do_ajax_locating', $should_do_locating ); return $should_do_locating; } /** * Feeds are located with the page load randomly (1/30 loads) * to decrease load on the server. * * If the locating just started (within 5 minutes) it is run more often * to collect feed locations quickly. * * @param $feed_id * @param $post_id * * @return bool * * @since 5.11 */ public static function entries_need_locating( $feed_id, $post_id ) { global $wpdb; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; $one_day_ago = date( 'Y-m-d H:i:s', time() - DAY_IN_SECONDS ); $results = $wpdb->get_results( $wpdb->prepare( " SELECT id FROM $feed_locator_table_name WHERE html_location = 'unknown' AND last_update < %s AND feed_id = %s AND post_id = %d LIMIT 1;", $one_day_ago, $feed_id, $post_id ), ARRAY_A ); return isset( $results[0] ); } /** * A custom table stores locations * * @since 5.11 */ public static function create_table() { global $wpdb; global $sb_instagram_posts_manager; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; if ( $wpdb->get_var( "show tables like '$feed_locator_table_name'" ) !== $feed_locator_table_name ) { $sql = 'CREATE TABLE ' . $feed_locator_table_name . " ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, feed_id VARCHAR(50) DEFAULT '' NOT NULL, post_id BIGINT(20) UNSIGNED NOT NULL, html_location VARCHAR(50) DEFAULT 'unknown' NOT NULL, shortcode_atts LONGTEXT NOT NULL, last_update DATETIME );"; $wpdb->query( $sql ); } $error = $wpdb->last_error; $query = $wpdb->last_query; $had_error = false; if ( $wpdb->get_var( "show tables like '$feed_locator_table_name'" ) !== $feed_locator_table_name ) { $had_error = true; $sb_instagram_posts_manager->add_error( 'database_create', '' . __( 'There was an error when trying to create the database tables used to locate feeds.', 'instagram-feed' ) . '
' . $error . '
' . $query . '' ); } if ( ! $had_error ) { $wpdb->query( "ALTER TABLE $feed_locator_table_name ADD INDEX feed_id (feed_id)" ); $wpdb->query( "ALTER TABLE $feed_locator_table_name ADD INDEX post_id (post_id)" ); $sb_instagram_posts_manager->remove_error( 'database_create' ); } } /** * Counts the number of unique feeds in the database. * * @return int * * @since 5.11 */ public static function count_unique() { global $wpdb; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; $results_content = $wpdb->get_results( " SELECT COUNT(*) AS num_entries FROM $feed_locator_table_name WHERE html_location = 'content' ", ARRAY_A ); $results_other = $wpdb->get_results( " SELECT COUNT(*) AS num_entries FROM $feed_locator_table_name WHERE html_location != 'content' AND html_location != 'unknown' GROUP BY feed_id ", ARRAY_A ); $total = 0; if ( isset( $results_content[0]['num_entries'] ) ) { $total += (int) $results_content[0]['num_entries']; } if ( isset( $results_other[0]['num_entries'] ) ) { $total += (int) $results_other[0]['num_entries']; } return $total; } /** * Creates a summary of the located feeds in an array * * @return array * * @since 5.11 */ public static function summary() { global $wpdb; $feed_locator_table_name = $wpdb->prefix . SBI_INSTAGRAM_FEED_LOCATOR; $locations = array( array( 'label' => __( 'Content', 'instagram-feed' ), 'html_locations' => array( 'content', 'unknown' ), ), array( 'label' => __( 'Header', 'instagram-feed' ), 'html_locations' => array( 'header' ), 'group_by' => 'feed_id', ), array( 'label' => __( 'Sidebar', 'instagram-feed' ), 'html_locations' => array( 'sidebar' ), 'group_by' => 'feed_id', ), array( 'label' => __( 'Footer', 'instagram-feed' ), 'html_locations' => array( 'footer' ), 'group_by' => 'feed_id', ), ); $one_result_found = false; foreach ( $locations as $key => $location ) { $in = implode( "', '", $location['html_locations'] ); $group_by = isset( $location['group_by'] ) ? self::sanitize_group_by( $location['group_by'] ) : ''; $results = $wpdb->get_results( " SELECT * FROM $feed_locator_table_name WHERE html_location IN ('$in') $group_by ORDER BY last_update ASC", ARRAY_A ); if ( isset( $results[0] ) ) { $one_result_found = true; } $locations[ $key ]['results'] = $results; } if ( ! $one_result_found ) { return array(); } return $locations; } public static function sanitize_group_by( $group_by ) { if ( in_array( $group_by, self::COLUMN_NAMES, true ) ) { return 'GROUP BY ' . $group_by; } return ''; } } PKL\i53instagram-feed/inc/class-sb-instagram-education.phpnu[hooks(); } /** * Hooks. * * @since 5.5 */ public function hooks() { $this->plugin_version = sbi_is_pro_version() ? 'pro' : 'free'; } /** * "Did You Know?" messages. * * @since 5.5 */ public function dyk_messages() { $free_messages = array( array( 'title' => esc_html__( 'Get the Most out of Hashtags', 'instagram-feed' ), 'content' => esc_html__( 'You can use hashtags on Instagram for so many things; targeted promotions, engaging with your audience, running contests, or just for categorizing posts. Learn more about how you can display Instagram hashtag feeds on your website using the Instagram Feed Pro plugin.', 'instagram-feed' ), 'more' => 'https://smashballoon.com/instagram-feed/features/?utm_campaign=instagram-free&utm_source=dyk-messages&utm_content=hashtag#hashtag', 'item' => 1, ), array( 'title' => esc_html__( 'Keep Visitors on Your Site', 'instagram-feed' ), 'content' => esc_html__( "You've done the hard work of getting a visitor onto your site, now keep them there by displaying your Instagram content inside a pop-up lightbox, rather than sending your visitors away to Instagram. Learn more about the Instagram Feed Pro lightbox feature.", 'instagram-feed' ), 'more' => 'https://smashballoon.com/instagram-feed/features/?utm_campaign=instagram-free&utm_source=dyk-messages&utm_content=popuplightbox#popuplightbox', 'item' => 2, ), array( 'title' => esc_html__( 'Highlight Your Posts and Create Carousels', 'instagram-feed' ), 'content' => esc_html__( "Feature specific Instagram posts in your feeds by using the Highlight layout to feature specific posts, either by using their ID or a hashtag in their caption. Also create rotating carousels of your photos and videos to best utilize the space on your site. These layouts and more are available in our Pro version.", 'instagram-feed' ), 'more' => 'https://smashballoon.com/instagram-feed/features/?utm_campaign=instagram-free&utm_source=dyk-messages&utm_content=highlight#highlight', 'item' => 3, ), array( 'title' => esc_html__( 'Moderate your Feed Content', 'instagram-feed' ), 'content' => esc_html__( "Control exactly which posts show up in your feed by using the Visual Moderation Mode feature to pick and choose what to display. Remove specific posts or create a whitelist of approved content using Instagram Feed Pro.", 'instagram-feed' ), 'more' => 'https://smashballoon.com/instagram-feed/features/?utm_campaign=instagram-free&utm_source=dyk-messages&utm_content=moderation#moderation', 'item' => 4, ), ); $pro_messages = array( array( 'title' => esc_html__( 'Automated YouTube Live Streaming', 'instagram-feed' ), 'content' => esc_html__( 'You can automatically feed live YouTube videos to your website using our Feeds For YouTube Pro plugin. It takes all the hassle out of publishing live videos to your site by automating the process.', 'instagram-feed' ), 'more' => 'https://smashballoon.com/youtube-feed/', 'item' => 1, ), array( 'title' => esc_html__( 'Display Facebook Pages and Groups', 'instagram-feed' ), 'content' => esc_html__( 'Have a Facebook Page or Group? Easily embed a feed of posts into your website, delivering fresh content automatically to your site from Facebook. Posts, Photos, Events, Videos, Albums, Reviews, and more!', 'instagram-feed' ), 'more' => 'https://smashballoon.com/custom-facebook-feed/', 'item' => 2, ), array( 'title' => esc_html__( 'Adding Social Proof with Twitter Feeds', 'instagram-feed' ), 'content' => esc_html__( 'Twitter testimonials are one of the best ways to add verifiable social proof to your website. They add credibility to your brand, product, or service by displaying reviews from real people to your site, helping to convert more visitors into customers. Our free Custom Twitter Feeds plugin makes displaying Tweets on your website a breeze.', 'instagram-feed' ), 'more' => 'https://wordpress.org/plugins/custom-twitter-feeds/', 'item' => 3, ), ); if ( $this->plugin_version === 'pro' ) { return $pro_messages; } return $free_messages; } /** * "Did You Know?" random message. * * @since 5.5 */ public function dyk_message_rnd() { $messages = $this->dyk_messages(); $index = array_rand( $messages ); return $messages[ $index ]; } /** * "Did You Know?" display message. * * @since 5.5 * */ public function dyk_display() { $dyk_message = $this->dyk_message_rnd(); if ( ! empty( $dyk_message['more'] ) ) { //utm_source=plugin-pro&utm_campaign= $dyk_message['more'] = add_query_arg( array( 'utm_source' => 'issueemail', 'utm_campaign' => 'instagram-'.$this->plugin_version, 'utm_medium' => $dyk_message['item'], ), $dyk_message['more'] ); } return $dyk_message; } } PKL\)h55$instagram-feed/inc/Platform_Data.phpnu[remove_error( 'platform_data_deleted' ); global $sbi_notices; $sbi_notices->remove_notice( 'platform_data_deleted' ); $sbi_statuses_option = get_option( self::SBI_STATUSES_OPTION_KEY, [] ); if ( empty( $sbi_statuses_option[ self::APP_PERMISSION_REVOKED_STATUS_KEY ] ) ) { return; } $sbi_revoke_platform_data = get_option( self::REVOKE_PLATFORM_DATA_OPTION_KEY, [] ); $revoked_account_username = isset( $sbi_revoke_platform_data['connected_account']['username'] ) ? $sbi_revoke_platform_data['connected_account']['username'] : ''; if ( empty( $revoked_account_username ) ) { return; } $api_response_username = json_decode( $response['body'] )->username; if ( $revoked_account_username !== $api_response_username ) { return; } // Cleanup the revoked platform status and revoke account data. $this->cleanup_revoked_account( $sbi_statuses_option ); $sb_instagram_posts_manager->reset_api_errors(); } /** * Handle the app permission error. * * @return void */ public function handle_app_permission_error() { global $sb_instagram_posts_manager; $sbi_statuses_option = get_option( self::SBI_STATUSES_OPTION_KEY, [] ); if ( empty( $sbi_statuses_option[ self::APP_PERMISSION_REVOKED_STATUS_KEY ] ) ) { return; } $sbi_revoke_platform_data = get_option( self::REVOKE_PLATFORM_DATA_OPTION_KEY, [] ); $revoke_platform_data_timestamp = isset( $sbi_revoke_platform_data['revoke_platform_data_timestamp'] ) ? $sbi_revoke_platform_data['revoke_platform_data_timestamp'] : 0; $connected_account = isset( $sbi_revoke_platform_data['connected_account'] ) ? $sbi_revoke_platform_data['connected_account'] : []; if ( ! $revoke_platform_data_timestamp ) { return; } $current_timestamp = current_time( 'timestamp', true ); // Check if current timestamp is less than revoke platform data timestamp, if so, return. if ( $current_timestamp < $revoke_platform_data_timestamp ) { return; } // Revoke platform data. $this->delete_platform_data( $connected_account ); $this->send_platform_data_delete_notification_email(); // Cleanup the revoked platform status and revoke account data. $this->cleanup_revoked_account( $sbi_statuses_option ); $sb_instagram_posts_manager->reset_api_errors(); // Adding a notice to the admin page to inform the admin that platform data has been deleted. $sb_instagram_posts_manager->add_error( 'platform_data_deleted', __( 'An account admin has deauthorized the Smash Balloon app used to power the Instagram Feed plugin. The page was not reconnected within the 7 day limit and all Instagram data was automatically deleted on your website due to Facebook data privacy rules.', 'instagram-feed' ) ); } /** * Handle the app permission status. * * @param array $connected_account The connected account data. * * @return void */ public function handle_app_permission_status( $connected_account ) { $sbi_statuses_option = get_option( self::SBI_STATUSES_OPTION_KEY, [] ); if ( isset( $sbi_statuses_option['app_permission_revoked'] ) && true === $sbi_statuses_option['app_permission_revoked'] ) { return; } $this->update_app_permission_revoked_status( $sbi_statuses_option, true ); // Calculate the grace period for revoking platform data. $current_timestamp = current_time( 'timestamp', true ); $revoke_platform_data_timestamp = strtotime( '+7 days', $current_timestamp ); update_option( self::REVOKE_PLATFORM_DATA_OPTION_KEY, [ 'revoke_platform_data_timestamp' => $revoke_platform_data_timestamp, 'connected_account' => $connected_account, ] ); $this->send_revoke_notification_email(); } /** * Delete any data associated with the Instagram API and the * connected account being deleted. * * @param $to_delete_connected_account * * @return void */ protected function delete_platform_data( $to_delete_connected_account ) { $are_other_business_accounts = false; $all_connected_accounts = SB_Instagram_Connected_Account::get_all_connected_accounts(); $to_update = []; foreach ( $all_connected_accounts as $connected_account ) { if ( (int) $connected_account['user_id'] !== (int) $to_delete_connected_account['user_id'] ) { $to_update[ $connected_account['user_id'] ] = $connected_account; if ( isset( $connected_account['type'] ) && $connected_account['type'] === 'business' ) { $are_other_business_accounts = true; } } } SB_Instagram_Connected_Account::update_connected_accounts( $to_update ); SBI_Db::delete_source_by_account_id( $to_delete_connected_account['user_id'] ); $manager = new SB_Instagram_Data_Manager(); $manager->delete_caches(); $manager->delete_comments_data(); if ( empty( $to_update ) || ! $are_other_business_accounts ) { $manager->delete_hashtag_data(); } else { $manager->delete_non_hashtag_sbi_instagram_posts( $to_delete_connected_account['username'] ); } } /** * Update the app permission revoked status. * * @param array $sbi_statuses_option The option value. * @param bool $is_revoked The revoke status. * * @return void */ protected function update_app_permission_revoked_status( $sbi_statuses_option, $is_revoked ) { if ( $is_revoked ) { $sbi_statuses_option[ self::APP_PERMISSION_REVOKED_STATUS_KEY ] = true; } else { unset( $sbi_statuses_option[ self::APP_PERMISSION_REVOKED_STATUS_KEY ] ); } update_option( self::SBI_STATUSES_OPTION_KEY, $sbi_statuses_option ); } /** * Handles events before the deletion of old data. * * @param array $statuses * * @return void */ public function handle_event_before_delete_old_data( $statuses ) { global $sb_instagram_posts_manager; $sbi_statuses_option = get_option( self::SBI_STATUSES_OPTION_KEY, [] ); if ( ! empty( $sbi_statuses_option[ self::UNUSED_FEED_WARNING_EMAIL_SENT_STATUS_KEY ] ) ) { return; } if ( $statuses['last_used'] < sbi_get_current_time() - ( 14 * DAY_IN_SECONDS ) ) { $sb_instagram_posts_manager->add_error( 'unused_feed', __( 'Your Instagram feed has been not viewed in the last 14 days. Due to Instagram data privacy rules, all data for this feed will be deleted in 7 days time. To avoid automated data deletion, simply view the Instagram feed on your website within the next 7 days.', 'instagram-feed' ) ); $this->send_unused_feed_usage_notification_email(); // Setting the flag to true so that the warning email is not sent again. $sbi_statuses_option[ self::UNUSED_FEED_WARNING_EMAIL_SENT_STATUS_KEY ] = true; update_option( self::SBI_STATUSES_OPTION_KEY, $sbi_statuses_option ); } } /** * Handles the reset of unused feed data for deletion. * * @return void */ public function handle_unused_feed_usage() { //Security Checks check_ajax_referer( 'sbi_nonce', 'sbi_nonce' ); if ( ! sbi_current_user_can( 'manage_instagram_feed_options' ) ) { wp_send_json_error(); } global $sb_instagram_posts_manager; $sb_instagram_posts_manager->remove_error('unused_feed'); global $sbi_notices; $sbi_notices->remove_notice( 'unused_feed' ); $manager = new \SB_Instagram_Data_Manager(); $manager->update_last_used(); $sbi_statuses_option = get_option( self::SBI_STATUSES_OPTION_KEY, [] ); // Unset the flag to allow the warning email to be sent again. unset( $sbi_statuses_option[ self::UNUSED_FEED_WARNING_EMAIL_SENT_STATUS_KEY ] ); update_option( self::SBI_STATUSES_OPTION_KEY, $sbi_statuses_option ); wp_send_json_success( [ 'message' => '
' . esc_html__( 'Success! Your Instagram Feeds will continue to work normally.', 'instagram-feed' ) . '
' ] ); } /** * Cleanup revoked account data. * * @param array $sbi_statuses_option * * @return void */ public function cleanup_revoked_account( $sbi_statuses_option ) { $this->update_app_permission_revoked_status( $sbi_statuses_option, false ); delete_option( self::REVOKE_PLATFORM_DATA_OPTION_KEY ); } /** * Sends a notification email to the admin when the app permission is revoked. * * @return void */ protected function send_revoke_notification_email() { $link = admin_url( 'admin.php?page=sbi-settings'); $title = __( 'There has been a problem with your Instagram Feed.', 'instagram-feed' ); $bold = __( 'Action Required Within 7 Days', 'instagram-feed' ); $site_url = sprintf( '%s', esc_url( home_url() ), __( 'your website', 'instagram-feed' ) ); $details = '

' . sprintf( __( 'An account admin has deauthorized the Smash Balloon app used to power the Instagram Feed plugin on %s. If the Instagram source is not reconnected within 7 days then all Instagram data will be automatically deleted on your website due to Facebook data privacy rules.', 'instagram-feed' ), $site_url ) . '

'; $settings_page = sprintf( '
%s', esc_url( $link ), esc_html__( 'Settings Page', 'instagram-feed' ) ); $details .= '

' . sprintf( __( 'To prevent the automated deletion of data for the account, please reconnect your source for the plugin %s within 7 days.', 'instagram-feed' ), $settings_page ). '

'; $details .= '

' . __( 'More Information', 'instagram-feed' ) . '

'; Email_Notification::send( $title, $bold, $details ); } /** * Sends a notification email to the admin when the feed has not been used for a while. * * @return void */ protected function send_unused_feed_usage_notification_email() { $title = __( 'There has been a problem with your Instagram Feed.', 'instagram-feed' ); $bold = __( 'Action Required Within 7 Days', 'instagram-feed' ); $site_url = sprintf( '%s', esc_url( home_url() ), __( 'your website', 'instagram-feed' ) ); $details = '

' . sprintf( __( 'An Instagram feed on %s has been not viewed in the last 14 days. Due to Instagram data privacy rules, all data for this feed will be deleted in 7 days time.', 'instagram-feed' ), $site_url ) . '

'; $details .= '

' . __( 'To avoid automated data deletion, simply view the Instagram feed on your website within the next 7 days.', 'instagram-feed' ) . '

'; Email_Notification::send( $title, $bold, $details ); } /** * Sends a notification email to the admin when the platform data has been deleted. * * @return void */ protected function send_platform_data_delete_notification_email() { $link = admin_url( 'admin.php?page=sbi-settings'); $title = __( 'All Instagram Data has Been Removed', 'instagram-feed' ); $bold = __( 'An account admin has deauthorized the Smash Balloon app used to power the Instagram Feed plugin.', 'instagram-feed' ); $site_url = sprintf( '
%s', esc_url( home_url() ), __( 'your website', 'instagram-feed' ) ); $details = '

' . sprintf( __( 'The page was not reconnected within the 7 day limit and all Instagram data was automatically deleted on %s due to Facebook data privacy rules.', 'instagram-feed' ), $site_url ) . '

'; $settings_page = sprintf( '
%s', esc_url( $link ), esc_html__( 'Settings Page', 'instagram-feed' ) ); $details .= '

' . sprintf( __( 'To fix your feeds, reconnect all accounts that were in use on the Settings page.', 'instagram-feed' ), $settings_page ) . '

'; Email_Notification::send( $title, $bold, $details ); } } PKL\RSӋӋinstagram-feed/README.txtnu[=== Smash Balloon Social Photo Feed – Easy Social Feeds Plugin === Contributors: smashballoon, craig-at-smash-balloon, am, smub Tags: Instagram, Instagram feed, Instagram photos, Instagram widget, Instagram gallery Requires at least: 4.1 Tested up to: 6.6 Stable tag: 6.5.1 Requires PHP: 5.6 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html Formerly "Instagram Feed". Display clean, customizable, and responsive Instagram feeds from multiple accounts. Supports Instagram oEmbeds. == Description == Display Instagram posts from your Instagram accounts, either in the same single feed or in multiple different ones. The perfect Instagram gallery plugin for your WordPress site. https://www.youtube.com/watch?v=517rApIqzbw = Features = * **New:** Now automatically powers your **Instagram oEmbeds** * Super **simple to set up** * Display photos from **multiple Instagram accounts** in the same feed or in separate feeds * Completely **responsive** and mobile ready - layout looks great on any screen size and in any container width * **Completely customizable** - Customize the width, height, number of photos, number of columns, image size, background color, image spacing and more! * Display **multiple Instagram feeds** on the same page or on different pages throughout your site * **GDPR Compliance** - automatically integrates with many of the popular GDPR cookie consent plugins and includes a 1-click easy GDPR setting. * Use the drag-and-drop customizer to completely customize each of your Instagram feeds * Display thumbnail, medium or **full-size photos** from your Instagram feed * **Infinitely load more** of your Instagram photos with the 'Load More' button * Includes a **Follow on Instagram button** at the bottom of your feed * Display a **beautiful header** at the top of your feed * Display your Instagram photos chronologically or in random order * Add your own Custom CSS and JavaScript for even deeper customizations * Handy block for easily adding your feed to posts and pages using the block editor * Integrations with Elementor and Divi page builders. Instagram for Elementor is super simple = Benefits = * **Increase Social Engagement** - Increase engagement between you and your Instagram followers. Increase your number of followers by displaying your Instagram content directly on your site. * **Save Time** - Don't have time to update your photos on your site? Save time and increase efficiency by only posting your photos to Instagram and automatically displaying them on your website * **Display Your Content Your Way** - Customize your Instagram feeds to look exactly the way you want, so that they blend seamlessly into your site or pop out at your visitors! * **Keep Your Site Looking Fresh** - Automatically push your new Instagram content straight to your site to keep it looking fresh and keeping your audience engaged. * **Super simple to set up** - Once installed, you can be displaying your Instagram photos within 30 seconds! No confusing steps or Instagram Developer account needed. * **Powers all Instagram oEmbeds on your site** - With WordPress removing support for Instagram oEmbeds, the plugin will now power all Instagram embeds on your site, old and new, to allow them to continue working. = Pro Version = In order to maintain the free version of the plugin on an ongoing basis, and to provide quick and effective support for free, we offer a Pro version of the plugin. The Pro version allows you to: * Display Hashtag feeds * View photos and videos in a popup lightbox directly on your site * View post comments for user feeds * Display the number of like and comments for each post * Create carousels from your posts * Use "Masonry" or "Highlight" layouts for your feeds * Display captions for photos and videos * Filter posts based on hashtag/word * Advanced moderation system for hiding/showing certain posts * Block posts by specific users * Create "shoppable" Instagram feeds, and more. * Add custom links to each post like link in bio * Quick create templates for easy feed creation [Find out more about the Pro version](https://smashballoon.com/instagram-feed/?utm_campaign=instagram-free-readme&utm_source=proversion&utm_medium=profindout "Instagram Feed Pro") or [try out the Pro demo](https://smashballoon.com/instagram-feed/demo/?utm_campaign=instagram-free-readme&utm_source=proversion&utm_medium=readmedemo "Instagram Feed Pro Demo"). = Featured Reviews = "**Simple and concise** - Excellent plugin. Simple and non-bloated. I had a couple small issues with the plugin when I first started using it, but a quick comment on the support forums got a new version pushed out the next day with the fix. Awesome support!" - [Josh Jones](https://wordpress.org/support/topic/simple-and-concise-3 'Simple and concise Instagram plugin') "**Great plugin, greater support!** - I've definitely noticed an increase in followers on Instagram since I added this plugin to my sidebar. Thanks for the help in making some adjustments...looks and works great!" - [BNOTP](https://wordpress.org/support/topic/thanks-for-a-great-plugin-6 'Great plugin, greater Support!') = Feedback or Support = We're dedicated to providing the most customizable, robust and well supported Instagram feed plugin in the world, so if you have an issue or have any feedback on how to improve the plugin then please open a ticket in the [Support forum](http://wordpress.org/support/plugin/instagram-feed 'Instagram Feed Support Forum'). For a pop-up photo **lightbox**, to display posts by **hashtag**, show photo **captions**, **video** support + more, check out the [Pro version](http://smashballoon.com/instagram-feed/?utm_campaign=instagram-free-readme&utm_source=feedbacj&utm_medium=support 'Instagram Feed Pro'). == Installation == 1. Install the Instagram Feed plugin either via the WordPress plugin directory, or by uploading the files to your web server (in the `/wp-content/plugins/` directory). 2. Activate the Instagram Feed plugin through the 'Plugins' menu in WordPress. 3. Navigate to the 'Instagram Feed' settings page to connect your Instagram account. 4. Use the shortcode `[instagram-feed feed=1]` in your page, post or widget to display your Instagram photos. 5. You can display multiple Instagram feeds by using shortcode options, for example: `[instagram-feed num=6 cols=3]` For simple step-by-step directions on how to set up the Instagram Feed plugin please refer to our [setup guide](http://smashballoon.com/instagram-feed/free/?utm_campaign=instagram-free-readme&utm_source=installation&utm_medium=setup 'Instagram Feed setup guide'). = Display your Feed = **Single Feed** Copy and paste the following shortcode directly into the page, post or widget where you'd like the Instagram feed to show up: `[instagram-feed]` **Multiple Feeds** If you'd like to display multiple Instagram feeds then you can create multiple feeds and specify which feed you'd like to display using the feed ID like so: `[instagram-feed feed=2]` If you'd like to display feed from more than one account, connect multiple accounts and then create an additional feed. Embed it with the feed ID in the shortcode: `[instagram-feed feed=3]` You can display as many different Instagram feeds as you like, on either the same page or on different pages, by just using the shortcode options and the assigned feed ID below. For example: `[instagram-feed feed=1]` `[instagram-feed feed=2]` `[instagram-feed feed=3]` = Setting up the Free Instagram Feed WordPress Plugin = 1) Once you've installed the Instagram Feed plugin click on the Instagram Feed item in your WordPress menu 2) Follow the onboarding steps to connect an account and create your first feed. 3) Customize your feed with tons of settings and options to display it just how you would like. 4) Once you've customized your feed, copy the [instagram-feed feed=1] shortcode. 5) Paste it into any page, post or widget where you want the feed to appear. Alternatively, use our handy block to add it to a page. 6) You can use our handy Instagram Feed widget to display a feed in a sidebar or other widget area. == Frequently Asked Questions == = Can I display multiple Instagram feeds on my site or on the same page? = Yep. You can display multiple Instagram feeds by using our built-in feed creation tool, for example: `[instagram-feed feed=2]`. = Can I display photos from more than one Instagram account in one single feed? = Yep. You can connect multiple accounts and include them as sources when creating a feed. = Does the plugin work with Instagram oEmbeds? = Yes. In version 2.5, support was added to allow the plugin to power your Instagram oEmbeds as official support for these is no longer available in WordPress core. Just connect your account on the oEmbeds settings page inside the plugin and we'll do the rest. No developer app or account required. = Can I display a feed with in a widget or with a block? = Yes. Use the Instagram widget or Instagram block to display your feed in a sidebar or other widget area. = How do I connect my Instagram account? = We've made it super easy. Just follow the steps outlined when onboarding and you will have a connected account with simple clicks. = My feed isn't displaying. Why not!? = There are a few common reasons for this: * **Your Access Token may not be valid.** Try clicking on the blue Instagram login button on the plugin's Settings page again and copy and paste the Instagram token it gives you into the plugin's Access Token field. * **The plugin's JavaScript file isn't included in your page.** This is most likely because your WordPress theme is missing the WordPress [wp_footer](http://codex.wordpress.org/Function_Reference/wp_footer) function which is required for plugins to be able to add their JavaScript files to your page. You can fix this by opening your theme's **footer.php** file and adding the following directly before the closing tag between two php tags: `wp_footer();` * **Your website may contain a JavaScript error which is preventing JavaScript from running.** The plugin uses JavaScript to load the Instagram photos into your page and so needs JavaScript to be running in order to work. You would need to remove any existing JavaScript errors on your website for the plugin to be able to load in your feed. If you're still having an issue displaying your feed then please open a ticket in the [Support forum](http://wordpress.org/support/plugin/instagram-feed 'Instagram Feed Support Forum') with a link to the page where you're trying to display the Instagram feed and, if possible, a link to your Instagram account. = Are there any security issues with using an Access Token on my site? = Nope. The Access Token used in the plugin is a "read only" token, which means that it could never be used maliciously to manipulate your account. = Can I view the full-size photos or play Instagram videos directly on my website? = This is a feature of the [Pro version](http://smashballoon.com/instagram-feed/?utm_campaign=instagram-free-readme&utm_source=faqs&utm_medium=fullsize 'Instagram Feed Pro') of the plugin, which allows you to view the photos in a pop-up lightbox, support videos, display captions, display photos by hashtag + more! = How do I embed my feed directly into a WordPress page template? = You can embed your feed directly into a template file by using the WordPress [do_shortcode](http://codex.wordpress.org/Function_Reference/do_shortcode) function: ``. = My Feed Stopped Working – All I see is a Loading Symbol = If your Instagram photos aren't loading and all your see is a loading symbol then there are a few common reasons: 1) There's an issue with the Instagram Access Token that you are using You can obtain a new access token on the Instagram Feed Settings page by using the "connect" button to reconnect the account. Occasionally the connect button inside the plugin does not successfully update the access token. You can try [this link](https://smashballoon.com/instagram-feed/token/?utm_campaign=instagram-free-readme&utm_source=faqs&utm_medium=faqconnectionissue) as well. 2) The plugin's JavaScript file isn't being included in your page This is most likely because your WordPress theme is missing the WordPress wp_footer function which is required for plugins to be able to add their JavaScript files to your page. You can fix this by opening your theme's footer.php file and adding the following directly before the closing tag: 3) There's a JavaScript error on your site which is preventing the plugin's JavaScript file from running You can find out whether this is the case by right clicking on your page, selecting 'Inspect Element', and then clicking on the 'Console' tab, or by selecting the 'JavaScript Console' option from your browser's Developer Tools. If a JavaScript error is occurring on your site then you'll see it listed in red along with the JavaScript file which is causing it. 4) The feed you are trying to display has no Instagram posts If you are trying to display an Instagram feed that has no posts made to it, a loading symbol may be all that shows for the Instagram feed or nothing at all. Once you add an Instagram post the Instagram feed should display normally 5) The shortcode you are using is incorrect You may have an error in the Instagram Feed shortcode you are using or are missing a necessary argument. = What are the available options that I can use to customize my feed? = There are plenty of options to customize your feed! See the list below: * **General Options** * **width of feed** - The width of your feed. * **height of feed** - The height of your feed. * **background color** - The background color of the feed. Any hex color code. * * **Photo Options** * **sorting** - Sort the Instagram posts by Newest to Oldest (none) or Random (random) * **number of posts** - The number of posts to display initially. * * **desktop columns** - The number of columns in your feed when displayed on desktop devices * **tablet columns** - The number of columns in your feed when displayed on tablet devices * **mobile columns** - The number of columns in your feed when displayed on mobile or phone devices * * **image spacing** - The spacing around your photos * * **Header Options** * **show header** - Whether to show the feed Header. * **show bio** - Whether to show the account's bio in the feed Header. * **custom avatar** - URL of a custom Avatar image for the header (use whatever image you want for your account). * * **header color** - The color of the feed Header text. * * **'Load More' Button Options** * **show load more button** - Whether to show the 'Load More' button. * **button color** - The background color of the button. Any hex color code * **button text color** - The text color of the button. * **button text** - The text used for the button - Example: "Load More Photos" * * **'Follow on Instagram' Button Options** * **show the follow button ** - Whether to show the 'Follow on Instagram' button. * **follow color** - The background color of the 'Follow on Instagram' button. * **follow text color** - The text color of the 'Follow on Instagram' button. * **follow text** - The text used for the 'Follow on Instagram' button - Example: "Follow me" For more options, check out the [Pro version](http://smashballoon.com/instagram-feed/?utm_campaign=instagram-free-readme&utm_source=whatare&utm_medium=proshortcode 'Instagram Feed Pro'). For more FAQs related to the Instagram Feed plugin please visit the [FAQ section](https://smashballoon.com/instagram-feed/support/faq/?utm_campaign=instagram-free-readme&utm_source=whatare&utm_medium=faqs 'Instagram Feed plugin FAQs') on our website. == Screenshots == 1. Easily display feeds from any of your Instagram accounts 2. Your Instagram Feed is completely customizable and responsive 3. Combine multiple accounts into a single feed 5. Super quick and easy to get started. Just click the button to connect an Instagram account. 5. Customize layouts, styles, colors, and more 6. Just copy and paste the shortcode into any page, post or widget on your site. You can also use the block editor with our handy Instagram Feed block. == Other Notes == Add beautifully clean, customizable, and responsive Instagram feeds to your website. Super simple to set up and has tons of customization options to seamlessly match the look and feel of your site. = Why do I need this? = **Increase Social Engagement** Increase engagement between you and your Instagram followers. Increase your number of Instagram followers by displaying your Instagram content directly on your site. **Save Time** Don't have time to update your photos on your site? Save time and increase efficiency by only posting your photos to Instagram and automatically displaying them on your website. **Display Your Content Your Way** Customize your Instagram feeds to look exactly the way you want, so that they blend seamlessly into your site or pop out at your visitors! **Keep Your Site Looking Fresh** Automatically push your new Instagram content straight to your site to keep it looking fresh and keeping your audience engaged. **No Coding Required** Choose from tons of built-in Instagram Feed customization options to create a truly unique feed of your Instagram content. **Super simple to set up** Once installed, you can be displaying your Instagram photos within 30 seconds! No confusing steps or Instagram Developer account needed. **Mind-blowing Customer Support** We understand that sometimes you need help, have issues or just have questions. We love our users and strive to provide the best support experience in the business. We're experts in the Instagram API and can provide unparalleled service and expertise. If you need support then just let us know and we'll get back to you right away. = What can it do? = * Display Instagram photos from any Instagram account you own. * Completely responsive and mobile ready –your Instagram feed layout looks great on any screen size and in any container width * Display multiple Instagram feeds on the same page or on different pages throughout your site by using our powerful Instagram Feed shortcode options * Display posts from multiple Instagram User IDs * Use the built-in customization options to completely customize each of your Instagram feeds * Infinitely load more of your Instagram photos with the 'Load More' button * Plus more features added all the time! = Completely Customizable = * By default the Instagram feed will adopt the style of your website, but can be completely customized to look however you like! * Set the number of Instagram photos you want to display * Choose how many columns to display your Instagram photos in and the size of the Instagram photos * Choose to show or hide certain parts of the Instagram feed, such as the header, 'Load More', and 'Follow' buttons * Control the width, height and background color of your Instagram feed * Set the spacing/padding between the Instagram photos * Display Instagram photos in chronological or random order * Use your own custom text and colors for the 'Load More' and 'Follow' buttons * Enter your own custom CSS or JavaScript for even deeper customization * Use the shortcode options to style multiple Instagram feeds in completely different ways * Plus more customization options added all the time! = What's Next = If you like our WordPress Instagram plugin, then consider checking out our other projects: [OptinMonster](https://optinmonster.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – Get more email subscribers with the most popular conversion optimization plugin for WordPress. [WPForms](https://wpforms.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – #1 drag & drop online form builder for WordPress (trusted by 5 million sites). [AIOSEO](https://aioseo.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – The original WordPress SEO plugin to help you rank higher in search results (trusted by over 3 million sites). [MonsterInsights](https://monsterinsights.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – See the stats that matter and grow your business with confidence. Best Google Analytics plugin for WordPress. [SeedProd](https://seedprod.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – Create beautiful landing pages with our powerful drag & drop landing page builder. [WP Mail SMTP](https://wpmailsmtp.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – Improve email deliverability for your contact form with the most popular SMTP plugin for WordPress. [WPCode](https://wpcode.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) - must have WordPress code snippet management plugin to help you future-proof website customization (trusted by 1.5 million sites). [Duplicator](https://duplicator.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) - popular WordPress backup and migration plugin used by over 1 million websites. [WP Simple Pay](https://wpsimplepay.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – #1 Stripe payments plugin for WordPress. Start accepting one-time or recurring payments without a shopping cart. [PushEngage](https://pushengage.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – Connect with visitors after they leave your website with the leading web push notification plugin. [RafflePress](https://rafflepress.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – Best WordPress giveaway and contest plugin to grow traffic and social followers. [TrustPulse](https://trustpulse.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – Add real-time social proof notifications to boost your store conversions by up to 15%. [SearchWP](https://searchwp.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – The most advanced custom WordPress search plugin to improve WordPress search quality. [AffiliateWP](https://affiliatewp.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – #1 affiliate management plugin for WordPress. Add a referral program to your online store. [Easy Digital Downloads](https://easydigitaldownloads.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) – The best WordPress eCommerce plugin to sell digital products (eBooks, software, music, and more). [WPCharitable](https://wpcharitable.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) - Top-rated WordPress donation and fundraising plugin for WordPress. Visit [WPBeginner](https://wpbeginner.com/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) to learn from our [WordPress Tutorials](https://www.wpbeginner.com/category/wp-tutorials/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links) and about the [best WordPress plugins](https://www.wpbeginner.com/category/plugins/?utm_campaign=instagram-free&utm_source=readme&utm_medium=whats-next-links). == Changelog == = 6.5.1 = * Fix: Plugin hardening; = 6.5.0 = * New: Added webp image support for the local image optimization feature. This will improve the performance of your feed by serving images in the webp format when possible. * New: Added Blocks to easily use our other social media feeds. * Fix: Fixed an issue with images not loading in the post editor when using the Instagram Feed block. = 6.4.3 = * New: Added support for new version of CookieYes GDPR plugin. * New: Updated the URL for oEmbed auth flow. * Fix: Resolved conflict with TikTok Feeds and removed assets when callout is not shown. * Fix: Fixed issues with admin notices not dismissing properly. = 6.4.2 = * Fix: PHP fatal error caused by dependencies not being prefixed with the correct namespace. = 6.4.1 = * Fix: PHP fatal error that could occur in some circumstances when using the plugin. * Fix: JS error that occurred on the frontend. = 6.4 = * New: Added a checklist and callout feature to help users get started with all Smash Balloon products installed * Tweak: Added some improvements to our onboarding wizard to make it clear what certain steps do. * Tweak: Made improvements to our oEmbed connection process. * Fix: Fixed AJAX themes not loading jQuery dependency causing the feed to break in some circumstances. * Translations: Updated our translation .pot file. = 6.3.1 = * Fix: Fixed some admin notices not dismissing as expected. * Fix: Fixed an issue that would cause a fatal error when trying to delete the plugin. = 6.3 = * New: Updated CSS floats to flexbox and grid for better layout support and compatibility with themes. If you have made customizations in form of CSS, JS, or custom feed templates, make sure your feed looks as expected after updating. If you need time to update your customizations, use the "Legacy CSS" setting on the "Advanced" tab to revert the CSS file to version 6.2. * New: Improved how images are displayed to support lazy loading. * Fix: Added support for Borlabs Cookie v3.0. = 6.2.10 = * New: Added a menu item to easily install our new [TikTok Feeds](https://wordpress.org/plugins/feeds-for-tiktok/) plugin! = 6.2.9 = * New: Added Elementor widget and Divi module for Instagram Feed. * Tweak: Enhanced the secure custom login tool for the support team to troubleshoot certain API issues on your site. * Tweak: Improved and hardened our code base to improve reliability. * Fix: Updated settings info to display in the debug report. = 6.2.8 = * Fix: Menu items for our other plugins were not working when clicked. = 6.2.7 = * Tweak: Improved and hardened our code base to improve reliability. = 6.2.6 = * Fix: Resetting optimized images would also reset Instagram Feed settings. = 6.2.5 = * Fix: Fixed a problem with our code that would remove admin footer text from other sources. * Fix: Fixed an issue causing the minified CSS file to not actually be minified. = 6.2.4 = * Fix: Disabled translation for a string that would cause an error in some languages. = 6.2.3 = * Fix: Fixed translation bugs that would cause PHP errors on certain settings pages. * Fix: Fixed a PHP error that would occur when the database record for translations was corrupted. = 6.2.2 = * Translations: Fixed many translation issues and added translation files for German, French, Japanese, and many more. * Fix: Fixed an issue that would cause extra slashes to be added to text settings that contained single and double quotes. * Fix: Fixed an issue that would cause the customizer to not work the first time it was accessed. = 6.2.1 = * Fix: Fixed a deprecation warning that would occur in PHP 8.2+. * Fix: Fixed a PHP error that would occur when using PHP 8.0+, legacy feeds, and a shortcode with no arguments. = 6.2 = * New: Added an onboarding wizard for new users to easily get started with Instagram Feeds. = 6.1.6 = * Fix: Changed code related to account connection for increased reliability. * Fix: Only 20 feeds were available for export when using the tool on the settings page. * Fix: Fixed an issue causing a PHP error "creation of a dynamic property" when using PHP 8.2. = 6.1.5 = * Fix: Fixed personal accounts unable to retrieve new tweets and showing an error with the code 100. * Fix: Updated API calls for business accounts to work with upcoming changes from Instagram. = 6.1.4 = * Fix: Removed the option to add a feed to a widget if the current theme does not support widgets. * New: Added a menu item to easily install our new [Reviews Feed](https://wordpress.org/plugins/reviews-feed/) plugin! = 6.1.3 = * Fix: Fixed a PHP Warning: strtotime(): Epoch doesn’t fit in a PHP integer. * Fix: Header bio was not updating when the bio for the connected Instagram account was updated. * Fix: Fixed a few text items not being translatable. = 6.1.2 = * Fix: When enabling Facebook oEmbeds from the oEmbed page, an Instagram icon would appear when the Custom Facebook Feed plugin was being activated. * Fix: Fixed a CSS parsing error. = 6.1.1 = * Fix: When using the customizer to enable the setting for the header "show outside scrollable area" and adding a background color, the preview would not show the same result as the actual feed. * Fix: Disabling the JavaScript image loading on the "Advanced" settings tab would cause the customizer preview to look distorted. * Fix: When customizing a feed, the load more button would become active when switching the device preview. * Fix: Fixed a PHP warning that would occur when bulk deleting feeds. = 6.1 = * New: Added the ability to filter "Reels" posts in feeds. When customizing a feed and using the moderation settings you can now choose to show or hide Instagram "Reels" posts. * New: Add a header image and bio text for personal sources. Go to the settings page and click on the gear icon to add this to an existing source. * New: Added support for Instagram "Reels" oEmbeds. Use WordPress' embed block to create rich oEmbed links in blog posts and pages. * Tweak: Vue.js code is now loaded from a local file shipped with the plugin rather than an external CDN for use with the customizer in the admin area. = 6.0.8 = * Tweak: Added a workaround to retrieve missing images if none were returned by Instagram for a post. * Fix: Custom colors assigned to the Follow button would not apply when using a custom color palette. * Fix: Added additional plugin hardening. * Fix: A fatal error would occur with older versions of PHP and WordPress in some circumstances. = 6.0.7 = * Fix: Removed legacy "disable mobile" setting support as it was causing confusion for users updating from 2.x where changes to feed columns would not have an effect. * Fix: Removed the reference in the feed CSS file to an image file that didn't exist.in the feed CSS file. * Fix: All sources would be removed when the grace period to address app permission issues ended. Now only the single source will be removed. * Fix: The number of posts would be inaccurate in the feed preview when using the customizer for mobile devices. = 6.0.6 = * Tweak: Added a warning notice to allow a grace period before Instagram data is permanently deleted from your site after deauthorizing the Smash Balloon Instagram app. Due to Instagram requirements, any Instagram data on your site must be deleted within a reasonable time after the app has been deauthorized. The new warning notice provides a 7 day grace period to allow you time to reauthorize the app if you don't want the data to be deleted. * Tweak: Reconnecting an account now results in deleting the original connection in the database and adding a new one. This will prevent issues with some caching systems like Redis. * Fix: Only the first 20 sources were available when creating feeds and changing sources for a feed. * Fix: The link in some error messages were incorrect resulting in "access denied" error messages when clicking on them. = 6.0.5 = * Tweak: If WordPress cron is broken or behind schedule and causing background caching to not work, the plugin will update the feed when the page loads. * Fix: Jetpack's "Master Bar" feature was causing the sidebar in the customizer to be partially hidden. * Fix: Added back support for the "class" shortcode setting for all feeds. * Fix: Removed all Font Awesome icons and no longer include the CSS file from the Font Awesome CDN. = 6.0.4 = * Fix: Added back the ability to use up to 10 columns in feeds. * Fix: The reconnect link that would display when an account had an error would not redirect to connect.smashballoon.com. = 6.0.3 = * Tweak: Updated our logo throughout the plugin to match our new [website](https://smashballoon.com/). * Tweak: Changed how the hover color for follow and load more buttons is applied to prevent theme conflicts. * Fix: Fixed JavaScript file not being added to the page when using the plugin GDPR Cookie Consent by WebToffee. * Fix: Dismissing dashboard notifications would cause the "Add new feed" button to stop working until the page was refreshed. = 6.0.2 = * Fix: Fixed Instagram Feed JavaScript file missing from the page when using the "AJAX theme loading fix" setting causing blank images to display. * Fix: Added the ability to create the custom database tables if there was an error when first trying to create them. * Fix: Fixed the error message not displaying if there was an error when trying to connect a personal or basic account. = 6.0.1 = * Fix: Custom HTML templates were not applying to new feeds. * Fix: Some custom tables were not being created for specific versions of MySQL. * Fix: The shortcode setting "showfollow=false" was not working for legacy feeds. * Fix: The shortcode settings "showheader" and "showbio" were applying for non-legacy feeds causing confusion when trying to change these settings in the customizer. * Fix: The customizer would not resize images causing blank images to show when GDPR features were enabled. * Fix: Fixed PHP warning "Undefined array key tagged". = 6.0 = * Important: Minimum supported WordPress version has been raised from 3.5 to 4.1. * New: Our biggest update ever! We've completely redesigned the plugin settings from head to toe to make it easier to create, manage, and customize your Instagram feeds. * New: All your feeds are now displayed in one place on the "All Feeds" page. This shows a list of any existing (legacy) feeds and any new ones that you create. Note: If you updated from a version prior to v2.8 then you may need to view your feeds on your webpage so that the plugin can locate them and list them here. * New: Easily edit individual feed settings for new feeds instead of cumbersome shortcode options. * New: It's now much easier to create feeds. Just click "Add New", select your feed type, connect your account, and you're done! * New: Brand new feed customizer. We've completely redesigned feed customization from the ground up, reorganizing the settings to make them easier to find. * New: Live Feed Preview. You can now see changes you make to your feeds in real time, right in the settings page. Easily preview them on desktop, tablet, and mobile sizes. * New: Color Scheme option. It's now easier than ever to change colors across your feed without needing to adjust individual color settings. Just set a color scheme to effortlessly change colors across your entire feed. * New: You can now change the number of columns in your feed across desktop, tablet, and mobile. * New: Easily import and export feed settings to make it simple to move feeds across sites. == Privacy Policy == =**Data Collection**= Instagram Feed does not collect any personal data from your Meta accounts (Instagram, Facebook). All data retrieved from the Meta API is used solely for the purpose of displaying your feed on your WordPress site. =**External Connections**= This plugin connects to three external sites: * **Smashballoon.com**: Used for connecting and authenticating your sources. Occasionally, it sends dynamic notices to users. These notices can include information about major API changes, critical updates, and marketing messages. * **Instagram.com and Facebook.com**: Used to fetch posts so your visitors can view them directly on your site without needing to leave. =**Data Usage**= All data retrieved from the Meta API is used solely for displaying your Instagram feed on your WordPress site. No personal data is collected, stored, or shared beyond this purpose.PKL\(׏s s instagram-feed/widget.phpnu[ __( 'Display your Instagram feed', 'instagram-feed' ), ) ); } public function widget( $args, $instance ) { $title = isset( $instance['title'] ) ? apply_filters( 'widget_title', $instance['title'] ) : ''; $content = isset( $instance['content'] ) ? strip_tags( $instance['content'] ) : '[instagram-feed]'; echo $args['before_widget']; if ( ! empty( $title ) ) { echo $args['before_title'] . esc_html( $title ) . $args['after_title']; } echo do_shortcode( $content ); echo $args['after_widget']; } public function form( $instance ) { $title = isset( $instance['title'] ) ? $instance['title'] : ''; $content = isset ( $instance['content'] ) ? strip_tags( $instance['content'] ) : '[instagram-feed]'; ?>

>](https://www.embedplus.com/embed-youtube-video-gallery-livestream-wordpress-gutenberg-block-editor.aspx) The plugin is also compatible with several popular page builders like [Elementor](https://www.youtube.com/watch?v=ldNfIGRTxDU), [Beaver Builder](https://www.youtube.com/watch?v=bPgz0jyt7TE), [SiteOrigin](https://www.youtube.com/watch?v=7QNYw_g-7WM), and [Visual Composer](https://www.youtube.com/watch?v=FWBQc9XhAqM). For these and pretty much any other page builder with a short code widget, you can also embed your video, gallery, live stream, or premiere by creating the short code in the plugin's wizard and then embedding the code in the page builder's short code widget or text widget. * Privacy and Consent - Improved privacy and GDPR compliance options like YouTube no cookie, YouTube API restrictions, and a customizable GDPR consent message. Note: if you have a full-blown consent plugin installed on your WordPress site, you may not need these particular features of this YouTube plugin. * YouTube gallery capability: channel and playlist – The ability to make playlist and channel embeds have a gallery layout. By default, the plugin can generate a grid-based [responsive playlist or channel gallery >>](https://www.embedplus.com/responsive-youtube-playlist-channel-gallery-for-wordpress.aspx). Your visitors can browse through pages of video thumbnails and choose from videos that are pulled from an entire YouTube channel or playlist. * YouTube gallery auto continuous play - embed a playlist or channel gallery and allow it to play one video after the next without requiring viewers to click a thumbnail. * YouTube Premieres - The plugin provides you the same embedding methods for YouTube live streams as it does for premiere embeds. * Simultaneous playback control - you can enable/disable the ability for visitors to have separate videos running at the same time on the same page. This also works with YouTube livestream and gallery embeds that are embedded by our YouTube plugin. * Improved accessibility by using title attributes for screen reader support. Hopefully this plugin can help your site pass functional accessibility evaluations (FAE). * Improved AJAX WordPress theme support. * Site origin information with each embed code as an extra security measure. In YouTube's/Google's own words, checking this option "protects against malicious third-party JavaScript being injected into your page and hijacking control of your YouTube player." We especially recommend checking it as it adds higher security than the built-in YouTube embedding method that comes with the current version of WordPress (i.e. oembed). * Easy "Insert" button for both the Visual and Text mode of the editor (for YouTube gallery and live stream embedding as well). * Embed an entire YouTube channel as a (non-gallery, single embedded player) playlist. * Start video settings for playlist embeds. You can now choose to start a playlist with a specific video or have the plugin automatically start with the most recently added video. **Note: If you're embedding a YouTube gallery, the order will be defined by the order of the channel or playlist on YouTube.com**. * [Volume level initialization](https://www.embedplus.com/mute-volume-youtube-wordpress.aspx) - helpful when autoplay is checked. Applies to all videos embedded with this YouTube plugin. * iOS playback preferences. * Automatic localization/internationalization so you can set the player's interface language from English to another. * Instant HTTPS support. It can even convert past non-HTTPS videos to HTTPS. Did you know that Google uses HTTPS/SSL support as a ranking signal for SERP? * "At a Glance" direct access to your YouTube posts/pages. * Shortcode support for embedding multiple videos on one line. * General playlist embedding support. * YouTube WordPress plugin migration support (allows you convert other YouTube plugin embeds to ours). **Click the Download button to start exploring this YouTube WordPress plugin**, or take a look at some more introductory details below. This plugin helps you easily manage the growing complexity of YouTube embedding. It provides a spectrum of basic and advanced features of the YouTube embedded player and will have you posting videos in seconds after installing it. The settings page has plenty of default options that you can automatically apply to your embedded YouTube video, gallery, and/or live stream: * Modest branding - hide YouTube logo while playing (note that the YouTube watermark is shown instead) * Turn on/off all annotations by default * Automatically center all your videos * Automatically start playing your videos * Autohide controls until hovering * Loop your videos * Show/hide related videos at the end * Show/hide the video title and other info (YouTube/Google has deprecated this feature) * Use the light theme * Show/hide player controls * Turn on/off closed captions by default * Make your video, gallery, or live stream responsive so that it dynamically fits in all screen sizes (smart phone, PC and tablet) Customizations can be also made to each YouTube embed by adding more to the link as shown below. Adding these will override the above global defaults that you set: * width - Sets the width of your player. If omitted, the default width will be the width of your theme's content. Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&width=500&height=350"` * height - Sets the height of your player. If omitted, this will be calculated for you automatically. Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&width=500&height=350"` * autoplay - Set this to 1 to autoplay the video (or 0 to play the video once). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&autoplay=1"` * cc_load_policy - Set this to 1 to turn on closed captioning (or 0 to leave them off). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&cc_load_policy=1"` * iv_load_policy - Set this to 3 to turn off annotations (or 1 to show them). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&iv_load_policy=3"` * loop - Set this to 1 to loop the video (or 0 to not loop). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&loop=1"` * modestbranding - Set this to 1 to remove the YouTube logo while playing (or 0 to show the logo). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&modestbranding=1"` * rel - Set this to 0 to only show related videos from the same channel as the current video (or 1 to show videos from any channel). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&rel=0"` * showinfo - Set this to 0 to hide the video title and other info (or 1 to show it). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&showinfo=0"` (YouTube/Google has deprecated this feature) * fs - Set this to 0 to hide the fullscreen button (or 1 to show it). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&fs=0"` You can also start and end each individual video at particular times. Like the above, each option should begin with '&' * start - Sets the time (in seconds) to start the video. Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&width=500&height=350&start=20"` * end - Sets the time (in seconds) to stop the video. Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&width=500&height=350&end=100"` > **About the Pro version of the [YouTube WordPress Plugin](https://www.embedplus.com/dashboard/pro-easy-video-analytics.aspx?ref=readme)** > > If you like this free version, you may even upgrade to a separate Pro plugin with features like: > > * Full visual embedding wizard > * [Alternate playlist and channel gallery styling >>](https://www.embedplus.com/responsive-youtube-playlist-channel-gallery-for-wordpress.aspx) (list layouts and slider layouts, popup/lightbox player, thumbnail hiding for text only paging, and more) > * Caching to avoid making frequent requests to YouTube.com and speed up your page loads > * Automatic video thumbnail images: each post or page that contains at least one video will have the thumbnail of its first video serve as its featured image > * [Lazy load YouTube embeds >>](https://www.embedplus.com/defer-parsing-of-javascript-improve-gtmetrix-speed-of-page-with-youtube-embed.aspx) with eye-catching [effects and animations](https://www.embedplus.com/add-special-effects-to-youtube-embeds-in-wordpress.aspx) > * [YouTube live chat >>](https://www.embedplus.com/embed-youtube-live-chat-box-with-live-stream-embed-wordpress.aspx) Add more interaction to your site by including the YouTube live chat box as part of each live stream embed. Note that live chat can also be an option for earning money from your audience by using the Super Chat and Super Stickers feature. > * Automatic tagging for video SEO > * Automatic Open Graph tagging for Facebook > * Deleted video alerts (i.e., did Google remove or take down videos I previously embedded?) > * Mobile compatibility checking (i.e., see if your embeds have restrictions that can block your site's mobile visitors from viewing) > * Alerts when visitors from different countries are blocked from viewing your embeds > * Priority support > > You also get access to our deleted video alerts to help avoid showing embedded videos that are later removed from YouTube.com. You even get an embedder-centric [analytics dashboard](https://www.embedplus.com/dashboard/easy-youtube-analytics-preview.aspx?platform=sim) that adds view tracking to each of your embeds so that you can answers questions like: > > * How much are your visitors actually watching the videos you post? > * How does the view activity on your site compare to other sites like it? > * What and when are your best and worst performing YouTube embeds? > * How much do the producers of the YouTube videos you embed rely on **your site**, versus other sites and YouTube.com, for views? > * Are you embedding videos that are blocked in other countries? > * Have your visitors tried to view a page and/or gallery on your site with deleted/unavailable videos? See more details after installing. Enjoy! [This WordPress plugin is maintained by Embed Plus for YouTube >>](https://www.embedplus.com/) == Installation == 1. Use the WordPress plugin installer to install the plugin. Alternatively, you can just extract the folder in our download package and upload it to your plugin directory. 1. Access the Plugins admin menu to activate the YouTube embed plugin. 1. Make your default settings after clicking the new YouTube menu item that shows up in your admin panel. This is where you can make global settings on the appearance of each video and gallery, as well as activate: defer JavaScript (defer CSS coming soon), GDPR mode, user restrictions, and more. 1. To embed videos in your post, use the wizard to embed the shortcode. Example: `[embedyt]https://www.youtube.com/watch?v=ABCDEFGHIJK&width=400&height=250[/embedyt]` If you don't know exactly which video you want to embed, use the free built-in search feature to find and insert one. 1. You can also [embed a playlist and channel gallery with this plugin >>](https://www.embedplus.com/responsive-youtube-playlist-channel-gallery-for-wordpress.aspx). Please install the plugin and visit the settings page for instructions. 1. To get video SEO, an analytics dashboard and many other premium features, [sign up for one of the options here >>](https://www.embedplus.com/dashboard/pro-easy-video-analytics.aspx?ref=readme) **Manual codes (adding these will override the default settings in the admin):** * width - Sets the width of your player. If omitted, the default width will be the width of your theme's content. Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&width=500&height=350"` * height - Sets the height of your player. If omitted, this will be calculated for you automatically. Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&width=500&height=350"` * autoplay - Set this to 1 to autoplay the video (or 0 to play the video once). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&autoplay=1"` * cc_load_policy - Set this to 1 to turn on closed captioning (or 0 to leave them off). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&cc_load_policy=1"` * iv_load_policy - Set this to 3 to turn off annotations (or 1 to show them). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&iv_load_policy=3"` * loop - Set this to 1 to loop the video (or 0 to not loop). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&loop=1"` * modestbranding - Set this to 1 to remove the YouTube logo while playing (or 0 to show the logo). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&modestbranding=1"` * rel - Set this to 0 to only show related videos from the same channel as the current video (or 1 to show videos from any channel). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&rel=0"` * showinfo - Set this to 0 to hide the video title and other info (or 1 to show it). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&showinfo=0"` (YouTube/Google has deprecated this feature) * fs - Set this to 0 to hide the fullscreen button (or 1 to show it). Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&fs=0"` You can also start and end each individual video at particular times. Like the above, each option should begin with '&' * start - Sets the time (in seconds) to start the video. Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&width=500&height=350&start=20"` * end - Sets the time (in seconds) to stop the video. Example: `"https://www.youtube.com/watch?v=quwebVjAEJA&width=500&height=350&end=100"` **We recommend using the wizard, but if you're manually pasting a link, always follow these rules:** * Make sure the url is really on its own line by itself. Or, if you need multiple videos on the same line, make sure each URL is wrapped properly with the shortcode. Example: `[embedyt]https://www.youtube.com/watch?v=ABCDEFGHIJK&width=400&height=250[/embedyt]` * Make sure the url is not an active hyperlink (i.e., it should just be plain text). Otherwise, highlight the url and click the "unlink" button in your editor. * Make sure you did **not** format or align the url in any way. If your url still appears in your actual post instead of a video, highlight it and click the "remove formatting" button (formatting can be invisible sometimes). * Finally, there's a slight chance your custom theme is the issue, if you have one. To know for sure, we suggest temporarily switching to one of the default WordPress themes (e.g., "Twenty Thirteen") just to see if your video does appear. If it suddenly works, then your custom theme is the issue. You can switch back when done testing. == Frequently Asked Questions == = How do I add this YouTube plugin to WordPress? = Watch the following YouTube video which shows the process for our specific plugin: https://www.youtube.com/watch?v=9RveWWsrmuw = How do I embed a YouTube video with a facade? = See a demo on this [YouTube WordPress Test Page](https://youtube-wordpress-plugin.embedplus.com/youtube-embed-with-facade/) = How do I create a YouTube gallery in WordPress? = Here's a video that shows the steps with our YouTube plugin, along with the full set of gallery features: https://www.youtube.com/watch?v=iMX5TMobCw4 = Why use a YouTube plugin? = You can certainly embed YouTube videos in WordPress with oembed using the default embedder. However, a good YouTube WordPress plugin helps you easily embed and customize a video, playlist, channel, gallery, premiere, live stream, and facade. The premium version of this plugin has additional features like embed playback analytics. = How to get a YouTube API key? = To embed a gallery, livestream, schema tags, and more, you'll need to get a YouTube API key from Google. The Data API is free and comes with a decent quota, which can be extended. See here for [steps on creating a YouTube API key](https://www.embedplus.com/how-to-create-a-youtube-api-key.aspx). You can also learn plenty of other tips on the [EmbedPlus How To Page](https://www.embedplus.com/youtube-plugin-documentation.aspx). = How do I embed a YouTube livestream on WordPress? = Assuming you already have the EmbedPlus plugin active, you can embed a YouTube stream (premiere or livestream) in a very similar manner. * [Steps for a premiere](https://www.youtube.com/watch?v=PqroYZ1qVtY} * [Steps for a standard live stream](https://www.youtube.com/watch?v=PQ5mY2WaqcI&t=218s) == Screenshots == 1. Embed Plus for YouTube WordPress Plugin Screenshot 1: Paste a YouTube link on its own line and it will become a YouTube embed on your website. Or, use the shortcode method. 2. Embed Plus for YouTube WordPress Plugin Screenshot 2: How to get to YouTube's admin settings 3. Embed Plus for YouTube WordPress Plugin Screenshot 3: Visual YouTube Wizard and Search Tool 4. Embed Plus for YouTube WordPress Plugin Screenshot 4: Wizard Insert Search Result Screenshot 5. Embed Plus for YouTube WordPress Plugin Screenshot 5: Wizard Search Results Screenshot 6. Embed Plus for YouTube WordPress Plugin Screenshot 6: Gallery layout for a playlist or channel 7. Embed Plus for YouTube WordPress Plugin Screenshot 7: YouTube playlist galleries are also easily supported. Here's the Billboard Top 25 Songs for example. 8. Embed Plus for YouTube WordPress Plugin Screenshot 8: Localization/internationalization so you can set the player's interface language 9. Embed Plus for YouTube WordPress Plugin Screenshot 9: Optional YouTube channel subscription button above gallery thumbnails == Changelog == = Embed Plus for YouTube WordPress Plugin 14.2.1.2 = * This update addresses issues with the [channel-based automatic live stream detection/loading feature](https://www.embedplus.com/how-to-embed-a-youtube-livestream-in-wordpress.aspx) for the [Pro version](https://www.embedplus.com/dashboard/pro-easy-video-analytics.aspx), and provides better compatibility with PHP 8.3+ for both Free and Pro versions. = Embed Plus for YouTube WordPress Plugin 14.2.1 = * This update fixes issues with the [channel-based automatic live stream detection/loading feature](https://www.embedplus.com/how-to-embed-a-youtube-livestream-in-wordpress.aspx) for the [Pro version](https://www.embedplus.com/dashboard/pro-easy-video-analytics.aspx), and better responsive sizing HTML validation for both Free and Pro versions. = Embed Plus for YouTube WordPress Plugin 14.2 = * This update gives guidance to YouTube's recent API limitations on the [channel-based automatic live stream detection/loading feature](https://www.embedplus.com/how-to-embed-a-youtube-livestream-in-wordpress.aspx), with a solution available to [Pro users](https://www.embedplus.com/dashboard/pro-easy-video-analytics.aspx) = Embed Plus for YouTube WordPress Plugin 14.1.6.3 = * Fixes a compatibility issue with Contact Forms 7 = Embed Plus for YouTube WordPress Plugin 14.1.6.2 = * Updated API key instructions = Embed Plus for YouTube WordPress Plugin 14.1.6.1 = * Fixes a YouTube API referer issue that occurs on some hosts = Embed Plus for YouTube WordPress Plugin 14.1.6 = * Tested for compatibility with WordPress 6.2+ = Embed Plus for YouTube WordPress Plugin 14.1.5 = * Ability to turn on/off maxresdefault image quality * Prevent iframes from affecting main frame browser history * Better calls to htmlspecialchars function * Wizard window size fix * Fix livestream fallback issue = Embed Plus for YouTube WordPress Plugin 14.1.4.1 = * Better compatibility with older browsers = Embed Plus for YouTube WordPress Plugin 14.1.4 = * Fixes issues from 14.1.3 * Higher quality facade images * Better compatibility with Jetpack and Short Pixel lazy loaded images * Fixes an issue with the Classic/TinyMCE editor = Embed Plus for YouTube WordPress Plugin 14.1.3 = * Better compatibility with Jetpack images * Avoids unused javascript when not using responsive sizing * Fixes obscure livestream fallback issue = Embed Plus for YouTube WordPress Plugin 14.1.2 = * Higher quality facade images * Avoid unused javascript with facade mode = Embed Plus for YouTube WordPress Plugin 14.1.1 = * Better compatability with WordPress 6.0 * Easier channel live stream wizard * Cleaner uninstalls * Add intro helper video = Embed Plus for YouTube WordPress Plugin 14.1 = * Adds the live stream fallback feature to channel-based live stream embeds = Embed Plus for YouTube WordPress Plugin 14.0.1.4 = * YouTube Wizard compatibility for WordPress 5.9+ = Embed Plus for YouTube WordPress Plugin 14.0.1.3 = * Patch for 14.0.1.2, JS fix for compatibility with jQuery 3.0+ = Embed Plus for YouTube WordPress Plugin 14.0.1.2 = * Fix facade playlist embed issue * Improve compatibility with AJAX themes = Embed Plus for YouTube WordPress Plugin 14.0.1.1 = * Patch for 14.0.1, higher resolution for facade images = Embed Plus for YouTube WordPress Plugin 14.0.1 = * Higher resolution for facade images * Fix CSS issue with GDPR embeds * YouTube shorts support = Embed Plus for YouTube WordPress Plugin 14.0 = * New facade mode for lighter and faster page loads (see Performance tab) * CSS fixes = Embed Plus for YouTube WordPress Plugin 13.4.3 = * Automatically turn on default dimensions for new installations, to skip oEmbed width/height lookups. Improves performance (recommended for all users, given most YouTube videos are 16:9 ratio) * Better compatibility with cookie compliance plugins that overtake the player with a placeholder = Embed Plus for YouTube WordPress Plugin 13.4.2 = * Compatible with latest jQuery updates * Compatible with WordPress 5.7+ = Embed Plus for YouTube WordPress Plugin 13.4.1.2 = * Allows you to specify the default language (when available) that the player will use to display closed captions = Embed Plus for YouTube WordPress Plugin 13.4.1.1 = * Prevent deprecated notice for wp_make_content_images_responsive filter = Embed Plus for YouTube WordPress Plugin 13.4.1 = * Better compatibility with WordPress 5.5 = Embed Plus for YouTube WordPress Plugin 13.4 = * Better compatibility with themes that use the Gutenberg block editor and responsive sizing * Fix notice on new installs * Add pagebuilder tips to Wizard tab of the documentation = Embed Plus for YouTube WordPress Plugin 13.3.1 = * Fix simultaneous playback control issue * Add support for premiere video embedding = Embed Plus for YouTube WordPress Plugin 13.2.3 = * Defer JavaScript for performance * Compatibility between loop and hide relative videos features * Simultaneous playback control = Embed Plus for YouTube WordPress Plugin 13.2.1 = * Provides more compatibility with other lazyload plugins and responsive themes = Embed Plus for YouTube WordPress Plugin 13.2.0.2 = * Fixes the "Hide related videos at the end of playback" feature (fixes issue with galleries) = Embed Plus for YouTube WordPress Plugin 13.2.0.1 = * Compatibility with legacy versions of PHP * Fix Responsive sizing issue with lazyloading plugins = Embed Plus for YouTube WordPress Plugin 13.2 = * Add ability to embed a live stream from a given channel * Reduction in live stream YouTube API quota usage * Compatibility with other plugins having tabbed sections (e.g. Yuzo) * Show YouTube API errors to admins only = Embed Plus for YouTube WordPress Plugin 13.1.2.5 = * Improve responsive sizing aspect ratio in widgets * Fix issue: some users receive 403 error when saving = Embed Plus for YouTube WordPress Plugin 13.1.2.4 = * Pagination and autonext allow the current video to play * Pagination on mobile fix * vi deprecation announcement = Embed Plus for YouTube WordPress Plugin 13.1.2.3 = * gallery thumbnail mobile tap/scroll fix = Embed Plus for YouTube WordPress Plugin 13.1.2.2 = * Wizard open/close fix * iOS gallery thumbnail click fix * class-oembed deprecation fix = Embed Plus for YouTube WordPress Plugin 13.1.2.1 = * Compatibility with legacy versions of PHP = Embed Plus for YouTube WordPress Plugin 13.1.2 = * More descriptive plugin name * Gallery column size and YouTube API message fixes = Embed Plus for YouTube WordPress Plugin 13.1.1 = * Fixes gallery autonext issue * Fixes deprecated controls parameter * Fixes "not live" content issue * Remove deprecated showinfo parameter = Embed Plus for YouTube WordPress Plugin 13.1 = * Brings back the ability to hide related/suggested videos at end of playback * Allows monetized sites to select multiple IAB categories * Option to run shortcode in admin (compatibility tab) * Lowers quota usage for live videos * Fixes "missing dependencies" block editor CSS reference * Fixes default dimensions issue = Embed Plus for YouTube WordPress Plugin 13.0.1 = * Clearer instructions * Feature deprecation (rel, showinfo) = Embed Plus for YouTube WordPress Plugin 13.0 = * Compatible with the new Gutenberg block editor, and stays backwards-compatible with the classic editor * Marked deprecated features * Improved wizard instructions = Embed Plus for YouTube WordPress Plugin 12.2 = * Improved ads.txt verification management * Fixed gallery box-sizing bug * Remove some deprecated YouTube parameters = Embed Plus for YouTube WordPress Plugin 12.1 = * Improved autoplay compatibility * Improved sign-up process for the new monetization feature = Embed Plus for YouTube WordPress Plugin 12.0.1 = * Force HTTPS for the YouTube API if the API is enabled * Makes the wizard's lightbox expand/contract responsively for different size screens = Embed Plus for YouTube WordPress Plugin 12.0 = * Improves the admin interface, and includes a new optional feature for users that want to monetize their sites through contextual video from vi.ai. = Embed Plus for YouTube WordPress Plugin 11.9.2 = * Makes the GDPR consent message display more compatible with other plugins (fixes content filter) = Embed Plus for YouTube WordPress Plugin 11.9.1 = Improved GDPR compliance, with new Privacy section containing: * GDPR consent mode * YouTube no cookie * YouTube API loading restrictions = Embed Plus for YouTube WordPress Plugin 11.8.7 = * Helps with GDPR compliance by allowing you to choose when YouTube.com's API is loaded = Embed Plus for YouTube WordPress Plugin 11.8.6.1 = * Rollback jQuery Updater plugin compatibility = Embed Plus for YouTube WordPress Plugin 11.8.6 = * Updated YouTube API key video tutorial * Improved channel wizard process * Better compatibility with jQuery Updater plugin = Embed Plus for YouTube WordPress Plugin 11.8.5 = * Adds the YouTube wizard button to the new built-in WordPress text widget * Fixes a Mac/iOS gallery scrolling issue = Embed Plus for YouTube WordPress Plugin 11.8.4 = * Fixes gallery AJAX issue * Adds ability to hide fullscreen button * Adds ability to hide private videos from galleries * Changes localized script dependency to jquery = Embed Plus for YouTube WordPress Plugin 11.8.3 = * Improved compatibility with PHP 7 * Improved compatibility with Divi theme * Improved AJAX compatibility * Improved accessibility * Fix gallery scrolling * Fix "not live" content output * Modernize and improve wizard interface (Pro) * Ability to hide thumbnail images from galleries (Pro) = Embed Plus for YouTube WordPress Plugin 11.8.2 = * Fix auto-next gallery issue * Make settings form more secure = Embed Plus for YouTube WordPress Plugin 11.8.1 = * Fix playlist gallery issue = Embed Plus for YouTube WordPress Plugin 11.8 = * Improved AJAX theme compatibility * Ability to choose which roles can use the editor wizard * Volume + autoplay fix = Embed Plus for YouTube WordPress Plugin 11.7.1 = * Remove gallery thumbnail translucency * Various bug fixes for galleries and the wizard = Embed Plus for YouTube WordPress Plugin 11.7 = * Separate Free and Pro codebases * Remove deprecated features * Clean up code = Embed Plus for YouTube WordPress Plugin 11.6 = * Fixed issue where Free version had some remnants of Pro analytics codebase supporting features here: https://www.embedplus.com/dashboard/easy-youtube-analytics-preview.aspx?platform=sim * New feature: live streaming from a channel * Optimized player and gallery loading that may improve Lighthouse reports * Improved compatibility with pagebuilders * Improved compatibility with later versions of jQuery * Removed frameborder for W3C validation * Gallery pagination enhancement * PHP 7 compatibility testing = Embed Plus for YouTube WordPress Plugin 11.5 = * thumbnail stacking for mobile galleries * better support for ajax themes * alt text to images = Embed Plus for YouTube WordPress Plugin 11.4 = * (Free) Improved subscribe button CSS and a new migration option. * (Pro) Improved accessibility for popup lightbox galleries. = Embed Plus for YouTube WordPress Plugin 11.3.1 = * (Free) improved debug mode messages * (Pro) autonext for popup lightbox galleries and hide clear cache button option = Embed Plus for YouTube WordPress Plugin 11.3 = * Improved responsive sizing for AJAX-based themes * Popup lightbox display option for Pro galleries = Embed Plus for YouTube WordPress Plugin 11.2 = * Adds improved wizard and gallery options for Free and Pro users. * Improved handling of PHP notices. * Clear cache shortcut added for Pro users. = Embed Plus for YouTube WordPress Plugin 11.1 = * Automatic continuous play for playlist and channel gallery embeds. * Ability to add a YouTube channel subscription link to all galleries. * Ability to hide Previous/Next buttons and page numbers. * Featured images can now be pulled from playlists (using the thumbnail of the first video). = Embed Plus for YouTube WordPress Plugin 11.0.1 = Improves HTTPS support for structured data tags, and HTTPS support in Firefox. = Embed Plus for YouTube WordPress Plugin 11.0 = Improves playlist and gallery embedding functionality. = Embed Plus for YouTube WordPress Plugin 10.9 = This version offers a host of updates: compatibility fixes, higher quality featured images, selective responsive sizing, wizard enhancements, and circular shaped thumbnails. = Embed Plus for YouTube WordPress Plugin 10.8 = This update improves compatibility and adds features to Free and Pro galleries. = Embed Plus for YouTube WordPress Plugin 10.7 = Adds legacy option. = Embed Plus for YouTube WordPress Plugin 10.6 = Enhanced debugging support for galleries. = Embed Plus for YouTube WordPress Plugin 10.5 = Enhanced gallery settings for scrolling, video titles, and thumbnail styling. = Embed Plus for YouTube WordPress Plugin 10.4 = Addresses limitations some users were getting when pasting a YouTube channel and/or playlist gallery. = Embed Plus for YouTube WordPress Plugin 10.3 = Adds the ability to make playlist and channel embeds have a gallery layout. By the default, the plugin can generate a grid-based [responsive playlist and channel gallery >>](https://www.embedplus.com/responsive-youtube-playlist-channel-gallery-for-wordpress.aspx) = Embed Plus for YouTube WordPress Plugin 10.2 = Adds start video settings for playlist embeds. You can now choose to start a playlist with a specific video or have the plugin automatically start with the most recently added video. = Embed Plus for YouTube WordPress Plugin 10.1 = Adds the ability to automatically migrate from another plugin's shortcode. Caching feature now allows lifetime settings. Improved compatibility with other plugins using the YouTube API. = Embed Plus for YouTube WordPress Plugin 10.0 = This update includes improved tips (Free and Pro) and adds caching to the Pro version for faster page loading. = Embed Plus for YouTube WordPress Plugin 9.8 = Upgraded code to use YouTube API v3. = Embed Plus for YouTube WordPress Plugin 9.7 = Adds improved accessibility for screen readers and video thumbnail as featured image support. = Embed Plus for YouTube WordPress Plugin 9.5 = Site origin information with each embed code as an extra security measure. In YouTube's/Google's own words, checking this option "protects against malicious third-party JavaScript being injected into your page and hijacking control of your YouTube player." We especially recommend checking it as it adds higher security than the built-in YouTube embedding method that comes with the current version of WordPress (i.e. oembed). = Embed Plus for YouTube WordPress Plugin 9.4 = Adds Autofit Widget option for Free and PRO users. Also adds slide from left animation to [PRO effects >>](https://www.embedplus.com/add-special-effects-to-youtube-embeds-in-wordpress.aspx) = Embed Plus for YouTube WordPress Plugin 9.3 = Improved volume functionality and interface updates (Free and PRO). [Special effects added to PRO version >>](https://www.embedplus.com/add-special-effects-to-youtube-embeds-in-wordpress.aspx) = Embed Plus for YouTube WordPress Plugin 9.2 = HTTPS/SSL detection is now fully automatic. The manual checkbox is no longer needed. = Embed Plus for YouTube WordPress Plugin 9.1 = With this version, the plugin can now automatically detect your site's default language and set the interface of the embedded YouTube player to match. = Embed Plus for YouTube WordPress Plugin 9.0 = Adds automatic localization/internationalization so you can set the player's interface language from English to another. = Embed Plus for YouTube WordPress Plugin 8.9 = Allows volume level initialization. = Embed Plus for YouTube WordPress Plugin 8.8 = * Better embedplus plugin conflict notifications. * Greater emphasis on HTTPS support due to Google's recent announcement about [HTTPS/SSL as an SEO/SERP signal](https://embedplus.com/convert-old-youtube-embeds-to-https-ssl.aspx). * Supports latest version of WordPress (3.9.2). = Embed Plus for YouTube WordPress Plugin 8.7 = (PRO) Extends the plugin's existing tagging capabilities by also adding Open Graph markup to enhance Facebook sharing/discovery of your pages. = Embed Plus for YouTube WordPress Plugin 8.6 = Expanded HTTPS/SSL support. = Embed Plus for YouTube WordPress Plugin 8.5 = This update features a new iOS related option for both Free and PRO users. PRO users additionally have the new mobile compatibility checker. = Embed Plus for YouTube WordPress Plugin 8.4 = This update features improved responsive theme support for both Free and PRO versions. It also adds refined schema tag support to the Pro SEO feature. = Embed Plus for YouTube WordPress Plugin 8.3 = Now compatible with WordPress 3.9. = Embed Plus for YouTube WordPress Plugin 8.2 = An at a glance regex improvement (all users). Dashboard now warns you of embeds that are blocked from your visitors in other countries (PRO). = Embed Plus for YouTube WordPress Plugin 8.1 = Fixes rare YouTube ID issue. = Embed Plus for YouTube WordPress Plugin 8.0 = Fixes rare ajax issue. = Embed Plus for YouTube WordPress Plugin 7.9 = YouTube searching and inserting now works in Text mode of the editor too. = Embed Plus for YouTube WordPress Plugin 7.8 = "At a Glance" direct access to YouTube posts/pages. = Embed Plus for YouTube WordPress Plugin 7.7 = Fixes black bar issue when no height/width is specified. = Embed Plus for YouTube WordPress Plugin 7.6 = Added notice about Google's HD problem. = Embed Plus for YouTube WordPress Plugin 7.5 = Ability to embed an entire channel as a playlist embed. = Embed Plus for YouTube WordPress Plugin 7.3 = Change the color of the progress bar from red to white. = Embed Plus for YouTube WordPress Plugin 7.2 = Added music video extras to inspire your posts (PRO). = Embed Plus for YouTube WordPress Plugin 7.1 = Added autohide controls feature = Embed Plus for YouTube WordPress Plugin 7.0 = Shortcode support for embedding multiple videos on one line = Embed Plus for YouTube WordPress Plugin 6.4 = Fixes for some users of WordPress 3.8 = Embed Plus for YouTube WordPress Plugin 6.3 = Removed possible e_notices. = Embed Plus for YouTube WordPress Plugin 6.2 = Given the increasing focus on privacy, the no-cookies options was added as a free option to all users. Priority support enhancements also made. = Embed Plus for YouTube WordPress Plugin 6.1 = Easier access to general settings and dashboard. = Embed Plus for YouTube WordPress Plugin 6.0 = This version opens up the ability to view Internet video discussions to all wizard users. **Also, due to numerous users being unable to find the wizard button, we moved it up next to the "Add Media" button.** Finally, we added Video SEO tags as a PRO option. = Embed Plus for YouTube WordPress Plugin 5.1 = Added ability to set default dimensions. Enhanced compatibility with SSL sites. = Embed Plus for YouTube WordPress Plugin 5.0 = Built-in YouTube video search, viewing, and insertion right from your editor tab (for all users). The ability to review the latest web discussions about a video you want to embed before embedding it (PRO users). Other minor optimizations. = Embed Plus for YouTube WordPress Plugin 4.8 = Works when pasting embed link in sidebar text widgets = Embed Plus for YouTube WordPress Plugin 4.7 = Improved separation of PRO and Free features in the UI = Embed Plus for YouTube WordPress Plugin 4.6 = Added optional responsive video layout to fit all screen sizes. (smart phone, PC and tablet) = Embed Plus for YouTube WordPress Plugin 4.5 = Added support for playlists. added support for wmode. = Embed Plus for YouTube WordPress Plugin 4.1 = Fixed spacing issue. Also added ability to fall back to old spacing format. = Embed Plus for YouTube WordPress Plugin 4.0 = New features for all users: lazy loading for the flash player by default and the ability to hide player controls for a cleaner look. = Embed Plus for YouTube WordPress Plugin 3.7 = Enhanced deleted video checker for PRO users = Embed Plus for YouTube WordPress Plugin 3.5 = Added ability to try to force HTML5 player to speed up page loading = Embed Plus for YouTube WordPress Plugin 3.3 = HTTPS: Added secure YouTube embedding = Embed Plus for YouTube WordPress Plugin 3.2 = Ensures video-specific height overrides defaults properly = Embed Plus for YouTube WordPress Plugin 3.1 = Fixed obscure height problem = Embed Plus for YouTube WordPress Plugin 3.0 = Added Visual YouTube Wizard for PRO users Added autologin to analytics for PRO users Added priority support form for PRO users = Embed Plus for YouTube WordPress Plugin 2.6 = Compatible with WP 3.6 = Embed Plus for YouTube WordPress Plugin 2.4 = Added auto HD support Support for shorthand (i.e. `"https://www.youtu.be"`) Fixed editor issue = Embed Plus for YouTube WordPress Plugin 2.3 = Start/end time shortcut bug fix = Embed Plus for YouTube WordPress Plugin 2.2 = Minor changes = Embed Plus for YouTube WordPress Plugin 2.1 = By request from several users, we've added easier access to the video analytics dashboard = Embed Plus for YouTube WordPress Plugin 2.0 = This upgrade specifically integrates a user-friendly YouTube Analytics Dashboard to this plugin so you can learn a lot more about the videos you post. Download it if you would like it to use your site's YouTube-related activity to help answer questions like: * How much are your visitors actually watching the videos you post? * How does the view activity on your site compare to other sites like it? * What and when are your best and worst performers? * How much do the producers of the YouTube videos you embed rely on **your site** for views? We think these are all interesting questions; however, note that there's no need to upgrade if you don't. = Embed Plus for YouTube WordPress Plugin 1.1 = Fixed minor bug. = Embed Plus for YouTube WordPress Plugin 1.0 = First release uploaded to the plugin repository. == Other Notes == This YouTube plugin can include premium features like lazy load (with animation), alternate playlist and channel gallery styles, automatic video thumbnail support, automatic schema tagging for video SEO, mobile compatibility checking, and deleted video alerts when you [upgrade to PRO](https://www.embedplus.com/dashboard/pro-easy-video-analytics.aspx?ref=readme). PKL\h3youtube-embed-plus/index.htmlnu[ PKL\PM]1 1 +youtube-embed-plus/scripts/jquery.cookie.jsnu[/*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Copyright 2013 Klaus Hartl * Released under the MIT license */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD define(['jquery'], factory); } else if (typeof exports === 'object') { // CommonJS factory(require('jquery')); } else { // Browser globals factory(jQuery); } }(function ($) { var pluses = /\+/g; function encode(s) { return config.raw ? s : encodeURIComponent(s); } function decode(s) { return config.raw ? s : decodeURIComponent(s); } function stringifyCookieValue(value) { return encode(config.json ? JSON.stringify(value) : String(value)); } function parseCookieValue(s) { if (s.indexOf('"') === 0) { // This is a quoted cookie as according to RFC2068, unescape... s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); } try { // Replace server-side written pluses with spaces. // If we can't decode the cookie, ignore it, it's unusable. // If we can't parse the cookie, ignore it, it's unusable. s = decodeURIComponent(s.replace(pluses, ' ')); return config.json ? JSON.parse(s) : s; } catch(e) {} } function read(s, converter) { var value = config.raw ? s : parseCookieValue(s); return $.isFunction(converter) ? converter(value) : value; } var config = $.cookie = function (key, value, options) { // Write if (value !== undefined && !$.isFunction(value)) { options = $.extend({}, config.defaults, options); if (typeof options.expires === 'number') { var days = options.expires, t = options.expires = new Date(); t.setTime(+t + days * 864e+5); } return (document.cookie = [ encode(key), '=', stringifyCookieValue(value), options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE options.path ? '; path=' + options.path : '', options.domain ? '; domain=' + options.domain : '', options.secure ? '; secure' : '' ].join('')); } // Read var result = key ? undefined : {}; // To prevent the for loop in the first place assign an empty array // in case there are no cookies at all. Also prevents odd result when // calling $.cookie(). var cookies = document.cookie ? document.cookie.split('; ') : []; for (var i = 0, l = cookies.length; i < l; i++) { var parts = cookies[i].split('='); var name = decode(parts.shift()); var cookie = parts.join('='); if (key && key === name) { // If second argument (value) is a function it's a converter... result = read(cookie, value); break; } // Prevent storing a cookie that we couldn't decode. if (!key && (cookie = read(cookie)) !== undefined) { result[name] = cookie; } } return result; }; config.defaults = {}; $.removeCookie = function (key, options) { if ($.cookie(key) === undefined) { return false; } // Must not alter options, thus extending a fresh object... $.cookie(key, '', $.extend({}, options, { expires: -1 })); return !$.cookie(key); }; })); PKL\akˇ ,youtube-embed-plus/scripts/embedplus_mce.cssnu[.wp_themeSkin span.mce_embedplus_youtubeprefs, span.mce_embedplus_youtubeprefs { background: transparent url("../images/btnprefsoff.png") no-repeat scroll center center !important; } .wp_themeSkin span.mce_embedplus_youtubeprefs:hover, span.mce_embedplus_youtubeprefs:hover { background-image: url("../images/btnprefson.png") !important; } .wp_themeSkin span.mce_embedplus_youtubeprefs_wiz, span.mce_embedplus_youtubeprefs_wiz { background: transparent url("../images/btnwizoff.png") no-repeat scroll center center !important; } .wp_themeSkin span.mce_embedplus_youtubeprefs_wiz:hover, span.mce_embedplus_youtubeprefs_wiz:hover { background-image: url("../images/btnwizon.png") !important; } /********** media button */ .wp-core-ui a.ytprefs_media_link span, a.ytprefs_media_link span, #media-buttons a.ytprefs_media_link span { background: transparent url("../images/btnwizoff.png") no-repeat scroll top left; display: inline-block; height: 16px; margin: 2px 2px 0 0; vertical-align: top; width: 16px; } .wp-core-ui a.ytprefs_media_link:hover span, a.ytprefs_media_link:hover span, #media-buttons a.ytprefs_media_link:hover span { background-image: url("../images/btnwizon.png"); } .wp-core-ui a.ytprefs_vi_embed_shortcode span, a.ytprefs_vi_embed_shortcode span, #media-buttons a.ytprefs_vi_embed_shortcode span { background: transparent url("../images/icon-monetize_16x18bw.png") no-repeat scroll top left; display: inline-block; height: 16px; margin: 4px 2px 0 0; vertical-align: top; width: 18px; } .wp-core-ui a.ytprefs_vi_embed_shortcode:hover span, a.ytprefs_vi_embed_shortcode:hover span, #media-buttons a.ytprefs_vi_embed_shortcode:hover span { background-image: url("../images/icon-monetize_16x18.png"); } body #TB_overlay.epyt-thickbox { z-index: 100000000 !important; } body #TB_window.epyt-thickbox { z-index: 100000001 !important; } #media-buttons a.ytprefs_media_link, .wp-core-ui a.ytprefs_media_link, a.ytprefs_media_link { background-attachment: scroll; background-clip: border-box; background-color: #F3F3F3; background-image: linear-gradient(#FEFEFE, #F4F4F4); background-origin: padding-box; background-size: auto; border-radius: 3px; box-sizing: border-box; /*color: #333;*/ cursor: pointer; display: inline-block; /*font-family: sans-serif; font-size: 12px; height: 24px; line-height: 23px;*/ margin: 0px 5px 0px 0px; outline-color: #333; outline-style: none; outline-width: 0px; padding: 0px 10px 1px .4em; text-decoration: none; text-shadow: #FFF 0px 1px 0px; white-space: nowrap; } #dashboard_right_now .page-count a.ytprefs_glance_button:before, #dashboard_right_now .page-count span.ytprefs_glance_button:before { content: "\f236"; } /* menu button */ #toplevel_page_youtube-my-preferences > ul > li.wp-first-item { display: none; } #wpadminbar #wp-admin-bar-ytprefs-bar-cache > .ab-item:before { content: "\f311"; top: 2px; } .ytprefs-pointer .wp-pointer-buttons, .ytprefs-pointer .wp-pointer-buttons a.close { display: block !important; opacity: 1 !important; }PKL\>/youtube-embed-plus/scripts/jquery.cookie.min.jsnu[/*! jquery.cookie v1.4.1 | MIT */ !function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}});PKL\h3%youtube-embed-plus/scripts/index.htmlnu[ PKL\6V7,youtube-embed-plus/scripts/chartjs/moment.jsnu[//! moment.js //! version : 2.20.1 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com ;(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.moment = factory() }(this, (function () { 'use strict'; var hookCallback; function hooks () { return hookCallback.apply(null, arguments); } // This is done to register the method called with moment() // without creating circular dependencies. function setHookCallback (callback) { hookCallback = callback; } function isArray(input) { return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; } function isObject(input) { // IE8 will treat undefined and null as object if it wasn't for // input != null return input != null && Object.prototype.toString.call(input) === '[object Object]'; } function isObjectEmpty(obj) { if (Object.getOwnPropertyNames) { return (Object.getOwnPropertyNames(obj).length === 0); } else { var k; for (k in obj) { if (obj.hasOwnProperty(k)) { return false; } } return true; } } function isUndefined(input) { return input === void 0; } function isNumber(input) { return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; } function isDate(input) { return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; } function map(arr, fn) { var res = [], i; for (i = 0; i < arr.length; ++i) { res.push(fn(arr[i], i)); } return res; } function hasOwnProp(a, b) { return Object.prototype.hasOwnProperty.call(a, b); } function extend(a, b) { for (var i in b) { if (hasOwnProp(b, i)) { a[i] = b[i]; } } if (hasOwnProp(b, 'toString')) { a.toString = b.toString; } if (hasOwnProp(b, 'valueOf')) { a.valueOf = b.valueOf; } return a; } function createUTC (input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, true).utc(); } function defaultParsingFlags() { // We need to deep clone this object. return { empty : false, unusedTokens : [], unusedInput : [], overflow : -2, charsLeftOver : 0, nullInput : false, invalidMonth : null, invalidFormat : false, userInvalidated : false, iso : false, parsedDateParts : [], meridiem : null, rfc2822 : false, weekdayMismatch : false }; } function getParsingFlags(m) { if (m._pf == null) { m._pf = defaultParsingFlags(); } return m._pf; } var some; if (Array.prototype.some) { some = Array.prototype.some; } else { some = function (fun) { var t = Object(this); var len = t.length >>> 0; for (var i = 0; i < len; i++) { if (i in t && fun.call(this, t[i], i, t)) { return true; } } return false; }; } function isValid(m) { if (m._isValid == null) { var flags = getParsingFlags(m); var parsedParts = some.call(flags.parsedDateParts, function (i) { return i != null; }); var isNowValid = !isNaN(m._d.getTime()) && flags.overflow < 0 && !flags.empty && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || (flags.meridiem && parsedParts)); if (m._strict) { isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === undefined; } if (Object.isFrozen == null || !Object.isFrozen(m)) { m._isValid = isNowValid; } else { return isNowValid; } } return m._isValid; } function createInvalid (flags) { var m = createUTC(NaN); if (flags != null) { extend(getParsingFlags(m), flags); } else { getParsingFlags(m).userInvalidated = true; } return m; } // Plugins that add properties should also add the key here (null value), // so we can properly clone ourselves. var momentProperties = hooks.momentProperties = []; function copyConfig(to, from) { var i, prop, val; if (!isUndefined(from._isAMomentObject)) { to._isAMomentObject = from._isAMomentObject; } if (!isUndefined(from._i)) { to._i = from._i; } if (!isUndefined(from._f)) { to._f = from._f; } if (!isUndefined(from._l)) { to._l = from._l; } if (!isUndefined(from._strict)) { to._strict = from._strict; } if (!isUndefined(from._tzm)) { to._tzm = from._tzm; } if (!isUndefined(from._isUTC)) { to._isUTC = from._isUTC; } if (!isUndefined(from._offset)) { to._offset = from._offset; } if (!isUndefined(from._pf)) { to._pf = getParsingFlags(from); } if (!isUndefined(from._locale)) { to._locale = from._locale; } if (momentProperties.length > 0) { for (i = 0; i < momentProperties.length; i++) { prop = momentProperties[i]; val = from[prop]; if (!isUndefined(val)) { to[prop] = val; } } } return to; } var updateInProgress = false; // Moment prototype object function Moment(config) { copyConfig(this, config); this._d = new Date(config._d != null ? config._d.getTime() : NaN); if (!this.isValid()) { this._d = new Date(NaN); } // Prevent infinite loop in case updateOffset creates new moment // objects. if (updateInProgress === false) { updateInProgress = true; hooks.updateOffset(this); updateInProgress = false; } } function isMoment (obj) { return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); } function absFloor (number) { if (number < 0) { // -0 -> 0 return Math.ceil(number) || 0; } else { return Math.floor(number); } } function toInt(argumentForCoercion) { var coercedNumber = +argumentForCoercion, value = 0; if (coercedNumber !== 0 && isFinite(coercedNumber)) { value = absFloor(coercedNumber); } return value; } // compare two arrays, return the number of differences function compareArrays(array1, array2, dontConvert) { var len = Math.min(array1.length, array2.length), lengthDiff = Math.abs(array1.length - array2.length), diffs = 0, i; for (i = 0; i < len; i++) { if ((dontConvert && array1[i] !== array2[i]) || (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { diffs++; } } return diffs + lengthDiff; } function warn(msg) { if (hooks.suppressDeprecationWarnings === false && (typeof console !== 'undefined') && console.warn) { console.warn('Deprecation warning: ' + msg); } } function deprecate(msg, fn) { var firstTime = true; return extend(function () { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(null, msg); } if (firstTime) { var args = []; var arg; for (var i = 0; i < arguments.length; i++) { arg = ''; if (typeof arguments[i] === 'object') { arg += '\n[' + i + '] '; for (var key in arguments[0]) { arg += key + ': ' + arguments[0][key] + ', '; } arg = arg.slice(0, -2); // Remove trailing comma and space } else { arg = arguments[i]; } args.push(arg); } warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); firstTime = false; } return fn.apply(this, arguments); }, fn); } var deprecations = {}; function deprecateSimple(name, msg) { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(name, msg); } if (!deprecations[name]) { warn(msg); deprecations[name] = true; } } hooks.suppressDeprecationWarnings = false; hooks.deprecationHandler = null; function isFunction(input) { return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; } function set (config) { var prop, i; for (i in config) { prop = config[i]; if (isFunction(prop)) { this[i] = prop; } else { this['_' + i] = prop; } } this._config = config; // Lenient ordinal parsing accepts just a number in addition to // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. // TODO: Remove "ordinalParse" fallback in next major release. this._dayOfMonthOrdinalParseLenient = new RegExp( (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + '|' + (/\d{1,2}/).source); } function mergeConfigs(parentConfig, childConfig) { var res = extend({}, parentConfig), prop; for (prop in childConfig) { if (hasOwnProp(childConfig, prop)) { if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { res[prop] = {}; extend(res[prop], parentConfig[prop]); extend(res[prop], childConfig[prop]); } else if (childConfig[prop] != null) { res[prop] = childConfig[prop]; } else { delete res[prop]; } } } for (prop in parentConfig) { if (hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject(parentConfig[prop])) { // make sure changes to properties don't modify parent config res[prop] = extend({}, res[prop]); } } return res; } function Locale(config) { if (config != null) { this.set(config); } } var keys; if (Object.keys) { keys = Object.keys; } else { keys = function (obj) { var i, res = []; for (i in obj) { if (hasOwnProp(obj, i)) { res.push(i); } } return res; }; } var defaultCalendar = { sameDay : '[Today at] LT', nextDay : '[Tomorrow at] LT', nextWeek : 'dddd [at] LT', lastDay : '[Yesterday at] LT', lastWeek : '[Last] dddd [at] LT', sameElse : 'L' }; function calendar (key, mom, now) { var output = this._calendar[key] || this._calendar['sameElse']; return isFunction(output) ? output.call(mom, now) : output; } var defaultLongDateFormat = { LTS : 'h:mm:ss A', LT : 'h:mm A', L : 'MM/DD/YYYY', LL : 'MMMM D, YYYY', LLL : 'MMMM D, YYYY h:mm A', LLLL : 'dddd, MMMM D, YYYY h:mm A' }; function longDateFormat (key) { var format = this._longDateFormat[key], formatUpper = this._longDateFormat[key.toUpperCase()]; if (format || !formatUpper) { return format; } this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { return val.slice(1); }); return this._longDateFormat[key]; } var defaultInvalidDate = 'Invalid date'; function invalidDate () { return this._invalidDate; } var defaultOrdinal = '%d'; var defaultDayOfMonthOrdinalParse = /\d{1,2}/; function ordinal (number) { return this._ordinal.replace('%d', number); } var defaultRelativeTime = { future : 'in %s', past : '%s ago', s : 'a few seconds', ss : '%d seconds', m : 'a minute', mm : '%d minutes', h : 'an hour', hh : '%d hours', d : 'a day', dd : '%d days', M : 'a month', MM : '%d months', y : 'a year', yy : '%d years' }; function relativeTime (number, withoutSuffix, string, isFuture) { var output = this._relativeTime[string]; return (isFunction(output)) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number); } function pastFuture (diff, output) { var format = this._relativeTime[diff > 0 ? 'future' : 'past']; return isFunction(format) ? format(output) : format.replace(/%s/i, output); } var aliases = {}; function addUnitAlias (unit, shorthand) { var lowerCase = unit.toLowerCase(); aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; } function normalizeUnits(units) { return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; } function normalizeObjectUnits(inputObject) { var normalizedInput = {}, normalizedProp, prop; for (prop in inputObject) { if (hasOwnProp(inputObject, prop)) { normalizedProp = normalizeUnits(prop); if (normalizedProp) { normalizedInput[normalizedProp] = inputObject[prop]; } } } return normalizedInput; } var priorities = {}; function addUnitPriority(unit, priority) { priorities[unit] = priority; } function getPrioritizedUnits(unitsObj) { var units = []; for (var u in unitsObj) { units.push({unit: u, priority: priorities[u]}); } units.sort(function (a, b) { return a.priority - b.priority; }); return units; } function zeroFill(number, targetLength, forceSign) { var absNumber = '' + Math.abs(number), zerosToFill = targetLength - absNumber.length, sign = number >= 0; return (sign ? (forceSign ? '+' : '') : '-') + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; } var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; var formatFunctions = {}; var formatTokenFunctions = {}; // token: 'M' // padded: ['MM', 2] // ordinal: 'Mo' // callback: function () { this.month() + 1 } function addFormatToken (token, padded, ordinal, callback) { var func = callback; if (typeof callback === 'string') { func = function () { return this[callback](); }; } if (token) { formatTokenFunctions[token] = func; } if (padded) { formatTokenFunctions[padded[0]] = function () { return zeroFill(func.apply(this, arguments), padded[1], padded[2]); }; } if (ordinal) { formatTokenFunctions[ordinal] = function () { return this.localeData().ordinal(func.apply(this, arguments), token); }; } } function removeFormattingTokens(input) { if (input.match(/\[[\s\S]/)) { return input.replace(/^\[|\]$/g, ''); } return input.replace(/\\/g, ''); } function makeFormatFunction(format) { var array = format.match(formattingTokens), i, length; for (i = 0, length = array.length; i < length; i++) { if (formatTokenFunctions[array[i]]) { array[i] = formatTokenFunctions[array[i]]; } else { array[i] = removeFormattingTokens(array[i]); } } return function (mom) { var output = '', i; for (i = 0; i < length; i++) { output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; } return output; }; } // format date using native date object function formatMoment(m, format) { if (!m.isValid()) { return m.localeData().invalidDate(); } format = expandFormat(format, m.localeData()); formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); return formatFunctions[format](m); } function expandFormat(format, locale) { var i = 5; function replaceLongDateFormatTokens(input) { return locale.longDateFormat(input) || input; } localFormattingTokens.lastIndex = 0; while (i >= 0 && localFormattingTokens.test(format)) { format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); localFormattingTokens.lastIndex = 0; i -= 1; } return format; } var match1 = /\d/; // 0 - 9 var match2 = /\d\d/; // 00 - 99 var match3 = /\d{3}/; // 000 - 999 var match4 = /\d{4}/; // 0000 - 9999 var match6 = /[+-]?\d{6}/; // -999999 - 999999 var match1to2 = /\d\d?/; // 0 - 99 var match3to4 = /\d\d\d\d?/; // 999 - 9999 var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 var match1to3 = /\d{1,3}/; // 0 - 999 var match1to4 = /\d{1,4}/; // 0 - 9999 var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 var matchUnsigned = /\d+/; // 0 - inf var matchSigned = /[+-]?\d+/; // -inf - inf var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 // any word (or two) characters or numbers including two/three word month in arabic. // includes scottish gaelic two word and hyphenated months var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; var regexes = {}; function addRegexToken (token, regex, strictRegex) { regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { return (isStrict && strictRegex) ? strictRegex : regex; }; } function getParseRegexForToken (token, config) { if (!hasOwnProp(regexes, token)) { return new RegExp(unescapeFormat(token)); } return regexes[token](config._strict, config._locale); } // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript function unescapeFormat(s) { return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { return p1 || p2 || p3 || p4; })); } function regexEscape(s) { return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } var tokens = {}; function addParseToken (token, callback) { var i, func = callback; if (typeof token === 'string') { token = [token]; } if (isNumber(callback)) { func = function (input, array) { array[callback] = toInt(input); }; } for (i = 0; i < token.length; i++) { tokens[token[i]] = func; } } function addWeekParseToken (token, callback) { addParseToken(token, function (input, array, config, token) { config._w = config._w || {}; callback(input, config._w, config, token); }); } function addTimeToArrayFromToken(token, input, config) { if (input != null && hasOwnProp(tokens, token)) { tokens[token](input, config._a, config, token); } } var YEAR = 0; var MONTH = 1; var DATE = 2; var HOUR = 3; var MINUTE = 4; var SECOND = 5; var MILLISECOND = 6; var WEEK = 7; var WEEKDAY = 8; // FORMATTING addFormatToken('Y', 0, 0, function () { var y = this.year(); return y <= 9999 ? '' + y : '+' + y; }); addFormatToken(0, ['YY', 2], 0, function () { return this.year() % 100; }); addFormatToken(0, ['YYYY', 4], 0, 'year'); addFormatToken(0, ['YYYYY', 5], 0, 'year'); addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); // ALIASES addUnitAlias('year', 'y'); // PRIORITIES addUnitPriority('year', 1); // PARSING addRegexToken('Y', matchSigned); addRegexToken('YY', match1to2, match2); addRegexToken('YYYY', match1to4, match4); addRegexToken('YYYYY', match1to6, match6); addRegexToken('YYYYYY', match1to6, match6); addParseToken(['YYYYY', 'YYYYYY'], YEAR); addParseToken('YYYY', function (input, array) { array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); }); addParseToken('YY', function (input, array) { array[YEAR] = hooks.parseTwoDigitYear(input); }); addParseToken('Y', function (input, array) { array[YEAR] = parseInt(input, 10); }); // HELPERS function daysInYear(year) { return isLeapYear(year) ? 366 : 365; } function isLeapYear(year) { return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; } // HOOKS hooks.parseTwoDigitYear = function (input) { return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); }; // MOMENTS var getSetYear = makeGetSet('FullYear', true); function getIsLeapYear () { return isLeapYear(this.year()); } function makeGetSet (unit, keepTime) { return function (value) { if (value != null) { set$1(this, unit, value); hooks.updateOffset(this, keepTime); return this; } else { return get(this, unit); } }; } function get (mom, unit) { return mom.isValid() ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; } function set$1 (mom, unit, value) { if (mom.isValid() && !isNaN(value)) { if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); } else { mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); } } } // MOMENTS function stringGet (units) { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](); } return this; } function stringSet (units, value) { if (typeof units === 'object') { units = normalizeObjectUnits(units); var prioritized = getPrioritizedUnits(units); for (var i = 0; i < prioritized.length; i++) { this[prioritized[i].unit](units[prioritized[i].unit]); } } else { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](value); } } return this; } function mod(n, x) { return ((n % x) + x) % x; } var indexOf; if (Array.prototype.indexOf) { indexOf = Array.prototype.indexOf; } else { indexOf = function (o) { // I know var i; for (i = 0; i < this.length; ++i) { if (this[i] === o) { return i; } } return -1; }; } function daysInMonth(year, month) { if (isNaN(year) || isNaN(month)) { return NaN; } var modMonth = mod(month, 12); year += (month - modMonth) / 12; return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); } // FORMATTING addFormatToken('M', ['MM', 2], 'Mo', function () { return this.month() + 1; }); addFormatToken('MMM', 0, 0, function (format) { return this.localeData().monthsShort(this, format); }); addFormatToken('MMMM', 0, 0, function (format) { return this.localeData().months(this, format); }); // ALIASES addUnitAlias('month', 'M'); // PRIORITY addUnitPriority('month', 8); // PARSING addRegexToken('M', match1to2); addRegexToken('MM', match1to2, match2); addRegexToken('MMM', function (isStrict, locale) { return locale.monthsShortRegex(isStrict); }); addRegexToken('MMMM', function (isStrict, locale) { return locale.monthsRegex(isStrict); }); addParseToken(['M', 'MM'], function (input, array) { array[MONTH] = toInt(input) - 1; }); addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { var month = config._locale.monthsParse(input, token, config._strict); // if we didn't find a month name, mark the date as invalid. if (month != null) { array[MONTH] = month; } else { getParsingFlags(config).invalidMonth = input; } }); // LOCALES var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); function localeMonths (m, format) { if (!m) { return isArray(this._months) ? this._months : this._months['standalone']; } return isArray(this._months) ? this._months[m.month()] : this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; } var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); function localeMonthsShort (m, format) { if (!m) { return isArray(this._monthsShort) ? this._monthsShort : this._monthsShort['standalone']; } return isArray(this._monthsShort) ? this._monthsShort[m.month()] : this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; } function handleStrictParse(monthName, format, strict) { var i, ii, mom, llc = monthName.toLocaleLowerCase(); if (!this._monthsParse) { // this is not used this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; for (i = 0; i < 12; ++i) { mom = createUTC([2000, i]); this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } } } function localeMonthsParse (monthName, format, strict) { var i, mom, regex; if (this._monthsParseExact) { return handleStrictParse.call(this, monthName, format, strict); } if (!this._monthsParse) { this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; } // TODO: add sorting // Sorting makes sure if one month (or abbr) is a prefix of another // see sorting in computeMonthsParse for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = createUTC([2000, i]); if (strict && !this._longMonthsParse[i]) { this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); } if (!strict && !this._monthsParse[i]) { regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { return i; } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { return i; } else if (!strict && this._monthsParse[i].test(monthName)) { return i; } } } // MOMENTS function setMonth (mom, value) { var dayOfMonth; if (!mom.isValid()) { // No op return mom; } if (typeof value === 'string') { if (/^\d+$/.test(value)) { value = toInt(value); } else { value = mom.localeData().monthsParse(value); // TODO: Another silent failure? if (!isNumber(value)) { return mom; } } } dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); return mom; } function getSetMonth (value) { if (value != null) { setMonth(this, value); hooks.updateOffset(this, true); return this; } else { return get(this, 'Month'); } } function getDaysInMonth () { return daysInMonth(this.year(), this.month()); } var defaultMonthsShortRegex = matchWord; function monthsShortRegex (isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsShortStrictRegex; } else { return this._monthsShortRegex; } } else { if (!hasOwnProp(this, '_monthsShortRegex')) { this._monthsShortRegex = defaultMonthsShortRegex; } return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex; } } var defaultMonthsRegex = matchWord; function monthsRegex (isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsStrictRegex; } else { return this._monthsRegex; } } else { if (!hasOwnProp(this, '_monthsRegex')) { this._monthsRegex = defaultMonthsRegex; } return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex; } } function computeMonthsParse () { function cmpLenRev(a, b) { return b.length - a.length; } var shortPieces = [], longPieces = [], mixedPieces = [], i, mom; for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = createUTC([2000, i]); shortPieces.push(this.monthsShort(mom, '')); longPieces.push(this.months(mom, '')); mixedPieces.push(this.months(mom, '')); mixedPieces.push(this.monthsShort(mom, '')); } // Sorting makes sure if one month (or abbr) is a prefix of another it // will match the longer piece. shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); for (i = 0; i < 12; i++) { shortPieces[i] = regexEscape(shortPieces[i]); longPieces[i] = regexEscape(longPieces[i]); } for (i = 0; i < 24; i++) { mixedPieces[i] = regexEscape(mixedPieces[i]); } this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._monthsShortRegex = this._monthsRegex; this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); } function createDate (y, m, d, h, M, s, ms) { // can't just apply() to create a date: // https://stackoverflow.com/q/181348 var date = new Date(y, m, d, h, M, s, ms); // the date constructor remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { date.setFullYear(y); } return date; } function createUTCDate (y) { var date = new Date(Date.UTC.apply(null, arguments)); // the Date.UTC function remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { date.setUTCFullYear(y); } return date; } // start-of-first-week - start-of-year function firstWeekOffset(year, dow, doy) { var // first-week day -- which january is always in the first week (4 for iso, 1 for other) fwd = 7 + dow - doy, // first-week day local weekday -- which local weekday is fwd fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; return -fwdlw + fwd - 1; } // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday function dayOfYearFromWeeks(year, week, weekday, dow, doy) { var localWeekday = (7 + weekday - dow) % 7, weekOffset = firstWeekOffset(year, dow, doy), dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, resYear, resDayOfYear; if (dayOfYear <= 0) { resYear = year - 1; resDayOfYear = daysInYear(resYear) + dayOfYear; } else if (dayOfYear > daysInYear(year)) { resYear = year + 1; resDayOfYear = dayOfYear - daysInYear(year); } else { resYear = year; resDayOfYear = dayOfYear; } return { year: resYear, dayOfYear: resDayOfYear }; } function weekOfYear(mom, dow, doy) { var weekOffset = firstWeekOffset(mom.year(), dow, doy), week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, resWeek, resYear; if (week < 1) { resYear = mom.year() - 1; resWeek = week + weeksInYear(resYear, dow, doy); } else if (week > weeksInYear(mom.year(), dow, doy)) { resWeek = week - weeksInYear(mom.year(), dow, doy); resYear = mom.year() + 1; } else { resYear = mom.year(); resWeek = week; } return { week: resWeek, year: resYear }; } function weeksInYear(year, dow, doy) { var weekOffset = firstWeekOffset(year, dow, doy), weekOffsetNext = firstWeekOffset(year + 1, dow, doy); return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; } // FORMATTING addFormatToken('w', ['ww', 2], 'wo', 'week'); addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); // ALIASES addUnitAlias('week', 'w'); addUnitAlias('isoWeek', 'W'); // PRIORITIES addUnitPriority('week', 5); addUnitPriority('isoWeek', 5); // PARSING addRegexToken('w', match1to2); addRegexToken('ww', match1to2, match2); addRegexToken('W', match1to2); addRegexToken('WW', match1to2, match2); addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { week[token.substr(0, 1)] = toInt(input); }); // HELPERS // LOCALES function localeWeek (mom) { return weekOfYear(mom, this._week.dow, this._week.doy).week; } var defaultLocaleWeek = { dow : 0, // Sunday is the first day of the week. doy : 6 // The week that contains Jan 1st is the first week of the year. }; function localeFirstDayOfWeek () { return this._week.dow; } function localeFirstDayOfYear () { return this._week.doy; } // MOMENTS function getSetWeek (input) { var week = this.localeData().week(this); return input == null ? week : this.add((input - week) * 7, 'd'); } function getSetISOWeek (input) { var week = weekOfYear(this, 1, 4).week; return input == null ? week : this.add((input - week) * 7, 'd'); } // FORMATTING addFormatToken('d', 0, 'do', 'day'); addFormatToken('dd', 0, 0, function (format) { return this.localeData().weekdaysMin(this, format); }); addFormatToken('ddd', 0, 0, function (format) { return this.localeData().weekdaysShort(this, format); }); addFormatToken('dddd', 0, 0, function (format) { return this.localeData().weekdays(this, format); }); addFormatToken('e', 0, 0, 'weekday'); addFormatToken('E', 0, 0, 'isoWeekday'); // ALIASES addUnitAlias('day', 'd'); addUnitAlias('weekday', 'e'); addUnitAlias('isoWeekday', 'E'); // PRIORITY addUnitPriority('day', 11); addUnitPriority('weekday', 11); addUnitPriority('isoWeekday', 11); // PARSING addRegexToken('d', match1to2); addRegexToken('e', match1to2); addRegexToken('E', match1to2); addRegexToken('dd', function (isStrict, locale) { return locale.weekdaysMinRegex(isStrict); }); addRegexToken('ddd', function (isStrict, locale) { return locale.weekdaysShortRegex(isStrict); }); addRegexToken('dddd', function (isStrict, locale) { return locale.weekdaysRegex(isStrict); }); addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { var weekday = config._locale.weekdaysParse(input, token, config._strict); // if we didn't get a weekday name, mark the date as invalid if (weekday != null) { week.d = weekday; } else { getParsingFlags(config).invalidWeekday = input; } }); addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { week[token] = toInt(input); }); // HELPERS function parseWeekday(input, locale) { if (typeof input !== 'string') { return input; } if (!isNaN(input)) { return parseInt(input, 10); } input = locale.weekdaysParse(input); if (typeof input === 'number') { return input; } return null; } function parseIsoWeekday(input, locale) { if (typeof input === 'string') { return locale.weekdaysParse(input) % 7 || 7; } return isNaN(input) ? null : input; } // LOCALES var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); function localeWeekdays (m, format) { if (!m) { return isArray(this._weekdays) ? this._weekdays : this._weekdays['standalone']; } return isArray(this._weekdays) ? this._weekdays[m.day()] : this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()]; } var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); function localeWeekdaysShort (m) { return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; } var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); function localeWeekdaysMin (m) { return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; } function handleStrictParse$1(weekdayName, format, strict) { var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); if (!this._weekdaysParse) { this._weekdaysParse = []; this._shortWeekdaysParse = []; this._minWeekdaysParse = []; for (i = 0; i < 7; ++i) { mom = createUTC([2000, 1]).day(i); this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } } } function localeWeekdaysParse (weekdayName, format, strict) { var i, mom, regex; if (this._weekdaysParseExact) { return handleStrictParse$1.call(this, weekdayName, format, strict); } if (!this._weekdaysParse) { this._weekdaysParse = []; this._minWeekdaysParse = []; this._shortWeekdaysParse = []; this._fullWeekdaysParse = []; } for (i = 0; i < 7; i++) { // make the regex if we don't have it already mom = createUTC([2000, 1]).day(i); if (strict && !this._fullWeekdaysParse[i]) { this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i'); this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i'); this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i'); } if (!this._weekdaysParse[i]) { regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { return i; } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { return i; } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { return i; } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { return i; } } } // MOMENTS function getSetDayOfWeek (input) { if (!this.isValid()) { return input != null ? this : NaN; } var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); if (input != null) { input = parseWeekday(input, this.localeData()); return this.add(input - day, 'd'); } else { return day; } } function getSetLocaleDayOfWeek (input) { if (!this.isValid()) { return input != null ? this : NaN; } var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; return input == null ? weekday : this.add(input - weekday, 'd'); } function getSetISODayOfWeek (input) { if (!this.isValid()) { return input != null ? this : NaN; } // behaves the same as moment#day except // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) // as a setter, sunday should belong to the previous week. if (input != null) { var weekday = parseIsoWeekday(input, this.localeData()); return this.day(this.day() % 7 ? weekday : weekday - 7); } else { return this.day() || 7; } } var defaultWeekdaysRegex = matchWord; function weekdaysRegex (isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysStrictRegex; } else { return this._weekdaysRegex; } } else { if (!hasOwnProp(this, '_weekdaysRegex')) { this._weekdaysRegex = defaultWeekdaysRegex; } return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex; } } var defaultWeekdaysShortRegex = matchWord; function weekdaysShortRegex (isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysShortStrictRegex; } else { return this._weekdaysShortRegex; } } else { if (!hasOwnProp(this, '_weekdaysShortRegex')) { this._weekdaysShortRegex = defaultWeekdaysShortRegex; } return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex; } } var defaultWeekdaysMinRegex = matchWord; function weekdaysMinRegex (isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysMinStrictRegex; } else { return this._weekdaysMinRegex; } } else { if (!hasOwnProp(this, '_weekdaysMinRegex')) { this._weekdaysMinRegex = defaultWeekdaysMinRegex; } return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex; } } function computeWeekdaysParse () { function cmpLenRev(a, b) { return b.length - a.length; } var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], i, mom, minp, shortp, longp; for (i = 0; i < 7; i++) { // make the regex if we don't have it already mom = createUTC([2000, 1]).day(i); minp = this.weekdaysMin(mom, ''); shortp = this.weekdaysShort(mom, ''); longp = this.weekdays(mom, ''); minPieces.push(minp); shortPieces.push(shortp); longPieces.push(longp); mixedPieces.push(minp); mixedPieces.push(shortp); mixedPieces.push(longp); } // Sorting makes sure if one weekday (or abbr) is a prefix of another it // will match the longer piece. minPieces.sort(cmpLenRev); shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); for (i = 0; i < 7; i++) { shortPieces[i] = regexEscape(shortPieces[i]); longPieces[i] = regexEscape(longPieces[i]); mixedPieces[i] = regexEscape(mixedPieces[i]); } this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._weekdaysShortRegex = this._weekdaysRegex; this._weekdaysMinRegex = this._weekdaysRegex; this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); } // FORMATTING function hFormat() { return this.hours() % 12 || 12; } function kFormat() { return this.hours() || 24; } addFormatToken('H', ['HH', 2], 0, 'hour'); addFormatToken('h', ['hh', 2], 0, hFormat); addFormatToken('k', ['kk', 2], 0, kFormat); addFormatToken('hmm', 0, 0, function () { return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); }); addFormatToken('hmmss', 0, 0, function () { return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2); }); addFormatToken('Hmm', 0, 0, function () { return '' + this.hours() + zeroFill(this.minutes(), 2); }); addFormatToken('Hmmss', 0, 0, function () { return '' + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2); }); function meridiem (token, lowercase) { addFormatToken(token, 0, 0, function () { return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); }); } meridiem('a', true); meridiem('A', false); // ALIASES addUnitAlias('hour', 'h'); // PRIORITY addUnitPriority('hour', 13); // PARSING function matchMeridiem (isStrict, locale) { return locale._meridiemParse; } addRegexToken('a', matchMeridiem); addRegexToken('A', matchMeridiem); addRegexToken('H', match1to2); addRegexToken('h', match1to2); addRegexToken('k', match1to2); addRegexToken('HH', match1to2, match2); addRegexToken('hh', match1to2, match2); addRegexToken('kk', match1to2, match2); addRegexToken('hmm', match3to4); addRegexToken('hmmss', match5to6); addRegexToken('Hmm', match3to4); addRegexToken('Hmmss', match5to6); addParseToken(['H', 'HH'], HOUR); addParseToken(['k', 'kk'], function (input, array, config) { var kInput = toInt(input); array[HOUR] = kInput === 24 ? 0 : kInput; }); addParseToken(['a', 'A'], function (input, array, config) { config._isPm = config._locale.isPM(input); config._meridiem = input; }); addParseToken(['h', 'hh'], function (input, array, config) { array[HOUR] = toInt(input); getParsingFlags(config).bigHour = true; }); addParseToken('hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); getParsingFlags(config).bigHour = true; }); addParseToken('hmmss', function (input, array, config) { var pos1 = input.length - 4; var pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); getParsingFlags(config).bigHour = true; }); addParseToken('Hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); }); addParseToken('Hmmss', function (input, array, config) { var pos1 = input.length - 4; var pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); }); // LOCALES function localeIsPM (input) { // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays // Using charAt should be more compatible. return ((input + '').toLowerCase().charAt(0) === 'p'); } var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; function localeMeridiem (hours, minutes, isLower) { if (hours > 11) { return isLower ? 'pm' : 'PM'; } else { return isLower ? 'am' : 'AM'; } } // MOMENTS // Setting the hour should keep the time, because the user explicitly // specified which hour he wants. So trying to maintain the same hour (in // a new timezone) makes sense. Adding/subtracting hours does not follow // this rule. var getSetHour = makeGetSet('Hours', true); // months // week // weekdays // meridiem var baseConfig = { calendar: defaultCalendar, longDateFormat: defaultLongDateFormat, invalidDate: defaultInvalidDate, ordinal: defaultOrdinal, dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, relativeTime: defaultRelativeTime, months: defaultLocaleMonths, monthsShort: defaultLocaleMonthsShort, week: defaultLocaleWeek, weekdays: defaultLocaleWeekdays, weekdaysMin: defaultLocaleWeekdaysMin, weekdaysShort: defaultLocaleWeekdaysShort, meridiemParse: defaultLocaleMeridiemParse }; // internal storage for locale config files var locales = {}; var localeFamilies = {}; var globalLocale; function normalizeLocale(key) { return key ? key.toLowerCase().replace('_', '-') : key; } // pick the locale from the array // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root function chooseLocale(names) { var i = 0, j, next, locale, split; while (i < names.length) { split = normalizeLocale(names[i]).split('-'); j = split.length; next = normalizeLocale(names[i + 1]); next = next ? next.split('-') : null; while (j > 0) { locale = loadLocale(split.slice(0, j).join('-')); if (locale) { return locale; } if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { //the next array item is better than a shallower substring of this one break; } j--; } i++; } return null; } function loadLocale(name) { var oldLocale = null; // TODO: Find a better way to register and load all the locales in Node if (!locales[name] && (typeof module !== 'undefined') && module && module.exports) { try { oldLocale = globalLocale._abbr; var aliasedRequire = require; aliasedRequire('./locale/' + name); getSetGlobalLocale(oldLocale); } catch (e) {} } return locales[name]; } // This function will load locale and then set the global locale. If // no arguments are passed in, it will simply return the current global // locale key. function getSetGlobalLocale (key, values) { var data; if (key) { if (isUndefined(values)) { data = getLocale(key); } else { data = defineLocale(key, values); } if (data) { // moment.duration._locale = moment._locale = data; globalLocale = data; } } return globalLocale._abbr; } function defineLocale (name, config) { if (config !== null) { var parentConfig = baseConfig; config.abbr = name; if (locales[name] != null) { deprecateSimple('defineLocaleOverride', 'use moment.updateLocale(localeName, config) to change ' + 'an existing locale. moment.defineLocale(localeName, ' + 'config) should only be used for creating a new locale ' + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); parentConfig = locales[name]._config; } else if (config.parentLocale != null) { if (locales[config.parentLocale] != null) { parentConfig = locales[config.parentLocale]._config; } else { if (!localeFamilies[config.parentLocale]) { localeFamilies[config.parentLocale] = []; } localeFamilies[config.parentLocale].push({ name: name, config: config }); return null; } } locales[name] = new Locale(mergeConfigs(parentConfig, config)); if (localeFamilies[name]) { localeFamilies[name].forEach(function (x) { defineLocale(x.name, x.config); }); } // backwards compat for now: also set the locale // make sure we set the locale AFTER all child locales have been // created, so we won't end up with the child locale set. getSetGlobalLocale(name); return locales[name]; } else { // useful for testing delete locales[name]; return null; } } function updateLocale(name, config) { if (config != null) { var locale, tmpLocale, parentConfig = baseConfig; // MERGE tmpLocale = loadLocale(name); if (tmpLocale != null) { parentConfig = tmpLocale._config; } config = mergeConfigs(parentConfig, config); locale = new Locale(config); locale.parentLocale = locales[name]; locales[name] = locale; // backwards compat for now: also set the locale getSetGlobalLocale(name); } else { // pass null for config to unupdate, useful for tests if (locales[name] != null) { if (locales[name].parentLocale != null) { locales[name] = locales[name].parentLocale; } else if (locales[name] != null) { delete locales[name]; } } } return locales[name]; } // returns locale data function getLocale (key) { var locale; if (key && key._locale && key._locale._abbr) { key = key._locale._abbr; } if (!key) { return globalLocale; } if (!isArray(key)) { //short-circuit everything else locale = loadLocale(key); if (locale) { return locale; } key = [key]; } return chooseLocale(key); } function listLocales() { return keys(locales); } function checkOverflow (m) { var overflow; var a = m._a; if (a && getParsingFlags(m).overflow === -2) { overflow = a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : -1; if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { overflow = DATE; } if (getParsingFlags(m)._overflowWeeks && overflow === -1) { overflow = WEEK; } if (getParsingFlags(m)._overflowWeekday && overflow === -1) { overflow = WEEKDAY; } getParsingFlags(m).overflow = overflow; } return m; } // Pick the first defined of two or three arguments. function defaults(a, b, c) { if (a != null) { return a; } if (b != null) { return b; } return c; } function currentDateArray(config) { // hooks is actually the exported moment object var nowValue = new Date(hooks.now()); if (config._useUTC) { return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; } return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; } // convert an array to a date. // the array should mirror the parameters below // note: all values past the year are optional and will default to the lowest possible value. // [year, month, day , hour, minute, second, millisecond] function configFromArray (config) { var i, date, input = [], currentDate, expectedWeekday, yearToUse; if (config._d) { return; } currentDate = currentDateArray(config); //compute day of the year from weeks and weekdays if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { dayOfYearFromWeekInfo(config); } //if the day of the year is set, figure out what it is if (config._dayOfYear != null) { yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { getParsingFlags(config)._overflowDayOfYear = true; } date = createUTCDate(yearToUse, 0, config._dayOfYear); config._a[MONTH] = date.getUTCMonth(); config._a[DATE] = date.getUTCDate(); } // Default to current date. // * if no year, month, day of month are given, default to today // * if day of month is given, default month and year // * if month is given, default only year // * if year is given, don't default anything for (i = 0; i < 3 && config._a[i] == null; ++i) { config._a[i] = input[i] = currentDate[i]; } // Zero out whatever was not defaulted, including time for (; i < 7; i++) { config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; } // Check for 24:00:00.000 if (config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0) { config._nextDay = true; config._a[HOUR] = 0; } config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); // Apply timezone offset from input. The actual utcOffset can be changed // with parseZone. if (config._tzm != null) { config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); } if (config._nextDay) { config._a[HOUR] = 24; } // check for mismatching day of week if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { getParsingFlags(config).weekdayMismatch = true; } } function dayOfYearFromWeekInfo(config) { var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; w = config._w; if (w.GG != null || w.W != null || w.E != null) { dow = 1; doy = 4; // TODO: We need to take the current isoWeekYear, but that depends on // how we interpret now (local, utc, fixed offset). So create // a now version of current config (take local/utc/offset flags, and // create now). weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); week = defaults(w.W, 1); weekday = defaults(w.E, 1); if (weekday < 1 || weekday > 7) { weekdayOverflow = true; } } else { dow = config._locale._week.dow; doy = config._locale._week.doy; var curWeek = weekOfYear(createLocal(), dow, doy); weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); // Default to current week. week = defaults(w.w, curWeek.week); if (w.d != null) { // weekday -- low day numbers are considered next week weekday = w.d; if (weekday < 0 || weekday > 6) { weekdayOverflow = true; } } else if (w.e != null) { // local weekday -- counting starts from begining of week weekday = w.e + dow; if (w.e < 0 || w.e > 6) { weekdayOverflow = true; } } else { // default to begining of week weekday = dow; } } if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { getParsingFlags(config)._overflowWeeks = true; } else if (weekdayOverflow != null) { getParsingFlags(config)._overflowWeekday = true; } else { temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); config._a[YEAR] = temp.year; config._dayOfYear = temp.dayOfYear; } } // iso 8601 regex // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; var isoDates = [ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], ['GGGG-[W]WW', /\d{4}-W\d\d/, false], ['YYYY-DDD', /\d{4}-\d{3}/], ['YYYY-MM', /\d{4}-\d\d/, false], ['YYYYYYMMDD', /[+-]\d{10}/], ['YYYYMMDD', /\d{8}/], // YYYYMM is NOT allowed by the standard ['GGGG[W]WWE', /\d{4}W\d{3}/], ['GGGG[W]WW', /\d{4}W\d{2}/, false], ['YYYYDDD', /\d{7}/] ]; // iso time formats and regexes var isoTimes = [ ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], ['HH:mm:ss', /\d\d:\d\d:\d\d/], ['HH:mm', /\d\d:\d\d/], ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], ['HHmmss', /\d\d\d\d\d\d/], ['HHmm', /\d\d\d\d/], ['HH', /\d\d/] ]; var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; // date from iso format function configFromISO(config) { var i, l, string = config._i, match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), allowTime, dateFormat, timeFormat, tzFormat; if (match) { getParsingFlags(config).iso = true; for (i = 0, l = isoDates.length; i < l; i++) { if (isoDates[i][1].exec(match[1])) { dateFormat = isoDates[i][0]; allowTime = isoDates[i][2] !== false; break; } } if (dateFormat == null) { config._isValid = false; return; } if (match[3]) { for (i = 0, l = isoTimes.length; i < l; i++) { if (isoTimes[i][1].exec(match[3])) { // match[2] should be 'T' or space timeFormat = (match[2] || ' ') + isoTimes[i][0]; break; } } if (timeFormat == null) { config._isValid = false; return; } } if (!allowTime && timeFormat != null) { config._isValid = false; return; } if (match[4]) { if (tzRegex.exec(match[4])) { tzFormat = 'Z'; } else { config._isValid = false; return; } } config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); configFromStringAndFormat(config); } else { config._isValid = false; } } // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { var result = [ untruncateYear(yearStr), defaultLocaleMonthsShort.indexOf(monthStr), parseInt(dayStr, 10), parseInt(hourStr, 10), parseInt(minuteStr, 10) ]; if (secondStr) { result.push(parseInt(secondStr, 10)); } return result; } function untruncateYear(yearStr) { var year = parseInt(yearStr, 10); if (year <= 49) { return 2000 + year; } else if (year <= 999) { return 1900 + year; } return year; } function preprocessRFC2822(s) { // Remove comments and folding whitespace and replace multiple-spaces with a single space return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim(); } function checkWeekday(weekdayStr, parsedInput, config) { if (weekdayStr) { // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); if (weekdayProvided !== weekdayActual) { getParsingFlags(config).weekdayMismatch = true; config._isValid = false; return false; } } return true; } var obsOffsets = { UT: 0, GMT: 0, EDT: -4 * 60, EST: -5 * 60, CDT: -5 * 60, CST: -6 * 60, MDT: -6 * 60, MST: -7 * 60, PDT: -7 * 60, PST: -8 * 60 }; function calculateOffset(obsOffset, militaryOffset, numOffset) { if (obsOffset) { return obsOffsets[obsOffset]; } else if (militaryOffset) { // the only allowed military tz is Z return 0; } else { var hm = parseInt(numOffset, 10); var m = hm % 100, h = (hm - m) / 100; return h * 60 + m; } } // date and time from ref 2822 format function configFromRFC2822(config) { var match = rfc2822.exec(preprocessRFC2822(config._i)); if (match) { var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); if (!checkWeekday(match[1], parsedArray, config)) { return; } config._a = parsedArray; config._tzm = calculateOffset(match[8], match[9], match[10]); config._d = createUTCDate.apply(null, config._a); config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); getParsingFlags(config).rfc2822 = true; } else { config._isValid = false; } } // date from iso format or fallback function configFromString(config) { var matched = aspNetJsonRegex.exec(config._i); if (matched !== null) { config._d = new Date(+matched[1]); return; } configFromISO(config); if (config._isValid === false) { delete config._isValid; } else { return; } configFromRFC2822(config); if (config._isValid === false) { delete config._isValid; } else { return; } // Final attempt, use Input Fallback hooks.createFromInputFallback(config); } hooks.createFromInputFallback = deprecate( 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + 'discouraged and will be removed in an upcoming major release. Please refer to ' + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', function (config) { config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); } ); // constant that refers to the ISO standard hooks.ISO_8601 = function () {}; // constant that refers to the RFC 2822 form hooks.RFC_2822 = function () {}; // date from string and format string function configFromStringAndFormat(config) { // TODO: Move this to another part of the creation flow to prevent circular deps if (config._f === hooks.ISO_8601) { configFromISO(config); return; } if (config._f === hooks.RFC_2822) { configFromRFC2822(config); return; } config._a = []; getParsingFlags(config).empty = true; // This array is used to make a Date, either with `new Date` or `Date.UTC` var string = '' + config._i, i, parsedInput, tokens, token, skipped, stringLength = string.length, totalParsedInputLength = 0; tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; for (i = 0; i < tokens.length; i++) { token = tokens[i]; parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; // console.log('token', token, 'parsedInput', parsedInput, // 'regex', getParseRegexForToken(token, config)); if (parsedInput) { skipped = string.substr(0, string.indexOf(parsedInput)); if (skipped.length > 0) { getParsingFlags(config).unusedInput.push(skipped); } string = string.slice(string.indexOf(parsedInput) + parsedInput.length); totalParsedInputLength += parsedInput.length; } // don't parse if it's not a known token if (formatTokenFunctions[token]) { if (parsedInput) { getParsingFlags(config).empty = false; } else { getParsingFlags(config).unusedTokens.push(token); } addTimeToArrayFromToken(token, parsedInput, config); } else if (config._strict && !parsedInput) { getParsingFlags(config).unusedTokens.push(token); } } // add remaining unparsed input length to the string getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; if (string.length > 0) { getParsingFlags(config).unusedInput.push(string); } // clear _12h flag if hour is <= 12 if (config._a[HOUR] <= 12 && getParsingFlags(config).bigHour === true && config._a[HOUR] > 0) { getParsingFlags(config).bigHour = undefined; } getParsingFlags(config).parsedDateParts = config._a.slice(0); getParsingFlags(config).meridiem = config._meridiem; // handle meridiem config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); configFromArray(config); checkOverflow(config); } function meridiemFixWrap (locale, hour, meridiem) { var isPm; if (meridiem == null) { // nothing to do return hour; } if (locale.meridiemHour != null) { return locale.meridiemHour(hour, meridiem); } else if (locale.isPM != null) { // Fallback isPm = locale.isPM(meridiem); if (isPm && hour < 12) { hour += 12; } if (!isPm && hour === 12) { hour = 0; } return hour; } else { // this is not supposed to happen return hour; } } // date from string and array of format strings function configFromStringAndArray(config) { var tempConfig, bestMoment, scoreToBeat, i, currentScore; if (config._f.length === 0) { getParsingFlags(config).invalidFormat = true; config._d = new Date(NaN); return; } for (i = 0; i < config._f.length; i++) { currentScore = 0; tempConfig = copyConfig({}, config); if (config._useUTC != null) { tempConfig._useUTC = config._useUTC; } tempConfig._f = config._f[i]; configFromStringAndFormat(tempConfig); if (!isValid(tempConfig)) { continue; } // if there is any input that was not parsed add a penalty for that format currentScore += getParsingFlags(tempConfig).charsLeftOver; //or tokens currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; getParsingFlags(tempConfig).score = currentScore; if (scoreToBeat == null || currentScore < scoreToBeat) { scoreToBeat = currentScore; bestMoment = tempConfig; } } extend(config, bestMoment || tempConfig); } function configFromObject(config) { if (config._d) { return; } var i = normalizeObjectUnits(config._i); config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { return obj && parseInt(obj, 10); }); configFromArray(config); } function createFromConfig (config) { var res = new Moment(checkOverflow(prepareConfig(config))); if (res._nextDay) { // Adding is smart enough around DST res.add(1, 'd'); res._nextDay = undefined; } return res; } function prepareConfig (config) { var input = config._i, format = config._f; config._locale = config._locale || getLocale(config._l); if (input === null || (format === undefined && input === '')) { return createInvalid({nullInput: true}); } if (typeof input === 'string') { config._i = input = config._locale.preparse(input); } if (isMoment(input)) { return new Moment(checkOverflow(input)); } else if (isDate(input)) { config._d = input; } else if (isArray(format)) { configFromStringAndArray(config); } else if (format) { configFromStringAndFormat(config); } else { configFromInput(config); } if (!isValid(config)) { config._d = null; } return config; } function configFromInput(config) { var input = config._i; if (isUndefined(input)) { config._d = new Date(hooks.now()); } else if (isDate(input)) { config._d = new Date(input.valueOf()); } else if (typeof input === 'string') { configFromString(config); } else if (isArray(input)) { config._a = map(input.slice(0), function (obj) { return parseInt(obj, 10); }); configFromArray(config); } else if (isObject(input)) { configFromObject(config); } else if (isNumber(input)) { // from milliseconds config._d = new Date(input); } else { hooks.createFromInputFallback(config); } } function createLocalOrUTC (input, format, locale, strict, isUTC) { var c = {}; if (locale === true || locale === false) { strict = locale; locale = undefined; } if ((isObject(input) && isObjectEmpty(input)) || (isArray(input) && input.length === 0)) { input = undefined; } // object construction must be done this way. // https://github.com/moment/moment/issues/1423 c._isAMomentObject = true; c._useUTC = c._isUTC = isUTC; c._l = locale; c._i = input; c._f = format; c._strict = strict; return createFromConfig(c); } function createLocal (input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, false); } var prototypeMin = deprecate( 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other < this ? this : other; } else { return createInvalid(); } } ); var prototypeMax = deprecate( 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other > this ? this : other; } else { return createInvalid(); } } ); // Pick a moment m from moments so that m[fn](other) is true for all // other. This relies on the function fn to be transitive. // // moments should either be an array of moment objects or an array, whose // first element is an array of moment objects. function pickBy(fn, moments) { var res, i; if (moments.length === 1 && isArray(moments[0])) { moments = moments[0]; } if (!moments.length) { return createLocal(); } res = moments[0]; for (i = 1; i < moments.length; ++i) { if (!moments[i].isValid() || moments[i][fn](res)) { res = moments[i]; } } return res; } // TODO: Use [].sort instead? function min () { var args = [].slice.call(arguments, 0); return pickBy('isBefore', args); } function max () { var args = [].slice.call(arguments, 0); return pickBy('isAfter', args); } var now = function () { return Date.now ? Date.now() : +(new Date()); }; var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; function isDurationValid(m) { for (var key in m) { if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { return false; } } var unitHasDecimal = false; for (var i = 0; i < ordering.length; ++i) { if (m[ordering[i]]) { if (unitHasDecimal) { return false; // only allow non-integers for smallest unit } if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { unitHasDecimal = true; } } } return true; } function isValid$1() { return this._isValid; } function createInvalid$1() { return createDuration(NaN); } function Duration (duration) { var normalizedInput = normalizeObjectUnits(duration), years = normalizedInput.year || 0, quarters = normalizedInput.quarter || 0, months = normalizedInput.month || 0, weeks = normalizedInput.week || 0, days = normalizedInput.day || 0, hours = normalizedInput.hour || 0, minutes = normalizedInput.minute || 0, seconds = normalizedInput.second || 0, milliseconds = normalizedInput.millisecond || 0; this._isValid = isDurationValid(normalizedInput); // representation for dateAddRemove this._milliseconds = +milliseconds + seconds * 1e3 + // 1000 minutes * 6e4 + // 1000 * 60 hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 // Because of dateAddRemove treats 24 hours as different from a // day when working around DST, we need to store them separately this._days = +days + weeks * 7; // It is impossible to translate months into days without knowing // which months you are are talking about, so we have to store // it separately. this._months = +months + quarters * 3 + years * 12; this._data = {}; this._locale = getLocale(); this._bubble(); } function isDuration (obj) { return obj instanceof Duration; } function absRound (number) { if (number < 0) { return Math.round(-1 * number) * -1; } else { return Math.round(number); } } // FORMATTING function offset (token, separator) { addFormatToken(token, 0, 0, function () { var offset = this.utcOffset(); var sign = '+'; if (offset < 0) { offset = -offset; sign = '-'; } return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); }); } offset('Z', ':'); offset('ZZ', ''); // PARSING addRegexToken('Z', matchShortOffset); addRegexToken('ZZ', matchShortOffset); addParseToken(['Z', 'ZZ'], function (input, array, config) { config._useUTC = true; config._tzm = offsetFromString(matchShortOffset, input); }); // HELPERS // timezone chunker // '+10:00' > ['10', '00'] // '-1530' > ['-15', '30'] var chunkOffset = /([\+\-]|\d\d)/gi; function offsetFromString(matcher, string) { var matches = (string || '').match(matcher); if (matches === null) { return null; } var chunk = matches[matches.length - 1] || []; var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; var minutes = +(parts[1] * 60) + toInt(parts[2]); return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes; } // Return a moment from input, that is local/utc/zone equivalent to model. function cloneWithOffset(input, model) { var res, diff; if (model._isUTC) { res = model.clone(); diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); // Use low-level api, because this fn is low-level api. res._d.setTime(res._d.valueOf() + diff); hooks.updateOffset(res, false); return res; } else { return createLocal(input).local(); } } function getDateOffset (m) { // On Firefox.24 Date#getTimezoneOffset returns a floating point. // https://github.com/moment/moment/pull/1871 return -Math.round(m._d.getTimezoneOffset() / 15) * 15; } // HOOKS // This function will be called whenever a moment is mutated. // It is intended to keep the offset in sync with the timezone. hooks.updateOffset = function () {}; // MOMENTS // keepLocalTime = true means only change the timezone, without // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset // +0200, so we adjust the time as needed, to be valid. // // Keeping the time actually adds/subtracts (one hour) // from the actual represented time. That is why we call updateOffset // a second time. In case it wants us to change the offset again // _changeInProgress == true case, then we have to adjust, because // there is no such time in the given timezone. function getSetOffset (input, keepLocalTime, keepMinutes) { var offset = this._offset || 0, localAdjust; if (!this.isValid()) { return input != null ? this : NaN; } if (input != null) { if (typeof input === 'string') { input = offsetFromString(matchShortOffset, input); if (input === null) { return this; } } else if (Math.abs(input) < 16 && !keepMinutes) { input = input * 60; } if (!this._isUTC && keepLocalTime) { localAdjust = getDateOffset(this); } this._offset = input; this._isUTC = true; if (localAdjust != null) { this.add(localAdjust, 'm'); } if (offset !== input) { if (!keepLocalTime || this._changeInProgress) { addSubtract(this, createDuration(input - offset, 'm'), 1, false); } else if (!this._changeInProgress) { this._changeInProgress = true; hooks.updateOffset(this, true); this._changeInProgress = null; } } return this; } else { return this._isUTC ? offset : getDateOffset(this); } } function getSetZone (input, keepLocalTime) { if (input != null) { if (typeof input !== 'string') { input = -input; } this.utcOffset(input, keepLocalTime); return this; } else { return -this.utcOffset(); } } function setOffsetToUTC (keepLocalTime) { return this.utcOffset(0, keepLocalTime); } function setOffsetToLocal (keepLocalTime) { if (this._isUTC) { this.utcOffset(0, keepLocalTime); this._isUTC = false; if (keepLocalTime) { this.subtract(getDateOffset(this), 'm'); } } return this; } function setOffsetToParsedOffset () { if (this._tzm != null) { this.utcOffset(this._tzm, false, true); } else if (typeof this._i === 'string') { var tZone = offsetFromString(matchOffset, this._i); if (tZone != null) { this.utcOffset(tZone); } else { this.utcOffset(0, true); } } return this; } function hasAlignedHourOffset (input) { if (!this.isValid()) { return false; } input = input ? createLocal(input).utcOffset() : 0; return (this.utcOffset() - input) % 60 === 0; } function isDaylightSavingTime () { return ( this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset() ); } function isDaylightSavingTimeShifted () { if (!isUndefined(this._isDSTShifted)) { return this._isDSTShifted; } var c = {}; copyConfig(c, this); c = prepareConfig(c); if (c._a) { var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); this._isDSTShifted = this.isValid() && compareArrays(c._a, other.toArray()) > 0; } else { this._isDSTShifted = false; } return this._isDSTShifted; } function isLocal () { return this.isValid() ? !this._isUTC : false; } function isUtcOffset () { return this.isValid() ? this._isUTC : false; } function isUtc () { return this.isValid() ? this._isUTC && this._offset === 0 : false; } // ASP.NET json date format regex var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere // and further modified to allow for strings containing both week and day var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; function createDuration (input, key) { var duration = input, // matching against regexp is expensive, do it on demand match = null, sign, ret, diffRes; if (isDuration(input)) { duration = { ms : input._milliseconds, d : input._days, M : input._months }; } else if (isNumber(input)) { duration = {}; if (key) { duration[key] = input; } else { duration.milliseconds = input; } } else if (!!(match = aspNetRegex.exec(input))) { sign = (match[1] === '-') ? -1 : 1; duration = { y : 0, d : toInt(match[DATE]) * sign, h : toInt(match[HOUR]) * sign, m : toInt(match[MINUTE]) * sign, s : toInt(match[SECOND]) * sign, ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match }; } else if (!!(match = isoRegex.exec(input))) { sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1; duration = { y : parseIso(match[2], sign), M : parseIso(match[3], sign), w : parseIso(match[4], sign), d : parseIso(match[5], sign), h : parseIso(match[6], sign), m : parseIso(match[7], sign), s : parseIso(match[8], sign) }; } else if (duration == null) {// checks for null or undefined duration = {}; } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); duration = {}; duration.ms = diffRes.milliseconds; duration.M = diffRes.months; } ret = new Duration(duration); if (isDuration(input) && hasOwnProp(input, '_locale')) { ret._locale = input._locale; } return ret; } createDuration.fn = Duration.prototype; createDuration.invalid = createInvalid$1; function parseIso (inp, sign) { // We'd normally use ~~inp for this, but unfortunately it also // converts floats to ints. // inp may be undefined, so careful calling replace on it. var res = inp && parseFloat(inp.replace(',', '.')); // apply sign while we're at it return (isNaN(res) ? 0 : res) * sign; } function positiveMomentsDifference(base, other) { var res = {milliseconds: 0, months: 0}; res.months = other.month() - base.month() + (other.year() - base.year()) * 12; if (base.clone().add(res.months, 'M').isAfter(other)) { --res.months; } res.milliseconds = +other - +(base.clone().add(res.months, 'M')); return res; } function momentsDifference(base, other) { var res; if (!(base.isValid() && other.isValid())) { return {milliseconds: 0, months: 0}; } other = cloneWithOffset(other, base); if (base.isBefore(other)) { res = positiveMomentsDifference(base, other); } else { res = positiveMomentsDifference(other, base); res.milliseconds = -res.milliseconds; res.months = -res.months; } return res; } // TODO: remove 'name' arg after deprecation is removed function createAdder(direction, name) { return function (val, period) { var dur, tmp; //invert the arguments, but complain about it if (period !== null && !isNaN(+period)) { deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); tmp = val; val = period; period = tmp; } val = typeof val === 'string' ? +val : val; dur = createDuration(val, period); addSubtract(this, dur, direction); return this; }; } function addSubtract (mom, duration, isAdding, updateOffset) { var milliseconds = duration._milliseconds, days = absRound(duration._days), months = absRound(duration._months); if (!mom.isValid()) { // No op return; } updateOffset = updateOffset == null ? true : updateOffset; if (months) { setMonth(mom, get(mom, 'Month') + months * isAdding); } if (days) { set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); } if (milliseconds) { mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); } if (updateOffset) { hooks.updateOffset(mom, days || months); } } var add = createAdder(1, 'add'); var subtract = createAdder(-1, 'subtract'); function getCalendarFormat(myMoment, now) { var diff = myMoment.diff(now, 'days', true); return diff < -6 ? 'sameElse' : diff < -1 ? 'lastWeek' : diff < 0 ? 'lastDay' : diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse'; } function calendar$1 (time, formats) { // We want to compare the start of today, vs this. // Getting start-of-today depends on whether we're local/utc/offset or not. var now = time || createLocal(), sod = cloneWithOffset(now, this).startOf('day'), format = hooks.calendarFormat(this, sod) || 'sameElse'; var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); return this.format(output || this.localeData().calendar(format, this, createLocal(now))); } function clone () { return new Moment(this); } function isAfter (input, units) { var localInput = isMoment(input) ? input : createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); if (units === 'millisecond') { return this.valueOf() > localInput.valueOf(); } else { return localInput.valueOf() < this.clone().startOf(units).valueOf(); } } function isBefore (input, units) { var localInput = isMoment(input) ? input : createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(!isUndefined(units) ? units : 'millisecond'); if (units === 'millisecond') { return this.valueOf() < localInput.valueOf(); } else { return this.clone().endOf(units).valueOf() < localInput.valueOf(); } } function isBetween (from, to, units, inclusivity) { inclusivity = inclusivity || '()'; return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) && (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units)); } function isSame (input, units) { var localInput = isMoment(input) ? input : createLocal(input), inputMs; if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units || 'millisecond'); if (units === 'millisecond') { return this.valueOf() === localInput.valueOf(); } else { inputMs = localInput.valueOf(); return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); } } function isSameOrAfter (input, units) { return this.isSame(input, units) || this.isAfter(input,units); } function isSameOrBefore (input, units) { return this.isSame(input, units) || this.isBefore(input,units); } function diff (input, units, asFloat) { var that, zoneDelta, delta, output; if (!this.isValid()) { return NaN; } that = cloneWithOffset(input, this); if (!that.isValid()) { return NaN; } zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; units = normalizeUnits(units); switch (units) { case 'year': output = monthDiff(this, that) / 12; break; case 'month': output = monthDiff(this, that); break; case 'quarter': output = monthDiff(this, that) / 3; break; case 'second': output = (this - that) / 1e3; break; // 1000 case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst default: output = this - that; } return asFloat ? output : absFloor(output); } function monthDiff (a, b) { // difference in months var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), // b is in (anchor - 1 month, anchor + 1 month) anchor = a.clone().add(wholeMonthDiff, 'months'), anchor2, adjust; if (b - anchor < 0) { anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor - anchor2); } else { anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor2 - anchor); } //check for negative zero, return zero if negative zero return -(wholeMonthDiff + adjust) || 0; } hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; function toString () { return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); } function toISOString(keepOffset) { if (!this.isValid()) { return null; } var utc = keepOffset !== true; var m = utc ? this.clone().utc() : this; if (m.year() < 0 || m.year() > 9999) { return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); } if (isFunction(Date.prototype.toISOString)) { // native implementation is ~50x faster, use it when we can if (utc) { return this.toDate().toISOString(); } else { return new Date(this._d.valueOf()).toISOString().replace('Z', formatMoment(m, 'Z')); } } return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); } /** * Return a human readable representation of a moment that can * also be evaluated to get a new moment which is the same * * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects */ function inspect () { if (!this.isValid()) { return 'moment.invalid(/* ' + this._i + ' */)'; } var func = 'moment'; var zone = ''; if (!this.isLocal()) { func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; zone = 'Z'; } var prefix = '[' + func + '("]'; var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; var datetime = '-MM-DD[T]HH:mm:ss.SSS'; var suffix = zone + '[")]'; return this.format(prefix + year + datetime + suffix); } function format (inputString) { if (!inputString) { inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; } var output = formatMoment(this, inputString); return this.localeData().postformat(output); } function from (time, withoutSuffix) { if (this.isValid() && ((isMoment(time) && time.isValid()) || createLocal(time).isValid())) { return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function fromNow (withoutSuffix) { return this.from(createLocal(), withoutSuffix); } function to (time, withoutSuffix) { if (this.isValid() && ((isMoment(time) && time.isValid()) || createLocal(time).isValid())) { return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function toNow (withoutSuffix) { return this.to(createLocal(), withoutSuffix); } // If passed a locale key, it will set the locale for this // instance. Otherwise, it will return the locale configuration // variables for this instance. function locale (key) { var newLocaleData; if (key === undefined) { return this._locale._abbr; } else { newLocaleData = getLocale(key); if (newLocaleData != null) { this._locale = newLocaleData; } return this; } } var lang = deprecate( 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', function (key) { if (key === undefined) { return this.localeData(); } else { return this.locale(key); } } ); function localeData () { return this._locale; } function startOf (units) { units = normalizeUnits(units); // the following switch intentionally omits break keywords // to utilize falling through the cases. switch (units) { case 'year': this.month(0); /* falls through */ case 'quarter': case 'month': this.date(1); /* falls through */ case 'week': case 'isoWeek': case 'day': case 'date': this.hours(0); /* falls through */ case 'hour': this.minutes(0); /* falls through */ case 'minute': this.seconds(0); /* falls through */ case 'second': this.milliseconds(0); } // weeks are a special case if (units === 'week') { this.weekday(0); } if (units === 'isoWeek') { this.isoWeekday(1); } // quarters are also special if (units === 'quarter') { this.month(Math.floor(this.month() / 3) * 3); } return this; } function endOf (units) { units = normalizeUnits(units); if (units === undefined || units === 'millisecond') { return this; } // 'date' is an alias for 'day', so it should be considered as such. if (units === 'date') { units = 'day'; } return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); } function valueOf () { return this._d.valueOf() - ((this._offset || 0) * 60000); } function unix () { return Math.floor(this.valueOf() / 1000); } function toDate () { return new Date(this.valueOf()); } function toArray () { var m = this; return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; } function toObject () { var m = this; return { years: m.year(), months: m.month(), date: m.date(), hours: m.hours(), minutes: m.minutes(), seconds: m.seconds(), milliseconds: m.milliseconds() }; } function toJSON () { // new Date(NaN).toJSON() === null return this.isValid() ? this.toISOString() : null; } function isValid$2 () { return isValid(this); } function parsingFlags () { return extend({}, getParsingFlags(this)); } function invalidAt () { return getParsingFlags(this).overflow; } function creationData() { return { input: this._i, format: this._f, locale: this._locale, isUTC: this._isUTC, strict: this._strict }; } // FORMATTING addFormatToken(0, ['gg', 2], 0, function () { return this.weekYear() % 100; }); addFormatToken(0, ['GG', 2], 0, function () { return this.isoWeekYear() % 100; }); function addWeekYearFormatToken (token, getter) { addFormatToken(0, [token, token.length], 0, getter); } addWeekYearFormatToken('gggg', 'weekYear'); addWeekYearFormatToken('ggggg', 'weekYear'); addWeekYearFormatToken('GGGG', 'isoWeekYear'); addWeekYearFormatToken('GGGGG', 'isoWeekYear'); // ALIASES addUnitAlias('weekYear', 'gg'); addUnitAlias('isoWeekYear', 'GG'); // PRIORITY addUnitPriority('weekYear', 1); addUnitPriority('isoWeekYear', 1); // PARSING addRegexToken('G', matchSigned); addRegexToken('g', matchSigned); addRegexToken('GG', match1to2, match2); addRegexToken('gg', match1to2, match2); addRegexToken('GGGG', match1to4, match4); addRegexToken('gggg', match1to4, match4); addRegexToken('GGGGG', match1to6, match6); addRegexToken('ggggg', match1to6, match6); addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { week[token.substr(0, 2)] = toInt(input); }); addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { week[token] = hooks.parseTwoDigitYear(input); }); // MOMENTS function getSetWeekYear (input) { return getSetWeekYearHelper.call(this, input, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy); } function getSetISOWeekYear (input) { return getSetWeekYearHelper.call(this, input, this.isoWeek(), this.isoWeekday(), 1, 4); } function getISOWeeksInYear () { return weeksInYear(this.year(), 1, 4); } function getWeeksInYear () { var weekInfo = this.localeData()._week; return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); } function getSetWeekYearHelper(input, week, weekday, dow, doy) { var weeksTarget; if (input == null) { return weekOfYear(this, dow, doy).year; } else { weeksTarget = weeksInYear(input, dow, doy); if (week > weeksTarget) { week = weeksTarget; } return setWeekAll.call(this, input, week, weekday, dow, doy); } } function setWeekAll(weekYear, week, weekday, dow, doy) { var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); this.year(date.getUTCFullYear()); this.month(date.getUTCMonth()); this.date(date.getUTCDate()); return this; } // FORMATTING addFormatToken('Q', 0, 'Qo', 'quarter'); // ALIASES addUnitAlias('quarter', 'Q'); // PRIORITY addUnitPriority('quarter', 7); // PARSING addRegexToken('Q', match1); addParseToken('Q', function (input, array) { array[MONTH] = (toInt(input) - 1) * 3; }); // MOMENTS function getSetQuarter (input) { return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); } // FORMATTING addFormatToken('D', ['DD', 2], 'Do', 'date'); // ALIASES addUnitAlias('date', 'D'); // PRIOROITY addUnitPriority('date', 9); // PARSING addRegexToken('D', match1to2); addRegexToken('DD', match1to2, match2); addRegexToken('Do', function (isStrict, locale) { // TODO: Remove "ordinalParse" fallback in next major release. return isStrict ? (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : locale._dayOfMonthOrdinalParseLenient; }); addParseToken(['D', 'DD'], DATE); addParseToken('Do', function (input, array) { array[DATE] = toInt(input.match(match1to2)[0]); }); // MOMENTS var getSetDayOfMonth = makeGetSet('Date', true); // FORMATTING addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); // ALIASES addUnitAlias('dayOfYear', 'DDD'); // PRIORITY addUnitPriority('dayOfYear', 4); // PARSING addRegexToken('DDD', match1to3); addRegexToken('DDDD', match3); addParseToken(['DDD', 'DDDD'], function (input, array, config) { config._dayOfYear = toInt(input); }); // HELPERS // MOMENTS function getSetDayOfYear (input) { var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); } // FORMATTING addFormatToken('m', ['mm', 2], 0, 'minute'); // ALIASES addUnitAlias('minute', 'm'); // PRIORITY addUnitPriority('minute', 14); // PARSING addRegexToken('m', match1to2); addRegexToken('mm', match1to2, match2); addParseToken(['m', 'mm'], MINUTE); // MOMENTS var getSetMinute = makeGetSet('Minutes', false); // FORMATTING addFormatToken('s', ['ss', 2], 0, 'second'); // ALIASES addUnitAlias('second', 's'); // PRIORITY addUnitPriority('second', 15); // PARSING addRegexToken('s', match1to2); addRegexToken('ss', match1to2, match2); addParseToken(['s', 'ss'], SECOND); // MOMENTS var getSetSecond = makeGetSet('Seconds', false); // FORMATTING addFormatToken('S', 0, 0, function () { return ~~(this.millisecond() / 100); }); addFormatToken(0, ['SS', 2], 0, function () { return ~~(this.millisecond() / 10); }); addFormatToken(0, ['SSS', 3], 0, 'millisecond'); addFormatToken(0, ['SSSS', 4], 0, function () { return this.millisecond() * 10; }); addFormatToken(0, ['SSSSS', 5], 0, function () { return this.millisecond() * 100; }); addFormatToken(0, ['SSSSSS', 6], 0, function () { return this.millisecond() * 1000; }); addFormatToken(0, ['SSSSSSS', 7], 0, function () { return this.millisecond() * 10000; }); addFormatToken(0, ['SSSSSSSS', 8], 0, function () { return this.millisecond() * 100000; }); addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { return this.millisecond() * 1000000; }); // ALIASES addUnitAlias('millisecond', 'ms'); // PRIORITY addUnitPriority('millisecond', 16); // PARSING addRegexToken('S', match1to3, match1); addRegexToken('SS', match1to3, match2); addRegexToken('SSS', match1to3, match3); var token; for (token = 'SSSS'; token.length <= 9; token += 'S') { addRegexToken(token, matchUnsigned); } function parseMs(input, array) { array[MILLISECOND] = toInt(('0.' + input) * 1000); } for (token = 'S'; token.length <= 9; token += 'S') { addParseToken(token, parseMs); } // MOMENTS var getSetMillisecond = makeGetSet('Milliseconds', false); // FORMATTING addFormatToken('z', 0, 0, 'zoneAbbr'); addFormatToken('zz', 0, 0, 'zoneName'); // MOMENTS function getZoneAbbr () { return this._isUTC ? 'UTC' : ''; } function getZoneName () { return this._isUTC ? 'Coordinated Universal Time' : ''; } var proto = Moment.prototype; proto.add = add; proto.calendar = calendar$1; proto.clone = clone; proto.diff = diff; proto.endOf = endOf; proto.format = format; proto.from = from; proto.fromNow = fromNow; proto.to = to; proto.toNow = toNow; proto.get = stringGet; proto.invalidAt = invalidAt; proto.isAfter = isAfter; proto.isBefore = isBefore; proto.isBetween = isBetween; proto.isSame = isSame; proto.isSameOrAfter = isSameOrAfter; proto.isSameOrBefore = isSameOrBefore; proto.isValid = isValid$2; proto.lang = lang; proto.locale = locale; proto.localeData = localeData; proto.max = prototypeMax; proto.min = prototypeMin; proto.parsingFlags = parsingFlags; proto.set = stringSet; proto.startOf = startOf; proto.subtract = subtract; proto.toArray = toArray; proto.toObject = toObject; proto.toDate = toDate; proto.toISOString = toISOString; proto.inspect = inspect; proto.toJSON = toJSON; proto.toString = toString; proto.unix = unix; proto.valueOf = valueOf; proto.creationData = creationData; // Year proto.year = getSetYear; proto.isLeapYear = getIsLeapYear; // Week Year proto.weekYear = getSetWeekYear; proto.isoWeekYear = getSetISOWeekYear; // Quarter proto.quarter = proto.quarters = getSetQuarter; // Month proto.month = getSetMonth; proto.daysInMonth = getDaysInMonth; // Week proto.week = proto.weeks = getSetWeek; proto.isoWeek = proto.isoWeeks = getSetISOWeek; proto.weeksInYear = getWeeksInYear; proto.isoWeeksInYear = getISOWeeksInYear; // Day proto.date = getSetDayOfMonth; proto.day = proto.days = getSetDayOfWeek; proto.weekday = getSetLocaleDayOfWeek; proto.isoWeekday = getSetISODayOfWeek; proto.dayOfYear = getSetDayOfYear; // Hour proto.hour = proto.hours = getSetHour; // Minute proto.minute = proto.minutes = getSetMinute; // Second proto.second = proto.seconds = getSetSecond; // Millisecond proto.millisecond = proto.milliseconds = getSetMillisecond; // Offset proto.utcOffset = getSetOffset; proto.utc = setOffsetToUTC; proto.local = setOffsetToLocal; proto.parseZone = setOffsetToParsedOffset; proto.hasAlignedHourOffset = hasAlignedHourOffset; proto.isDST = isDaylightSavingTime; proto.isLocal = isLocal; proto.isUtcOffset = isUtcOffset; proto.isUtc = isUtc; proto.isUTC = isUtc; // Timezone proto.zoneAbbr = getZoneAbbr; proto.zoneName = getZoneName; // Deprecations proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); function createUnix (input) { return createLocal(input * 1000); } function createInZone () { return createLocal.apply(null, arguments).parseZone(); } function preParsePostFormat (string) { return string; } var proto$1 = Locale.prototype; proto$1.calendar = calendar; proto$1.longDateFormat = longDateFormat; proto$1.invalidDate = invalidDate; proto$1.ordinal = ordinal; proto$1.preparse = preParsePostFormat; proto$1.postformat = preParsePostFormat; proto$1.relativeTime = relativeTime; proto$1.pastFuture = pastFuture; proto$1.set = set; // Month proto$1.months = localeMonths; proto$1.monthsShort = localeMonthsShort; proto$1.monthsParse = localeMonthsParse; proto$1.monthsRegex = monthsRegex; proto$1.monthsShortRegex = monthsShortRegex; // Week proto$1.week = localeWeek; proto$1.firstDayOfYear = localeFirstDayOfYear; proto$1.firstDayOfWeek = localeFirstDayOfWeek; // Day of Week proto$1.weekdays = localeWeekdays; proto$1.weekdaysMin = localeWeekdaysMin; proto$1.weekdaysShort = localeWeekdaysShort; proto$1.weekdaysParse = localeWeekdaysParse; proto$1.weekdaysRegex = weekdaysRegex; proto$1.weekdaysShortRegex = weekdaysShortRegex; proto$1.weekdaysMinRegex = weekdaysMinRegex; // Hours proto$1.isPM = localeIsPM; proto$1.meridiem = localeMeridiem; function get$1 (format, index, field, setter) { var locale = getLocale(); var utc = createUTC().set(setter, index); return locale[field](utc, format); } function listMonthsImpl (format, index, field) { if (isNumber(format)) { index = format; format = undefined; } format = format || ''; if (index != null) { return get$1(format, index, field, 'month'); } var i; var out = []; for (i = 0; i < 12; i++) { out[i] = get$1(format, i, field, 'month'); } return out; } // () // (5) // (fmt, 5) // (fmt) // (true) // (true, 5) // (true, fmt, 5) // (true, fmt) function listWeekdaysImpl (localeSorted, format, index, field) { if (typeof localeSorted === 'boolean') { if (isNumber(format)) { index = format; format = undefined; } format = format || ''; } else { format = localeSorted; index = format; localeSorted = false; if (isNumber(format)) { index = format; format = undefined; } format = format || ''; } var locale = getLocale(), shift = localeSorted ? locale._week.dow : 0; if (index != null) { return get$1(format, (index + shift) % 7, field, 'day'); } var i; var out = []; for (i = 0; i < 7; i++) { out[i] = get$1(format, (i + shift) % 7, field, 'day'); } return out; } function listMonths (format, index) { return listMonthsImpl(format, index, 'months'); } function listMonthsShort (format, index) { return listMonthsImpl(format, index, 'monthsShort'); } function listWeekdays (localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); } function listWeekdaysShort (localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); } function listWeekdaysMin (localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); } getSetGlobalLocale('en', { dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal : function (number) { var b = number % 10, output = (toInt(number % 100 / 10) === 1) ? 'th' : (b === 1) ? 'st' : (b === 2) ? 'nd' : (b === 3) ? 'rd' : 'th'; return number + output; } }); // Side effect imports hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); var mathAbs = Math.abs; function abs () { var data = this._data; this._milliseconds = mathAbs(this._milliseconds); this._days = mathAbs(this._days); this._months = mathAbs(this._months); data.milliseconds = mathAbs(data.milliseconds); data.seconds = mathAbs(data.seconds); data.minutes = mathAbs(data.minutes); data.hours = mathAbs(data.hours); data.months = mathAbs(data.months); data.years = mathAbs(data.years); return this; } function addSubtract$1 (duration, input, value, direction) { var other = createDuration(input, value); duration._milliseconds += direction * other._milliseconds; duration._days += direction * other._days; duration._months += direction * other._months; return duration._bubble(); } // supports only 2.0-style add(1, 's') or add(duration) function add$1 (input, value) { return addSubtract$1(this, input, value, 1); } // supports only 2.0-style subtract(1, 's') or subtract(duration) function subtract$1 (input, value) { return addSubtract$1(this, input, value, -1); } function absCeil (number) { if (number < 0) { return Math.floor(number); } else { return Math.ceil(number); } } function bubble () { var milliseconds = this._milliseconds; var days = this._days; var months = this._months; var data = this._data; var seconds, minutes, hours, years, monthsFromDays; // if we have a mix of positive and negative values, bubble down first // check: https://github.com/moment/moment/issues/2166 if (!((milliseconds >= 0 && days >= 0 && months >= 0) || (milliseconds <= 0 && days <= 0 && months <= 0))) { milliseconds += absCeil(monthsToDays(months) + days) * 864e5; days = 0; months = 0; } // The following code bubbles up values, see the tests for // examples of what that means. data.milliseconds = milliseconds % 1000; seconds = absFloor(milliseconds / 1000); data.seconds = seconds % 60; minutes = absFloor(seconds / 60); data.minutes = minutes % 60; hours = absFloor(minutes / 60); data.hours = hours % 24; days += absFloor(hours / 24); // convert days to months monthsFromDays = absFloor(daysToMonths(days)); months += monthsFromDays; days -= absCeil(monthsToDays(monthsFromDays)); // 12 months -> 1 year years = absFloor(months / 12); months %= 12; data.days = days; data.months = months; data.years = years; return this; } function daysToMonths (days) { // 400 years have 146097 days (taking into account leap year rules) // 400 years have 12 months === 4800 return days * 4800 / 146097; } function monthsToDays (months) { // the reverse of daysToMonths return months * 146097 / 4800; } function as (units) { if (!this.isValid()) { return NaN; } var days; var months; var milliseconds = this._milliseconds; units = normalizeUnits(units); if (units === 'month' || units === 'year') { days = this._days + milliseconds / 864e5; months = this._months + daysToMonths(days); return units === 'month' ? months : months / 12; } else { // handle milliseconds separately because of floating point math errors (issue #1867) days = this._days + Math.round(monthsToDays(this._months)); switch (units) { case 'week' : return days / 7 + milliseconds / 6048e5; case 'day' : return days + milliseconds / 864e5; case 'hour' : return days * 24 + milliseconds / 36e5; case 'minute' : return days * 1440 + milliseconds / 6e4; case 'second' : return days * 86400 + milliseconds / 1000; // Math.floor prevents floating point math errors here case 'millisecond': return Math.floor(days * 864e5) + milliseconds; default: throw new Error('Unknown unit ' + units); } } } // TODO: Use this.as('ms')? function valueOf$1 () { if (!this.isValid()) { return NaN; } return ( this._milliseconds + this._days * 864e5 + (this._months % 12) * 2592e6 + toInt(this._months / 12) * 31536e6 ); } function makeAs (alias) { return function () { return this.as(alias); }; } var asMilliseconds = makeAs('ms'); var asSeconds = makeAs('s'); var asMinutes = makeAs('m'); var asHours = makeAs('h'); var asDays = makeAs('d'); var asWeeks = makeAs('w'); var asMonths = makeAs('M'); var asYears = makeAs('y'); function clone$1 () { return createDuration(this); } function get$2 (units) { units = normalizeUnits(units); return this.isValid() ? this[units + 's']() : NaN; } function makeGetter(name) { return function () { return this.isValid() ? this._data[name] : NaN; }; } var milliseconds = makeGetter('milliseconds'); var seconds = makeGetter('seconds'); var minutes = makeGetter('minutes'); var hours = makeGetter('hours'); var days = makeGetter('days'); var months = makeGetter('months'); var years = makeGetter('years'); function weeks () { return absFloor(this.days() / 7); } var round = Math.round; var thresholds = { ss: 44, // a few seconds to seconds s : 45, // seconds to minute m : 45, // minutes to hour h : 22, // hours to day d : 26, // days to month M : 11 // months to year }; // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); } function relativeTime$1 (posNegDuration, withoutSuffix, locale) { var duration = createDuration(posNegDuration).abs(); var seconds = round(duration.as('s')); var minutes = round(duration.as('m')); var hours = round(duration.as('h')); var days = round(duration.as('d')); var months = round(duration.as('M')); var years = round(duration.as('y')); var a = seconds <= thresholds.ss && ['s', seconds] || seconds < thresholds.s && ['ss', seconds] || minutes <= 1 && ['m'] || minutes < thresholds.m && ['mm', minutes] || hours <= 1 && ['h'] || hours < thresholds.h && ['hh', hours] || days <= 1 && ['d'] || days < thresholds.d && ['dd', days] || months <= 1 && ['M'] || months < thresholds.M && ['MM', months] || years <= 1 && ['y'] || ['yy', years]; a[2] = withoutSuffix; a[3] = +posNegDuration > 0; a[4] = locale; return substituteTimeAgo.apply(null, a); } // This function allows you to set the rounding function for relative time strings function getSetRelativeTimeRounding (roundingFunction) { if (roundingFunction === undefined) { return round; } if (typeof(roundingFunction) === 'function') { round = roundingFunction; return true; } return false; } // This function allows you to set a threshold for relative time strings function getSetRelativeTimeThreshold (threshold, limit) { if (thresholds[threshold] === undefined) { return false; } if (limit === undefined) { return thresholds[threshold]; } thresholds[threshold] = limit; if (threshold === 's') { thresholds.ss = limit - 1; } return true; } function humanize (withSuffix) { if (!this.isValid()) { return this.localeData().invalidDate(); } var locale = this.localeData(); var output = relativeTime$1(this, !withSuffix, locale); if (withSuffix) { output = locale.pastFuture(+this, output); } return locale.postformat(output); } var abs$1 = Math.abs; function sign(x) { return ((x > 0) - (x < 0)) || +x; } function toISOString$1() { // for ISO strings we do not use the normal bubbling rules: // * milliseconds bubble up until they become hours // * days do not bubble at all // * months bubble up until they become years // This is because there is no context-free conversion between hours and days // (think of clock changes) // and also not between days and months (28-31 days per month) if (!this.isValid()) { return this.localeData().invalidDate(); } var seconds = abs$1(this._milliseconds) / 1000; var days = abs$1(this._days); var months = abs$1(this._months); var minutes, hours, years; // 3600 seconds -> 60 minutes -> 1 hour minutes = absFloor(seconds / 60); hours = absFloor(minutes / 60); seconds %= 60; minutes %= 60; // 12 months -> 1 year years = absFloor(months / 12); months %= 12; // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js var Y = years; var M = months; var D = days; var h = hours; var m = minutes; var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; var total = this.asSeconds(); if (!total) { // this is the same as C#'s (Noda) and python (isodate)... // but not other JS (goog.date) return 'P0D'; } var totalSign = total < 0 ? '-' : ''; var ymSign = sign(this._months) !== sign(total) ? '-' : ''; var daysSign = sign(this._days) !== sign(total) ? '-' : ''; var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; return totalSign + 'P' + (Y ? ymSign + Y + 'Y' : '') + (M ? ymSign + M + 'M' : '') + (D ? daysSign + D + 'D' : '') + ((h || m || s) ? 'T' : '') + (h ? hmsSign + h + 'H' : '') + (m ? hmsSign + m + 'M' : '') + (s ? hmsSign + s + 'S' : ''); } var proto$2 = Duration.prototype; proto$2.isValid = isValid$1; proto$2.abs = abs; proto$2.add = add$1; proto$2.subtract = subtract$1; proto$2.as = as; proto$2.asMilliseconds = asMilliseconds; proto$2.asSeconds = asSeconds; proto$2.asMinutes = asMinutes; proto$2.asHours = asHours; proto$2.asDays = asDays; proto$2.asWeeks = asWeeks; proto$2.asMonths = asMonths; proto$2.asYears = asYears; proto$2.valueOf = valueOf$1; proto$2._bubble = bubble; proto$2.clone = clone$1; proto$2.get = get$2; proto$2.milliseconds = milliseconds; proto$2.seconds = seconds; proto$2.minutes = minutes; proto$2.hours = hours; proto$2.days = days; proto$2.weeks = weeks; proto$2.months = months; proto$2.years = years; proto$2.humanize = humanize; proto$2.toISOString = toISOString$1; proto$2.toString = toISOString$1; proto$2.toJSON = toISOString$1; proto$2.locale = locale; proto$2.localeData = localeData; // Deprecations proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); proto$2.lang = lang; // Side effect imports // FORMATTING addFormatToken('X', 0, 0, 'unix'); addFormatToken('x', 0, 0, 'valueOf'); // PARSING addRegexToken('x', matchSigned); addRegexToken('X', matchTimestamp); addParseToken('X', function (input, array, config) { config._d = new Date(parseFloat(input, 10) * 1000); }); addParseToken('x', function (input, array, config) { config._d = new Date(toInt(input)); }); // Side effect imports hooks.version = '2.20.1'; setHookCallback(createLocal); hooks.fn = proto; hooks.min = min; hooks.max = max; hooks.now = now; hooks.utc = createUTC; hooks.unix = createUnix; hooks.months = listMonths; hooks.isDate = isDate; hooks.locale = getSetGlobalLocale; hooks.invalid = createInvalid; hooks.duration = createDuration; hooks.isMoment = isMoment; hooks.weekdays = listWeekdays; hooks.parseZone = createInZone; hooks.localeData = getLocale; hooks.isDuration = isDuration; hooks.monthsShort = listMonthsShort; hooks.weekdaysMin = listWeekdaysMin; hooks.defineLocale = defineLocale; hooks.updateLocale = updateLocale; hooks.locales = listLocales; hooks.weekdaysShort = listWeekdaysShort; hooks.normalizeUnits = normalizeUnits; hooks.relativeTimeRounding = getSetRelativeTimeRounding; hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; hooks.calendarFormat = getCalendarFormat; hooks.prototype = proto; // currently HTML5 input type only supports 24-hour formats hooks.HTML5_FMT = { DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // DATE: 'YYYY-MM-DD', // TIME: 'HH:mm', // TIME_SECONDS: 'HH:mm:ss', // TIME_MS: 'HH:mm:ss.SSS', // WEEK: 'YYYY-[W]WW', // MONTH: 'YYYY-MM' // }; return hooks; }))); PKL\\+youtube-embed-plus/scripts/chartjs/chart.jsnu[/*! * Chart.js * http://chartjs.org/ * Version: 2.7.1 * * Copyright 2017 Nick Downie * Released under the MIT license * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md */ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Chart = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o lum2) { return (lum1 + 0.05) / (lum2 + 0.05); } return (lum2 + 0.05) / (lum1 + 0.05); }, level: function (color2) { var contrastRatio = this.contrast(color2); if (contrastRatio >= 7.1) { return 'AAA'; } return (contrastRatio >= 4.5) ? 'AA' : ''; }, dark: function () { // YIQ equation from http://24ways.org/2010/calculating-color-contrast var rgb = this.values.rgb; var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; return yiq < 128; }, light: function () { return !this.dark(); }, negate: function () { var rgb = []; for (var i = 0; i < 3; i++) { rgb[i] = 255 - this.values.rgb[i]; } this.setValues('rgb', rgb); return this; }, lighten: function (ratio) { var hsl = this.values.hsl; hsl[2] += hsl[2] * ratio; this.setValues('hsl', hsl); return this; }, darken: function (ratio) { var hsl = this.values.hsl; hsl[2] -= hsl[2] * ratio; this.setValues('hsl', hsl); return this; }, saturate: function (ratio) { var hsl = this.values.hsl; hsl[1] += hsl[1] * ratio; this.setValues('hsl', hsl); return this; }, desaturate: function (ratio) { var hsl = this.values.hsl; hsl[1] -= hsl[1] * ratio; this.setValues('hsl', hsl); return this; }, whiten: function (ratio) { var hwb = this.values.hwb; hwb[1] += hwb[1] * ratio; this.setValues('hwb', hwb); return this; }, blacken: function (ratio) { var hwb = this.values.hwb; hwb[2] += hwb[2] * ratio; this.setValues('hwb', hwb); return this; }, greyscale: function () { var rgb = this.values.rgb; // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; this.setValues('rgb', [val, val, val]); return this; }, clearer: function (ratio) { var alpha = this.values.alpha; this.setValues('alpha', alpha - (alpha * ratio)); return this; }, opaquer: function (ratio) { var alpha = this.values.alpha; this.setValues('alpha', alpha + (alpha * ratio)); return this; }, rotate: function (degrees) { var hsl = this.values.hsl; var hue = (hsl[0] + degrees) % 360; hsl[0] = hue < 0 ? 360 + hue : hue; this.setValues('hsl', hsl); return this; }, /** * Ported from sass implementation in C * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 */ mix: function (mixinColor, weight) { var color1 = this; var color2 = mixinColor; var p = weight === undefined ? 0.5 : weight; var w = 2 * p - 1; var a = color1.alpha() - color2.alpha(); var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; var w2 = 1 - w1; return this .rgb( w1 * color1.red() + w2 * color2.red(), w1 * color1.green() + w2 * color2.green(), w1 * color1.blue() + w2 * color2.blue() ) .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); }, toJSON: function () { return this.rgb(); }, clone: function () { // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, // making the final build way to big to embed in Chart.js. So let's do it manually, // assuming that values to clone are 1 dimension arrays containing only numbers, // except 'alpha' which is a number. var result = new Color(); var source = this.values; var target = result.values; var value, type; for (var prop in source) { if (source.hasOwnProperty(prop)) { value = source[prop]; type = ({}).toString.call(value); if (type === '[object Array]') { target[prop] = value.slice(0); } else if (type === '[object Number]') { target[prop] = value; } else { console.error('unexpected color value:', value); } } } return result; } }; Color.prototype.spaces = { rgb: ['red', 'green', 'blue'], hsl: ['hue', 'saturation', 'lightness'], hsv: ['hue', 'saturation', 'value'], hwb: ['hue', 'whiteness', 'blackness'], cmyk: ['cyan', 'magenta', 'yellow', 'black'] }; Color.prototype.maxes = { rgb: [255, 255, 255], hsl: [360, 100, 100], hsv: [360, 100, 100], hwb: [360, 100, 100], cmyk: [100, 100, 100, 100] }; Color.prototype.getValues = function (space) { var values = this.values; var vals = {}; for (var i = 0; i < space.length; i++) { vals[space.charAt(i)] = values[space][i]; } if (values.alpha !== 1) { vals.a = values.alpha; } // {r: 255, g: 255, b: 255, a: 0.4} return vals; }; Color.prototype.setValues = function (space, vals) { var values = this.values; var spaces = this.spaces; var maxes = this.maxes; var alpha = 1; var i; this.valid = true; if (space === 'alpha') { alpha = vals; } else if (vals.length) { // [10, 10, 10] values[space] = vals.slice(0, space.length); alpha = vals[space.length]; } else if (vals[space.charAt(0)] !== undefined) { // {r: 10, g: 10, b: 10} for (i = 0; i < space.length; i++) { values[space][i] = vals[space.charAt(i)]; } alpha = vals.a; } else if (vals[spaces[space][0]] !== undefined) { // {red: 10, green: 10, blue: 10} var chans = spaces[space]; for (i = 0; i < space.length; i++) { values[space][i] = vals[chans[i]]; } alpha = vals.alpha; } values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); if (space === 'alpha') { return false; } var capped; // cap values of the space prior converting all values for (i = 0; i < space.length; i++) { capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); values[space][i] = Math.round(capped); } // convert to all the other color spaces for (var sname in spaces) { if (sname !== space) { values[sname] = convert[space][sname](values[space]); } } return true; }; Color.prototype.setSpace = function (space, args) { var vals = args[0]; if (vals === undefined) { // color.rgb() return this.getValues(space); } // color.rgb(10, 10, 10) if (typeof vals === 'number') { vals = Array.prototype.slice.call(args); } this.setValues(space, vals); return this; }; Color.prototype.setChannel = function (space, index, val) { var svalues = this.values[space]; if (val === undefined) { // color.red() return svalues[index]; } else if (val === svalues[index]) { // color.red(color.red()) return this; } // color.red(100) svalues[index] = val; this.setValues(space, svalues); return this; }; //if (typeof window !== 'undefined') { // window.Color = Color; //} if (typeof window !== 'undefined') { window.Chart = window.Chart || {}; window.Chart.Color = Color; if (typeof window.Color === 'undefined') { // maintain backward compatibility ONLY if no other Color lib has been defined window.Color = Color; } } module.exports = Color; },{"2":2,"5":5}],4:[function(require,module,exports){ /* MIT license */ module.exports = { rgb2hsl: rgb2hsl, rgb2hsv: rgb2hsv, rgb2hwb: rgb2hwb, rgb2cmyk: rgb2cmyk, rgb2keyword: rgb2keyword, rgb2xyz: rgb2xyz, rgb2lab: rgb2lab, rgb2lch: rgb2lch, hsl2rgb: hsl2rgb, hsl2hsv: hsl2hsv, hsl2hwb: hsl2hwb, hsl2cmyk: hsl2cmyk, hsl2keyword: hsl2keyword, hsv2rgb: hsv2rgb, hsv2hsl: hsv2hsl, hsv2hwb: hsv2hwb, hsv2cmyk: hsv2cmyk, hsv2keyword: hsv2keyword, hwb2rgb: hwb2rgb, hwb2hsl: hwb2hsl, hwb2hsv: hwb2hsv, hwb2cmyk: hwb2cmyk, hwb2keyword: hwb2keyword, cmyk2rgb: cmyk2rgb, cmyk2hsl: cmyk2hsl, cmyk2hsv: cmyk2hsv, cmyk2hwb: cmyk2hwb, cmyk2keyword: cmyk2keyword, keyword2rgb: keyword2rgb, keyword2hsl: keyword2hsl, keyword2hsv: keyword2hsv, keyword2hwb: keyword2hwb, keyword2cmyk: keyword2cmyk, keyword2lab: keyword2lab, keyword2xyz: keyword2xyz, xyz2rgb: xyz2rgb, xyz2lab: xyz2lab, xyz2lch: xyz2lch, lab2xyz: lab2xyz, lab2rgb: lab2rgb, lab2lch: lab2lch, lch2lab: lch2lab, lch2xyz: lch2xyz, lch2rgb: lch2rgb } function rgb2hsl(rgb) { var r = rgb[0]/255, g = rgb[1]/255, b = rgb[2]/255, min = Math.min(r, g, b), max = Math.max(r, g, b), delta = max - min, h, s, l; if (max == min) h = 0; else if (r == max) h = (g - b) / delta; else if (g == max) h = 2 + (b - r) / delta; else if (b == max) h = 4 + (r - g)/ delta; h = Math.min(h * 60, 360); if (h < 0) h += 360; l = (min + max) / 2; if (max == min) s = 0; else if (l <= 0.5) s = delta / (max + min); else s = delta / (2 - max - min); return [h, s * 100, l * 100]; } function rgb2hsv(rgb) { var r = rgb[0], g = rgb[1], b = rgb[2], min = Math.min(r, g, b), max = Math.max(r, g, b), delta = max - min, h, s, v; if (max == 0) s = 0; else s = (delta/max * 1000)/10; if (max == min) h = 0; else if (r == max) h = (g - b) / delta; else if (g == max) h = 2 + (b - r) / delta; else if (b == max) h = 4 + (r - g) / delta; h = Math.min(h * 60, 360); if (h < 0) h += 360; v = ((max / 255) * 1000) / 10; return [h, s, v]; } function rgb2hwb(rgb) { var r = rgb[0], g = rgb[1], b = rgb[2], h = rgb2hsl(rgb)[0], w = 1/255 * Math.min(r, Math.min(g, b)), b = 1 - 1/255 * Math.max(r, Math.max(g, b)); return [h, w * 100, b * 100]; } function rgb2cmyk(rgb) { var r = rgb[0] / 255, g = rgb[1] / 255, b = rgb[2] / 255, c, m, y, k; k = Math.min(1 - r, 1 - g, 1 - b); c = (1 - r - k) / (1 - k) || 0; m = (1 - g - k) / (1 - k) || 0; y = (1 - b - k) / (1 - k) || 0; return [c * 100, m * 100, y * 100, k * 100]; } function rgb2keyword(rgb) { return reverseKeywords[JSON.stringify(rgb)]; } function rgb2xyz(rgb) { var r = rgb[0] / 255, g = rgb[1] / 255, b = rgb[2] / 255; // assume sRGB r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); return [x * 100, y *100, z * 100]; } function rgb2lab(rgb) { var xyz = rgb2xyz(rgb), x = xyz[0], y = xyz[1], z = xyz[2], l, a, b; x /= 95.047; y /= 100; z /= 108.883; x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); l = (116 * y) - 16; a = 500 * (x - y); b = 200 * (y - z); return [l, a, b]; } function rgb2lch(args) { return lab2lch(rgb2lab(args)); } function hsl2rgb(hsl) { var h = hsl[0] / 360, s = hsl[1] / 100, l = hsl[2] / 100, t1, t2, t3, rgb, val; if (s == 0) { val = l * 255; return [val, val, val]; } if (l < 0.5) t2 = l * (1 + s); else t2 = l + s - l * s; t1 = 2 * l - t2; rgb = [0, 0, 0]; for (var i = 0; i < 3; i++) { t3 = h + 1 / 3 * - (i - 1); t3 < 0 && t3++; t3 > 1 && t3--; if (6 * t3 < 1) val = t1 + (t2 - t1) * 6 * t3; else if (2 * t3 < 1) val = t2; else if (3 * t3 < 2) val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; else val = t1; rgb[i] = val * 255; } return rgb; } function hsl2hsv(hsl) { var h = hsl[0], s = hsl[1] / 100, l = hsl[2] / 100, sv, v; if(l === 0) { // no need to do calc on black // also avoids divide by 0 error return [0, 0, 0]; } l *= 2; s *= (l <= 1) ? l : 2 - l; v = (l + s) / 2; sv = (2 * s) / (l + s); return [h, sv * 100, v * 100]; } function hsl2hwb(args) { return rgb2hwb(hsl2rgb(args)); } function hsl2cmyk(args) { return rgb2cmyk(hsl2rgb(args)); } function hsl2keyword(args) { return rgb2keyword(hsl2rgb(args)); } function hsv2rgb(hsv) { var h = hsv[0] / 60, s = hsv[1] / 100, v = hsv[2] / 100, hi = Math.floor(h) % 6; var f = h - Math.floor(h), p = 255 * v * (1 - s), q = 255 * v * (1 - (s * f)), t = 255 * v * (1 - (s * (1 - f))), v = 255 * v; switch(hi) { case 0: return [v, t, p]; case 1: return [q, v, p]; case 2: return [p, v, t]; case 3: return [p, q, v]; case 4: return [t, p, v]; case 5: return [v, p, q]; } } function hsv2hsl(hsv) { var h = hsv[0], s = hsv[1] / 100, v = hsv[2] / 100, sl, l; l = (2 - s) * v; sl = s * v; sl /= (l <= 1) ? l : 2 - l; sl = sl || 0; l /= 2; return [h, sl * 100, l * 100]; } function hsv2hwb(args) { return rgb2hwb(hsv2rgb(args)) } function hsv2cmyk(args) { return rgb2cmyk(hsv2rgb(args)); } function hsv2keyword(args) { return rgb2keyword(hsv2rgb(args)); } // http://dev.w3.org/csswg/css-color/#hwb-to-rgb function hwb2rgb(hwb) { var h = hwb[0] / 360, wh = hwb[1] / 100, bl = hwb[2] / 100, ratio = wh + bl, i, v, f, n; // wh + bl cant be > 1 if (ratio > 1) { wh /= ratio; bl /= ratio; } i = Math.floor(6 * h); v = 1 - bl; f = 6 * h - i; if ((i & 0x01) != 0) { f = 1 - f; } n = wh + f * (v - wh); // linear interpolation switch (i) { default: case 6: case 0: r = v; g = n; b = wh; break; case 1: r = n; g = v; b = wh; break; case 2: r = wh; g = v; b = n; break; case 3: r = wh; g = n; b = v; break; case 4: r = n; g = wh; b = v; break; case 5: r = v; g = wh; b = n; break; } return [r * 255, g * 255, b * 255]; } function hwb2hsl(args) { return rgb2hsl(hwb2rgb(args)); } function hwb2hsv(args) { return rgb2hsv(hwb2rgb(args)); } function hwb2cmyk(args) { return rgb2cmyk(hwb2rgb(args)); } function hwb2keyword(args) { return rgb2keyword(hwb2rgb(args)); } function cmyk2rgb(cmyk) { var c = cmyk[0] / 100, m = cmyk[1] / 100, y = cmyk[2] / 100, k = cmyk[3] / 100, r, g, b; r = 1 - Math.min(1, c * (1 - k) + k); g = 1 - Math.min(1, m * (1 - k) + k); b = 1 - Math.min(1, y * (1 - k) + k); return [r * 255, g * 255, b * 255]; } function cmyk2hsl(args) { return rgb2hsl(cmyk2rgb(args)); } function cmyk2hsv(args) { return rgb2hsv(cmyk2rgb(args)); } function cmyk2hwb(args) { return rgb2hwb(cmyk2rgb(args)); } function cmyk2keyword(args) { return rgb2keyword(cmyk2rgb(args)); } function xyz2rgb(xyz) { var x = xyz[0] / 100, y = xyz[1] / 100, z = xyz[2] / 100, r, g, b; r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); // assume sRGB r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) : r = (r * 12.92); g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) : g = (g * 12.92); b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) : b = (b * 12.92); r = Math.min(Math.max(0, r), 1); g = Math.min(Math.max(0, g), 1); b = Math.min(Math.max(0, b), 1); return [r * 255, g * 255, b * 255]; } function xyz2lab(xyz) { var x = xyz[0], y = xyz[1], z = xyz[2], l, a, b; x /= 95.047; y /= 100; z /= 108.883; x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); l = (116 * y) - 16; a = 500 * (x - y); b = 200 * (y - z); return [l, a, b]; } function xyz2lch(args) { return lab2lch(xyz2lab(args)); } function lab2xyz(lab) { var l = lab[0], a = lab[1], b = lab[2], x, y, z, y2; if (l <= 8) { y = (l * 100) / 903.3; y2 = (7.787 * (y / 100)) + (16 / 116); } else { y = 100 * Math.pow((l + 16) / 116, 3); y2 = Math.pow(y / 100, 1/3); } x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); return [x, y, z]; } function lab2lch(lab) { var l = lab[0], a = lab[1], b = lab[2], hr, h, c; hr = Math.atan2(b, a); h = hr * 360 / 2 / Math.PI; if (h < 0) { h += 360; } c = Math.sqrt(a * a + b * b); return [l, c, h]; } function lab2rgb(args) { return xyz2rgb(lab2xyz(args)); } function lch2lab(lch) { var l = lch[0], c = lch[1], h = lch[2], a, b, hr; hr = h / 360 * 2 * Math.PI; a = c * Math.cos(hr); b = c * Math.sin(hr); return [l, a, b]; } function lch2xyz(args) { return lab2xyz(lch2lab(args)); } function lch2rgb(args) { return lab2rgb(lch2lab(args)); } function keyword2rgb(keyword) { return cssKeywords[keyword]; } function keyword2hsl(args) { return rgb2hsl(keyword2rgb(args)); } function keyword2hsv(args) { return rgb2hsv(keyword2rgb(args)); } function keyword2hwb(args) { return rgb2hwb(keyword2rgb(args)); } function keyword2cmyk(args) { return rgb2cmyk(keyword2rgb(args)); } function keyword2lab(args) { return rgb2lab(keyword2rgb(args)); } function keyword2xyz(args) { return rgb2xyz(keyword2rgb(args)); } var cssKeywords = { aliceblue: [240,248,255], antiquewhite: [250,235,215], aqua: [0,255,255], aquamarine: [127,255,212], azure: [240,255,255], beige: [245,245,220], bisque: [255,228,196], black: [0,0,0], blanchedalmond: [255,235,205], blue: [0,0,255], blueviolet: [138,43,226], brown: [165,42,42], burlywood: [222,184,135], cadetblue: [95,158,160], chartreuse: [127,255,0], chocolate: [210,105,30], coral: [255,127,80], cornflowerblue: [100,149,237], cornsilk: [255,248,220], crimson: [220,20,60], cyan: [0,255,255], darkblue: [0,0,139], darkcyan: [0,139,139], darkgoldenrod: [184,134,11], darkgray: [169,169,169], darkgreen: [0,100,0], darkgrey: [169,169,169], darkkhaki: [189,183,107], darkmagenta: [139,0,139], darkolivegreen: [85,107,47], darkorange: [255,140,0], darkorchid: [153,50,204], darkred: [139,0,0], darksalmon: [233,150,122], darkseagreen: [143,188,143], darkslateblue: [72,61,139], darkslategray: [47,79,79], darkslategrey: [47,79,79], darkturquoise: [0,206,209], darkviolet: [148,0,211], deeppink: [255,20,147], deepskyblue: [0,191,255], dimgray: [105,105,105], dimgrey: [105,105,105], dodgerblue: [30,144,255], firebrick: [178,34,34], floralwhite: [255,250,240], forestgreen: [34,139,34], fuchsia: [255,0,255], gainsboro: [220,220,220], ghostwhite: [248,248,255], gold: [255,215,0], goldenrod: [218,165,32], gray: [128,128,128], green: [0,128,0], greenyellow: [173,255,47], grey: [128,128,128], honeydew: [240,255,240], hotpink: [255,105,180], indianred: [205,92,92], indigo: [75,0,130], ivory: [255,255,240], khaki: [240,230,140], lavender: [230,230,250], lavenderblush: [255,240,245], lawngreen: [124,252,0], lemonchiffon: [255,250,205], lightblue: [173,216,230], lightcoral: [240,128,128], lightcyan: [224,255,255], lightgoldenrodyellow: [250,250,210], lightgray: [211,211,211], lightgreen: [144,238,144], lightgrey: [211,211,211], lightpink: [255,182,193], lightsalmon: [255,160,122], lightseagreen: [32,178,170], lightskyblue: [135,206,250], lightslategray: [119,136,153], lightslategrey: [119,136,153], lightsteelblue: [176,196,222], lightyellow: [255,255,224], lime: [0,255,0], limegreen: [50,205,50], linen: [250,240,230], magenta: [255,0,255], maroon: [128,0,0], mediumaquamarine: [102,205,170], mediumblue: [0,0,205], mediumorchid: [186,85,211], mediumpurple: [147,112,219], mediumseagreen: [60,179,113], mediumslateblue: [123,104,238], mediumspringgreen: [0,250,154], mediumturquoise: [72,209,204], mediumvioletred: [199,21,133], midnightblue: [25,25,112], mintcream: [245,255,250], mistyrose: [255,228,225], moccasin: [255,228,181], navajowhite: [255,222,173], navy: [0,0,128], oldlace: [253,245,230], olive: [128,128,0], olivedrab: [107,142,35], orange: [255,165,0], orangered: [255,69,0], orchid: [218,112,214], palegoldenrod: [238,232,170], palegreen: [152,251,152], paleturquoise: [175,238,238], palevioletred: [219,112,147], papayawhip: [255,239,213], peachpuff: [255,218,185], peru: [205,133,63], pink: [255,192,203], plum: [221,160,221], powderblue: [176,224,230], purple: [128,0,128], rebeccapurple: [102, 51, 153], red: [255,0,0], rosybrown: [188,143,143], royalblue: [65,105,225], saddlebrown: [139,69,19], salmon: [250,128,114], sandybrown: [244,164,96], seagreen: [46,139,87], seashell: [255,245,238], sienna: [160,82,45], silver: [192,192,192], skyblue: [135,206,235], slateblue: [106,90,205], slategray: [112,128,144], slategrey: [112,128,144], snow: [255,250,250], springgreen: [0,255,127], steelblue: [70,130,180], tan: [210,180,140], teal: [0,128,128], thistle: [216,191,216], tomato: [255,99,71], turquoise: [64,224,208], violet: [238,130,238], wheat: [245,222,179], white: [255,255,255], whitesmoke: [245,245,245], yellow: [255,255,0], yellowgreen: [154,205,50] }; var reverseKeywords = {}; for (var key in cssKeywords) { reverseKeywords[JSON.stringify(cssKeywords[key])] = key; } },{}],5:[function(require,module,exports){ var conversions = require(4); var convert = function() { return new Converter(); } for (var func in conversions) { // export Raw versions convert[func + "Raw"] = (function(func) { // accept array or plain args return function(arg) { if (typeof arg == "number") arg = Array.prototype.slice.call(arguments); return conversions[func](arg); } })(func); var pair = /(\w+)2(\w+)/.exec(func), from = pair[1], to = pair[2]; // export rgb2hsl and ["rgb"]["hsl"] convert[from] = convert[from] || {}; convert[from][to] = convert[func] = (function(func) { return function(arg) { if (typeof arg == "number") arg = Array.prototype.slice.call(arguments); var val = conversions[func](arg); if (typeof val == "string" || val === undefined) return val; // keyword for (var i = 0; i < val.length; i++) val[i] = Math.round(val[i]); return val; } })(func); } /* Converter does lazy conversion and caching */ var Converter = function() { this.convs = {}; }; /* Either get the values for a space or set the values for a space, depending on args */ Converter.prototype.routeSpace = function(space, args) { var values = args[0]; if (values === undefined) { // color.rgb() return this.getValues(space); } // color.rgb(10, 10, 10) if (typeof values == "number") { values = Array.prototype.slice.call(args); } return this.setValues(space, values); }; /* Set the values for a space, invalidating cache */ Converter.prototype.setValues = function(space, values) { this.space = space; this.convs = {}; this.convs[space] = values; return this; }; /* Get the values for a space. If there's already a conversion for the space, fetch it, otherwise compute it */ Converter.prototype.getValues = function(space) { var vals = this.convs[space]; if (!vals) { var fspace = this.space, from = this.convs[fspace]; vals = convert[fspace][space](from); this.convs[space] = vals; } return vals; }; ["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { Converter.prototype[space] = function(vals) { return this.routeSpace(space, arguments); } }); module.exports = convert; },{"4":4}],6:[function(require,module,exports){ 'use strict' module.exports = { "aliceblue": [240, 248, 255], "antiquewhite": [250, 235, 215], "aqua": [0, 255, 255], "aquamarine": [127, 255, 212], "azure": [240, 255, 255], "beige": [245, 245, 220], "bisque": [255, 228, 196], "black": [0, 0, 0], "blanchedalmond": [255, 235, 205], "blue": [0, 0, 255], "blueviolet": [138, 43, 226], "brown": [165, 42, 42], "burlywood": [222, 184, 135], "cadetblue": [95, 158, 160], "chartreuse": [127, 255, 0], "chocolate": [210, 105, 30], "coral": [255, 127, 80], "cornflowerblue": [100, 149, 237], "cornsilk": [255, 248, 220], "crimson": [220, 20, 60], "cyan": [0, 255, 255], "darkblue": [0, 0, 139], "darkcyan": [0, 139, 139], "darkgoldenrod": [184, 134, 11], "darkgray": [169, 169, 169], "darkgreen": [0, 100, 0], "darkgrey": [169, 169, 169], "darkkhaki": [189, 183, 107], "darkmagenta": [139, 0, 139], "darkolivegreen": [85, 107, 47], "darkorange": [255, 140, 0], "darkorchid": [153, 50, 204], "darkred": [139, 0, 0], "darksalmon": [233, 150, 122], "darkseagreen": [143, 188, 143], "darkslateblue": [72, 61, 139], "darkslategray": [47, 79, 79], "darkslategrey": [47, 79, 79], "darkturquoise": [0, 206, 209], "darkviolet": [148, 0, 211], "deeppink": [255, 20, 147], "deepskyblue": [0, 191, 255], "dimgray": [105, 105, 105], "dimgrey": [105, 105, 105], "dodgerblue": [30, 144, 255], "firebrick": [178, 34, 34], "floralwhite": [255, 250, 240], "forestgreen": [34, 139, 34], "fuchsia": [255, 0, 255], "gainsboro": [220, 220, 220], "ghostwhite": [248, 248, 255], "gold": [255, 215, 0], "goldenrod": [218, 165, 32], "gray": [128, 128, 128], "green": [0, 128, 0], "greenyellow": [173, 255, 47], "grey": [128, 128, 128], "honeydew": [240, 255, 240], "hotpink": [255, 105, 180], "indianred": [205, 92, 92], "indigo": [75, 0, 130], "ivory": [255, 255, 240], "khaki": [240, 230, 140], "lavender": [230, 230, 250], "lavenderblush": [255, 240, 245], "lawngreen": [124, 252, 0], "lemonchiffon": [255, 250, 205], "lightblue": [173, 216, 230], "lightcoral": [240, 128, 128], "lightcyan": [224, 255, 255], "lightgoldenrodyellow": [250, 250, 210], "lightgray": [211, 211, 211], "lightgreen": [144, 238, 144], "lightgrey": [211, 211, 211], "lightpink": [255, 182, 193], "lightsalmon": [255, 160, 122], "lightseagreen": [32, 178, 170], "lightskyblue": [135, 206, 250], "lightslategray": [119, 136, 153], "lightslategrey": [119, 136, 153], "lightsteelblue": [176, 196, 222], "lightyellow": [255, 255, 224], "lime": [0, 255, 0], "limegreen": [50, 205, 50], "linen": [250, 240, 230], "magenta": [255, 0, 255], "maroon": [128, 0, 0], "mediumaquamarine": [102, 205, 170], "mediumblue": [0, 0, 205], "mediumorchid": [186, 85, 211], "mediumpurple": [147, 112, 219], "mediumseagreen": [60, 179, 113], "mediumslateblue": [123, 104, 238], "mediumspringgreen": [0, 250, 154], "mediumturquoise": [72, 209, 204], "mediumvioletred": [199, 21, 133], "midnightblue": [25, 25, 112], "mintcream": [245, 255, 250], "mistyrose": [255, 228, 225], "moccasin": [255, 228, 181], "navajowhite": [255, 222, 173], "navy": [0, 0, 128], "oldlace": [253, 245, 230], "olive": [128, 128, 0], "olivedrab": [107, 142, 35], "orange": [255, 165, 0], "orangered": [255, 69, 0], "orchid": [218, 112, 214], "palegoldenrod": [238, 232, 170], "palegreen": [152, 251, 152], "paleturquoise": [175, 238, 238], "palevioletred": [219, 112, 147], "papayawhip": [255, 239, 213], "peachpuff": [255, 218, 185], "peru": [205, 133, 63], "pink": [255, 192, 203], "plum": [221, 160, 221], "powderblue": [176, 224, 230], "purple": [128, 0, 128], "rebeccapurple": [102, 51, 153], "red": [255, 0, 0], "rosybrown": [188, 143, 143], "royalblue": [65, 105, 225], "saddlebrown": [139, 69, 19], "salmon": [250, 128, 114], "sandybrown": [244, 164, 96], "seagreen": [46, 139, 87], "seashell": [255, 245, 238], "sienna": [160, 82, 45], "silver": [192, 192, 192], "skyblue": [135, 206, 235], "slateblue": [106, 90, 205], "slategray": [112, 128, 144], "slategrey": [112, 128, 144], "snow": [255, 250, 250], "springgreen": [0, 255, 127], "steelblue": [70, 130, 180], "tan": [210, 180, 140], "teal": [0, 128, 128], "thistle": [216, 191, 216], "tomato": [255, 99, 71], "turquoise": [64, 224, 208], "violet": [238, 130, 238], "wheat": [245, 222, 179], "white": [255, 255, 255], "whitesmoke": [245, 245, 245], "yellow": [255, 255, 0], "yellowgreen": [154, 205, 50] }; },{}],7:[function(require,module,exports){ /** * @namespace Chart */ var Chart = require(29)(); Chart.helpers = require(45); // @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! require(27)(Chart); Chart.defaults = require(25); Chart.Element = require(26); Chart.elements = require(40); Chart.Interaction = require(28); Chart.platform = require(48); require(31)(Chart); require(22)(Chart); require(23)(Chart); require(24)(Chart); require(30)(Chart); require(33)(Chart); require(32)(Chart); require(35)(Chart); require(54)(Chart); require(52)(Chart); require(53)(Chart); require(55)(Chart); require(56)(Chart); require(57)(Chart); // Controllers must be loaded after elements // See Chart.core.datasetController.dataElementType require(15)(Chart); require(16)(Chart); require(17)(Chart); require(18)(Chart); require(19)(Chart); require(20)(Chart); require(21)(Chart); require(8)(Chart); require(9)(Chart); require(10)(Chart); require(11)(Chart); require(12)(Chart); require(13)(Chart); require(14)(Chart); // Loading built-it plugins var plugins = []; plugins.push( require(49)(Chart), require(50)(Chart), require(51)(Chart) ); Chart.plugins.register(plugins); Chart.platform.initialize(); module.exports = Chart; if (typeof window !== 'undefined') { window.Chart = Chart; } // DEPRECATIONS /** * Provided for backward compatibility, use Chart.helpers.canvas instead. * @namespace Chart.canvasHelpers * @deprecated since version 2.6.0 * @todo remove at version 3 * @private */ Chart.canvasHelpers = Chart.helpers.canvas; },{"10":10,"11":11,"12":12,"13":13,"14":14,"15":15,"16":16,"17":17,"18":18,"19":19,"20":20,"21":21,"22":22,"23":23,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29,"30":30,"31":31,"32":32,"33":33,"35":35,"40":40,"45":45,"48":48,"49":49,"50":50,"51":51,"52":52,"53":53,"54":54,"55":55,"56":56,"57":57,"8":8,"9":9}],8:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.Bar = function(context, config) { config.type = 'bar'; return new Chart(context, config); }; }; },{}],9:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.Bubble = function(context, config) { config.type = 'bubble'; return new Chart(context, config); }; }; },{}],10:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.Doughnut = function(context, config) { config.type = 'doughnut'; return new Chart(context, config); }; }; },{}],11:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.Line = function(context, config) { config.type = 'line'; return new Chart(context, config); }; }; },{}],12:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.PolarArea = function(context, config) { config.type = 'polarArea'; return new Chart(context, config); }; }; },{}],13:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.Radar = function(context, config) { config.type = 'radar'; return new Chart(context, config); }; }; },{}],14:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.Scatter = function(context, config) { config.type = 'scatter'; return new Chart(context, config); }; }; },{}],15:[function(require,module,exports){ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('bar', { hover: { mode: 'label' }, scales: { xAxes: [{ type: 'category', // Specific to Bar Controller categoryPercentage: 0.8, barPercentage: 0.9, // offset settings offset: true, // grid line settings gridLines: { offsetGridLines: true } }], yAxes: [{ type: 'linear' }] } }); defaults._set('horizontalBar', { hover: { mode: 'index', axis: 'y' }, scales: { xAxes: [{ type: 'linear', position: 'bottom' }], yAxes: [{ position: 'left', type: 'category', // Specific to Horizontal Bar Controller categoryPercentage: 0.8, barPercentage: 0.9, // offset settings offset: true, // grid line settings gridLines: { offsetGridLines: true } }] }, elements: { rectangle: { borderSkipped: 'left' } }, tooltips: { callbacks: { title: function(item, data) { // Pick first xLabel for now var title = ''; if (item.length > 0) { if (item[0].yLabel) { title = item[0].yLabel; } else if (data.labels.length > 0 && item[0].index < data.labels.length) { title = data.labels[item[0].index]; } } return title; }, label: function(item, data) { var datasetLabel = data.datasets[item.datasetIndex].label || ''; return datasetLabel + ': ' + item.xLabel; } }, mode: 'index', axis: 'y' } }); module.exports = function(Chart) { Chart.controllers.bar = Chart.DatasetController.extend({ dataElementType: elements.Rectangle, initialize: function() { var me = this; var meta; Chart.DatasetController.prototype.initialize.apply(me, arguments); meta = me.getMeta(); meta.stack = me.getDataset().stack; meta.bar = true; }, update: function(reset) { var me = this; var rects = me.getMeta().data; var i, ilen; me._ruler = me.getRuler(); for (i = 0, ilen = rects.length; i < ilen; ++i) { me.updateElement(rects[i], i, reset); } }, updateElement: function(rectangle, index, reset) { var me = this; var chart = me.chart; var meta = me.getMeta(); var dataset = me.getDataset(); var custom = rectangle.custom || {}; var rectangleOptions = chart.options.elements.rectangle; rectangle._xScale = me.getScaleForId(meta.xAxisID); rectangle._yScale = me.getScaleForId(meta.yAxisID); rectangle._datasetIndex = me.index; rectangle._index = index; rectangle._model = { datasetLabel: dataset.label, label: chart.data.labels[index], borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped, backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor), borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor), borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth) }; me.updateElementGeometry(rectangle, index, reset); rectangle.pivot(); }, /** * @private */ updateElementGeometry: function(rectangle, index, reset) { var me = this; var model = rectangle._model; var vscale = me.getValueScale(); var base = vscale.getBasePixel(); var horizontal = vscale.isHorizontal(); var ruler = me._ruler || me.getRuler(); var vpixels = me.calculateBarValuePixels(me.index, index); var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); model.horizontal = horizontal; model.base = reset ? base : vpixels.base; model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; model.height = horizontal ? ipixels.size : undefined; model.width = horizontal ? undefined : ipixels.size; }, /** * @private */ getValueScaleId: function() { return this.getMeta().yAxisID; }, /** * @private */ getIndexScaleId: function() { return this.getMeta().xAxisID; }, /** * @private */ getValueScale: function() { return this.getScaleForId(this.getValueScaleId()); }, /** * @private */ getIndexScale: function() { return this.getScaleForId(this.getIndexScaleId()); }, /** * Returns the effective number of stacks based on groups and bar visibility. * @private */ getStackCount: function(last) { var me = this; var chart = me.chart; var scale = me.getIndexScale(); var stacked = scale.options.stacked; var ilen = last === undefined ? chart.data.datasets.length : last + 1; var stacks = []; var i, meta; for (i = 0; i < ilen; ++i) { meta = chart.getDatasetMeta(i); if (meta.bar && chart.isDatasetVisible(i) && (stacked === false || (stacked === true && stacks.indexOf(meta.stack) === -1) || (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { stacks.push(meta.stack); } } return stacks.length; }, /** * Returns the stack index for the given dataset based on groups and bar visibility. * @private */ getStackIndex: function(datasetIndex) { return this.getStackCount(datasetIndex) - 1; }, /** * @private */ getRuler: function() { var me = this; var scale = me.getIndexScale(); var stackCount = me.getStackCount(); var datasetIndex = me.index; var pixels = []; var isHorizontal = scale.isHorizontal(); var start = isHorizontal ? scale.left : scale.top; var end = start + (isHorizontal ? scale.width : scale.height); var i, ilen; for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { pixels.push(scale.getPixelForValue(null, i, datasetIndex)); } return { pixels: pixels, start: start, end: end, stackCount: stackCount, scale: scale }; }, /** * Note: pixel values are not clamped to the scale area. * @private */ calculateBarValuePixels: function(datasetIndex, index) { var me = this; var chart = me.chart; var meta = me.getMeta(); var scale = me.getValueScale(); var datasets = chart.data.datasets; var value = scale.getRightValue(datasets[datasetIndex].data[index]); var stacked = scale.options.stacked; var stack = meta.stack; var start = 0; var i, imeta, ivalue, base, head, size; if (stacked || (stacked === undefined && stack !== undefined)) { for (i = 0; i < datasetIndex; ++i) { imeta = chart.getDatasetMeta(i); if (imeta.bar && imeta.stack === stack && imeta.controller.getValueScaleId() === scale.id && chart.isDatasetVisible(i)) { ivalue = scale.getRightValue(datasets[i].data[index]); if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { start += ivalue; } } } } base = scale.getPixelForValue(start); head = scale.getPixelForValue(start + value); size = (head - base) / 2; return { size: size, base: base, head: head, center: head + size / 2 }; }, /** * @private */ calculateBarIndexPixels: function(datasetIndex, index, ruler) { var me = this; var options = ruler.scale.options; var stackIndex = me.getStackIndex(datasetIndex); var pixels = ruler.pixels; var base = pixels[index]; var length = pixels.length; var start = ruler.start; var end = ruler.end; var leftSampleSize, rightSampleSize, leftCategorySize, rightCategorySize, fullBarSize, size; if (length === 1) { leftSampleSize = base > start ? base - start : end - base; rightSampleSize = base < end ? end - base : base - start; } else { if (index > 0) { leftSampleSize = (base - pixels[index - 1]) / 2; if (index === length - 1) { rightSampleSize = leftSampleSize; } } if (index < length - 1) { rightSampleSize = (pixels[index + 1] - base) / 2; if (index === 0) { leftSampleSize = rightSampleSize; } } } leftCategorySize = leftSampleSize * options.categoryPercentage; rightCategorySize = rightSampleSize * options.categoryPercentage; fullBarSize = (leftCategorySize + rightCategorySize) / ruler.stackCount; size = fullBarSize * options.barPercentage; size = Math.min( helpers.valueOrDefault(options.barThickness, size), helpers.valueOrDefault(options.maxBarThickness, Infinity)); base -= leftCategorySize; base += fullBarSize * stackIndex; base += (fullBarSize - size) / 2; return { size: size, base: base, head: base + size, center: base + size / 2 }; }, draw: function() { var me = this; var chart = me.chart; var scale = me.getValueScale(); var rects = me.getMeta().data; var dataset = me.getDataset(); var ilen = rects.length; var i = 0; helpers.canvas.clipArea(chart.ctx, chart.chartArea); for (; i < ilen; ++i) { if (!isNaN(scale.getRightValue(dataset.data[i]))) { rects[i].draw(); } } helpers.canvas.unclipArea(chart.ctx); }, setHoverStyle: function(rectangle) { var dataset = this.chart.data.datasets[rectangle._datasetIndex]; var index = rectangle._index; var custom = rectangle.custom || {}; var model = rectangle._model; model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor)); model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); }, removeHoverStyle: function(rectangle) { var dataset = this.chart.data.datasets[rectangle._datasetIndex]; var index = rectangle._index; var custom = rectangle.custom || {}; var model = rectangle._model; var rectangleElementOptions = this.chart.options.elements.rectangle; model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor); model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor); model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth); } }); Chart.controllers.horizontalBar = Chart.controllers.bar.extend({ /** * @private */ getValueScaleId: function() { return this.getMeta().xAxisID; }, /** * @private */ getIndexScaleId: function() { return this.getMeta().yAxisID; } }); }; },{"25":25,"40":40,"45":45}],16:[function(require,module,exports){ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('bubble', { hover: { mode: 'single' }, scales: { xAxes: [{ type: 'linear', // bubble should probably use a linear scale by default position: 'bottom', id: 'x-axis-0' // need an ID so datasets can reference the scale }], yAxes: [{ type: 'linear', position: 'left', id: 'y-axis-0' }] }, tooltips: { callbacks: { title: function() { // Title doesn't make sense for scatter since we format the data as a point return ''; }, label: function(item, data) { var datasetLabel = data.datasets[item.datasetIndex].label || ''; var dataPoint = data.datasets[item.datasetIndex].data[item.index]; return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; } } } }); module.exports = function(Chart) { Chart.controllers.bubble = Chart.DatasetController.extend({ /** * @protected */ dataElementType: elements.Point, /** * @protected */ update: function(reset) { var me = this; var meta = me.getMeta(); var points = meta.data; // Update Points helpers.each(points, function(point, index) { me.updateElement(point, index, reset); }); }, /** * @protected */ updateElement: function(point, index, reset) { var me = this; var meta = me.getMeta(); var custom = point.custom || {}; var xScale = me.getScaleForId(meta.xAxisID); var yScale = me.getScaleForId(meta.yAxisID); var options = me._resolveElementOptions(point, index); var data = me.getDataset().data[index]; var dsIndex = me.index; var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); point._xScale = xScale; point._yScale = yScale; point._options = options; point._datasetIndex = dsIndex; point._index = index; point._model = { backgroundColor: options.backgroundColor, borderColor: options.borderColor, borderWidth: options.borderWidth, hitRadius: options.hitRadius, pointStyle: options.pointStyle, radius: reset ? 0 : options.radius, skip: custom.skip || isNaN(x) || isNaN(y), x: x, y: y, }; point.pivot(); }, /** * @protected */ setHoverStyle: function(point) { var model = point._model; var options = point._options; model.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor)); model.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor)); model.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth); model.radius = options.radius + options.hoverRadius; }, /** * @protected */ removeHoverStyle: function(point) { var model = point._model; var options = point._options; model.backgroundColor = options.backgroundColor; model.borderColor = options.borderColor; model.borderWidth = options.borderWidth; model.radius = options.radius; }, /** * @private */ _resolveElementOptions: function(point, index) { var me = this; var chart = me.chart; var datasets = chart.data.datasets; var dataset = datasets[me.index]; var custom = point.custom || {}; var options = chart.options.elements.point; var resolve = helpers.options.resolve; var data = dataset.data[index]; var values = {}; var i, ilen, key; // Scriptable options var context = { chart: chart, dataIndex: index, dataset: dataset, datasetIndex: me.index }; var keys = [ 'backgroundColor', 'borderColor', 'borderWidth', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth', 'hoverRadius', 'hitRadius', 'pointStyle' ]; for (i = 0, ilen = keys.length; i < ilen; ++i) { key = keys[i]; values[key] = resolve([ custom[key], dataset[key], options[key] ], context, index); } // Custom radius resolution values.radius = resolve([ custom.radius, data ? data.r : undefined, dataset.radius, options.radius ], context, index); return values; } }); }; },{"25":25,"40":40,"45":45}],17:[function(require,module,exports){ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('doughnut', { animation: { // Boolean - Whether we animate the rotation of the Doughnut animateRotate: true, // Boolean - Whether we animate scaling the Doughnut from the centre animateScale: false }, hover: { mode: 'single' }, legendCallback: function(chart) { var text = []; text.push('
    '); var data = chart.data; var datasets = data.datasets; var labels = data.labels; if (datasets.length) { for (var i = 0; i < datasets[0].data.length; ++i) { text.push('
  • '); if (labels[i]) { text.push(labels[i]); } text.push('
  • '); } } text.push('
'); return text.join(''); }, legend: { labels: { generateLabels: function(chart) { var data = chart.data; if (data.labels.length && data.datasets.length) { return data.labels.map(function(label, i) { var meta = chart.getDatasetMeta(0); var ds = data.datasets[0]; var arc = meta.data[i]; var custom = arc && arc.custom || {}; var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; var arcOpts = chart.options.elements.arc; var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); return { text: label, fillStyle: fill, strokeStyle: stroke, lineWidth: bw, hidden: isNaN(ds.data[i]) || meta.data[i].hidden, // Extra data used for toggling the correct item index: i }; }); } return []; } }, onClick: function(e, legendItem) { var index = legendItem.index; var chart = this.chart; var i, ilen, meta; for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { meta = chart.getDatasetMeta(i); // toggle visibility of index if exists if (meta.data[index]) { meta.data[index].hidden = !meta.data[index].hidden; } } chart.update(); } }, // The percentage of the chart that we cut out of the middle. cutoutPercentage: 50, // The rotation of the chart, where the first data arc begins. rotation: Math.PI * -0.5, // The total circumference of the chart. circumference: Math.PI * 2.0, // Need to override these to give a nice default tooltips: { callbacks: { title: function() { return ''; }, label: function(tooltipItem, data) { var dataLabel = data.labels[tooltipItem.index]; var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; if (helpers.isArray(dataLabel)) { // show value on first line of multiline label // need to clone because we are changing the value dataLabel = dataLabel.slice(); dataLabel[0] += value; } else { dataLabel += value; } return dataLabel; } } } }); defaults._set('pie', helpers.clone(defaults.doughnut)); defaults._set('pie', { cutoutPercentage: 0 }); module.exports = function(Chart) { Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({ dataElementType: elements.Arc, linkScales: helpers.noop, // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly getRingIndex: function(datasetIndex) { var ringIndex = 0; for (var j = 0; j < datasetIndex; ++j) { if (this.chart.isDatasetVisible(j)) { ++ringIndex; } } return ringIndex; }, update: function(reset) { var me = this; var chart = me.chart; var chartArea = chart.chartArea; var opts = chart.options; var arcOpts = opts.elements.arc; var availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth; var availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth; var minSize = Math.min(availableWidth, availableHeight); var offset = {x: 0, y: 0}; var meta = me.getMeta(); var cutoutPercentage = opts.cutoutPercentage; var circumference = opts.circumference; // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc if (circumference < Math.PI * 2.0) { var startAngle = opts.rotation % (Math.PI * 2.0); startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); var endAngle = startAngle + circumference; var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); var cutout = cutoutPercentage / 100.0; var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; minSize = Math.min(availableWidth / size.width, availableHeight / size.height); offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; } chart.borderWidth = me.getMaxBorderWidth(meta.data); chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); chart.offsetX = offset.x * chart.outerRadius; chart.offsetY = offset.y * chart.outerRadius; meta.total = me.calculateTotal(); me.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index)); me.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0); helpers.each(meta.data, function(arc, index) { me.updateElement(arc, index, reset); }); }, updateElement: function(arc, index, reset) { var me = this; var chart = me.chart; var chartArea = chart.chartArea; var opts = chart.options; var animationOpts = opts.animation; var centerX = (chartArea.left + chartArea.right) / 2; var centerY = (chartArea.top + chartArea.bottom) / 2; var startAngle = opts.rotation; // non reset case handled later var endAngle = opts.rotation; // non reset case handled later var dataset = me.getDataset(); var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; helpers.extend(arc, { // Utility _datasetIndex: me.index, _index: index, // Desired view properties _model: { x: centerX + chart.offsetX, y: centerY + chart.offsetY, startAngle: startAngle, endAngle: endAngle, circumference: circumference, outerRadius: outerRadius, innerRadius: innerRadius, label: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) } }); var model = arc._model; // Resets the visual styles this.removeHoverStyle(arc); // Set correct angles if not resetting if (!reset || !animationOpts.animateRotate) { if (index === 0) { model.startAngle = opts.rotation; } else { model.startAngle = me.getMeta().data[index - 1]._model.endAngle; } model.endAngle = model.startAngle + model.circumference; } arc.pivot(); }, removeHoverStyle: function(arc) { Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); }, calculateTotal: function() { var dataset = this.getDataset(); var meta = this.getMeta(); var total = 0; var value; helpers.each(meta.data, function(element, index) { value = dataset.data[index]; if (!isNaN(value) && !element.hidden) { total += Math.abs(value); } }); /* if (total === 0) { total = NaN; }*/ return total; }, calculateCircumference: function(value) { var total = this.getMeta().total; if (total > 0 && !isNaN(value)) { return (Math.PI * 2.0) * (value / total); } return 0; }, // gets the max border or hover width to properly scale pie charts getMaxBorderWidth: function(arcs) { var max = 0; var index = this.index; var length = arcs.length; var borderWidth; var hoverWidth; for (var i = 0; i < length; i++) { borderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0; hoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0; max = borderWidth > max ? borderWidth : max; max = hoverWidth > max ? hoverWidth : max; } return max; } }); }; },{"25":25,"40":40,"45":45}],18:[function(require,module,exports){ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('line', { showLines: true, spanGaps: false, hover: { mode: 'label' }, scales: { xAxes: [{ type: 'category', id: 'x-axis-0' }], yAxes: [{ type: 'linear', id: 'y-axis-0' }] } }); module.exports = function(Chart) { function lineEnabled(dataset, options) { return helpers.valueOrDefault(dataset.showLine, options.showLines); } Chart.controllers.line = Chart.DatasetController.extend({ datasetElementType: elements.Line, dataElementType: elements.Point, update: function(reset) { var me = this; var meta = me.getMeta(); var line = meta.dataset; var points = meta.data || []; var options = me.chart.options; var lineElementOptions = options.elements.line; var scale = me.getScaleForId(meta.yAxisID); var i, ilen, custom; var dataset = me.getDataset(); var showLine = lineEnabled(dataset, options); // Update Line if (showLine) { custom = line.custom || {}; // Compatibility: If the properties are defined with only the old name, use those values if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { dataset.lineTension = dataset.tension; } // Utility line._scale = scale; line._datasetIndex = me.index; // Data line._children = points; // Model line._model = { // Appearance // The default behavior of lines is to break at null values, according // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 // This option gives lines the ability to span gaps spanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps, tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension), backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), steppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped), cubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode), }; line.pivot(); } // Update Points for (i = 0, ilen = points.length; i < ilen; ++i) { me.updateElement(points[i], i, reset); } if (showLine && line._model.tension !== 0) { me.updateBezierControlPoints(); } // Now pivot the point for animation for (i = 0, ilen = points.length; i < ilen; ++i) { points[i].pivot(); } }, getPointBackgroundColor: function(point, index) { var backgroundColor = this.chart.options.elements.point.backgroundColor; var dataset = this.getDataset(); var custom = point.custom || {}; if (custom.backgroundColor) { backgroundColor = custom.backgroundColor; } else if (dataset.pointBackgroundColor) { backgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor); } else if (dataset.backgroundColor) { backgroundColor = dataset.backgroundColor; } return backgroundColor; }, getPointBorderColor: function(point, index) { var borderColor = this.chart.options.elements.point.borderColor; var dataset = this.getDataset(); var custom = point.custom || {}; if (custom.borderColor) { borderColor = custom.borderColor; } else if (dataset.pointBorderColor) { borderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor); } else if (dataset.borderColor) { borderColor = dataset.borderColor; } return borderColor; }, getPointBorderWidth: function(point, index) { var borderWidth = this.chart.options.elements.point.borderWidth; var dataset = this.getDataset(); var custom = point.custom || {}; if (!isNaN(custom.borderWidth)) { borderWidth = custom.borderWidth; } else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) { borderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth); } else if (!isNaN(dataset.borderWidth)) { borderWidth = dataset.borderWidth; } return borderWidth; }, updateElement: function(point, index, reset) { var me = this; var meta = me.getMeta(); var custom = point.custom || {}; var dataset = me.getDataset(); var datasetIndex = me.index; var value = dataset.data[index]; var yScale = me.getScaleForId(meta.yAxisID); var xScale = me.getScaleForId(meta.xAxisID); var pointOptions = me.chart.options.elements.point; var x, y; // Compatibility: If the properties are defined with only the old name, use those values if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { dataset.pointRadius = dataset.radius; } if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) { dataset.pointHitRadius = dataset.hitRadius; } x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); // Utility point._xScale = xScale; point._yScale = yScale; point._datasetIndex = datasetIndex; point._index = index; // Desired view properties point._model = { x: x, y: y, skip: custom.skip || isNaN(x) || isNaN(y), // Appearance radius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius), pointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle), backgroundColor: me.getPointBackgroundColor(point, index), borderColor: me.getPointBorderColor(point, index), borderWidth: me.getPointBorderWidth(point, index), tension: meta.dataset._model ? meta.dataset._model.tension : 0, steppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false, // Tooltip hitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius) }; }, calculatePointY: function(value, index, datasetIndex) { var me = this; var chart = me.chart; var meta = me.getMeta(); var yScale = me.getScaleForId(meta.yAxisID); var sumPos = 0; var sumNeg = 0; var i, ds, dsMeta; if (yScale.options.stacked) { for (i = 0; i < datasetIndex; i++) { ds = chart.data.datasets[i]; dsMeta = chart.getDatasetMeta(i); if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); if (stackedRightValue < 0) { sumNeg += stackedRightValue || 0; } else { sumPos += stackedRightValue || 0; } } } var rightValue = Number(yScale.getRightValue(value)); if (rightValue < 0) { return yScale.getPixelForValue(sumNeg + rightValue); } return yScale.getPixelForValue(sumPos + rightValue); } return yScale.getPixelForValue(value); }, updateBezierControlPoints: function() { var me = this; var meta = me.getMeta(); var area = me.chart.chartArea; var points = (meta.data || []); var i, ilen, point, model, controlPoints; // Only consider points that are drawn in case the spanGaps option is used if (meta.dataset._model.spanGaps) { points = points.filter(function(pt) { return !pt._model.skip; }); } function capControlPoint(pt, min, max) { return Math.max(Math.min(pt, max), min); } if (meta.dataset._model.cubicInterpolationMode === 'monotone') { helpers.splineCurveMonotone(points); } else { for (i = 0, ilen = points.length; i < ilen; ++i) { point = points[i]; model = point._model; controlPoints = helpers.splineCurve( helpers.previousItem(points, i)._model, model, helpers.nextItem(points, i)._model, meta.dataset._model.tension ); model.controlPointPreviousX = controlPoints.previous.x; model.controlPointPreviousY = controlPoints.previous.y; model.controlPointNextX = controlPoints.next.x; model.controlPointNextY = controlPoints.next.y; } } if (me.chart.options.elements.line.capBezierPoints) { for (i = 0, ilen = points.length; i < ilen; ++i) { model = points[i]._model; model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); } } }, draw: function() { var me = this; var chart = me.chart; var meta = me.getMeta(); var points = meta.data || []; var area = chart.chartArea; var ilen = points.length; var i = 0; helpers.canvas.clipArea(chart.ctx, area); if (lineEnabled(me.getDataset(), chart.options)) { meta.dataset.draw(); } helpers.canvas.unclipArea(chart.ctx); // Draw the points for (; i < ilen; ++i) { points[i].draw(area); } }, setHoverStyle: function(point) { // Point var dataset = this.chart.data.datasets[point._datasetIndex]; var index = point._index; var custom = point.custom || {}; var model = point._model; model.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); model.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); model.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor)); model.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth); }, removeHoverStyle: function(point) { var me = this; var dataset = me.chart.data.datasets[point._datasetIndex]; var index = point._index; var custom = point.custom || {}; var model = point._model; // Compatibility: If the properties are defined with only the old name, use those values if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { dataset.pointRadius = dataset.radius; } model.radius = custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius); model.backgroundColor = me.getPointBackgroundColor(point, index); model.borderColor = me.getPointBorderColor(point, index); model.borderWidth = me.getPointBorderWidth(point, index); } }); }; },{"25":25,"40":40,"45":45}],19:[function(require,module,exports){ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('polarArea', { scale: { type: 'radialLinear', angleLines: { display: false }, gridLines: { circular: true }, pointLabels: { display: false }, ticks: { beginAtZero: true } }, // Boolean - Whether to animate the rotation of the chart animation: { animateRotate: true, animateScale: true }, startAngle: -0.5 * Math.PI, legendCallback: function(chart) { var text = []; text.push('
    '); var data = chart.data; var datasets = data.datasets; var labels = data.labels; if (datasets.length) { for (var i = 0; i < datasets[0].data.length; ++i) { text.push('
  • '); if (labels[i]) { text.push(labels[i]); } text.push('
  • '); } } text.push('
'); return text.join(''); }, legend: { labels: { generateLabels: function(chart) { var data = chart.data; if (data.labels.length && data.datasets.length) { return data.labels.map(function(label, i) { var meta = chart.getDatasetMeta(0); var ds = data.datasets[0]; var arc = meta.data[i]; var custom = arc.custom || {}; var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; var arcOpts = chart.options.elements.arc; var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); return { text: label, fillStyle: fill, strokeStyle: stroke, lineWidth: bw, hidden: isNaN(ds.data[i]) || meta.data[i].hidden, // Extra data used for toggling the correct item index: i }; }); } return []; } }, onClick: function(e, legendItem) { var index = legendItem.index; var chart = this.chart; var i, ilen, meta; for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { meta = chart.getDatasetMeta(i); meta.data[index].hidden = !meta.data[index].hidden; } chart.update(); } }, // Need to override these to give a nice default tooltips: { callbacks: { title: function() { return ''; }, label: function(item, data) { return data.labels[item.index] + ': ' + item.yLabel; } } } }); module.exports = function(Chart) { Chart.controllers.polarArea = Chart.DatasetController.extend({ dataElementType: elements.Arc, linkScales: helpers.noop, update: function(reset) { var me = this; var chart = me.chart; var chartArea = chart.chartArea; var meta = me.getMeta(); var opts = chart.options; var arcOpts = opts.elements.arc; var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); chart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0); chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); me.innerRadius = me.outerRadius - chart.radiusLength; meta.count = me.countVisibleElements(); helpers.each(meta.data, function(arc, index) { me.updateElement(arc, index, reset); }); }, updateElement: function(arc, index, reset) { var me = this; var chart = me.chart; var dataset = me.getDataset(); var opts = chart.options; var animationOpts = opts.animation; var scale = chart.scale; var labels = chart.data.labels; var circumference = me.calculateCircumference(dataset.data[index]); var centerX = scale.xCenter; var centerY = scale.yCenter; // If there is NaN data before us, we need to calculate the starting angle correctly. // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data var visibleCount = 0; var meta = me.getMeta(); for (var i = 0; i < index; ++i) { if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) { ++visibleCount; } } // var negHalfPI = -0.5 * Math.PI; var datasetStartAngle = opts.startAngle; var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); var startAngle = datasetStartAngle + (circumference * visibleCount); var endAngle = startAngle + (arc.hidden ? 0 : circumference); var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); helpers.extend(arc, { // Utility _datasetIndex: me.index, _index: index, _scale: scale, // Desired view properties _model: { x: centerX, y: centerY, innerRadius: 0, outerRadius: reset ? resetRadius : distance, startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, label: helpers.valueAtIndexOrDefault(labels, index, labels[index]) } }); // Apply border and fill style me.removeHoverStyle(arc); arc.pivot(); }, removeHoverStyle: function(arc) { Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); }, countVisibleElements: function() { var dataset = this.getDataset(); var meta = this.getMeta(); var count = 0; helpers.each(meta.data, function(element, index) { if (!isNaN(dataset.data[index]) && !element.hidden) { count++; } }); return count; }, calculateCircumference: function(value) { var count = this.getMeta().count; if (count > 0 && !isNaN(value)) { return (2 * Math.PI) / count; } return 0; } }); }; },{"25":25,"40":40,"45":45}],20:[function(require,module,exports){ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('radar', { scale: { type: 'radialLinear' }, elements: { line: { tension: 0 // no bezier in radar } } }); module.exports = function(Chart) { Chart.controllers.radar = Chart.DatasetController.extend({ datasetElementType: elements.Line, dataElementType: elements.Point, linkScales: helpers.noop, update: function(reset) { var me = this; var meta = me.getMeta(); var line = meta.dataset; var points = meta.data; var custom = line.custom || {}; var dataset = me.getDataset(); var lineElementOptions = me.chart.options.elements.line; var scale = me.chart.scale; // Compatibility: If the properties are defined with only the old name, use those values if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { dataset.lineTension = dataset.tension; } helpers.extend(meta.dataset, { // Utility _datasetIndex: me.index, _scale: scale, // Data _children: points, _loop: true, // Model _model: { // Appearance tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension), backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), } }); meta.dataset.pivot(); // Update Points helpers.each(points, function(point, index) { me.updateElement(point, index, reset); }, me); // Update bezier control points me.updateBezierControlPoints(); }, updateElement: function(point, index, reset) { var me = this; var custom = point.custom || {}; var dataset = me.getDataset(); var scale = me.chart.scale; var pointElementOptions = me.chart.options.elements.point; var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); // Compatibility: If the properties are defined with only the old name, use those values if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { dataset.pointRadius = dataset.radius; } if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) { dataset.pointHitRadius = dataset.hitRadius; } helpers.extend(point, { // Utility _datasetIndex: me.index, _index: index, _scale: scale, // Desired view properties _model: { x: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales y: reset ? scale.yCenter : pointPosition.y, // Appearance tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension), radius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius), backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor), borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor), borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth), pointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle), // Tooltip hitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius) } }); point._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y)); }, updateBezierControlPoints: function() { var chartArea = this.chart.chartArea; var meta = this.getMeta(); helpers.each(meta.data, function(point, index) { var model = point._model; var controlPoints = helpers.splineCurve( helpers.previousItem(meta.data, index, true)._model, model, helpers.nextItem(meta.data, index, true)._model, model.tension ); // Prevent the bezier going outside of the bounds of the graph model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left); model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top); model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left); model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top); // Now pivot the point for animation point.pivot(); }); }, setHoverStyle: function(point) { // Point var dataset = this.chart.data.datasets[point._datasetIndex]; var custom = point.custom || {}; var index = point._index; var model = point._model; model.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor)); model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth); }, removeHoverStyle: function(point) { var dataset = this.chart.data.datasets[point._datasetIndex]; var custom = point.custom || {}; var index = point._index; var model = point._model; var pointElementOptions = this.chart.options.elements.point; model.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius); model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor); model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor); model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth); } }); }; },{"25":25,"40":40,"45":45}],21:[function(require,module,exports){ 'use strict'; var defaults = require(25); defaults._set('scatter', { hover: { mode: 'single' }, scales: { xAxes: [{ id: 'x-axis-1', // need an ID so datasets can reference the scale type: 'linear', // scatter should not use a category axis position: 'bottom' }], yAxes: [{ id: 'y-axis-1', type: 'linear', position: 'left' }] }, showLines: false, tooltips: { callbacks: { title: function() { return ''; // doesn't make sense for scatter since data are formatted as a point }, label: function(item) { return '(' + item.xLabel + ', ' + item.yLabel + ')'; } } } }); module.exports = function(Chart) { // Scatter charts use line controllers Chart.controllers.scatter = Chart.controllers.line; }; },{"25":25}],22:[function(require,module,exports){ /* global window: false */ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); defaults._set('global', { animation: { duration: 1000, easing: 'easeOutQuart', onProgress: helpers.noop, onComplete: helpers.noop } }); module.exports = function(Chart) { Chart.Animation = Element.extend({ chart: null, // the animation associated chart instance currentStep: 0, // the current animation step numSteps: 60, // default number of steps easing: '', // the easing to use for this animation render: null, // render function used by the animation service onAnimationProgress: null, // user specified callback to fire on each step of the animation onAnimationComplete: null, // user specified callback to fire when the animation finishes }); Chart.animationService = { frameDuration: 17, animations: [], dropFrames: 0, request: null, /** * @param {Chart} chart - The chart to animate. * @param {Chart.Animation} animation - The animation that we will animate. * @param {Number} duration - The animation duration in ms. * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions */ addAnimation: function(chart, animation, duration, lazy) { var animations = this.animations; var i, ilen; animation.chart = chart; if (!lazy) { chart.animating = true; } for (i = 0, ilen = animations.length; i < ilen; ++i) { if (animations[i].chart === chart) { animations[i] = animation; return; } } animations.push(animation); // If there are no animations queued, manually kickstart a digest, for lack of a better word if (animations.length === 1) { this.requestAnimationFrame(); } }, cancelAnimation: function(chart) { var index = helpers.findIndex(this.animations, function(animation) { return animation.chart === chart; }); if (index !== -1) { this.animations.splice(index, 1); chart.animating = false; } }, requestAnimationFrame: function() { var me = this; if (me.request === null) { // Skip animation frame requests until the active one is executed. // This can happen when processing mouse events, e.g. 'mousemove' // and 'mouseout' events will trigger multiple renders. me.request = helpers.requestAnimFrame.call(window, function() { me.request = null; me.startDigest(); }); } }, /** * @private */ startDigest: function() { var me = this; var startTime = Date.now(); var framesToDrop = 0; if (me.dropFrames > 1) { framesToDrop = Math.floor(me.dropFrames); me.dropFrames = me.dropFrames % 1; } me.advance(1 + framesToDrop); var endTime = Date.now(); me.dropFrames += (endTime - startTime) / me.frameDuration; // Do we have more stuff to animate? if (me.animations.length > 0) { me.requestAnimationFrame(); } }, /** * @private */ advance: function(count) { var animations = this.animations; var animation, chart; var i = 0; while (i < animations.length) { animation = animations[i]; chart = animation.chart; animation.currentStep = (animation.currentStep || 0) + count; animation.currentStep = Math.min(animation.currentStep, animation.numSteps); helpers.callback(animation.render, [chart, animation], chart); helpers.callback(animation.onAnimationProgress, [animation], chart); if (animation.currentStep >= animation.numSteps) { helpers.callback(animation.onAnimationComplete, [animation], chart); chart.animating = false; animations.splice(i, 1); } else { ++i; } } } }; /** * Provided for backward compatibility, use Chart.Animation instead * @prop Chart.Animation#animationObject * @deprecated since version 2.6.0 * @todo remove at version 3 */ Object.defineProperty(Chart.Animation.prototype, 'animationObject', { get: function() { return this; } }); /** * Provided for backward compatibility, use Chart.Animation#chart instead * @prop Chart.Animation#chartInstance * @deprecated since version 2.6.0 * @todo remove at version 3 */ Object.defineProperty(Chart.Animation.prototype, 'chartInstance', { get: function() { return this.chart; }, set: function(value) { this.chart = value; } }); }; },{"25":25,"26":26,"45":45}],23:[function(require,module,exports){ 'use strict'; var defaults = require(25); var helpers = require(45); var Interaction = require(28); var platform = require(48); module.exports = function(Chart) { var plugins = Chart.plugins; // Create a dictionary of chart types, to allow for extension of existing types Chart.types = {}; // Store a reference to each instance - allowing us to globally resize chart instances on window resize. // Destroy method on the chart will remove the instance of the chart from this reference. Chart.instances = {}; // Controllers available for dataset visualization eg. bar, line, slice, etc. Chart.controllers = {}; /** * Initializes the given config with global and chart default values. */ function initConfig(config) { config = config || {}; // Do NOT use configMerge() for the data object because this method merges arrays // and so would change references to labels and datasets, preventing data updates. var data = config.data = config.data || {}; data.datasets = data.datasets || []; data.labels = data.labels || []; config.options = helpers.configMerge( defaults.global, defaults[config.type], config.options || {}); return config; } /** * Updates the config of the chart * @param chart {Chart} chart to update the options for */ function updateConfig(chart) { var newOptions = chart.options; // Update Scale(s) with options if (newOptions.scale) { chart.scale.options = newOptions.scale; } else if (newOptions.scales) { newOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) { chart.scales[scaleOptions.id].options = scaleOptions; }); } // Tooltip chart.tooltip._options = newOptions.tooltips; } function positionIsHorizontal(position) { return position === 'top' || position === 'bottom'; } helpers.extend(Chart.prototype, /** @lends Chart */ { /** * @private */ construct: function(item, config) { var me = this; config = initConfig(config); var context = platform.acquireContext(item, config); var canvas = context && context.canvas; var height = canvas && canvas.height; var width = canvas && canvas.width; me.id = helpers.uid(); me.ctx = context; me.canvas = canvas; me.config = config; me.width = width; me.height = height; me.aspectRatio = height ? width / height : null; me.options = config.options; me._bufferedRender = false; /** * Provided for backward compatibility, Chart and Chart.Controller have been merged, * the "instance" still need to be defined since it might be called from plugins. * @prop Chart#chart * @deprecated since version 2.6.0 * @todo remove at version 3 * @private */ me.chart = me; me.controller = me; // chart.chart.controller #inception // Add the chart instance to the global namespace Chart.instances[me.id] = me; // Define alias to the config data: `chart.data === chart.config.data` Object.defineProperty(me, 'data', { get: function() { return me.config.data; }, set: function(value) { me.config.data = value; } }); if (!context || !canvas) { // The given item is not a compatible context2d element, let's return before finalizing // the chart initialization but after setting basic chart / controller properties that // can help to figure out that the chart is not valid (e.g chart.canvas !== null); // https://github.com/chartjs/Chart.js/issues/2807 console.error("Failed to create chart: can't acquire context from the given item"); return; } me.initialize(); me.update(); }, /** * @private */ initialize: function() { var me = this; // Before init plugin notification plugins.notify(me, 'beforeInit'); helpers.retinaScale(me, me.options.devicePixelRatio); me.bindEvents(); if (me.options.responsive) { // Initial resize before chart draws (must be silent to preserve initial animations). me.resize(true); } // Make sure scales have IDs and are built before we build any controllers. me.ensureScalesHaveIDs(); me.buildScales(); me.initToolTip(); // After init plugin notification plugins.notify(me, 'afterInit'); return me; }, clear: function() { helpers.canvas.clear(this); return this; }, stop: function() { // Stops any current animation loop occurring Chart.animationService.cancelAnimation(this); return this; }, resize: function(silent) { var me = this; var options = me.options; var canvas = me.canvas; var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; // the canvas render width and height will be casted to integers so make sure that // the canvas display style uses the same integer values to avoid blurring effect. // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collased var newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas))); var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas))); if (me.width === newWidth && me.height === newHeight) { return; } canvas.width = me.width = newWidth; canvas.height = me.height = newHeight; canvas.style.width = newWidth + 'px'; canvas.style.height = newHeight + 'px'; helpers.retinaScale(me, options.devicePixelRatio); if (!silent) { // Notify any plugins about the resize var newSize = {width: newWidth, height: newHeight}; plugins.notify(me, 'resize', [newSize]); // Notify of resize if (me.options.onResize) { me.options.onResize(me, newSize); } me.stop(); me.update(me.options.responsiveAnimationDuration); } }, ensureScalesHaveIDs: function() { var options = this.options; var scalesOptions = options.scales || {}; var scaleOptions = options.scale; helpers.each(scalesOptions.xAxes, function(xAxisOptions, index) { xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); }); helpers.each(scalesOptions.yAxes, function(yAxisOptions, index) { yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); }); if (scaleOptions) { scaleOptions.id = scaleOptions.id || 'scale'; } }, /** * Builds a map of scale ID to scale object for future lookup. */ buildScales: function() { var me = this; var options = me.options; var scales = me.scales = {}; var items = []; if (options.scales) { items = items.concat( (options.scales.xAxes || []).map(function(xAxisOptions) { return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; }), (options.scales.yAxes || []).map(function(yAxisOptions) { return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; }) ); } if (options.scale) { items.push({ options: options.scale, dtype: 'radialLinear', isDefault: true, dposition: 'chartArea' }); } helpers.each(items, function(item) { var scaleOptions = item.options; var scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype); var scaleClass = Chart.scaleService.getScaleConstructor(scaleType); if (!scaleClass) { return; } if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { scaleOptions.position = item.dposition; } var scale = new scaleClass({ id: scaleOptions.id, options: scaleOptions, ctx: me.ctx, chart: me }); scales[scale.id] = scale; scale.mergeTicksOptions(); // TODO(SB): I think we should be able to remove this custom case (options.scale) // and consider it as a regular scale part of the "scales"" map only! This would // make the logic easier and remove some useless? custom code. if (item.isDefault) { me.scale = scale; } }); Chart.scaleService.addScalesToLayout(this); }, buildOrUpdateControllers: function() { var me = this; var types = []; var newControllers = []; helpers.each(me.data.datasets, function(dataset, datasetIndex) { var meta = me.getDatasetMeta(datasetIndex); var type = dataset.type || me.config.type; if (meta.type && meta.type !== type) { me.destroyDatasetMeta(datasetIndex); meta = me.getDatasetMeta(datasetIndex); } meta.type = type; types.push(meta.type); if (meta.controller) { meta.controller.updateIndex(datasetIndex); } else { var ControllerClass = Chart.controllers[meta.type]; if (ControllerClass === undefined) { throw new Error('"' + meta.type + '" is not a chart type.'); } meta.controller = new ControllerClass(me, datasetIndex); newControllers.push(meta.controller); } }, me); return newControllers; }, /** * Reset the elements of all datasets * @private */ resetElements: function() { var me = this; helpers.each(me.data.datasets, function(dataset, datasetIndex) { me.getDatasetMeta(datasetIndex).controller.reset(); }, me); }, /** * Resets the chart back to it's state before the initial animation */ reset: function() { this.resetElements(); this.tooltip.initialize(); }, update: function(config) { var me = this; if (!config || typeof config !== 'object') { // backwards compatibility config = { duration: config, lazy: arguments[1] }; } updateConfig(me); if (plugins.notify(me, 'beforeUpdate') === false) { return; } // In case the entire data object changed me.tooltip._data = me.data; // Make sure dataset controllers are updated and new controllers are reset var newControllers = me.buildOrUpdateControllers(); // Make sure all dataset controllers have correct meta data counts helpers.each(me.data.datasets, function(dataset, datasetIndex) { me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); }, me); me.updateLayout(); // Can only reset the new controllers after the scales have been updated helpers.each(newControllers, function(controller) { controller.reset(); }); me.updateDatasets(); // Need to reset tooltip in case it is displayed with elements that are removed // after update. me.tooltip.initialize(); // Last active contains items that were previously in the tooltip. // When we reset the tooltip, we need to clear it me.lastActive = []; // Do this before render so that any plugins that need final scale updates can use it plugins.notify(me, 'afterUpdate'); if (me._bufferedRender) { me._bufferedRequest = { duration: config.duration, easing: config.easing, lazy: config.lazy }; } else { me.render(config); } }, /** * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` * hook, in which case, plugins will not be called on `afterLayout`. * @private */ updateLayout: function() { var me = this; if (plugins.notify(me, 'beforeLayout') === false) { return; } Chart.layoutService.update(this, this.width, this.height); /** * Provided for backward compatibility, use `afterLayout` instead. * @method IPlugin#afterScaleUpdate * @deprecated since version 2.5.0 * @todo remove at version 3 * @private */ plugins.notify(me, 'afterScaleUpdate'); plugins.notify(me, 'afterLayout'); }, /** * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. * @private */ updateDatasets: function() { var me = this; if (plugins.notify(me, 'beforeDatasetsUpdate') === false) { return; } for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { me.updateDataset(i); } plugins.notify(me, 'afterDatasetsUpdate'); }, /** * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` * hook, in which case, plugins will not be called on `afterDatasetUpdate`. * @private */ updateDataset: function(index) { var me = this; var meta = me.getDatasetMeta(index); var args = { meta: meta, index: index }; if (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { return; } meta.controller.update(); plugins.notify(me, 'afterDatasetUpdate', [args]); }, render: function(config) { var me = this; if (!config || typeof config !== 'object') { // backwards compatibility config = { duration: config, lazy: arguments[1] }; } var duration = config.duration; var lazy = config.lazy; if (plugins.notify(me, 'beforeRender') === false) { return; } var animationOptions = me.options.animation; var onComplete = function(animation) { plugins.notify(me, 'afterRender'); helpers.callback(animationOptions && animationOptions.onComplete, [animation], me); }; if (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) { var animation = new Chart.Animation({ numSteps: (duration || animationOptions.duration) / 16.66, // 60 fps easing: config.easing || animationOptions.easing, render: function(chart, animationObject) { var easingFunction = helpers.easing.effects[animationObject.easing]; var currentStep = animationObject.currentStep; var stepDecimal = currentStep / animationObject.numSteps; chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); }, onAnimationProgress: animationOptions.onProgress, onAnimationComplete: onComplete }); Chart.animationService.addAnimation(me, animation, duration, lazy); } else { me.draw(); // See https://github.com/chartjs/Chart.js/issues/3781 onComplete(new Chart.Animation({numSteps: 0, chart: me})); } return me; }, draw: function(easingValue) { var me = this; me.clear(); if (helpers.isNullOrUndef(easingValue)) { easingValue = 1; } me.transition(easingValue); if (plugins.notify(me, 'beforeDraw', [easingValue]) === false) { return; } // Draw all the scales helpers.each(me.boxes, function(box) { box.draw(me.chartArea); }, me); if (me.scale) { me.scale.draw(); } me.drawDatasets(easingValue); me._drawTooltip(easingValue); plugins.notify(me, 'afterDraw', [easingValue]); }, /** * @private */ transition: function(easingValue) { var me = this; for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { if (me.isDatasetVisible(i)) { me.getDatasetMeta(i).controller.transition(easingValue); } } me.tooltip.transition(easingValue); }, /** * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` * hook, in which case, plugins will not be called on `afterDatasetsDraw`. * @private */ drawDatasets: function(easingValue) { var me = this; if (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { return; } // Draw datasets reversed to support proper line stacking for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { if (me.isDatasetVisible(i)) { me.drawDataset(i, easingValue); } } plugins.notify(me, 'afterDatasetsDraw', [easingValue]); }, /** * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` * hook, in which case, plugins will not be called on `afterDatasetDraw`. * @private */ drawDataset: function(index, easingValue) { var me = this; var meta = me.getDatasetMeta(index); var args = { meta: meta, index: index, easingValue: easingValue }; if (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { return; } meta.controller.draw(easingValue); plugins.notify(me, 'afterDatasetDraw', [args]); }, /** * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` * hook, in which case, plugins will not be called on `afterTooltipDraw`. * @private */ _drawTooltip: function(easingValue) { var me = this; var tooltip = me.tooltip; var args = { tooltip: tooltip, easingValue: easingValue }; if (plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { return; } tooltip.draw(); plugins.notify(me, 'afterTooltipDraw', [args]); }, // Get the single element that was clicked on // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw getElementAtEvent: function(e) { return Interaction.modes.single(this, e); }, getElementsAtEvent: function(e) { return Interaction.modes.label(this, e, {intersect: true}); }, getElementsAtXAxis: function(e) { return Interaction.modes['x-axis'](this, e, {intersect: true}); }, getElementsAtEventForMode: function(e, mode, options) { var method = Interaction.modes[mode]; if (typeof method === 'function') { return method(this, e, options); } return []; }, getDatasetAtEvent: function(e) { return Interaction.modes.dataset(this, e, {intersect: true}); }, getDatasetMeta: function(datasetIndex) { var me = this; var dataset = me.data.datasets[datasetIndex]; if (!dataset._meta) { dataset._meta = {}; } var meta = dataset._meta[me.id]; if (!meta) { meta = dataset._meta[me.id] = { type: null, data: [], dataset: null, controller: null, hidden: null, // See isDatasetVisible() comment xAxisID: null, yAxisID: null }; } return meta; }, getVisibleDatasetCount: function() { var count = 0; for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { if (this.isDatasetVisible(i)) { count++; } } return count; }, isDatasetVisible: function(datasetIndex) { var meta = this.getDatasetMeta(datasetIndex); // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; }, generateLegend: function() { return this.options.legendCallback(this); }, /** * @private */ destroyDatasetMeta: function(datasetIndex) { var id = this.id; var dataset = this.data.datasets[datasetIndex]; var meta = dataset._meta && dataset._meta[id]; if (meta) { meta.controller.destroy(); delete dataset._meta[id]; } }, destroy: function() { var me = this; var canvas = me.canvas; var i, ilen; me.stop(); // dataset controllers need to cleanup associated data for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { me.destroyDatasetMeta(i); } if (canvas) { me.unbindEvents(); helpers.canvas.clear(me); platform.releaseContext(me.ctx); me.canvas = null; me.ctx = null; } plugins.notify(me, 'destroy'); delete Chart.instances[me.id]; }, toBase64Image: function() { return this.canvas.toDataURL.apply(this.canvas, arguments); }, initToolTip: function() { var me = this; me.tooltip = new Chart.Tooltip({ _chart: me, _chartInstance: me, // deprecated, backward compatibility _data: me.data, _options: me.options.tooltips }, me); }, /** * @private */ bindEvents: function() { var me = this; var listeners = me._listeners = {}; var listener = function() { me.eventHandler.apply(me, arguments); }; helpers.each(me.options.events, function(type) { platform.addEventListener(me, type, listener); listeners[type] = listener; }); // Elements used to detect size change should not be injected for non responsive charts. // See https://github.com/chartjs/Chart.js/issues/2210 if (me.options.responsive) { listener = function() { me.resize(); }; platform.addEventListener(me, 'resize', listener); listeners.resize = listener; } }, /** * @private */ unbindEvents: function() { var me = this; var listeners = me._listeners; if (!listeners) { return; } delete me._listeners; helpers.each(listeners, function(listener, type) { platform.removeEventListener(me, type, listener); }); }, updateHoverStyle: function(elements, mode, enabled) { var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; var element, i, ilen; for (i = 0, ilen = elements.length; i < ilen; ++i) { element = elements[i]; if (element) { this.getDatasetMeta(element._datasetIndex).controller[method](element); } } }, /** * @private */ eventHandler: function(e) { var me = this; var tooltip = me.tooltip; if (plugins.notify(me, 'beforeEvent', [e]) === false) { return; } // Buffer any update calls so that renders do not occur me._bufferedRender = true; me._bufferedRequest = null; var changed = me.handleEvent(e); changed |= tooltip && tooltip.handleEvent(e); plugins.notify(me, 'afterEvent', [e]); var bufferedRequest = me._bufferedRequest; if (bufferedRequest) { // If we have an update that was triggered, we need to do a normal render me.render(bufferedRequest); } else if (changed && !me.animating) { // If entering, leaving, or changing elements, animate the change via pivot me.stop(); // We only need to render at this point. Updating will cause scales to be // recomputed generating flicker & using more memory than necessary. me.render(me.options.hover.animationDuration, true); } me._bufferedRender = false; me._bufferedRequest = null; return me; }, /** * Handle an event * @private * @param {IEvent} event the event to handle * @return {Boolean} true if the chart needs to re-render */ handleEvent: function(e) { var me = this; var options = me.options || {}; var hoverOptions = options.hover; var changed = false; me.lastActive = me.lastActive || []; // Find Active Elements for hover and tooltips if (e.type === 'mouseout') { me.active = []; } else { me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); } // Invoke onHover hook // Need to call with native event here to not break backwards compatibility helpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); if (e.type === 'mouseup' || e.type === 'click') { if (options.onClick) { // Use e.native here for backwards compatibility options.onClick.call(me, e.native, me.active); } } // Remove styling for last active (even if it may still be active) if (me.lastActive.length) { me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); } // Built in hover styling if (me.active.length && hoverOptions.mode) { me.updateHoverStyle(me.active, hoverOptions.mode, true); } changed = !helpers.arrayEquals(me.active, me.lastActive); // Remember Last Actives me.lastActive = me.active; return changed; } }); /** * Provided for backward compatibility, use Chart instead. * @class Chart.Controller * @deprecated since version 2.6.0 * @todo remove at version 3 * @private */ Chart.Controller = Chart; }; },{"25":25,"28":28,"45":45,"48":48}],24:[function(require,module,exports){ 'use strict'; var helpers = require(45); module.exports = function(Chart) { var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; /** * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', * 'unshift') and notify the listener AFTER the array has been altered. Listeners are * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. */ function listenArrayEvents(array, listener) { if (array._chartjs) { array._chartjs.listeners.push(listener); return; } Object.defineProperty(array, '_chartjs', { configurable: true, enumerable: false, value: { listeners: [listener] } }); arrayEvents.forEach(function(key) { var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); var base = array[key]; Object.defineProperty(array, key, { configurable: true, enumerable: false, value: function() { var args = Array.prototype.slice.call(arguments); var res = base.apply(this, args); helpers.each(array._chartjs.listeners, function(object) { if (typeof object[method] === 'function') { object[method].apply(object, args); } }); return res; } }); }); } /** * Removes the given array event listener and cleanup extra attached properties (such as * the _chartjs stub and overridden methods) if array doesn't have any more listeners. */ function unlistenArrayEvents(array, listener) { var stub = array._chartjs; if (!stub) { return; } var listeners = stub.listeners; var index = listeners.indexOf(listener); if (index !== -1) { listeners.splice(index, 1); } if (listeners.length > 0) { return; } arrayEvents.forEach(function(key) { delete array[key]; }); delete array._chartjs; } // Base class for all dataset controllers (line, bar, etc) Chart.DatasetController = function(chart, datasetIndex) { this.initialize(chart, datasetIndex); }; helpers.extend(Chart.DatasetController.prototype, { /** * Element type used to generate a meta dataset (e.g. Chart.element.Line). * @type {Chart.core.element} */ datasetElementType: null, /** * Element type used to generate a meta data (e.g. Chart.element.Point). * @type {Chart.core.element} */ dataElementType: null, initialize: function(chart, datasetIndex) { var me = this; me.chart = chart; me.index = datasetIndex; me.linkScales(); me.addElements(); }, updateIndex: function(datasetIndex) { this.index = datasetIndex; }, linkScales: function() { var me = this; var meta = me.getMeta(); var dataset = me.getDataset(); if (meta.xAxisID === null) { meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; } if (meta.yAxisID === null) { meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; } }, getDataset: function() { return this.chart.data.datasets[this.index]; }, getMeta: function() { return this.chart.getDatasetMeta(this.index); }, getScaleForId: function(scaleID) { return this.chart.scales[scaleID]; }, reset: function() { this.update(true); }, /** * @private */ destroy: function() { if (this._data) { unlistenArrayEvents(this._data, this); } }, createMetaDataset: function() { var me = this; var type = me.datasetElementType; return type && new type({ _chart: me.chart, _datasetIndex: me.index }); }, createMetaData: function(index) { var me = this; var type = me.dataElementType; return type && new type({ _chart: me.chart, _datasetIndex: me.index, _index: index }); }, addElements: function() { var me = this; var meta = me.getMeta(); var data = me.getDataset().data || []; var metaData = meta.data; var i, ilen; for (i = 0, ilen = data.length; i < ilen; ++i) { metaData[i] = metaData[i] || me.createMetaData(i); } meta.dataset = meta.dataset || me.createMetaDataset(); }, addElementAndReset: function(index) { var element = this.createMetaData(index); this.getMeta().data.splice(index, 0, element); this.updateElement(element, index, true); }, buildOrUpdateElements: function() { var me = this; var dataset = me.getDataset(); var data = dataset.data || (dataset.data = []); // In order to correctly handle data addition/deletion animation (an thus simulate // real-time charts), we need to monitor these data modifications and synchronize // the internal meta data accordingly. if (me._data !== data) { if (me._data) { // This case happens when the user replaced the data array instance. unlistenArrayEvents(me._data, me); } listenArrayEvents(data, me); me._data = data; } // Re-sync meta data in case the user replaced the data array or if we missed // any updates and so make sure that we handle number of datapoints changing. me.resyncElements(); }, update: helpers.noop, transition: function(easingValue) { var meta = this.getMeta(); var elements = meta.data || []; var ilen = elements.length; var i = 0; for (; i < ilen; ++i) { elements[i].transition(easingValue); } if (meta.dataset) { meta.dataset.transition(easingValue); } }, draw: function() { var meta = this.getMeta(); var elements = meta.data || []; var ilen = elements.length; var i = 0; if (meta.dataset) { meta.dataset.draw(); } for (; i < ilen; ++i) { elements[i].draw(); } }, removeHoverStyle: function(element, elementOpts) { var dataset = this.chart.data.datasets[element._datasetIndex]; var index = element._index; var custom = element.custom || {}; var valueOrDefault = helpers.valueAtIndexOrDefault; var model = element._model; model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor); model.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor); model.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth); }, setHoverStyle: function(element) { var dataset = this.chart.data.datasets[element._datasetIndex]; var index = element._index; var custom = element.custom || {}; var valueOrDefault = helpers.valueAtIndexOrDefault; var getHoverColor = helpers.getHoverColor; var model = element._model; model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor)); model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor)); model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); }, /** * @private */ resyncElements: function() { var me = this; var meta = me.getMeta(); var data = me.getDataset().data; var numMeta = meta.data.length; var numData = data.length; if (numData < numMeta) { meta.data.splice(numData, numMeta - numData); } else if (numData > numMeta) { me.insertElements(numMeta, numData - numMeta); } }, /** * @private */ insertElements: function(start, count) { for (var i = 0; i < count; ++i) { this.addElementAndReset(start + i); } }, /** * @private */ onDataPush: function() { this.insertElements(this.getDataset().data.length - 1, arguments.length); }, /** * @private */ onDataPop: function() { this.getMeta().data.pop(); }, /** * @private */ onDataShift: function() { this.getMeta().data.shift(); }, /** * @private */ onDataSplice: function(start, count) { this.getMeta().data.splice(start, count); this.insertElements(start, arguments.length - 2); }, /** * @private */ onDataUnshift: function() { this.insertElements(0, arguments.length); } }); Chart.DatasetController.extend = helpers.inherits; }; },{"45":45}],25:[function(require,module,exports){ 'use strict'; var helpers = require(45); module.exports = { /** * @private */ _set: function(scope, values) { return helpers.merge(this[scope] || (this[scope] = {}), values); } }; },{"45":45}],26:[function(require,module,exports){ 'use strict'; var color = require(3); var helpers = require(45); function interpolate(start, view, model, ease) { var keys = Object.keys(model); var i, ilen, key, actual, origin, target, type, c0, c1; for (i = 0, ilen = keys.length; i < ilen; ++i) { key = keys[i]; target = model[key]; // if a value is added to the model after pivot() has been called, the view // doesn't contain it, so let's initialize the view to the target value. if (!view.hasOwnProperty(key)) { view[key] = target; } actual = view[key]; if (actual === target || key[0] === '_') { continue; } if (!start.hasOwnProperty(key)) { start[key] = actual; } origin = start[key]; type = typeof target; if (type === typeof origin) { if (type === 'string') { c0 = color(origin); if (c0.valid) { c1 = color(target); if (c1.valid) { view[key] = c1.mix(c0, ease).rgbString(); continue; } } } else if (type === 'number' && isFinite(origin) && isFinite(target)) { view[key] = origin + (target - origin) * ease; continue; } } view[key] = target; } } var Element = function(configuration) { helpers.extend(this, configuration); this.initialize.apply(this, arguments); }; helpers.extend(Element.prototype, { initialize: function() { this.hidden = false; }, pivot: function() { var me = this; if (!me._view) { me._view = helpers.clone(me._model); } me._start = {}; return me; }, transition: function(ease) { var me = this; var model = me._model; var start = me._start; var view = me._view; // No animation -> No Transition if (!model || ease === 1) { me._view = model; me._start = null; return me; } if (!view) { view = me._view = {}; } if (!start) { start = me._start = {}; } interpolate(start, view, model, ease); return me; }, tooltipPosition: function() { return { x: this._model.x, y: this._model.y }; }, hasValue: function() { return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y); } }); Element.extend = helpers.inherits; module.exports = Element; },{"3":3,"45":45}],27:[function(require,module,exports){ /* global window: false */ /* global document: false */ 'use strict'; var color = require(3); var defaults = require(25); var helpers = require(45); module.exports = function(Chart) { // -- Basic js utility methods helpers.configMerge = function(/* objects ... */) { return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), { merger: function(key, target, source, options) { var tval = target[key] || {}; var sval = source[key]; if (key === 'scales') { // scale config merging is complex. Add our own function here for that target[key] = helpers.scaleMerge(tval, sval); } else if (key === 'scale') { // used in polar area & radar charts since there is only one scale target[key] = helpers.merge(tval, [Chart.scaleService.getScaleDefaults(sval.type), sval]); } else { helpers._merger(key, target, source, options); } } }); }; helpers.scaleMerge = function(/* objects ... */) { return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), { merger: function(key, target, source, options) { if (key === 'xAxes' || key === 'yAxes') { var slen = source[key].length; var i, type, scale; if (!target[key]) { target[key] = []; } for (i = 0; i < slen; ++i) { scale = source[key][i]; type = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear'); if (i >= target[key].length) { target[key].push({}); } if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { // new/untyped scale or type changed: let's apply the new defaults // then merge source scale to correctly overwrite the defaults. helpers.merge(target[key][i], [Chart.scaleService.getScaleDefaults(type), scale]); } else { // scales type are the same helpers.merge(target[key][i], scale); } } } else { helpers._merger(key, target, source, options); } } }); }; helpers.where = function(collection, filterCallback) { if (helpers.isArray(collection) && Array.prototype.filter) { return collection.filter(filterCallback); } var filtered = []; helpers.each(collection, function(item) { if (filterCallback(item)) { filtered.push(item); } }); return filtered; }; helpers.findIndex = Array.prototype.findIndex ? function(array, callback, scope) { return array.findIndex(callback, scope); } : function(array, callback, scope) { scope = scope === undefined ? array : scope; for (var i = 0, ilen = array.length; i < ilen; ++i) { if (callback.call(scope, array[i], i, array)) { return i; } } return -1; }; helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { // Default to start of the array if (helpers.isNullOrUndef(startIndex)) { startIndex = -1; } for (var i = startIndex + 1; i < arrayToSearch.length; i++) { var currentItem = arrayToSearch[i]; if (filterCallback(currentItem)) { return currentItem; } } }; helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { // Default to end of the array if (helpers.isNullOrUndef(startIndex)) { startIndex = arrayToSearch.length; } for (var i = startIndex - 1; i >= 0; i--) { var currentItem = arrayToSearch[i]; if (filterCallback(currentItem)) { return currentItem; } } }; // -- Math methods helpers.isNumber = function(n) { return !isNaN(parseFloat(n)) && isFinite(n); }; helpers.almostEquals = function(x, y, epsilon) { return Math.abs(x - y) < epsilon; }; helpers.almostWhole = function(x, epsilon) { var rounded = Math.round(x); return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); }; helpers.max = function(array) { return array.reduce(function(max, value) { if (!isNaN(value)) { return Math.max(max, value); } return max; }, Number.NEGATIVE_INFINITY); }; helpers.min = function(array) { return array.reduce(function(min, value) { if (!isNaN(value)) { return Math.min(min, value); } return min; }, Number.POSITIVE_INFINITY); }; helpers.sign = Math.sign ? function(x) { return Math.sign(x); } : function(x) { x = +x; // convert to a number if (x === 0 || isNaN(x)) { return x; } return x > 0 ? 1 : -1; }; helpers.log10 = Math.log10 ? function(x) { return Math.log10(x); } : function(x) { return Math.log(x) / Math.LN10; }; helpers.toRadians = function(degrees) { return degrees * (Math.PI / 180); }; helpers.toDegrees = function(radians) { return radians * (180 / Math.PI); }; // Gets the angle from vertical upright to the point about a centre. helpers.getAngleFromPoint = function(centrePoint, anglePoint) { var distanceFromXCenter = anglePoint.x - centrePoint.x; var distanceFromYCenter = anglePoint.y - centrePoint.y; var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); if (angle < (-0.5 * Math.PI)) { angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] } return { angle: angle, distance: radialDistanceFromCenter }; }; helpers.distanceBetweenPoints = function(pt1, pt2) { return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); }; helpers.aliasPixel = function(pixelWidth) { return (pixelWidth % 2 === 0) ? 0 : 0.5; }; helpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { // Props to Rob Spencer at scaled innovation for his post on splining between points // http://scaledinnovation.com/analytics/splines/aboutSplines.html // This function must also respect "skipped" points var previous = firstPoint.skip ? middlePoint : firstPoint; var current = middlePoint; var next = afterPoint.skip ? middlePoint : afterPoint; var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); var s01 = d01 / (d01 + d12); var s12 = d12 / (d01 + d12); // If all points are the same, s01 & s02 will be inf s01 = isNaN(s01) ? 0 : s01; s12 = isNaN(s12) ? 0 : s12; var fa = t * s01; // scaling factor for triangle Ta var fb = t * s12; return { previous: { x: current.x - fa * (next.x - previous.x), y: current.y - fa * (next.y - previous.y) }, next: { x: current.x + fb * (next.x - previous.x), y: current.y + fb * (next.y - previous.y) } }; }; helpers.EPSILON = Number.EPSILON || 1e-14; helpers.splineCurveMonotone = function(points) { // This function calculates Bézier control points in a similar way than |splineCurve|, // but preserves monotonicity of the provided data and ensures no local extremums are added // between the dataset discrete points due to the interpolation. // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation var pointsWithTangents = (points || []).map(function(point) { return { model: point._model, deltaK: 0, mK: 0 }; }); // Calculate slopes (deltaK) and initialize tangents (mK) var pointsLen = pointsWithTangents.length; var i, pointBefore, pointCurrent, pointAfter; for (i = 0; i < pointsLen; ++i) { pointCurrent = pointsWithTangents[i]; if (pointCurrent.model.skip) { continue; } pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; if (pointAfter && !pointAfter.model.skip) { var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; } if (!pointBefore || pointBefore.model.skip) { pointCurrent.mK = pointCurrent.deltaK; } else if (!pointAfter || pointAfter.model.skip) { pointCurrent.mK = pointBefore.deltaK; } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { pointCurrent.mK = 0; } else { pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; } } // Adjust tangents to ensure monotonic properties var alphaK, betaK, tauK, squaredMagnitude; for (i = 0; i < pointsLen - 1; ++i) { pointCurrent = pointsWithTangents[i]; pointAfter = pointsWithTangents[i + 1]; if (pointCurrent.model.skip || pointAfter.model.skip) { continue; } if (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { pointCurrent.mK = pointAfter.mK = 0; continue; } alphaK = pointCurrent.mK / pointCurrent.deltaK; betaK = pointAfter.mK / pointCurrent.deltaK; squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); if (squaredMagnitude <= 9) { continue; } tauK = 3 / Math.sqrt(squaredMagnitude); pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; pointAfter.mK = betaK * tauK * pointCurrent.deltaK; } // Compute control points var deltaX; for (i = 0; i < pointsLen; ++i) { pointCurrent = pointsWithTangents[i]; if (pointCurrent.model.skip) { continue; } pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; if (pointBefore && !pointBefore.model.skip) { deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; } if (pointAfter && !pointAfter.model.skip) { deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; } } }; helpers.nextItem = function(collection, index, loop) { if (loop) { return index >= collection.length - 1 ? collection[0] : collection[index + 1]; } return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; }; helpers.previousItem = function(collection, index, loop) { if (loop) { return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; } return index <= 0 ? collection[0] : collection[index - 1]; }; // Implementation of the nice number algorithm used in determining where axis labels will go helpers.niceNum = function(range, round) { var exponent = Math.floor(helpers.log10(range)); var fraction = range / Math.pow(10, exponent); var niceFraction; if (round) { if (fraction < 1.5) { niceFraction = 1; } else if (fraction < 3) { niceFraction = 2; } else if (fraction < 7) { niceFraction = 5; } else { niceFraction = 10; } } else if (fraction <= 1.0) { niceFraction = 1; } else if (fraction <= 2) { niceFraction = 2; } else if (fraction <= 5) { niceFraction = 5; } else { niceFraction = 10; } return niceFraction * Math.pow(10, exponent); }; // Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ helpers.requestAnimFrame = (function() { if (typeof window === 'undefined') { return function(callback) { callback(); }; } return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { return window.setTimeout(callback, 1000 / 60); }; }()); // -- DOM methods helpers.getRelativePosition = function(evt, chart) { var mouseX, mouseY; var e = evt.originalEvent || evt; var canvas = evt.currentTarget || evt.srcElement; var boundingRect = canvas.getBoundingClientRect(); var touches = e.touches; if (touches && touches.length > 0) { mouseX = touches[0].clientX; mouseY = touches[0].clientY; } else { mouseX = e.clientX; mouseY = e.clientY; } // Scale mouse coordinates into canvas coordinates // by following the pattern laid out by 'jerryj' in the comments of // http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ var paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left')); var paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top')); var paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right')); var paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom')); var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); return { x: mouseX, y: mouseY }; }; // Private helper function to convert max-width/max-height values that may be percentages into a number function parseMaxStyle(styleValue, node, parentProperty) { var valueInPixels; if (typeof styleValue === 'string') { valueInPixels = parseInt(styleValue, 10); if (styleValue.indexOf('%') !== -1) { // percentage * size in dimension valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; } } else { valueInPixels = styleValue; } return valueInPixels; } /** * Returns if the given value contains an effective constraint. * @private */ function isConstrainedValue(value) { return value !== undefined && value !== null && value !== 'none'; } // Private helper to get a constraint dimension // @param domNode : the node to check the constraint on // @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight) // @param percentageProperty : property of parent to use when calculating width as a percentage // @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser function getConstraintDimension(domNode, maxStyle, percentageProperty) { var view = document.defaultView; var parentNode = domNode.parentNode; var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; var hasCNode = isConstrainedValue(constrainedNode); var hasCContainer = isConstrainedValue(constrainedContainer); var infinity = Number.POSITIVE_INFINITY; if (hasCNode || hasCContainer) { return Math.min( hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); } return 'none'; } // returns Number or undefined if no constraint helpers.getConstraintWidth = function(domNode) { return getConstraintDimension(domNode, 'max-width', 'clientWidth'); }; // returns Number or undefined if no constraint helpers.getConstraintHeight = function(domNode) { return getConstraintDimension(domNode, 'max-height', 'clientHeight'); }; helpers.getMaximumWidth = function(domNode) { var container = domNode.parentNode; if (!container) { return domNode.clientWidth; } var paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10); var paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10); var w = container.clientWidth - paddingLeft - paddingRight; var cw = helpers.getConstraintWidth(domNode); return isNaN(cw) ? w : Math.min(w, cw); }; helpers.getMaximumHeight = function(domNode) { var container = domNode.parentNode; if (!container) { return domNode.clientHeight; } var paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10); var paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10); var h = container.clientHeight - paddingTop - paddingBottom; var ch = helpers.getConstraintHeight(domNode); return isNaN(ch) ? h : Math.min(h, ch); }; helpers.getStyle = function(el, property) { return el.currentStyle ? el.currentStyle[property] : document.defaultView.getComputedStyle(el, null).getPropertyValue(property); }; helpers.retinaScale = function(chart, forceRatio) { var pixelRatio = chart.currentDevicePixelRatio = forceRatio || window.devicePixelRatio || 1; if (pixelRatio === 1) { return; } var canvas = chart.canvas; var height = chart.height; var width = chart.width; canvas.height = height * pixelRatio; canvas.width = width * pixelRatio; chart.ctx.scale(pixelRatio, pixelRatio); // If no style has been set on the canvas, the render size is used as display size, // making the chart visually bigger, so let's enforce it to the "correct" values. // See https://github.com/chartjs/Chart.js/issues/3575 canvas.style.height = height + 'px'; canvas.style.width = width + 'px'; }; // -- Canvas methods helpers.fontString = function(pixelSize, fontStyle, fontFamily) { return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; }; helpers.longestText = function(ctx, font, arrayOfThings, cache) { cache = cache || {}; var data = cache.data = cache.data || {}; var gc = cache.garbageCollect = cache.garbageCollect || []; if (cache.font !== font) { data = cache.data = {}; gc = cache.garbageCollect = []; cache.font = font; } ctx.font = font; var longest = 0; helpers.each(arrayOfThings, function(thing) { // Undefined strings and arrays should not be measured if (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) { longest = helpers.measureText(ctx, data, gc, longest, thing); } else if (helpers.isArray(thing)) { // if it is an array lets measure each element // to do maybe simplify this function a bit so we can do this more recursively? helpers.each(thing, function(nestedThing) { // Undefined strings and arrays should not be measured if (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) { longest = helpers.measureText(ctx, data, gc, longest, nestedThing); } }); } }); var gcLen = gc.length / 2; if (gcLen > arrayOfThings.length) { for (var i = 0; i < gcLen; i++) { delete data[gc[i]]; } gc.splice(0, gcLen); } return longest; }; helpers.measureText = function(ctx, data, gc, longest, string) { var textWidth = data[string]; if (!textWidth) { textWidth = data[string] = ctx.measureText(string).width; gc.push(string); } if (textWidth > longest) { longest = textWidth; } return longest; }; helpers.numberOfLabelLines = function(arrayOfThings) { var numberOfLines = 1; helpers.each(arrayOfThings, function(thing) { if (helpers.isArray(thing)) { if (thing.length > numberOfLines) { numberOfLines = thing.length; } } }); return numberOfLines; }; helpers.color = !color ? function(value) { console.error('Color.js not found!'); return value; } : function(value) { /* global CanvasGradient */ if (value instanceof CanvasGradient) { value = defaults.global.defaultColor; } return color(value); }; helpers.getHoverColor = function(colorValue) { /* global CanvasPattern */ return (colorValue instanceof CanvasPattern) ? colorValue : helpers.color(colorValue).saturate(0.5).darken(0.1).rgbString(); }; }; },{"25":25,"3":3,"45":45}],28:[function(require,module,exports){ 'use strict'; var helpers = require(45); /** * Helper function to get relative position for an event * @param {Event|IEvent} event - The event to get the position for * @param {Chart} chart - The chart * @returns {Point} the event position */ function getRelativePosition(e, chart) { if (e.native) { return { x: e.x, y: e.y }; } return helpers.getRelativePosition(e, chart); } /** * Helper function to traverse all of the visible elements in the chart * @param chart {chart} the chart * @param handler {Function} the callback to execute for each visible item */ function parseVisibleItems(chart, handler) { var datasets = chart.data.datasets; var meta, i, j, ilen, jlen; for (i = 0, ilen = datasets.length; i < ilen; ++i) { if (!chart.isDatasetVisible(i)) { continue; } meta = chart.getDatasetMeta(i); for (j = 0, jlen = meta.data.length; j < jlen; ++j) { var element = meta.data[j]; if (!element._view.skip) { handler(element); } } } } /** * Helper function to get the items that intersect the event position * @param items {ChartElement[]} elements to filter * @param position {Point} the point to be nearest to * @return {ChartElement[]} the nearest items */ function getIntersectItems(chart, position) { var elements = []; parseVisibleItems(chart, function(element) { if (element.inRange(position.x, position.y)) { elements.push(element); } }); return elements; } /** * Helper function to get the items nearest to the event position considering all visible items in teh chart * @param chart {Chart} the chart to look at elements from * @param position {Point} the point to be nearest to * @param intersect {Boolean} if true, only consider items that intersect the position * @param distanceMetric {Function} function to provide the distance between points * @return {ChartElement[]} the nearest items */ function getNearestItems(chart, position, intersect, distanceMetric) { var minDistance = Number.POSITIVE_INFINITY; var nearestItems = []; parseVisibleItems(chart, function(element) { if (intersect && !element.inRange(position.x, position.y)) { return; } var center = element.getCenterPoint(); var distance = distanceMetric(position, center); if (distance < minDistance) { nearestItems = [element]; minDistance = distance; } else if (distance === minDistance) { // Can have multiple items at the same distance in which case we sort by size nearestItems.push(element); } }); return nearestItems; } /** * Get a distance metric function for two points based on the * axis mode setting * @param {String} axis the axis mode. x|y|xy */ function getDistanceMetricForAxis(axis) { var useX = axis.indexOf('x') !== -1; var useY = axis.indexOf('y') !== -1; return function(pt1, pt2) { var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); }; } function indexMode(chart, e, options) { var position = getRelativePosition(e, chart); // Default axis for index mode is 'x' to match old behaviour options.axis = options.axis || 'x'; var distanceMetric = getDistanceMetricForAxis(options.axis); var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); var elements = []; if (!items.length) { return []; } chart.data.datasets.forEach(function(dataset, datasetIndex) { if (chart.isDatasetVisible(datasetIndex)) { var meta = chart.getDatasetMeta(datasetIndex); var element = meta.data[items[0]._index]; // don't count items that are skipped (null data) if (element && !element._view.skip) { elements.push(element); } } }); return elements; } /** * @interface IInteractionOptions */ /** * If true, only consider items that intersect the point * @name IInterfaceOptions#boolean * @type Boolean */ /** * Contains interaction related functions * @namespace Chart.Interaction */ module.exports = { // Helper function for different modes modes: { single: function(chart, e) { var position = getRelativePosition(e, chart); var elements = []; parseVisibleItems(chart, function(element) { if (element.inRange(position.x, position.y)) { elements.push(element); return elements; } }); return elements.slice(0, 1); }, /** * @function Chart.Interaction.modes.label * @deprecated since version 2.4.0 * @todo remove at version 3 * @private */ label: indexMode, /** * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item * @function Chart.Interaction.modes.index * @since v2.4.0 * @param chart {chart} the chart we are returning items from * @param e {Event} the event we are find things at * @param options {IInteractionOptions} options to use during interaction * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ index: indexMode, /** * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something * If the options.intersect is false, we find the nearest item and return the items in that dataset * @function Chart.Interaction.modes.dataset * @param chart {chart} the chart we are returning items from * @param e {Event} the event we are find things at * @param options {IInteractionOptions} options to use during interaction * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ dataset: function(chart, e, options) { var position = getRelativePosition(e, chart); options.axis = options.axis || 'xy'; var distanceMetric = getDistanceMetricForAxis(options.axis); var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); if (items.length > 0) { items = chart.getDatasetMeta(items[0]._datasetIndex).data; } return items; }, /** * @function Chart.Interaction.modes.x-axis * @deprecated since version 2.4.0. Use index mode and intersect == true * @todo remove at version 3 * @private */ 'x-axis': function(chart, e) { return indexMode(chart, e, {intersect: false}); }, /** * Point mode returns all elements that hit test based on the event position * of the event * @function Chart.Interaction.modes.intersect * @param chart {chart} the chart we are returning items from * @param e {Event} the event we are find things at * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ point: function(chart, e) { var position = getRelativePosition(e, chart); return getIntersectItems(chart, position); }, /** * nearest mode returns the element closest to the point * @function Chart.Interaction.modes.intersect * @param chart {chart} the chart we are returning items from * @param e {Event} the event we are find things at * @param options {IInteractionOptions} options to use * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ nearest: function(chart, e, options) { var position = getRelativePosition(e, chart); options.axis = options.axis || 'xy'; var distanceMetric = getDistanceMetricForAxis(options.axis); var nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric); // We have multiple items at the same distance from the event. Now sort by smallest if (nearestItems.length > 1) { nearestItems.sort(function(a, b) { var sizeA = a.getArea(); var sizeB = b.getArea(); var ret = sizeA - sizeB; if (ret === 0) { // if equal sort by dataset index ret = a._datasetIndex - b._datasetIndex; } return ret; }); } // Return only 1 item return nearestItems.slice(0, 1); }, /** * x mode returns the elements that hit-test at the current x coordinate * @function Chart.Interaction.modes.x * @param chart {chart} the chart we are returning items from * @param e {Event} the event we are find things at * @param options {IInteractionOptions} options to use * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ x: function(chart, e, options) { var position = getRelativePosition(e, chart); var items = []; var intersectsItem = false; parseVisibleItems(chart, function(element) { if (element.inXRange(position.x)) { items.push(element); } if (element.inRange(position.x, position.y)) { intersectsItem = true; } }); // If we want to trigger on an intersect and we don't have any items // that intersect the position, return nothing if (options.intersect && !intersectsItem) { items = []; } return items; }, /** * y mode returns the elements that hit-test at the current y coordinate * @function Chart.Interaction.modes.y * @param chart {chart} the chart we are returning items from * @param e {Event} the event we are find things at * @param options {IInteractionOptions} options to use * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ y: function(chart, e, options) { var position = getRelativePosition(e, chart); var items = []; var intersectsItem = false; parseVisibleItems(chart, function(element) { if (element.inYRange(position.y)) { items.push(element); } if (element.inRange(position.x, position.y)) { intersectsItem = true; } }); // If we want to trigger on an intersect and we don't have any items // that intersect the position, return nothing if (options.intersect && !intersectsItem) { items = []; } return items; } } }; },{"45":45}],29:[function(require,module,exports){ 'use strict'; var defaults = require(25); defaults._set('global', { responsive: true, responsiveAnimationDuration: 0, maintainAspectRatio: true, events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'], hover: { onHover: null, mode: 'nearest', intersect: true, animationDuration: 400 }, onClick: null, defaultColor: 'rgba(0,0,0,0.1)', defaultFontColor: '#666', defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", defaultFontSize: 12, defaultFontStyle: 'normal', showLines: true, // Element defaults defined in element extensions elements: {}, // Layout options such as padding layout: { padding: { top: 0, right: 0, bottom: 0, left: 0 } } }); module.exports = function() { // Occupy the global variable of Chart, and create a simple base class var Chart = function(item, config) { this.construct(item, config); return this; }; Chart.Chart = Chart; return Chart; }; },{"25":25}],30:[function(require,module,exports){ 'use strict'; var helpers = require(45); module.exports = function(Chart) { function filterByPosition(array, position) { return helpers.where(array, function(v) { return v.position === position; }); } function sortByWeight(array, reverse) { array.forEach(function(v, i) { v._tmpIndex_ = i; return v; }); array.sort(function(a, b) { var v0 = reverse ? b : a; var v1 = reverse ? a : b; return v0.weight === v1.weight ? v0._tmpIndex_ - v1._tmpIndex_ : v0.weight - v1.weight; }); array.forEach(function(v) { delete v._tmpIndex_; }); } /** * @interface ILayoutItem * @prop {String} position - The position of the item in the chart layout. Possible values are * 'left', 'top', 'right', 'bottom', and 'chartArea' * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) * @prop {Function} update - Takes two parameters: width and height. Returns size of item * @prop {Function} getPadding - Returns an object with padding on the edges * @prop {Number} width - Width of item. Must be valid after update() * @prop {Number} height - Height of item. Must be valid after update() * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update */ // The layout service is very self explanatory. It's responsible for the layout within a chart. // Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need // It is this service's responsibility of carrying out that layout. Chart.layoutService = { defaults: {}, /** * Register a box to a chart. * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. * @param {Chart} chart - the chart to use * @param {ILayoutItem} item - the item to add to be layed out */ addBox: function(chart, item) { if (!chart.boxes) { chart.boxes = []; } // initialize item with default values item.fullWidth = item.fullWidth || false; item.position = item.position || 'top'; item.weight = item.weight || 0; chart.boxes.push(item); }, /** * Remove a layoutItem from a chart * @param {Chart} chart - the chart to remove the box from * @param {Object} layoutItem - the item to remove from the layout */ removeBox: function(chart, layoutItem) { var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; if (index !== -1) { chart.boxes.splice(index, 1); } }, /** * Sets (or updates) options on the given `item`. * @param {Chart} chart - the chart in which the item lives (or will be added to) * @param {Object} item - the item to configure with the given options * @param {Object} options - the new item options. */ configure: function(chart, item, options) { var props = ['fullWidth', 'position', 'weight']; var ilen = props.length; var i = 0; var prop; for (; i < ilen; ++i) { prop = props[i]; if (options.hasOwnProperty(prop)) { item[prop] = options[prop]; } } }, /** * Fits boxes of the given chart into the given size by having each box measure itself * then running a fitting algorithm * @param {Chart} chart - the chart * @param {Number} width - the width to fit into * @param {Number} height - the height to fit into */ update: function(chart, width, height) { if (!chart) { return; } var layoutOptions = chart.options.layout || {}; var padding = helpers.options.toPadding(layoutOptions.padding); var leftPadding = padding.left; var rightPadding = padding.right; var topPadding = padding.top; var bottomPadding = padding.bottom; var leftBoxes = filterByPosition(chart.boxes, 'left'); var rightBoxes = filterByPosition(chart.boxes, 'right'); var topBoxes = filterByPosition(chart.boxes, 'top'); var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); // Sort boxes by weight. A higher weight is further away from the chart area sortByWeight(leftBoxes, true); sortByWeight(rightBoxes, false); sortByWeight(topBoxes, true); sortByWeight(bottomBoxes, false); // Essentially we now have any number of boxes on each of the 4 sides. // Our canvas looks like the following. // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and // B1 is the bottom axis // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays // These locations are single-box locations only, when trying to register a chartArea location that is already taken, // an error will be thrown. // // |----------------------------------------------------| // | T1 (Full Width) | // |----------------------------------------------------| // | | | T2 | | // | |----|-------------------------------------|----| // | | | C1 | | C2 | | // | | |----| |----| | // | | | | | // | L1 | L2 | ChartArea (C0) | R1 | // | | | | | // | | |----| |----| | // | | | C3 | | C4 | | // | |----|-------------------------------------|----| // | | | B1 | | // |----------------------------------------------------| // | B2 (Full Width) | // |----------------------------------------------------| // // What we do to find the best sizing, we do the following // 1. Determine the minimum size of the chart area. // 2. Split the remaining width equally between each vertical axis // 3. Split the remaining height equally between each horizontal axis // 4. Give each layout the maximum size it can be. The layout will return it's minimum size // 5. Adjust the sizes of each axis based on it's minimum reported size. // 6. Refit each axis // 7. Position each axis in the final location // 8. Tell the chart the final location of the chart area // 9. Tell any axes that overlay the chart area the positions of the chart area // Step 1 var chartWidth = width - leftPadding - rightPadding; var chartHeight = height - topPadding - bottomPadding; var chartAreaWidth = chartWidth / 2; // min 50% var chartAreaHeight = chartHeight / 2; // min 50% // Step 2 var verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length); // Step 3 var horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length); // Step 4 var maxChartAreaWidth = chartWidth; var maxChartAreaHeight = chartHeight; var minBoxSizes = []; function getMinimumBoxSize(box) { var minSize; var isHorizontal = box.isHorizontal(); if (isHorizontal) { minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight); maxChartAreaHeight -= minSize.height; } else { minSize = box.update(verticalBoxWidth, chartAreaHeight); maxChartAreaWidth -= minSize.width; } minBoxSizes.push({ horizontal: isHorizontal, minSize: minSize, box: box, }); } helpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize); // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) var maxHorizontalLeftPadding = 0; var maxHorizontalRightPadding = 0; var maxVerticalTopPadding = 0; var maxVerticalBottomPadding = 0; helpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) { if (horizontalBox.getPadding) { var boxPadding = horizontalBox.getPadding(); maxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left); maxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right); } }); helpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) { if (verticalBox.getPadding) { var boxPadding = verticalBox.getPadding(); maxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top); maxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom); } }); // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could // be if the axes are drawn at their minimum sizes. // Steps 5 & 6 var totalLeftBoxesWidth = leftPadding; var totalRightBoxesWidth = rightPadding; var totalTopBoxesHeight = topPadding; var totalBottomBoxesHeight = bottomPadding; // Function to fit a box function fitBox(box) { var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) { return minBox.box === box; }); if (minBoxSize) { if (box.isHorizontal()) { var scaleMargin = { left: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding), right: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding), top: 0, bottom: 0 }; // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends // on the margin. Sometimes they need to increase in size slightly box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); } else { box.update(minBoxSize.minSize.width, maxChartAreaHeight); } } } // Update, and calculate the left and right margins for the horizontal boxes helpers.each(leftBoxes.concat(rightBoxes), fitBox); helpers.each(leftBoxes, function(box) { totalLeftBoxesWidth += box.width; }); helpers.each(rightBoxes, function(box) { totalRightBoxesWidth += box.width; }); // Set the Left and Right margins for the horizontal boxes helpers.each(topBoxes.concat(bottomBoxes), fitBox); // Figure out how much margin is on the top and bottom of the vertical boxes helpers.each(topBoxes, function(box) { totalTopBoxesHeight += box.height; }); helpers.each(bottomBoxes, function(box) { totalBottomBoxesHeight += box.height; }); function finalFitVerticalBox(box) { var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) { return minSize.box === box; }); var scaleMargin = { left: 0, right: 0, top: totalTopBoxesHeight, bottom: totalBottomBoxesHeight }; if (minBoxSize) { box.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin); } } // Let the left layout know the final margin helpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox); // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) totalLeftBoxesWidth = leftPadding; totalRightBoxesWidth = rightPadding; totalTopBoxesHeight = topPadding; totalBottomBoxesHeight = bottomPadding; helpers.each(leftBoxes, function(box) { totalLeftBoxesWidth += box.width; }); helpers.each(rightBoxes, function(box) { totalRightBoxesWidth += box.width; }); helpers.each(topBoxes, function(box) { totalTopBoxesHeight += box.height; }); helpers.each(bottomBoxes, function(box) { totalBottomBoxesHeight += box.height; }); // We may be adding some padding to account for rotated x axis labels var leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0); totalLeftBoxesWidth += leftPaddingAddition; totalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0); var topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0); totalTopBoxesHeight += topPaddingAddition; totalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0); // Figure out if our chart area changed. This would occur if the dataset layout label rotation // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do // without calling `fit` again var newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight; var newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth; if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { helpers.each(leftBoxes, function(box) { box.height = newMaxChartAreaHeight; }); helpers.each(rightBoxes, function(box) { box.height = newMaxChartAreaHeight; }); helpers.each(topBoxes, function(box) { if (!box.fullWidth) { box.width = newMaxChartAreaWidth; } }); helpers.each(bottomBoxes, function(box) { if (!box.fullWidth) { box.width = newMaxChartAreaWidth; } }); maxChartAreaHeight = newMaxChartAreaHeight; maxChartAreaWidth = newMaxChartAreaWidth; } // Step 7 - Position the boxes var left = leftPadding + leftPaddingAddition; var top = topPadding + topPaddingAddition; function placeBox(box) { if (box.isHorizontal()) { box.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth; box.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth; box.top = top; box.bottom = top + box.height; // Move to next point top = box.bottom; } else { box.left = left; box.right = left + box.width; box.top = totalTopBoxesHeight; box.bottom = totalTopBoxesHeight + maxChartAreaHeight; // Move to next point left = box.right; } } helpers.each(leftBoxes.concat(topBoxes), placeBox); // Account for chart width and height left += maxChartAreaWidth; top += maxChartAreaHeight; helpers.each(rightBoxes, placeBox); helpers.each(bottomBoxes, placeBox); // Step 8 chart.chartArea = { left: totalLeftBoxesWidth, top: totalTopBoxesHeight, right: totalLeftBoxesWidth + maxChartAreaWidth, bottom: totalTopBoxesHeight + maxChartAreaHeight }; // Step 9 helpers.each(chartAreaBoxes, function(box) { box.left = chart.chartArea.left; box.top = chart.chartArea.top; box.right = chart.chartArea.right; box.bottom = chart.chartArea.bottom; box.update(maxChartAreaWidth, maxChartAreaHeight); }); } }; }; },{"45":45}],31:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); defaults._set('global', { plugins: {} }); module.exports = function(Chart) { /** * The plugin service singleton * @namespace Chart.plugins * @since 2.1.0 */ Chart.plugins = { /** * Globally registered plugins. * @private */ _plugins: [], /** * This identifier is used to invalidate the descriptors cache attached to each chart * when a global plugin is registered or unregistered. In this case, the cache ID is * incremented and descriptors are regenerated during following API calls. * @private */ _cacheId: 0, /** * Registers the given plugin(s) if not already registered. * @param {Array|Object} plugins plugin instance(s). */ register: function(plugins) { var p = this._plugins; ([]).concat(plugins).forEach(function(plugin) { if (p.indexOf(plugin) === -1) { p.push(plugin); } }); this._cacheId++; }, /** * Unregisters the given plugin(s) only if registered. * @param {Array|Object} plugins plugin instance(s). */ unregister: function(plugins) { var p = this._plugins; ([]).concat(plugins).forEach(function(plugin) { var idx = p.indexOf(plugin); if (idx !== -1) { p.splice(idx, 1); } }); this._cacheId++; }, /** * Remove all registered plugins. * @since 2.1.5 */ clear: function() { this._plugins = []; this._cacheId++; }, /** * Returns the number of registered plugins? * @returns {Number} * @since 2.1.5 */ count: function() { return this._plugins.length; }, /** * Returns all registered plugin instances. * @returns {Array} array of plugin objects. * @since 2.1.5 */ getAll: function() { return this._plugins; }, /** * Calls enabled plugins for `chart` on the specified hook and with the given args. * This method immediately returns as soon as a plugin explicitly returns false. The * returned value can be used, for instance, to interrupt the current action. * @param {Object} chart - The chart instance for which plugins should be called. * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). * @param {Array} [args] - Extra arguments to apply to the hook call. * @returns {Boolean} false if any of the plugins return false, else returns true. */ notify: function(chart, hook, args) { var descriptors = this.descriptors(chart); var ilen = descriptors.length; var i, descriptor, plugin, params, method; for (i = 0; i < ilen; ++i) { descriptor = descriptors[i]; plugin = descriptor.plugin; method = plugin[hook]; if (typeof method === 'function') { params = [chart].concat(args || []); params.push(descriptor.options); if (method.apply(plugin, params) === false) { return false; } } } return true; }, /** * Returns descriptors of enabled plugins for the given chart. * @returns {Array} [{ plugin, options }] * @private */ descriptors: function(chart) { var cache = chart._plugins || (chart._plugins = {}); if (cache.id === this._cacheId) { return cache.descriptors; } var plugins = []; var descriptors = []; var config = (chart && chart.config) || {}; var options = (config.options && config.options.plugins) || {}; this._plugins.concat(config.plugins || []).forEach(function(plugin) { var idx = plugins.indexOf(plugin); if (idx !== -1) { return; } var id = plugin.id; var opts = options[id]; if (opts === false) { return; } if (opts === true) { opts = helpers.clone(defaults.global.plugins[id]); } plugins.push(plugin); descriptors.push({ plugin: plugin, options: opts || {} }); }); cache.descriptors = descriptors; cache.id = this._cacheId; return descriptors; } }; /** * Plugin extension hooks. * @interface IPlugin * @since 2.1.0 */ /** * @method IPlugin#beforeInit * @desc Called before initializing `chart`. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. */ /** * @method IPlugin#afterInit * @desc Called after `chart` has been initialized and before the first update. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeUpdate * @desc Called before updating `chart`. If any plugin returns `false`, the update * is cancelled (and thus subsequent render(s)) until another `update` is triggered. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart update. */ /** * @method IPlugin#afterUpdate * @desc Called after `chart` has been updated and before rendering. Note that this * hook will not be called if the chart update has been previously cancelled. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeDatasetsUpdate * @desc Called before updating the `chart` datasets. If any plugin returns `false`, * the datasets update is cancelled until another `update` is triggered. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. * @returns {Boolean} false to cancel the datasets update. * @since version 2.1.5 */ /** * @method IPlugin#afterDatasetsUpdate * @desc Called after the `chart` datasets have been updated. Note that this hook * will not be called if the datasets update has been previously cancelled. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. * @since version 2.1.5 */ /** * @method IPlugin#beforeDatasetUpdate * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin * returns `false`, the datasets update is cancelled until another `update` is triggered. * @param {Chart} chart - The chart instance. * @param {Object} args - The call arguments. * @param {Number} args.index - The dataset index. * @param {Object} args.meta - The dataset metadata. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart datasets drawing. */ /** * @method IPlugin#afterDatasetUpdate * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note * that this hook will not be called if the datasets update has been previously cancelled. * @param {Chart} chart - The chart instance. * @param {Object} args - The call arguments. * @param {Number} args.index - The dataset index. * @param {Object} args.meta - The dataset metadata. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeLayout * @desc Called before laying out `chart`. If any plugin returns `false`, * the layout update is cancelled until another `update` is triggered. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart layout. */ /** * @method IPlugin#afterLayout * @desc Called after the `chart` has been layed out. Note that this hook will not * be called if the layout update has been previously cancelled. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeRender * @desc Called before rendering `chart`. If any plugin returns `false`, * the rendering is cancelled until another `render` is triggered. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart rendering. */ /** * @method IPlugin#afterRender * @desc Called after the `chart` has been fully rendered (and animation completed). Note * that this hook will not be called if the rendering has been previously cancelled. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeDraw * @desc Called before drawing `chart` at every animation frame specified by the given * easing value. If any plugin returns `false`, the frame drawing is cancelled until * another `render` is triggered. * @param {Chart.Controller} chart - The chart instance. * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart drawing. */ /** * @method IPlugin#afterDraw * @desc Called after the `chart` has been drawn for the specific easing value. Note * that this hook will not be called if the drawing has been previously cancelled. * @param {Chart.Controller} chart - The chart instance. * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeDatasetsDraw * @desc Called before drawing the `chart` datasets. If any plugin returns `false`, * the datasets drawing is cancelled until another `render` is triggered. * @param {Chart.Controller} chart - The chart instance. * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart datasets drawing. */ /** * @method IPlugin#afterDatasetsDraw * @desc Called after the `chart` datasets have been drawn. Note that this hook * will not be called if the datasets drawing has been previously cancelled. * @param {Chart.Controller} chart - The chart instance. * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeDatasetDraw * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing * is cancelled until another `render` is triggered. * @param {Chart} chart - The chart instance. * @param {Object} args - The call arguments. * @param {Number} args.index - The dataset index. * @param {Object} args.meta - The dataset metadata. * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart datasets drawing. */ /** * @method IPlugin#afterDatasetDraw * @desc Called after the `chart` datasets at the given `args.index` have been drawn * (datasets are drawn in the reverse order). Note that this hook will not be called * if the datasets drawing has been previously cancelled. * @param {Chart} chart - The chart instance. * @param {Object} args - The call arguments. * @param {Number} args.index - The dataset index. * @param {Object} args.meta - The dataset metadata. * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeTooltipDraw * @desc Called before drawing the `tooltip`. If any plugin returns `false`, * the tooltip drawing is cancelled until another `render` is triggered. * @param {Chart} chart - The chart instance. * @param {Object} args - The call arguments. * @param {Object} args.tooltip - The tooltip. * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart tooltip drawing. */ /** * @method IPlugin#afterTooltipDraw * @desc Called after drawing the `tooltip`. Note that this hook will not * be called if the tooltip drawing has been previously cancelled. * @param {Chart} chart - The chart instance. * @param {Object} args - The call arguments. * @param {Object} args.tooltip - The tooltip. * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeEvent * @desc Called before processing the specified `event`. If any plugin returns `false`, * the event will be discarded. * @param {Chart.Controller} chart - The chart instance. * @param {IEvent} event - The event object. * @param {Object} options - The plugin options. */ /** * @method IPlugin#afterEvent * @desc Called after the `event` has been consumed. Note that this hook * will not be called if the `event` has been previously discarded. * @param {Chart.Controller} chart - The chart instance. * @param {IEvent} event - The event object. * @param {Object} options - The plugin options. */ /** * @method IPlugin#resize * @desc Called after the chart as been resized. * @param {Chart.Controller} chart - The chart instance. * @param {Number} size - The new canvas display size (eq. canvas.style width & height). * @param {Object} options - The plugin options. */ /** * @method IPlugin#destroy * @desc Called after the chart as been destroyed. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. */ /** * Provided for backward compatibility, use Chart.plugins instead * @namespace Chart.pluginService * @deprecated since version 2.1.5 * @todo remove at version 3 * @private */ Chart.pluginService = Chart.plugins; /** * Provided for backward compatibility, inheriting from Chart.PlugingBase has no * effect, instead simply create/register plugins via plain JavaScript objects. * @interface Chart.PluginBase * @deprecated since version 2.5.0 * @todo remove at version 3 * @private */ Chart.PluginBase = Element.extend({}); }; },{"25":25,"26":26,"45":45}],32:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); var Ticks = require(34); defaults._set('scale', { display: true, position: 'left', offset: false, // grid line settings gridLines: { display: true, color: 'rgba(0, 0, 0, 0.1)', lineWidth: 1, drawBorder: true, drawOnChartArea: true, drawTicks: true, tickMarkLength: 10, zeroLineWidth: 1, zeroLineColor: 'rgba(0,0,0,0.25)', zeroLineBorderDash: [], zeroLineBorderDashOffset: 0.0, offsetGridLines: false, borderDash: [], borderDashOffset: 0.0 }, // scale label scaleLabel: { // display property display: false, // actual label labelString: '', // line height lineHeight: 1.2, // top/bottom padding padding: { top: 4, bottom: 4 } }, // label settings ticks: { beginAtZero: false, minRotation: 0, maxRotation: 50, mirror: false, padding: 0, reverse: false, display: true, autoSkip: true, autoSkipPadding: 0, labelOffset: 0, // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. callback: Ticks.formatters.values, minor: {}, major: {} } }); function labelsFromTicks(ticks) { var labels = []; var i, ilen; for (i = 0, ilen = ticks.length; i < ilen; ++i) { labels.push(ticks[i].label); } return labels; } function getLineValue(scale, index, offsetGridLines) { var lineValue = scale.getPixelForTick(index); if (offsetGridLines) { if (index === 0) { lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; } else { lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; } } return lineValue; } module.exports = function(Chart) { function computeTextSize(context, tick, font) { return helpers.isArray(tick) ? helpers.longestText(context, font, tick) : context.measureText(tick).width; } function parseFontOptions(options) { var valueOrDefault = helpers.valueOrDefault; var globalDefaults = defaults.global; var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); var style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle); var family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily); return { size: size, style: style, family: family, font: helpers.fontString(size, style, family) }; } function parseLineHeight(options) { return helpers.options.toLineHeight( helpers.valueOrDefault(options.lineHeight, 1.2), helpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize)); } Chart.Scale = Element.extend({ /** * Get the padding needed for the scale * @method getPadding * @private * @returns {Padding} the necessary padding */ getPadding: function() { var me = this; return { left: me.paddingLeft || 0, top: me.paddingTop || 0, right: me.paddingRight || 0, bottom: me.paddingBottom || 0 }; }, /** * Returns the scale tick objects ({label, major}) * @since 2.7 */ getTicks: function() { return this._ticks; }, // These methods are ordered by lifecyle. Utilities then follow. // Any function defined here is inherited by all scale types. // Any function can be extended by the scale type mergeTicksOptions: function() { var ticks = this.options.ticks; if (ticks.minor === false) { ticks.minor = { display: false }; } if (ticks.major === false) { ticks.major = { display: false }; } for (var key in ticks) { if (key !== 'major' && key !== 'minor') { if (typeof ticks.minor[key] === 'undefined') { ticks.minor[key] = ticks[key]; } if (typeof ticks.major[key] === 'undefined') { ticks.major[key] = ticks[key]; } } } }, beforeUpdate: function() { helpers.callback(this.options.beforeUpdate, [this]); }, update: function(maxWidth, maxHeight, margins) { var me = this; var i, ilen, labels, label, ticks, tick; // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) me.beforeUpdate(); // Absorb the master measurements me.maxWidth = maxWidth; me.maxHeight = maxHeight; me.margins = helpers.extend({ left: 0, right: 0, top: 0, bottom: 0 }, margins); me.longestTextCache = me.longestTextCache || {}; // Dimensions me.beforeSetDimensions(); me.setDimensions(); me.afterSetDimensions(); // Data min/max me.beforeDataLimits(); me.determineDataLimits(); me.afterDataLimits(); // Ticks - `this.ticks` is now DEPRECATED! // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member // and must not be accessed directly from outside this class. `this.ticks` being // around for long time and not marked as private, we can't change its structure // without unexpected breaking changes. If you need to access the scale ticks, // use scale.getTicks() instead. me.beforeBuildTicks(); // New implementations should return an array of objects but for BACKWARD COMPAT, // we still support no return (`this.ticks` internally set by calling this method). ticks = me.buildTicks() || []; me.afterBuildTicks(); me.beforeTickToLabelConversion(); // New implementations should return the formatted tick labels but for BACKWARD // COMPAT, we still support no return (`this.ticks` internally changed by calling // this method and supposed to contain only string values). labels = me.convertTicksToLabels(ticks) || me.ticks; me.afterTickToLabelConversion(); me.ticks = labels; // BACKWARD COMPATIBILITY // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) for (i = 0, ilen = labels.length; i < ilen; ++i) { label = labels[i]; tick = ticks[i]; if (!tick) { ticks.push(tick = { label: label, major: false }); } else { tick.label = label; } } me._ticks = ticks; // Tick Rotation me.beforeCalculateTickRotation(); me.calculateTickRotation(); me.afterCalculateTickRotation(); // Fit me.beforeFit(); me.fit(); me.afterFit(); // me.afterUpdate(); return me.minSize; }, afterUpdate: function() { helpers.callback(this.options.afterUpdate, [this]); }, // beforeSetDimensions: function() { helpers.callback(this.options.beforeSetDimensions, [this]); }, setDimensions: function() { var me = this; // Set the unconstrained dimension before label rotation if (me.isHorizontal()) { // Reset position before calculating rotation me.width = me.maxWidth; me.left = 0; me.right = me.width; } else { me.height = me.maxHeight; // Reset position before calculating rotation me.top = 0; me.bottom = me.height; } // Reset padding me.paddingLeft = 0; me.paddingTop = 0; me.paddingRight = 0; me.paddingBottom = 0; }, afterSetDimensions: function() { helpers.callback(this.options.afterSetDimensions, [this]); }, // Data limits beforeDataLimits: function() { helpers.callback(this.options.beforeDataLimits, [this]); }, determineDataLimits: helpers.noop, afterDataLimits: function() { helpers.callback(this.options.afterDataLimits, [this]); }, // beforeBuildTicks: function() { helpers.callback(this.options.beforeBuildTicks, [this]); }, buildTicks: helpers.noop, afterBuildTicks: function() { helpers.callback(this.options.afterBuildTicks, [this]); }, beforeTickToLabelConversion: function() { helpers.callback(this.options.beforeTickToLabelConversion, [this]); }, convertTicksToLabels: function() { var me = this; // Convert ticks to strings var tickOpts = me.options.ticks; me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); }, afterTickToLabelConversion: function() { helpers.callback(this.options.afterTickToLabelConversion, [this]); }, // beforeCalculateTickRotation: function() { helpers.callback(this.options.beforeCalculateTickRotation, [this]); }, calculateTickRotation: function() { var me = this; var context = me.ctx; var tickOpts = me.options.ticks; var labels = labelsFromTicks(me._ticks); // Get the width of each grid by calculating the difference // between x offsets between 0 and 1. var tickFont = parseFontOptions(tickOpts); context.font = tickFont.font; var labelRotation = tickOpts.minRotation || 0; if (labels.length && me.options.display && me.isHorizontal()) { var originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache); var labelWidth = originalLabelWidth; var cosRotation, sinRotation; // Allow 3 pixels x2 padding either side for label readability var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; // Max label rotation can be set or default to 90 - also act as a loop counter while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { var angleRadians = helpers.toRadians(labelRotation); cosRotation = Math.cos(angleRadians); sinRotation = Math.sin(angleRadians); if (sinRotation * originalLabelWidth > me.maxHeight) { // go back one step labelRotation--; break; } labelRotation++; labelWidth = cosRotation * originalLabelWidth; } } me.labelRotation = labelRotation; }, afterCalculateTickRotation: function() { helpers.callback(this.options.afterCalculateTickRotation, [this]); }, // beforeFit: function() { helpers.callback(this.options.beforeFit, [this]); }, fit: function() { var me = this; // Reset var minSize = me.minSize = { width: 0, height: 0 }; var labels = labelsFromTicks(me._ticks); var opts = me.options; var tickOpts = opts.ticks; var scaleLabelOpts = opts.scaleLabel; var gridLineOpts = opts.gridLines; var display = opts.display; var isHorizontal = me.isHorizontal(); var tickFont = parseFontOptions(tickOpts); var tickMarkLength = opts.gridLines.tickMarkLength; // Width if (isHorizontal) { // subtract the margins to line up with the chartArea if we are a full width scale minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; } else { minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; } // height if (isHorizontal) { minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; } else { minSize.height = me.maxHeight; // fill all the height } // Are we showing a title for the scale? if (scaleLabelOpts.display && display) { var scaleLabelLineHeight = parseLineHeight(scaleLabelOpts); var scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding); var deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height; if (isHorizontal) { minSize.height += deltaHeight; } else { minSize.width += deltaHeight; } } // Don't bother fitting the ticks if we are not showing them if (tickOpts.display && display) { var largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache); var tallestLabelHeightInLines = helpers.numberOfLabelLines(labels); var lineSpace = tickFont.size * 0.5; var tickPadding = me.options.ticks.padding; if (isHorizontal) { // A horizontal axis is more constrained by the height. me.longestLabelWidth = largestTextWidth; var angleRadians = helpers.toRadians(me.labelRotation); var cosRotation = Math.cos(angleRadians); var sinRotation = Math.sin(angleRadians); // TODO - improve this calculation var labelHeight = (sinRotation * largestTextWidth) + (tickFont.size * tallestLabelHeightInLines) + (lineSpace * (tallestLabelHeightInLines - 1)) + lineSpace; // padding minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); me.ctx.font = tickFont.font; var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font); var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font); // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned // which means that the right padding is dominated by the font height if (me.labelRotation !== 0) { me.paddingLeft = opts.position === 'bottom' ? (cosRotation * firstLabelWidth) + 3 : (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges me.paddingRight = opts.position === 'bottom' ? (cosRotation * lineSpace) + 3 : (cosRotation * lastLabelWidth) + 3; } else { me.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges me.paddingRight = lastLabelWidth / 2 + 3; } } else { // A vertical axis is more constrained by the width. Labels are the // dominant factor here, so get that length first and account for padding if (tickOpts.mirror) { largestTextWidth = 0; } else { // use lineSpace for consistency with horizontal axis // tickPadding is not implemented for horizontal largestTextWidth += tickPadding + lineSpace; } minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); me.paddingTop = tickFont.size / 2; me.paddingBottom = tickFont.size / 2; } } me.handleMargins(); me.width = minSize.width; me.height = minSize.height; }, /** * Handle margins and padding interactions * @private */ handleMargins: function() { var me = this; if (me.margins) { me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); } }, afterFit: function() { helpers.callback(this.options.afterFit, [this]); }, // Shared Methods isHorizontal: function() { return this.options.position === 'top' || this.options.position === 'bottom'; }, isFullWidth: function() { return (this.options.fullWidth); }, // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not getRightValue: function(rawValue) { // Null and undefined values first if (helpers.isNullOrUndef(rawValue)) { return NaN; } // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values if (typeof rawValue === 'number' && !isFinite(rawValue)) { return NaN; } // If it is in fact an object, dive in one more level if (rawValue) { if (this.isHorizontal()) { if (rawValue.x !== undefined) { return this.getRightValue(rawValue.x); } } else if (rawValue.y !== undefined) { return this.getRightValue(rawValue.y); } } // Value is good, return it return rawValue; }, /** * Used to get the value to display in the tooltip for the data at the given index * @param index * @param datasetIndex */ getLabelForIndex: helpers.noop, /** * Returns the location of the given data point. Value can either be an index or a numerical value * The coordinate (0, 0) is at the upper-left corner of the canvas * @param value * @param index * @param datasetIndex */ getPixelForValue: helpers.noop, /** * Used to get the data value from a given pixel. This is the inverse of getPixelForValue * The coordinate (0, 0) is at the upper-left corner of the canvas * @param pixel */ getValueForPixel: helpers.noop, /** * Returns the location of the tick at the given index * The coordinate (0, 0) is at the upper-left corner of the canvas */ getPixelForTick: function(index) { var me = this; var offset = me.options.offset; if (me.isHorizontal()) { var innerWidth = me.width - (me.paddingLeft + me.paddingRight); var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); var pixel = (tickWidth * index) + me.paddingLeft; if (offset) { pixel += tickWidth / 2; } var finalVal = me.left + Math.round(pixel); finalVal += me.isFullWidth() ? me.margins.left : 0; return finalVal; } var innerHeight = me.height - (me.paddingTop + me.paddingBottom); return me.top + (index * (innerHeight / (me._ticks.length - 1))); }, /** * Utility for getting the pixel location of a percentage of scale * The coordinate (0, 0) is at the upper-left corner of the canvas */ getPixelForDecimal: function(decimal) { var me = this; if (me.isHorizontal()) { var innerWidth = me.width - (me.paddingLeft + me.paddingRight); var valueOffset = (innerWidth * decimal) + me.paddingLeft; var finalVal = me.left + Math.round(valueOffset); finalVal += me.isFullWidth() ? me.margins.left : 0; return finalVal; } return me.top + (decimal * me.height); }, /** * Returns the pixel for the minimum chart value * The coordinate (0, 0) is at the upper-left corner of the canvas */ getBasePixel: function() { return this.getPixelForValue(this.getBaseValue()); }, getBaseValue: function() { var me = this; var min = me.min; var max = me.max; return me.beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0; }, /** * Returns a subset of ticks to be plotted to avoid overlapping labels. * @private */ _autoSkip: function(ticks) { var skipRatio; var me = this; var isHorizontal = me.isHorizontal(); var optionTicks = me.options.ticks.minor; var tickCount = ticks.length; var labelRotationRadians = helpers.toRadians(me.labelRotation); var cosRotation = Math.cos(labelRotationRadians); var longestRotatedLabel = me.longestLabelWidth * cosRotation; var result = []; var i, tick, shouldSkip; // figure out the maximum number of gridlines to show var maxTicks; if (optionTicks.maxTicksLimit) { maxTicks = optionTicks.maxTicksLimit; } if (isHorizontal) { skipRatio = false; if ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > (me.width - (me.paddingLeft + me.paddingRight))) { skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount) / (me.width - (me.paddingLeft + me.paddingRight))); } // if they defined a max number of optionTicks, // increase skipRatio until that number is met if (maxTicks && tickCount > maxTicks) { skipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks)); } } for (i = 0; i < tickCount; i++) { tick = ticks[i]; // Since we always show the last tick,we need may need to hide the last shown one before shouldSkip = (skipRatio > 1 && i % skipRatio > 0) || (i % skipRatio === 0 && i + skipRatio >= tickCount); if (shouldSkip && i !== tickCount - 1) { // leave tick in place but make sure it's not displayed (#4635) delete tick.label; } result.push(tick); } return result; }, // Actually draw the scale on the canvas // @param {rectangle} chartArea : the area of the chart to draw full grid lines on draw: function(chartArea) { var me = this; var options = me.options; if (!options.display) { return; } var context = me.ctx; var globalDefaults = defaults.global; var optionTicks = options.ticks.minor; var optionMajorTicks = options.ticks.major || optionTicks; var gridLines = options.gridLines; var scaleLabel = options.scaleLabel; var isRotated = me.labelRotation !== 0; var isHorizontal = me.isHorizontal(); var ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); var tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor); var tickFont = parseFontOptions(optionTicks); var majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor); var majorTickFont = parseFontOptions(optionMajorTicks); var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; var scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor); var scaleLabelFont = parseFontOptions(scaleLabel); var scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding); var labelRotationRadians = helpers.toRadians(me.labelRotation); var itemsToDraw = []; var xTickStart = options.position === 'right' ? me.left : me.right - tl; var xTickEnd = options.position === 'right' ? me.left + tl : me.right; var yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl; var yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom; helpers.each(ticks, function(tick, index) { // autoskipper skipped this tick (#4635) if (helpers.isNullOrUndef(tick.label)) { return; } var label = tick.label; var lineWidth, lineColor, borderDash, borderDashOffset; if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { // Draw the first index specially lineWidth = gridLines.zeroLineWidth; lineColor = gridLines.zeroLineColor; borderDash = gridLines.zeroLineBorderDash; borderDashOffset = gridLines.zeroLineBorderDashOffset; } else { lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index); lineColor = helpers.valueAtIndexOrDefault(gridLines.color, index); borderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash); borderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset); } // Common properties var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY; var textAlign = 'middle'; var textBaseline = 'middle'; var tickPadding = optionTicks.padding; if (isHorizontal) { var labelYOffset = tl + tickPadding; if (options.position === 'bottom') { // bottom textBaseline = !isRotated ? 'top' : 'middle'; textAlign = !isRotated ? 'center' : 'right'; labelY = me.top + labelYOffset; } else { // top textBaseline = !isRotated ? 'bottom' : 'middle'; textAlign = !isRotated ? 'center' : 'left'; labelY = me.bottom - labelYOffset; } var xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1); if (xLineValue < me.left) { lineColor = 'rgba(0,0,0,0)'; } xLineValue += helpers.aliasPixel(lineWidth); labelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option) tx1 = tx2 = x1 = x2 = xLineValue; ty1 = yTickStart; ty2 = yTickEnd; y1 = chartArea.top; y2 = chartArea.bottom; } else { var isLeft = options.position === 'left'; var labelXOffset; if (optionTicks.mirror) { textAlign = isLeft ? 'left' : 'right'; labelXOffset = tickPadding; } else { textAlign = isLeft ? 'right' : 'left'; labelXOffset = tl + tickPadding; } labelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset; var yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1); if (yLineValue < me.top) { lineColor = 'rgba(0,0,0,0)'; } yLineValue += helpers.aliasPixel(lineWidth); labelY = me.getPixelForTick(index) + optionTicks.labelOffset; tx1 = xTickStart; tx2 = xTickEnd; x1 = chartArea.left; x2 = chartArea.right; ty1 = ty2 = y1 = y2 = yLineValue; } itemsToDraw.push({ tx1: tx1, ty1: ty1, tx2: tx2, ty2: ty2, x1: x1, y1: y1, x2: x2, y2: y2, labelX: labelX, labelY: labelY, glWidth: lineWidth, glColor: lineColor, glBorderDash: borderDash, glBorderDashOffset: borderDashOffset, rotation: -1 * labelRotationRadians, label: label, major: tick.major, textBaseline: textBaseline, textAlign: textAlign }); }); // Draw all of the tick labels, tick marks, and grid lines at the correct places helpers.each(itemsToDraw, function(itemToDraw) { if (gridLines.display) { context.save(); context.lineWidth = itemToDraw.glWidth; context.strokeStyle = itemToDraw.glColor; if (context.setLineDash) { context.setLineDash(itemToDraw.glBorderDash); context.lineDashOffset = itemToDraw.glBorderDashOffset; } context.beginPath(); if (gridLines.drawTicks) { context.moveTo(itemToDraw.tx1, itemToDraw.ty1); context.lineTo(itemToDraw.tx2, itemToDraw.ty2); } if (gridLines.drawOnChartArea) { context.moveTo(itemToDraw.x1, itemToDraw.y1); context.lineTo(itemToDraw.x2, itemToDraw.y2); } context.stroke(); context.restore(); } if (optionTicks.display) { // Make sure we draw text in the correct color and font context.save(); context.translate(itemToDraw.labelX, itemToDraw.labelY); context.rotate(itemToDraw.rotation); context.font = itemToDraw.major ? majorTickFont.font : tickFont.font; context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; context.textBaseline = itemToDraw.textBaseline; context.textAlign = itemToDraw.textAlign; var label = itemToDraw.label; if (helpers.isArray(label)) { for (var i = 0, y = 0; i < label.length; ++i) { // We just make sure the multiline element is a string here.. context.fillText('' + label[i], 0, y); // apply same lineSpacing as calculated @ L#320 y += (tickFont.size * 1.5); } } else { context.fillText(label, 0, 0); } context.restore(); } }); if (scaleLabel.display) { // Draw the scale label var scaleLabelX; var scaleLabelY; var rotation = 0; var halfLineHeight = parseLineHeight(scaleLabel) / 2; if (isHorizontal) { scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width scaleLabelY = options.position === 'bottom' ? me.bottom - halfLineHeight - scaleLabelPadding.bottom : me.top + halfLineHeight + scaleLabelPadding.top; } else { var isLeft = options.position === 'left'; scaleLabelX = isLeft ? me.left + halfLineHeight + scaleLabelPadding.top : me.right - halfLineHeight - scaleLabelPadding.top; scaleLabelY = me.top + ((me.bottom - me.top) / 2); rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; } context.save(); context.translate(scaleLabelX, scaleLabelY); context.rotate(rotation); context.textAlign = 'center'; context.textBaseline = 'middle'; context.fillStyle = scaleLabelFontColor; // render in correct colour context.font = scaleLabelFont.font; context.fillText(scaleLabel.labelString, 0, 0); context.restore(); } if (gridLines.drawBorder) { // Draw the line at the edge of the axis context.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0); context.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0); var x1 = me.left; var x2 = me.right; var y1 = me.top; var y2 = me.bottom; var aliasPixel = helpers.aliasPixel(context.lineWidth); if (isHorizontal) { y1 = y2 = options.position === 'top' ? me.bottom : me.top; y1 += aliasPixel; y2 += aliasPixel; } else { x1 = x2 = options.position === 'left' ? me.right : me.left; x1 += aliasPixel; x2 += aliasPixel; } context.beginPath(); context.moveTo(x1, y1); context.lineTo(x2, y2); context.stroke(); } } }); }; },{"25":25,"26":26,"34":34,"45":45}],33:[function(require,module,exports){ 'use strict'; var defaults = require(25); var helpers = require(45); module.exports = function(Chart) { Chart.scaleService = { // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then // use the new chart options to grab the correct scale constructors: {}, // Use a registration function so that we can move to an ES6 map when we no longer need to support // old browsers // Scale config defaults defaults: {}, registerScaleType: function(type, scaleConstructor, scaleDefaults) { this.constructors[type] = scaleConstructor; this.defaults[type] = helpers.clone(scaleDefaults); }, getScaleConstructor: function(type) { return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; }, getScaleDefaults: function(type) { // Return the scale defaults merged with the global settings so that we always use the latest ones return this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {}; }, updateScaleDefaults: function(type, additions) { var me = this; if (me.defaults.hasOwnProperty(type)) { me.defaults[type] = helpers.extend(me.defaults[type], additions); } }, addScalesToLayout: function(chart) { // Adds each scale to the chart.boxes array to be sized accordingly helpers.each(chart.scales, function(scale) { // Set ILayoutItem parameters for backwards compatibility scale.fullWidth = scale.options.fullWidth; scale.position = scale.options.position; scale.weight = scale.options.weight; Chart.layoutService.addBox(chart, scale); }); } }; }; },{"25":25,"45":45}],34:[function(require,module,exports){ 'use strict'; var helpers = require(45); /** * Namespace to hold static tick generation functions * @namespace Chart.Ticks */ module.exports = { /** * Namespace to hold generators for different types of ticks * @namespace Chart.Ticks.generators */ generators: { /** * Interface for the options provided to the numeric tick generator * @interface INumericTickGenerationOptions */ /** * The maximum number of ticks to display * @name INumericTickGenerationOptions#maxTicks * @type Number */ /** * The distance between each tick. * @name INumericTickGenerationOptions#stepSize * @type Number * @optional */ /** * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum * @name INumericTickGenerationOptions#min * @type Number * @optional */ /** * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum * @name INumericTickGenerationOptions#max * @type Number * @optional */ /** * Generate a set of linear ticks * @method Chart.Ticks.generators.linear * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks * @param dataRange {IRange} the range of the data * @returns {Array} array of tick values */ linear: function(generationOptions, dataRange) { var ticks = []; // To get a "nice" value for the tick spacing, we will use the appropriately named // "nice number" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks // for details. var spacing; if (generationOptions.stepSize && generationOptions.stepSize > 0) { spacing = generationOptions.stepSize; } else { var niceRange = helpers.niceNum(dataRange.max - dataRange.min, false); spacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true); } var niceMin = Math.floor(dataRange.min / spacing) * spacing; var niceMax = Math.ceil(dataRange.max / spacing) * spacing; // If min, max and stepSize is set and they make an evenly spaced scale use it. if (generationOptions.min && generationOptions.max && generationOptions.stepSize) { // If very close to our whole number, use it. if (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) { niceMin = generationOptions.min; niceMax = generationOptions.max; } } var numSpaces = (niceMax - niceMin) / spacing; // If very close to our rounded value, use it. if (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { numSpaces = Math.round(numSpaces); } else { numSpaces = Math.ceil(numSpaces); } // Put the values into the ticks array ticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin); for (var j = 1; j < numSpaces; ++j) { ticks.push(niceMin + (j * spacing)); } ticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax); return ticks; }, /** * Generate a set of logarithmic ticks * @method Chart.Ticks.generators.logarithmic * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks * @param dataRange {IRange} the range of the data * @returns {Array} array of tick values */ logarithmic: function(generationOptions, dataRange) { var ticks = []; var valueOrDefault = helpers.valueOrDefault; // Figure out what the max number of ticks we can support it is based on the size of // the axis area. For now, we say that the minimum tick spacing in pixels must be 50 // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on // the graph var tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min)))); var endExp = Math.floor(helpers.log10(dataRange.max)); var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); var exp, significand; if (tickVal === 0) { exp = Math.floor(helpers.log10(dataRange.minNotZero)); significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); ticks.push(tickVal); tickVal = significand * Math.pow(10, exp); } else { exp = Math.floor(helpers.log10(tickVal)); significand = Math.floor(tickVal / Math.pow(10, exp)); } do { ticks.push(tickVal); ++significand; if (significand === 10) { significand = 1; ++exp; } tickVal = significand * Math.pow(10, exp); } while (exp < endExp || (exp === endExp && significand < endSignificand)); var lastTick = valueOrDefault(generationOptions.max, tickVal); ticks.push(lastTick); return ticks; } }, /** * Namespace to hold formatters for different types of ticks * @namespace Chart.Ticks.formatters */ formatters: { /** * Formatter for value labels * @method Chart.Ticks.formatters.values * @param value the value to display * @return {String|Array} the label to display */ values: function(value) { return helpers.isArray(value) ? value : '' + value; }, /** * Formatter for linear numeric ticks * @method Chart.Ticks.formatters.linear * @param tickValue {Number} the value to be formatted * @param index {Number} the position of the tickValue parameter in the ticks array * @param ticks {Array} the list of ticks being converted * @return {String} string representation of the tickValue parameter */ linear: function(tickValue, index, ticks) { // If we have lots of ticks, don't use the ones var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; // If we have a number like 2.5 as the delta, figure out how many decimal places we need if (Math.abs(delta) > 1) { if (tickValue !== Math.floor(tickValue)) { // not an integer delta = tickValue - Math.floor(tickValue); } } var logDelta = helpers.log10(Math.abs(delta)); var tickString = ''; if (tickValue !== 0) { var numDecimal = -1 * Math.floor(logDelta); numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places tickString = tickValue.toFixed(numDecimal); } else { tickString = '0'; // never show decimal places for 0 } return tickString; }, logarithmic: function(tickValue, index, ticks) { var remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue)))); if (tickValue === 0) { return '0'; } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { return tickValue.toExponential(); } return ''; } } }; },{"45":45}],35:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); defaults._set('global', { tooltips: { enabled: true, custom: null, mode: 'nearest', position: 'average', intersect: true, backgroundColor: 'rgba(0,0,0,0.8)', titleFontStyle: 'bold', titleSpacing: 2, titleMarginBottom: 6, titleFontColor: '#fff', titleAlign: 'left', bodySpacing: 2, bodyFontColor: '#fff', bodyAlign: 'left', footerFontStyle: 'bold', footerSpacing: 2, footerMarginTop: 6, footerFontColor: '#fff', footerAlign: 'left', yPadding: 6, xPadding: 6, caretPadding: 2, caretSize: 5, cornerRadius: 6, multiKeyBackground: '#fff', displayColors: true, borderColor: 'rgba(0,0,0,0)', borderWidth: 0, callbacks: { // Args are: (tooltipItems, data) beforeTitle: helpers.noop, title: function(tooltipItems, data) { // Pick first xLabel for now var title = ''; var labels = data.labels; var labelCount = labels ? labels.length : 0; if (tooltipItems.length > 0) { var item = tooltipItems[0]; if (item.xLabel) { title = item.xLabel; } else if (labelCount > 0 && item.index < labelCount) { title = labels[item.index]; } } return title; }, afterTitle: helpers.noop, // Args are: (tooltipItems, data) beforeBody: helpers.noop, // Args are: (tooltipItem, data) beforeLabel: helpers.noop, label: function(tooltipItem, data) { var label = data.datasets[tooltipItem.datasetIndex].label || ''; if (label) { label += ': '; } label += tooltipItem.yLabel; return label; }, labelColor: function(tooltipItem, chart) { var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); var activeElement = meta.data[tooltipItem.index]; var view = activeElement._view; return { borderColor: view.borderColor, backgroundColor: view.backgroundColor }; }, labelTextColor: function() { return this._options.bodyFontColor; }, afterLabel: helpers.noop, // Args are: (tooltipItems, data) afterBody: helpers.noop, // Args are: (tooltipItems, data) beforeFooter: helpers.noop, footer: helpers.noop, afterFooter: helpers.noop } } }); module.exports = function(Chart) { /** * Helper method to merge the opacity into a color */ function mergeOpacity(colorString, opacity) { var color = helpers.color(colorString); return color.alpha(opacity * color.alpha()).rgbaString(); } // Helper to push or concat based on if the 2nd parameter is an array or not function pushOrConcat(base, toPush) { if (toPush) { if (helpers.isArray(toPush)) { // base = base.concat(toPush); Array.prototype.push.apply(base, toPush); } else { base.push(toPush); } } return base; } // Private helper to create a tooltip item model // @param element : the chart element (point, arc, bar) to create the tooltip item for // @return : new tooltip item function createTooltipItem(element) { var xScale = element._xScale; var yScale = element._yScale || element._scale; // handle radar || polarArea charts var index = element._index; var datasetIndex = element._datasetIndex; return { xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', index: index, datasetIndex: datasetIndex, x: element._model.x, y: element._model.y }; } /** * Helper to get the reset model for the tooltip * @param tooltipOpts {Object} the tooltip options */ function getBaseModel(tooltipOpts) { var globalDefaults = defaults.global; var valueOrDefault = helpers.valueOrDefault; return { // Positioning xPadding: tooltipOpts.xPadding, yPadding: tooltipOpts.yPadding, xAlign: tooltipOpts.xAlign, yAlign: tooltipOpts.yAlign, // Body bodyFontColor: tooltipOpts.bodyFontColor, _bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), _bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), _bodyAlign: tooltipOpts.bodyAlign, bodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), bodySpacing: tooltipOpts.bodySpacing, // Title titleFontColor: tooltipOpts.titleFontColor, _titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), _titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), titleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), _titleAlign: tooltipOpts.titleAlign, titleSpacing: tooltipOpts.titleSpacing, titleMarginBottom: tooltipOpts.titleMarginBottom, // Footer footerFontColor: tooltipOpts.footerFontColor, _footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), _footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), footerFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), _footerAlign: tooltipOpts.footerAlign, footerSpacing: tooltipOpts.footerSpacing, footerMarginTop: tooltipOpts.footerMarginTop, // Appearance caretSize: tooltipOpts.caretSize, cornerRadius: tooltipOpts.cornerRadius, backgroundColor: tooltipOpts.backgroundColor, opacity: 0, legendColorBackground: tooltipOpts.multiKeyBackground, displayColors: tooltipOpts.displayColors, borderColor: tooltipOpts.borderColor, borderWidth: tooltipOpts.borderWidth }; } /** * Get the size of the tooltip */ function getTooltipSize(tooltip, model) { var ctx = tooltip._chart.ctx; var height = model.yPadding * 2; // Tooltip Padding var width = 0; // Count of all lines in the body var body = model.body; var combinedBodyLength = body.reduce(function(count, bodyItem) { return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; }, 0); combinedBodyLength += model.beforeBody.length + model.afterBody.length; var titleLineCount = model.title.length; var footerLineCount = model.footer.length; var titleFontSize = model.titleFontSize; var bodyFontSize = model.bodyFontSize; var footerFontSize = model.footerFontSize; height += titleLineCount * titleFontSize; // Title Lines height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin height += combinedBodyLength * bodyFontSize; // Body Lines height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin height += footerLineCount * (footerFontSize); // Footer Lines height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing // Title width var widthPadding = 0; var maxLineWidth = function(line) { width = Math.max(width, ctx.measureText(line).width + widthPadding); }; ctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); helpers.each(model.title, maxLineWidth); // Body width ctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); helpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth); // Body lines may include some extra width due to the color box widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; helpers.each(body, function(bodyItem) { helpers.each(bodyItem.before, maxLineWidth); helpers.each(bodyItem.lines, maxLineWidth); helpers.each(bodyItem.after, maxLineWidth); }); // Reset back to 0 widthPadding = 0; // Footer width ctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); helpers.each(model.footer, maxLineWidth); // Add padding width += 2 * model.xPadding; return { width: width, height: height }; } /** * Helper to get the alignment of a tooltip given the size */ function determineAlignment(tooltip, size) { var model = tooltip._model; var chart = tooltip._chart; var chartArea = tooltip._chart.chartArea; var xAlign = 'center'; var yAlign = 'center'; if (model.y < size.height) { yAlign = 'top'; } else if (model.y > (chart.height - size.height)) { yAlign = 'bottom'; } var lf, rf; // functions to determine left, right alignment var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges var midX = (chartArea.left + chartArea.right) / 2; var midY = (chartArea.top + chartArea.bottom) / 2; if (yAlign === 'center') { lf = function(x) { return x <= midX; }; rf = function(x) { return x > midX; }; } else { lf = function(x) { return x <= (size.width / 2); }; rf = function(x) { return x >= (chart.width - (size.width / 2)); }; } olf = function(x) { return x + size.width > chart.width; }; orf = function(x) { return x - size.width < 0; }; yf = function(y) { return y <= midY ? 'top' : 'bottom'; }; if (lf(model.x)) { xAlign = 'left'; // Is tooltip too wide and goes over the right side of the chart.? if (olf(model.x)) { xAlign = 'center'; yAlign = yf(model.y); } } else if (rf(model.x)) { xAlign = 'right'; // Is tooltip too wide and goes outside left edge of canvas? if (orf(model.x)) { xAlign = 'center'; yAlign = yf(model.y); } } var opts = tooltip._options; return { xAlign: opts.xAlign ? opts.xAlign : xAlign, yAlign: opts.yAlign ? opts.yAlign : yAlign }; } /** * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment */ function getBackgroundPoint(vm, size, alignment) { // Background Position var x = vm.x; var y = vm.y; var caretSize = vm.caretSize; var caretPadding = vm.caretPadding; var cornerRadius = vm.cornerRadius; var xAlign = alignment.xAlign; var yAlign = alignment.yAlign; var paddingAndSize = caretSize + caretPadding; var radiusAndPadding = cornerRadius + caretPadding; if (xAlign === 'right') { x -= size.width; } else if (xAlign === 'center') { x -= (size.width / 2); } if (yAlign === 'top') { y += paddingAndSize; } else if (yAlign === 'bottom') { y -= size.height + paddingAndSize; } else { y -= (size.height / 2); } if (yAlign === 'center') { if (xAlign === 'left') { x += paddingAndSize; } else if (xAlign === 'right') { x -= paddingAndSize; } } else if (xAlign === 'left') { x -= radiusAndPadding; } else if (xAlign === 'right') { x += radiusAndPadding; } return { x: x, y: y }; } Chart.Tooltip = Element.extend({ initialize: function() { this._model = getBaseModel(this._options); this._lastActive = []; }, // Get the title // Args are: (tooltipItem, data) getTitle: function() { var me = this; var opts = me._options; var callbacks = opts.callbacks; var beforeTitle = callbacks.beforeTitle.apply(me, arguments); var title = callbacks.title.apply(me, arguments); var afterTitle = callbacks.afterTitle.apply(me, arguments); var lines = []; lines = pushOrConcat(lines, beforeTitle); lines = pushOrConcat(lines, title); lines = pushOrConcat(lines, afterTitle); return lines; }, // Args are: (tooltipItem, data) getBeforeBody: function() { var lines = this._options.callbacks.beforeBody.apply(this, arguments); return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : []; }, // Args are: (tooltipItem, data) getBody: function(tooltipItems, data) { var me = this; var callbacks = me._options.callbacks; var bodyItems = []; helpers.each(tooltipItems, function(tooltipItem) { var bodyItem = { before: [], lines: [], after: [] }; pushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data)); pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); pushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data)); bodyItems.push(bodyItem); }); return bodyItems; }, // Args are: (tooltipItem, data) getAfterBody: function() { var lines = this._options.callbacks.afterBody.apply(this, arguments); return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : []; }, // Get the footer and beforeFooter and afterFooter lines // Args are: (tooltipItem, data) getFooter: function() { var me = this; var callbacks = me._options.callbacks; var beforeFooter = callbacks.beforeFooter.apply(me, arguments); var footer = callbacks.footer.apply(me, arguments); var afterFooter = callbacks.afterFooter.apply(me, arguments); var lines = []; lines = pushOrConcat(lines, beforeFooter); lines = pushOrConcat(lines, footer); lines = pushOrConcat(lines, afterFooter); return lines; }, update: function(changed) { var me = this; var opts = me._options; // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time // which breaks any animations. var existingModel = me._model; var model = me._model = getBaseModel(opts); var active = me._active; var data = me._data; // In the case where active.length === 0 we need to keep these at existing values for good animations var alignment = { xAlign: existingModel.xAlign, yAlign: existingModel.yAlign }; var backgroundPoint = { x: existingModel.x, y: existingModel.y }; var tooltipSize = { width: existingModel.width, height: existingModel.height }; var tooltipPosition = { x: existingModel.caretX, y: existingModel.caretY }; var i, len; if (active.length) { model.opacity = 1; var labelColors = []; var labelTextColors = []; tooltipPosition = Chart.Tooltip.positioners[opts.position].call(me, active, me._eventPosition); var tooltipItems = []; for (i = 0, len = active.length; i < len; ++i) { tooltipItems.push(createTooltipItem(active[i])); } // If the user provided a filter function, use it to modify the tooltip items if (opts.filter) { tooltipItems = tooltipItems.filter(function(a) { return opts.filter(a, data); }); } // If the user provided a sorting function, use it to modify the tooltip items if (opts.itemSort) { tooltipItems = tooltipItems.sort(function(a, b) { return opts.itemSort(a, b, data); }); } // Determine colors for boxes helpers.each(tooltipItems, function(tooltipItem) { labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); }); // Build the Text Lines model.title = me.getTitle(tooltipItems, data); model.beforeBody = me.getBeforeBody(tooltipItems, data); model.body = me.getBody(tooltipItems, data); model.afterBody = me.getAfterBody(tooltipItems, data); model.footer = me.getFooter(tooltipItems, data); // Initial positioning and colors model.x = Math.round(tooltipPosition.x); model.y = Math.round(tooltipPosition.y); model.caretPadding = opts.caretPadding; model.labelColors = labelColors; model.labelTextColors = labelTextColors; // data points model.dataPoints = tooltipItems; // We need to determine alignment of the tooltip tooltipSize = getTooltipSize(this, model); alignment = determineAlignment(this, tooltipSize); // Final Size and Position backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment); } else { model.opacity = 0; } model.xAlign = alignment.xAlign; model.yAlign = alignment.yAlign; model.x = backgroundPoint.x; model.y = backgroundPoint.y; model.width = tooltipSize.width; model.height = tooltipSize.height; // Point where the caret on the tooltip points to model.caretX = tooltipPosition.x; model.caretY = tooltipPosition.y; me._model = model; if (changed && opts.custom) { opts.custom.call(me, model); } return me; }, drawCaret: function(tooltipPoint, size) { var ctx = this._chart.ctx; var vm = this._view; var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); ctx.lineTo(caretPosition.x1, caretPosition.y1); ctx.lineTo(caretPosition.x2, caretPosition.y2); ctx.lineTo(caretPosition.x3, caretPosition.y3); }, getCaretPosition: function(tooltipPoint, size, vm) { var x1, x2, x3, y1, y2, y3; var caretSize = vm.caretSize; var cornerRadius = vm.cornerRadius; var xAlign = vm.xAlign; var yAlign = vm.yAlign; var ptX = tooltipPoint.x; var ptY = tooltipPoint.y; var width = size.width; var height = size.height; if (yAlign === 'center') { y2 = ptY + (height / 2); if (xAlign === 'left') { x1 = ptX; x2 = x1 - caretSize; x3 = x1; y1 = y2 + caretSize; y3 = y2 - caretSize; } else { x1 = ptX + width; x2 = x1 + caretSize; x3 = x1; y1 = y2 - caretSize; y3 = y2 + caretSize; } } else { if (xAlign === 'left') { x2 = ptX + cornerRadius + (caretSize); x1 = x2 - caretSize; x3 = x2 + caretSize; } else if (xAlign === 'right') { x2 = ptX + width - cornerRadius - caretSize; x1 = x2 - caretSize; x3 = x2 + caretSize; } else { x2 = ptX + (width / 2); x1 = x2 - caretSize; x3 = x2 + caretSize; } if (yAlign === 'top') { y1 = ptY; y2 = y1 - caretSize; y3 = y1; } else { y1 = ptY + height; y2 = y1 + caretSize; y3 = y1; // invert drawing order var tmp = x3; x3 = x1; x1 = tmp; } } return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; }, drawTitle: function(pt, vm, ctx, opacity) { var title = vm.title; if (title.length) { ctx.textAlign = vm._titleAlign; ctx.textBaseline = 'top'; var titleFontSize = vm.titleFontSize; var titleSpacing = vm.titleSpacing; ctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity); ctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); var i, len; for (i = 0, len = title.length; i < len; ++i) { ctx.fillText(title[i], pt.x, pt.y); pt.y += titleFontSize + titleSpacing; // Line Height and spacing if (i + 1 === title.length) { pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing } } } }, drawBody: function(pt, vm, ctx, opacity) { var bodyFontSize = vm.bodyFontSize; var bodySpacing = vm.bodySpacing; var body = vm.body; ctx.textAlign = vm._bodyAlign; ctx.textBaseline = 'top'; ctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); // Before Body var xLinePadding = 0; var fillLineOfText = function(line) { ctx.fillText(line, pt.x + xLinePadding, pt.y); pt.y += bodyFontSize + bodySpacing; }; // Before body lines ctx.fillStyle = mergeOpacity(vm.bodyFontColor, opacity); helpers.each(vm.beforeBody, fillLineOfText); var drawColorBoxes = vm.displayColors; xLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0; // Draw body lines now helpers.each(body, function(bodyItem, i) { var textColor = mergeOpacity(vm.labelTextColors[i], opacity); ctx.fillStyle = textColor; helpers.each(bodyItem.before, fillLineOfText); helpers.each(bodyItem.lines, function(line) { // Draw Legend-like boxes if needed if (drawColorBoxes) { // Fill a white rect so that colours merge nicely if the opacity is < 1 ctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity); ctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize); // Border ctx.lineWidth = 1; ctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity); ctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize); // Inner square ctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity); ctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); ctx.fillStyle = textColor; } fillLineOfText(line); }); helpers.each(bodyItem.after, fillLineOfText); }); // Reset back to 0 for after body xLinePadding = 0; // After body lines helpers.each(vm.afterBody, fillLineOfText); pt.y -= bodySpacing; // Remove last body spacing }, drawFooter: function(pt, vm, ctx, opacity) { var footer = vm.footer; if (footer.length) { pt.y += vm.footerMarginTop; ctx.textAlign = vm._footerAlign; ctx.textBaseline = 'top'; ctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity); ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); helpers.each(footer, function(line) { ctx.fillText(line, pt.x, pt.y); pt.y += vm.footerFontSize + vm.footerSpacing; }); } }, drawBackground: function(pt, vm, ctx, tooltipSize, opacity) { ctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity); ctx.strokeStyle = mergeOpacity(vm.borderColor, opacity); ctx.lineWidth = vm.borderWidth; var xAlign = vm.xAlign; var yAlign = vm.yAlign; var x = pt.x; var y = pt.y; var width = tooltipSize.width; var height = tooltipSize.height; var radius = vm.cornerRadius; ctx.beginPath(); ctx.moveTo(x + radius, y); if (yAlign === 'top') { this.drawCaret(pt, tooltipSize); } ctx.lineTo(x + width - radius, y); ctx.quadraticCurveTo(x + width, y, x + width, y + radius); if (yAlign === 'center' && xAlign === 'right') { this.drawCaret(pt, tooltipSize); } ctx.lineTo(x + width, y + height - radius); ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); if (yAlign === 'bottom') { this.drawCaret(pt, tooltipSize); } ctx.lineTo(x + radius, y + height); ctx.quadraticCurveTo(x, y + height, x, y + height - radius); if (yAlign === 'center' && xAlign === 'left') { this.drawCaret(pt, tooltipSize); } ctx.lineTo(x, y + radius); ctx.quadraticCurveTo(x, y, x + radius, y); ctx.closePath(); ctx.fill(); if (vm.borderWidth > 0) { ctx.stroke(); } }, draw: function() { var ctx = this._chart.ctx; var vm = this._view; if (vm.opacity === 0) { return; } var tooltipSize = { width: vm.width, height: vm.height }; var pt = { x: vm.x, y: vm.y }; // IE11/Edge does not like very small opacities, so snap to 0 var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; // Truthy/falsey value for empty tooltip var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; if (this._options.enabled && hasTooltipContent) { // Draw Background this.drawBackground(pt, vm, ctx, tooltipSize, opacity); // Draw Title, Body, and Footer pt.x += vm.xPadding; pt.y += vm.yPadding; // Titles this.drawTitle(pt, vm, ctx, opacity); // Body this.drawBody(pt, vm, ctx, opacity); // Footer this.drawFooter(pt, vm, ctx, opacity); } }, /** * Handle an event * @private * @param {IEvent} event - The event to handle * @returns {Boolean} true if the tooltip changed */ handleEvent: function(e) { var me = this; var options = me._options; var changed = false; me._lastActive = me._lastActive || []; // Find Active Elements for tooltips if (e.type === 'mouseout') { me._active = []; } else { me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); } // Remember Last Actives changed = !helpers.arrayEquals(me._active, me._lastActive); // If tooltip didn't change, do not handle the target event if (!changed) { return false; } me._lastActive = me._active; if (options.enabled || options.custom) { me._eventPosition = { x: e.x, y: e.y }; var model = me._model; me.update(true); me.pivot(); // See if our tooltip position changed changed |= (model.x !== me._model.x) || (model.y !== me._model.y); } return changed; } }); /** * @namespace Chart.Tooltip.positioners */ Chart.Tooltip.positioners = { /** * Average mode places the tooltip at the average position of the elements shown * @function Chart.Tooltip.positioners.average * @param elements {ChartElement[]} the elements being displayed in the tooltip * @returns {Point} tooltip position */ average: function(elements) { if (!elements.length) { return false; } var i, len; var x = 0; var y = 0; var count = 0; for (i = 0, len = elements.length; i < len; ++i) { var el = elements[i]; if (el && el.hasValue()) { var pos = el.tooltipPosition(); x += pos.x; y += pos.y; ++count; } } return { x: Math.round(x / count), y: Math.round(y / count) }; }, /** * Gets the tooltip position nearest of the item nearest to the event position * @function Chart.Tooltip.positioners.nearest * @param elements {Chart.Element[]} the tooltip elements * @param eventPosition {Point} the position of the event in canvas coordinates * @returns {Point} the tooltip position */ nearest: function(elements, eventPosition) { var x = eventPosition.x; var y = eventPosition.y; var minDistance = Number.POSITIVE_INFINITY; var i, len, nearestElement; for (i = 0, len = elements.length; i < len; ++i) { var el = elements[i]; if (el && el.hasValue()) { var center = el.getCenterPoint(); var d = helpers.distanceBetweenPoints(eventPosition, center); if (d < minDistance) { minDistance = d; nearestElement = el; } } } if (nearestElement) { var tp = nearestElement.tooltipPosition(); x = tp.x; y = tp.y; } return { x: x, y: y }; } }; }; },{"25":25,"26":26,"45":45}],36:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); defaults._set('global', { elements: { arc: { backgroundColor: defaults.global.defaultColor, borderColor: '#fff', borderWidth: 2 } } }); module.exports = Element.extend({ inLabelRange: function(mouseX) { var vm = this._view; if (vm) { return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); } return false; }, inRange: function(chartX, chartY) { var vm = this._view; if (vm) { var pointRelativePosition = helpers.getAngleFromPoint(vm, {x: chartX, y: chartY}); var angle = pointRelativePosition.angle; var distance = pointRelativePosition.distance; // Sanitise angle range var startAngle = vm.startAngle; var endAngle = vm.endAngle; while (endAngle < startAngle) { endAngle += 2.0 * Math.PI; } while (angle > endAngle) { angle -= 2.0 * Math.PI; } while (angle < startAngle) { angle += 2.0 * Math.PI; } // Check if within the range of the open/close angle var betweenAngles = (angle >= startAngle && angle <= endAngle); var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); return (betweenAngles && withinRadius); } return false; }, getCenterPoint: function() { var vm = this._view; var halfAngle = (vm.startAngle + vm.endAngle) / 2; var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; return { x: vm.x + Math.cos(halfAngle) * halfRadius, y: vm.y + Math.sin(halfAngle) * halfRadius }; }, getArea: function() { var vm = this._view; return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); }, tooltipPosition: function() { var vm = this._view; var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; return { x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) }; }, draw: function() { var ctx = this._chart.ctx; var vm = this._view; var sA = vm.startAngle; var eA = vm.endAngle; ctx.beginPath(); ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); ctx.closePath(); ctx.strokeStyle = vm.borderColor; ctx.lineWidth = vm.borderWidth; ctx.fillStyle = vm.backgroundColor; ctx.fill(); ctx.lineJoin = 'bevel'; if (vm.borderWidth) { ctx.stroke(); } } }); },{"25":25,"26":26,"45":45}],37:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); var globalDefaults = defaults.global; defaults._set('global', { elements: { line: { tension: 0.4, backgroundColor: globalDefaults.defaultColor, borderWidth: 3, borderColor: globalDefaults.defaultColor, borderCapStyle: 'butt', borderDash: [], borderDashOffset: 0.0, borderJoinStyle: 'miter', capBezierPoints: true, fill: true, // do we fill in the area between the line and its base axis } } }); module.exports = Element.extend({ draw: function() { var me = this; var vm = me._view; var ctx = me._chart.ctx; var spanGaps = vm.spanGaps; var points = me._children.slice(); // clone array var globalOptionLineElements = globalDefaults.elements.line; var lastDrawnIndex = -1; var index, current, previous, currentVM; // If we are looping, adding the first point again if (me._loop && points.length) { points.push(points[0]); } ctx.save(); // Stroke Line Options ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; // IE 9 and 10 do not support line dash if (ctx.setLineDash) { ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); } ctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset; ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; ctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth; ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; // Stroke Line ctx.beginPath(); lastDrawnIndex = -1; for (index = 0; index < points.length; ++index) { current = points[index]; previous = helpers.previousItem(points, index); currentVM = current._view; // First point moves to it's starting position no matter what if (index === 0) { if (!currentVM.skip) { ctx.moveTo(currentVM.x, currentVM.y); lastDrawnIndex = index; } } else { previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; if (!currentVM.skip) { if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { // There was a gap and this is the first point after the gap ctx.moveTo(currentVM.x, currentVM.y); } else { // Line to next point helpers.canvas.lineTo(ctx, previous._view, current._view); } lastDrawnIndex = index; } } } ctx.stroke(); ctx.restore(); } }); },{"25":25,"26":26,"45":45}],38:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); var defaultColor = defaults.global.defaultColor; defaults._set('global', { elements: { point: { radius: 3, pointStyle: 'circle', backgroundColor: defaultColor, borderColor: defaultColor, borderWidth: 1, // Hover hitRadius: 1, hoverRadius: 4, hoverBorderWidth: 1 } } }); function xRange(mouseX) { var vm = this._view; return vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false; } function yRange(mouseY) { var vm = this._view; return vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false; } module.exports = Element.extend({ inRange: function(mouseX, mouseY) { var vm = this._view; return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; }, inLabelRange: xRange, inXRange: xRange, inYRange: yRange, getCenterPoint: function() { var vm = this._view; return { x: vm.x, y: vm.y }; }, getArea: function() { return Math.PI * Math.pow(this._view.radius, 2); }, tooltipPosition: function() { var vm = this._view; return { x: vm.x, y: vm.y, padding: vm.radius + vm.borderWidth }; }, draw: function(chartArea) { var vm = this._view; var model = this._model; var ctx = this._chart.ctx; var pointStyle = vm.pointStyle; var radius = vm.radius; var x = vm.x; var y = vm.y; var color = helpers.color; var errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.) var ratio = 0; if (vm.skip) { return; } ctx.strokeStyle = vm.borderColor || defaultColor; ctx.lineWidth = helpers.valueOrDefault(vm.borderWidth, defaults.global.elements.point.borderWidth); ctx.fillStyle = vm.backgroundColor || defaultColor; // Cliping for Points. // going out from inner charArea? if ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right * errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom * errMargin < model.y))) { // Point fade out if (model.x < chartArea.left) { ratio = (x - model.x) / (chartArea.left - model.x); } else if (chartArea.right * errMargin < model.x) { ratio = (model.x - x) / (model.x - chartArea.right); } else if (model.y < chartArea.top) { ratio = (y - model.y) / (chartArea.top - model.y); } else if (chartArea.bottom * errMargin < model.y) { ratio = (model.y - y) / (model.y - chartArea.bottom); } ratio = Math.round(ratio * 100) / 100; ctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString(); ctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString(); } helpers.canvas.drawPoint(ctx, pointStyle, radius, x, y); } }); },{"25":25,"26":26,"45":45}],39:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); defaults._set('global', { elements: { rectangle: { backgroundColor: defaults.global.defaultColor, borderColor: defaults.global.defaultColor, borderSkipped: 'bottom', borderWidth: 0 } } }); function isVertical(bar) { return bar._view.width !== undefined; } /** * Helper function to get the bounds of the bar regardless of the orientation * @param bar {Chart.Element.Rectangle} the bar * @return {Bounds} bounds of the bar * @private */ function getBarBounds(bar) { var vm = bar._view; var x1, x2, y1, y2; if (isVertical(bar)) { // vertical var halfWidth = vm.width / 2; x1 = vm.x - halfWidth; x2 = vm.x + halfWidth; y1 = Math.min(vm.y, vm.base); y2 = Math.max(vm.y, vm.base); } else { // horizontal bar var halfHeight = vm.height / 2; x1 = Math.min(vm.x, vm.base); x2 = Math.max(vm.x, vm.base); y1 = vm.y - halfHeight; y2 = vm.y + halfHeight; } return { left: x1, top: y1, right: x2, bottom: y2 }; } module.exports = Element.extend({ draw: function() { var ctx = this._chart.ctx; var vm = this._view; var left, right, top, bottom, signX, signY, borderSkipped; var borderWidth = vm.borderWidth; if (!vm.horizontal) { // bar left = vm.x - vm.width / 2; right = vm.x + vm.width / 2; top = vm.y; bottom = vm.base; signX = 1; signY = bottom > top ? 1 : -1; borderSkipped = vm.borderSkipped || 'bottom'; } else { // horizontal bar left = vm.base; right = vm.x; top = vm.y - vm.height / 2; bottom = vm.y + vm.height / 2; signX = right > left ? 1 : -1; signY = 1; borderSkipped = vm.borderSkipped || 'left'; } // Canvas doesn't allow us to stroke inside the width so we can // adjust the sizes to fit if we're setting a stroke on the line if (borderWidth) { // borderWidth shold be less than bar width and bar height. var barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom)); borderWidth = borderWidth > barSize ? barSize : borderWidth; var halfStroke = borderWidth / 2; // Adjust borderWidth when bar top position is near vm.base(zero). var borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0); var borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0); var borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0); var borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0); // not become a vertical line? if (borderLeft !== borderRight) { top = borderTop; bottom = borderBottom; } // not become a horizontal line? if (borderTop !== borderBottom) { left = borderLeft; right = borderRight; } } ctx.beginPath(); ctx.fillStyle = vm.backgroundColor; ctx.strokeStyle = vm.borderColor; ctx.lineWidth = borderWidth; // Corner points, from bottom-left to bottom-right clockwise // | 1 2 | // | 0 3 | var corners = [ [left, bottom], [left, top], [right, top], [right, bottom] ]; // Find first (starting) corner with fallback to 'bottom' var borders = ['bottom', 'left', 'top', 'right']; var startCorner = borders.indexOf(borderSkipped, 0); if (startCorner === -1) { startCorner = 0; } function cornerAt(index) { return corners[(startCorner + index) % 4]; } // Draw rectangle from 'startCorner' var corner = cornerAt(0); ctx.moveTo(corner[0], corner[1]); for (var i = 1; i < 4; i++) { corner = cornerAt(i); ctx.lineTo(corner[0], corner[1]); } ctx.fill(); if (borderWidth) { ctx.stroke(); } }, height: function() { var vm = this._view; return vm.base - vm.y; }, inRange: function(mouseX, mouseY) { var inRange = false; if (this._view) { var bounds = getBarBounds(this); inRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom; } return inRange; }, inLabelRange: function(mouseX, mouseY) { var me = this; if (!me._view) { return false; } var inRange = false; var bounds = getBarBounds(me); if (isVertical(me)) { inRange = mouseX >= bounds.left && mouseX <= bounds.right; } else { inRange = mouseY >= bounds.top && mouseY <= bounds.bottom; } return inRange; }, inXRange: function(mouseX) { var bounds = getBarBounds(this); return mouseX >= bounds.left && mouseX <= bounds.right; }, inYRange: function(mouseY) { var bounds = getBarBounds(this); return mouseY >= bounds.top && mouseY <= bounds.bottom; }, getCenterPoint: function() { var vm = this._view; var x, y; if (isVertical(this)) { x = vm.x; y = (vm.y + vm.base) / 2; } else { x = (vm.x + vm.base) / 2; y = vm.y; } return {x: x, y: y}; }, getArea: function() { var vm = this._view; return vm.width * Math.abs(vm.y - vm.base); }, tooltipPosition: function() { var vm = this._view; return { x: vm.x, y: vm.y }; } }); },{"25":25,"26":26}],40:[function(require,module,exports){ 'use strict'; module.exports = {}; module.exports.Arc = require(36); module.exports.Line = require(37); module.exports.Point = require(38); module.exports.Rectangle = require(39); },{"36":36,"37":37,"38":38,"39":39}],41:[function(require,module,exports){ 'use strict'; var helpers = require(42); /** * @namespace Chart.helpers.canvas */ var exports = module.exports = { /** * Clears the entire canvas associated to the given `chart`. * @param {Chart} chart - The chart for which to clear the canvas. */ clear: function(chart) { chart.ctx.clearRect(0, 0, chart.width, chart.height); }, /** * Creates a "path" for a rectangle with rounded corners at position (x, y) with a * given size (width, height) and the same `radius` for all corners. * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. * @param {Number} x - The x axis of the coordinate for the rectangle starting point. * @param {Number} y - The y axis of the coordinate for the rectangle starting point. * @param {Number} width - The rectangle's width. * @param {Number} height - The rectangle's height. * @param {Number} radius - The rounded amount (in pixels) for the four corners. * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? */ roundedRect: function(ctx, x, y, width, height, radius) { if (radius) { var rx = Math.min(radius, width / 2); var ry = Math.min(radius, height / 2); ctx.moveTo(x + rx, y); ctx.lineTo(x + width - rx, y); ctx.quadraticCurveTo(x + width, y, x + width, y + ry); ctx.lineTo(x + width, y + height - ry); ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height); ctx.lineTo(x + rx, y + height); ctx.quadraticCurveTo(x, y + height, x, y + height - ry); ctx.lineTo(x, y + ry); ctx.quadraticCurveTo(x, y, x + rx, y); } else { ctx.rect(x, y, width, height); } }, drawPoint: function(ctx, style, radius, x, y) { var type, edgeLength, xOffset, yOffset, height, size; if (style && typeof style === 'object') { type = style.toString(); if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); return; } } if (isNaN(radius) || radius <= 0) { return; } switch (style) { // Default includes circle default: ctx.beginPath(); ctx.arc(x, y, radius, 0, Math.PI * 2); ctx.closePath(); ctx.fill(); break; case 'triangle': ctx.beginPath(); edgeLength = 3 * radius / Math.sqrt(3); height = edgeLength * Math.sqrt(3) / 2; ctx.moveTo(x - edgeLength / 2, y + height / 3); ctx.lineTo(x + edgeLength / 2, y + height / 3); ctx.lineTo(x, y - 2 * height / 3); ctx.closePath(); ctx.fill(); break; case 'rect': size = 1 / Math.SQRT2 * radius; ctx.beginPath(); ctx.fillRect(x - size, y - size, 2 * size, 2 * size); ctx.strokeRect(x - size, y - size, 2 * size, 2 * size); break; case 'rectRounded': var offset = radius / Math.SQRT2; var leftX = x - offset; var topY = y - offset; var sideSize = Math.SQRT2 * radius; ctx.beginPath(); this.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius / 2); ctx.closePath(); ctx.fill(); break; case 'rectRot': size = 1 / Math.SQRT2 * radius; ctx.beginPath(); ctx.moveTo(x - size, y); ctx.lineTo(x, y + size); ctx.lineTo(x + size, y); ctx.lineTo(x, y - size); ctx.closePath(); ctx.fill(); break; case 'cross': ctx.beginPath(); ctx.moveTo(x, y + radius); ctx.lineTo(x, y - radius); ctx.moveTo(x - radius, y); ctx.lineTo(x + radius, y); ctx.closePath(); break; case 'crossRot': ctx.beginPath(); xOffset = Math.cos(Math.PI / 4) * radius; yOffset = Math.sin(Math.PI / 4) * radius; ctx.moveTo(x - xOffset, y - yOffset); ctx.lineTo(x + xOffset, y + yOffset); ctx.moveTo(x - xOffset, y + yOffset); ctx.lineTo(x + xOffset, y - yOffset); ctx.closePath(); break; case 'star': ctx.beginPath(); ctx.moveTo(x, y + radius); ctx.lineTo(x, y - radius); ctx.moveTo(x - radius, y); ctx.lineTo(x + radius, y); xOffset = Math.cos(Math.PI / 4) * radius; yOffset = Math.sin(Math.PI / 4) * radius; ctx.moveTo(x - xOffset, y - yOffset); ctx.lineTo(x + xOffset, y + yOffset); ctx.moveTo(x - xOffset, y + yOffset); ctx.lineTo(x + xOffset, y - yOffset); ctx.closePath(); break; case 'line': ctx.beginPath(); ctx.moveTo(x - radius, y); ctx.lineTo(x + radius, y); ctx.closePath(); break; case 'dash': ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(x + radius, y); ctx.closePath(); break; } ctx.stroke(); }, clipArea: function(ctx, area) { ctx.save(); ctx.beginPath(); ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); ctx.clip(); }, unclipArea: function(ctx) { ctx.restore(); }, lineTo: function(ctx, previous, target, flip) { if (target.steppedLine) { if ((target.steppedLine === 'after' && !flip) || (target.steppedLine !== 'after' && flip)) { ctx.lineTo(previous.x, target.y); } else { ctx.lineTo(target.x, previous.y); } ctx.lineTo(target.x, target.y); return; } if (!target.tension) { ctx.lineTo(target.x, target.y); return; } ctx.bezierCurveTo( flip ? previous.controlPointPreviousX : previous.controlPointNextX, flip ? previous.controlPointPreviousY : previous.controlPointNextY, flip ? target.controlPointNextX : target.controlPointPreviousX, flip ? target.controlPointNextY : target.controlPointPreviousY, target.x, target.y); } }; // DEPRECATIONS /** * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. * @namespace Chart.helpers.clear * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.clear = exports.clear; /** * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. * @namespace Chart.helpers.drawRoundedRectangle * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.drawRoundedRectangle = function(ctx) { ctx.beginPath(); exports.roundedRect.apply(exports, arguments); ctx.closePath(); }; },{"42":42}],42:[function(require,module,exports){ 'use strict'; /** * @namespace Chart.helpers */ var helpers = { /** * An empty function that can be used, for example, for optional callback. */ noop: function() {}, /** * Returns a unique id, sequentially generated from a global variable. * @returns {Number} * @function */ uid: (function() { var id = 0; return function() { return id++; }; }()), /** * Returns true if `value` is neither null nor undefined, else returns false. * @param {*} value - The value to test. * @returns {Boolean} * @since 2.7.0 */ isNullOrUndef: function(value) { return value === null || typeof value === 'undefined'; }, /** * Returns true if `value` is an array, else returns false. * @param {*} value - The value to test. * @returns {Boolean} * @function */ isArray: Array.isArray ? Array.isArray : function(value) { return Object.prototype.toString.call(value) === '[object Array]'; }, /** * Returns true if `value` is an object (excluding null), else returns false. * @param {*} value - The value to test. * @returns {Boolean} * @since 2.7.0 */ isObject: function(value) { return value !== null && Object.prototype.toString.call(value) === '[object Object]'; }, /** * Returns `value` if defined, else returns `defaultValue`. * @param {*} value - The value to return if defined. * @param {*} defaultValue - The value to return if `value` is undefined. * @returns {*} */ valueOrDefault: function(value, defaultValue) { return typeof value === 'undefined' ? defaultValue : value; }, /** * Returns value at the given `index` in array if defined, else returns `defaultValue`. * @param {Array} value - The array to lookup for value at `index`. * @param {Number} index - The index in `value` to lookup for value. * @param {*} defaultValue - The value to return if `value[index]` is undefined. * @returns {*} */ valueAtIndexOrDefault: function(value, index, defaultValue) { return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); }, /** * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the * value returned by `fn`. If `fn` is not a function, this method returns undefined. * @param {Function} fn - The function to call. * @param {Array|undefined|null} args - The arguments with which `fn` should be called. * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`. * @returns {*} */ callback: function(fn, args, thisArg) { if (fn && typeof fn.call === 'function') { return fn.apply(thisArg, args); } }, /** * Note(SB) for performance sake, this method should only be used when loopable type * is unknown or in none intensive code (not called often and small loopable). Else * it's preferable to use a regular for() loop and save extra function calls. * @param {Object|Array} loopable - The object or array to be iterated. * @param {Function} fn - The function to call for each item. * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`. * @param {Boolean} [reverse] - If true, iterates backward on the loopable. */ each: function(loopable, fn, thisArg, reverse) { var i, len, keys; if (helpers.isArray(loopable)) { len = loopable.length; if (reverse) { for (i = len - 1; i >= 0; i--) { fn.call(thisArg, loopable[i], i); } } else { for (i = 0; i < len; i++) { fn.call(thisArg, loopable[i], i); } } } else if (helpers.isObject(loopable)) { keys = Object.keys(loopable); len = keys.length; for (i = 0; i < len; i++) { fn.call(thisArg, loopable[keys[i]], keys[i]); } } }, /** * Returns true if the `a0` and `a1` arrays have the same content, else returns false. * @see http://stackoverflow.com/a/14853974 * @param {Array} a0 - The array to compare * @param {Array} a1 - The array to compare * @returns {Boolean} */ arrayEquals: function(a0, a1) { var i, ilen, v0, v1; if (!a0 || !a1 || a0.length !== a1.length) { return false; } for (i = 0, ilen = a0.length; i < ilen; ++i) { v0 = a0[i]; v1 = a1[i]; if (v0 instanceof Array && v1 instanceof Array) { if (!helpers.arrayEquals(v0, v1)) { return false; } } else if (v0 !== v1) { // NOTE: two different object instances will never be equal: {x:20} != {x:20} return false; } } return true; }, /** * Returns a deep copy of `source` without keeping references on objects and arrays. * @param {*} source - The value to clone. * @returns {*} */ clone: function(source) { if (helpers.isArray(source)) { return source.map(helpers.clone); } if (helpers.isObject(source)) { var target = {}; var keys = Object.keys(source); var klen = keys.length; var k = 0; for (; k < klen; ++k) { target[keys[k]] = helpers.clone(source[keys[k]]); } return target; } return source; }, /** * The default merger when Chart.helpers.merge is called without merger option. * Note(SB): this method is also used by configMerge and scaleMerge as fallback. * @private */ _merger: function(key, target, source, options) { var tval = target[key]; var sval = source[key]; if (helpers.isObject(tval) && helpers.isObject(sval)) { helpers.merge(tval, sval, options); } else { target[key] = helpers.clone(sval); } }, /** * Merges source[key] in target[key] only if target[key] is undefined. * @private */ _mergerIf: function(key, target, source) { var tval = target[key]; var sval = source[key]; if (helpers.isObject(tval) && helpers.isObject(sval)) { helpers.mergeIf(tval, sval); } else if (!target.hasOwnProperty(key)) { target[key] = helpers.clone(sval); } }, /** * Recursively deep copies `source` properties into `target` with the given `options`. * IMPORTANT: `target` is not cloned and will be updated with `source` properties. * @param {Object} target - The target object in which all sources are merged into. * @param {Object|Array(Object)} source - Object(s) to merge into `target`. * @param {Object} [options] - Merging options: * @param {Function} [options.merger] - The merge method (key, target, source, options) * @returns {Object} The `target` object. */ merge: function(target, source, options) { var sources = helpers.isArray(source) ? source : [source]; var ilen = sources.length; var merge, i, keys, klen, k; if (!helpers.isObject(target)) { return target; } options = options || {}; merge = options.merger || helpers._merger; for (i = 0; i < ilen; ++i) { source = sources[i]; if (!helpers.isObject(source)) { continue; } keys = Object.keys(source); for (k = 0, klen = keys.length; k < klen; ++k) { merge(keys[k], target, source, options); } } return target; }, /** * Recursively deep copies `source` properties into `target` *only* if not defined in target. * IMPORTANT: `target` is not cloned and will be updated with `source` properties. * @param {Object} target - The target object in which all sources are merged into. * @param {Object|Array(Object)} source - Object(s) to merge into `target`. * @returns {Object} The `target` object. */ mergeIf: function(target, source) { return helpers.merge(target, source, {merger: helpers._mergerIf}); }, /** * Applies the contents of two or more objects together into the first object. * @param {Object} target - The target object in which all objects are merged into. * @param {Object} arg1 - Object containing additional properties to merge in target. * @param {Object} argN - Additional objects containing properties to merge in target. * @returns {Object} The `target` object. */ extend: function(target) { var setFn = function(value, key) { target[key] = value; }; for (var i = 1, ilen = arguments.length; i < ilen; ++i) { helpers.each(arguments[i], setFn); } return target; }, /** * Basic javascript inheritance based on the model created in Backbone.js */ inherits: function(extensions) { var me = this; var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { return me.apply(this, arguments); }; var Surrogate = function() { this.constructor = ChartElement; }; Surrogate.prototype = me.prototype; ChartElement.prototype = new Surrogate(); ChartElement.extend = helpers.inherits; if (extensions) { helpers.extend(ChartElement.prototype, extensions); } ChartElement.__super__ = me.prototype; return ChartElement; } }; module.exports = helpers; // DEPRECATIONS /** * Provided for backward compatibility, use Chart.helpers.callback instead. * @function Chart.helpers.callCallback * @deprecated since version 2.6.0 * @todo remove at version 3 * @private */ helpers.callCallback = helpers.callback; /** * Provided for backward compatibility, use Array.prototype.indexOf instead. * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ * @function Chart.helpers.indexOf * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.indexOf = function(array, item, fromIndex) { return Array.prototype.indexOf.call(array, item, fromIndex); }; /** * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. * @function Chart.helpers.getValueOrDefault * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.getValueOrDefault = helpers.valueOrDefault; /** * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. * @function Chart.helpers.getValueAtIndexOrDefault * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; },{}],43:[function(require,module,exports){ 'use strict'; var helpers = require(42); /** * Easing functions adapted from Robert Penner's easing equations. * @namespace Chart.helpers.easingEffects * @see http://www.robertpenner.com/easing/ */ var effects = { linear: function(t) { return t; }, easeInQuad: function(t) { return t * t; }, easeOutQuad: function(t) { return -t * (t - 2); }, easeInOutQuad: function(t) { if ((t /= 0.5) < 1) { return 0.5 * t * t; } return -0.5 * ((--t) * (t - 2) - 1); }, easeInCubic: function(t) { return t * t * t; }, easeOutCubic: function(t) { return (t = t - 1) * t * t + 1; }, easeInOutCubic: function(t) { if ((t /= 0.5) < 1) { return 0.5 * t * t * t; } return 0.5 * ((t -= 2) * t * t + 2); }, easeInQuart: function(t) { return t * t * t * t; }, easeOutQuart: function(t) { return -((t = t - 1) * t * t * t - 1); }, easeInOutQuart: function(t) { if ((t /= 0.5) < 1) { return 0.5 * t * t * t * t; } return -0.5 * ((t -= 2) * t * t * t - 2); }, easeInQuint: function(t) { return t * t * t * t * t; }, easeOutQuint: function(t) { return (t = t - 1) * t * t * t * t + 1; }, easeInOutQuint: function(t) { if ((t /= 0.5) < 1) { return 0.5 * t * t * t * t * t; } return 0.5 * ((t -= 2) * t * t * t * t + 2); }, easeInSine: function(t) { return -Math.cos(t * (Math.PI / 2)) + 1; }, easeOutSine: function(t) { return Math.sin(t * (Math.PI / 2)); }, easeInOutSine: function(t) { return -0.5 * (Math.cos(Math.PI * t) - 1); }, easeInExpo: function(t) { return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); }, easeOutExpo: function(t) { return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; }, easeInOutExpo: function(t) { if (t === 0) { return 0; } if (t === 1) { return 1; } if ((t /= 0.5) < 1) { return 0.5 * Math.pow(2, 10 * (t - 1)); } return 0.5 * (-Math.pow(2, -10 * --t) + 2); }, easeInCirc: function(t) { if (t >= 1) { return t; } return -(Math.sqrt(1 - t * t) - 1); }, easeOutCirc: function(t) { return Math.sqrt(1 - (t = t - 1) * t); }, easeInOutCirc: function(t) { if ((t /= 0.5) < 1) { return -0.5 * (Math.sqrt(1 - t * t) - 1); } return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); }, easeInElastic: function(t) { var s = 1.70158; var p = 0; var a = 1; if (t === 0) { return 0; } if (t === 1) { return 1; } if (!p) { p = 0.3; } if (a < 1) { a = 1; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(1 / a); } return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); }, easeOutElastic: function(t) { var s = 1.70158; var p = 0; var a = 1; if (t === 0) { return 0; } if (t === 1) { return 1; } if (!p) { p = 0.3; } if (a < 1) { a = 1; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(1 / a); } return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; }, easeInOutElastic: function(t) { var s = 1.70158; var p = 0; var a = 1; if (t === 0) { return 0; } if ((t /= 0.5) === 2) { return 1; } if (!p) { p = 0.45; } if (a < 1) { a = 1; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(1 / a); } if (t < 1) { return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); } return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; }, easeInBack: function(t) { var s = 1.70158; return t * t * ((s + 1) * t - s); }, easeOutBack: function(t) { var s = 1.70158; return (t = t - 1) * t * ((s + 1) * t + s) + 1; }, easeInOutBack: function(t) { var s = 1.70158; if ((t /= 0.5) < 1) { return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); } return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); }, easeInBounce: function(t) { return 1 - effects.easeOutBounce(1 - t); }, easeOutBounce: function(t) { if (t < (1 / 2.75)) { return 7.5625 * t * t; } if (t < (2 / 2.75)) { return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; } if (t < (2.5 / 2.75)) { return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; } return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; }, easeInOutBounce: function(t) { if (t < 0.5) { return effects.easeInBounce(t * 2) * 0.5; } return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; } }; module.exports = { effects: effects }; // DEPRECATIONS /** * Provided for backward compatibility, use Chart.helpers.easing.effects instead. * @function Chart.helpers.easingEffects * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.easingEffects = effects; },{"42":42}],44:[function(require,module,exports){ 'use strict'; var helpers = require(42); /** * @alias Chart.helpers.options * @namespace */ module.exports = { /** * Converts the given line height `value` in pixels for a specific font `size`. * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). * @param {Number} size - The font size (in pixels) used to resolve relative `value`. * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid). * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height * @since 2.7.0 */ toLineHeight: function(value, size) { var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); if (!matches || matches[1] === 'normal') { return size * 1.2; } value = +matches[2]; switch (matches[3]) { case 'px': return value; case '%': value /= 100; break; default: break; } return size * value; }, /** * Converts the given value into a padding object with pre-computed width/height. * @param {Number|Object} value - If a number, set the value to all TRBL component, * else, if and object, use defined properties and sets undefined ones to 0. * @returns {Object} The padding values (top, right, bottom, left, width, height) * @since 2.7.0 */ toPadding: function(value) { var t, r, b, l; if (helpers.isObject(value)) { t = +value.top || 0; r = +value.right || 0; b = +value.bottom || 0; l = +value.left || 0; } else { t = r = b = l = +value || 0; } return { top: t, right: r, bottom: b, left: l, height: t + b, width: l + r }; }, /** * Evaluates the given `inputs` sequentially and returns the first defined value. * @param {Array[]} inputs - An array of values, falling back to the last value. * @param {Object} [context] - If defined and the current value is a function, the value * is called with `context` as first argument and the result becomes the new input. * @param {Number} [index] - If defined and the current value is an array, the value * at `index` become the new input. * @since 2.7.0 */ resolve: function(inputs, context, index) { var i, ilen, value; for (i = 0, ilen = inputs.length; i < ilen; ++i) { value = inputs[i]; if (value === undefined) { continue; } if (context !== undefined && typeof value === 'function') { value = value(context); } if (index !== undefined && helpers.isArray(value)) { value = value[index]; } if (value !== undefined) { return value; } } } }; },{"42":42}],45:[function(require,module,exports){ 'use strict'; module.exports = require(42); module.exports.easing = require(43); module.exports.canvas = require(41); module.exports.options = require(44); },{"41":41,"42":42,"43":43,"44":44}],46:[function(require,module,exports){ /** * Platform fallback implementation (minimal). * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 */ module.exports = { acquireContext: function(item) { if (item && item.canvas) { // Support for any object associated to a canvas (including a context2d) item = item.canvas; } return item && item.getContext('2d') || null; } }; },{}],47:[function(require,module,exports){ /** * Chart.Platform implementation for targeting a web browser */ 'use strict'; var helpers = require(45); var EXPANDO_KEY = '$chartjs'; var CSS_PREFIX = 'chartjs-'; var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; /** * DOM event types -> Chart.js event types. * Note: only events with different types are mapped. * @see https://developer.mozilla.org/en-US/docs/Web/Events */ var EVENT_TYPES = { touchstart: 'mousedown', touchmove: 'mousemove', touchend: 'mouseup', pointerenter: 'mouseenter', pointerdown: 'mousedown', pointermove: 'mousemove', pointerup: 'mouseup', pointerleave: 'mouseout', pointerout: 'mouseout' }; /** * The "used" size is the final value of a dimension property after all calculations have * been performed. This method uses the computed style of `element` but returns undefined * if the computed style is not expressed in pixels. That can happen in some cases where * `element` has a size relative to its parent and this last one is not yet displayed, * for example because of `display: none` on a parent node. * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value * @returns {Number} Size in pixels or undefined if unknown. */ function readUsedSize(element, property) { var value = helpers.getStyle(element, property); var matches = value && value.match(/^(\d+)(\.\d+)?px$/); return matches ? Number(matches[1]) : undefined; } /** * Initializes the canvas style and render size without modifying the canvas display size, * since responsiveness is handled by the controller.resize() method. The config is used * to determine the aspect ratio to apply in case no explicit height has been specified. */ function initCanvas(canvas, config) { var style = canvas.style; // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it // returns null or '' if no explicit value has been set to the canvas attribute. var renderHeight = canvas.getAttribute('height'); var renderWidth = canvas.getAttribute('width'); // Chart.js modifies some canvas values that we want to restore on destroy canvas[EXPANDO_KEY] = { initial: { height: renderHeight, width: renderWidth, style: { display: style.display, height: style.height, width: style.width } } }; // Force canvas to display as block to avoid extra space caused by inline // elements, which would interfere with the responsive resize process. // https://github.com/chartjs/Chart.js/issues/2538 style.display = style.display || 'block'; if (renderWidth === null || renderWidth === '') { var displayWidth = readUsedSize(canvas, 'width'); if (displayWidth !== undefined) { canvas.width = displayWidth; } } if (renderHeight === null || renderHeight === '') { if (canvas.style.height === '') { // If no explicit render height and style height, let's apply the aspect ratio, // which one can be specified by the user but also by charts as default option // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. canvas.height = canvas.width / (config.options.aspectRatio || 2); } else { var displayHeight = readUsedSize(canvas, 'height'); if (displayWidth !== undefined) { canvas.height = displayHeight; } } } return canvas; } /** * Detects support for options object argument in addEventListener. * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support * @private */ var supportsEventListenerOptions = (function() { var supports = false; try { var options = Object.defineProperty({}, 'passive', { get: function() { supports = true; } }); window.addEventListener('e', null, options); } catch (e) { // continue regardless of error } return supports; }()); // Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. // https://github.com/chartjs/Chart.js/issues/4287 var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; function addEventListener(node, type, listener) { node.addEventListener(type, listener, eventListenerOptions); } function removeEventListener(node, type, listener) { node.removeEventListener(type, listener, eventListenerOptions); } function createEvent(type, chart, x, y, nativeEvent) { return { type: type, chart: chart, native: nativeEvent || null, x: x !== undefined ? x : null, y: y !== undefined ? y : null, }; } function fromNativeEvent(event, chart) { var type = EVENT_TYPES[event.type] || event.type; var pos = helpers.getRelativePosition(event, chart); return createEvent(type, chart, pos.x, pos.y, event); } function throttled(fn, thisArg) { var ticking = false; var args = []; return function() { args = Array.prototype.slice.call(arguments); thisArg = thisArg || this; if (!ticking) { ticking = true; helpers.requestAnimFrame.call(window, function() { ticking = false; fn.apply(thisArg, args); }); } }; } // Implementation based on https://github.com/marcj/css-element-queries function createResizer(handler) { var resizer = document.createElement('div'); var cls = CSS_PREFIX + 'size-monitor'; var maxSize = 1000000; var style = 'position:absolute;' + 'left:0;' + 'top:0;' + 'right:0;' + 'bottom:0;' + 'overflow:hidden;' + 'pointer-events:none;' + 'visibility:hidden;' + 'z-index:-1;'; resizer.style.cssText = style; resizer.className = cls; resizer.innerHTML = '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
'; var expand = resizer.childNodes[0]; var shrink = resizer.childNodes[1]; resizer._reset = function() { expand.scrollLeft = maxSize; expand.scrollTop = maxSize; shrink.scrollLeft = maxSize; shrink.scrollTop = maxSize; }; var onScroll = function() { resizer._reset(); handler(); }; addEventListener(expand, 'scroll', onScroll.bind(expand, 'expand')); addEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); return resizer; } // https://davidwalsh.name/detect-node-insertion function watchForRender(node, handler) { var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); var proxy = expando.renderProxy = function(e) { if (e.animationName === CSS_RENDER_ANIMATION) { handler(); } }; helpers.each(ANIMATION_START_EVENTS, function(type) { addEventListener(node, type, proxy); }); // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class // is removed then added back immediately (same animation frame?). Accessing the // `offsetParent` property will force a reflow and re-evaluate the CSS animation. // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics // https://github.com/chartjs/Chart.js/issues/4737 expando.reflow = !!node.offsetParent; node.classList.add(CSS_RENDER_MONITOR); } function unwatchForRender(node) { var expando = node[EXPANDO_KEY] || {}; var proxy = expando.renderProxy; if (proxy) { helpers.each(ANIMATION_START_EVENTS, function(type) { removeEventListener(node, type, proxy); }); delete expando.renderProxy; } node.classList.remove(CSS_RENDER_MONITOR); } function addResizeListener(node, listener, chart) { var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); // Let's keep track of this added resizer and thus avoid DOM query when removing it. var resizer = expando.resizer = createResizer(throttled(function() { if (expando.resizer) { return listener(createEvent('resize', chart)); } })); // The resizer needs to be attached to the node parent, so we first need to be // sure that `node` is attached to the DOM before injecting the resizer element. watchForRender(node, function() { if (expando.resizer) { var container = node.parentNode; if (container && container !== resizer.parentNode) { container.insertBefore(resizer, container.firstChild); } // The container size might have changed, let's reset the resizer state. resizer._reset(); } }); } function removeResizeListener(node) { var expando = node[EXPANDO_KEY] || {}; var resizer = expando.resizer; delete expando.resizer; unwatchForRender(node); if (resizer && resizer.parentNode) { resizer.parentNode.removeChild(resizer); } } function injectCSS(platform, css) { // http://stackoverflow.com/q/3922139 var style = platform._style || document.createElement('style'); if (!platform._style) { platform._style = style; css = '/* Chart.js */\n' + css; style.setAttribute('type', 'text/css'); document.getElementsByTagName('head')[0].appendChild(style); } style.appendChild(document.createTextNode(css)); } module.exports = { /** * This property holds whether this platform is enabled for the current environment. * Currently used by platform.js to select the proper implementation. * @private */ _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', initialize: function() { var keyframes = 'from{opacity:0.99}to{opacity:1}'; injectCSS(this, // DOM rendering detection // https://davidwalsh.name/detect-node-insertion '@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + '@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + '.' + CSS_RENDER_MONITOR + '{' + '-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + 'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + '}' ); }, acquireContext: function(item, config) { if (typeof item === 'string') { item = document.getElementById(item); } else if (item.length) { // Support for array based queries (such as jQuery) item = item[0]; } if (item && item.canvas) { // Support for any object associated to a canvas (including a context2d) item = item.canvas; } // To prevent canvas fingerprinting, some add-ons undefine the getContext // method, for example: https://github.com/kkapsner/CanvasBlocker // https://github.com/chartjs/Chart.js/issues/2807 var context = item && item.getContext && item.getContext('2d'); // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is // inside an iframe or when running in a protected environment. We could guess the // types from their toString() value but let's keep things flexible and assume it's // a sufficient condition if the item has a context2D which has item as `canvas`. // https://github.com/chartjs/Chart.js/issues/3887 // https://github.com/chartjs/Chart.js/issues/4102 // https://github.com/chartjs/Chart.js/issues/4152 if (context && context.canvas === item) { initCanvas(item, config); return context; } return null; }, releaseContext: function(context) { var canvas = context.canvas; if (!canvas[EXPANDO_KEY]) { return; } var initial = canvas[EXPANDO_KEY].initial; ['height', 'width'].forEach(function(prop) { var value = initial[prop]; if (helpers.isNullOrUndef(value)) { canvas.removeAttribute(prop); } else { canvas.setAttribute(prop, value); } }); helpers.each(initial.style || {}, function(value, key) { canvas.style[key] = value; }); // The canvas render size might have been changed (and thus the state stack discarded), // we can't use save() and restore() to restore the initial state. So make sure that at // least the canvas context is reset to the default state by setting the canvas width. // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html canvas.width = canvas.width; delete canvas[EXPANDO_KEY]; }, addEventListener: function(chart, type, listener) { var canvas = chart.canvas; if (type === 'resize') { // Note: the resize event is not supported on all browsers. addResizeListener(canvas, listener, chart); return; } var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); var proxies = expando.proxies || (expando.proxies = {}); var proxy = proxies[chart.id + '_' + type] = function(event) { listener(fromNativeEvent(event, chart)); }; addEventListener(canvas, type, proxy); }, removeEventListener: function(chart, type, listener) { var canvas = chart.canvas; if (type === 'resize') { // Note: the resize event is not supported on all browsers. removeResizeListener(canvas, listener); return; } var expando = listener[EXPANDO_KEY] || {}; var proxies = expando.proxies || {}; var proxy = proxies[chart.id + '_' + type]; if (!proxy) { return; } removeEventListener(canvas, type, proxy); } }; // DEPRECATIONS /** * Provided for backward compatibility, use EventTarget.addEventListener instead. * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener * @function Chart.helpers.addEvent * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.addEvent = addEventListener; /** * Provided for backward compatibility, use EventTarget.removeEventListener instead. * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener * @function Chart.helpers.removeEvent * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.removeEvent = removeEventListener; },{"45":45}],48:[function(require,module,exports){ 'use strict'; var helpers = require(45); var basic = require(46); var dom = require(47); // @TODO Make possible to select another platform at build time. var implementation = dom._enabled ? dom : basic; /** * @namespace Chart.platform * @see https://chartjs.gitbooks.io/proposals/content/Platform.html * @since 2.4.0 */ module.exports = helpers.extend({ /** * @since 2.7.0 */ initialize: function() {}, /** * Called at chart construction time, returns a context2d instance implementing * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. * @param {*} item - The native item from which to acquire context (platform specific) * @param {Object} options - The chart options * @returns {CanvasRenderingContext2D} context2d instance */ acquireContext: function() {}, /** * Called at chart destruction time, releases any resources associated to the context * previously returned by the acquireContext() method. * @param {CanvasRenderingContext2D} context - The context2d instance * @returns {Boolean} true if the method succeeded, else false */ releaseContext: function() {}, /** * Registers the specified listener on the given chart. * @param {Chart} chart - Chart from which to listen for event * @param {String} type - The ({@link IEvent}) type to listen for * @param {Function} listener - Receives a notification (an object that implements * the {@link IEvent} interface) when an event of the specified type occurs. */ addEventListener: function() {}, /** * Removes the specified listener previously registered with addEventListener. * @param {Chart} chart -Chart from which to remove the listener * @param {String} type - The ({@link IEvent}) type to remove * @param {Function} listener - The listener function to remove from the event target. */ removeEventListener: function() {} }, implementation); /** * @interface IPlatform * Allows abstracting platform dependencies away from the chart * @borrows Chart.platform.acquireContext as acquireContext * @borrows Chart.platform.releaseContext as releaseContext * @borrows Chart.platform.addEventListener as addEventListener * @borrows Chart.platform.removeEventListener as removeEventListener */ /** * @interface IEvent * @prop {String} type - The event type name, possible values are: * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout', * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize' * @prop {*} native - The original native event (null for emulated events, e.g. 'resize') * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events) * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events) */ },{"45":45,"46":46,"47":47}],49:[function(require,module,exports){ /** * Plugin based on discussion from the following Chart.js issues: * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569 * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897 */ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('global', { plugins: { filler: { propagate: true } } }); module.exports = function() { var mappers = { dataset: function(source) { var index = source.fill; var chart = source.chart; var meta = chart.getDatasetMeta(index); var visible = meta && chart.isDatasetVisible(index); var points = (visible && meta.dataset._children) || []; var length = points.length || 0; return !length ? null : function(point, i) { return (i < length && points[i]._view) || null; }; }, boundary: function(source) { var boundary = source.boundary; var x = boundary ? boundary.x : null; var y = boundary ? boundary.y : null; return function(point) { return { x: x === null ? point.x : x, y: y === null ? point.y : y, }; }; } }; // @todo if (fill[0] === '#') function decodeFill(el, index, count) { var model = el._model || {}; var fill = model.fill; var target; if (fill === undefined) { fill = !!model.backgroundColor; } if (fill === false || fill === null) { return false; } if (fill === true) { return 'origin'; } target = parseFloat(fill, 10); if (isFinite(target) && Math.floor(target) === target) { if (fill[0] === '-' || fill[0] === '+') { target = index + target; } if (target === index || target < 0 || target >= count) { return false; } return target; } switch (fill) { // compatibility case 'bottom': return 'start'; case 'top': return 'end'; case 'zero': return 'origin'; // supported boundaries case 'origin': case 'start': case 'end': return fill; // invalid fill values default: return false; } } function computeBoundary(source) { var model = source.el._model || {}; var scale = source.el._scale || {}; var fill = source.fill; var target = null; var horizontal; if (isFinite(fill)) { return null; } // Backward compatibility: until v3, we still need to support boundary values set on // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and // controllers might still use it (e.g. the Smith chart). if (fill === 'start') { target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; } else if (fill === 'end') { target = model.scaleTop === undefined ? scale.top : model.scaleTop; } else if (model.scaleZero !== undefined) { target = model.scaleZero; } else if (scale.getBasePosition) { target = scale.getBasePosition(); } else if (scale.getBasePixel) { target = scale.getBasePixel(); } if (target !== undefined && target !== null) { if (target.x !== undefined && target.y !== undefined) { return target; } if (typeof target === 'number' && isFinite(target)) { horizontal = scale.isHorizontal(); return { x: horizontal ? target : null, y: horizontal ? null : target }; } } return null; } function resolveTarget(sources, index, propagate) { var source = sources[index]; var fill = source.fill; var visited = [index]; var target; if (!propagate) { return fill; } while (fill !== false && visited.indexOf(fill) === -1) { if (!isFinite(fill)) { return fill; } target = sources[fill]; if (!target) { return false; } if (target.visible) { return fill; } visited.push(fill); fill = target.fill; } return false; } function createMapper(source) { var fill = source.fill; var type = 'dataset'; if (fill === false) { return null; } if (!isFinite(fill)) { type = 'boundary'; } return mappers[type](source); } function isDrawable(point) { return point && !point.skip; } function drawArea(ctx, curve0, curve1, len0, len1) { var i; if (!len0 || !len1) { return; } // building first area curve (normal) ctx.moveTo(curve0[0].x, curve0[0].y); for (i = 1; i < len0; ++i) { helpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); } // joining the two area curves ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); // building opposite area curve (reverse) for (i = len1 - 1; i > 0; --i) { helpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); } } function doFill(ctx, points, mapper, view, color, loop) { var count = points.length; var span = view.spanGaps; var curve0 = []; var curve1 = []; var len0 = 0; var len1 = 0; var i, ilen, index, p0, p1, d0, d1; ctx.beginPath(); for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { index = i % count; p0 = points[index]._view; p1 = mapper(p0, index, view); d0 = isDrawable(p0); d1 = isDrawable(p1); if (d0 && d1) { len0 = curve0.push(p0); len1 = curve1.push(p1); } else if (len0 && len1) { if (!span) { drawArea(ctx, curve0, curve1, len0, len1); len0 = len1 = 0; curve0 = []; curve1 = []; } else { if (d0) { curve0.push(p0); } if (d1) { curve1.push(p1); } } } } drawArea(ctx, curve0, curve1, len0, len1); ctx.closePath(); ctx.fillStyle = color; ctx.fill(); } return { id: 'filler', afterDatasetsUpdate: function(chart, options) { var count = (chart.data.datasets || []).length; var propagate = options.propagate; var sources = []; var meta, i, el, source; for (i = 0; i < count; ++i) { meta = chart.getDatasetMeta(i); el = meta.dataset; source = null; if (el && el._model && el instanceof elements.Line) { source = { visible: chart.isDatasetVisible(i), fill: decodeFill(el, i, count), chart: chart, el: el }; } meta.$filler = source; sources.push(source); } for (i = 0; i < count; ++i) { source = sources[i]; if (!source) { continue; } source.fill = resolveTarget(sources, i, propagate); source.boundary = computeBoundary(source); source.mapper = createMapper(source); } }, beforeDatasetDraw: function(chart, args) { var meta = args.meta.$filler; if (!meta) { return; } var ctx = chart.ctx; var el = meta.el; var view = el._view; var points = el._children || []; var mapper = meta.mapper; var color = view.backgroundColor || defaults.global.defaultColor; if (mapper && color && points.length) { helpers.canvas.clipArea(ctx, chart.chartArea); doFill(ctx, points, mapper, view, color, el._loop); helpers.canvas.unclipArea(ctx); } } }; }; },{"25":25,"40":40,"45":45}],50:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); defaults._set('global', { legend: { display: true, position: 'top', fullWidth: true, reverse: false, weight: 1000, // a callback that will handle onClick: function(e, legendItem) { var index = legendItem.datasetIndex; var ci = this.chart; var meta = ci.getDatasetMeta(index); // See controller.isDatasetVisible comment meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; // We hid a dataset ... rerender the chart ci.update(); }, onHover: null, labels: { boxWidth: 40, padding: 10, // Generates labels shown in the legend // Valid properties to return: // text : text to display // fillStyle : fill of coloured box // strokeStyle: stroke of coloured box // hidden : if this legend item refers to a hidden item // lineCap : cap style for line // lineDash // lineDashOffset : // lineJoin : // lineWidth : generateLabels: function(chart) { var data = chart.data; return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { return { text: dataset.label, fillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), hidden: !chart.isDatasetVisible(i), lineCap: dataset.borderCapStyle, lineDash: dataset.borderDash, lineDashOffset: dataset.borderDashOffset, lineJoin: dataset.borderJoinStyle, lineWidth: dataset.borderWidth, strokeStyle: dataset.borderColor, pointStyle: dataset.pointStyle, // Below is extra data used for toggling the datasets datasetIndex: i }; }, this) : []; } } }, legendCallback: function(chart) { var text = []; text.push('
    '); for (var i = 0; i < chart.data.datasets.length; i++) { text.push('
  • '); if (chart.data.datasets[i].label) { text.push(chart.data.datasets[i].label); } text.push('
  • '); } text.push('
'); return text.join(''); } }); module.exports = function(Chart) { var layout = Chart.layoutService; var noop = helpers.noop; /** * Helper function to get the box width based on the usePointStyle option * @param labelopts {Object} the label options on the legend * @param fontSize {Number} the label font size * @return {Number} width of the color box area */ function getBoxWidth(labelOpts, fontSize) { return labelOpts.usePointStyle ? fontSize * Math.SQRT2 : labelOpts.boxWidth; } Chart.Legend = Element.extend({ initialize: function(config) { helpers.extend(this, config); // Contains hit boxes for each dataset (in dataset order) this.legendHitBoxes = []; // Are we in doughnut mode which has a different data type this.doughnutMode = false; }, // These methods are ordered by lifecycle. Utilities then follow. // Any function defined here is inherited by all legend types. // Any function can be extended by the legend type beforeUpdate: noop, update: function(maxWidth, maxHeight, margins) { var me = this; // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) me.beforeUpdate(); // Absorb the master measurements me.maxWidth = maxWidth; me.maxHeight = maxHeight; me.margins = margins; // Dimensions me.beforeSetDimensions(); me.setDimensions(); me.afterSetDimensions(); // Labels me.beforeBuildLabels(); me.buildLabels(); me.afterBuildLabels(); // Fit me.beforeFit(); me.fit(); me.afterFit(); // me.afterUpdate(); return me.minSize; }, afterUpdate: noop, // beforeSetDimensions: noop, setDimensions: function() { var me = this; // Set the unconstrained dimension before label rotation if (me.isHorizontal()) { // Reset position before calculating rotation me.width = me.maxWidth; me.left = 0; me.right = me.width; } else { me.height = me.maxHeight; // Reset position before calculating rotation me.top = 0; me.bottom = me.height; } // Reset padding me.paddingLeft = 0; me.paddingTop = 0; me.paddingRight = 0; me.paddingBottom = 0; // Reset minSize me.minSize = { width: 0, height: 0 }; }, afterSetDimensions: noop, // beforeBuildLabels: noop, buildLabels: function() { var me = this; var labelOpts = me.options.labels || {}; var legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || []; if (labelOpts.filter) { legendItems = legendItems.filter(function(item) { return labelOpts.filter(item, me.chart.data); }); } if (me.options.reverse) { legendItems.reverse(); } me.legendItems = legendItems; }, afterBuildLabels: noop, // beforeFit: noop, fit: function() { var me = this; var opts = me.options; var labelOpts = opts.labels; var display = opts.display; var ctx = me.ctx; var globalDefault = defaults.global; var valueOrDefault = helpers.valueOrDefault; var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize); var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle); var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily); var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily); // Reset hit boxes var hitboxes = me.legendHitBoxes = []; var minSize = me.minSize; var isHorizontal = me.isHorizontal(); if (isHorizontal) { minSize.width = me.maxWidth; // fill all the width minSize.height = display ? 10 : 0; } else { minSize.width = display ? 10 : 0; minSize.height = me.maxHeight; // fill all the height } // Increase sizes here if (display) { ctx.font = labelFont; if (isHorizontal) { // Labels // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one var lineWidths = me.lineWidths = [0]; var totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0; ctx.textAlign = 'left'; ctx.textBaseline = 'top'; helpers.each(me.legendItems, function(legendItem, i) { var boxWidth = getBoxWidth(labelOpts, fontSize); var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) { totalHeight += fontSize + (labelOpts.padding); lineWidths[lineWidths.length] = me.left; } // Store the hitbox width and height here. Final position will be updated in `draw` hitboxes[i] = { left: 0, top: 0, width: width, height: fontSize }; lineWidths[lineWidths.length - 1] += width + labelOpts.padding; }); minSize.height += totalHeight; } else { var vPadding = labelOpts.padding; var columnWidths = me.columnWidths = []; var totalWidth = labelOpts.padding; var currentColWidth = 0; var currentColHeight = 0; var itemHeight = fontSize + vPadding; helpers.each(me.legendItems, function(legendItem, i) { var boxWidth = getBoxWidth(labelOpts, fontSize); var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; // If too tall, go to new column if (currentColHeight + itemHeight > minSize.height) { totalWidth += currentColWidth + labelOpts.padding; columnWidths.push(currentColWidth); // previous column width currentColWidth = 0; currentColHeight = 0; } // Get max width currentColWidth = Math.max(currentColWidth, itemWidth); currentColHeight += itemHeight; // Store the hitbox width and height here. Final position will be updated in `draw` hitboxes[i] = { left: 0, top: 0, width: itemWidth, height: fontSize }; }); totalWidth += currentColWidth; columnWidths.push(currentColWidth); minSize.width += totalWidth; } } me.width = minSize.width; me.height = minSize.height; }, afterFit: noop, // Shared Methods isHorizontal: function() { return this.options.position === 'top' || this.options.position === 'bottom'; }, // Actually draw the legend on the canvas draw: function() { var me = this; var opts = me.options; var labelOpts = opts.labels; var globalDefault = defaults.global; var lineDefault = globalDefault.elements.line; var legendWidth = me.width; var lineWidths = me.lineWidths; if (opts.display) { var ctx = me.ctx; var valueOrDefault = helpers.valueOrDefault; var fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor); var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize); var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle); var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily); var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily); var cursor; // Canvas setup ctx.textAlign = 'left'; ctx.textBaseline = 'middle'; ctx.lineWidth = 0.5; ctx.strokeStyle = fontColor; // for strikethrough effect ctx.fillStyle = fontColor; // render in correct colour ctx.font = labelFont; var boxWidth = getBoxWidth(labelOpts, fontSize); var hitboxes = me.legendHitBoxes; // current position var drawLegendBox = function(x, y, legendItem) { if (isNaN(boxWidth) || boxWidth <= 0) { return; } // Set the ctx for the box ctx.save(); ctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor); ctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle); ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset); ctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle); ctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth); ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor); var isLineWidthZero = (valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0); if (ctx.setLineDash) { // IE 9 and 10 do not support line dash ctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash)); } if (opts.labels && opts.labels.usePointStyle) { // Recalculate x and y for drawPoint() because its expecting // x and y to be center of figure (instead of top left) var radius = fontSize * Math.SQRT2 / 2; var offSet = radius / Math.SQRT2; var centerX = x + offSet; var centerY = y + offSet; // Draw pointStyle as legend symbol helpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); } else { // Draw box as legend symbol if (!isLineWidthZero) { ctx.strokeRect(x, y, boxWidth, fontSize); } ctx.fillRect(x, y, boxWidth, fontSize); } ctx.restore(); }; var fillText = function(x, y, legendItem, textWidth) { var halfFontSize = fontSize / 2; var xLeft = boxWidth + halfFontSize + x; var yMiddle = y + halfFontSize; ctx.fillText(legendItem.text, xLeft, yMiddle); if (legendItem.hidden) { // Strikethrough the text if hidden ctx.beginPath(); ctx.lineWidth = 2; ctx.moveTo(xLeft, yMiddle); ctx.lineTo(xLeft + textWidth, yMiddle); ctx.stroke(); } }; // Horizontal var isHorizontal = me.isHorizontal(); if (isHorizontal) { cursor = { x: me.left + ((legendWidth - lineWidths[0]) / 2), y: me.top + labelOpts.padding, line: 0 }; } else { cursor = { x: me.left + labelOpts.padding, y: me.top + labelOpts.padding, line: 0 }; } var itemHeight = fontSize + labelOpts.padding; helpers.each(me.legendItems, function(legendItem, i) { var textWidth = ctx.measureText(legendItem.text).width; var width = boxWidth + (fontSize / 2) + textWidth; var x = cursor.x; var y = cursor.y; if (isHorizontal) { if (x + width >= legendWidth) { y = cursor.y += itemHeight; cursor.line++; x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2); } } else if (y + itemHeight > me.bottom) { x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; y = cursor.y = me.top + labelOpts.padding; cursor.line++; } drawLegendBox(x, y, legendItem); hitboxes[i].left = x; hitboxes[i].top = y; // Fill the actual label fillText(x, y, legendItem, textWidth); if (isHorizontal) { cursor.x += width + (labelOpts.padding); } else { cursor.y += itemHeight; } }); } }, /** * Handle an event * @private * @param {IEvent} event - The event to handle * @return {Boolean} true if a change occured */ handleEvent: function(e) { var me = this; var opts = me.options; var type = e.type === 'mouseup' ? 'click' : e.type; var changed = false; if (type === 'mousemove') { if (!opts.onHover) { return; } } else if (type === 'click') { if (!opts.onClick) { return; } } else { return; } // Chart event already has relative position in it var x = e.x; var y = e.y; if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { // See if we are touching one of the dataset boxes var lh = me.legendHitBoxes; for (var i = 0; i < lh.length; ++i) { var hitBox = lh[i]; if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { // Touching an element if (type === 'click') { // use e.native for backwards compatibility opts.onClick.call(me, e.native, me.legendItems[i]); changed = true; break; } else if (type === 'mousemove') { // use e.native for backwards compatibility opts.onHover.call(me, e.native, me.legendItems[i]); changed = true; break; } } } } return changed; } }); function createNewLegendAndAttach(chart, legendOpts) { var legend = new Chart.Legend({ ctx: chart.ctx, options: legendOpts, chart: chart }); layout.configure(chart, legend, legendOpts); layout.addBox(chart, legend); chart.legend = legend; } return { id: 'legend', beforeInit: function(chart) { var legendOpts = chart.options.legend; if (legendOpts) { createNewLegendAndAttach(chart, legendOpts); } }, beforeUpdate: function(chart) { var legendOpts = chart.options.legend; var legend = chart.legend; if (legendOpts) { helpers.mergeIf(legendOpts, defaults.global.legend); if (legend) { layout.configure(chart, legend, legendOpts); legend.options = legendOpts; } else { createNewLegendAndAttach(chart, legendOpts); } } else if (legend) { layout.removeBox(chart, legend); delete chart.legend; } }, afterEvent: function(chart, e) { var legend = chart.legend; if (legend) { legend.handleEvent(e); } } }; }; },{"25":25,"26":26,"45":45}],51:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); defaults._set('global', { title: { display: false, fontStyle: 'bold', fullWidth: true, lineHeight: 1.2, padding: 10, position: 'top', text: '', weight: 2000 // by default greater than legend (1000) to be above } }); module.exports = function(Chart) { var layout = Chart.layoutService; var noop = helpers.noop; Chart.Title = Element.extend({ initialize: function(config) { var me = this; helpers.extend(me, config); // Contains hit boxes for each dataset (in dataset order) me.legendHitBoxes = []; }, // These methods are ordered by lifecycle. Utilities then follow. beforeUpdate: noop, update: function(maxWidth, maxHeight, margins) { var me = this; // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) me.beforeUpdate(); // Absorb the master measurements me.maxWidth = maxWidth; me.maxHeight = maxHeight; me.margins = margins; // Dimensions me.beforeSetDimensions(); me.setDimensions(); me.afterSetDimensions(); // Labels me.beforeBuildLabels(); me.buildLabels(); me.afterBuildLabels(); // Fit me.beforeFit(); me.fit(); me.afterFit(); // me.afterUpdate(); return me.minSize; }, afterUpdate: noop, // beforeSetDimensions: noop, setDimensions: function() { var me = this; // Set the unconstrained dimension before label rotation if (me.isHorizontal()) { // Reset position before calculating rotation me.width = me.maxWidth; me.left = 0; me.right = me.width; } else { me.height = me.maxHeight; // Reset position before calculating rotation me.top = 0; me.bottom = me.height; } // Reset padding me.paddingLeft = 0; me.paddingTop = 0; me.paddingRight = 0; me.paddingBottom = 0; // Reset minSize me.minSize = { width: 0, height: 0 }; }, afterSetDimensions: noop, // beforeBuildLabels: noop, buildLabels: noop, afterBuildLabels: noop, // beforeFit: noop, fit: function() { var me = this; var valueOrDefault = helpers.valueOrDefault; var opts = me.options; var display = opts.display; var fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize); var minSize = me.minSize; var lineCount = helpers.isArray(opts.text) ? opts.text.length : 1; var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize); var textSize = display ? (lineCount * lineHeight) + (opts.padding * 2) : 0; if (me.isHorizontal()) { minSize.width = me.maxWidth; // fill all the width minSize.height = textSize; } else { minSize.width = textSize; minSize.height = me.maxHeight; // fill all the height } me.width = minSize.width; me.height = minSize.height; }, afterFit: noop, // Shared Methods isHorizontal: function() { var pos = this.options.position; return pos === 'top' || pos === 'bottom'; }, // Actually draw the title block on the canvas draw: function() { var me = this; var ctx = me.ctx; var valueOrDefault = helpers.valueOrDefault; var opts = me.options; var globalDefaults = defaults.global; if (opts.display) { var fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize); var fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle); var fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily); var titleFont = helpers.fontString(fontSize, fontStyle, fontFamily); var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize); var offset = lineHeight / 2 + opts.padding; var rotation = 0; var top = me.top; var left = me.left; var bottom = me.bottom; var right = me.right; var maxWidth, titleX, titleY; ctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour ctx.font = titleFont; // Horizontal if (me.isHorizontal()) { titleX = left + ((right - left) / 2); // midpoint of the width titleY = top + offset; maxWidth = right - left; } else { titleX = opts.position === 'left' ? left + offset : right - offset; titleY = top + ((bottom - top) / 2); maxWidth = bottom - top; rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); } ctx.save(); ctx.translate(titleX, titleY); ctx.rotate(rotation); ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; var text = opts.text; if (helpers.isArray(text)) { var y = 0; for (var i = 0; i < text.length; ++i) { ctx.fillText(text[i], 0, y, maxWidth); y += lineHeight; } } else { ctx.fillText(text, 0, 0, maxWidth); } ctx.restore(); } } }); function createNewTitleBlockAndAttach(chart, titleOpts) { var title = new Chart.Title({ ctx: chart.ctx, options: titleOpts, chart: chart }); layout.configure(chart, title, titleOpts); layout.addBox(chart, title); chart.titleBlock = title; } return { id: 'title', beforeInit: function(chart) { var titleOpts = chart.options.title; if (titleOpts) { createNewTitleBlockAndAttach(chart, titleOpts); } }, beforeUpdate: function(chart) { var titleOpts = chart.options.title; var titleBlock = chart.titleBlock; if (titleOpts) { helpers.mergeIf(titleOpts, defaults.global.title); if (titleBlock) { layout.configure(chart, titleBlock, titleOpts); titleBlock.options = titleOpts; } else { createNewTitleBlockAndAttach(chart, titleOpts); } } else if (titleBlock) { Chart.layoutService.removeBox(chart, titleBlock); delete chart.titleBlock; } } }; }; },{"25":25,"26":26,"45":45}],52:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { // Default config for a category scale var defaultConfig = { position: 'bottom' }; var DatasetScale = Chart.Scale.extend({ /** * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those * else fall back to data.labels * @private */ getLabels: function() { var data = this.chart.data; return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; }, determineDataLimits: function() { var me = this; var labels = me.getLabels(); me.minIndex = 0; me.maxIndex = labels.length - 1; var findIndex; if (me.options.ticks.min !== undefined) { // user specified min value findIndex = labels.indexOf(me.options.ticks.min); me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; } if (me.options.ticks.max !== undefined) { // user specified max value findIndex = labels.indexOf(me.options.ticks.max); me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; } me.min = labels[me.minIndex]; me.max = labels[me.maxIndex]; }, buildTicks: function() { var me = this; var labels = me.getLabels(); // If we are viewing some subset of labels, slice the original array me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); }, getLabelForIndex: function(index, datasetIndex) { var me = this; var data = me.chart.data; var isHorizontal = me.isHorizontal(); if (data.yLabels && !isHorizontal) { return me.getRightValue(data.datasets[datasetIndex].data[index]); } return me.ticks[index - me.minIndex]; }, // Used to get data value locations. Value can either be an index or a numerical value getPixelForValue: function(value, index) { var me = this; var offset = me.options.offset; // 1 is added because we need the length but we have the indexes var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); // If value is a data object, then index is the index in the data array, // not the index of the scale. We need to change that. var valueCategory; if (value !== undefined && value !== null) { valueCategory = me.isHorizontal() ? value.x : value.y; } if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { var labels = me.getLabels(); value = valueCategory || value; var idx = labels.indexOf(value); index = idx !== -1 ? idx : index; } if (me.isHorizontal()) { var valueWidth = me.width / offsetAmt; var widthOffset = (valueWidth * (index - me.minIndex)); if (offset) { widthOffset += (valueWidth / 2); } return me.left + Math.round(widthOffset); } var valueHeight = me.height / offsetAmt; var heightOffset = (valueHeight * (index - me.minIndex)); if (offset) { heightOffset += (valueHeight / 2); } return me.top + Math.round(heightOffset); }, getPixelForTick: function(index) { return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); }, getValueForPixel: function(pixel) { var me = this; var offset = me.options.offset; var value; var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); var horz = me.isHorizontal(); var valueDimension = (horz ? me.width : me.height) / offsetAmt; pixel -= horz ? me.left : me.top; if (offset) { pixel -= (valueDimension / 2); } if (pixel <= 0) { value = 0; } else { value = Math.round(pixel / valueDimension); } return value + me.minIndex; }, getBasePixel: function() { return this.bottom; } }); Chart.scaleService.registerScaleType('category', DatasetScale, defaultConfig); }; },{}],53:[function(require,module,exports){ 'use strict'; var defaults = require(25); var helpers = require(45); var Ticks = require(34); module.exports = function(Chart) { var defaultConfig = { position: 'left', ticks: { callback: Ticks.formatters.linear } }; var LinearScale = Chart.LinearScaleBase.extend({ determineDataLimits: function() { var me = this; var opts = me.options; var chart = me.chart; var data = chart.data; var datasets = data.datasets; var isHorizontal = me.isHorizontal(); var DEFAULT_MIN = 0; var DEFAULT_MAX = 1; function IDMatches(meta) { return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; } // First Calculate the range me.min = null; me.max = null; var hasStacks = opts.stacked; if (hasStacks === undefined) { helpers.each(datasets, function(dataset, datasetIndex) { if (hasStacks) { return; } var meta = chart.getDatasetMeta(datasetIndex); if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && meta.stack !== undefined) { hasStacks = true; } }); } if (opts.stacked || hasStacks) { var valuesPerStack = {}; helpers.each(datasets, function(dataset, datasetIndex) { var meta = chart.getDatasetMeta(datasetIndex); var key = [ meta.type, // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), meta.stack ].join('.'); if (valuesPerStack[key] === undefined) { valuesPerStack[key] = { positiveValues: [], negativeValues: [] }; } // Store these per type var positiveValues = valuesPerStack[key].positiveValues; var negativeValues = valuesPerStack[key].negativeValues; if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { helpers.each(dataset.data, function(rawValue, index) { var value = +me.getRightValue(rawValue); if (isNaN(value) || meta.data[index].hidden) { return; } positiveValues[index] = positiveValues[index] || 0; negativeValues[index] = negativeValues[index] || 0; if (opts.relativePoints) { positiveValues[index] = 100; } else if (value < 0) { negativeValues[index] += value; } else { positiveValues[index] += value; } }); } }); helpers.each(valuesPerStack, function(valuesForType) { var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); var minVal = helpers.min(values); var maxVal = helpers.max(values); me.min = me.min === null ? minVal : Math.min(me.min, minVal); me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); }); } else { helpers.each(datasets, function(dataset, datasetIndex) { var meta = chart.getDatasetMeta(datasetIndex); if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { helpers.each(dataset.data, function(rawValue, index) { var value = +me.getRightValue(rawValue); if (isNaN(value) || meta.data[index].hidden) { return; } if (me.min === null) { me.min = value; } else if (value < me.min) { me.min = value; } if (me.max === null) { me.max = value; } else if (value > me.max) { me.max = value; } }); } }); } me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero this.handleTickRangeOptions(); }, getTickLimit: function() { var maxTicks; var me = this; var tickOpts = me.options.ticks; if (me.isHorizontal()) { maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50)); } else { // The factor of 2 used to scale the font size has been experimentally determined. var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize); maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize))); } return maxTicks; }, // Called after the ticks are built. We need handleDirectionalChanges: function() { if (!this.isHorizontal()) { // We are in a vertical orientation. The top value is the highest. So reverse the array this.ticks.reverse(); } }, getLabelForIndex: function(index, datasetIndex) { return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); }, // Utils getPixelForValue: function(value) { // This must be called after fit has been run so that // this.left, this.top, this.right, and this.bottom have been defined var me = this; var start = me.start; var rightValue = +me.getRightValue(value); var pixel; var range = me.end - start; if (me.isHorizontal()) { pixel = me.left + (me.width / range * (rightValue - start)); return Math.round(pixel); } pixel = me.bottom - (me.height / range * (rightValue - start)); return Math.round(pixel); }, getValueForPixel: function(pixel) { var me = this; var isHorizontal = me.isHorizontal(); var innerDimension = isHorizontal ? me.width : me.height; var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; return me.start + ((me.end - me.start) * offset); }, getPixelForTick: function(index) { return this.getPixelForValue(this.ticksAsNumbers[index]); } }); Chart.scaleService.registerScaleType('linear', LinearScale, defaultConfig); }; },{"25":25,"34":34,"45":45}],54:[function(require,module,exports){ 'use strict'; var helpers = require(45); var Ticks = require(34); module.exports = function(Chart) { var noop = helpers.noop; Chart.LinearScaleBase = Chart.Scale.extend({ getRightValue: function(value) { if (typeof value === 'string') { return +value; } return Chart.Scale.prototype.getRightValue.call(this, value); }, handleTickRangeOptions: function() { var me = this; var opts = me.options; var tickOpts = opts.ticks; // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, // do nothing since that would make the chart weird. If the user really wants a weird chart // axis, they can manually override it if (tickOpts.beginAtZero) { var minSign = helpers.sign(me.min); var maxSign = helpers.sign(me.max); if (minSign < 0 && maxSign < 0) { // move the top up to 0 me.max = 0; } else if (minSign > 0 && maxSign > 0) { // move the bottom down to 0 me.min = 0; } } var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; if (tickOpts.min !== undefined) { me.min = tickOpts.min; } else if (tickOpts.suggestedMin !== undefined) { if (me.min === null) { me.min = tickOpts.suggestedMin; } else { me.min = Math.min(me.min, tickOpts.suggestedMin); } } if (tickOpts.max !== undefined) { me.max = tickOpts.max; } else if (tickOpts.suggestedMax !== undefined) { if (me.max === null) { me.max = tickOpts.suggestedMax; } else { me.max = Math.max(me.max, tickOpts.suggestedMax); } } if (setMin !== setMax) { // We set the min or the max but not both. // So ensure that our range is good // Inverted or 0 length range can happen when // ticks.min is set, and no datasets are visible if (me.min >= me.max) { if (setMin) { me.max = me.min + 1; } else { me.min = me.max - 1; } } } if (me.min === me.max) { me.max++; if (!tickOpts.beginAtZero) { me.min--; } } }, getTickLimit: noop, handleDirectionalChanges: noop, buildTicks: function() { var me = this; var opts = me.options; var tickOpts = opts.ticks; // Figure out what the max number of ticks we can support it is based on the size of // the axis area. For now, we say that the minimum tick spacing in pixels must be 50 // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on // the graph. Make sure we always have at least 2 ticks var maxTicks = me.getTickLimit(); maxTicks = Math.max(2, maxTicks); var numericGeneratorOptions = { maxTicks: maxTicks, min: tickOpts.min, max: tickOpts.max, stepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) }; var ticks = me.ticks = Ticks.generators.linear(numericGeneratorOptions, me); me.handleDirectionalChanges(); // At this point, we need to update our max and min given the tick values since we have expanded the // range of the scale me.max = helpers.max(ticks); me.min = helpers.min(ticks); if (tickOpts.reverse) { ticks.reverse(); me.start = me.max; me.end = me.min; } else { me.start = me.min; me.end = me.max; } }, convertTicksToLabels: function() { var me = this; me.ticksAsNumbers = me.ticks.slice(); me.zeroLineIndex = me.ticks.indexOf(0); Chart.Scale.prototype.convertTicksToLabels.call(me); } }); }; },{"34":34,"45":45}],55:[function(require,module,exports){ 'use strict'; var helpers = require(45); var Ticks = require(34); module.exports = function(Chart) { var defaultConfig = { position: 'left', // label settings ticks: { callback: Ticks.formatters.logarithmic } }; var LogarithmicScale = Chart.Scale.extend({ determineDataLimits: function() { var me = this; var opts = me.options; var tickOpts = opts.ticks; var chart = me.chart; var data = chart.data; var datasets = data.datasets; var valueOrDefault = helpers.valueOrDefault; var isHorizontal = me.isHorizontal(); function IDMatches(meta) { return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; } // Calculate Range me.min = null; me.max = null; me.minNotZero = null; var hasStacks = opts.stacked; if (hasStacks === undefined) { helpers.each(datasets, function(dataset, datasetIndex) { if (hasStacks) { return; } var meta = chart.getDatasetMeta(datasetIndex); if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && meta.stack !== undefined) { hasStacks = true; } }); } if (opts.stacked || hasStacks) { var valuesPerStack = {}; helpers.each(datasets, function(dataset, datasetIndex) { var meta = chart.getDatasetMeta(datasetIndex); var key = [ meta.type, // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), meta.stack ].join('.'); if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { if (valuesPerStack[key] === undefined) { valuesPerStack[key] = []; } helpers.each(dataset.data, function(rawValue, index) { var values = valuesPerStack[key]; var value = +me.getRightValue(rawValue); if (isNaN(value) || meta.data[index].hidden) { return; } values[index] = values[index] || 0; if (opts.relativePoints) { values[index] = 100; } else { // Don't need to split positive and negative since the log scale can't handle a 0 crossing values[index] += value; } }); } }); helpers.each(valuesPerStack, function(valuesForType) { var minVal = helpers.min(valuesForType); var maxVal = helpers.max(valuesForType); me.min = me.min === null ? minVal : Math.min(me.min, minVal); me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); }); } else { helpers.each(datasets, function(dataset, datasetIndex) { var meta = chart.getDatasetMeta(datasetIndex); if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { helpers.each(dataset.data, function(rawValue, index) { var value = +me.getRightValue(rawValue); if (isNaN(value) || meta.data[index].hidden) { return; } if (me.min === null) { me.min = value; } else if (value < me.min) { me.min = value; } if (me.max === null) { me.max = value; } else if (value > me.max) { me.max = value; } if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { me.minNotZero = value; } }); } }); } me.min = valueOrDefault(tickOpts.min, me.min); me.max = valueOrDefault(tickOpts.max, me.max); if (me.min === me.max) { if (me.min !== 0 && me.min !== null) { me.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1); me.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1); } else { me.min = 1; me.max = 10; } } }, buildTicks: function() { var me = this; var opts = me.options; var tickOpts = opts.ticks; var generationOptions = { min: tickOpts.min, max: tickOpts.max }; var ticks = me.ticks = Ticks.generators.logarithmic(generationOptions, me); if (!me.isHorizontal()) { // We are in a vertical orientation. The top value is the highest. So reverse the array ticks.reverse(); } // At this point, we need to update our max and min given the tick values since we have expanded the // range of the scale me.max = helpers.max(ticks); me.min = helpers.min(ticks); if (tickOpts.reverse) { ticks.reverse(); me.start = me.max; me.end = me.min; } else { me.start = me.min; me.end = me.max; } }, convertTicksToLabels: function() { this.tickValues = this.ticks.slice(); Chart.Scale.prototype.convertTicksToLabels.call(this); }, // Get the correct tooltip label getLabelForIndex: function(index, datasetIndex) { return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); }, getPixelForTick: function(index) { return this.getPixelForValue(this.tickValues[index]); }, getPixelForValue: function(value) { var me = this; var start = me.start; var newVal = +me.getRightValue(value); var opts = me.options; var tickOpts = opts.ticks; var innerDimension, pixel, range; if (me.isHorizontal()) { range = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0 if (newVal === 0) { pixel = me.left; } else { innerDimension = me.width; pixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start))); } } else { // Bottom - top since pixels increase downward on a screen innerDimension = me.height; if (start === 0 && !tickOpts.reverse) { range = helpers.log10(me.end) - helpers.log10(me.minNotZero); if (newVal === start) { pixel = me.bottom; } else if (newVal === me.minNotZero) { pixel = me.bottom - innerDimension * 0.02; } else { pixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero))); } } else if (me.end === 0 && tickOpts.reverse) { range = helpers.log10(me.start) - helpers.log10(me.minNotZero); if (newVal === me.end) { pixel = me.top; } else if (newVal === me.minNotZero) { pixel = me.top + innerDimension * 0.02; } else { pixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero))); } } else if (newVal === 0) { pixel = tickOpts.reverse ? me.top : me.bottom; } else { range = helpers.log10(me.end) - helpers.log10(start); innerDimension = me.height; pixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start))); } } return pixel; }, getValueForPixel: function(pixel) { var me = this; var range = helpers.log10(me.end) - helpers.log10(me.start); var value, innerDimension; if (me.isHorizontal()) { innerDimension = me.width; value = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension); } else { // todo: if start === 0 innerDimension = me.height; value = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start; } return value; } }); Chart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig); }; },{"34":34,"45":45}],56:[function(require,module,exports){ 'use strict'; var defaults = require(25); var helpers = require(45); var Ticks = require(34); module.exports = function(Chart) { var globalDefaults = defaults.global; var defaultConfig = { display: true, // Boolean - Whether to animate scaling the chart from the centre animate: true, position: 'chartArea', angleLines: { display: true, color: 'rgba(0, 0, 0, 0.1)', lineWidth: 1 }, gridLines: { circular: false }, // label settings ticks: { // Boolean - Show a backdrop to the scale label showLabelBackdrop: true, // String - The colour of the label backdrop backdropColor: 'rgba(255,255,255,0.75)', // Number - The backdrop padding above & below the label in pixels backdropPaddingY: 2, // Number - The backdrop padding to the side of the label in pixels backdropPaddingX: 2, callback: Ticks.formatters.linear }, pointLabels: { // Boolean - if true, show point labels display: true, // Number - Point label font size in pixels fontSize: 10, // Function - Used to convert point labels callback: function(label) { return label; } } }; function getValueCount(scale) { var opts = scale.options; return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; } function getPointLabelFontOptions(scale) { var pointLabelOptions = scale.options.pointLabels; var fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize); var fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle); var fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily); var font = helpers.fontString(fontSize, fontStyle, fontFamily); return { size: fontSize, style: fontStyle, family: fontFamily, font: font }; } function measureLabelSize(ctx, fontSize, label) { if (helpers.isArray(label)) { return { w: helpers.longestText(ctx, ctx.font, label), h: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize) }; } return { w: ctx.measureText(label).width, h: fontSize }; } function determineLimits(angle, pos, size, min, max) { if (angle === min || angle === max) { return { start: pos - (size / 2), end: pos + (size / 2) }; } else if (angle < min || angle > max) { return { start: pos - size - 5, end: pos }; } return { start: pos, end: pos + size + 5 }; } /** * Helper function to fit a radial linear scale with point labels */ function fitWithPointLabels(scale) { /* * Right, this is really confusing and there is a lot of maths going on here * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 * * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif * * Solution: * * We assume the radius of the polygon is half the size of the canvas at first * at each index we check if the text overlaps. * * Where it does, we store that angle and that index. * * After finding the largest index and angle we calculate how much we need to remove * from the shape radius to move the point inwards by that x. * * We average the left and right distances to get the maximum shape radius that can fit in the box * along with labels. * * Once we have that, we can find the centre point for the chart, by taking the x text protrusion * on each side, removing that from the size, halving it and adding the left x protrusion width. * * This will mean we have a shape fitted to the canvas, as large as it can be with the labels * and position it in the most space efficient manner * * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif */ var plFont = getPointLabelFontOptions(scale); // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2); var furthestLimits = { r: scale.width, l: 0, t: scale.height, b: 0 }; var furthestAngles = {}; var i, textSize, pointPosition; scale.ctx.font = plFont.font; scale._pointLabelSizes = []; var valueCount = getValueCount(scale); for (i = 0; i < valueCount; i++) { pointPosition = scale.getPointPosition(i, largestPossibleRadius); textSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || ''); scale._pointLabelSizes[i] = textSize; // Add quarter circle to make degree 0 mean top of circle var angleRadians = scale.getIndexAngle(i); var angle = helpers.toDegrees(angleRadians) % 360; var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); if (hLimits.start < furthestLimits.l) { furthestLimits.l = hLimits.start; furthestAngles.l = angleRadians; } if (hLimits.end > furthestLimits.r) { furthestLimits.r = hLimits.end; furthestAngles.r = angleRadians; } if (vLimits.start < furthestLimits.t) { furthestLimits.t = vLimits.start; furthestAngles.t = angleRadians; } if (vLimits.end > furthestLimits.b) { furthestLimits.b = vLimits.end; furthestAngles.b = angleRadians; } } scale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles); } /** * Helper function to fit a radial linear scale with no point labels */ function fit(scale) { var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2); scale.drawingArea = Math.round(largestPossibleRadius); scale.setCenterPoint(0, 0, 0, 0); } function getTextAlignForAngle(angle) { if (angle === 0 || angle === 180) { return 'center'; } else if (angle < 180) { return 'left'; } return 'right'; } function fillText(ctx, text, position, fontSize) { if (helpers.isArray(text)) { var y = position.y; var spacing = 1.5 * fontSize; for (var i = 0; i < text.length; ++i) { ctx.fillText(text[i], position.x, y); y += spacing; } } else { ctx.fillText(text, position.x, position.y); } } function adjustPointPositionForLabelHeight(angle, textSize, position) { if (angle === 90 || angle === 270) { position.y -= (textSize.h / 2); } else if (angle > 270 || angle < 90) { position.y -= textSize.h; } } function drawPointLabels(scale) { var ctx = scale.ctx; var valueOrDefault = helpers.valueOrDefault; var opts = scale.options; var angleLineOpts = opts.angleLines; var pointLabelOpts = opts.pointLabels; ctx.lineWidth = angleLineOpts.lineWidth; ctx.strokeStyle = angleLineOpts.color; var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); // Point Label Font var plFont = getPointLabelFontOptions(scale); ctx.textBaseline = 'top'; for (var i = getValueCount(scale) - 1; i >= 0; i--) { if (angleLineOpts.display) { var outerPosition = scale.getPointPosition(i, outerDistance); ctx.beginPath(); ctx.moveTo(scale.xCenter, scale.yCenter); ctx.lineTo(outerPosition.x, outerPosition.y); ctx.stroke(); ctx.closePath(); } if (pointLabelOpts.display) { // Extra 3px out for some label spacing var pointLabelPosition = scale.getPointPosition(i, outerDistance + 5); // Keep this in loop since we may support array properties here var pointLabelFontColor = valueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor); ctx.font = plFont.font; ctx.fillStyle = pointLabelFontColor; var angleRadians = scale.getIndexAngle(i); var angle = helpers.toDegrees(angleRadians); ctx.textAlign = getTextAlignForAngle(angle); adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size); } } } function drawRadiusLine(scale, gridLineOpts, radius, index) { var ctx = scale.ctx; ctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1); ctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1); if (scale.options.gridLines.circular) { // Draw circular arcs between the points ctx.beginPath(); ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); ctx.closePath(); ctx.stroke(); } else { // Draw straight lines connecting each index var valueCount = getValueCount(scale); if (valueCount === 0) { return; } ctx.beginPath(); var pointPosition = scale.getPointPosition(0, radius); ctx.moveTo(pointPosition.x, pointPosition.y); for (var i = 1; i < valueCount; i++) { pointPosition = scale.getPointPosition(i, radius); ctx.lineTo(pointPosition.x, pointPosition.y); } ctx.closePath(); ctx.stroke(); } } function numberOrZero(param) { return helpers.isNumber(param) ? param : 0; } var LinearRadialScale = Chart.LinearScaleBase.extend({ setDimensions: function() { var me = this; var opts = me.options; var tickOpts = opts.ticks; // Set the unconstrained dimension before label rotation me.width = me.maxWidth; me.height = me.maxHeight; me.xCenter = Math.round(me.width / 2); me.yCenter = Math.round(me.height / 2); var minSize = helpers.min([me.height, me.width]); var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); me.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2); }, determineDataLimits: function() { var me = this; var chart = me.chart; var min = Number.POSITIVE_INFINITY; var max = Number.NEGATIVE_INFINITY; helpers.each(chart.data.datasets, function(dataset, datasetIndex) { if (chart.isDatasetVisible(datasetIndex)) { var meta = chart.getDatasetMeta(datasetIndex); helpers.each(dataset.data, function(rawValue, index) { var value = +me.getRightValue(rawValue); if (isNaN(value) || meta.data[index].hidden) { return; } min = Math.min(value, min); max = Math.max(value, max); }); } }); me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero me.handleTickRangeOptions(); }, getTickLimit: function() { var tickOpts = this.options.ticks; var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); return Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize))); }, convertTicksToLabels: function() { var me = this; Chart.LinearScaleBase.prototype.convertTicksToLabels.call(me); // Point labels me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); }, getLabelForIndex: function(index, datasetIndex) { return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); }, fit: function() { if (this.options.pointLabels.display) { fitWithPointLabels(this); } else { fit(this); } }, /** * Set radius reductions and determine new radius and center point * @private */ setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { var me = this; var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); var radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b); radiusReductionLeft = numberOrZero(radiusReductionLeft); radiusReductionRight = numberOrZero(radiusReductionRight); radiusReductionTop = numberOrZero(radiusReductionTop); radiusReductionBottom = numberOrZero(radiusReductionBottom); me.drawingArea = Math.min( Math.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), Math.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); }, setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { var me = this; var maxRight = me.width - rightMovement - me.drawingArea; var maxLeft = leftMovement + me.drawingArea; var maxTop = topMovement + me.drawingArea; var maxBottom = me.height - bottomMovement - me.drawingArea; me.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left); me.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top); }, getIndexAngle: function(index) { var angleMultiplier = (Math.PI * 2) / getValueCount(this); var startAngle = this.chart.options && this.chart.options.startAngle ? this.chart.options.startAngle : 0; var startAngleRadians = startAngle * Math.PI * 2 / 360; // Start from the top instead of right, so remove a quarter of the circle return index * angleMultiplier + startAngleRadians; }, getDistanceFromCenterForValue: function(value) { var me = this; if (value === null) { return 0; // null always in center } // Take into account half font size + the yPadding of the top value var scalingFactor = me.drawingArea / (me.max - me.min); if (me.options.ticks.reverse) { return (me.max - value) * scalingFactor; } return (value - me.min) * scalingFactor; }, getPointPosition: function(index, distanceFromCenter) { var me = this; var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); return { x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter, y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter }; }, getPointPositionForValue: function(index, value) { return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); }, getBasePosition: function() { var me = this; var min = me.min; var max = me.max; return me.getPointPositionForValue(0, me.beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0); }, draw: function() { var me = this; var opts = me.options; var gridLineOpts = opts.gridLines; var tickOpts = opts.ticks; var valueOrDefault = helpers.valueOrDefault; if (opts.display) { var ctx = me.ctx; var startAngle = this.getIndexAngle(0); // Tick Font var tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); var tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle); var tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily); var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily); helpers.each(me.ticks, function(label, index) { // Don't draw a centre value (if it is minimum) if (index > 0 || tickOpts.reverse) { var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); // Draw circular lines around the scale if (gridLineOpts.display && index !== 0) { drawRadiusLine(me, gridLineOpts, yCenterOffset, index); } if (tickOpts.display) { var tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor); ctx.font = tickLabelFont; ctx.save(); ctx.translate(me.xCenter, me.yCenter); ctx.rotate(startAngle); if (tickOpts.showLabelBackdrop) { var labelWidth = ctx.measureText(label).width; ctx.fillStyle = tickOpts.backdropColor; ctx.fillRect( -labelWidth / 2 - tickOpts.backdropPaddingX, -yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY, labelWidth + tickOpts.backdropPaddingX * 2, tickFontSize + tickOpts.backdropPaddingY * 2 ); } ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillStyle = tickFontColor; ctx.fillText(label, 0, -yCenterOffset); ctx.restore(); } } }); if (opts.angleLines.display || opts.pointLabels.display) { drawPointLabels(me); } } } }); Chart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig); }; },{"25":25,"34":34,"45":45}],57:[function(require,module,exports){ /* global window: false */ 'use strict'; var moment = require(1); moment = typeof moment === 'function' ? moment : window.moment; var defaults = require(25); var helpers = require(45); // Integer constants are from the ES6 spec. var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; var INTERVALS = { millisecond: { common: true, size: 1, steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] }, second: { common: true, size: 1000, steps: [1, 2, 5, 10, 30] }, minute: { common: true, size: 60000, steps: [1, 2, 5, 10, 30] }, hour: { common: true, size: 3600000, steps: [1, 2, 3, 6, 12] }, day: { common: true, size: 86400000, steps: [1, 2, 5] }, week: { common: false, size: 604800000, steps: [1, 2, 3, 4] }, month: { common: true, size: 2.628e9, steps: [1, 2, 3] }, quarter: { common: false, size: 7.884e9, steps: [1, 2, 3, 4] }, year: { common: true, size: 3.154e10 } }; var UNITS = Object.keys(INTERVALS); function sorter(a, b) { return a - b; } function arrayUnique(items) { var hash = {}; var out = []; var i, ilen, item; for (i = 0, ilen = items.length; i < ilen; ++i) { item = items[i]; if (!hash[item]) { hash[item] = true; out.push(item); } } return out; } /** * Returns an array of {time, pos} objects used to interpolate a specific `time` or position * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other * extremity (left + width or top + height). Note that it would be more optimized to directly * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need * to create the lookup table. The table ALWAYS contains at least two items: min and max. * * @param {Number[]} timestamps - timestamps sorted from lowest to highest. * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. * If 'series', timestamps will be positioned at the same distance from each other. In this * case, only timestamps that break the time linearity are registered, meaning that in the * best case, all timestamps are linear, the table contains only min and max. */ function buildLookupTable(timestamps, min, max, distribution) { if (distribution === 'linear' || !timestamps.length) { return [ {time: min, pos: 0}, {time: max, pos: 1} ]; } var table = []; var items = [min]; var i, ilen, prev, curr, next; for (i = 0, ilen = timestamps.length; i < ilen; ++i) { curr = timestamps[i]; if (curr > min && curr < max) { items.push(curr); } } items.push(max); for (i = 0, ilen = items.length; i < ilen; ++i) { next = items[i + 1]; prev = items[i - 1]; curr = items[i]; // only add points that breaks the scale linearity if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { table.push({time: curr, pos: i / (ilen - 1)}); } } return table; } // @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ function lookup(table, key, value) { var lo = 0; var hi = table.length - 1; var mid, i0, i1; while (lo >= 0 && lo <= hi) { mid = (lo + hi) >> 1; i0 = table[mid - 1] || null; i1 = table[mid]; if (!i0) { // given value is outside table (before first item) return {lo: null, hi: i1}; } else if (i1[key] < value) { lo = mid + 1; } else if (i0[key] > value) { hi = mid - 1; } else { return {lo: i0, hi: i1}; } } // given value is outside table (after last item) return {lo: i1, hi: null}; } /** * Linearly interpolates the given source `value` using the table items `skey` values and * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') * returns the position for a timestamp equal to 42. If value is out of bounds, values at * index [0, 1] or [n - 1, n] are used for the interpolation. */ function interpolate(table, skey, sval, tkey) { var range = lookup(table, skey, sval); // Note: the lookup table ALWAYS contains at least 2 items (min and max) var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; var span = next[skey] - prev[skey]; var ratio = span ? (sval - prev[skey]) / span : 0; var offset = (next[tkey] - prev[tkey]) * ratio; return prev[tkey] + offset; } /** * Convert the given value to a moment object using the given time options. * @see http://momentjs.com/docs/#/parsing/ */ function momentify(value, options) { var parser = options.parser; var format = options.parser || options.format; if (typeof parser === 'function') { return parser(value); } if (typeof value === 'string' && typeof format === 'string') { return moment(value, format); } if (!(value instanceof moment)) { value = moment(value); } if (value.isValid()) { return value; } // Labels are in an incompatible moment format and no `parser` has been provided. // The user might still use the deprecated `format` option to convert his inputs. if (typeof format === 'function') { return format(value); } return value; } function parse(input, scale) { if (helpers.isNullOrUndef(input)) { return null; } var options = scale.options.time; var value = momentify(scale.getRightValue(input), options); if (!value.isValid()) { return null; } if (options.round) { value.startOf(options.round); } return value.valueOf(); } /** * Returns the number of unit to skip to be able to display up to `capacity` number of ticks * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. */ function determineStepSize(min, max, unit, capacity) { var range = max - min; var interval = INTERVALS[unit]; var milliseconds = interval.size; var steps = interval.steps; var i, ilen, factor; if (!steps) { return Math.ceil(range / ((capacity || 1) * milliseconds)); } for (i = 0, ilen = steps.length; i < ilen; ++i) { factor = steps[i]; if (Math.ceil(range / (milliseconds * factor)) <= capacity) { break; } } return factor; } /** * Figures out what unit results in an appropriate number of auto-generated ticks */ function determineUnitForAutoTicks(minUnit, min, max, capacity) { var ilen = UNITS.length; var i, interval, factor; for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { interval = INTERVALS[UNITS[i]]; factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { return UNITS[i]; } } return UNITS[ilen - 1]; } /** * Figures out what unit to format a set of ticks with */ function determineUnitForFormatting(ticks, minUnit, min, max) { var duration = moment.duration(moment(max).diff(moment(min))); var ilen = UNITS.length; var i, unit; for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { unit = UNITS[i]; if (INTERVALS[unit].common && duration.as(unit) >= ticks.length) { return unit; } } return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; } function determineMajorUnit(unit) { for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { if (INTERVALS[UNITS[i]].common) { return UNITS[i]; } } } /** * Generates a maximum of `capacity` timestamps between min and max, rounded to the * `minor` unit, aligned on the `major` unit and using the given scale time `options`. * Important: this method can return ticks outside the min and max range, it's the * responsibility of the calling code to clamp values if needed. */ function generate(min, max, capacity, options) { var timeOpts = options.time; var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); var major = determineMajorUnit(minor); var stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize); var weekday = minor === 'week' ? timeOpts.isoWeekday : false; var majorTicksEnabled = options.ticks.major.enabled; var interval = INTERVALS[minor]; var first = moment(min); var last = moment(max); var ticks = []; var time; if (!stepSize) { stepSize = determineStepSize(min, max, minor, capacity); } // For 'week' unit, handle the first day of week option if (weekday) { first = first.isoWeekday(weekday); last = last.isoWeekday(weekday); } // Align first/last ticks on unit first = first.startOf(weekday ? 'day' : minor); last = last.startOf(weekday ? 'day' : minor); // Make sure that the last tick include max if (last < max) { last.add(1, minor); } time = moment(first); if (majorTicksEnabled && major && !weekday && !timeOpts.round) { // Align the first tick on the previous `minor` unit aligned on the `major` unit: // we first aligned time on the previous `major` unit then add the number of full // stepSize there is between first and the previous major time. time.startOf(major); time.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor); } for (; time < last; time.add(stepSize, minor)) { ticks.push(+time); } ticks.push(+time); return ticks; } /** * Returns the right and left offsets from edges in the form of {left, right}. * Offsets are added when the `offset` option is true. */ function computeOffsets(table, ticks, min, max, options) { var left = 0; var right = 0; var upper, lower; if (options.offset && ticks.length) { if (!options.time.min) { upper = ticks.length > 1 ? ticks[1] : max; lower = ticks[0]; left = ( interpolate(table, 'time', upper, 'pos') - interpolate(table, 'time', lower, 'pos') ) / 2; } if (!options.time.max) { upper = ticks[ticks.length - 1]; lower = ticks.length > 1 ? ticks[ticks.length - 2] : min; right = ( interpolate(table, 'time', upper, 'pos') - interpolate(table, 'time', lower, 'pos') ) / 2; } } return {left: left, right: right}; } function ticksFromTimestamps(values, majorUnit) { var ticks = []; var i, ilen, value, major; for (i = 0, ilen = values.length; i < ilen; ++i) { value = values[i]; major = majorUnit ? value === +moment(value).startOf(majorUnit) : false; ticks.push({ value: value, major: major }); } return ticks; } module.exports = function(Chart) { var defaultConfig = { position: 'bottom', /** * Data distribution along the scale: * - 'linear': data are spread according to their time (distances can vary), * - 'series': data are spread at the same distance from each other. * @see https://github.com/chartjs/Chart.js/pull/4507 * @since 2.7.0 */ distribution: 'linear', /** * Scale boundary strategy (bypassed by min/max time options) * - `data`: make sure data are fully visible, ticks outside are removed * - `ticks`: make sure ticks are fully visible, data outside are truncated * @see https://github.com/chartjs/Chart.js/pull/4556 * @since 2.7.0 */ bounds: 'data', time: { parser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/ unit: false, // false == automatic or override with week, month, year, etc. round: false, // none, or override with week, month, year, etc. displayFormat: false, // DEPRECATED isoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/ minUnit: 'millisecond', // defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/ displayFormats: { millisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM, second: 'h:mm:ss a', // 11:20:01 AM minute: 'h:mm a', // 11:20 AM hour: 'hA', // 5PM day: 'MMM D', // Sep 4 week: 'll', // Week 46, or maybe "[W]WW - YYYY" ? month: 'MMM YYYY', // Sept 2015 quarter: '[Q]Q - YYYY', // Q3 year: 'YYYY' // 2015 }, }, ticks: { autoSkip: false, /** * Ticks generation input values: * - 'auto': generates "optimal" ticks based on scale size and time options. * - 'data': generates ticks from data (including labels from data {t|x|y} objects). * - 'labels': generates ticks from user given `data.labels` values ONLY. * @see https://github.com/chartjs/Chart.js/pull/4507 * @since 2.7.0 */ source: 'auto', major: { enabled: false } } }; var TimeScale = Chart.Scale.extend({ initialize: function() { if (!moment) { throw new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com'); } this.mergeTicksOptions(); Chart.Scale.prototype.initialize.call(this); }, update: function() { var me = this; var options = me.options; // DEPRECATIONS: output a message only one time per update if (options.time && options.time.format) { console.warn('options.time.format is deprecated and replaced by options.time.parser.'); } return Chart.Scale.prototype.update.apply(me, arguments); }, /** * Allows data to be referenced via 't' attribute */ getRightValue: function(rawValue) { if (rawValue && rawValue.t !== undefined) { rawValue = rawValue.t; } return Chart.Scale.prototype.getRightValue.call(this, rawValue); }, determineDataLimits: function() { var me = this; var chart = me.chart; var timeOpts = me.options.time; var min = MAX_INTEGER; var max = MIN_INTEGER; var timestamps = []; var datasets = []; var labels = []; var i, j, ilen, jlen, data, timestamp; // Convert labels to timestamps for (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) { labels.push(parse(chart.data.labels[i], me)); } // Convert data to timestamps for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { if (chart.isDatasetVisible(i)) { data = chart.data.datasets[i].data; // Let's consider that all data have the same format. if (helpers.isObject(data[0])) { datasets[i] = []; for (j = 0, jlen = data.length; j < jlen; ++j) { timestamp = parse(data[j], me); timestamps.push(timestamp); datasets[i][j] = timestamp; } } else { timestamps.push.apply(timestamps, labels); datasets[i] = labels.slice(0); } } else { datasets[i] = []; } } if (labels.length) { // Sort labels **after** data have been converted labels = arrayUnique(labels).sort(sorter); min = Math.min(min, labels[0]); max = Math.max(max, labels[labels.length - 1]); } if (timestamps.length) { timestamps = arrayUnique(timestamps).sort(sorter); min = Math.min(min, timestamps[0]); max = Math.max(max, timestamps[timestamps.length - 1]); } min = parse(timeOpts.min, me) || min; max = parse(timeOpts.max, me) || max; // In case there is no valid min/max, let's use today limits min = min === MAX_INTEGER ? +moment().startOf('day') : min; max = max === MIN_INTEGER ? +moment().endOf('day') + 1 : max; // Make sure that max is strictly higher than min (required by the lookup table) me.min = Math.min(min, max); me.max = Math.max(min + 1, max); // PRIVATE me._horizontal = me.isHorizontal(); me._table = []; me._timestamps = { data: timestamps, datasets: datasets, labels: labels }; }, buildTicks: function() { var me = this; var min = me.min; var max = me.max; var options = me.options; var timeOpts = options.time; var timestamps = []; var ticks = []; var i, ilen, timestamp; switch (options.ticks.source) { case 'data': timestamps = me._timestamps.data; break; case 'labels': timestamps = me._timestamps.labels; break; case 'auto': default: timestamps = generate(min, max, me.getLabelCapacity(min), options); } if (options.bounds === 'ticks' && timestamps.length) { min = timestamps[0]; max = timestamps[timestamps.length - 1]; } // Enforce limits with user min/max options min = parse(timeOpts.min, me) || min; max = parse(timeOpts.max, me) || max; // Remove ticks outside the min/max range for (i = 0, ilen = timestamps.length; i < ilen; ++i) { timestamp = timestamps[i]; if (timestamp >= min && timestamp <= max) { ticks.push(timestamp); } } me.min = min; me.max = max; // PRIVATE me._unit = timeOpts.unit || determineUnitForFormatting(ticks, timeOpts.minUnit, me.min, me.max); me._majorUnit = determineMajorUnit(me._unit); me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); me._offsets = computeOffsets(me._table, ticks, min, max, options); return ticksFromTimestamps(ticks, me._majorUnit); }, getLabelForIndex: function(index, datasetIndex) { var me = this; var data = me.chart.data; var timeOpts = me.options.time; var label = data.labels && index < data.labels.length ? data.labels[index] : ''; var value = data.datasets[datasetIndex].data[index]; if (helpers.isObject(value)) { label = me.getRightValue(value); } if (timeOpts.tooltipFormat) { label = momentify(label, timeOpts).format(timeOpts.tooltipFormat); } return label; }, /** * Function to format an individual tick mark * @private */ tickFormatFunction: function(tick, index, ticks, formatOverride) { var me = this; var options = me.options; var time = tick.valueOf(); var formats = options.time.displayFormats; var minorFormat = formats[me._unit]; var majorUnit = me._majorUnit; var majorFormat = formats[majorUnit]; var majorTime = tick.clone().startOf(majorUnit).valueOf(); var majorTickOpts = options.ticks.major; var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; var label = tick.format(formatOverride ? formatOverride : major ? majorFormat : minorFormat); var tickOpts = major ? majorTickOpts : options.ticks.minor; var formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback); return formatter ? formatter(label, index, ticks) : label; }, convertTicksToLabels: function(ticks) { var labels = []; var i, ilen; for (i = 0, ilen = ticks.length; i < ilen; ++i) { labels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks)); } return labels; }, /** * @private */ getPixelForOffset: function(time) { var me = this; var size = me._horizontal ? me.width : me.height; var start = me._horizontal ? me.left : me.top; var pos = interpolate(me._table, 'time', time, 'pos'); return start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right); }, getPixelForValue: function(value, index, datasetIndex) { var me = this; var time = null; if (index !== undefined && datasetIndex !== undefined) { time = me._timestamps.datasets[datasetIndex][index]; } if (time === null) { time = parse(value, me); } if (time !== null) { return me.getPixelForOffset(time); } }, getPixelForTick: function(index) { var ticks = this.getTicks(); return index >= 0 && index < ticks.length ? this.getPixelForOffset(ticks[index].value) : null; }, getValueForPixel: function(pixel) { var me = this; var size = me._horizontal ? me.width : me.height; var start = me._horizontal ? me.left : me.top; var pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right; var time = interpolate(me._table, 'pos', pos, 'time'); return moment(time); }, /** * Crude approximation of what the label width might be * @private */ getLabelWidth: function(label) { var me = this; var ticksOpts = me.options.ticks; var tickLabelWidth = me.ctx.measureText(label).width; var angle = helpers.toRadians(ticksOpts.maxRotation); var cosRotation = Math.cos(angle); var sinRotation = Math.sin(angle); var tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize); return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); }, /** * @private */ getLabelCapacity: function(exampleTime) { var me = this; var formatOverride = me.options.time.displayFormats.millisecond; // Pick the longest format for guestimation var exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, [], formatOverride); var tickLabelWidth = me.getLabelWidth(exampleLabel); var innerWidth = me.isHorizontal() ? me.width : me.height; return Math.floor(innerWidth / tickLabelWidth); } }); Chart.scaleService.registerScaleType('time', TimeScale, defaultConfig); }; },{"1":1,"25":25,"45":45}]},{},[7])(7) });PKL\=youtube-embed-plus/scripts/chartjs/chartjs-plugin-deferred.jsnu[/* * @license * chartjs-plugin-deferred * http://chartjs.org/ * Version: 1.0.0 * * Copyright 2018 Simon Brunel * Released under the MIT license * https://github.com/chartjs/chartjs-plugin-deferred/blob/master/LICENSE.md */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('chart.js')) : typeof define === 'function' && define.amd ? define(['chart.js'], factory) : (factory(global.Chart)); }(this, (function (Chart) { 'use strict'; Chart = Chart && Chart.hasOwnProperty('default') ? Chart['default'] : Chart; 'use strict'; var helpers = Chart.helpers; var STUB_KEY = '$chartjs_deferred'; var MODEL_KEY = '$deferred'; /** * Plugin based on discussion from Chart.js issue #2745. * @see https://github.com/chartjs/Chart.js/issues/2745 */ Chart.defaults.global.plugins.deferred = { xOffset: 0, yOffset: 0, delay: 0 }; function defer(fn, delay) { if (delay) { window.setTimeout(fn, delay); } else { helpers.requestAnimFrame.call(window, fn); } } function computeOffset(value, base) { var number = parseInt(value, 10); if (isNaN(number)) { return 0; } else if (typeof value === 'string' && value.indexOf('%') !== -1) { return number / 100 * base; } return number; } function chartInViewport(chart) { var options = chart[MODEL_KEY].options; var canvas = chart.chart.canvas; // http://stackoverflow.com/a/21696585 if (!canvas || canvas.offsetParent === null) { return false; } var rect = canvas.getBoundingClientRect(); var dy = computeOffset(options.yOffset || 0, rect.height); var dx = computeOffset(options.xOffset || 0, rect.width); return rect.right - dx >= 0 && rect.bottom - dy >= 0 && rect.left + dx <= window.innerWidth && rect.top + dy <= window.innerHeight; } function onScroll(event) { var node = event.target; var stub = node[STUB_KEY]; if (stub.ticking) { return; } stub.ticking = true; defer(function() { var charts = stub.charts.slice(); var ilen = charts.length; var chart, i; for (i = 0; i < ilen; ++i) { chart = charts[i]; if (chartInViewport(chart)) { unwatch(chart); // eslint-disable-line chart[MODEL_KEY].appeared = true; chart.update(); } } stub.ticking = false; }); } function isScrollable(node) { var type = node.nodeType; if (type === Node.ELEMENT_NODE) { var overflowX = helpers.getStyle(node, 'overflow-x'); var overflowY = helpers.getStyle(node, 'overflow-y'); return overflowX === 'auto' || overflowX === 'scroll' || overflowY === 'auto' || overflowY === 'scroll'; } return node.nodeType === Node.DOCUMENT_NODE; } function watch(chart) { var canvas = chart.chart.canvas; var parent = canvas.parentElement; var stub, charts; while (parent) { if (isScrollable(parent)) { stub = parent[STUB_KEY] || (parent[STUB_KEY] = {}); charts = stub.charts || (stub.charts = []); if (charts.length === 0) { parent.addEventListener('scroll', onScroll, {passive: true}); } charts.push(chart); chart[MODEL_KEY].elements.push(parent); } parent = parent.parentElement || parent.ownerDocument; } } function unwatch(chart) { chart[MODEL_KEY].elements.forEach(function(element) { var charts = element[STUB_KEY].charts; charts.splice(charts.indexOf(chart), 1); if (!charts.length) { helpers.removeEvent(element, 'scroll', onScroll); delete element[STUB_KEY]; } }); chart[MODEL_KEY].elements = []; } Chart.plugins.register({ id: 'deferred', beforeInit: function(chart, options) { chart[MODEL_KEY] = { options: options, appeared: false, delayed: false, loaded: false, elements: [] }; watch(chart); }, beforeDatasetsUpdate: function(chart, options) { var model = chart[MODEL_KEY]; if (!model.loaded) { if (!model.appeared && !chartInViewport(chart)) { // cancel the datasets update return false; } model.appeared = true; model.loaded = true; unwatch(chart); if (options.delay > 0) { model.delayed = true; defer(function() { model.delayed = false; chart.update(); }, options.delay); return false; } } if (model.delayed) { // in case of delayed update, ensure to block external requests, such // as interacting with the legend label, or direct calls to update() return false; } }, destroy: function(chart) { unwatch(chart); } }); }))); PKL\fZKK/youtube-embed-plus/scripts/chartjs/chart.min.jsnu[/*! * Chart.js * http://chartjs.org/ * Version: 2.7.1 * * Copyright 2017 Nick Downie * Released under the MIT license * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md */ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Chart = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o lum2) { return (lum1 + 0.05) / (lum2 + 0.05); } return (lum2 + 0.05) / (lum1 + 0.05); }, level: function (color2) { var contrastRatio = this.contrast(color2); if (contrastRatio >= 7.1) { return 'AAA'; } return (contrastRatio >= 4.5) ? 'AA' : ''; }, dark: function () { // YIQ equation from http://24ways.org/2010/calculating-color-contrast var rgb = this.values.rgb; var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; return yiq < 128; }, light: function () { return !this.dark(); }, negate: function () { var rgb = []; for (var i = 0; i < 3; i++) { rgb[i] = 255 - this.values.rgb[i]; } this.setValues('rgb', rgb); return this; }, lighten: function (ratio) { var hsl = this.values.hsl; hsl[2] += hsl[2] * ratio; this.setValues('hsl', hsl); return this; }, darken: function (ratio) { var hsl = this.values.hsl; hsl[2] -= hsl[2] * ratio; this.setValues('hsl', hsl); return this; }, saturate: function (ratio) { var hsl = this.values.hsl; hsl[1] += hsl[1] * ratio; this.setValues('hsl', hsl); return this; }, desaturate: function (ratio) { var hsl = this.values.hsl; hsl[1] -= hsl[1] * ratio; this.setValues('hsl', hsl); return this; }, whiten: function (ratio) { var hwb = this.values.hwb; hwb[1] += hwb[1] * ratio; this.setValues('hwb', hwb); return this; }, blacken: function (ratio) { var hwb = this.values.hwb; hwb[2] += hwb[2] * ratio; this.setValues('hwb', hwb); return this; }, greyscale: function () { var rgb = this.values.rgb; // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; this.setValues('rgb', [val, val, val]); return this; }, clearer: function (ratio) { var alpha = this.values.alpha; this.setValues('alpha', alpha - (alpha * ratio)); return this; }, opaquer: function (ratio) { var alpha = this.values.alpha; this.setValues('alpha', alpha + (alpha * ratio)); return this; }, rotate: function (degrees) { var hsl = this.values.hsl; var hue = (hsl[0] + degrees) % 360; hsl[0] = hue < 0 ? 360 + hue : hue; this.setValues('hsl', hsl); return this; }, /** * Ported from sass implementation in C * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 */ mix: function (mixinColor, weight) { var color1 = this; var color2 = mixinColor; var p = weight === undefined ? 0.5 : weight; var w = 2 * p - 1; var a = color1.alpha() - color2.alpha(); var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; var w2 = 1 - w1; return this .rgb( w1 * color1.red() + w2 * color2.red(), w1 * color1.green() + w2 * color2.green(), w1 * color1.blue() + w2 * color2.blue() ) .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); }, toJSON: function () { return this.rgb(); }, clone: function () { // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, // making the final build way to big to embed in Chart.js. So let's do it manually, // assuming that values to clone are 1 dimension arrays containing only numbers, // except 'alpha' which is a number. var result = new Color(); var source = this.values; var target = result.values; var value, type; for (var prop in source) { if (source.hasOwnProperty(prop)) { value = source[prop]; type = ({}).toString.call(value); if (type === '[object Array]') { target[prop] = value.slice(0); } else if (type === '[object Number]') { target[prop] = value; } else { console.error('unexpected color value:', value); } } } return result; } }; Color.prototype.spaces = { rgb: ['red', 'green', 'blue'], hsl: ['hue', 'saturation', 'lightness'], hsv: ['hue', 'saturation', 'value'], hwb: ['hue', 'whiteness', 'blackness'], cmyk: ['cyan', 'magenta', 'yellow', 'black'] }; Color.prototype.maxes = { rgb: [255, 255, 255], hsl: [360, 100, 100], hsv: [360, 100, 100], hwb: [360, 100, 100], cmyk: [100, 100, 100, 100] }; Color.prototype.getValues = function (space) { var values = this.values; var vals = {}; for (var i = 0; i < space.length; i++) { vals[space.charAt(i)] = values[space][i]; } if (values.alpha !== 1) { vals.a = values.alpha; } // {r: 255, g: 255, b: 255, a: 0.4} return vals; }; Color.prototype.setValues = function (space, vals) { var values = this.values; var spaces = this.spaces; var maxes = this.maxes; var alpha = 1; var i; this.valid = true; if (space === 'alpha') { alpha = vals; } else if (vals.length) { // [10, 10, 10] values[space] = vals.slice(0, space.length); alpha = vals[space.length]; } else if (vals[space.charAt(0)] !== undefined) { // {r: 10, g: 10, b: 10} for (i = 0; i < space.length; i++) { values[space][i] = vals[space.charAt(i)]; } alpha = vals.a; } else if (vals[spaces[space][0]] !== undefined) { // {red: 10, green: 10, blue: 10} var chans = spaces[space]; for (i = 0; i < space.length; i++) { values[space][i] = vals[chans[i]]; } alpha = vals.alpha; } values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); if (space === 'alpha') { return false; } var capped; // cap values of the space prior converting all values for (i = 0; i < space.length; i++) { capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); values[space][i] = Math.round(capped); } // convert to all the other color spaces for (var sname in spaces) { if (sname !== space) { values[sname] = convert[space][sname](values[space]); } } return true; }; Color.prototype.setSpace = function (space, args) { var vals = args[0]; if (vals === undefined) { // color.rgb() return this.getValues(space); } // color.rgb(10, 10, 10) if (typeof vals === 'number') { vals = Array.prototype.slice.call(args); } this.setValues(space, vals); return this; }; Color.prototype.setChannel = function (space, index, val) { var svalues = this.values[space]; if (val === undefined) { // color.red() return svalues[index]; } else if (val === svalues[index]) { // color.red(color.red()) return this; } // color.red(100) svalues[index] = val; this.setValues(space, svalues); return this; }; //if (typeof window !== 'undefined') { // window.Color = Color; //} if (typeof window !== 'undefined') { window.Chart = window.Chart || {}; window.Chart.Color = Color; if (typeof window.Color === 'undefined') { // maintain backward compatibility ONLY if no other Color lib has been defined window.Color = Color; } } module.exports = Color; },{"2":2,"5":5}],4:[function(require,module,exports){ /* MIT license */ module.exports = { rgb2hsl: rgb2hsl, rgb2hsv: rgb2hsv, rgb2hwb: rgb2hwb, rgb2cmyk: rgb2cmyk, rgb2keyword: rgb2keyword, rgb2xyz: rgb2xyz, rgb2lab: rgb2lab, rgb2lch: rgb2lch, hsl2rgb: hsl2rgb, hsl2hsv: hsl2hsv, hsl2hwb: hsl2hwb, hsl2cmyk: hsl2cmyk, hsl2keyword: hsl2keyword, hsv2rgb: hsv2rgb, hsv2hsl: hsv2hsl, hsv2hwb: hsv2hwb, hsv2cmyk: hsv2cmyk, hsv2keyword: hsv2keyword, hwb2rgb: hwb2rgb, hwb2hsl: hwb2hsl, hwb2hsv: hwb2hsv, hwb2cmyk: hwb2cmyk, hwb2keyword: hwb2keyword, cmyk2rgb: cmyk2rgb, cmyk2hsl: cmyk2hsl, cmyk2hsv: cmyk2hsv, cmyk2hwb: cmyk2hwb, cmyk2keyword: cmyk2keyword, keyword2rgb: keyword2rgb, keyword2hsl: keyword2hsl, keyword2hsv: keyword2hsv, keyword2hwb: keyword2hwb, keyword2cmyk: keyword2cmyk, keyword2lab: keyword2lab, keyword2xyz: keyword2xyz, xyz2rgb: xyz2rgb, xyz2lab: xyz2lab, xyz2lch: xyz2lch, lab2xyz: lab2xyz, lab2rgb: lab2rgb, lab2lch: lab2lch, lch2lab: lch2lab, lch2xyz: lch2xyz, lch2rgb: lch2rgb } function rgb2hsl(rgb) { var r = rgb[0]/255, g = rgb[1]/255, b = rgb[2]/255, min = Math.min(r, g, b), max = Math.max(r, g, b), delta = max - min, h, s, l; if (max == min) h = 0; else if (r == max) h = (g - b) / delta; else if (g == max) h = 2 + (b - r) / delta; else if (b == max) h = 4 + (r - g)/ delta; h = Math.min(h * 60, 360); if (h < 0) h += 360; l = (min + max) / 2; if (max == min) s = 0; else if (l <= 0.5) s = delta / (max + min); else s = delta / (2 - max - min); return [h, s * 100, l * 100]; } function rgb2hsv(rgb) { var r = rgb[0], g = rgb[1], b = rgb[2], min = Math.min(r, g, b), max = Math.max(r, g, b), delta = max - min, h, s, v; if (max == 0) s = 0; else s = (delta/max * 1000)/10; if (max == min) h = 0; else if (r == max) h = (g - b) / delta; else if (g == max) h = 2 + (b - r) / delta; else if (b == max) h = 4 + (r - g) / delta; h = Math.min(h * 60, 360); if (h < 0) h += 360; v = ((max / 255) * 1000) / 10; return [h, s, v]; } function rgb2hwb(rgb) { var r = rgb[0], g = rgb[1], b = rgb[2], h = rgb2hsl(rgb)[0], w = 1/255 * Math.min(r, Math.min(g, b)), b = 1 - 1/255 * Math.max(r, Math.max(g, b)); return [h, w * 100, b * 100]; } function rgb2cmyk(rgb) { var r = rgb[0] / 255, g = rgb[1] / 255, b = rgb[2] / 255, c, m, y, k; k = Math.min(1 - r, 1 - g, 1 - b); c = (1 - r - k) / (1 - k) || 0; m = (1 - g - k) / (1 - k) || 0; y = (1 - b - k) / (1 - k) || 0; return [c * 100, m * 100, y * 100, k * 100]; } function rgb2keyword(rgb) { return reverseKeywords[JSON.stringify(rgb)]; } function rgb2xyz(rgb) { var r = rgb[0] / 255, g = rgb[1] / 255, b = rgb[2] / 255; // assume sRGB r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); return [x * 100, y *100, z * 100]; } function rgb2lab(rgb) { var xyz = rgb2xyz(rgb), x = xyz[0], y = xyz[1], z = xyz[2], l, a, b; x /= 95.047; y /= 100; z /= 108.883; x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); l = (116 * y) - 16; a = 500 * (x - y); b = 200 * (y - z); return [l, a, b]; } function rgb2lch(args) { return lab2lch(rgb2lab(args)); } function hsl2rgb(hsl) { var h = hsl[0] / 360, s = hsl[1] / 100, l = hsl[2] / 100, t1, t2, t3, rgb, val; if (s == 0) { val = l * 255; return [val, val, val]; } if (l < 0.5) t2 = l * (1 + s); else t2 = l + s - l * s; t1 = 2 * l - t2; rgb = [0, 0, 0]; for (var i = 0; i < 3; i++) { t3 = h + 1 / 3 * - (i - 1); t3 < 0 && t3++; t3 > 1 && t3--; if (6 * t3 < 1) val = t1 + (t2 - t1) * 6 * t3; else if (2 * t3 < 1) val = t2; else if (3 * t3 < 2) val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; else val = t1; rgb[i] = val * 255; } return rgb; } function hsl2hsv(hsl) { var h = hsl[0], s = hsl[1] / 100, l = hsl[2] / 100, sv, v; if(l === 0) { // no need to do calc on black // also avoids divide by 0 error return [0, 0, 0]; } l *= 2; s *= (l <= 1) ? l : 2 - l; v = (l + s) / 2; sv = (2 * s) / (l + s); return [h, sv * 100, v * 100]; } function hsl2hwb(args) { return rgb2hwb(hsl2rgb(args)); } function hsl2cmyk(args) { return rgb2cmyk(hsl2rgb(args)); } function hsl2keyword(args) { return rgb2keyword(hsl2rgb(args)); } function hsv2rgb(hsv) { var h = hsv[0] / 60, s = hsv[1] / 100, v = hsv[2] / 100, hi = Math.floor(h) % 6; var f = h - Math.floor(h), p = 255 * v * (1 - s), q = 255 * v * (1 - (s * f)), t = 255 * v * (1 - (s * (1 - f))), v = 255 * v; switch(hi) { case 0: return [v, t, p]; case 1: return [q, v, p]; case 2: return [p, v, t]; case 3: return [p, q, v]; case 4: return [t, p, v]; case 5: return [v, p, q]; } } function hsv2hsl(hsv) { var h = hsv[0], s = hsv[1] / 100, v = hsv[2] / 100, sl, l; l = (2 - s) * v; sl = s * v; sl /= (l <= 1) ? l : 2 - l; sl = sl || 0; l /= 2; return [h, sl * 100, l * 100]; } function hsv2hwb(args) { return rgb2hwb(hsv2rgb(args)) } function hsv2cmyk(args) { return rgb2cmyk(hsv2rgb(args)); } function hsv2keyword(args) { return rgb2keyword(hsv2rgb(args)); } // http://dev.w3.org/csswg/css-color/#hwb-to-rgb function hwb2rgb(hwb) { var h = hwb[0] / 360, wh = hwb[1] / 100, bl = hwb[2] / 100, ratio = wh + bl, i, v, f, n; // wh + bl cant be > 1 if (ratio > 1) { wh /= ratio; bl /= ratio; } i = Math.floor(6 * h); v = 1 - bl; f = 6 * h - i; if ((i & 0x01) != 0) { f = 1 - f; } n = wh + f * (v - wh); // linear interpolation switch (i) { default: case 6: case 0: r = v; g = n; b = wh; break; case 1: r = n; g = v; b = wh; break; case 2: r = wh; g = v; b = n; break; case 3: r = wh; g = n; b = v; break; case 4: r = n; g = wh; b = v; break; case 5: r = v; g = wh; b = n; break; } return [r * 255, g * 255, b * 255]; } function hwb2hsl(args) { return rgb2hsl(hwb2rgb(args)); } function hwb2hsv(args) { return rgb2hsv(hwb2rgb(args)); } function hwb2cmyk(args) { return rgb2cmyk(hwb2rgb(args)); } function hwb2keyword(args) { return rgb2keyword(hwb2rgb(args)); } function cmyk2rgb(cmyk) { var c = cmyk[0] / 100, m = cmyk[1] / 100, y = cmyk[2] / 100, k = cmyk[3] / 100, r, g, b; r = 1 - Math.min(1, c * (1 - k) + k); g = 1 - Math.min(1, m * (1 - k) + k); b = 1 - Math.min(1, y * (1 - k) + k); return [r * 255, g * 255, b * 255]; } function cmyk2hsl(args) { return rgb2hsl(cmyk2rgb(args)); } function cmyk2hsv(args) { return rgb2hsv(cmyk2rgb(args)); } function cmyk2hwb(args) { return rgb2hwb(cmyk2rgb(args)); } function cmyk2keyword(args) { return rgb2keyword(cmyk2rgb(args)); } function xyz2rgb(xyz) { var x = xyz[0] / 100, y = xyz[1] / 100, z = xyz[2] / 100, r, g, b; r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); // assume sRGB r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) : r = (r * 12.92); g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) : g = (g * 12.92); b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) : b = (b * 12.92); r = Math.min(Math.max(0, r), 1); g = Math.min(Math.max(0, g), 1); b = Math.min(Math.max(0, b), 1); return [r * 255, g * 255, b * 255]; } function xyz2lab(xyz) { var x = xyz[0], y = xyz[1], z = xyz[2], l, a, b; x /= 95.047; y /= 100; z /= 108.883; x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); l = (116 * y) - 16; a = 500 * (x - y); b = 200 * (y - z); return [l, a, b]; } function xyz2lch(args) { return lab2lch(xyz2lab(args)); } function lab2xyz(lab) { var l = lab[0], a = lab[1], b = lab[2], x, y, z, y2; if (l <= 8) { y = (l * 100) / 903.3; y2 = (7.787 * (y / 100)) + (16 / 116); } else { y = 100 * Math.pow((l + 16) / 116, 3); y2 = Math.pow(y / 100, 1/3); } x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); return [x, y, z]; } function lab2lch(lab) { var l = lab[0], a = lab[1], b = lab[2], hr, h, c; hr = Math.atan2(b, a); h = hr * 360 / 2 / Math.PI; if (h < 0) { h += 360; } c = Math.sqrt(a * a + b * b); return [l, c, h]; } function lab2rgb(args) { return xyz2rgb(lab2xyz(args)); } function lch2lab(lch) { var l = lch[0], c = lch[1], h = lch[2], a, b, hr; hr = h / 360 * 2 * Math.PI; a = c * Math.cos(hr); b = c * Math.sin(hr); return [l, a, b]; } function lch2xyz(args) { return lab2xyz(lch2lab(args)); } function lch2rgb(args) { return lab2rgb(lch2lab(args)); } function keyword2rgb(keyword) { return cssKeywords[keyword]; } function keyword2hsl(args) { return rgb2hsl(keyword2rgb(args)); } function keyword2hsv(args) { return rgb2hsv(keyword2rgb(args)); } function keyword2hwb(args) { return rgb2hwb(keyword2rgb(args)); } function keyword2cmyk(args) { return rgb2cmyk(keyword2rgb(args)); } function keyword2lab(args) { return rgb2lab(keyword2rgb(args)); } function keyword2xyz(args) { return rgb2xyz(keyword2rgb(args)); } var cssKeywords = { aliceblue: [240,248,255], antiquewhite: [250,235,215], aqua: [0,255,255], aquamarine: [127,255,212], azure: [240,255,255], beige: [245,245,220], bisque: [255,228,196], black: [0,0,0], blanchedalmond: [255,235,205], blue: [0,0,255], blueviolet: [138,43,226], brown: [165,42,42], burlywood: [222,184,135], cadetblue: [95,158,160], chartreuse: [127,255,0], chocolate: [210,105,30], coral: [255,127,80], cornflowerblue: [100,149,237], cornsilk: [255,248,220], crimson: [220,20,60], cyan: [0,255,255], darkblue: [0,0,139], darkcyan: [0,139,139], darkgoldenrod: [184,134,11], darkgray: [169,169,169], darkgreen: [0,100,0], darkgrey: [169,169,169], darkkhaki: [189,183,107], darkmagenta: [139,0,139], darkolivegreen: [85,107,47], darkorange: [255,140,0], darkorchid: [153,50,204], darkred: [139,0,0], darksalmon: [233,150,122], darkseagreen: [143,188,143], darkslateblue: [72,61,139], darkslategray: [47,79,79], darkslategrey: [47,79,79], darkturquoise: [0,206,209], darkviolet: [148,0,211], deeppink: [255,20,147], deepskyblue: [0,191,255], dimgray: [105,105,105], dimgrey: [105,105,105], dodgerblue: [30,144,255], firebrick: [178,34,34], floralwhite: [255,250,240], forestgreen: [34,139,34], fuchsia: [255,0,255], gainsboro: [220,220,220], ghostwhite: [248,248,255], gold: [255,215,0], goldenrod: [218,165,32], gray: [128,128,128], green: [0,128,0], greenyellow: [173,255,47], grey: [128,128,128], honeydew: [240,255,240], hotpink: [255,105,180], indianred: [205,92,92], indigo: [75,0,130], ivory: [255,255,240], khaki: [240,230,140], lavender: [230,230,250], lavenderblush: [255,240,245], lawngreen: [124,252,0], lemonchiffon: [255,250,205], lightblue: [173,216,230], lightcoral: [240,128,128], lightcyan: [224,255,255], lightgoldenrodyellow: [250,250,210], lightgray: [211,211,211], lightgreen: [144,238,144], lightgrey: [211,211,211], lightpink: [255,182,193], lightsalmon: [255,160,122], lightseagreen: [32,178,170], lightskyblue: [135,206,250], lightslategray: [119,136,153], lightslategrey: [119,136,153], lightsteelblue: [176,196,222], lightyellow: [255,255,224], lime: [0,255,0], limegreen: [50,205,50], linen: [250,240,230], magenta: [255,0,255], maroon: [128,0,0], mediumaquamarine: [102,205,170], mediumblue: [0,0,205], mediumorchid: [186,85,211], mediumpurple: [147,112,219], mediumseagreen: [60,179,113], mediumslateblue: [123,104,238], mediumspringgreen: [0,250,154], mediumturquoise: [72,209,204], mediumvioletred: [199,21,133], midnightblue: [25,25,112], mintcream: [245,255,250], mistyrose: [255,228,225], moccasin: [255,228,181], navajowhite: [255,222,173], navy: [0,0,128], oldlace: [253,245,230], olive: [128,128,0], olivedrab: [107,142,35], orange: [255,165,0], orangered: [255,69,0], orchid: [218,112,214], palegoldenrod: [238,232,170], palegreen: [152,251,152], paleturquoise: [175,238,238], palevioletred: [219,112,147], papayawhip: [255,239,213], peachpuff: [255,218,185], peru: [205,133,63], pink: [255,192,203], plum: [221,160,221], powderblue: [176,224,230], purple: [128,0,128], rebeccapurple: [102, 51, 153], red: [255,0,0], rosybrown: [188,143,143], royalblue: [65,105,225], saddlebrown: [139,69,19], salmon: [250,128,114], sandybrown: [244,164,96], seagreen: [46,139,87], seashell: [255,245,238], sienna: [160,82,45], silver: [192,192,192], skyblue: [135,206,235], slateblue: [106,90,205], slategray: [112,128,144], slategrey: [112,128,144], snow: [255,250,250], springgreen: [0,255,127], steelblue: [70,130,180], tan: [210,180,140], teal: [0,128,128], thistle: [216,191,216], tomato: [255,99,71], turquoise: [64,224,208], violet: [238,130,238], wheat: [245,222,179], white: [255,255,255], whitesmoke: [245,245,245], yellow: [255,255,0], yellowgreen: [154,205,50] }; var reverseKeywords = {}; for (var key in cssKeywords) { reverseKeywords[JSON.stringify(cssKeywords[key])] = key; } },{}],5:[function(require,module,exports){ var conversions = require(4); var convert = function() { return new Converter(); } for (var func in conversions) { // export Raw versions convert[func + "Raw"] = (function(func) { // accept array or plain args return function(arg) { if (typeof arg == "number") arg = Array.prototype.slice.call(arguments); return conversions[func](arg); } })(func); var pair = /(\w+)2(\w+)/.exec(func), from = pair[1], to = pair[2]; // export rgb2hsl and ["rgb"]["hsl"] convert[from] = convert[from] || {}; convert[from][to] = convert[func] = (function(func) { return function(arg) { if (typeof arg == "number") arg = Array.prototype.slice.call(arguments); var val = conversions[func](arg); if (typeof val == "string" || val === undefined) return val; // keyword for (var i = 0; i < val.length; i++) val[i] = Math.round(val[i]); return val; } })(func); } /* Converter does lazy conversion and caching */ var Converter = function() { this.convs = {}; }; /* Either get the values for a space or set the values for a space, depending on args */ Converter.prototype.routeSpace = function(space, args) { var values = args[0]; if (values === undefined) { // color.rgb() return this.getValues(space); } // color.rgb(10, 10, 10) if (typeof values == "number") { values = Array.prototype.slice.call(args); } return this.setValues(space, values); }; /* Set the values for a space, invalidating cache */ Converter.prototype.setValues = function(space, values) { this.space = space; this.convs = {}; this.convs[space] = values; return this; }; /* Get the values for a space. If there's already a conversion for the space, fetch it, otherwise compute it */ Converter.prototype.getValues = function(space) { var vals = this.convs[space]; if (!vals) { var fspace = this.space, from = this.convs[fspace]; vals = convert[fspace][space](from); this.convs[space] = vals; } return vals; }; ["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { Converter.prototype[space] = function(vals) { return this.routeSpace(space, arguments); } }); module.exports = convert; },{"4":4}],6:[function(require,module,exports){ 'use strict' module.exports = { "aliceblue": [240, 248, 255], "antiquewhite": [250, 235, 215], "aqua": [0, 255, 255], "aquamarine": [127, 255, 212], "azure": [240, 255, 255], "beige": [245, 245, 220], "bisque": [255, 228, 196], "black": [0, 0, 0], "blanchedalmond": [255, 235, 205], "blue": [0, 0, 255], "blueviolet": [138, 43, 226], "brown": [165, 42, 42], "burlywood": [222, 184, 135], "cadetblue": [95, 158, 160], "chartreuse": [127, 255, 0], "chocolate": [210, 105, 30], "coral": [255, 127, 80], "cornflowerblue": [100, 149, 237], "cornsilk": [255, 248, 220], "crimson": [220, 20, 60], "cyan": [0, 255, 255], "darkblue": [0, 0, 139], "darkcyan": [0, 139, 139], "darkgoldenrod": [184, 134, 11], "darkgray": [169, 169, 169], "darkgreen": [0, 100, 0], "darkgrey": [169, 169, 169], "darkkhaki": [189, 183, 107], "darkmagenta": [139, 0, 139], "darkolivegreen": [85, 107, 47], "darkorange": [255, 140, 0], "darkorchid": [153, 50, 204], "darkred": [139, 0, 0], "darksalmon": [233, 150, 122], "darkseagreen": [143, 188, 143], "darkslateblue": [72, 61, 139], "darkslategray": [47, 79, 79], "darkslategrey": [47, 79, 79], "darkturquoise": [0, 206, 209], "darkviolet": [148, 0, 211], "deeppink": [255, 20, 147], "deepskyblue": [0, 191, 255], "dimgray": [105, 105, 105], "dimgrey": [105, 105, 105], "dodgerblue": [30, 144, 255], "firebrick": [178, 34, 34], "floralwhite": [255, 250, 240], "forestgreen": [34, 139, 34], "fuchsia": [255, 0, 255], "gainsboro": [220, 220, 220], "ghostwhite": [248, 248, 255], "gold": [255, 215, 0], "goldenrod": [218, 165, 32], "gray": [128, 128, 128], "green": [0, 128, 0], "greenyellow": [173, 255, 47], "grey": [128, 128, 128], "honeydew": [240, 255, 240], "hotpink": [255, 105, 180], "indianred": [205, 92, 92], "indigo": [75, 0, 130], "ivory": [255, 255, 240], "khaki": [240, 230, 140], "lavender": [230, 230, 250], "lavenderblush": [255, 240, 245], "lawngreen": [124, 252, 0], "lemonchiffon": [255, 250, 205], "lightblue": [173, 216, 230], "lightcoral": [240, 128, 128], "lightcyan": [224, 255, 255], "lightgoldenrodyellow": [250, 250, 210], "lightgray": [211, 211, 211], "lightgreen": [144, 238, 144], "lightgrey": [211, 211, 211], "lightpink": [255, 182, 193], "lightsalmon": [255, 160, 122], "lightseagreen": [32, 178, 170], "lightskyblue": [135, 206, 250], "lightslategray": [119, 136, 153], "lightslategrey": [119, 136, 153], "lightsteelblue": [176, 196, 222], "lightyellow": [255, 255, 224], "lime": [0, 255, 0], "limegreen": [50, 205, 50], "linen": [250, 240, 230], "magenta": [255, 0, 255], "maroon": [128, 0, 0], "mediumaquamarine": [102, 205, 170], "mediumblue": [0, 0, 205], "mediumorchid": [186, 85, 211], "mediumpurple": [147, 112, 219], "mediumseagreen": [60, 179, 113], "mediumslateblue": [123, 104, 238], "mediumspringgreen": [0, 250, 154], "mediumturquoise": [72, 209, 204], "mediumvioletred": [199, 21, 133], "midnightblue": [25, 25, 112], "mintcream": [245, 255, 250], "mistyrose": [255, 228, 225], "moccasin": [255, 228, 181], "navajowhite": [255, 222, 173], "navy": [0, 0, 128], "oldlace": [253, 245, 230], "olive": [128, 128, 0], "olivedrab": [107, 142, 35], "orange": [255, 165, 0], "orangered": [255, 69, 0], "orchid": [218, 112, 214], "palegoldenrod": [238, 232, 170], "palegreen": [152, 251, 152], "paleturquoise": [175, 238, 238], "palevioletred": [219, 112, 147], "papayawhip": [255, 239, 213], "peachpuff": [255, 218, 185], "peru": [205, 133, 63], "pink": [255, 192, 203], "plum": [221, 160, 221], "powderblue": [176, 224, 230], "purple": [128, 0, 128], "rebeccapurple": [102, 51, 153], "red": [255, 0, 0], "rosybrown": [188, 143, 143], "royalblue": [65, 105, 225], "saddlebrown": [139, 69, 19], "salmon": [250, 128, 114], "sandybrown": [244, 164, 96], "seagreen": [46, 139, 87], "seashell": [255, 245, 238], "sienna": [160, 82, 45], "silver": [192, 192, 192], "skyblue": [135, 206, 235], "slateblue": [106, 90, 205], "slategray": [112, 128, 144], "slategrey": [112, 128, 144], "snow": [255, 250, 250], "springgreen": [0, 255, 127], "steelblue": [70, 130, 180], "tan": [210, 180, 140], "teal": [0, 128, 128], "thistle": [216, 191, 216], "tomato": [255, 99, 71], "turquoise": [64, 224, 208], "violet": [238, 130, 238], "wheat": [245, 222, 179], "white": [255, 255, 255], "whitesmoke": [245, 245, 245], "yellow": [255, 255, 0], "yellowgreen": [154, 205, 50] }; },{}],7:[function(require,module,exports){ /** * @namespace Chart */ var Chart = require(29)(); Chart.helpers = require(45); // @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! require(27)(Chart); Chart.defaults = require(25); Chart.Element = require(26); Chart.elements = require(40); Chart.Interaction = require(28); Chart.platform = require(48); require(31)(Chart); require(22)(Chart); require(23)(Chart); require(24)(Chart); require(30)(Chart); require(33)(Chart); require(32)(Chart); require(35)(Chart); require(54)(Chart); require(52)(Chart); require(53)(Chart); require(55)(Chart); require(56)(Chart); require(57)(Chart); // Controllers must be loaded after elements // See Chart.core.datasetController.dataElementType require(15)(Chart); require(16)(Chart); require(17)(Chart); require(18)(Chart); require(19)(Chart); require(20)(Chart); require(21)(Chart); require(8)(Chart); require(9)(Chart); require(10)(Chart); require(11)(Chart); require(12)(Chart); require(13)(Chart); require(14)(Chart); // Loading built-it plugins var plugins = []; plugins.push( require(49)(Chart), require(50)(Chart), require(51)(Chart) ); Chart.plugins.register(plugins); Chart.platform.initialize(); module.exports = Chart; if (typeof window !== 'undefined') { window.Chart = Chart; } // DEPRECATIONS /** * Provided for backward compatibility, use Chart.helpers.canvas instead. * @namespace Chart.canvasHelpers * @deprecated since version 2.6.0 * @todo remove at version 3 * @private */ Chart.canvasHelpers = Chart.helpers.canvas; },{"10":10,"11":11,"12":12,"13":13,"14":14,"15":15,"16":16,"17":17,"18":18,"19":19,"20":20,"21":21,"22":22,"23":23,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29,"30":30,"31":31,"32":32,"33":33,"35":35,"40":40,"45":45,"48":48,"49":49,"50":50,"51":51,"52":52,"53":53,"54":54,"55":55,"56":56,"57":57,"8":8,"9":9}],8:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.Bar = function(context, config) { config.type = 'bar'; return new Chart(context, config); }; }; },{}],9:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.Bubble = function(context, config) { config.type = 'bubble'; return new Chart(context, config); }; }; },{}],10:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.Doughnut = function(context, config) { config.type = 'doughnut'; return new Chart(context, config); }; }; },{}],11:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.Line = function(context, config) { config.type = 'line'; return new Chart(context, config); }; }; },{}],12:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.PolarArea = function(context, config) { config.type = 'polarArea'; return new Chart(context, config); }; }; },{}],13:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.Radar = function(context, config) { config.type = 'radar'; return new Chart(context, config); }; }; },{}],14:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { Chart.Scatter = function(context, config) { config.type = 'scatter'; return new Chart(context, config); }; }; },{}],15:[function(require,module,exports){ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('bar', { hover: { mode: 'label' }, scales: { xAxes: [{ type: 'category', // Specific to Bar Controller categoryPercentage: 0.8, barPercentage: 0.9, // offset settings offset: true, // grid line settings gridLines: { offsetGridLines: true } }], yAxes: [{ type: 'linear' }] } }); defaults._set('horizontalBar', { hover: { mode: 'index', axis: 'y' }, scales: { xAxes: [{ type: 'linear', position: 'bottom' }], yAxes: [{ position: 'left', type: 'category', // Specific to Horizontal Bar Controller categoryPercentage: 0.8, barPercentage: 0.9, // offset settings offset: true, // grid line settings gridLines: { offsetGridLines: true } }] }, elements: { rectangle: { borderSkipped: 'left' } }, tooltips: { callbacks: { title: function(item, data) { // Pick first xLabel for now var title = ''; if (item.length > 0) { if (item[0].yLabel) { title = item[0].yLabel; } else if (data.labels.length > 0 && item[0].index < data.labels.length) { title = data.labels[item[0].index]; } } return title; }, label: function(item, data) { var datasetLabel = data.datasets[item.datasetIndex].label || ''; return datasetLabel + ': ' + item.xLabel; } }, mode: 'index', axis: 'y' } }); module.exports = function(Chart) { Chart.controllers.bar = Chart.DatasetController.extend({ dataElementType: elements.Rectangle, initialize: function() { var me = this; var meta; Chart.DatasetController.prototype.initialize.apply(me, arguments); meta = me.getMeta(); meta.stack = me.getDataset().stack; meta.bar = true; }, update: function(reset) { var me = this; var rects = me.getMeta().data; var i, ilen; me._ruler = me.getRuler(); for (i = 0, ilen = rects.length; i < ilen; ++i) { me.updateElement(rects[i], i, reset); } }, updateElement: function(rectangle, index, reset) { var me = this; var chart = me.chart; var meta = me.getMeta(); var dataset = me.getDataset(); var custom = rectangle.custom || {}; var rectangleOptions = chart.options.elements.rectangle; rectangle._xScale = me.getScaleForId(meta.xAxisID); rectangle._yScale = me.getScaleForId(meta.yAxisID); rectangle._datasetIndex = me.index; rectangle._index = index; rectangle._model = { datasetLabel: dataset.label, label: chart.data.labels[index], borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped, backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor), borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor), borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth) }; me.updateElementGeometry(rectangle, index, reset); rectangle.pivot(); }, /** * @private */ updateElementGeometry: function(rectangle, index, reset) { var me = this; var model = rectangle._model; var vscale = me.getValueScale(); var base = vscale.getBasePixel(); var horizontal = vscale.isHorizontal(); var ruler = me._ruler || me.getRuler(); var vpixels = me.calculateBarValuePixels(me.index, index); var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); model.horizontal = horizontal; model.base = reset ? base : vpixels.base; model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; model.height = horizontal ? ipixels.size : undefined; model.width = horizontal ? undefined : ipixels.size; }, /** * @private */ getValueScaleId: function() { return this.getMeta().yAxisID; }, /** * @private */ getIndexScaleId: function() { return this.getMeta().xAxisID; }, /** * @private */ getValueScale: function() { return this.getScaleForId(this.getValueScaleId()); }, /** * @private */ getIndexScale: function() { return this.getScaleForId(this.getIndexScaleId()); }, /** * Returns the effective number of stacks based on groups and bar visibility. * @private */ getStackCount: function(last) { var me = this; var chart = me.chart; var scale = me.getIndexScale(); var stacked = scale.options.stacked; var ilen = last === undefined ? chart.data.datasets.length : last + 1; var stacks = []; var i, meta; for (i = 0; i < ilen; ++i) { meta = chart.getDatasetMeta(i); if (meta.bar && chart.isDatasetVisible(i) && (stacked === false || (stacked === true && stacks.indexOf(meta.stack) === -1) || (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { stacks.push(meta.stack); } } return stacks.length; }, /** * Returns the stack index for the given dataset based on groups and bar visibility. * @private */ getStackIndex: function(datasetIndex) { return this.getStackCount(datasetIndex) - 1; }, /** * @private */ getRuler: function() { var me = this; var scale = me.getIndexScale(); var stackCount = me.getStackCount(); var datasetIndex = me.index; var pixels = []; var isHorizontal = scale.isHorizontal(); var start = isHorizontal ? scale.left : scale.top; var end = start + (isHorizontal ? scale.width : scale.height); var i, ilen; for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { pixels.push(scale.getPixelForValue(null, i, datasetIndex)); } return { pixels: pixels, start: start, end: end, stackCount: stackCount, scale: scale }; }, /** * Note: pixel values are not clamped to the scale area. * @private */ calculateBarValuePixels: function(datasetIndex, index) { var me = this; var chart = me.chart; var meta = me.getMeta(); var scale = me.getValueScale(); var datasets = chart.data.datasets; var value = scale.getRightValue(datasets[datasetIndex].data[index]); var stacked = scale.options.stacked; var stack = meta.stack; var start = 0; var i, imeta, ivalue, base, head, size; if (stacked || (stacked === undefined && stack !== undefined)) { for (i = 0; i < datasetIndex; ++i) { imeta = chart.getDatasetMeta(i); if (imeta.bar && imeta.stack === stack && imeta.controller.getValueScaleId() === scale.id && chart.isDatasetVisible(i)) { ivalue = scale.getRightValue(datasets[i].data[index]); if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { start += ivalue; } } } } base = scale.getPixelForValue(start); head = scale.getPixelForValue(start + value); size = (head - base) / 2; return { size: size, base: base, head: head, center: head + size / 2 }; }, /** * @private */ calculateBarIndexPixels: function(datasetIndex, index, ruler) { var me = this; var options = ruler.scale.options; var stackIndex = me.getStackIndex(datasetIndex); var pixels = ruler.pixels; var base = pixels[index]; var length = pixels.length; var start = ruler.start; var end = ruler.end; var leftSampleSize, rightSampleSize, leftCategorySize, rightCategorySize, fullBarSize, size; if (length === 1) { leftSampleSize = base > start ? base - start : end - base; rightSampleSize = base < end ? end - base : base - start; } else { if (index > 0) { leftSampleSize = (base - pixels[index - 1]) / 2; if (index === length - 1) { rightSampleSize = leftSampleSize; } } if (index < length - 1) { rightSampleSize = (pixels[index + 1] - base) / 2; if (index === 0) { leftSampleSize = rightSampleSize; } } } leftCategorySize = leftSampleSize * options.categoryPercentage; rightCategorySize = rightSampleSize * options.categoryPercentage; fullBarSize = (leftCategorySize + rightCategorySize) / ruler.stackCount; size = fullBarSize * options.barPercentage; size = Math.min( helpers.valueOrDefault(options.barThickness, size), helpers.valueOrDefault(options.maxBarThickness, Infinity)); base -= leftCategorySize; base += fullBarSize * stackIndex; base += (fullBarSize - size) / 2; return { size: size, base: base, head: base + size, center: base + size / 2 }; }, draw: function() { var me = this; var chart = me.chart; var scale = me.getValueScale(); var rects = me.getMeta().data; var dataset = me.getDataset(); var ilen = rects.length; var i = 0; helpers.canvas.clipArea(chart.ctx, chart.chartArea); for (; i < ilen; ++i) { if (!isNaN(scale.getRightValue(dataset.data[i]))) { rects[i].draw(); } } helpers.canvas.unclipArea(chart.ctx); }, setHoverStyle: function(rectangle) { var dataset = this.chart.data.datasets[rectangle._datasetIndex]; var index = rectangle._index; var custom = rectangle.custom || {}; var model = rectangle._model; model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor)); model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); }, removeHoverStyle: function(rectangle) { var dataset = this.chart.data.datasets[rectangle._datasetIndex]; var index = rectangle._index; var custom = rectangle.custom || {}; var model = rectangle._model; var rectangleElementOptions = this.chart.options.elements.rectangle; model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor); model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor); model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth); } }); Chart.controllers.horizontalBar = Chart.controllers.bar.extend({ /** * @private */ getValueScaleId: function() { return this.getMeta().xAxisID; }, /** * @private */ getIndexScaleId: function() { return this.getMeta().yAxisID; } }); }; },{"25":25,"40":40,"45":45}],16:[function(require,module,exports){ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('bubble', { hover: { mode: 'single' }, scales: { xAxes: [{ type: 'linear', // bubble should probably use a linear scale by default position: 'bottom', id: 'x-axis-0' // need an ID so datasets can reference the scale }], yAxes: [{ type: 'linear', position: 'left', id: 'y-axis-0' }] }, tooltips: { callbacks: { title: function() { // Title doesn't make sense for scatter since we format the data as a point return ''; }, label: function(item, data) { var datasetLabel = data.datasets[item.datasetIndex].label || ''; var dataPoint = data.datasets[item.datasetIndex].data[item.index]; return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; } } } }); module.exports = function(Chart) { Chart.controllers.bubble = Chart.DatasetController.extend({ /** * @protected */ dataElementType: elements.Point, /** * @protected */ update: function(reset) { var me = this; var meta = me.getMeta(); var points = meta.data; // Update Points helpers.each(points, function(point, index) { me.updateElement(point, index, reset); }); }, /** * @protected */ updateElement: function(point, index, reset) { var me = this; var meta = me.getMeta(); var custom = point.custom || {}; var xScale = me.getScaleForId(meta.xAxisID); var yScale = me.getScaleForId(meta.yAxisID); var options = me._resolveElementOptions(point, index); var data = me.getDataset().data[index]; var dsIndex = me.index; var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); point._xScale = xScale; point._yScale = yScale; point._options = options; point._datasetIndex = dsIndex; point._index = index; point._model = { backgroundColor: options.backgroundColor, borderColor: options.borderColor, borderWidth: options.borderWidth, hitRadius: options.hitRadius, pointStyle: options.pointStyle, radius: reset ? 0 : options.radius, skip: custom.skip || isNaN(x) || isNaN(y), x: x, y: y, }; point.pivot(); }, /** * @protected */ setHoverStyle: function(point) { var model = point._model; var options = point._options; model.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor)); model.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor)); model.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth); model.radius = options.radius + options.hoverRadius; }, /** * @protected */ removeHoverStyle: function(point) { var model = point._model; var options = point._options; model.backgroundColor = options.backgroundColor; model.borderColor = options.borderColor; model.borderWidth = options.borderWidth; model.radius = options.radius; }, /** * @private */ _resolveElementOptions: function(point, index) { var me = this; var chart = me.chart; var datasets = chart.data.datasets; var dataset = datasets[me.index]; var custom = point.custom || {}; var options = chart.options.elements.point; var resolve = helpers.options.resolve; var data = dataset.data[index]; var values = {}; var i, ilen, key; // Scriptable options var context = { chart: chart, dataIndex: index, dataset: dataset, datasetIndex: me.index }; var keys = [ 'backgroundColor', 'borderColor', 'borderWidth', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth', 'hoverRadius', 'hitRadius', 'pointStyle' ]; for (i = 0, ilen = keys.length; i < ilen; ++i) { key = keys[i]; values[key] = resolve([ custom[key], dataset[key], options[key] ], context, index); } // Custom radius resolution values.radius = resolve([ custom.radius, data ? data.r : undefined, dataset.radius, options.radius ], context, index); return values; } }); }; },{"25":25,"40":40,"45":45}],17:[function(require,module,exports){ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('doughnut', { animation: { // Boolean - Whether we animate the rotation of the Doughnut animateRotate: true, // Boolean - Whether we animate scaling the Doughnut from the centre animateScale: false }, hover: { mode: 'single' }, legendCallback: function(chart) { var text = []; text.push('
    '); var data = chart.data; var datasets = data.datasets; var labels = data.labels; if (datasets.length) { for (var i = 0; i < datasets[0].data.length; ++i) { text.push('
  • '); if (labels[i]) { text.push(labels[i]); } text.push('
  • '); } } text.push('
'); return text.join(''); }, legend: { labels: { generateLabels: function(chart) { var data = chart.data; if (data.labels.length && data.datasets.length) { return data.labels.map(function(label, i) { var meta = chart.getDatasetMeta(0); var ds = data.datasets[0]; var arc = meta.data[i]; var custom = arc && arc.custom || {}; var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; var arcOpts = chart.options.elements.arc; var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); return { text: label, fillStyle: fill, strokeStyle: stroke, lineWidth: bw, hidden: isNaN(ds.data[i]) || meta.data[i].hidden, // Extra data used for toggling the correct item index: i }; }); } return []; } }, onClick: function(e, legendItem) { var index = legendItem.index; var chart = this.chart; var i, ilen, meta; for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { meta = chart.getDatasetMeta(i); // toggle visibility of index if exists if (meta.data[index]) { meta.data[index].hidden = !meta.data[index].hidden; } } chart.update(); } }, // The percentage of the chart that we cut out of the middle. cutoutPercentage: 50, // The rotation of the chart, where the first data arc begins. rotation: Math.PI * -0.5, // The total circumference of the chart. circumference: Math.PI * 2.0, // Need to override these to give a nice default tooltips: { callbacks: { title: function() { return ''; }, label: function(tooltipItem, data) { var dataLabel = data.labels[tooltipItem.index]; var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; if (helpers.isArray(dataLabel)) { // show value on first line of multiline label // need to clone because we are changing the value dataLabel = dataLabel.slice(); dataLabel[0] += value; } else { dataLabel += value; } return dataLabel; } } } }); defaults._set('pie', helpers.clone(defaults.doughnut)); defaults._set('pie', { cutoutPercentage: 0 }); module.exports = function(Chart) { Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({ dataElementType: elements.Arc, linkScales: helpers.noop, // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly getRingIndex: function(datasetIndex) { var ringIndex = 0; for (var j = 0; j < datasetIndex; ++j) { if (this.chart.isDatasetVisible(j)) { ++ringIndex; } } return ringIndex; }, update: function(reset) { var me = this; var chart = me.chart; var chartArea = chart.chartArea; var opts = chart.options; var arcOpts = opts.elements.arc; var availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth; var availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth; var minSize = Math.min(availableWidth, availableHeight); var offset = {x: 0, y: 0}; var meta = me.getMeta(); var cutoutPercentage = opts.cutoutPercentage; var circumference = opts.circumference; // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc if (circumference < Math.PI * 2.0) { var startAngle = opts.rotation % (Math.PI * 2.0); startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); var endAngle = startAngle + circumference; var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); var cutout = cutoutPercentage / 100.0; var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; minSize = Math.min(availableWidth / size.width, availableHeight / size.height); offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; } chart.borderWidth = me.getMaxBorderWidth(meta.data); chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); chart.offsetX = offset.x * chart.outerRadius; chart.offsetY = offset.y * chart.outerRadius; meta.total = me.calculateTotal(); me.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index)); me.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0); helpers.each(meta.data, function(arc, index) { me.updateElement(arc, index, reset); }); }, updateElement: function(arc, index, reset) { var me = this; var chart = me.chart; var chartArea = chart.chartArea; var opts = chart.options; var animationOpts = opts.animation; var centerX = (chartArea.left + chartArea.right) / 2; var centerY = (chartArea.top + chartArea.bottom) / 2; var startAngle = opts.rotation; // non reset case handled later var endAngle = opts.rotation; // non reset case handled later var dataset = me.getDataset(); var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; helpers.extend(arc, { // Utility _datasetIndex: me.index, _index: index, // Desired view properties _model: { x: centerX + chart.offsetX, y: centerY + chart.offsetY, startAngle: startAngle, endAngle: endAngle, circumference: circumference, outerRadius: outerRadius, innerRadius: innerRadius, label: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) } }); var model = arc._model; // Resets the visual styles this.removeHoverStyle(arc); // Set correct angles if not resetting if (!reset || !animationOpts.animateRotate) { if (index === 0) { model.startAngle = opts.rotation; } else { model.startAngle = me.getMeta().data[index - 1]._model.endAngle; } model.endAngle = model.startAngle + model.circumference; } arc.pivot(); }, removeHoverStyle: function(arc) { Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); }, calculateTotal: function() { var dataset = this.getDataset(); var meta = this.getMeta(); var total = 0; var value; helpers.each(meta.data, function(element, index) { value = dataset.data[index]; if (!isNaN(value) && !element.hidden) { total += Math.abs(value); } }); /* if (total === 0) { total = NaN; }*/ return total; }, calculateCircumference: function(value) { var total = this.getMeta().total; if (total > 0 && !isNaN(value)) { return (Math.PI * 2.0) * (value / total); } return 0; }, // gets the max border or hover width to properly scale pie charts getMaxBorderWidth: function(arcs) { var max = 0; var index = this.index; var length = arcs.length; var borderWidth; var hoverWidth; for (var i = 0; i < length; i++) { borderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0; hoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0; max = borderWidth > max ? borderWidth : max; max = hoverWidth > max ? hoverWidth : max; } return max; } }); }; },{"25":25,"40":40,"45":45}],18:[function(require,module,exports){ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('line', { showLines: true, spanGaps: false, hover: { mode: 'label' }, scales: { xAxes: [{ type: 'category', id: 'x-axis-0' }], yAxes: [{ type: 'linear', id: 'y-axis-0' }] } }); module.exports = function(Chart) { function lineEnabled(dataset, options) { return helpers.valueOrDefault(dataset.showLine, options.showLines); } Chart.controllers.line = Chart.DatasetController.extend({ datasetElementType: elements.Line, dataElementType: elements.Point, update: function(reset) { var me = this; var meta = me.getMeta(); var line = meta.dataset; var points = meta.data || []; var options = me.chart.options; var lineElementOptions = options.elements.line; var scale = me.getScaleForId(meta.yAxisID); var i, ilen, custom; var dataset = me.getDataset(); var showLine = lineEnabled(dataset, options); // Update Line if (showLine) { custom = line.custom || {}; // Compatibility: If the properties are defined with only the old name, use those values if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { dataset.lineTension = dataset.tension; } // Utility line._scale = scale; line._datasetIndex = me.index; // Data line._children = points; // Model line._model = { // Appearance // The default behavior of lines is to break at null values, according // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 // This option gives lines the ability to span gaps spanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps, tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension), backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), steppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped), cubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode), }; line.pivot(); } // Update Points for (i = 0, ilen = points.length; i < ilen; ++i) { me.updateElement(points[i], i, reset); } if (showLine && line._model.tension !== 0) { me.updateBezierControlPoints(); } // Now pivot the point for animation for (i = 0, ilen = points.length; i < ilen; ++i) { points[i].pivot(); } }, getPointBackgroundColor: function(point, index) { var backgroundColor = this.chart.options.elements.point.backgroundColor; var dataset = this.getDataset(); var custom = point.custom || {}; if (custom.backgroundColor) { backgroundColor = custom.backgroundColor; } else if (dataset.pointBackgroundColor) { backgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor); } else if (dataset.backgroundColor) { backgroundColor = dataset.backgroundColor; } return backgroundColor; }, getPointBorderColor: function(point, index) { var borderColor = this.chart.options.elements.point.borderColor; var dataset = this.getDataset(); var custom = point.custom || {}; if (custom.borderColor) { borderColor = custom.borderColor; } else if (dataset.pointBorderColor) { borderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor); } else if (dataset.borderColor) { borderColor = dataset.borderColor; } return borderColor; }, getPointBorderWidth: function(point, index) { var borderWidth = this.chart.options.elements.point.borderWidth; var dataset = this.getDataset(); var custom = point.custom || {}; if (!isNaN(custom.borderWidth)) { borderWidth = custom.borderWidth; } else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) { borderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth); } else if (!isNaN(dataset.borderWidth)) { borderWidth = dataset.borderWidth; } return borderWidth; }, updateElement: function(point, index, reset) { var me = this; var meta = me.getMeta(); var custom = point.custom || {}; var dataset = me.getDataset(); var datasetIndex = me.index; var value = dataset.data[index]; var yScale = me.getScaleForId(meta.yAxisID); var xScale = me.getScaleForId(meta.xAxisID); var pointOptions = me.chart.options.elements.point; var x, y; // Compatibility: If the properties are defined with only the old name, use those values if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { dataset.pointRadius = dataset.radius; } if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) { dataset.pointHitRadius = dataset.hitRadius; } x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); // Utility point._xScale = xScale; point._yScale = yScale; point._datasetIndex = datasetIndex; point._index = index; // Desired view properties point._model = { x: x, y: y, skip: custom.skip || isNaN(x) || isNaN(y), // Appearance radius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius), pointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle), backgroundColor: me.getPointBackgroundColor(point, index), borderColor: me.getPointBorderColor(point, index), borderWidth: me.getPointBorderWidth(point, index), tension: meta.dataset._model ? meta.dataset._model.tension : 0, steppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false, // Tooltip hitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius) }; }, calculatePointY: function(value, index, datasetIndex) { var me = this; var chart = me.chart; var meta = me.getMeta(); var yScale = me.getScaleForId(meta.yAxisID); var sumPos = 0; var sumNeg = 0; var i, ds, dsMeta; if (yScale.options.stacked) { for (i = 0; i < datasetIndex; i++) { ds = chart.data.datasets[i]; dsMeta = chart.getDatasetMeta(i); if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); if (stackedRightValue < 0) { sumNeg += stackedRightValue || 0; } else { sumPos += stackedRightValue || 0; } } } var rightValue = Number(yScale.getRightValue(value)); if (rightValue < 0) { return yScale.getPixelForValue(sumNeg + rightValue); } return yScale.getPixelForValue(sumPos + rightValue); } return yScale.getPixelForValue(value); }, updateBezierControlPoints: function() { var me = this; var meta = me.getMeta(); var area = me.chart.chartArea; var points = (meta.data || []); var i, ilen, point, model, controlPoints; // Only consider points that are drawn in case the spanGaps option is used if (meta.dataset._model.spanGaps) { points = points.filter(function(pt) { return !pt._model.skip; }); } function capControlPoint(pt, min, max) { return Math.max(Math.min(pt, max), min); } if (meta.dataset._model.cubicInterpolationMode === 'monotone') { helpers.splineCurveMonotone(points); } else { for (i = 0, ilen = points.length; i < ilen; ++i) { point = points[i]; model = point._model; controlPoints = helpers.splineCurve( helpers.previousItem(points, i)._model, model, helpers.nextItem(points, i)._model, meta.dataset._model.tension ); model.controlPointPreviousX = controlPoints.previous.x; model.controlPointPreviousY = controlPoints.previous.y; model.controlPointNextX = controlPoints.next.x; model.controlPointNextY = controlPoints.next.y; } } if (me.chart.options.elements.line.capBezierPoints) { for (i = 0, ilen = points.length; i < ilen; ++i) { model = points[i]._model; model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); } } }, draw: function() { var me = this; var chart = me.chart; var meta = me.getMeta(); var points = meta.data || []; var area = chart.chartArea; var ilen = points.length; var i = 0; helpers.canvas.clipArea(chart.ctx, area); if (lineEnabled(me.getDataset(), chart.options)) { meta.dataset.draw(); } helpers.canvas.unclipArea(chart.ctx); // Draw the points for (; i < ilen; ++i) { points[i].draw(area); } }, setHoverStyle: function(point) { // Point var dataset = this.chart.data.datasets[point._datasetIndex]; var index = point._index; var custom = point.custom || {}; var model = point._model; model.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); model.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); model.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor)); model.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth); }, removeHoverStyle: function(point) { var me = this; var dataset = me.chart.data.datasets[point._datasetIndex]; var index = point._index; var custom = point.custom || {}; var model = point._model; // Compatibility: If the properties are defined with only the old name, use those values if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { dataset.pointRadius = dataset.radius; } model.radius = custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius); model.backgroundColor = me.getPointBackgroundColor(point, index); model.borderColor = me.getPointBorderColor(point, index); model.borderWidth = me.getPointBorderWidth(point, index); } }); }; },{"25":25,"40":40,"45":45}],19:[function(require,module,exports){ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('polarArea', { scale: { type: 'radialLinear', angleLines: { display: false }, gridLines: { circular: true }, pointLabels: { display: false }, ticks: { beginAtZero: true } }, // Boolean - Whether to animate the rotation of the chart animation: { animateRotate: true, animateScale: true }, startAngle: -0.5 * Math.PI, legendCallback: function(chart) { var text = []; text.push('
    '); var data = chart.data; var datasets = data.datasets; var labels = data.labels; if (datasets.length) { for (var i = 0; i < datasets[0].data.length; ++i) { text.push('
  • '); if (labels[i]) { text.push(labels[i]); } text.push('
  • '); } } text.push('
'); return text.join(''); }, legend: { labels: { generateLabels: function(chart) { var data = chart.data; if (data.labels.length && data.datasets.length) { return data.labels.map(function(label, i) { var meta = chart.getDatasetMeta(0); var ds = data.datasets[0]; var arc = meta.data[i]; var custom = arc.custom || {}; var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault; var arcOpts = chart.options.elements.arc; var fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); var stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); var bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); return { text: label, fillStyle: fill, strokeStyle: stroke, lineWidth: bw, hidden: isNaN(ds.data[i]) || meta.data[i].hidden, // Extra data used for toggling the correct item index: i }; }); } return []; } }, onClick: function(e, legendItem) { var index = legendItem.index; var chart = this.chart; var i, ilen, meta; for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { meta = chart.getDatasetMeta(i); meta.data[index].hidden = !meta.data[index].hidden; } chart.update(); } }, // Need to override these to give a nice default tooltips: { callbacks: { title: function() { return ''; }, label: function(item, data) { return data.labels[item.index] + ': ' + item.yLabel; } } } }); module.exports = function(Chart) { Chart.controllers.polarArea = Chart.DatasetController.extend({ dataElementType: elements.Arc, linkScales: helpers.noop, update: function(reset) { var me = this; var chart = me.chart; var chartArea = chart.chartArea; var meta = me.getMeta(); var opts = chart.options; var arcOpts = opts.elements.arc; var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); chart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0); chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); me.innerRadius = me.outerRadius - chart.radiusLength; meta.count = me.countVisibleElements(); helpers.each(meta.data, function(arc, index) { me.updateElement(arc, index, reset); }); }, updateElement: function(arc, index, reset) { var me = this; var chart = me.chart; var dataset = me.getDataset(); var opts = chart.options; var animationOpts = opts.animation; var scale = chart.scale; var labels = chart.data.labels; var circumference = me.calculateCircumference(dataset.data[index]); var centerX = scale.xCenter; var centerY = scale.yCenter; // If there is NaN data before us, we need to calculate the starting angle correctly. // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data var visibleCount = 0; var meta = me.getMeta(); for (var i = 0; i < index; ++i) { if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) { ++visibleCount; } } // var negHalfPI = -0.5 * Math.PI; var datasetStartAngle = opts.startAngle; var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); var startAngle = datasetStartAngle + (circumference * visibleCount); var endAngle = startAngle + (arc.hidden ? 0 : circumference); var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); helpers.extend(arc, { // Utility _datasetIndex: me.index, _index: index, _scale: scale, // Desired view properties _model: { x: centerX, y: centerY, innerRadius: 0, outerRadius: reset ? resetRadius : distance, startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, label: helpers.valueAtIndexOrDefault(labels, index, labels[index]) } }); // Apply border and fill style me.removeHoverStyle(arc); arc.pivot(); }, removeHoverStyle: function(arc) { Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); }, countVisibleElements: function() { var dataset = this.getDataset(); var meta = this.getMeta(); var count = 0; helpers.each(meta.data, function(element, index) { if (!isNaN(dataset.data[index]) && !element.hidden) { count++; } }); return count; }, calculateCircumference: function(value) { var count = this.getMeta().count; if (count > 0 && !isNaN(value)) { return (2 * Math.PI) / count; } return 0; } }); }; },{"25":25,"40":40,"45":45}],20:[function(require,module,exports){ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('radar', { scale: { type: 'radialLinear' }, elements: { line: { tension: 0 // no bezier in radar } } }); module.exports = function(Chart) { Chart.controllers.radar = Chart.DatasetController.extend({ datasetElementType: elements.Line, dataElementType: elements.Point, linkScales: helpers.noop, update: function(reset) { var me = this; var meta = me.getMeta(); var line = meta.dataset; var points = meta.data; var custom = line.custom || {}; var dataset = me.getDataset(); var lineElementOptions = me.chart.options.elements.line; var scale = me.chart.scale; // Compatibility: If the properties are defined with only the old name, use those values if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { dataset.lineTension = dataset.tension; } helpers.extend(meta.dataset, { // Utility _datasetIndex: me.index, _scale: scale, // Data _children: points, _loop: true, // Model _model: { // Appearance tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension), backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), } }); meta.dataset.pivot(); // Update Points helpers.each(points, function(point, index) { me.updateElement(point, index, reset); }, me); // Update bezier control points me.updateBezierControlPoints(); }, updateElement: function(point, index, reset) { var me = this; var custom = point.custom || {}; var dataset = me.getDataset(); var scale = me.chart.scale; var pointElementOptions = me.chart.options.elements.point; var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); // Compatibility: If the properties are defined with only the old name, use those values if ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) { dataset.pointRadius = dataset.radius; } if ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) { dataset.pointHitRadius = dataset.hitRadius; } helpers.extend(point, { // Utility _datasetIndex: me.index, _index: index, _scale: scale, // Desired view properties _model: { x: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales y: reset ? scale.yCenter : pointPosition.y, // Appearance tension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension), radius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius), backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor), borderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor), borderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth), pointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle), // Tooltip hitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius) } }); point._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y)); }, updateBezierControlPoints: function() { var chartArea = this.chart.chartArea; var meta = this.getMeta(); helpers.each(meta.data, function(point, index) { var model = point._model; var controlPoints = helpers.splineCurve( helpers.previousItem(meta.data, index, true)._model, model, helpers.nextItem(meta.data, index, true)._model, model.tension ); // Prevent the bezier going outside of the bounds of the graph model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left); model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top); model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left); model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top); // Now pivot the point for animation point.pivot(); }); }, setHoverStyle: function(point) { // Point var dataset = this.chart.data.datasets[point._datasetIndex]; var custom = point.custom || {}; var index = point._index; var model = point._model; model.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor)); model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth); }, removeHoverStyle: function(point) { var dataset = this.chart.data.datasets[point._datasetIndex]; var custom = point.custom || {}; var index = point._index; var model = point._model; var pointElementOptions = this.chart.options.elements.point; model.radius = custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius); model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor); model.borderColor = custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor); model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth); } }); }; },{"25":25,"40":40,"45":45}],21:[function(require,module,exports){ 'use strict'; var defaults = require(25); defaults._set('scatter', { hover: { mode: 'single' }, scales: { xAxes: [{ id: 'x-axis-1', // need an ID so datasets can reference the scale type: 'linear', // scatter should not use a category axis position: 'bottom' }], yAxes: [{ id: 'y-axis-1', type: 'linear', position: 'left' }] }, showLines: false, tooltips: { callbacks: { title: function() { return ''; // doesn't make sense for scatter since data are formatted as a point }, label: function(item) { return '(' + item.xLabel + ', ' + item.yLabel + ')'; } } } }); module.exports = function(Chart) { // Scatter charts use line controllers Chart.controllers.scatter = Chart.controllers.line; }; },{"25":25}],22:[function(require,module,exports){ /* global window: false */ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); defaults._set('global', { animation: { duration: 1000, easing: 'easeOutQuart', onProgress: helpers.noop, onComplete: helpers.noop } }); module.exports = function(Chart) { Chart.Animation = Element.extend({ chart: null, // the animation associated chart instance currentStep: 0, // the current animation step numSteps: 60, // default number of steps easing: '', // the easing to use for this animation render: null, // render function used by the animation service onAnimationProgress: null, // user specified callback to fire on each step of the animation onAnimationComplete: null, // user specified callback to fire when the animation finishes }); Chart.animationService = { frameDuration: 17, animations: [], dropFrames: 0, request: null, /** * @param {Chart} chart - The chart to animate. * @param {Chart.Animation} animation - The animation that we will animate. * @param {Number} duration - The animation duration in ms. * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions */ addAnimation: function(chart, animation, duration, lazy) { var animations = this.animations; var i, ilen; animation.chart = chart; if (!lazy) { chart.animating = true; } for (i = 0, ilen = animations.length; i < ilen; ++i) { if (animations[i].chart === chart) { animations[i] = animation; return; } } animations.push(animation); // If there are no animations queued, manually kickstart a digest, for lack of a better word if (animations.length === 1) { this.requestAnimationFrame(); } }, cancelAnimation: function(chart) { var index = helpers.findIndex(this.animations, function(animation) { return animation.chart === chart; }); if (index !== -1) { this.animations.splice(index, 1); chart.animating = false; } }, requestAnimationFrame: function() { var me = this; if (me.request === null) { // Skip animation frame requests until the active one is executed. // This can happen when processing mouse events, e.g. 'mousemove' // and 'mouseout' events will trigger multiple renders. me.request = helpers.requestAnimFrame.call(window, function() { me.request = null; me.startDigest(); }); } }, /** * @private */ startDigest: function() { var me = this; var startTime = Date.now(); var framesToDrop = 0; if (me.dropFrames > 1) { framesToDrop = Math.floor(me.dropFrames); me.dropFrames = me.dropFrames % 1; } me.advance(1 + framesToDrop); var endTime = Date.now(); me.dropFrames += (endTime - startTime) / me.frameDuration; // Do we have more stuff to animate? if (me.animations.length > 0) { me.requestAnimationFrame(); } }, /** * @private */ advance: function(count) { var animations = this.animations; var animation, chart; var i = 0; while (i < animations.length) { animation = animations[i]; chart = animation.chart; animation.currentStep = (animation.currentStep || 0) + count; animation.currentStep = Math.min(animation.currentStep, animation.numSteps); helpers.callback(animation.render, [chart, animation], chart); helpers.callback(animation.onAnimationProgress, [animation], chart); if (animation.currentStep >= animation.numSteps) { helpers.callback(animation.onAnimationComplete, [animation], chart); chart.animating = false; animations.splice(i, 1); } else { ++i; } } } }; /** * Provided for backward compatibility, use Chart.Animation instead * @prop Chart.Animation#animationObject * @deprecated since version 2.6.0 * @todo remove at version 3 */ Object.defineProperty(Chart.Animation.prototype, 'animationObject', { get: function() { return this; } }); /** * Provided for backward compatibility, use Chart.Animation#chart instead * @prop Chart.Animation#chartInstance * @deprecated since version 2.6.0 * @todo remove at version 3 */ Object.defineProperty(Chart.Animation.prototype, 'chartInstance', { get: function() { return this.chart; }, set: function(value) { this.chart = value; } }); }; },{"25":25,"26":26,"45":45}],23:[function(require,module,exports){ 'use strict'; var defaults = require(25); var helpers = require(45); var Interaction = require(28); var platform = require(48); module.exports = function(Chart) { var plugins = Chart.plugins; // Create a dictionary of chart types, to allow for extension of existing types Chart.types = {}; // Store a reference to each instance - allowing us to globally resize chart instances on window resize. // Destroy method on the chart will remove the instance of the chart from this reference. Chart.instances = {}; // Controllers available for dataset visualization eg. bar, line, slice, etc. Chart.controllers = {}; /** * Initializes the given config with global and chart default values. */ function initConfig(config) { config = config || {}; // Do NOT use configMerge() for the data object because this method merges arrays // and so would change references to labels and datasets, preventing data updates. var data = config.data = config.data || {}; data.datasets = data.datasets || []; data.labels = data.labels || []; config.options = helpers.configMerge( defaults.global, defaults[config.type], config.options || {}); return config; } /** * Updates the config of the chart * @param chart {Chart} chart to update the options for */ function updateConfig(chart) { var newOptions = chart.options; // Update Scale(s) with options if (newOptions.scale) { chart.scale.options = newOptions.scale; } else if (newOptions.scales) { newOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) { chart.scales[scaleOptions.id].options = scaleOptions; }); } // Tooltip chart.tooltip._options = newOptions.tooltips; } function positionIsHorizontal(position) { return position === 'top' || position === 'bottom'; } helpers.extend(Chart.prototype, /** @lends Chart */ { /** * @private */ construct: function(item, config) { var me = this; config = initConfig(config); var context = platform.acquireContext(item, config); var canvas = context && context.canvas; var height = canvas && canvas.height; var width = canvas && canvas.width; me.id = helpers.uid(); me.ctx = context; me.canvas = canvas; me.config = config; me.width = width; me.height = height; me.aspectRatio = height ? width / height : null; me.options = config.options; me._bufferedRender = false; /** * Provided for backward compatibility, Chart and Chart.Controller have been merged, * the "instance" still need to be defined since it might be called from plugins. * @prop Chart#chart * @deprecated since version 2.6.0 * @todo remove at version 3 * @private */ me.chart = me; me.controller = me; // chart.chart.controller #inception // Add the chart instance to the global namespace Chart.instances[me.id] = me; // Define alias to the config data: `chart.data === chart.config.data` Object.defineProperty(me, 'data', { get: function() { return me.config.data; }, set: function(value) { me.config.data = value; } }); if (!context || !canvas) { // The given item is not a compatible context2d element, let's return before finalizing // the chart initialization but after setting basic chart / controller properties that // can help to figure out that the chart is not valid (e.g chart.canvas !== null); // https://github.com/chartjs/Chart.js/issues/2807 console.error("Failed to create chart: can't acquire context from the given item"); return; } me.initialize(); me.update(); }, /** * @private */ initialize: function() { var me = this; // Before init plugin notification plugins.notify(me, 'beforeInit'); helpers.retinaScale(me, me.options.devicePixelRatio); me.bindEvents(); if (me.options.responsive) { // Initial resize before chart draws (must be silent to preserve initial animations). me.resize(true); } // Make sure scales have IDs and are built before we build any controllers. me.ensureScalesHaveIDs(); me.buildScales(); me.initToolTip(); // After init plugin notification plugins.notify(me, 'afterInit'); return me; }, clear: function() { helpers.canvas.clear(this); return this; }, stop: function() { // Stops any current animation loop occurring Chart.animationService.cancelAnimation(this); return this; }, resize: function(silent) { var me = this; var options = me.options; var canvas = me.canvas; var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; // the canvas render width and height will be casted to integers so make sure that // the canvas display style uses the same integer values to avoid blurring effect. // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collased var newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas))); var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas))); if (me.width === newWidth && me.height === newHeight) { return; } canvas.width = me.width = newWidth; canvas.height = me.height = newHeight; canvas.style.width = newWidth + 'px'; canvas.style.height = newHeight + 'px'; helpers.retinaScale(me, options.devicePixelRatio); if (!silent) { // Notify any plugins about the resize var newSize = {width: newWidth, height: newHeight}; plugins.notify(me, 'resize', [newSize]); // Notify of resize if (me.options.onResize) { me.options.onResize(me, newSize); } me.stop(); me.update(me.options.responsiveAnimationDuration); } }, ensureScalesHaveIDs: function() { var options = this.options; var scalesOptions = options.scales || {}; var scaleOptions = options.scale; helpers.each(scalesOptions.xAxes, function(xAxisOptions, index) { xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); }); helpers.each(scalesOptions.yAxes, function(yAxisOptions, index) { yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); }); if (scaleOptions) { scaleOptions.id = scaleOptions.id || 'scale'; } }, /** * Builds a map of scale ID to scale object for future lookup. */ buildScales: function() { var me = this; var options = me.options; var scales = me.scales = {}; var items = []; if (options.scales) { items = items.concat( (options.scales.xAxes || []).map(function(xAxisOptions) { return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; }), (options.scales.yAxes || []).map(function(yAxisOptions) { return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; }) ); } if (options.scale) { items.push({ options: options.scale, dtype: 'radialLinear', isDefault: true, dposition: 'chartArea' }); } helpers.each(items, function(item) { var scaleOptions = item.options; var scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype); var scaleClass = Chart.scaleService.getScaleConstructor(scaleType); if (!scaleClass) { return; } if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { scaleOptions.position = item.dposition; } var scale = new scaleClass({ id: scaleOptions.id, options: scaleOptions, ctx: me.ctx, chart: me }); scales[scale.id] = scale; scale.mergeTicksOptions(); // TODO(SB): I think we should be able to remove this custom case (options.scale) // and consider it as a regular scale part of the "scales"" map only! This would // make the logic easier and remove some useless? custom code. if (item.isDefault) { me.scale = scale; } }); Chart.scaleService.addScalesToLayout(this); }, buildOrUpdateControllers: function() { var me = this; var types = []; var newControllers = []; helpers.each(me.data.datasets, function(dataset, datasetIndex) { var meta = me.getDatasetMeta(datasetIndex); var type = dataset.type || me.config.type; if (meta.type && meta.type !== type) { me.destroyDatasetMeta(datasetIndex); meta = me.getDatasetMeta(datasetIndex); } meta.type = type; types.push(meta.type); if (meta.controller) { meta.controller.updateIndex(datasetIndex); } else { var ControllerClass = Chart.controllers[meta.type]; if (ControllerClass === undefined) { throw new Error('"' + meta.type + '" is not a chart type.'); } meta.controller = new ControllerClass(me, datasetIndex); newControllers.push(meta.controller); } }, me); return newControllers; }, /** * Reset the elements of all datasets * @private */ resetElements: function() { var me = this; helpers.each(me.data.datasets, function(dataset, datasetIndex) { me.getDatasetMeta(datasetIndex).controller.reset(); }, me); }, /** * Resets the chart back to it's state before the initial animation */ reset: function() { this.resetElements(); this.tooltip.initialize(); }, update: function(config) { var me = this; if (!config || typeof config !== 'object') { // backwards compatibility config = { duration: config, lazy: arguments[1] }; } updateConfig(me); if (plugins.notify(me, 'beforeUpdate') === false) { return; } // In case the entire data object changed me.tooltip._data = me.data; // Make sure dataset controllers are updated and new controllers are reset var newControllers = me.buildOrUpdateControllers(); // Make sure all dataset controllers have correct meta data counts helpers.each(me.data.datasets, function(dataset, datasetIndex) { me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); }, me); me.updateLayout(); // Can only reset the new controllers after the scales have been updated helpers.each(newControllers, function(controller) { controller.reset(); }); me.updateDatasets(); // Need to reset tooltip in case it is displayed with elements that are removed // after update. me.tooltip.initialize(); // Last active contains items that were previously in the tooltip. // When we reset the tooltip, we need to clear it me.lastActive = []; // Do this before render so that any plugins that need final scale updates can use it plugins.notify(me, 'afterUpdate'); if (me._bufferedRender) { me._bufferedRequest = { duration: config.duration, easing: config.easing, lazy: config.lazy }; } else { me.render(config); } }, /** * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` * hook, in which case, plugins will not be called on `afterLayout`. * @private */ updateLayout: function() { var me = this; if (plugins.notify(me, 'beforeLayout') === false) { return; } Chart.layoutService.update(this, this.width, this.height); /** * Provided for backward compatibility, use `afterLayout` instead. * @method IPlugin#afterScaleUpdate * @deprecated since version 2.5.0 * @todo remove at version 3 * @private */ plugins.notify(me, 'afterScaleUpdate'); plugins.notify(me, 'afterLayout'); }, /** * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. * @private */ updateDatasets: function() { var me = this; if (plugins.notify(me, 'beforeDatasetsUpdate') === false) { return; } for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { me.updateDataset(i); } plugins.notify(me, 'afterDatasetsUpdate'); }, /** * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` * hook, in which case, plugins will not be called on `afterDatasetUpdate`. * @private */ updateDataset: function(index) { var me = this; var meta = me.getDatasetMeta(index); var args = { meta: meta, index: index }; if (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { return; } meta.controller.update(); plugins.notify(me, 'afterDatasetUpdate', [args]); }, render: function(config) { var me = this; if (!config || typeof config !== 'object') { // backwards compatibility config = { duration: config, lazy: arguments[1] }; } var duration = config.duration; var lazy = config.lazy; if (plugins.notify(me, 'beforeRender') === false) { return; } var animationOptions = me.options.animation; var onComplete = function(animation) { plugins.notify(me, 'afterRender'); helpers.callback(animationOptions && animationOptions.onComplete, [animation], me); }; if (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) { var animation = new Chart.Animation({ numSteps: (duration || animationOptions.duration) / 16.66, // 60 fps easing: config.easing || animationOptions.easing, render: function(chart, animationObject) { var easingFunction = helpers.easing.effects[animationObject.easing]; var currentStep = animationObject.currentStep; var stepDecimal = currentStep / animationObject.numSteps; chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); }, onAnimationProgress: animationOptions.onProgress, onAnimationComplete: onComplete }); Chart.animationService.addAnimation(me, animation, duration, lazy); } else { me.draw(); // See https://github.com/chartjs/Chart.js/issues/3781 onComplete(new Chart.Animation({numSteps: 0, chart: me})); } return me; }, draw: function(easingValue) { var me = this; me.clear(); if (helpers.isNullOrUndef(easingValue)) { easingValue = 1; } me.transition(easingValue); if (plugins.notify(me, 'beforeDraw', [easingValue]) === false) { return; } // Draw all the scales helpers.each(me.boxes, function(box) { box.draw(me.chartArea); }, me); if (me.scale) { me.scale.draw(); } me.drawDatasets(easingValue); me._drawTooltip(easingValue); plugins.notify(me, 'afterDraw', [easingValue]); }, /** * @private */ transition: function(easingValue) { var me = this; for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { if (me.isDatasetVisible(i)) { me.getDatasetMeta(i).controller.transition(easingValue); } } me.tooltip.transition(easingValue); }, /** * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` * hook, in which case, plugins will not be called on `afterDatasetsDraw`. * @private */ drawDatasets: function(easingValue) { var me = this; if (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { return; } // Draw datasets reversed to support proper line stacking for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { if (me.isDatasetVisible(i)) { me.drawDataset(i, easingValue); } } plugins.notify(me, 'afterDatasetsDraw', [easingValue]); }, /** * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` * hook, in which case, plugins will not be called on `afterDatasetDraw`. * @private */ drawDataset: function(index, easingValue) { var me = this; var meta = me.getDatasetMeta(index); var args = { meta: meta, index: index, easingValue: easingValue }; if (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { return; } meta.controller.draw(easingValue); plugins.notify(me, 'afterDatasetDraw', [args]); }, /** * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` * hook, in which case, plugins will not be called on `afterTooltipDraw`. * @private */ _drawTooltip: function(easingValue) { var me = this; var tooltip = me.tooltip; var args = { tooltip: tooltip, easingValue: easingValue }; if (plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { return; } tooltip.draw(); plugins.notify(me, 'afterTooltipDraw', [args]); }, // Get the single element that was clicked on // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw getElementAtEvent: function(e) { return Interaction.modes.single(this, e); }, getElementsAtEvent: function(e) { return Interaction.modes.label(this, e, {intersect: true}); }, getElementsAtXAxis: function(e) { return Interaction.modes['x-axis'](this, e, {intersect: true}); }, getElementsAtEventForMode: function(e, mode, options) { var method = Interaction.modes[mode]; if (typeof method === 'function') { return method(this, e, options); } return []; }, getDatasetAtEvent: function(e) { return Interaction.modes.dataset(this, e, {intersect: true}); }, getDatasetMeta: function(datasetIndex) { var me = this; var dataset = me.data.datasets[datasetIndex]; if (!dataset._meta) { dataset._meta = {}; } var meta = dataset._meta[me.id]; if (!meta) { meta = dataset._meta[me.id] = { type: null, data: [], dataset: null, controller: null, hidden: null, // See isDatasetVisible() comment xAxisID: null, yAxisID: null }; } return meta; }, getVisibleDatasetCount: function() { var count = 0; for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { if (this.isDatasetVisible(i)) { count++; } } return count; }, isDatasetVisible: function(datasetIndex) { var meta = this.getDatasetMeta(datasetIndex); // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; }, generateLegend: function() { return this.options.legendCallback(this); }, /** * @private */ destroyDatasetMeta: function(datasetIndex) { var id = this.id; var dataset = this.data.datasets[datasetIndex]; var meta = dataset._meta && dataset._meta[id]; if (meta) { meta.controller.destroy(); delete dataset._meta[id]; } }, destroy: function() { var me = this; var canvas = me.canvas; var i, ilen; me.stop(); // dataset controllers need to cleanup associated data for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { me.destroyDatasetMeta(i); } if (canvas) { me.unbindEvents(); helpers.canvas.clear(me); platform.releaseContext(me.ctx); me.canvas = null; me.ctx = null; } plugins.notify(me, 'destroy'); delete Chart.instances[me.id]; }, toBase64Image: function() { return this.canvas.toDataURL.apply(this.canvas, arguments); }, initToolTip: function() { var me = this; me.tooltip = new Chart.Tooltip({ _chart: me, _chartInstance: me, // deprecated, backward compatibility _data: me.data, _options: me.options.tooltips }, me); }, /** * @private */ bindEvents: function() { var me = this; var listeners = me._listeners = {}; var listener = function() { me.eventHandler.apply(me, arguments); }; helpers.each(me.options.events, function(type) { platform.addEventListener(me, type, listener); listeners[type] = listener; }); // Elements used to detect size change should not be injected for non responsive charts. // See https://github.com/chartjs/Chart.js/issues/2210 if (me.options.responsive) { listener = function() { me.resize(); }; platform.addEventListener(me, 'resize', listener); listeners.resize = listener; } }, /** * @private */ unbindEvents: function() { var me = this; var listeners = me._listeners; if (!listeners) { return; } delete me._listeners; helpers.each(listeners, function(listener, type) { platform.removeEventListener(me, type, listener); }); }, updateHoverStyle: function(elements, mode, enabled) { var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; var element, i, ilen; for (i = 0, ilen = elements.length; i < ilen; ++i) { element = elements[i]; if (element) { this.getDatasetMeta(element._datasetIndex).controller[method](element); } } }, /** * @private */ eventHandler: function(e) { var me = this; var tooltip = me.tooltip; if (plugins.notify(me, 'beforeEvent', [e]) === false) { return; } // Buffer any update calls so that renders do not occur me._bufferedRender = true; me._bufferedRequest = null; var changed = me.handleEvent(e); changed |= tooltip && tooltip.handleEvent(e); plugins.notify(me, 'afterEvent', [e]); var bufferedRequest = me._bufferedRequest; if (bufferedRequest) { // If we have an update that was triggered, we need to do a normal render me.render(bufferedRequest); } else if (changed && !me.animating) { // If entering, leaving, or changing elements, animate the change via pivot me.stop(); // We only need to render at this point. Updating will cause scales to be // recomputed generating flicker & using more memory than necessary. me.render(me.options.hover.animationDuration, true); } me._bufferedRender = false; me._bufferedRequest = null; return me; }, /** * Handle an event * @private * @param {IEvent} event the event to handle * @return {Boolean} true if the chart needs to re-render */ handleEvent: function(e) { var me = this; var options = me.options || {}; var hoverOptions = options.hover; var changed = false; me.lastActive = me.lastActive || []; // Find Active Elements for hover and tooltips if (e.type === 'mouseout') { me.active = []; } else { me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); } // Invoke onHover hook // Need to call with native event here to not break backwards compatibility helpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); if (e.type === 'mouseup' || e.type === 'click') { if (options.onClick) { // Use e.native here for backwards compatibility options.onClick.call(me, e.native, me.active); } } // Remove styling for last active (even if it may still be active) if (me.lastActive.length) { me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); } // Built in hover styling if (me.active.length && hoverOptions.mode) { me.updateHoverStyle(me.active, hoverOptions.mode, true); } changed = !helpers.arrayEquals(me.active, me.lastActive); // Remember Last Actives me.lastActive = me.active; return changed; } }); /** * Provided for backward compatibility, use Chart instead. * @class Chart.Controller * @deprecated since version 2.6.0 * @todo remove at version 3 * @private */ Chart.Controller = Chart; }; },{"25":25,"28":28,"45":45,"48":48}],24:[function(require,module,exports){ 'use strict'; var helpers = require(45); module.exports = function(Chart) { var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; /** * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', * 'unshift') and notify the listener AFTER the array has been altered. Listeners are * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. */ function listenArrayEvents(array, listener) { if (array._chartjs) { array._chartjs.listeners.push(listener); return; } Object.defineProperty(array, '_chartjs', { configurable: true, enumerable: false, value: { listeners: [listener] } }); arrayEvents.forEach(function(key) { var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); var base = array[key]; Object.defineProperty(array, key, { configurable: true, enumerable: false, value: function() { var args = Array.prototype.slice.call(arguments); var res = base.apply(this, args); helpers.each(array._chartjs.listeners, function(object) { if (typeof object[method] === 'function') { object[method].apply(object, args); } }); return res; } }); }); } /** * Removes the given array event listener and cleanup extra attached properties (such as * the _chartjs stub and overridden methods) if array doesn't have any more listeners. */ function unlistenArrayEvents(array, listener) { var stub = array._chartjs; if (!stub) { return; } var listeners = stub.listeners; var index = listeners.indexOf(listener); if (index !== -1) { listeners.splice(index, 1); } if (listeners.length > 0) { return; } arrayEvents.forEach(function(key) { delete array[key]; }); delete array._chartjs; } // Base class for all dataset controllers (line, bar, etc) Chart.DatasetController = function(chart, datasetIndex) { this.initialize(chart, datasetIndex); }; helpers.extend(Chart.DatasetController.prototype, { /** * Element type used to generate a meta dataset (e.g. Chart.element.Line). * @type {Chart.core.element} */ datasetElementType: null, /** * Element type used to generate a meta data (e.g. Chart.element.Point). * @type {Chart.core.element} */ dataElementType: null, initialize: function(chart, datasetIndex) { var me = this; me.chart = chart; me.index = datasetIndex; me.linkScales(); me.addElements(); }, updateIndex: function(datasetIndex) { this.index = datasetIndex; }, linkScales: function() { var me = this; var meta = me.getMeta(); var dataset = me.getDataset(); if (meta.xAxisID === null) { meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; } if (meta.yAxisID === null) { meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; } }, getDataset: function() { return this.chart.data.datasets[this.index]; }, getMeta: function() { return this.chart.getDatasetMeta(this.index); }, getScaleForId: function(scaleID) { return this.chart.scales[scaleID]; }, reset: function() { this.update(true); }, /** * @private */ destroy: function() { if (this._data) { unlistenArrayEvents(this._data, this); } }, createMetaDataset: function() { var me = this; var type = me.datasetElementType; return type && new type({ _chart: me.chart, _datasetIndex: me.index }); }, createMetaData: function(index) { var me = this; var type = me.dataElementType; return type && new type({ _chart: me.chart, _datasetIndex: me.index, _index: index }); }, addElements: function() { var me = this; var meta = me.getMeta(); var data = me.getDataset().data || []; var metaData = meta.data; var i, ilen; for (i = 0, ilen = data.length; i < ilen; ++i) { metaData[i] = metaData[i] || me.createMetaData(i); } meta.dataset = meta.dataset || me.createMetaDataset(); }, addElementAndReset: function(index) { var element = this.createMetaData(index); this.getMeta().data.splice(index, 0, element); this.updateElement(element, index, true); }, buildOrUpdateElements: function() { var me = this; var dataset = me.getDataset(); var data = dataset.data || (dataset.data = []); // In order to correctly handle data addition/deletion animation (an thus simulate // real-time charts), we need to monitor these data modifications and synchronize // the internal meta data accordingly. if (me._data !== data) { if (me._data) { // This case happens when the user replaced the data array instance. unlistenArrayEvents(me._data, me); } listenArrayEvents(data, me); me._data = data; } // Re-sync meta data in case the user replaced the data array or if we missed // any updates and so make sure that we handle number of datapoints changing. me.resyncElements(); }, update: helpers.noop, transition: function(easingValue) { var meta = this.getMeta(); var elements = meta.data || []; var ilen = elements.length; var i = 0; for (; i < ilen; ++i) { elements[i].transition(easingValue); } if (meta.dataset) { meta.dataset.transition(easingValue); } }, draw: function() { var meta = this.getMeta(); var elements = meta.data || []; var ilen = elements.length; var i = 0; if (meta.dataset) { meta.dataset.draw(); } for (; i < ilen; ++i) { elements[i].draw(); } }, removeHoverStyle: function(element, elementOpts) { var dataset = this.chart.data.datasets[element._datasetIndex]; var index = element._index; var custom = element.custom || {}; var valueOrDefault = helpers.valueAtIndexOrDefault; var model = element._model; model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor); model.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor); model.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth); }, setHoverStyle: function(element) { var dataset = this.chart.data.datasets[element._datasetIndex]; var index = element._index; var custom = element.custom || {}; var valueOrDefault = helpers.valueAtIndexOrDefault; var getHoverColor = helpers.getHoverColor; var model = element._model; model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor)); model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor)); model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); }, /** * @private */ resyncElements: function() { var me = this; var meta = me.getMeta(); var data = me.getDataset().data; var numMeta = meta.data.length; var numData = data.length; if (numData < numMeta) { meta.data.splice(numData, numMeta - numData); } else if (numData > numMeta) { me.insertElements(numMeta, numData - numMeta); } }, /** * @private */ insertElements: function(start, count) { for (var i = 0; i < count; ++i) { this.addElementAndReset(start + i); } }, /** * @private */ onDataPush: function() { this.insertElements(this.getDataset().data.length - 1, arguments.length); }, /** * @private */ onDataPop: function() { this.getMeta().data.pop(); }, /** * @private */ onDataShift: function() { this.getMeta().data.shift(); }, /** * @private */ onDataSplice: function(start, count) { this.getMeta().data.splice(start, count); this.insertElements(start, arguments.length - 2); }, /** * @private */ onDataUnshift: function() { this.insertElements(0, arguments.length); } }); Chart.DatasetController.extend = helpers.inherits; }; },{"45":45}],25:[function(require,module,exports){ 'use strict'; var helpers = require(45); module.exports = { /** * @private */ _set: function(scope, values) { return helpers.merge(this[scope] || (this[scope] = {}), values); } }; },{"45":45}],26:[function(require,module,exports){ 'use strict'; var color = require(3); var helpers = require(45); function interpolate(start, view, model, ease) { var keys = Object.keys(model); var i, ilen, key, actual, origin, target, type, c0, c1; for (i = 0, ilen = keys.length; i < ilen; ++i) { key = keys[i]; target = model[key]; // if a value is added to the model after pivot() has been called, the view // doesn't contain it, so let's initialize the view to the target value. if (!view.hasOwnProperty(key)) { view[key] = target; } actual = view[key]; if (actual === target || key[0] === '_') { continue; } if (!start.hasOwnProperty(key)) { start[key] = actual; } origin = start[key]; type = typeof target; if (type === typeof origin) { if (type === 'string') { c0 = color(origin); if (c0.valid) { c1 = color(target); if (c1.valid) { view[key] = c1.mix(c0, ease).rgbString(); continue; } } } else if (type === 'number' && isFinite(origin) && isFinite(target)) { view[key] = origin + (target - origin) * ease; continue; } } view[key] = target; } } var Element = function(configuration) { helpers.extend(this, configuration); this.initialize.apply(this, arguments); }; helpers.extend(Element.prototype, { initialize: function() { this.hidden = false; }, pivot: function() { var me = this; if (!me._view) { me._view = helpers.clone(me._model); } me._start = {}; return me; }, transition: function(ease) { var me = this; var model = me._model; var start = me._start; var view = me._view; // No animation -> No Transition if (!model || ease === 1) { me._view = model; me._start = null; return me; } if (!view) { view = me._view = {}; } if (!start) { start = me._start = {}; } interpolate(start, view, model, ease); return me; }, tooltipPosition: function() { return { x: this._model.x, y: this._model.y }; }, hasValue: function() { return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y); } }); Element.extend = helpers.inherits; module.exports = Element; },{"3":3,"45":45}],27:[function(require,module,exports){ /* global window: false */ /* global document: false */ 'use strict'; var color = require(3); var defaults = require(25); var helpers = require(45); module.exports = function(Chart) { // -- Basic js utility methods helpers.configMerge = function(/* objects ... */) { return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), { merger: function(key, target, source, options) { var tval = target[key] || {}; var sval = source[key]; if (key === 'scales') { // scale config merging is complex. Add our own function here for that target[key] = helpers.scaleMerge(tval, sval); } else if (key === 'scale') { // used in polar area & radar charts since there is only one scale target[key] = helpers.merge(tval, [Chart.scaleService.getScaleDefaults(sval.type), sval]); } else { helpers._merger(key, target, source, options); } } }); }; helpers.scaleMerge = function(/* objects ... */) { return helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), { merger: function(key, target, source, options) { if (key === 'xAxes' || key === 'yAxes') { var slen = source[key].length; var i, type, scale; if (!target[key]) { target[key] = []; } for (i = 0; i < slen; ++i) { scale = source[key][i]; type = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear'); if (i >= target[key].length) { target[key].push({}); } if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { // new/untyped scale or type changed: let's apply the new defaults // then merge source scale to correctly overwrite the defaults. helpers.merge(target[key][i], [Chart.scaleService.getScaleDefaults(type), scale]); } else { // scales type are the same helpers.merge(target[key][i], scale); } } } else { helpers._merger(key, target, source, options); } } }); }; helpers.where = function(collection, filterCallback) { if (helpers.isArray(collection) && Array.prototype.filter) { return collection.filter(filterCallback); } var filtered = []; helpers.each(collection, function(item) { if (filterCallback(item)) { filtered.push(item); } }); return filtered; }; helpers.findIndex = Array.prototype.findIndex ? function(array, callback, scope) { return array.findIndex(callback, scope); } : function(array, callback, scope) { scope = scope === undefined ? array : scope; for (var i = 0, ilen = array.length; i < ilen; ++i) { if (callback.call(scope, array[i], i, array)) { return i; } } return -1; }; helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { // Default to start of the array if (helpers.isNullOrUndef(startIndex)) { startIndex = -1; } for (var i = startIndex + 1; i < arrayToSearch.length; i++) { var currentItem = arrayToSearch[i]; if (filterCallback(currentItem)) { return currentItem; } } }; helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { // Default to end of the array if (helpers.isNullOrUndef(startIndex)) { startIndex = arrayToSearch.length; } for (var i = startIndex - 1; i >= 0; i--) { var currentItem = arrayToSearch[i]; if (filterCallback(currentItem)) { return currentItem; } } }; // -- Math methods helpers.isNumber = function(n) { return !isNaN(parseFloat(n)) && isFinite(n); }; helpers.almostEquals = function(x, y, epsilon) { return Math.abs(x - y) < epsilon; }; helpers.almostWhole = function(x, epsilon) { var rounded = Math.round(x); return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); }; helpers.max = function(array) { return array.reduce(function(max, value) { if (!isNaN(value)) { return Math.max(max, value); } return max; }, Number.NEGATIVE_INFINITY); }; helpers.min = function(array) { return array.reduce(function(min, value) { if (!isNaN(value)) { return Math.min(min, value); } return min; }, Number.POSITIVE_INFINITY); }; helpers.sign = Math.sign ? function(x) { return Math.sign(x); } : function(x) { x = +x; // convert to a number if (x === 0 || isNaN(x)) { return x; } return x > 0 ? 1 : -1; }; helpers.log10 = Math.log10 ? function(x) { return Math.log10(x); } : function(x) { return Math.log(x) / Math.LN10; }; helpers.toRadians = function(degrees) { return degrees * (Math.PI / 180); }; helpers.toDegrees = function(radians) { return radians * (180 / Math.PI); }; // Gets the angle from vertical upright to the point about a centre. helpers.getAngleFromPoint = function(centrePoint, anglePoint) { var distanceFromXCenter = anglePoint.x - centrePoint.x; var distanceFromYCenter = anglePoint.y - centrePoint.y; var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); if (angle < (-0.5 * Math.PI)) { angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] } return { angle: angle, distance: radialDistanceFromCenter }; }; helpers.distanceBetweenPoints = function(pt1, pt2) { return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); }; helpers.aliasPixel = function(pixelWidth) { return (pixelWidth % 2 === 0) ? 0 : 0.5; }; helpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) { // Props to Rob Spencer at scaled innovation for his post on splining between points // http://scaledinnovation.com/analytics/splines/aboutSplines.html // This function must also respect "skipped" points var previous = firstPoint.skip ? middlePoint : firstPoint; var current = middlePoint; var next = afterPoint.skip ? middlePoint : afterPoint; var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); var s01 = d01 / (d01 + d12); var s12 = d12 / (d01 + d12); // If all points are the same, s01 & s02 will be inf s01 = isNaN(s01) ? 0 : s01; s12 = isNaN(s12) ? 0 : s12; var fa = t * s01; // scaling factor for triangle Ta var fb = t * s12; return { previous: { x: current.x - fa * (next.x - previous.x), y: current.y - fa * (next.y - previous.y) }, next: { x: current.x + fb * (next.x - previous.x), y: current.y + fb * (next.y - previous.y) } }; }; helpers.EPSILON = Number.EPSILON || 1e-14; helpers.splineCurveMonotone = function(points) { // This function calculates Bézier control points in a similar way than |splineCurve|, // but preserves monotonicity of the provided data and ensures no local extremums are added // between the dataset discrete points due to the interpolation. // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation var pointsWithTangents = (points || []).map(function(point) { return { model: point._model, deltaK: 0, mK: 0 }; }); // Calculate slopes (deltaK) and initialize tangents (mK) var pointsLen = pointsWithTangents.length; var i, pointBefore, pointCurrent, pointAfter; for (i = 0; i < pointsLen; ++i) { pointCurrent = pointsWithTangents[i]; if (pointCurrent.model.skip) { continue; } pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; if (pointAfter && !pointAfter.model.skip) { var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; } if (!pointBefore || pointBefore.model.skip) { pointCurrent.mK = pointCurrent.deltaK; } else if (!pointAfter || pointAfter.model.skip) { pointCurrent.mK = pointBefore.deltaK; } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { pointCurrent.mK = 0; } else { pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; } } // Adjust tangents to ensure monotonic properties var alphaK, betaK, tauK, squaredMagnitude; for (i = 0; i < pointsLen - 1; ++i) { pointCurrent = pointsWithTangents[i]; pointAfter = pointsWithTangents[i + 1]; if (pointCurrent.model.skip || pointAfter.model.skip) { continue; } if (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { pointCurrent.mK = pointAfter.mK = 0; continue; } alphaK = pointCurrent.mK / pointCurrent.deltaK; betaK = pointAfter.mK / pointCurrent.deltaK; squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); if (squaredMagnitude <= 9) { continue; } tauK = 3 / Math.sqrt(squaredMagnitude); pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; pointAfter.mK = betaK * tauK * pointCurrent.deltaK; } // Compute control points var deltaX; for (i = 0; i < pointsLen; ++i) { pointCurrent = pointsWithTangents[i]; if (pointCurrent.model.skip) { continue; } pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; if (pointBefore && !pointBefore.model.skip) { deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; } if (pointAfter && !pointAfter.model.skip) { deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; } } }; helpers.nextItem = function(collection, index, loop) { if (loop) { return index >= collection.length - 1 ? collection[0] : collection[index + 1]; } return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; }; helpers.previousItem = function(collection, index, loop) { if (loop) { return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; } return index <= 0 ? collection[0] : collection[index - 1]; }; // Implementation of the nice number algorithm used in determining where axis labels will go helpers.niceNum = function(range, round) { var exponent = Math.floor(helpers.log10(range)); var fraction = range / Math.pow(10, exponent); var niceFraction; if (round) { if (fraction < 1.5) { niceFraction = 1; } else if (fraction < 3) { niceFraction = 2; } else if (fraction < 7) { niceFraction = 5; } else { niceFraction = 10; } } else if (fraction <= 1.0) { niceFraction = 1; } else if (fraction <= 2) { niceFraction = 2; } else if (fraction <= 5) { niceFraction = 5; } else { niceFraction = 10; } return niceFraction * Math.pow(10, exponent); }; // Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ helpers.requestAnimFrame = (function() { if (typeof window === 'undefined') { return function(callback) { callback(); }; } return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { return window.setTimeout(callback, 1000 / 60); }; }()); // -- DOM methods helpers.getRelativePosition = function(evt, chart) { var mouseX, mouseY; var e = evt.originalEvent || evt; var canvas = evt.currentTarget || evt.srcElement; var boundingRect = canvas.getBoundingClientRect(); var touches = e.touches; if (touches && touches.length > 0) { mouseX = touches[0].clientX; mouseY = touches[0].clientY; } else { mouseX = e.clientX; mouseY = e.clientY; } // Scale mouse coordinates into canvas coordinates // by following the pattern laid out by 'jerryj' in the comments of // http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ var paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left')); var paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top')); var paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right')); var paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom')); var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); return { x: mouseX, y: mouseY }; }; // Private helper function to convert max-width/max-height values that may be percentages into a number function parseMaxStyle(styleValue, node, parentProperty) { var valueInPixels; if (typeof styleValue === 'string') { valueInPixels = parseInt(styleValue, 10); if (styleValue.indexOf('%') !== -1) { // percentage * size in dimension valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; } } else { valueInPixels = styleValue; } return valueInPixels; } /** * Returns if the given value contains an effective constraint. * @private */ function isConstrainedValue(value) { return value !== undefined && value !== null && value !== 'none'; } // Private helper to get a constraint dimension // @param domNode : the node to check the constraint on // @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight) // @param percentageProperty : property of parent to use when calculating width as a percentage // @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser function getConstraintDimension(domNode, maxStyle, percentageProperty) { var view = document.defaultView; var parentNode = domNode.parentNode; var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; var hasCNode = isConstrainedValue(constrainedNode); var hasCContainer = isConstrainedValue(constrainedContainer); var infinity = Number.POSITIVE_INFINITY; if (hasCNode || hasCContainer) { return Math.min( hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); } return 'none'; } // returns Number or undefined if no constraint helpers.getConstraintWidth = function(domNode) { return getConstraintDimension(domNode, 'max-width', 'clientWidth'); }; // returns Number or undefined if no constraint helpers.getConstraintHeight = function(domNode) { return getConstraintDimension(domNode, 'max-height', 'clientHeight'); }; helpers.getMaximumWidth = function(domNode) { var container = domNode.parentNode; if (!container) { return domNode.clientWidth; } var paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10); var paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10); var w = container.clientWidth - paddingLeft - paddingRight; var cw = helpers.getConstraintWidth(domNode); return isNaN(cw) ? w : Math.min(w, cw); }; helpers.getMaximumHeight = function(domNode) { var container = domNode.parentNode; if (!container) { return domNode.clientHeight; } var paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10); var paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10); var h = container.clientHeight - paddingTop - paddingBottom; var ch = helpers.getConstraintHeight(domNode); return isNaN(ch) ? h : Math.min(h, ch); }; helpers.getStyle = function(el, property) { return el.currentStyle ? el.currentStyle[property] : document.defaultView.getComputedStyle(el, null).getPropertyValue(property); }; helpers.retinaScale = function(chart, forceRatio) { var pixelRatio = chart.currentDevicePixelRatio = forceRatio || window.devicePixelRatio || 1; if (pixelRatio === 1) { return; } var canvas = chart.canvas; var height = chart.height; var width = chart.width; canvas.height = height * pixelRatio; canvas.width = width * pixelRatio; chart.ctx.scale(pixelRatio, pixelRatio); // If no style has been set on the canvas, the render size is used as display size, // making the chart visually bigger, so let's enforce it to the "correct" values. // See https://github.com/chartjs/Chart.js/issues/3575 canvas.style.height = height + 'px'; canvas.style.width = width + 'px'; }; // -- Canvas methods helpers.fontString = function(pixelSize, fontStyle, fontFamily) { return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; }; helpers.longestText = function(ctx, font, arrayOfThings, cache) { cache = cache || {}; var data = cache.data = cache.data || {}; var gc = cache.garbageCollect = cache.garbageCollect || []; if (cache.font !== font) { data = cache.data = {}; gc = cache.garbageCollect = []; cache.font = font; } ctx.font = font; var longest = 0; helpers.each(arrayOfThings, function(thing) { // Undefined strings and arrays should not be measured if (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) { longest = helpers.measureText(ctx, data, gc, longest, thing); } else if (helpers.isArray(thing)) { // if it is an array lets measure each element // to do maybe simplify this function a bit so we can do this more recursively? helpers.each(thing, function(nestedThing) { // Undefined strings and arrays should not be measured if (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) { longest = helpers.measureText(ctx, data, gc, longest, nestedThing); } }); } }); var gcLen = gc.length / 2; if (gcLen > arrayOfThings.length) { for (var i = 0; i < gcLen; i++) { delete data[gc[i]]; } gc.splice(0, gcLen); } return longest; }; helpers.measureText = function(ctx, data, gc, longest, string) { var textWidth = data[string]; if (!textWidth) { textWidth = data[string] = ctx.measureText(string).width; gc.push(string); } if (textWidth > longest) { longest = textWidth; } return longest; }; helpers.numberOfLabelLines = function(arrayOfThings) { var numberOfLines = 1; helpers.each(arrayOfThings, function(thing) { if (helpers.isArray(thing)) { if (thing.length > numberOfLines) { numberOfLines = thing.length; } } }); return numberOfLines; }; helpers.color = !color ? function(value) { console.error('Color.js not found!'); return value; } : function(value) { /* global CanvasGradient */ if (value instanceof CanvasGradient) { value = defaults.global.defaultColor; } return color(value); }; helpers.getHoverColor = function(colorValue) { /* global CanvasPattern */ return (colorValue instanceof CanvasPattern) ? colorValue : helpers.color(colorValue).saturate(0.5).darken(0.1).rgbString(); }; }; },{"25":25,"3":3,"45":45}],28:[function(require,module,exports){ 'use strict'; var helpers = require(45); /** * Helper function to get relative position for an event * @param {Event|IEvent} event - The event to get the position for * @param {Chart} chart - The chart * @returns {Point} the event position */ function getRelativePosition(e, chart) { if (e.native) { return { x: e.x, y: e.y }; } return helpers.getRelativePosition(e, chart); } /** * Helper function to traverse all of the visible elements in the chart * @param chart {chart} the chart * @param handler {Function} the callback to execute for each visible item */ function parseVisibleItems(chart, handler) { var datasets = chart.data.datasets; var meta, i, j, ilen, jlen; for (i = 0, ilen = datasets.length; i < ilen; ++i) { if (!chart.isDatasetVisible(i)) { continue; } meta = chart.getDatasetMeta(i); for (j = 0, jlen = meta.data.length; j < jlen; ++j) { var element = meta.data[j]; if (!element._view.skip) { handler(element); } } } } /** * Helper function to get the items that intersect the event position * @param items {ChartElement[]} elements to filter * @param position {Point} the point to be nearest to * @return {ChartElement[]} the nearest items */ function getIntersectItems(chart, position) { var elements = []; parseVisibleItems(chart, function(element) { if (element.inRange(position.x, position.y)) { elements.push(element); } }); return elements; } /** * Helper function to get the items nearest to the event position considering all visible items in teh chart * @param chart {Chart} the chart to look at elements from * @param position {Point} the point to be nearest to * @param intersect {Boolean} if true, only consider items that intersect the position * @param distanceMetric {Function} function to provide the distance between points * @return {ChartElement[]} the nearest items */ function getNearestItems(chart, position, intersect, distanceMetric) { var minDistance = Number.POSITIVE_INFINITY; var nearestItems = []; parseVisibleItems(chart, function(element) { if (intersect && !element.inRange(position.x, position.y)) { return; } var center = element.getCenterPoint(); var distance = distanceMetric(position, center); if (distance < minDistance) { nearestItems = [element]; minDistance = distance; } else if (distance === minDistance) { // Can have multiple items at the same distance in which case we sort by size nearestItems.push(element); } }); return nearestItems; } /** * Get a distance metric function for two points based on the * axis mode setting * @param {String} axis the axis mode. x|y|xy */ function getDistanceMetricForAxis(axis) { var useX = axis.indexOf('x') !== -1; var useY = axis.indexOf('y') !== -1; return function(pt1, pt2) { var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); }; } function indexMode(chart, e, options) { var position = getRelativePosition(e, chart); // Default axis for index mode is 'x' to match old behaviour options.axis = options.axis || 'x'; var distanceMetric = getDistanceMetricForAxis(options.axis); var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); var elements = []; if (!items.length) { return []; } chart.data.datasets.forEach(function(dataset, datasetIndex) { if (chart.isDatasetVisible(datasetIndex)) { var meta = chart.getDatasetMeta(datasetIndex); var element = meta.data[items[0]._index]; // don't count items that are skipped (null data) if (element && !element._view.skip) { elements.push(element); } } }); return elements; } /** * @interface IInteractionOptions */ /** * If true, only consider items that intersect the point * @name IInterfaceOptions#boolean * @type Boolean */ /** * Contains interaction related functions * @namespace Chart.Interaction */ module.exports = { // Helper function for different modes modes: { single: function(chart, e) { var position = getRelativePosition(e, chart); var elements = []; parseVisibleItems(chart, function(element) { if (element.inRange(position.x, position.y)) { elements.push(element); return elements; } }); return elements.slice(0, 1); }, /** * @function Chart.Interaction.modes.label * @deprecated since version 2.4.0 * @todo remove at version 3 * @private */ label: indexMode, /** * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item * @function Chart.Interaction.modes.index * @since v2.4.0 * @param chart {chart} the chart we are returning items from * @param e {Event} the event we are find things at * @param options {IInteractionOptions} options to use during interaction * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ index: indexMode, /** * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something * If the options.intersect is false, we find the nearest item and return the items in that dataset * @function Chart.Interaction.modes.dataset * @param chart {chart} the chart we are returning items from * @param e {Event} the event we are find things at * @param options {IInteractionOptions} options to use during interaction * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ dataset: function(chart, e, options) { var position = getRelativePosition(e, chart); options.axis = options.axis || 'xy'; var distanceMetric = getDistanceMetricForAxis(options.axis); var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); if (items.length > 0) { items = chart.getDatasetMeta(items[0]._datasetIndex).data; } return items; }, /** * @function Chart.Interaction.modes.x-axis * @deprecated since version 2.4.0. Use index mode and intersect == true * @todo remove at version 3 * @private */ 'x-axis': function(chart, e) { return indexMode(chart, e, {intersect: false}); }, /** * Point mode returns all elements that hit test based on the event position * of the event * @function Chart.Interaction.modes.intersect * @param chart {chart} the chart we are returning items from * @param e {Event} the event we are find things at * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ point: function(chart, e) { var position = getRelativePosition(e, chart); return getIntersectItems(chart, position); }, /** * nearest mode returns the element closest to the point * @function Chart.Interaction.modes.intersect * @param chart {chart} the chart we are returning items from * @param e {Event} the event we are find things at * @param options {IInteractionOptions} options to use * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ nearest: function(chart, e, options) { var position = getRelativePosition(e, chart); options.axis = options.axis || 'xy'; var distanceMetric = getDistanceMetricForAxis(options.axis); var nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric); // We have multiple items at the same distance from the event. Now sort by smallest if (nearestItems.length > 1) { nearestItems.sort(function(a, b) { var sizeA = a.getArea(); var sizeB = b.getArea(); var ret = sizeA - sizeB; if (ret === 0) { // if equal sort by dataset index ret = a._datasetIndex - b._datasetIndex; } return ret; }); } // Return only 1 item return nearestItems.slice(0, 1); }, /** * x mode returns the elements that hit-test at the current x coordinate * @function Chart.Interaction.modes.x * @param chart {chart} the chart we are returning items from * @param e {Event} the event we are find things at * @param options {IInteractionOptions} options to use * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ x: function(chart, e, options) { var position = getRelativePosition(e, chart); var items = []; var intersectsItem = false; parseVisibleItems(chart, function(element) { if (element.inXRange(position.x)) { items.push(element); } if (element.inRange(position.x, position.y)) { intersectsItem = true; } }); // If we want to trigger on an intersect and we don't have any items // that intersect the position, return nothing if (options.intersect && !intersectsItem) { items = []; } return items; }, /** * y mode returns the elements that hit-test at the current y coordinate * @function Chart.Interaction.modes.y * @param chart {chart} the chart we are returning items from * @param e {Event} the event we are find things at * @param options {IInteractionOptions} options to use * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned */ y: function(chart, e, options) { var position = getRelativePosition(e, chart); var items = []; var intersectsItem = false; parseVisibleItems(chart, function(element) { if (element.inYRange(position.y)) { items.push(element); } if (element.inRange(position.x, position.y)) { intersectsItem = true; } }); // If we want to trigger on an intersect and we don't have any items // that intersect the position, return nothing if (options.intersect && !intersectsItem) { items = []; } return items; } } }; },{"45":45}],29:[function(require,module,exports){ 'use strict'; var defaults = require(25); defaults._set('global', { responsive: true, responsiveAnimationDuration: 0, maintainAspectRatio: true, events: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'], hover: { onHover: null, mode: 'nearest', intersect: true, animationDuration: 400 }, onClick: null, defaultColor: 'rgba(0,0,0,0.1)', defaultFontColor: '#666', defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", defaultFontSize: 12, defaultFontStyle: 'normal', showLines: true, // Element defaults defined in element extensions elements: {}, // Layout options such as padding layout: { padding: { top: 0, right: 0, bottom: 0, left: 0 } } }); module.exports = function() { // Occupy the global variable of Chart, and create a simple base class var Chart = function(item, config) { this.construct(item, config); return this; }; Chart.Chart = Chart; return Chart; }; },{"25":25}],30:[function(require,module,exports){ 'use strict'; var helpers = require(45); module.exports = function(Chart) { function filterByPosition(array, position) { return helpers.where(array, function(v) { return v.position === position; }); } function sortByWeight(array, reverse) { array.forEach(function(v, i) { v._tmpIndex_ = i; return v; }); array.sort(function(a, b) { var v0 = reverse ? b : a; var v1 = reverse ? a : b; return v0.weight === v1.weight ? v0._tmpIndex_ - v1._tmpIndex_ : v0.weight - v1.weight; }); array.forEach(function(v) { delete v._tmpIndex_; }); } /** * @interface ILayoutItem * @prop {String} position - The position of the item in the chart layout. Possible values are * 'left', 'top', 'right', 'bottom', and 'chartArea' * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) * @prop {Function} update - Takes two parameters: width and height. Returns size of item * @prop {Function} getPadding - Returns an object with padding on the edges * @prop {Number} width - Width of item. Must be valid after update() * @prop {Number} height - Height of item. Must be valid after update() * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update */ // The layout service is very self explanatory. It's responsible for the layout within a chart. // Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need // It is this service's responsibility of carrying out that layout. Chart.layoutService = { defaults: {}, /** * Register a box to a chart. * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. * @param {Chart} chart - the chart to use * @param {ILayoutItem} item - the item to add to be layed out */ addBox: function(chart, item) { if (!chart.boxes) { chart.boxes = []; } // initialize item with default values item.fullWidth = item.fullWidth || false; item.position = item.position || 'top'; item.weight = item.weight || 0; chart.boxes.push(item); }, /** * Remove a layoutItem from a chart * @param {Chart} chart - the chart to remove the box from * @param {Object} layoutItem - the item to remove from the layout */ removeBox: function(chart, layoutItem) { var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; if (index !== -1) { chart.boxes.splice(index, 1); } }, /** * Sets (or updates) options on the given `item`. * @param {Chart} chart - the chart in which the item lives (or will be added to) * @param {Object} item - the item to configure with the given options * @param {Object} options - the new item options. */ configure: function(chart, item, options) { var props = ['fullWidth', 'position', 'weight']; var ilen = props.length; var i = 0; var prop; for (; i < ilen; ++i) { prop = props[i]; if (options.hasOwnProperty(prop)) { item[prop] = options[prop]; } } }, /** * Fits boxes of the given chart into the given size by having each box measure itself * then running a fitting algorithm * @param {Chart} chart - the chart * @param {Number} width - the width to fit into * @param {Number} height - the height to fit into */ update: function(chart, width, height) { if (!chart) { return; } var layoutOptions = chart.options.layout || {}; var padding = helpers.options.toPadding(layoutOptions.padding); var leftPadding = padding.left; var rightPadding = padding.right; var topPadding = padding.top; var bottomPadding = padding.bottom; var leftBoxes = filterByPosition(chart.boxes, 'left'); var rightBoxes = filterByPosition(chart.boxes, 'right'); var topBoxes = filterByPosition(chart.boxes, 'top'); var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); // Sort boxes by weight. A higher weight is further away from the chart area sortByWeight(leftBoxes, true); sortByWeight(rightBoxes, false); sortByWeight(topBoxes, true); sortByWeight(bottomBoxes, false); // Essentially we now have any number of boxes on each of the 4 sides. // Our canvas looks like the following. // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and // B1 is the bottom axis // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays // These locations are single-box locations only, when trying to register a chartArea location that is already taken, // an error will be thrown. // // |----------------------------------------------------| // | T1 (Full Width) | // |----------------------------------------------------| // | | | T2 | | // | |----|-------------------------------------|----| // | | | C1 | | C2 | | // | | |----| |----| | // | | | | | // | L1 | L2 | ChartArea (C0) | R1 | // | | | | | // | | |----| |----| | // | | | C3 | | C4 | | // | |----|-------------------------------------|----| // | | | B1 | | // |----------------------------------------------------| // | B2 (Full Width) | // |----------------------------------------------------| // // What we do to find the best sizing, we do the following // 1. Determine the minimum size of the chart area. // 2. Split the remaining width equally between each vertical axis // 3. Split the remaining height equally between each horizontal axis // 4. Give each layout the maximum size it can be. The layout will return it's minimum size // 5. Adjust the sizes of each axis based on it's minimum reported size. // 6. Refit each axis // 7. Position each axis in the final location // 8. Tell the chart the final location of the chart area // 9. Tell any axes that overlay the chart area the positions of the chart area // Step 1 var chartWidth = width - leftPadding - rightPadding; var chartHeight = height - topPadding - bottomPadding; var chartAreaWidth = chartWidth / 2; // min 50% var chartAreaHeight = chartHeight / 2; // min 50% // Step 2 var verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length); // Step 3 var horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length); // Step 4 var maxChartAreaWidth = chartWidth; var maxChartAreaHeight = chartHeight; var minBoxSizes = []; function getMinimumBoxSize(box) { var minSize; var isHorizontal = box.isHorizontal(); if (isHorizontal) { minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight); maxChartAreaHeight -= minSize.height; } else { minSize = box.update(verticalBoxWidth, chartAreaHeight); maxChartAreaWidth -= minSize.width; } minBoxSizes.push({ horizontal: isHorizontal, minSize: minSize, box: box, }); } helpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize); // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) var maxHorizontalLeftPadding = 0; var maxHorizontalRightPadding = 0; var maxVerticalTopPadding = 0; var maxVerticalBottomPadding = 0; helpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) { if (horizontalBox.getPadding) { var boxPadding = horizontalBox.getPadding(); maxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left); maxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right); } }); helpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) { if (verticalBox.getPadding) { var boxPadding = verticalBox.getPadding(); maxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top); maxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom); } }); // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could // be if the axes are drawn at their minimum sizes. // Steps 5 & 6 var totalLeftBoxesWidth = leftPadding; var totalRightBoxesWidth = rightPadding; var totalTopBoxesHeight = topPadding; var totalBottomBoxesHeight = bottomPadding; // Function to fit a box function fitBox(box) { var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) { return minBox.box === box; }); if (minBoxSize) { if (box.isHorizontal()) { var scaleMargin = { left: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding), right: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding), top: 0, bottom: 0 }; // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends // on the margin. Sometimes they need to increase in size slightly box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); } else { box.update(minBoxSize.minSize.width, maxChartAreaHeight); } } } // Update, and calculate the left and right margins for the horizontal boxes helpers.each(leftBoxes.concat(rightBoxes), fitBox); helpers.each(leftBoxes, function(box) { totalLeftBoxesWidth += box.width; }); helpers.each(rightBoxes, function(box) { totalRightBoxesWidth += box.width; }); // Set the Left and Right margins for the horizontal boxes helpers.each(topBoxes.concat(bottomBoxes), fitBox); // Figure out how much margin is on the top and bottom of the vertical boxes helpers.each(topBoxes, function(box) { totalTopBoxesHeight += box.height; }); helpers.each(bottomBoxes, function(box) { totalBottomBoxesHeight += box.height; }); function finalFitVerticalBox(box) { var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) { return minSize.box === box; }); var scaleMargin = { left: 0, right: 0, top: totalTopBoxesHeight, bottom: totalBottomBoxesHeight }; if (minBoxSize) { box.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin); } } // Let the left layout know the final margin helpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox); // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) totalLeftBoxesWidth = leftPadding; totalRightBoxesWidth = rightPadding; totalTopBoxesHeight = topPadding; totalBottomBoxesHeight = bottomPadding; helpers.each(leftBoxes, function(box) { totalLeftBoxesWidth += box.width; }); helpers.each(rightBoxes, function(box) { totalRightBoxesWidth += box.width; }); helpers.each(topBoxes, function(box) { totalTopBoxesHeight += box.height; }); helpers.each(bottomBoxes, function(box) { totalBottomBoxesHeight += box.height; }); // We may be adding some padding to account for rotated x axis labels var leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0); totalLeftBoxesWidth += leftPaddingAddition; totalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0); var topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0); totalTopBoxesHeight += topPaddingAddition; totalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0); // Figure out if our chart area changed. This would occur if the dataset layout label rotation // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do // without calling `fit` again var newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight; var newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth; if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { helpers.each(leftBoxes, function(box) { box.height = newMaxChartAreaHeight; }); helpers.each(rightBoxes, function(box) { box.height = newMaxChartAreaHeight; }); helpers.each(topBoxes, function(box) { if (!box.fullWidth) { box.width = newMaxChartAreaWidth; } }); helpers.each(bottomBoxes, function(box) { if (!box.fullWidth) { box.width = newMaxChartAreaWidth; } }); maxChartAreaHeight = newMaxChartAreaHeight; maxChartAreaWidth = newMaxChartAreaWidth; } // Step 7 - Position the boxes var left = leftPadding + leftPaddingAddition; var top = topPadding + topPaddingAddition; function placeBox(box) { if (box.isHorizontal()) { box.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth; box.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth; box.top = top; box.bottom = top + box.height; // Move to next point top = box.bottom; } else { box.left = left; box.right = left + box.width; box.top = totalTopBoxesHeight; box.bottom = totalTopBoxesHeight + maxChartAreaHeight; // Move to next point left = box.right; } } helpers.each(leftBoxes.concat(topBoxes), placeBox); // Account for chart width and height left += maxChartAreaWidth; top += maxChartAreaHeight; helpers.each(rightBoxes, placeBox); helpers.each(bottomBoxes, placeBox); // Step 8 chart.chartArea = { left: totalLeftBoxesWidth, top: totalTopBoxesHeight, right: totalLeftBoxesWidth + maxChartAreaWidth, bottom: totalTopBoxesHeight + maxChartAreaHeight }; // Step 9 helpers.each(chartAreaBoxes, function(box) { box.left = chart.chartArea.left; box.top = chart.chartArea.top; box.right = chart.chartArea.right; box.bottom = chart.chartArea.bottom; box.update(maxChartAreaWidth, maxChartAreaHeight); }); } }; }; },{"45":45}],31:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); defaults._set('global', { plugins: {} }); module.exports = function(Chart) { /** * The plugin service singleton * @namespace Chart.plugins * @since 2.1.0 */ Chart.plugins = { /** * Globally registered plugins. * @private */ _plugins: [], /** * This identifier is used to invalidate the descriptors cache attached to each chart * when a global plugin is registered or unregistered. In this case, the cache ID is * incremented and descriptors are regenerated during following API calls. * @private */ _cacheId: 0, /** * Registers the given plugin(s) if not already registered. * @param {Array|Object} plugins plugin instance(s). */ register: function(plugins) { var p = this._plugins; ([]).concat(plugins).forEach(function(plugin) { if (p.indexOf(plugin) === -1) { p.push(plugin); } }); this._cacheId++; }, /** * Unregisters the given plugin(s) only if registered. * @param {Array|Object} plugins plugin instance(s). */ unregister: function(plugins) { var p = this._plugins; ([]).concat(plugins).forEach(function(plugin) { var idx = p.indexOf(plugin); if (idx !== -1) { p.splice(idx, 1); } }); this._cacheId++; }, /** * Remove all registered plugins. * @since 2.1.5 */ clear: function() { this._plugins = []; this._cacheId++; }, /** * Returns the number of registered plugins? * @returns {Number} * @since 2.1.5 */ count: function() { return this._plugins.length; }, /** * Returns all registered plugin instances. * @returns {Array} array of plugin objects. * @since 2.1.5 */ getAll: function() { return this._plugins; }, /** * Calls enabled plugins for `chart` on the specified hook and with the given args. * This method immediately returns as soon as a plugin explicitly returns false. The * returned value can be used, for instance, to interrupt the current action. * @param {Object} chart - The chart instance for which plugins should be called. * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). * @param {Array} [args] - Extra arguments to apply to the hook call. * @returns {Boolean} false if any of the plugins return false, else returns true. */ notify: function(chart, hook, args) { var descriptors = this.descriptors(chart); var ilen = descriptors.length; var i, descriptor, plugin, params, method; for (i = 0; i < ilen; ++i) { descriptor = descriptors[i]; plugin = descriptor.plugin; method = plugin[hook]; if (typeof method === 'function') { params = [chart].concat(args || []); params.push(descriptor.options); if (method.apply(plugin, params) === false) { return false; } } } return true; }, /** * Returns descriptors of enabled plugins for the given chart. * @returns {Array} [{ plugin, options }] * @private */ descriptors: function(chart) { var cache = chart._plugins || (chart._plugins = {}); if (cache.id === this._cacheId) { return cache.descriptors; } var plugins = []; var descriptors = []; var config = (chart && chart.config) || {}; var options = (config.options && config.options.plugins) || {}; this._plugins.concat(config.plugins || []).forEach(function(plugin) { var idx = plugins.indexOf(plugin); if (idx !== -1) { return; } var id = plugin.id; var opts = options[id]; if (opts === false) { return; } if (opts === true) { opts = helpers.clone(defaults.global.plugins[id]); } plugins.push(plugin); descriptors.push({ plugin: plugin, options: opts || {} }); }); cache.descriptors = descriptors; cache.id = this._cacheId; return descriptors; } }; /** * Plugin extension hooks. * @interface IPlugin * @since 2.1.0 */ /** * @method IPlugin#beforeInit * @desc Called before initializing `chart`. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. */ /** * @method IPlugin#afterInit * @desc Called after `chart` has been initialized and before the first update. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeUpdate * @desc Called before updating `chart`. If any plugin returns `false`, the update * is cancelled (and thus subsequent render(s)) until another `update` is triggered. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart update. */ /** * @method IPlugin#afterUpdate * @desc Called after `chart` has been updated and before rendering. Note that this * hook will not be called if the chart update has been previously cancelled. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeDatasetsUpdate * @desc Called before updating the `chart` datasets. If any plugin returns `false`, * the datasets update is cancelled until another `update` is triggered. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. * @returns {Boolean} false to cancel the datasets update. * @since version 2.1.5 */ /** * @method IPlugin#afterDatasetsUpdate * @desc Called after the `chart` datasets have been updated. Note that this hook * will not be called if the datasets update has been previously cancelled. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. * @since version 2.1.5 */ /** * @method IPlugin#beforeDatasetUpdate * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin * returns `false`, the datasets update is cancelled until another `update` is triggered. * @param {Chart} chart - The chart instance. * @param {Object} args - The call arguments. * @param {Number} args.index - The dataset index. * @param {Object} args.meta - The dataset metadata. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart datasets drawing. */ /** * @method IPlugin#afterDatasetUpdate * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note * that this hook will not be called if the datasets update has been previously cancelled. * @param {Chart} chart - The chart instance. * @param {Object} args - The call arguments. * @param {Number} args.index - The dataset index. * @param {Object} args.meta - The dataset metadata. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeLayout * @desc Called before laying out `chart`. If any plugin returns `false`, * the layout update is cancelled until another `update` is triggered. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart layout. */ /** * @method IPlugin#afterLayout * @desc Called after the `chart` has been layed out. Note that this hook will not * be called if the layout update has been previously cancelled. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeRender * @desc Called before rendering `chart`. If any plugin returns `false`, * the rendering is cancelled until another `render` is triggered. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart rendering. */ /** * @method IPlugin#afterRender * @desc Called after the `chart` has been fully rendered (and animation completed). Note * that this hook will not be called if the rendering has been previously cancelled. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeDraw * @desc Called before drawing `chart` at every animation frame specified by the given * easing value. If any plugin returns `false`, the frame drawing is cancelled until * another `render` is triggered. * @param {Chart.Controller} chart - The chart instance. * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart drawing. */ /** * @method IPlugin#afterDraw * @desc Called after the `chart` has been drawn for the specific easing value. Note * that this hook will not be called if the drawing has been previously cancelled. * @param {Chart.Controller} chart - The chart instance. * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeDatasetsDraw * @desc Called before drawing the `chart` datasets. If any plugin returns `false`, * the datasets drawing is cancelled until another `render` is triggered. * @param {Chart.Controller} chart - The chart instance. * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart datasets drawing. */ /** * @method IPlugin#afterDatasetsDraw * @desc Called after the `chart` datasets have been drawn. Note that this hook * will not be called if the datasets drawing has been previously cancelled. * @param {Chart.Controller} chart - The chart instance. * @param {Number} easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeDatasetDraw * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing * is cancelled until another `render` is triggered. * @param {Chart} chart - The chart instance. * @param {Object} args - The call arguments. * @param {Number} args.index - The dataset index. * @param {Object} args.meta - The dataset metadata. * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart datasets drawing. */ /** * @method IPlugin#afterDatasetDraw * @desc Called after the `chart` datasets at the given `args.index` have been drawn * (datasets are drawn in the reverse order). Note that this hook will not be called * if the datasets drawing has been previously cancelled. * @param {Chart} chart - The chart instance. * @param {Object} args - The call arguments. * @param {Number} args.index - The dataset index. * @param {Object} args.meta - The dataset metadata. * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeTooltipDraw * @desc Called before drawing the `tooltip`. If any plugin returns `false`, * the tooltip drawing is cancelled until another `render` is triggered. * @param {Chart} chart - The chart instance. * @param {Object} args - The call arguments. * @param {Object} args.tooltip - The tooltip. * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. * @returns {Boolean} `false` to cancel the chart tooltip drawing. */ /** * @method IPlugin#afterTooltipDraw * @desc Called after drawing the `tooltip`. Note that this hook will not * be called if the tooltip drawing has been previously cancelled. * @param {Chart} chart - The chart instance. * @param {Object} args - The call arguments. * @param {Object} args.tooltip - The tooltip. * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. */ /** * @method IPlugin#beforeEvent * @desc Called before processing the specified `event`. If any plugin returns `false`, * the event will be discarded. * @param {Chart.Controller} chart - The chart instance. * @param {IEvent} event - The event object. * @param {Object} options - The plugin options. */ /** * @method IPlugin#afterEvent * @desc Called after the `event` has been consumed. Note that this hook * will not be called if the `event` has been previously discarded. * @param {Chart.Controller} chart - The chart instance. * @param {IEvent} event - The event object. * @param {Object} options - The plugin options. */ /** * @method IPlugin#resize * @desc Called after the chart as been resized. * @param {Chart.Controller} chart - The chart instance. * @param {Number} size - The new canvas display size (eq. canvas.style width & height). * @param {Object} options - The plugin options. */ /** * @method IPlugin#destroy * @desc Called after the chart as been destroyed. * @param {Chart.Controller} chart - The chart instance. * @param {Object} options - The plugin options. */ /** * Provided for backward compatibility, use Chart.plugins instead * @namespace Chart.pluginService * @deprecated since version 2.1.5 * @todo remove at version 3 * @private */ Chart.pluginService = Chart.plugins; /** * Provided for backward compatibility, inheriting from Chart.PlugingBase has no * effect, instead simply create/register plugins via plain JavaScript objects. * @interface Chart.PluginBase * @deprecated since version 2.5.0 * @todo remove at version 3 * @private */ Chart.PluginBase = Element.extend({}); }; },{"25":25,"26":26,"45":45}],32:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); var Ticks = require(34); defaults._set('scale', { display: true, position: 'left', offset: false, // grid line settings gridLines: { display: true, color: 'rgba(0, 0, 0, 0.1)', lineWidth: 1, drawBorder: true, drawOnChartArea: true, drawTicks: true, tickMarkLength: 10, zeroLineWidth: 1, zeroLineColor: 'rgba(0,0,0,0.25)', zeroLineBorderDash: [], zeroLineBorderDashOffset: 0.0, offsetGridLines: false, borderDash: [], borderDashOffset: 0.0 }, // scale label scaleLabel: { // display property display: false, // actual label labelString: '', // line height lineHeight: 1.2, // top/bottom padding padding: { top: 4, bottom: 4 } }, // label settings ticks: { beginAtZero: false, minRotation: 0, maxRotation: 50, mirror: false, padding: 0, reverse: false, display: true, autoSkip: true, autoSkipPadding: 0, labelOffset: 0, // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. callback: Ticks.formatters.values, minor: {}, major: {} } }); function labelsFromTicks(ticks) { var labels = []; var i, ilen; for (i = 0, ilen = ticks.length; i < ilen; ++i) { labels.push(ticks[i].label); } return labels; } function getLineValue(scale, index, offsetGridLines) { var lineValue = scale.getPixelForTick(index); if (offsetGridLines) { if (index === 0) { lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; } else { lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; } } return lineValue; } module.exports = function(Chart) { function computeTextSize(context, tick, font) { return helpers.isArray(tick) ? helpers.longestText(context, font, tick) : context.measureText(tick).width; } function parseFontOptions(options) { var valueOrDefault = helpers.valueOrDefault; var globalDefaults = defaults.global; var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); var style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle); var family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily); return { size: size, style: style, family: family, font: helpers.fontString(size, style, family) }; } function parseLineHeight(options) { return helpers.options.toLineHeight( helpers.valueOrDefault(options.lineHeight, 1.2), helpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize)); } Chart.Scale = Element.extend({ /** * Get the padding needed for the scale * @method getPadding * @private * @returns {Padding} the necessary padding */ getPadding: function() { var me = this; return { left: me.paddingLeft || 0, top: me.paddingTop || 0, right: me.paddingRight || 0, bottom: me.paddingBottom || 0 }; }, /** * Returns the scale tick objects ({label, major}) * @since 2.7 */ getTicks: function() { return this._ticks; }, // These methods are ordered by lifecyle. Utilities then follow. // Any function defined here is inherited by all scale types. // Any function can be extended by the scale type mergeTicksOptions: function() { var ticks = this.options.ticks; if (ticks.minor === false) { ticks.minor = { display: false }; } if (ticks.major === false) { ticks.major = { display: false }; } for (var key in ticks) { if (key !== 'major' && key !== 'minor') { if (typeof ticks.minor[key] === 'undefined') { ticks.minor[key] = ticks[key]; } if (typeof ticks.major[key] === 'undefined') { ticks.major[key] = ticks[key]; } } } }, beforeUpdate: function() { helpers.callback(this.options.beforeUpdate, [this]); }, update: function(maxWidth, maxHeight, margins) { var me = this; var i, ilen, labels, label, ticks, tick; // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) me.beforeUpdate(); // Absorb the master measurements me.maxWidth = maxWidth; me.maxHeight = maxHeight; me.margins = helpers.extend({ left: 0, right: 0, top: 0, bottom: 0 }, margins); me.longestTextCache = me.longestTextCache || {}; // Dimensions me.beforeSetDimensions(); me.setDimensions(); me.afterSetDimensions(); // Data min/max me.beforeDataLimits(); me.determineDataLimits(); me.afterDataLimits(); // Ticks - `this.ticks` is now DEPRECATED! // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member // and must not be accessed directly from outside this class. `this.ticks` being // around for long time and not marked as private, we can't change its structure // without unexpected breaking changes. If you need to access the scale ticks, // use scale.getTicks() instead. me.beforeBuildTicks(); // New implementations should return an array of objects but for BACKWARD COMPAT, // we still support no return (`this.ticks` internally set by calling this method). ticks = me.buildTicks() || []; me.afterBuildTicks(); me.beforeTickToLabelConversion(); // New implementations should return the formatted tick labels but for BACKWARD // COMPAT, we still support no return (`this.ticks` internally changed by calling // this method and supposed to contain only string values). labels = me.convertTicksToLabels(ticks) || me.ticks; me.afterTickToLabelConversion(); me.ticks = labels; // BACKWARD COMPATIBILITY // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) for (i = 0, ilen = labels.length; i < ilen; ++i) { label = labels[i]; tick = ticks[i]; if (!tick) { ticks.push(tick = { label: label, major: false }); } else { tick.label = label; } } me._ticks = ticks; // Tick Rotation me.beforeCalculateTickRotation(); me.calculateTickRotation(); me.afterCalculateTickRotation(); // Fit me.beforeFit(); me.fit(); me.afterFit(); // me.afterUpdate(); return me.minSize; }, afterUpdate: function() { helpers.callback(this.options.afterUpdate, [this]); }, // beforeSetDimensions: function() { helpers.callback(this.options.beforeSetDimensions, [this]); }, setDimensions: function() { var me = this; // Set the unconstrained dimension before label rotation if (me.isHorizontal()) { // Reset position before calculating rotation me.width = me.maxWidth; me.left = 0; me.right = me.width; } else { me.height = me.maxHeight; // Reset position before calculating rotation me.top = 0; me.bottom = me.height; } // Reset padding me.paddingLeft = 0; me.paddingTop = 0; me.paddingRight = 0; me.paddingBottom = 0; }, afterSetDimensions: function() { helpers.callback(this.options.afterSetDimensions, [this]); }, // Data limits beforeDataLimits: function() { helpers.callback(this.options.beforeDataLimits, [this]); }, determineDataLimits: helpers.noop, afterDataLimits: function() { helpers.callback(this.options.afterDataLimits, [this]); }, // beforeBuildTicks: function() { helpers.callback(this.options.beforeBuildTicks, [this]); }, buildTicks: helpers.noop, afterBuildTicks: function() { helpers.callback(this.options.afterBuildTicks, [this]); }, beforeTickToLabelConversion: function() { helpers.callback(this.options.beforeTickToLabelConversion, [this]); }, convertTicksToLabels: function() { var me = this; // Convert ticks to strings var tickOpts = me.options.ticks; me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); }, afterTickToLabelConversion: function() { helpers.callback(this.options.afterTickToLabelConversion, [this]); }, // beforeCalculateTickRotation: function() { helpers.callback(this.options.beforeCalculateTickRotation, [this]); }, calculateTickRotation: function() { var me = this; var context = me.ctx; var tickOpts = me.options.ticks; var labels = labelsFromTicks(me._ticks); // Get the width of each grid by calculating the difference // between x offsets between 0 and 1. var tickFont = parseFontOptions(tickOpts); context.font = tickFont.font; var labelRotation = tickOpts.minRotation || 0; if (labels.length && me.options.display && me.isHorizontal()) { var originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache); var labelWidth = originalLabelWidth; var cosRotation, sinRotation; // Allow 3 pixels x2 padding either side for label readability var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; // Max label rotation can be set or default to 90 - also act as a loop counter while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { var angleRadians = helpers.toRadians(labelRotation); cosRotation = Math.cos(angleRadians); sinRotation = Math.sin(angleRadians); if (sinRotation * originalLabelWidth > me.maxHeight) { // go back one step labelRotation--; break; } labelRotation++; labelWidth = cosRotation * originalLabelWidth; } } me.labelRotation = labelRotation; }, afterCalculateTickRotation: function() { helpers.callback(this.options.afterCalculateTickRotation, [this]); }, // beforeFit: function() { helpers.callback(this.options.beforeFit, [this]); }, fit: function() { var me = this; // Reset var minSize = me.minSize = { width: 0, height: 0 }; var labels = labelsFromTicks(me._ticks); var opts = me.options; var tickOpts = opts.ticks; var scaleLabelOpts = opts.scaleLabel; var gridLineOpts = opts.gridLines; var display = opts.display; var isHorizontal = me.isHorizontal(); var tickFont = parseFontOptions(tickOpts); var tickMarkLength = opts.gridLines.tickMarkLength; // Width if (isHorizontal) { // subtract the margins to line up with the chartArea if we are a full width scale minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; } else { minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; } // height if (isHorizontal) { minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; } else { minSize.height = me.maxHeight; // fill all the height } // Are we showing a title for the scale? if (scaleLabelOpts.display && display) { var scaleLabelLineHeight = parseLineHeight(scaleLabelOpts); var scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding); var deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height; if (isHorizontal) { minSize.height += deltaHeight; } else { minSize.width += deltaHeight; } } // Don't bother fitting the ticks if we are not showing them if (tickOpts.display && display) { var largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache); var tallestLabelHeightInLines = helpers.numberOfLabelLines(labels); var lineSpace = tickFont.size * 0.5; var tickPadding = me.options.ticks.padding; if (isHorizontal) { // A horizontal axis is more constrained by the height. me.longestLabelWidth = largestTextWidth; var angleRadians = helpers.toRadians(me.labelRotation); var cosRotation = Math.cos(angleRadians); var sinRotation = Math.sin(angleRadians); // TODO - improve this calculation var labelHeight = (sinRotation * largestTextWidth) + (tickFont.size * tallestLabelHeightInLines) + (lineSpace * (tallestLabelHeightInLines - 1)) + lineSpace; // padding minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); me.ctx.font = tickFont.font; var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font); var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font); // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned // which means that the right padding is dominated by the font height if (me.labelRotation !== 0) { me.paddingLeft = opts.position === 'bottom' ? (cosRotation * firstLabelWidth) + 3 : (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges me.paddingRight = opts.position === 'bottom' ? (cosRotation * lineSpace) + 3 : (cosRotation * lastLabelWidth) + 3; } else { me.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges me.paddingRight = lastLabelWidth / 2 + 3; } } else { // A vertical axis is more constrained by the width. Labels are the // dominant factor here, so get that length first and account for padding if (tickOpts.mirror) { largestTextWidth = 0; } else { // use lineSpace for consistency with horizontal axis // tickPadding is not implemented for horizontal largestTextWidth += tickPadding + lineSpace; } minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); me.paddingTop = tickFont.size / 2; me.paddingBottom = tickFont.size / 2; } } me.handleMargins(); me.width = minSize.width; me.height = minSize.height; }, /** * Handle margins and padding interactions * @private */ handleMargins: function() { var me = this; if (me.margins) { me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); } }, afterFit: function() { helpers.callback(this.options.afterFit, [this]); }, // Shared Methods isHorizontal: function() { return this.options.position === 'top' || this.options.position === 'bottom'; }, isFullWidth: function() { return (this.options.fullWidth); }, // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not getRightValue: function(rawValue) { // Null and undefined values first if (helpers.isNullOrUndef(rawValue)) { return NaN; } // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values if (typeof rawValue === 'number' && !isFinite(rawValue)) { return NaN; } // If it is in fact an object, dive in one more level if (rawValue) { if (this.isHorizontal()) { if (rawValue.x !== undefined) { return this.getRightValue(rawValue.x); } } else if (rawValue.y !== undefined) { return this.getRightValue(rawValue.y); } } // Value is good, return it return rawValue; }, /** * Used to get the value to display in the tooltip for the data at the given index * @param index * @param datasetIndex */ getLabelForIndex: helpers.noop, /** * Returns the location of the given data point. Value can either be an index or a numerical value * The coordinate (0, 0) is at the upper-left corner of the canvas * @param value * @param index * @param datasetIndex */ getPixelForValue: helpers.noop, /** * Used to get the data value from a given pixel. This is the inverse of getPixelForValue * The coordinate (0, 0) is at the upper-left corner of the canvas * @param pixel */ getValueForPixel: helpers.noop, /** * Returns the location of the tick at the given index * The coordinate (0, 0) is at the upper-left corner of the canvas */ getPixelForTick: function(index) { var me = this; var offset = me.options.offset; if (me.isHorizontal()) { var innerWidth = me.width - (me.paddingLeft + me.paddingRight); var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); var pixel = (tickWidth * index) + me.paddingLeft; if (offset) { pixel += tickWidth / 2; } var finalVal = me.left + Math.round(pixel); finalVal += me.isFullWidth() ? me.margins.left : 0; return finalVal; } var innerHeight = me.height - (me.paddingTop + me.paddingBottom); return me.top + (index * (innerHeight / (me._ticks.length - 1))); }, /** * Utility for getting the pixel location of a percentage of scale * The coordinate (0, 0) is at the upper-left corner of the canvas */ getPixelForDecimal: function(decimal) { var me = this; if (me.isHorizontal()) { var innerWidth = me.width - (me.paddingLeft + me.paddingRight); var valueOffset = (innerWidth * decimal) + me.paddingLeft; var finalVal = me.left + Math.round(valueOffset); finalVal += me.isFullWidth() ? me.margins.left : 0; return finalVal; } return me.top + (decimal * me.height); }, /** * Returns the pixel for the minimum chart value * The coordinate (0, 0) is at the upper-left corner of the canvas */ getBasePixel: function() { return this.getPixelForValue(this.getBaseValue()); }, getBaseValue: function() { var me = this; var min = me.min; var max = me.max; return me.beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0; }, /** * Returns a subset of ticks to be plotted to avoid overlapping labels. * @private */ _autoSkip: function(ticks) { var skipRatio; var me = this; var isHorizontal = me.isHorizontal(); var optionTicks = me.options.ticks.minor; var tickCount = ticks.length; var labelRotationRadians = helpers.toRadians(me.labelRotation); var cosRotation = Math.cos(labelRotationRadians); var longestRotatedLabel = me.longestLabelWidth * cosRotation; var result = []; var i, tick, shouldSkip; // figure out the maximum number of gridlines to show var maxTicks; if (optionTicks.maxTicksLimit) { maxTicks = optionTicks.maxTicksLimit; } if (isHorizontal) { skipRatio = false; if ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > (me.width - (me.paddingLeft + me.paddingRight))) { skipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount) / (me.width - (me.paddingLeft + me.paddingRight))); } // if they defined a max number of optionTicks, // increase skipRatio until that number is met if (maxTicks && tickCount > maxTicks) { skipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks)); } } for (i = 0; i < tickCount; i++) { tick = ticks[i]; // Since we always show the last tick,we need may need to hide the last shown one before shouldSkip = (skipRatio > 1 && i % skipRatio > 0) || (i % skipRatio === 0 && i + skipRatio >= tickCount); if (shouldSkip && i !== tickCount - 1) { // leave tick in place but make sure it's not displayed (#4635) delete tick.label; } result.push(tick); } return result; }, // Actually draw the scale on the canvas // @param {rectangle} chartArea : the area of the chart to draw full grid lines on draw: function(chartArea) { var me = this; var options = me.options; if (!options.display) { return; } var context = me.ctx; var globalDefaults = defaults.global; var optionTicks = options.ticks.minor; var optionMajorTicks = options.ticks.major || optionTicks; var gridLines = options.gridLines; var scaleLabel = options.scaleLabel; var isRotated = me.labelRotation !== 0; var isHorizontal = me.isHorizontal(); var ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); var tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor); var tickFont = parseFontOptions(optionTicks); var majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor); var majorTickFont = parseFontOptions(optionMajorTicks); var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; var scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor); var scaleLabelFont = parseFontOptions(scaleLabel); var scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding); var labelRotationRadians = helpers.toRadians(me.labelRotation); var itemsToDraw = []; var xTickStart = options.position === 'right' ? me.left : me.right - tl; var xTickEnd = options.position === 'right' ? me.left + tl : me.right; var yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl; var yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom; helpers.each(ticks, function(tick, index) { // autoskipper skipped this tick (#4635) if (helpers.isNullOrUndef(tick.label)) { return; } var label = tick.label; var lineWidth, lineColor, borderDash, borderDashOffset; if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { // Draw the first index specially lineWidth = gridLines.zeroLineWidth; lineColor = gridLines.zeroLineColor; borderDash = gridLines.zeroLineBorderDash; borderDashOffset = gridLines.zeroLineBorderDashOffset; } else { lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index); lineColor = helpers.valueAtIndexOrDefault(gridLines.color, index); borderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash); borderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset); } // Common properties var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY; var textAlign = 'middle'; var textBaseline = 'middle'; var tickPadding = optionTicks.padding; if (isHorizontal) { var labelYOffset = tl + tickPadding; if (options.position === 'bottom') { // bottom textBaseline = !isRotated ? 'top' : 'middle'; textAlign = !isRotated ? 'center' : 'right'; labelY = me.top + labelYOffset; } else { // top textBaseline = !isRotated ? 'bottom' : 'middle'; textAlign = !isRotated ? 'center' : 'left'; labelY = me.bottom - labelYOffset; } var xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1); if (xLineValue < me.left) { lineColor = 'rgba(0,0,0,0)'; } xLineValue += helpers.aliasPixel(lineWidth); labelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option) tx1 = tx2 = x1 = x2 = xLineValue; ty1 = yTickStart; ty2 = yTickEnd; y1 = chartArea.top; y2 = chartArea.bottom; } else { var isLeft = options.position === 'left'; var labelXOffset; if (optionTicks.mirror) { textAlign = isLeft ? 'left' : 'right'; labelXOffset = tickPadding; } else { textAlign = isLeft ? 'right' : 'left'; labelXOffset = tl + tickPadding; } labelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset; var yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1); if (yLineValue < me.top) { lineColor = 'rgba(0,0,0,0)'; } yLineValue += helpers.aliasPixel(lineWidth); labelY = me.getPixelForTick(index) + optionTicks.labelOffset; tx1 = xTickStart; tx2 = xTickEnd; x1 = chartArea.left; x2 = chartArea.right; ty1 = ty2 = y1 = y2 = yLineValue; } itemsToDraw.push({ tx1: tx1, ty1: ty1, tx2: tx2, ty2: ty2, x1: x1, y1: y1, x2: x2, y2: y2, labelX: labelX, labelY: labelY, glWidth: lineWidth, glColor: lineColor, glBorderDash: borderDash, glBorderDashOffset: borderDashOffset, rotation: -1 * labelRotationRadians, label: label, major: tick.major, textBaseline: textBaseline, textAlign: textAlign }); }); // Draw all of the tick labels, tick marks, and grid lines at the correct places helpers.each(itemsToDraw, function(itemToDraw) { if (gridLines.display) { context.save(); context.lineWidth = itemToDraw.glWidth; context.strokeStyle = itemToDraw.glColor; if (context.setLineDash) { context.setLineDash(itemToDraw.glBorderDash); context.lineDashOffset = itemToDraw.glBorderDashOffset; } context.beginPath(); if (gridLines.drawTicks) { context.moveTo(itemToDraw.tx1, itemToDraw.ty1); context.lineTo(itemToDraw.tx2, itemToDraw.ty2); } if (gridLines.drawOnChartArea) { context.moveTo(itemToDraw.x1, itemToDraw.y1); context.lineTo(itemToDraw.x2, itemToDraw.y2); } context.stroke(); context.restore(); } if (optionTicks.display) { // Make sure we draw text in the correct color and font context.save(); context.translate(itemToDraw.labelX, itemToDraw.labelY); context.rotate(itemToDraw.rotation); context.font = itemToDraw.major ? majorTickFont.font : tickFont.font; context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; context.textBaseline = itemToDraw.textBaseline; context.textAlign = itemToDraw.textAlign; var label = itemToDraw.label; if (helpers.isArray(label)) { for (var i = 0, y = 0; i < label.length; ++i) { // We just make sure the multiline element is a string here.. context.fillText('' + label[i], 0, y); // apply same lineSpacing as calculated @ L#320 y += (tickFont.size * 1.5); } } else { context.fillText(label, 0, 0); } context.restore(); } }); if (scaleLabel.display) { // Draw the scale label var scaleLabelX; var scaleLabelY; var rotation = 0; var halfLineHeight = parseLineHeight(scaleLabel) / 2; if (isHorizontal) { scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width scaleLabelY = options.position === 'bottom' ? me.bottom - halfLineHeight - scaleLabelPadding.bottom : me.top + halfLineHeight + scaleLabelPadding.top; } else { var isLeft = options.position === 'left'; scaleLabelX = isLeft ? me.left + halfLineHeight + scaleLabelPadding.top : me.right - halfLineHeight - scaleLabelPadding.top; scaleLabelY = me.top + ((me.bottom - me.top) / 2); rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; } context.save(); context.translate(scaleLabelX, scaleLabelY); context.rotate(rotation); context.textAlign = 'center'; context.textBaseline = 'middle'; context.fillStyle = scaleLabelFontColor; // render in correct colour context.font = scaleLabelFont.font; context.fillText(scaleLabel.labelString, 0, 0); context.restore(); } if (gridLines.drawBorder) { // Draw the line at the edge of the axis context.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0); context.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0); var x1 = me.left; var x2 = me.right; var y1 = me.top; var y2 = me.bottom; var aliasPixel = helpers.aliasPixel(context.lineWidth); if (isHorizontal) { y1 = y2 = options.position === 'top' ? me.bottom : me.top; y1 += aliasPixel; y2 += aliasPixel; } else { x1 = x2 = options.position === 'left' ? me.right : me.left; x1 += aliasPixel; x2 += aliasPixel; } context.beginPath(); context.moveTo(x1, y1); context.lineTo(x2, y2); context.stroke(); } } }); }; },{"25":25,"26":26,"34":34,"45":45}],33:[function(require,module,exports){ 'use strict'; var defaults = require(25); var helpers = require(45); module.exports = function(Chart) { Chart.scaleService = { // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then // use the new chart options to grab the correct scale constructors: {}, // Use a registration function so that we can move to an ES6 map when we no longer need to support // old browsers // Scale config defaults defaults: {}, registerScaleType: function(type, scaleConstructor, scaleDefaults) { this.constructors[type] = scaleConstructor; this.defaults[type] = helpers.clone(scaleDefaults); }, getScaleConstructor: function(type) { return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; }, getScaleDefaults: function(type) { // Return the scale defaults merged with the global settings so that we always use the latest ones return this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {}; }, updateScaleDefaults: function(type, additions) { var me = this; if (me.defaults.hasOwnProperty(type)) { me.defaults[type] = helpers.extend(me.defaults[type], additions); } }, addScalesToLayout: function(chart) { // Adds each scale to the chart.boxes array to be sized accordingly helpers.each(chart.scales, function(scale) { // Set ILayoutItem parameters for backwards compatibility scale.fullWidth = scale.options.fullWidth; scale.position = scale.options.position; scale.weight = scale.options.weight; Chart.layoutService.addBox(chart, scale); }); } }; }; },{"25":25,"45":45}],34:[function(require,module,exports){ 'use strict'; var helpers = require(45); /** * Namespace to hold static tick generation functions * @namespace Chart.Ticks */ module.exports = { /** * Namespace to hold generators for different types of ticks * @namespace Chart.Ticks.generators */ generators: { /** * Interface for the options provided to the numeric tick generator * @interface INumericTickGenerationOptions */ /** * The maximum number of ticks to display * @name INumericTickGenerationOptions#maxTicks * @type Number */ /** * The distance between each tick. * @name INumericTickGenerationOptions#stepSize * @type Number * @optional */ /** * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum * @name INumericTickGenerationOptions#min * @type Number * @optional */ /** * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum * @name INumericTickGenerationOptions#max * @type Number * @optional */ /** * Generate a set of linear ticks * @method Chart.Ticks.generators.linear * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks * @param dataRange {IRange} the range of the data * @returns {Array} array of tick values */ linear: function(generationOptions, dataRange) { var ticks = []; // To get a "nice" value for the tick spacing, we will use the appropriately named // "nice number" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks // for details. var spacing; if (generationOptions.stepSize && generationOptions.stepSize > 0) { spacing = generationOptions.stepSize; } else { var niceRange = helpers.niceNum(dataRange.max - dataRange.min, false); spacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true); } var niceMin = Math.floor(dataRange.min / spacing) * spacing; var niceMax = Math.ceil(dataRange.max / spacing) * spacing; // If min, max and stepSize is set and they make an evenly spaced scale use it. if (generationOptions.min && generationOptions.max && generationOptions.stepSize) { // If very close to our whole number, use it. if (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) { niceMin = generationOptions.min; niceMax = generationOptions.max; } } var numSpaces = (niceMax - niceMin) / spacing; // If very close to our rounded value, use it. if (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { numSpaces = Math.round(numSpaces); } else { numSpaces = Math.ceil(numSpaces); } // Put the values into the ticks array ticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin); for (var j = 1; j < numSpaces; ++j) { ticks.push(niceMin + (j * spacing)); } ticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax); return ticks; }, /** * Generate a set of logarithmic ticks * @method Chart.Ticks.generators.logarithmic * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks * @param dataRange {IRange} the range of the data * @returns {Array} array of tick values */ logarithmic: function(generationOptions, dataRange) { var ticks = []; var valueOrDefault = helpers.valueOrDefault; // Figure out what the max number of ticks we can support it is based on the size of // the axis area. For now, we say that the minimum tick spacing in pixels must be 50 // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on // the graph var tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min)))); var endExp = Math.floor(helpers.log10(dataRange.max)); var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); var exp, significand; if (tickVal === 0) { exp = Math.floor(helpers.log10(dataRange.minNotZero)); significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); ticks.push(tickVal); tickVal = significand * Math.pow(10, exp); } else { exp = Math.floor(helpers.log10(tickVal)); significand = Math.floor(tickVal / Math.pow(10, exp)); } do { ticks.push(tickVal); ++significand; if (significand === 10) { significand = 1; ++exp; } tickVal = significand * Math.pow(10, exp); } while (exp < endExp || (exp === endExp && significand < endSignificand)); var lastTick = valueOrDefault(generationOptions.max, tickVal); ticks.push(lastTick); return ticks; } }, /** * Namespace to hold formatters for different types of ticks * @namespace Chart.Ticks.formatters */ formatters: { /** * Formatter for value labels * @method Chart.Ticks.formatters.values * @param value the value to display * @return {String|Array} the label to display */ values: function(value) { return helpers.isArray(value) ? value : '' + value; }, /** * Formatter for linear numeric ticks * @method Chart.Ticks.formatters.linear * @param tickValue {Number} the value to be formatted * @param index {Number} the position of the tickValue parameter in the ticks array * @param ticks {Array} the list of ticks being converted * @return {String} string representation of the tickValue parameter */ linear: function(tickValue, index, ticks) { // If we have lots of ticks, don't use the ones var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; // If we have a number like 2.5 as the delta, figure out how many decimal places we need if (Math.abs(delta) > 1) { if (tickValue !== Math.floor(tickValue)) { // not an integer delta = tickValue - Math.floor(tickValue); } } var logDelta = helpers.log10(Math.abs(delta)); var tickString = ''; if (tickValue !== 0) { var numDecimal = -1 * Math.floor(logDelta); numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places tickString = tickValue.toFixed(numDecimal); } else { tickString = '0'; // never show decimal places for 0 } return tickString; }, logarithmic: function(tickValue, index, ticks) { var remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue)))); if (tickValue === 0) { return '0'; } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { return tickValue.toExponential(); } return ''; } } }; },{"45":45}],35:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); defaults._set('global', { tooltips: { enabled: true, custom: null, mode: 'nearest', position: 'average', intersect: true, backgroundColor: 'rgba(0,0,0,0.8)', titleFontStyle: 'bold', titleSpacing: 2, titleMarginBottom: 6, titleFontColor: '#fff', titleAlign: 'left', bodySpacing: 2, bodyFontColor: '#fff', bodyAlign: 'left', footerFontStyle: 'bold', footerSpacing: 2, footerMarginTop: 6, footerFontColor: '#fff', footerAlign: 'left', yPadding: 6, xPadding: 6, caretPadding: 2, caretSize: 5, cornerRadius: 6, multiKeyBackground: '#fff', displayColors: true, borderColor: 'rgba(0,0,0,0)', borderWidth: 0, callbacks: { // Args are: (tooltipItems, data) beforeTitle: helpers.noop, title: function(tooltipItems, data) { // Pick first xLabel for now var title = ''; var labels = data.labels; var labelCount = labels ? labels.length : 0; if (tooltipItems.length > 0) { var item = tooltipItems[0]; if (item.xLabel) { title = item.xLabel; } else if (labelCount > 0 && item.index < labelCount) { title = labels[item.index]; } } return title; }, afterTitle: helpers.noop, // Args are: (tooltipItems, data) beforeBody: helpers.noop, // Args are: (tooltipItem, data) beforeLabel: helpers.noop, label: function(tooltipItem, data) { var label = data.datasets[tooltipItem.datasetIndex].label || ''; if (label) { label += ': '; } label += tooltipItem.yLabel; return label; }, labelColor: function(tooltipItem, chart) { var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); var activeElement = meta.data[tooltipItem.index]; var view = activeElement._view; return { borderColor: view.borderColor, backgroundColor: view.backgroundColor }; }, labelTextColor: function() { return this._options.bodyFontColor; }, afterLabel: helpers.noop, // Args are: (tooltipItems, data) afterBody: helpers.noop, // Args are: (tooltipItems, data) beforeFooter: helpers.noop, footer: helpers.noop, afterFooter: helpers.noop } } }); module.exports = function(Chart) { /** * Helper method to merge the opacity into a color */ function mergeOpacity(colorString, opacity) { var color = helpers.color(colorString); return color.alpha(opacity * color.alpha()).rgbaString(); } // Helper to push or concat based on if the 2nd parameter is an array or not function pushOrConcat(base, toPush) { if (toPush) { if (helpers.isArray(toPush)) { // base = base.concat(toPush); Array.prototype.push.apply(base, toPush); } else { base.push(toPush); } } return base; } // Private helper to create a tooltip item model // @param element : the chart element (point, arc, bar) to create the tooltip item for // @return : new tooltip item function createTooltipItem(element) { var xScale = element._xScale; var yScale = element._yScale || element._scale; // handle radar || polarArea charts var index = element._index; var datasetIndex = element._datasetIndex; return { xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', index: index, datasetIndex: datasetIndex, x: element._model.x, y: element._model.y }; } /** * Helper to get the reset model for the tooltip * @param tooltipOpts {Object} the tooltip options */ function getBaseModel(tooltipOpts) { var globalDefaults = defaults.global; var valueOrDefault = helpers.valueOrDefault; return { // Positioning xPadding: tooltipOpts.xPadding, yPadding: tooltipOpts.yPadding, xAlign: tooltipOpts.xAlign, yAlign: tooltipOpts.yAlign, // Body bodyFontColor: tooltipOpts.bodyFontColor, _bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), _bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), _bodyAlign: tooltipOpts.bodyAlign, bodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), bodySpacing: tooltipOpts.bodySpacing, // Title titleFontColor: tooltipOpts.titleFontColor, _titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), _titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), titleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), _titleAlign: tooltipOpts.titleAlign, titleSpacing: tooltipOpts.titleSpacing, titleMarginBottom: tooltipOpts.titleMarginBottom, // Footer footerFontColor: tooltipOpts.footerFontColor, _footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), _footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), footerFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), _footerAlign: tooltipOpts.footerAlign, footerSpacing: tooltipOpts.footerSpacing, footerMarginTop: tooltipOpts.footerMarginTop, // Appearance caretSize: tooltipOpts.caretSize, cornerRadius: tooltipOpts.cornerRadius, backgroundColor: tooltipOpts.backgroundColor, opacity: 0, legendColorBackground: tooltipOpts.multiKeyBackground, displayColors: tooltipOpts.displayColors, borderColor: tooltipOpts.borderColor, borderWidth: tooltipOpts.borderWidth }; } /** * Get the size of the tooltip */ function getTooltipSize(tooltip, model) { var ctx = tooltip._chart.ctx; var height = model.yPadding * 2; // Tooltip Padding var width = 0; // Count of all lines in the body var body = model.body; var combinedBodyLength = body.reduce(function(count, bodyItem) { return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; }, 0); combinedBodyLength += model.beforeBody.length + model.afterBody.length; var titleLineCount = model.title.length; var footerLineCount = model.footer.length; var titleFontSize = model.titleFontSize; var bodyFontSize = model.bodyFontSize; var footerFontSize = model.footerFontSize; height += titleLineCount * titleFontSize; // Title Lines height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin height += combinedBodyLength * bodyFontSize; // Body Lines height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin height += footerLineCount * (footerFontSize); // Footer Lines height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing // Title width var widthPadding = 0; var maxLineWidth = function(line) { width = Math.max(width, ctx.measureText(line).width + widthPadding); }; ctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); helpers.each(model.title, maxLineWidth); // Body width ctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); helpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth); // Body lines may include some extra width due to the color box widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; helpers.each(body, function(bodyItem) { helpers.each(bodyItem.before, maxLineWidth); helpers.each(bodyItem.lines, maxLineWidth); helpers.each(bodyItem.after, maxLineWidth); }); // Reset back to 0 widthPadding = 0; // Footer width ctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); helpers.each(model.footer, maxLineWidth); // Add padding width += 2 * model.xPadding; return { width: width, height: height }; } /** * Helper to get the alignment of a tooltip given the size */ function determineAlignment(tooltip, size) { var model = tooltip._model; var chart = tooltip._chart; var chartArea = tooltip._chart.chartArea; var xAlign = 'center'; var yAlign = 'center'; if (model.y < size.height) { yAlign = 'top'; } else if (model.y > (chart.height - size.height)) { yAlign = 'bottom'; } var lf, rf; // functions to determine left, right alignment var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges var midX = (chartArea.left + chartArea.right) / 2; var midY = (chartArea.top + chartArea.bottom) / 2; if (yAlign === 'center') { lf = function(x) { return x <= midX; }; rf = function(x) { return x > midX; }; } else { lf = function(x) { return x <= (size.width / 2); }; rf = function(x) { return x >= (chart.width - (size.width / 2)); }; } olf = function(x) { return x + size.width > chart.width; }; orf = function(x) { return x - size.width < 0; }; yf = function(y) { return y <= midY ? 'top' : 'bottom'; }; if (lf(model.x)) { xAlign = 'left'; // Is tooltip too wide and goes over the right side of the chart.? if (olf(model.x)) { xAlign = 'center'; yAlign = yf(model.y); } } else if (rf(model.x)) { xAlign = 'right'; // Is tooltip too wide and goes outside left edge of canvas? if (orf(model.x)) { xAlign = 'center'; yAlign = yf(model.y); } } var opts = tooltip._options; return { xAlign: opts.xAlign ? opts.xAlign : xAlign, yAlign: opts.yAlign ? opts.yAlign : yAlign }; } /** * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment */ function getBackgroundPoint(vm, size, alignment) { // Background Position var x = vm.x; var y = vm.y; var caretSize = vm.caretSize; var caretPadding = vm.caretPadding; var cornerRadius = vm.cornerRadius; var xAlign = alignment.xAlign; var yAlign = alignment.yAlign; var paddingAndSize = caretSize + caretPadding; var radiusAndPadding = cornerRadius + caretPadding; if (xAlign === 'right') { x -= size.width; } else if (xAlign === 'center') { x -= (size.width / 2); } if (yAlign === 'top') { y += paddingAndSize; } else if (yAlign === 'bottom') { y -= size.height + paddingAndSize; } else { y -= (size.height / 2); } if (yAlign === 'center') { if (xAlign === 'left') { x += paddingAndSize; } else if (xAlign === 'right') { x -= paddingAndSize; } } else if (xAlign === 'left') { x -= radiusAndPadding; } else if (xAlign === 'right') { x += radiusAndPadding; } return { x: x, y: y }; } Chart.Tooltip = Element.extend({ initialize: function() { this._model = getBaseModel(this._options); this._lastActive = []; }, // Get the title // Args are: (tooltipItem, data) getTitle: function() { var me = this; var opts = me._options; var callbacks = opts.callbacks; var beforeTitle = callbacks.beforeTitle.apply(me, arguments); var title = callbacks.title.apply(me, arguments); var afterTitle = callbacks.afterTitle.apply(me, arguments); var lines = []; lines = pushOrConcat(lines, beforeTitle); lines = pushOrConcat(lines, title); lines = pushOrConcat(lines, afterTitle); return lines; }, // Args are: (tooltipItem, data) getBeforeBody: function() { var lines = this._options.callbacks.beforeBody.apply(this, arguments); return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : []; }, // Args are: (tooltipItem, data) getBody: function(tooltipItems, data) { var me = this; var callbacks = me._options.callbacks; var bodyItems = []; helpers.each(tooltipItems, function(tooltipItem) { var bodyItem = { before: [], lines: [], after: [] }; pushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data)); pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); pushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data)); bodyItems.push(bodyItem); }); return bodyItems; }, // Args are: (tooltipItem, data) getAfterBody: function() { var lines = this._options.callbacks.afterBody.apply(this, arguments); return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : []; }, // Get the footer and beforeFooter and afterFooter lines // Args are: (tooltipItem, data) getFooter: function() { var me = this; var callbacks = me._options.callbacks; var beforeFooter = callbacks.beforeFooter.apply(me, arguments); var footer = callbacks.footer.apply(me, arguments); var afterFooter = callbacks.afterFooter.apply(me, arguments); var lines = []; lines = pushOrConcat(lines, beforeFooter); lines = pushOrConcat(lines, footer); lines = pushOrConcat(lines, afterFooter); return lines; }, update: function(changed) { var me = this; var opts = me._options; // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time // which breaks any animations. var existingModel = me._model; var model = me._model = getBaseModel(opts); var active = me._active; var data = me._data; // In the case where active.length === 0 we need to keep these at existing values for good animations var alignment = { xAlign: existingModel.xAlign, yAlign: existingModel.yAlign }; var backgroundPoint = { x: existingModel.x, y: existingModel.y }; var tooltipSize = { width: existingModel.width, height: existingModel.height }; var tooltipPosition = { x: existingModel.caretX, y: existingModel.caretY }; var i, len; if (active.length) { model.opacity = 1; var labelColors = []; var labelTextColors = []; tooltipPosition = Chart.Tooltip.positioners[opts.position].call(me, active, me._eventPosition); var tooltipItems = []; for (i = 0, len = active.length; i < len; ++i) { tooltipItems.push(createTooltipItem(active[i])); } // If the user provided a filter function, use it to modify the tooltip items if (opts.filter) { tooltipItems = tooltipItems.filter(function(a) { return opts.filter(a, data); }); } // If the user provided a sorting function, use it to modify the tooltip items if (opts.itemSort) { tooltipItems = tooltipItems.sort(function(a, b) { return opts.itemSort(a, b, data); }); } // Determine colors for boxes helpers.each(tooltipItems, function(tooltipItem) { labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); }); // Build the Text Lines model.title = me.getTitle(tooltipItems, data); model.beforeBody = me.getBeforeBody(tooltipItems, data); model.body = me.getBody(tooltipItems, data); model.afterBody = me.getAfterBody(tooltipItems, data); model.footer = me.getFooter(tooltipItems, data); // Initial positioning and colors model.x = Math.round(tooltipPosition.x); model.y = Math.round(tooltipPosition.y); model.caretPadding = opts.caretPadding; model.labelColors = labelColors; model.labelTextColors = labelTextColors; // data points model.dataPoints = tooltipItems; // We need to determine alignment of the tooltip tooltipSize = getTooltipSize(this, model); alignment = determineAlignment(this, tooltipSize); // Final Size and Position backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment); } else { model.opacity = 0; } model.xAlign = alignment.xAlign; model.yAlign = alignment.yAlign; model.x = backgroundPoint.x; model.y = backgroundPoint.y; model.width = tooltipSize.width; model.height = tooltipSize.height; // Point where the caret on the tooltip points to model.caretX = tooltipPosition.x; model.caretY = tooltipPosition.y; me._model = model; if (changed && opts.custom) { opts.custom.call(me, model); } return me; }, drawCaret: function(tooltipPoint, size) { var ctx = this._chart.ctx; var vm = this._view; var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); ctx.lineTo(caretPosition.x1, caretPosition.y1); ctx.lineTo(caretPosition.x2, caretPosition.y2); ctx.lineTo(caretPosition.x3, caretPosition.y3); }, getCaretPosition: function(tooltipPoint, size, vm) { var x1, x2, x3, y1, y2, y3; var caretSize = vm.caretSize; var cornerRadius = vm.cornerRadius; var xAlign = vm.xAlign; var yAlign = vm.yAlign; var ptX = tooltipPoint.x; var ptY = tooltipPoint.y; var width = size.width; var height = size.height; if (yAlign === 'center') { y2 = ptY + (height / 2); if (xAlign === 'left') { x1 = ptX; x2 = x1 - caretSize; x3 = x1; y1 = y2 + caretSize; y3 = y2 - caretSize; } else { x1 = ptX + width; x2 = x1 + caretSize; x3 = x1; y1 = y2 - caretSize; y3 = y2 + caretSize; } } else { if (xAlign === 'left') { x2 = ptX + cornerRadius + (caretSize); x1 = x2 - caretSize; x3 = x2 + caretSize; } else if (xAlign === 'right') { x2 = ptX + width - cornerRadius - caretSize; x1 = x2 - caretSize; x3 = x2 + caretSize; } else { x2 = ptX + (width / 2); x1 = x2 - caretSize; x3 = x2 + caretSize; } if (yAlign === 'top') { y1 = ptY; y2 = y1 - caretSize; y3 = y1; } else { y1 = ptY + height; y2 = y1 + caretSize; y3 = y1; // invert drawing order var tmp = x3; x3 = x1; x1 = tmp; } } return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; }, drawTitle: function(pt, vm, ctx, opacity) { var title = vm.title; if (title.length) { ctx.textAlign = vm._titleAlign; ctx.textBaseline = 'top'; var titleFontSize = vm.titleFontSize; var titleSpacing = vm.titleSpacing; ctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity); ctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); var i, len; for (i = 0, len = title.length; i < len; ++i) { ctx.fillText(title[i], pt.x, pt.y); pt.y += titleFontSize + titleSpacing; // Line Height and spacing if (i + 1 === title.length) { pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing } } } }, drawBody: function(pt, vm, ctx, opacity) { var bodyFontSize = vm.bodyFontSize; var bodySpacing = vm.bodySpacing; var body = vm.body; ctx.textAlign = vm._bodyAlign; ctx.textBaseline = 'top'; ctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); // Before Body var xLinePadding = 0; var fillLineOfText = function(line) { ctx.fillText(line, pt.x + xLinePadding, pt.y); pt.y += bodyFontSize + bodySpacing; }; // Before body lines ctx.fillStyle = mergeOpacity(vm.bodyFontColor, opacity); helpers.each(vm.beforeBody, fillLineOfText); var drawColorBoxes = vm.displayColors; xLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0; // Draw body lines now helpers.each(body, function(bodyItem, i) { var textColor = mergeOpacity(vm.labelTextColors[i], opacity); ctx.fillStyle = textColor; helpers.each(bodyItem.before, fillLineOfText); helpers.each(bodyItem.lines, function(line) { // Draw Legend-like boxes if needed if (drawColorBoxes) { // Fill a white rect so that colours merge nicely if the opacity is < 1 ctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity); ctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize); // Border ctx.lineWidth = 1; ctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity); ctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize); // Inner square ctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity); ctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); ctx.fillStyle = textColor; } fillLineOfText(line); }); helpers.each(bodyItem.after, fillLineOfText); }); // Reset back to 0 for after body xLinePadding = 0; // After body lines helpers.each(vm.afterBody, fillLineOfText); pt.y -= bodySpacing; // Remove last body spacing }, drawFooter: function(pt, vm, ctx, opacity) { var footer = vm.footer; if (footer.length) { pt.y += vm.footerMarginTop; ctx.textAlign = vm._footerAlign; ctx.textBaseline = 'top'; ctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity); ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); helpers.each(footer, function(line) { ctx.fillText(line, pt.x, pt.y); pt.y += vm.footerFontSize + vm.footerSpacing; }); } }, drawBackground: function(pt, vm, ctx, tooltipSize, opacity) { ctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity); ctx.strokeStyle = mergeOpacity(vm.borderColor, opacity); ctx.lineWidth = vm.borderWidth; var xAlign = vm.xAlign; var yAlign = vm.yAlign; var x = pt.x; var y = pt.y; var width = tooltipSize.width; var height = tooltipSize.height; var radius = vm.cornerRadius; ctx.beginPath(); ctx.moveTo(x + radius, y); if (yAlign === 'top') { this.drawCaret(pt, tooltipSize); } ctx.lineTo(x + width - radius, y); ctx.quadraticCurveTo(x + width, y, x + width, y + radius); if (yAlign === 'center' && xAlign === 'right') { this.drawCaret(pt, tooltipSize); } ctx.lineTo(x + width, y + height - radius); ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); if (yAlign === 'bottom') { this.drawCaret(pt, tooltipSize); } ctx.lineTo(x + radius, y + height); ctx.quadraticCurveTo(x, y + height, x, y + height - radius); if (yAlign === 'center' && xAlign === 'left') { this.drawCaret(pt, tooltipSize); } ctx.lineTo(x, y + radius); ctx.quadraticCurveTo(x, y, x + radius, y); ctx.closePath(); ctx.fill(); if (vm.borderWidth > 0) { ctx.stroke(); } }, draw: function() { var ctx = this._chart.ctx; var vm = this._view; if (vm.opacity === 0) { return; } var tooltipSize = { width: vm.width, height: vm.height }; var pt = { x: vm.x, y: vm.y }; // IE11/Edge does not like very small opacities, so snap to 0 var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; // Truthy/falsey value for empty tooltip var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; if (this._options.enabled && hasTooltipContent) { // Draw Background this.drawBackground(pt, vm, ctx, tooltipSize, opacity); // Draw Title, Body, and Footer pt.x += vm.xPadding; pt.y += vm.yPadding; // Titles this.drawTitle(pt, vm, ctx, opacity); // Body this.drawBody(pt, vm, ctx, opacity); // Footer this.drawFooter(pt, vm, ctx, opacity); } }, /** * Handle an event * @private * @param {IEvent} event - The event to handle * @returns {Boolean} true if the tooltip changed */ handleEvent: function(e) { var me = this; var options = me._options; var changed = false; me._lastActive = me._lastActive || []; // Find Active Elements for tooltips if (e.type === 'mouseout') { me._active = []; } else { me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); } // Remember Last Actives changed = !helpers.arrayEquals(me._active, me._lastActive); // If tooltip didn't change, do not handle the target event if (!changed) { return false; } me._lastActive = me._active; if (options.enabled || options.custom) { me._eventPosition = { x: e.x, y: e.y }; var model = me._model; me.update(true); me.pivot(); // See if our tooltip position changed changed |= (model.x !== me._model.x) || (model.y !== me._model.y); } return changed; } }); /** * @namespace Chart.Tooltip.positioners */ Chart.Tooltip.positioners = { /** * Average mode places the tooltip at the average position of the elements shown * @function Chart.Tooltip.positioners.average * @param elements {ChartElement[]} the elements being displayed in the tooltip * @returns {Point} tooltip position */ average: function(elements) { if (!elements.length) { return false; } var i, len; var x = 0; var y = 0; var count = 0; for (i = 0, len = elements.length; i < len; ++i) { var el = elements[i]; if (el && el.hasValue()) { var pos = el.tooltipPosition(); x += pos.x; y += pos.y; ++count; } } return { x: Math.round(x / count), y: Math.round(y / count) }; }, /** * Gets the tooltip position nearest of the item nearest to the event position * @function Chart.Tooltip.positioners.nearest * @param elements {Chart.Element[]} the tooltip elements * @param eventPosition {Point} the position of the event in canvas coordinates * @returns {Point} the tooltip position */ nearest: function(elements, eventPosition) { var x = eventPosition.x; var y = eventPosition.y; var minDistance = Number.POSITIVE_INFINITY; var i, len, nearestElement; for (i = 0, len = elements.length; i < len; ++i) { var el = elements[i]; if (el && el.hasValue()) { var center = el.getCenterPoint(); var d = helpers.distanceBetweenPoints(eventPosition, center); if (d < minDistance) { minDistance = d; nearestElement = el; } } } if (nearestElement) { var tp = nearestElement.tooltipPosition(); x = tp.x; y = tp.y; } return { x: x, y: y }; } }; }; },{"25":25,"26":26,"45":45}],36:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); defaults._set('global', { elements: { arc: { backgroundColor: defaults.global.defaultColor, borderColor: '#fff', borderWidth: 2 } } }); module.exports = Element.extend({ inLabelRange: function(mouseX) { var vm = this._view; if (vm) { return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); } return false; }, inRange: function(chartX, chartY) { var vm = this._view; if (vm) { var pointRelativePosition = helpers.getAngleFromPoint(vm, {x: chartX, y: chartY}); var angle = pointRelativePosition.angle; var distance = pointRelativePosition.distance; // Sanitise angle range var startAngle = vm.startAngle; var endAngle = vm.endAngle; while (endAngle < startAngle) { endAngle += 2.0 * Math.PI; } while (angle > endAngle) { angle -= 2.0 * Math.PI; } while (angle < startAngle) { angle += 2.0 * Math.PI; } // Check if within the range of the open/close angle var betweenAngles = (angle >= startAngle && angle <= endAngle); var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); return (betweenAngles && withinRadius); } return false; }, getCenterPoint: function() { var vm = this._view; var halfAngle = (vm.startAngle + vm.endAngle) / 2; var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; return { x: vm.x + Math.cos(halfAngle) * halfRadius, y: vm.y + Math.sin(halfAngle) * halfRadius }; }, getArea: function() { var vm = this._view; return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); }, tooltipPosition: function() { var vm = this._view; var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; return { x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) }; }, draw: function() { var ctx = this._chart.ctx; var vm = this._view; var sA = vm.startAngle; var eA = vm.endAngle; ctx.beginPath(); ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); ctx.closePath(); ctx.strokeStyle = vm.borderColor; ctx.lineWidth = vm.borderWidth; ctx.fillStyle = vm.backgroundColor; ctx.fill(); ctx.lineJoin = 'bevel'; if (vm.borderWidth) { ctx.stroke(); } } }); },{"25":25,"26":26,"45":45}],37:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); var globalDefaults = defaults.global; defaults._set('global', { elements: { line: { tension: 0.4, backgroundColor: globalDefaults.defaultColor, borderWidth: 3, borderColor: globalDefaults.defaultColor, borderCapStyle: 'butt', borderDash: [], borderDashOffset: 0.0, borderJoinStyle: 'miter', capBezierPoints: true, fill: true, // do we fill in the area between the line and its base axis } } }); module.exports = Element.extend({ draw: function() { var me = this; var vm = me._view; var ctx = me._chart.ctx; var spanGaps = vm.spanGaps; var points = me._children.slice(); // clone array var globalOptionLineElements = globalDefaults.elements.line; var lastDrawnIndex = -1; var index, current, previous, currentVM; // If we are looping, adding the first point again if (me._loop && points.length) { points.push(points[0]); } ctx.save(); // Stroke Line Options ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; // IE 9 and 10 do not support line dash if (ctx.setLineDash) { ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); } ctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset; ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; ctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth; ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; // Stroke Line ctx.beginPath(); lastDrawnIndex = -1; for (index = 0; index < points.length; ++index) { current = points[index]; previous = helpers.previousItem(points, index); currentVM = current._view; // First point moves to it's starting position no matter what if (index === 0) { if (!currentVM.skip) { ctx.moveTo(currentVM.x, currentVM.y); lastDrawnIndex = index; } } else { previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; if (!currentVM.skip) { if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { // There was a gap and this is the first point after the gap ctx.moveTo(currentVM.x, currentVM.y); } else { // Line to next point helpers.canvas.lineTo(ctx, previous._view, current._view); } lastDrawnIndex = index; } } } ctx.stroke(); ctx.restore(); } }); },{"25":25,"26":26,"45":45}],38:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); var defaultColor = defaults.global.defaultColor; defaults._set('global', { elements: { point: { radius: 3, pointStyle: 'circle', backgroundColor: defaultColor, borderColor: defaultColor, borderWidth: 1, // Hover hitRadius: 1, hoverRadius: 4, hoverBorderWidth: 1 } } }); function xRange(mouseX) { var vm = this._view; return vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false; } function yRange(mouseY) { var vm = this._view; return vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false; } module.exports = Element.extend({ inRange: function(mouseX, mouseY) { var vm = this._view; return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; }, inLabelRange: xRange, inXRange: xRange, inYRange: yRange, getCenterPoint: function() { var vm = this._view; return { x: vm.x, y: vm.y }; }, getArea: function() { return Math.PI * Math.pow(this._view.radius, 2); }, tooltipPosition: function() { var vm = this._view; return { x: vm.x, y: vm.y, padding: vm.radius + vm.borderWidth }; }, draw: function(chartArea) { var vm = this._view; var model = this._model; var ctx = this._chart.ctx; var pointStyle = vm.pointStyle; var radius = vm.radius; var x = vm.x; var y = vm.y; var color = helpers.color; var errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.) var ratio = 0; if (vm.skip) { return; } ctx.strokeStyle = vm.borderColor || defaultColor; ctx.lineWidth = helpers.valueOrDefault(vm.borderWidth, defaults.global.elements.point.borderWidth); ctx.fillStyle = vm.backgroundColor || defaultColor; // Cliping for Points. // going out from inner charArea? if ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right * errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom * errMargin < model.y))) { // Point fade out if (model.x < chartArea.left) { ratio = (x - model.x) / (chartArea.left - model.x); } else if (chartArea.right * errMargin < model.x) { ratio = (model.x - x) / (model.x - chartArea.right); } else if (model.y < chartArea.top) { ratio = (y - model.y) / (chartArea.top - model.y); } else if (chartArea.bottom * errMargin < model.y) { ratio = (model.y - y) / (model.y - chartArea.bottom); } ratio = Math.round(ratio * 100) / 100; ctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString(); ctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString(); } helpers.canvas.drawPoint(ctx, pointStyle, radius, x, y); } }); },{"25":25,"26":26,"45":45}],39:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); defaults._set('global', { elements: { rectangle: { backgroundColor: defaults.global.defaultColor, borderColor: defaults.global.defaultColor, borderSkipped: 'bottom', borderWidth: 0 } } }); function isVertical(bar) { return bar._view.width !== undefined; } /** * Helper function to get the bounds of the bar regardless of the orientation * @param bar {Chart.Element.Rectangle} the bar * @return {Bounds} bounds of the bar * @private */ function getBarBounds(bar) { var vm = bar._view; var x1, x2, y1, y2; if (isVertical(bar)) { // vertical var halfWidth = vm.width / 2; x1 = vm.x - halfWidth; x2 = vm.x + halfWidth; y1 = Math.min(vm.y, vm.base); y2 = Math.max(vm.y, vm.base); } else { // horizontal bar var halfHeight = vm.height / 2; x1 = Math.min(vm.x, vm.base); x2 = Math.max(vm.x, vm.base); y1 = vm.y - halfHeight; y2 = vm.y + halfHeight; } return { left: x1, top: y1, right: x2, bottom: y2 }; } module.exports = Element.extend({ draw: function() { var ctx = this._chart.ctx; var vm = this._view; var left, right, top, bottom, signX, signY, borderSkipped; var borderWidth = vm.borderWidth; if (!vm.horizontal) { // bar left = vm.x - vm.width / 2; right = vm.x + vm.width / 2; top = vm.y; bottom = vm.base; signX = 1; signY = bottom > top ? 1 : -1; borderSkipped = vm.borderSkipped || 'bottom'; } else { // horizontal bar left = vm.base; right = vm.x; top = vm.y - vm.height / 2; bottom = vm.y + vm.height / 2; signX = right > left ? 1 : -1; signY = 1; borderSkipped = vm.borderSkipped || 'left'; } // Canvas doesn't allow us to stroke inside the width so we can // adjust the sizes to fit if we're setting a stroke on the line if (borderWidth) { // borderWidth shold be less than bar width and bar height. var barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom)); borderWidth = borderWidth > barSize ? barSize : borderWidth; var halfStroke = borderWidth / 2; // Adjust borderWidth when bar top position is near vm.base(zero). var borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0); var borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0); var borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0); var borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0); // not become a vertical line? if (borderLeft !== borderRight) { top = borderTop; bottom = borderBottom; } // not become a horizontal line? if (borderTop !== borderBottom) { left = borderLeft; right = borderRight; } } ctx.beginPath(); ctx.fillStyle = vm.backgroundColor; ctx.strokeStyle = vm.borderColor; ctx.lineWidth = borderWidth; // Corner points, from bottom-left to bottom-right clockwise // | 1 2 | // | 0 3 | var corners = [ [left, bottom], [left, top], [right, top], [right, bottom] ]; // Find first (starting) corner with fallback to 'bottom' var borders = ['bottom', 'left', 'top', 'right']; var startCorner = borders.indexOf(borderSkipped, 0); if (startCorner === -1) { startCorner = 0; } function cornerAt(index) { return corners[(startCorner + index) % 4]; } // Draw rectangle from 'startCorner' var corner = cornerAt(0); ctx.moveTo(corner[0], corner[1]); for (var i = 1; i < 4; i++) { corner = cornerAt(i); ctx.lineTo(corner[0], corner[1]); } ctx.fill(); if (borderWidth) { ctx.stroke(); } }, height: function() { var vm = this._view; return vm.base - vm.y; }, inRange: function(mouseX, mouseY) { var inRange = false; if (this._view) { var bounds = getBarBounds(this); inRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom; } return inRange; }, inLabelRange: function(mouseX, mouseY) { var me = this; if (!me._view) { return false; } var inRange = false; var bounds = getBarBounds(me); if (isVertical(me)) { inRange = mouseX >= bounds.left && mouseX <= bounds.right; } else { inRange = mouseY >= bounds.top && mouseY <= bounds.bottom; } return inRange; }, inXRange: function(mouseX) { var bounds = getBarBounds(this); return mouseX >= bounds.left && mouseX <= bounds.right; }, inYRange: function(mouseY) { var bounds = getBarBounds(this); return mouseY >= bounds.top && mouseY <= bounds.bottom; }, getCenterPoint: function() { var vm = this._view; var x, y; if (isVertical(this)) { x = vm.x; y = (vm.y + vm.base) / 2; } else { x = (vm.x + vm.base) / 2; y = vm.y; } return {x: x, y: y}; }, getArea: function() { var vm = this._view; return vm.width * Math.abs(vm.y - vm.base); }, tooltipPosition: function() { var vm = this._view; return { x: vm.x, y: vm.y }; } }); },{"25":25,"26":26}],40:[function(require,module,exports){ 'use strict'; module.exports = {}; module.exports.Arc = require(36); module.exports.Line = require(37); module.exports.Point = require(38); module.exports.Rectangle = require(39); },{"36":36,"37":37,"38":38,"39":39}],41:[function(require,module,exports){ 'use strict'; var helpers = require(42); /** * @namespace Chart.helpers.canvas */ var exports = module.exports = { /** * Clears the entire canvas associated to the given `chart`. * @param {Chart} chart - The chart for which to clear the canvas. */ clear: function(chart) { chart.ctx.clearRect(0, 0, chart.width, chart.height); }, /** * Creates a "path" for a rectangle with rounded corners at position (x, y) with a * given size (width, height) and the same `radius` for all corners. * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. * @param {Number} x - The x axis of the coordinate for the rectangle starting point. * @param {Number} y - The y axis of the coordinate for the rectangle starting point. * @param {Number} width - The rectangle's width. * @param {Number} height - The rectangle's height. * @param {Number} radius - The rounded amount (in pixels) for the four corners. * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? */ roundedRect: function(ctx, x, y, width, height, radius) { if (radius) { var rx = Math.min(radius, width / 2); var ry = Math.min(radius, height / 2); ctx.moveTo(x + rx, y); ctx.lineTo(x + width - rx, y); ctx.quadraticCurveTo(x + width, y, x + width, y + ry); ctx.lineTo(x + width, y + height - ry); ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height); ctx.lineTo(x + rx, y + height); ctx.quadraticCurveTo(x, y + height, x, y + height - ry); ctx.lineTo(x, y + ry); ctx.quadraticCurveTo(x, y, x + rx, y); } else { ctx.rect(x, y, width, height); } }, drawPoint: function(ctx, style, radius, x, y) { var type, edgeLength, xOffset, yOffset, height, size; if (style && typeof style === 'object') { type = style.toString(); if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); return; } } if (isNaN(radius) || radius <= 0) { return; } switch (style) { // Default includes circle default: ctx.beginPath(); ctx.arc(x, y, radius, 0, Math.PI * 2); ctx.closePath(); ctx.fill(); break; case 'triangle': ctx.beginPath(); edgeLength = 3 * radius / Math.sqrt(3); height = edgeLength * Math.sqrt(3) / 2; ctx.moveTo(x - edgeLength / 2, y + height / 3); ctx.lineTo(x + edgeLength / 2, y + height / 3); ctx.lineTo(x, y - 2 * height / 3); ctx.closePath(); ctx.fill(); break; case 'rect': size = 1 / Math.SQRT2 * radius; ctx.beginPath(); ctx.fillRect(x - size, y - size, 2 * size, 2 * size); ctx.strokeRect(x - size, y - size, 2 * size, 2 * size); break; case 'rectRounded': var offset = radius / Math.SQRT2; var leftX = x - offset; var topY = y - offset; var sideSize = Math.SQRT2 * radius; ctx.beginPath(); this.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius / 2); ctx.closePath(); ctx.fill(); break; case 'rectRot': size = 1 / Math.SQRT2 * radius; ctx.beginPath(); ctx.moveTo(x - size, y); ctx.lineTo(x, y + size); ctx.lineTo(x + size, y); ctx.lineTo(x, y - size); ctx.closePath(); ctx.fill(); break; case 'cross': ctx.beginPath(); ctx.moveTo(x, y + radius); ctx.lineTo(x, y - radius); ctx.moveTo(x - radius, y); ctx.lineTo(x + radius, y); ctx.closePath(); break; case 'crossRot': ctx.beginPath(); xOffset = Math.cos(Math.PI / 4) * radius; yOffset = Math.sin(Math.PI / 4) * radius; ctx.moveTo(x - xOffset, y - yOffset); ctx.lineTo(x + xOffset, y + yOffset); ctx.moveTo(x - xOffset, y + yOffset); ctx.lineTo(x + xOffset, y - yOffset); ctx.closePath(); break; case 'star': ctx.beginPath(); ctx.moveTo(x, y + radius); ctx.lineTo(x, y - radius); ctx.moveTo(x - radius, y); ctx.lineTo(x + radius, y); xOffset = Math.cos(Math.PI / 4) * radius; yOffset = Math.sin(Math.PI / 4) * radius; ctx.moveTo(x - xOffset, y - yOffset); ctx.lineTo(x + xOffset, y + yOffset); ctx.moveTo(x - xOffset, y + yOffset); ctx.lineTo(x + xOffset, y - yOffset); ctx.closePath(); break; case 'line': ctx.beginPath(); ctx.moveTo(x - radius, y); ctx.lineTo(x + radius, y); ctx.closePath(); break; case 'dash': ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(x + radius, y); ctx.closePath(); break; } ctx.stroke(); }, clipArea: function(ctx, area) { ctx.save(); ctx.beginPath(); ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); ctx.clip(); }, unclipArea: function(ctx) { ctx.restore(); }, lineTo: function(ctx, previous, target, flip) { if (target.steppedLine) { if ((target.steppedLine === 'after' && !flip) || (target.steppedLine !== 'after' && flip)) { ctx.lineTo(previous.x, target.y); } else { ctx.lineTo(target.x, previous.y); } ctx.lineTo(target.x, target.y); return; } if (!target.tension) { ctx.lineTo(target.x, target.y); return; } ctx.bezierCurveTo( flip ? previous.controlPointPreviousX : previous.controlPointNextX, flip ? previous.controlPointPreviousY : previous.controlPointNextY, flip ? target.controlPointNextX : target.controlPointPreviousX, flip ? target.controlPointNextY : target.controlPointPreviousY, target.x, target.y); } }; // DEPRECATIONS /** * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. * @namespace Chart.helpers.clear * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.clear = exports.clear; /** * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. * @namespace Chart.helpers.drawRoundedRectangle * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.drawRoundedRectangle = function(ctx) { ctx.beginPath(); exports.roundedRect.apply(exports, arguments); ctx.closePath(); }; },{"42":42}],42:[function(require,module,exports){ 'use strict'; /** * @namespace Chart.helpers */ var helpers = { /** * An empty function that can be used, for example, for optional callback. */ noop: function() {}, /** * Returns a unique id, sequentially generated from a global variable. * @returns {Number} * @function */ uid: (function() { var id = 0; return function() { return id++; }; }()), /** * Returns true if `value` is neither null nor undefined, else returns false. * @param {*} value - The value to test. * @returns {Boolean} * @since 2.7.0 */ isNullOrUndef: function(value) { return value === null || typeof value === 'undefined'; }, /** * Returns true if `value` is an array, else returns false. * @param {*} value - The value to test. * @returns {Boolean} * @function */ isArray: Array.isArray ? Array.isArray : function(value) { return Object.prototype.toString.call(value) === '[object Array]'; }, /** * Returns true if `value` is an object (excluding null), else returns false. * @param {*} value - The value to test. * @returns {Boolean} * @since 2.7.0 */ isObject: function(value) { return value !== null && Object.prototype.toString.call(value) === '[object Object]'; }, /** * Returns `value` if defined, else returns `defaultValue`. * @param {*} value - The value to return if defined. * @param {*} defaultValue - The value to return if `value` is undefined. * @returns {*} */ valueOrDefault: function(value, defaultValue) { return typeof value === 'undefined' ? defaultValue : value; }, /** * Returns value at the given `index` in array if defined, else returns `defaultValue`. * @param {Array} value - The array to lookup for value at `index`. * @param {Number} index - The index in `value` to lookup for value. * @param {*} defaultValue - The value to return if `value[index]` is undefined. * @returns {*} */ valueAtIndexOrDefault: function(value, index, defaultValue) { return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); }, /** * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the * value returned by `fn`. If `fn` is not a function, this method returns undefined. * @param {Function} fn - The function to call. * @param {Array|undefined|null} args - The arguments with which `fn` should be called. * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`. * @returns {*} */ callback: function(fn, args, thisArg) { if (fn && typeof fn.call === 'function') { return fn.apply(thisArg, args); } }, /** * Note(SB) for performance sake, this method should only be used when loopable type * is unknown or in none intensive code (not called often and small loopable). Else * it's preferable to use a regular for() loop and save extra function calls. * @param {Object|Array} loopable - The object or array to be iterated. * @param {Function} fn - The function to call for each item. * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`. * @param {Boolean} [reverse] - If true, iterates backward on the loopable. */ each: function(loopable, fn, thisArg, reverse) { var i, len, keys; if (helpers.isArray(loopable)) { len = loopable.length; if (reverse) { for (i = len - 1; i >= 0; i--) { fn.call(thisArg, loopable[i], i); } } else { for (i = 0; i < len; i++) { fn.call(thisArg, loopable[i], i); } } } else if (helpers.isObject(loopable)) { keys = Object.keys(loopable); len = keys.length; for (i = 0; i < len; i++) { fn.call(thisArg, loopable[keys[i]], keys[i]); } } }, /** * Returns true if the `a0` and `a1` arrays have the same content, else returns false. * @see http://stackoverflow.com/a/14853974 * @param {Array} a0 - The array to compare * @param {Array} a1 - The array to compare * @returns {Boolean} */ arrayEquals: function(a0, a1) { var i, ilen, v0, v1; if (!a0 || !a1 || a0.length !== a1.length) { return false; } for (i = 0, ilen = a0.length; i < ilen; ++i) { v0 = a0[i]; v1 = a1[i]; if (v0 instanceof Array && v1 instanceof Array) { if (!helpers.arrayEquals(v0, v1)) { return false; } } else if (v0 !== v1) { // NOTE: two different object instances will never be equal: {x:20} != {x:20} return false; } } return true; }, /** * Returns a deep copy of `source` without keeping references on objects and arrays. * @param {*} source - The value to clone. * @returns {*} */ clone: function(source) { if (helpers.isArray(source)) { return source.map(helpers.clone); } if (helpers.isObject(source)) { var target = {}; var keys = Object.keys(source); var klen = keys.length; var k = 0; for (; k < klen; ++k) { target[keys[k]] = helpers.clone(source[keys[k]]); } return target; } return source; }, /** * The default merger when Chart.helpers.merge is called without merger option. * Note(SB): this method is also used by configMerge and scaleMerge as fallback. * @private */ _merger: function(key, target, source, options) { var tval = target[key]; var sval = source[key]; if (helpers.isObject(tval) && helpers.isObject(sval)) { helpers.merge(tval, sval, options); } else { target[key] = helpers.clone(sval); } }, /** * Merges source[key] in target[key] only if target[key] is undefined. * @private */ _mergerIf: function(key, target, source) { var tval = target[key]; var sval = source[key]; if (helpers.isObject(tval) && helpers.isObject(sval)) { helpers.mergeIf(tval, sval); } else if (!target.hasOwnProperty(key)) { target[key] = helpers.clone(sval); } }, /** * Recursively deep copies `source` properties into `target` with the given `options`. * IMPORTANT: `target` is not cloned and will be updated with `source` properties. * @param {Object} target - The target object in which all sources are merged into. * @param {Object|Array(Object)} source - Object(s) to merge into `target`. * @param {Object} [options] - Merging options: * @param {Function} [options.merger] - The merge method (key, target, source, options) * @returns {Object} The `target` object. */ merge: function(target, source, options) { var sources = helpers.isArray(source) ? source : [source]; var ilen = sources.length; var merge, i, keys, klen, k; if (!helpers.isObject(target)) { return target; } options = options || {}; merge = options.merger || helpers._merger; for (i = 0; i < ilen; ++i) { source = sources[i]; if (!helpers.isObject(source)) { continue; } keys = Object.keys(source); for (k = 0, klen = keys.length; k < klen; ++k) { merge(keys[k], target, source, options); } } return target; }, /** * Recursively deep copies `source` properties into `target` *only* if not defined in target. * IMPORTANT: `target` is not cloned and will be updated with `source` properties. * @param {Object} target - The target object in which all sources are merged into. * @param {Object|Array(Object)} source - Object(s) to merge into `target`. * @returns {Object} The `target` object. */ mergeIf: function(target, source) { return helpers.merge(target, source, {merger: helpers._mergerIf}); }, /** * Applies the contents of two or more objects together into the first object. * @param {Object} target - The target object in which all objects are merged into. * @param {Object} arg1 - Object containing additional properties to merge in target. * @param {Object} argN - Additional objects containing properties to merge in target. * @returns {Object} The `target` object. */ extend: function(target) { var setFn = function(value, key) { target[key] = value; }; for (var i = 1, ilen = arguments.length; i < ilen; ++i) { helpers.each(arguments[i], setFn); } return target; }, /** * Basic javascript inheritance based on the model created in Backbone.js */ inherits: function(extensions) { var me = this; var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() { return me.apply(this, arguments); }; var Surrogate = function() { this.constructor = ChartElement; }; Surrogate.prototype = me.prototype; ChartElement.prototype = new Surrogate(); ChartElement.extend = helpers.inherits; if (extensions) { helpers.extend(ChartElement.prototype, extensions); } ChartElement.__super__ = me.prototype; return ChartElement; } }; module.exports = helpers; // DEPRECATIONS /** * Provided for backward compatibility, use Chart.helpers.callback instead. * @function Chart.helpers.callCallback * @deprecated since version 2.6.0 * @todo remove at version 3 * @private */ helpers.callCallback = helpers.callback; /** * Provided for backward compatibility, use Array.prototype.indexOf instead. * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ * @function Chart.helpers.indexOf * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.indexOf = function(array, item, fromIndex) { return Array.prototype.indexOf.call(array, item, fromIndex); }; /** * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. * @function Chart.helpers.getValueOrDefault * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.getValueOrDefault = helpers.valueOrDefault; /** * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. * @function Chart.helpers.getValueAtIndexOrDefault * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; },{}],43:[function(require,module,exports){ 'use strict'; var helpers = require(42); /** * Easing functions adapted from Robert Penner's easing equations. * @namespace Chart.helpers.easingEffects * @see http://www.robertpenner.com/easing/ */ var effects = { linear: function(t) { return t; }, easeInQuad: function(t) { return t * t; }, easeOutQuad: function(t) { return -t * (t - 2); }, easeInOutQuad: function(t) { if ((t /= 0.5) < 1) { return 0.5 * t * t; } return -0.5 * ((--t) * (t - 2) - 1); }, easeInCubic: function(t) { return t * t * t; }, easeOutCubic: function(t) { return (t = t - 1) * t * t + 1; }, easeInOutCubic: function(t) { if ((t /= 0.5) < 1) { return 0.5 * t * t * t; } return 0.5 * ((t -= 2) * t * t + 2); }, easeInQuart: function(t) { return t * t * t * t; }, easeOutQuart: function(t) { return -((t = t - 1) * t * t * t - 1); }, easeInOutQuart: function(t) { if ((t /= 0.5) < 1) { return 0.5 * t * t * t * t; } return -0.5 * ((t -= 2) * t * t * t - 2); }, easeInQuint: function(t) { return t * t * t * t * t; }, easeOutQuint: function(t) { return (t = t - 1) * t * t * t * t + 1; }, easeInOutQuint: function(t) { if ((t /= 0.5) < 1) { return 0.5 * t * t * t * t * t; } return 0.5 * ((t -= 2) * t * t * t * t + 2); }, easeInSine: function(t) { return -Math.cos(t * (Math.PI / 2)) + 1; }, easeOutSine: function(t) { return Math.sin(t * (Math.PI / 2)); }, easeInOutSine: function(t) { return -0.5 * (Math.cos(Math.PI * t) - 1); }, easeInExpo: function(t) { return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); }, easeOutExpo: function(t) { return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; }, easeInOutExpo: function(t) { if (t === 0) { return 0; } if (t === 1) { return 1; } if ((t /= 0.5) < 1) { return 0.5 * Math.pow(2, 10 * (t - 1)); } return 0.5 * (-Math.pow(2, -10 * --t) + 2); }, easeInCirc: function(t) { if (t >= 1) { return t; } return -(Math.sqrt(1 - t * t) - 1); }, easeOutCirc: function(t) { return Math.sqrt(1 - (t = t - 1) * t); }, easeInOutCirc: function(t) { if ((t /= 0.5) < 1) { return -0.5 * (Math.sqrt(1 - t * t) - 1); } return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); }, easeInElastic: function(t) { var s = 1.70158; var p = 0; var a = 1; if (t === 0) { return 0; } if (t === 1) { return 1; } if (!p) { p = 0.3; } if (a < 1) { a = 1; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(1 / a); } return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); }, easeOutElastic: function(t) { var s = 1.70158; var p = 0; var a = 1; if (t === 0) { return 0; } if (t === 1) { return 1; } if (!p) { p = 0.3; } if (a < 1) { a = 1; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(1 / a); } return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; }, easeInOutElastic: function(t) { var s = 1.70158; var p = 0; var a = 1; if (t === 0) { return 0; } if ((t /= 0.5) === 2) { return 1; } if (!p) { p = 0.45; } if (a < 1) { a = 1; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(1 / a); } if (t < 1) { return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); } return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; }, easeInBack: function(t) { var s = 1.70158; return t * t * ((s + 1) * t - s); }, easeOutBack: function(t) { var s = 1.70158; return (t = t - 1) * t * ((s + 1) * t + s) + 1; }, easeInOutBack: function(t) { var s = 1.70158; if ((t /= 0.5) < 1) { return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); } return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); }, easeInBounce: function(t) { return 1 - effects.easeOutBounce(1 - t); }, easeOutBounce: function(t) { if (t < (1 / 2.75)) { return 7.5625 * t * t; } if (t < (2 / 2.75)) { return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; } if (t < (2.5 / 2.75)) { return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; } return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; }, easeInOutBounce: function(t) { if (t < 0.5) { return effects.easeInBounce(t * 2) * 0.5; } return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; } }; module.exports = { effects: effects }; // DEPRECATIONS /** * Provided for backward compatibility, use Chart.helpers.easing.effects instead. * @function Chart.helpers.easingEffects * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.easingEffects = effects; },{"42":42}],44:[function(require,module,exports){ 'use strict'; var helpers = require(42); /** * @alias Chart.helpers.options * @namespace */ module.exports = { /** * Converts the given line height `value` in pixels for a specific font `size`. * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). * @param {Number} size - The font size (in pixels) used to resolve relative `value`. * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid). * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height * @since 2.7.0 */ toLineHeight: function(value, size) { var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); if (!matches || matches[1] === 'normal') { return size * 1.2; } value = +matches[2]; switch (matches[3]) { case 'px': return value; case '%': value /= 100; break; default: break; } return size * value; }, /** * Converts the given value into a padding object with pre-computed width/height. * @param {Number|Object} value - If a number, set the value to all TRBL component, * else, if and object, use defined properties and sets undefined ones to 0. * @returns {Object} The padding values (top, right, bottom, left, width, height) * @since 2.7.0 */ toPadding: function(value) { var t, r, b, l; if (helpers.isObject(value)) { t = +value.top || 0; r = +value.right || 0; b = +value.bottom || 0; l = +value.left || 0; } else { t = r = b = l = +value || 0; } return { top: t, right: r, bottom: b, left: l, height: t + b, width: l + r }; }, /** * Evaluates the given `inputs` sequentially and returns the first defined value. * @param {Array[]} inputs - An array of values, falling back to the last value. * @param {Object} [context] - If defined and the current value is a function, the value * is called with `context` as first argument and the result becomes the new input. * @param {Number} [index] - If defined and the current value is an array, the value * at `index` become the new input. * @since 2.7.0 */ resolve: function(inputs, context, index) { var i, ilen, value; for (i = 0, ilen = inputs.length; i < ilen; ++i) { value = inputs[i]; if (value === undefined) { continue; } if (context !== undefined && typeof value === 'function') { value = value(context); } if (index !== undefined && helpers.isArray(value)) { value = value[index]; } if (value !== undefined) { return value; } } } }; },{"42":42}],45:[function(require,module,exports){ 'use strict'; module.exports = require(42); module.exports.easing = require(43); module.exports.canvas = require(41); module.exports.options = require(44); },{"41":41,"42":42,"43":43,"44":44}],46:[function(require,module,exports){ /** * Platform fallback implementation (minimal). * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 */ module.exports = { acquireContext: function(item) { if (item && item.canvas) { // Support for any object associated to a canvas (including a context2d) item = item.canvas; } return item && item.getContext('2d') || null; } }; },{}],47:[function(require,module,exports){ /** * Chart.Platform implementation for targeting a web browser */ 'use strict'; var helpers = require(45); var EXPANDO_KEY = '$chartjs'; var CSS_PREFIX = 'chartjs-'; var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; /** * DOM event types -> Chart.js event types. * Note: only events with different types are mapped. * @see https://developer.mozilla.org/en-US/docs/Web/Events */ var EVENT_TYPES = { touchstart: 'mousedown', touchmove: 'mousemove', touchend: 'mouseup', pointerenter: 'mouseenter', pointerdown: 'mousedown', pointermove: 'mousemove', pointerup: 'mouseup', pointerleave: 'mouseout', pointerout: 'mouseout' }; /** * The "used" size is the final value of a dimension property after all calculations have * been performed. This method uses the computed style of `element` but returns undefined * if the computed style is not expressed in pixels. That can happen in some cases where * `element` has a size relative to its parent and this last one is not yet displayed, * for example because of `display: none` on a parent node. * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value * @returns {Number} Size in pixels or undefined if unknown. */ function readUsedSize(element, property) { var value = helpers.getStyle(element, property); var matches = value && value.match(/^(\d+)(\.\d+)?px$/); return matches ? Number(matches[1]) : undefined; } /** * Initializes the canvas style and render size without modifying the canvas display size, * since responsiveness is handled by the controller.resize() method. The config is used * to determine the aspect ratio to apply in case no explicit height has been specified. */ function initCanvas(canvas, config) { var style = canvas.style; // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it // returns null or '' if no explicit value has been set to the canvas attribute. var renderHeight = canvas.getAttribute('height'); var renderWidth = canvas.getAttribute('width'); // Chart.js modifies some canvas values that we want to restore on destroy canvas[EXPANDO_KEY] = { initial: { height: renderHeight, width: renderWidth, style: { display: style.display, height: style.height, width: style.width } } }; // Force canvas to display as block to avoid extra space caused by inline // elements, which would interfere with the responsive resize process. // https://github.com/chartjs/Chart.js/issues/2538 style.display = style.display || 'block'; if (renderWidth === null || renderWidth === '') { var displayWidth = readUsedSize(canvas, 'width'); if (displayWidth !== undefined) { canvas.width = displayWidth; } } if (renderHeight === null || renderHeight === '') { if (canvas.style.height === '') { // If no explicit render height and style height, let's apply the aspect ratio, // which one can be specified by the user but also by charts as default option // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. canvas.height = canvas.width / (config.options.aspectRatio || 2); } else { var displayHeight = readUsedSize(canvas, 'height'); if (displayWidth !== undefined) { canvas.height = displayHeight; } } } return canvas; } /** * Detects support for options object argument in addEventListener. * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support * @private */ var supportsEventListenerOptions = (function() { var supports = false; try { var options = Object.defineProperty({}, 'passive', { get: function() { supports = true; } }); window.addEventListener('e', null, options); } catch (e) { // continue regardless of error } return supports; }()); // Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. // https://github.com/chartjs/Chart.js/issues/4287 var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; function addEventListener(node, type, listener) { node.addEventListener(type, listener, eventListenerOptions); } function removeEventListener(node, type, listener) { node.removeEventListener(type, listener, eventListenerOptions); } function createEvent(type, chart, x, y, nativeEvent) { return { type: type, chart: chart, native: nativeEvent || null, x: x !== undefined ? x : null, y: y !== undefined ? y : null, }; } function fromNativeEvent(event, chart) { var type = EVENT_TYPES[event.type] || event.type; var pos = helpers.getRelativePosition(event, chart); return createEvent(type, chart, pos.x, pos.y, event); } function throttled(fn, thisArg) { var ticking = false; var args = []; return function() { args = Array.prototype.slice.call(arguments); thisArg = thisArg || this; if (!ticking) { ticking = true; helpers.requestAnimFrame.call(window, function() { ticking = false; fn.apply(thisArg, args); }); } }; } // Implementation based on https://github.com/marcj/css-element-queries function createResizer(handler) { var resizer = document.createElement('div'); var cls = CSS_PREFIX + 'size-monitor'; var maxSize = 1000000; var style = 'position:absolute;' + 'left:0;' + 'top:0;' + 'right:0;' + 'bottom:0;' + 'overflow:hidden;' + 'pointer-events:none;' + 'visibility:hidden;' + 'z-index:-1;'; resizer.style.cssText = style; resizer.className = cls; resizer.innerHTML = '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
'; var expand = resizer.childNodes[0]; var shrink = resizer.childNodes[1]; resizer._reset = function() { expand.scrollLeft = maxSize; expand.scrollTop = maxSize; shrink.scrollLeft = maxSize; shrink.scrollTop = maxSize; }; var onScroll = function() { resizer._reset(); handler(); }; addEventListener(expand, 'scroll', onScroll.bind(expand, 'expand')); addEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); return resizer; } // https://davidwalsh.name/detect-node-insertion function watchForRender(node, handler) { var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); var proxy = expando.renderProxy = function(e) { if (e.animationName === CSS_RENDER_ANIMATION) { handler(); } }; helpers.each(ANIMATION_START_EVENTS, function(type) { addEventListener(node, type, proxy); }); // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class // is removed then added back immediately (same animation frame?). Accessing the // `offsetParent` property will force a reflow and re-evaluate the CSS animation. // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics // https://github.com/chartjs/Chart.js/issues/4737 expando.reflow = !!node.offsetParent; node.classList.add(CSS_RENDER_MONITOR); } function unwatchForRender(node) { var expando = node[EXPANDO_KEY] || {}; var proxy = expando.renderProxy; if (proxy) { helpers.each(ANIMATION_START_EVENTS, function(type) { removeEventListener(node, type, proxy); }); delete expando.renderProxy; } node.classList.remove(CSS_RENDER_MONITOR); } function addResizeListener(node, listener, chart) { var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); // Let's keep track of this added resizer and thus avoid DOM query when removing it. var resizer = expando.resizer = createResizer(throttled(function() { if (expando.resizer) { return listener(createEvent('resize', chart)); } })); // The resizer needs to be attached to the node parent, so we first need to be // sure that `node` is attached to the DOM before injecting the resizer element. watchForRender(node, function() { if (expando.resizer) { var container = node.parentNode; if (container && container !== resizer.parentNode) { container.insertBefore(resizer, container.firstChild); } // The container size might have changed, let's reset the resizer state. resizer._reset(); } }); } function removeResizeListener(node) { var expando = node[EXPANDO_KEY] || {}; var resizer = expando.resizer; delete expando.resizer; unwatchForRender(node); if (resizer && resizer.parentNode) { resizer.parentNode.removeChild(resizer); } } function injectCSS(platform, css) { // http://stackoverflow.com/q/3922139 var style = platform._style || document.createElement('style'); if (!platform._style) { platform._style = style; css = '/* Chart.js */\n' + css; style.setAttribute('type', 'text/css'); document.getElementsByTagName('head')[0].appendChild(style); } style.appendChild(document.createTextNode(css)); } module.exports = { /** * This property holds whether this platform is enabled for the current environment. * Currently used by platform.js to select the proper implementation. * @private */ _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', initialize: function() { var keyframes = 'from{opacity:0.99}to{opacity:1}'; injectCSS(this, // DOM rendering detection // https://davidwalsh.name/detect-node-insertion '@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + '@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + '.' + CSS_RENDER_MONITOR + '{' + '-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + 'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + '}' ); }, acquireContext: function(item, config) { if (typeof item === 'string') { item = document.getElementById(item); } else if (item.length) { // Support for array based queries (such as jQuery) item = item[0]; } if (item && item.canvas) { // Support for any object associated to a canvas (including a context2d) item = item.canvas; } // To prevent canvas fingerprinting, some add-ons undefine the getContext // method, for example: https://github.com/kkapsner/CanvasBlocker // https://github.com/chartjs/Chart.js/issues/2807 var context = item && item.getContext && item.getContext('2d'); // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is // inside an iframe or when running in a protected environment. We could guess the // types from their toString() value but let's keep things flexible and assume it's // a sufficient condition if the item has a context2D which has item as `canvas`. // https://github.com/chartjs/Chart.js/issues/3887 // https://github.com/chartjs/Chart.js/issues/4102 // https://github.com/chartjs/Chart.js/issues/4152 if (context && context.canvas === item) { initCanvas(item, config); return context; } return null; }, releaseContext: function(context) { var canvas = context.canvas; if (!canvas[EXPANDO_KEY]) { return; } var initial = canvas[EXPANDO_KEY].initial; ['height', 'width'].forEach(function(prop) { var value = initial[prop]; if (helpers.isNullOrUndef(value)) { canvas.removeAttribute(prop); } else { canvas.setAttribute(prop, value); } }); helpers.each(initial.style || {}, function(value, key) { canvas.style[key] = value; }); // The canvas render size might have been changed (and thus the state stack discarded), // we can't use save() and restore() to restore the initial state. So make sure that at // least the canvas context is reset to the default state by setting the canvas width. // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html canvas.width = canvas.width; delete canvas[EXPANDO_KEY]; }, addEventListener: function(chart, type, listener) { var canvas = chart.canvas; if (type === 'resize') { // Note: the resize event is not supported on all browsers. addResizeListener(canvas, listener, chart); return; } var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); var proxies = expando.proxies || (expando.proxies = {}); var proxy = proxies[chart.id + '_' + type] = function(event) { listener(fromNativeEvent(event, chart)); }; addEventListener(canvas, type, proxy); }, removeEventListener: function(chart, type, listener) { var canvas = chart.canvas; if (type === 'resize') { // Note: the resize event is not supported on all browsers. removeResizeListener(canvas, listener); return; } var expando = listener[EXPANDO_KEY] || {}; var proxies = expando.proxies || {}; var proxy = proxies[chart.id + '_' + type]; if (!proxy) { return; } removeEventListener(canvas, type, proxy); } }; // DEPRECATIONS /** * Provided for backward compatibility, use EventTarget.addEventListener instead. * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener * @function Chart.helpers.addEvent * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.addEvent = addEventListener; /** * Provided for backward compatibility, use EventTarget.removeEventListener instead. * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener * @function Chart.helpers.removeEvent * @deprecated since version 2.7.0 * @todo remove at version 3 * @private */ helpers.removeEvent = removeEventListener; },{"45":45}],48:[function(require,module,exports){ 'use strict'; var helpers = require(45); var basic = require(46); var dom = require(47); // @TODO Make possible to select another platform at build time. var implementation = dom._enabled ? dom : basic; /** * @namespace Chart.platform * @see https://chartjs.gitbooks.io/proposals/content/Platform.html * @since 2.4.0 */ module.exports = helpers.extend({ /** * @since 2.7.0 */ initialize: function() {}, /** * Called at chart construction time, returns a context2d instance implementing * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. * @param {*} item - The native item from which to acquire context (platform specific) * @param {Object} options - The chart options * @returns {CanvasRenderingContext2D} context2d instance */ acquireContext: function() {}, /** * Called at chart destruction time, releases any resources associated to the context * previously returned by the acquireContext() method. * @param {CanvasRenderingContext2D} context - The context2d instance * @returns {Boolean} true if the method succeeded, else false */ releaseContext: function() {}, /** * Registers the specified listener on the given chart. * @param {Chart} chart - Chart from which to listen for event * @param {String} type - The ({@link IEvent}) type to listen for * @param {Function} listener - Receives a notification (an object that implements * the {@link IEvent} interface) when an event of the specified type occurs. */ addEventListener: function() {}, /** * Removes the specified listener previously registered with addEventListener. * @param {Chart} chart -Chart from which to remove the listener * @param {String} type - The ({@link IEvent}) type to remove * @param {Function} listener - The listener function to remove from the event target. */ removeEventListener: function() {} }, implementation); /** * @interface IPlatform * Allows abstracting platform dependencies away from the chart * @borrows Chart.platform.acquireContext as acquireContext * @borrows Chart.platform.releaseContext as releaseContext * @borrows Chart.platform.addEventListener as addEventListener * @borrows Chart.platform.removeEventListener as removeEventListener */ /** * @interface IEvent * @prop {String} type - The event type name, possible values are: * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout', * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize' * @prop {*} native - The original native event (null for emulated events, e.g. 'resize') * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events) * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events) */ },{"45":45,"46":46,"47":47}],49:[function(require,module,exports){ /** * Plugin based on discussion from the following Chart.js issues: * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569 * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897 */ 'use strict'; var defaults = require(25); var elements = require(40); var helpers = require(45); defaults._set('global', { plugins: { filler: { propagate: true } } }); module.exports = function() { var mappers = { dataset: function(source) { var index = source.fill; var chart = source.chart; var meta = chart.getDatasetMeta(index); var visible = meta && chart.isDatasetVisible(index); var points = (visible && meta.dataset._children) || []; var length = points.length || 0; return !length ? null : function(point, i) { return (i < length && points[i]._view) || null; }; }, boundary: function(source) { var boundary = source.boundary; var x = boundary ? boundary.x : null; var y = boundary ? boundary.y : null; return function(point) { return { x: x === null ? point.x : x, y: y === null ? point.y : y, }; }; } }; // @todo if (fill[0] === '#') function decodeFill(el, index, count) { var model = el._model || {}; var fill = model.fill; var target; if (fill === undefined) { fill = !!model.backgroundColor; } if (fill === false || fill === null) { return false; } if (fill === true) { return 'origin'; } target = parseFloat(fill, 10); if (isFinite(target) && Math.floor(target) === target) { if (fill[0] === '-' || fill[0] === '+') { target = index + target; } if (target === index || target < 0 || target >= count) { return false; } return target; } switch (fill) { // compatibility case 'bottom': return 'start'; case 'top': return 'end'; case 'zero': return 'origin'; // supported boundaries case 'origin': case 'start': case 'end': return fill; // invalid fill values default: return false; } } function computeBoundary(source) { var model = source.el._model || {}; var scale = source.el._scale || {}; var fill = source.fill; var target = null; var horizontal; if (isFinite(fill)) { return null; } // Backward compatibility: until v3, we still need to support boundary values set on // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and // controllers might still use it (e.g. the Smith chart). if (fill === 'start') { target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; } else if (fill === 'end') { target = model.scaleTop === undefined ? scale.top : model.scaleTop; } else if (model.scaleZero !== undefined) { target = model.scaleZero; } else if (scale.getBasePosition) { target = scale.getBasePosition(); } else if (scale.getBasePixel) { target = scale.getBasePixel(); } if (target !== undefined && target !== null) { if (target.x !== undefined && target.y !== undefined) { return target; } if (typeof target === 'number' && isFinite(target)) { horizontal = scale.isHorizontal(); return { x: horizontal ? target : null, y: horizontal ? null : target }; } } return null; } function resolveTarget(sources, index, propagate) { var source = sources[index]; var fill = source.fill; var visited = [index]; var target; if (!propagate) { return fill; } while (fill !== false && visited.indexOf(fill) === -1) { if (!isFinite(fill)) { return fill; } target = sources[fill]; if (!target) { return false; } if (target.visible) { return fill; } visited.push(fill); fill = target.fill; } return false; } function createMapper(source) { var fill = source.fill; var type = 'dataset'; if (fill === false) { return null; } if (!isFinite(fill)) { type = 'boundary'; } return mappers[type](source); } function isDrawable(point) { return point && !point.skip; } function drawArea(ctx, curve0, curve1, len0, len1) { var i; if (!len0 || !len1) { return; } // building first area curve (normal) ctx.moveTo(curve0[0].x, curve0[0].y); for (i = 1; i < len0; ++i) { helpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); } // joining the two area curves ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); // building opposite area curve (reverse) for (i = len1 - 1; i > 0; --i) { helpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); } } function doFill(ctx, points, mapper, view, color, loop) { var count = points.length; var span = view.spanGaps; var curve0 = []; var curve1 = []; var len0 = 0; var len1 = 0; var i, ilen, index, p0, p1, d0, d1; ctx.beginPath(); for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { index = i % count; p0 = points[index]._view; p1 = mapper(p0, index, view); d0 = isDrawable(p0); d1 = isDrawable(p1); if (d0 && d1) { len0 = curve0.push(p0); len1 = curve1.push(p1); } else if (len0 && len1) { if (!span) { drawArea(ctx, curve0, curve1, len0, len1); len0 = len1 = 0; curve0 = []; curve1 = []; } else { if (d0) { curve0.push(p0); } if (d1) { curve1.push(p1); } } } } drawArea(ctx, curve0, curve1, len0, len1); ctx.closePath(); ctx.fillStyle = color; ctx.fill(); } return { id: 'filler', afterDatasetsUpdate: function(chart, options) { var count = (chart.data.datasets || []).length; var propagate = options.propagate; var sources = []; var meta, i, el, source; for (i = 0; i < count; ++i) { meta = chart.getDatasetMeta(i); el = meta.dataset; source = null; if (el && el._model && el instanceof elements.Line) { source = { visible: chart.isDatasetVisible(i), fill: decodeFill(el, i, count), chart: chart, el: el }; } meta.$filler = source; sources.push(source); } for (i = 0; i < count; ++i) { source = sources[i]; if (!source) { continue; } source.fill = resolveTarget(sources, i, propagate); source.boundary = computeBoundary(source); source.mapper = createMapper(source); } }, beforeDatasetDraw: function(chart, args) { var meta = args.meta.$filler; if (!meta) { return; } var ctx = chart.ctx; var el = meta.el; var view = el._view; var points = el._children || []; var mapper = meta.mapper; var color = view.backgroundColor || defaults.global.defaultColor; if (mapper && color && points.length) { helpers.canvas.clipArea(ctx, chart.chartArea); doFill(ctx, points, mapper, view, color, el._loop); helpers.canvas.unclipArea(ctx); } } }; }; },{"25":25,"40":40,"45":45}],50:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); defaults._set('global', { legend: { display: true, position: 'top', fullWidth: true, reverse: false, weight: 1000, // a callback that will handle onClick: function(e, legendItem) { var index = legendItem.datasetIndex; var ci = this.chart; var meta = ci.getDatasetMeta(index); // See controller.isDatasetVisible comment meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; // We hid a dataset ... rerender the chart ci.update(); }, onHover: null, labels: { boxWidth: 40, padding: 10, // Generates labels shown in the legend // Valid properties to return: // text : text to display // fillStyle : fill of coloured box // strokeStyle: stroke of coloured box // hidden : if this legend item refers to a hidden item // lineCap : cap style for line // lineDash // lineDashOffset : // lineJoin : // lineWidth : generateLabels: function(chart) { var data = chart.data; return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) { return { text: dataset.label, fillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), hidden: !chart.isDatasetVisible(i), lineCap: dataset.borderCapStyle, lineDash: dataset.borderDash, lineDashOffset: dataset.borderDashOffset, lineJoin: dataset.borderJoinStyle, lineWidth: dataset.borderWidth, strokeStyle: dataset.borderColor, pointStyle: dataset.pointStyle, // Below is extra data used for toggling the datasets datasetIndex: i }; }, this) : []; } } }, legendCallback: function(chart) { var text = []; text.push('
    '); for (var i = 0; i < chart.data.datasets.length; i++) { text.push('
  • '); if (chart.data.datasets[i].label) { text.push(chart.data.datasets[i].label); } text.push('
  • '); } text.push('
'); return text.join(''); } }); module.exports = function(Chart) { var layout = Chart.layoutService; var noop = helpers.noop; /** * Helper function to get the box width based on the usePointStyle option * @param labelopts {Object} the label options on the legend * @param fontSize {Number} the label font size * @return {Number} width of the color box area */ function getBoxWidth(labelOpts, fontSize) { return labelOpts.usePointStyle ? fontSize * Math.SQRT2 : labelOpts.boxWidth; } Chart.Legend = Element.extend({ initialize: function(config) { helpers.extend(this, config); // Contains hit boxes for each dataset (in dataset order) this.legendHitBoxes = []; // Are we in doughnut mode which has a different data type this.doughnutMode = false; }, // These methods are ordered by lifecycle. Utilities then follow. // Any function defined here is inherited by all legend types. // Any function can be extended by the legend type beforeUpdate: noop, update: function(maxWidth, maxHeight, margins) { var me = this; // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) me.beforeUpdate(); // Absorb the master measurements me.maxWidth = maxWidth; me.maxHeight = maxHeight; me.margins = margins; // Dimensions me.beforeSetDimensions(); me.setDimensions(); me.afterSetDimensions(); // Labels me.beforeBuildLabels(); me.buildLabels(); me.afterBuildLabels(); // Fit me.beforeFit(); me.fit(); me.afterFit(); // me.afterUpdate(); return me.minSize; }, afterUpdate: noop, // beforeSetDimensions: noop, setDimensions: function() { var me = this; // Set the unconstrained dimension before label rotation if (me.isHorizontal()) { // Reset position before calculating rotation me.width = me.maxWidth; me.left = 0; me.right = me.width; } else { me.height = me.maxHeight; // Reset position before calculating rotation me.top = 0; me.bottom = me.height; } // Reset padding me.paddingLeft = 0; me.paddingTop = 0; me.paddingRight = 0; me.paddingBottom = 0; // Reset minSize me.minSize = { width: 0, height: 0 }; }, afterSetDimensions: noop, // beforeBuildLabels: noop, buildLabels: function() { var me = this; var labelOpts = me.options.labels || {}; var legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || []; if (labelOpts.filter) { legendItems = legendItems.filter(function(item) { return labelOpts.filter(item, me.chart.data); }); } if (me.options.reverse) { legendItems.reverse(); } me.legendItems = legendItems; }, afterBuildLabels: noop, // beforeFit: noop, fit: function() { var me = this; var opts = me.options; var labelOpts = opts.labels; var display = opts.display; var ctx = me.ctx; var globalDefault = defaults.global; var valueOrDefault = helpers.valueOrDefault; var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize); var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle); var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily); var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily); // Reset hit boxes var hitboxes = me.legendHitBoxes = []; var minSize = me.minSize; var isHorizontal = me.isHorizontal(); if (isHorizontal) { minSize.width = me.maxWidth; // fill all the width minSize.height = display ? 10 : 0; } else { minSize.width = display ? 10 : 0; minSize.height = me.maxHeight; // fill all the height } // Increase sizes here if (display) { ctx.font = labelFont; if (isHorizontal) { // Labels // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one var lineWidths = me.lineWidths = [0]; var totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0; ctx.textAlign = 'left'; ctx.textBaseline = 'top'; helpers.each(me.legendItems, function(legendItem, i) { var boxWidth = getBoxWidth(labelOpts, fontSize); var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; if (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) { totalHeight += fontSize + (labelOpts.padding); lineWidths[lineWidths.length] = me.left; } // Store the hitbox width and height here. Final position will be updated in `draw` hitboxes[i] = { left: 0, top: 0, width: width, height: fontSize }; lineWidths[lineWidths.length - 1] += width + labelOpts.padding; }); minSize.height += totalHeight; } else { var vPadding = labelOpts.padding; var columnWidths = me.columnWidths = []; var totalWidth = labelOpts.padding; var currentColWidth = 0; var currentColHeight = 0; var itemHeight = fontSize + vPadding; helpers.each(me.legendItems, function(legendItem, i) { var boxWidth = getBoxWidth(labelOpts, fontSize); var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; // If too tall, go to new column if (currentColHeight + itemHeight > minSize.height) { totalWidth += currentColWidth + labelOpts.padding; columnWidths.push(currentColWidth); // previous column width currentColWidth = 0; currentColHeight = 0; } // Get max width currentColWidth = Math.max(currentColWidth, itemWidth); currentColHeight += itemHeight; // Store the hitbox width and height here. Final position will be updated in `draw` hitboxes[i] = { left: 0, top: 0, width: itemWidth, height: fontSize }; }); totalWidth += currentColWidth; columnWidths.push(currentColWidth); minSize.width += totalWidth; } } me.width = minSize.width; me.height = minSize.height; }, afterFit: noop, // Shared Methods isHorizontal: function() { return this.options.position === 'top' || this.options.position === 'bottom'; }, // Actually draw the legend on the canvas draw: function() { var me = this; var opts = me.options; var labelOpts = opts.labels; var globalDefault = defaults.global; var lineDefault = globalDefault.elements.line; var legendWidth = me.width; var lineWidths = me.lineWidths; if (opts.display) { var ctx = me.ctx; var valueOrDefault = helpers.valueOrDefault; var fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor); var fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize); var fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle); var fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily); var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily); var cursor; // Canvas setup ctx.textAlign = 'left'; ctx.textBaseline = 'middle'; ctx.lineWidth = 0.5; ctx.strokeStyle = fontColor; // for strikethrough effect ctx.fillStyle = fontColor; // render in correct colour ctx.font = labelFont; var boxWidth = getBoxWidth(labelOpts, fontSize); var hitboxes = me.legendHitBoxes; // current position var drawLegendBox = function(x, y, legendItem) { if (isNaN(boxWidth) || boxWidth <= 0) { return; } // Set the ctx for the box ctx.save(); ctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor); ctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle); ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset); ctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle); ctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth); ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor); var isLineWidthZero = (valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0); if (ctx.setLineDash) { // IE 9 and 10 do not support line dash ctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash)); } if (opts.labels && opts.labels.usePointStyle) { // Recalculate x and y for drawPoint() because its expecting // x and y to be center of figure (instead of top left) var radius = fontSize * Math.SQRT2 / 2; var offSet = radius / Math.SQRT2; var centerX = x + offSet; var centerY = y + offSet; // Draw pointStyle as legend symbol helpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); } else { // Draw box as legend symbol if (!isLineWidthZero) { ctx.strokeRect(x, y, boxWidth, fontSize); } ctx.fillRect(x, y, boxWidth, fontSize); } ctx.restore(); }; var fillText = function(x, y, legendItem, textWidth) { var halfFontSize = fontSize / 2; var xLeft = boxWidth + halfFontSize + x; var yMiddle = y + halfFontSize; ctx.fillText(legendItem.text, xLeft, yMiddle); if (legendItem.hidden) { // Strikethrough the text if hidden ctx.beginPath(); ctx.lineWidth = 2; ctx.moveTo(xLeft, yMiddle); ctx.lineTo(xLeft + textWidth, yMiddle); ctx.stroke(); } }; // Horizontal var isHorizontal = me.isHorizontal(); if (isHorizontal) { cursor = { x: me.left + ((legendWidth - lineWidths[0]) / 2), y: me.top + labelOpts.padding, line: 0 }; } else { cursor = { x: me.left + labelOpts.padding, y: me.top + labelOpts.padding, line: 0 }; } var itemHeight = fontSize + labelOpts.padding; helpers.each(me.legendItems, function(legendItem, i) { var textWidth = ctx.measureText(legendItem.text).width; var width = boxWidth + (fontSize / 2) + textWidth; var x = cursor.x; var y = cursor.y; if (isHorizontal) { if (x + width >= legendWidth) { y = cursor.y += itemHeight; cursor.line++; x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2); } } else if (y + itemHeight > me.bottom) { x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; y = cursor.y = me.top + labelOpts.padding; cursor.line++; } drawLegendBox(x, y, legendItem); hitboxes[i].left = x; hitboxes[i].top = y; // Fill the actual label fillText(x, y, legendItem, textWidth); if (isHorizontal) { cursor.x += width + (labelOpts.padding); } else { cursor.y += itemHeight; } }); } }, /** * Handle an event * @private * @param {IEvent} event - The event to handle * @return {Boolean} true if a change occured */ handleEvent: function(e) { var me = this; var opts = me.options; var type = e.type === 'mouseup' ? 'click' : e.type; var changed = false; if (type === 'mousemove') { if (!opts.onHover) { return; } } else if (type === 'click') { if (!opts.onClick) { return; } } else { return; } // Chart event already has relative position in it var x = e.x; var y = e.y; if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { // See if we are touching one of the dataset boxes var lh = me.legendHitBoxes; for (var i = 0; i < lh.length; ++i) { var hitBox = lh[i]; if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { // Touching an element if (type === 'click') { // use e.native for backwards compatibility opts.onClick.call(me, e.native, me.legendItems[i]); changed = true; break; } else if (type === 'mousemove') { // use e.native for backwards compatibility opts.onHover.call(me, e.native, me.legendItems[i]); changed = true; break; } } } } return changed; } }); function createNewLegendAndAttach(chart, legendOpts) { var legend = new Chart.Legend({ ctx: chart.ctx, options: legendOpts, chart: chart }); layout.configure(chart, legend, legendOpts); layout.addBox(chart, legend); chart.legend = legend; } return { id: 'legend', beforeInit: function(chart) { var legendOpts = chart.options.legend; if (legendOpts) { createNewLegendAndAttach(chart, legendOpts); } }, beforeUpdate: function(chart) { var legendOpts = chart.options.legend; var legend = chart.legend; if (legendOpts) { helpers.mergeIf(legendOpts, defaults.global.legend); if (legend) { layout.configure(chart, legend, legendOpts); legend.options = legendOpts; } else { createNewLegendAndAttach(chart, legendOpts); } } else if (legend) { layout.removeBox(chart, legend); delete chart.legend; } }, afterEvent: function(chart, e) { var legend = chart.legend; if (legend) { legend.handleEvent(e); } } }; }; },{"25":25,"26":26,"45":45}],51:[function(require,module,exports){ 'use strict'; var defaults = require(25); var Element = require(26); var helpers = require(45); defaults._set('global', { title: { display: false, fontStyle: 'bold', fullWidth: true, lineHeight: 1.2, padding: 10, position: 'top', text: '', weight: 2000 // by default greater than legend (1000) to be above } }); module.exports = function(Chart) { var layout = Chart.layoutService; var noop = helpers.noop; Chart.Title = Element.extend({ initialize: function(config) { var me = this; helpers.extend(me, config); // Contains hit boxes for each dataset (in dataset order) me.legendHitBoxes = []; }, // These methods are ordered by lifecycle. Utilities then follow. beforeUpdate: noop, update: function(maxWidth, maxHeight, margins) { var me = this; // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) me.beforeUpdate(); // Absorb the master measurements me.maxWidth = maxWidth; me.maxHeight = maxHeight; me.margins = margins; // Dimensions me.beforeSetDimensions(); me.setDimensions(); me.afterSetDimensions(); // Labels me.beforeBuildLabels(); me.buildLabels(); me.afterBuildLabels(); // Fit me.beforeFit(); me.fit(); me.afterFit(); // me.afterUpdate(); return me.minSize; }, afterUpdate: noop, // beforeSetDimensions: noop, setDimensions: function() { var me = this; // Set the unconstrained dimension before label rotation if (me.isHorizontal()) { // Reset position before calculating rotation me.width = me.maxWidth; me.left = 0; me.right = me.width; } else { me.height = me.maxHeight; // Reset position before calculating rotation me.top = 0; me.bottom = me.height; } // Reset padding me.paddingLeft = 0; me.paddingTop = 0; me.paddingRight = 0; me.paddingBottom = 0; // Reset minSize me.minSize = { width: 0, height: 0 }; }, afterSetDimensions: noop, // beforeBuildLabels: noop, buildLabels: noop, afterBuildLabels: noop, // beforeFit: noop, fit: function() { var me = this; var valueOrDefault = helpers.valueOrDefault; var opts = me.options; var display = opts.display; var fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize); var minSize = me.minSize; var lineCount = helpers.isArray(opts.text) ? opts.text.length : 1; var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize); var textSize = display ? (lineCount * lineHeight) + (opts.padding * 2) : 0; if (me.isHorizontal()) { minSize.width = me.maxWidth; // fill all the width minSize.height = textSize; } else { minSize.width = textSize; minSize.height = me.maxHeight; // fill all the height } me.width = minSize.width; me.height = minSize.height; }, afterFit: noop, // Shared Methods isHorizontal: function() { var pos = this.options.position; return pos === 'top' || pos === 'bottom'; }, // Actually draw the title block on the canvas draw: function() { var me = this; var ctx = me.ctx; var valueOrDefault = helpers.valueOrDefault; var opts = me.options; var globalDefaults = defaults.global; if (opts.display) { var fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize); var fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle); var fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily); var titleFont = helpers.fontString(fontSize, fontStyle, fontFamily); var lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize); var offset = lineHeight / 2 + opts.padding; var rotation = 0; var top = me.top; var left = me.left; var bottom = me.bottom; var right = me.right; var maxWidth, titleX, titleY; ctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour ctx.font = titleFont; // Horizontal if (me.isHorizontal()) { titleX = left + ((right - left) / 2); // midpoint of the width titleY = top + offset; maxWidth = right - left; } else { titleX = opts.position === 'left' ? left + offset : right - offset; titleY = top + ((bottom - top) / 2); maxWidth = bottom - top; rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); } ctx.save(); ctx.translate(titleX, titleY); ctx.rotate(rotation); ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; var text = opts.text; if (helpers.isArray(text)) { var y = 0; for (var i = 0; i < text.length; ++i) { ctx.fillText(text[i], 0, y, maxWidth); y += lineHeight; } } else { ctx.fillText(text, 0, 0, maxWidth); } ctx.restore(); } } }); function createNewTitleBlockAndAttach(chart, titleOpts) { var title = new Chart.Title({ ctx: chart.ctx, options: titleOpts, chart: chart }); layout.configure(chart, title, titleOpts); layout.addBox(chart, title); chart.titleBlock = title; } return { id: 'title', beforeInit: function(chart) { var titleOpts = chart.options.title; if (titleOpts) { createNewTitleBlockAndAttach(chart, titleOpts); } }, beforeUpdate: function(chart) { var titleOpts = chart.options.title; var titleBlock = chart.titleBlock; if (titleOpts) { helpers.mergeIf(titleOpts, defaults.global.title); if (titleBlock) { layout.configure(chart, titleBlock, titleOpts); titleBlock.options = titleOpts; } else { createNewTitleBlockAndAttach(chart, titleOpts); } } else if (titleBlock) { Chart.layoutService.removeBox(chart, titleBlock); delete chart.titleBlock; } } }; }; },{"25":25,"26":26,"45":45}],52:[function(require,module,exports){ 'use strict'; module.exports = function(Chart) { // Default config for a category scale var defaultConfig = { position: 'bottom' }; var DatasetScale = Chart.Scale.extend({ /** * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those * else fall back to data.labels * @private */ getLabels: function() { var data = this.chart.data; return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; }, determineDataLimits: function() { var me = this; var labels = me.getLabels(); me.minIndex = 0; me.maxIndex = labels.length - 1; var findIndex; if (me.options.ticks.min !== undefined) { // user specified min value findIndex = labels.indexOf(me.options.ticks.min); me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; } if (me.options.ticks.max !== undefined) { // user specified max value findIndex = labels.indexOf(me.options.ticks.max); me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; } me.min = labels[me.minIndex]; me.max = labels[me.maxIndex]; }, buildTicks: function() { var me = this; var labels = me.getLabels(); // If we are viewing some subset of labels, slice the original array me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); }, getLabelForIndex: function(index, datasetIndex) { var me = this; var data = me.chart.data; var isHorizontal = me.isHorizontal(); if (data.yLabels && !isHorizontal) { return me.getRightValue(data.datasets[datasetIndex].data[index]); } return me.ticks[index - me.minIndex]; }, // Used to get data value locations. Value can either be an index or a numerical value getPixelForValue: function(value, index) { var me = this; var offset = me.options.offset; // 1 is added because we need the length but we have the indexes var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); // If value is a data object, then index is the index in the data array, // not the index of the scale. We need to change that. var valueCategory; if (value !== undefined && value !== null) { valueCategory = me.isHorizontal() ? value.x : value.y; } if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { var labels = me.getLabels(); value = valueCategory || value; var idx = labels.indexOf(value); index = idx !== -1 ? idx : index; } if (me.isHorizontal()) { var valueWidth = me.width / offsetAmt; var widthOffset = (valueWidth * (index - me.minIndex)); if (offset) { widthOffset += (valueWidth / 2); } return me.left + Math.round(widthOffset); } var valueHeight = me.height / offsetAmt; var heightOffset = (valueHeight * (index - me.minIndex)); if (offset) { heightOffset += (valueHeight / 2); } return me.top + Math.round(heightOffset); }, getPixelForTick: function(index) { return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); }, getValueForPixel: function(pixel) { var me = this; var offset = me.options.offset; var value; var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); var horz = me.isHorizontal(); var valueDimension = (horz ? me.width : me.height) / offsetAmt; pixel -= horz ? me.left : me.top; if (offset) { pixel -= (valueDimension / 2); } if (pixel <= 0) { value = 0; } else { value = Math.round(pixel / valueDimension); } return value + me.minIndex; }, getBasePixel: function() { return this.bottom; } }); Chart.scaleService.registerScaleType('category', DatasetScale, defaultConfig); }; },{}],53:[function(require,module,exports){ 'use strict'; var defaults = require(25); var helpers = require(45); var Ticks = require(34); module.exports = function(Chart) { var defaultConfig = { position: 'left', ticks: { callback: Ticks.formatters.linear } }; var LinearScale = Chart.LinearScaleBase.extend({ determineDataLimits: function() { var me = this; var opts = me.options; var chart = me.chart; var data = chart.data; var datasets = data.datasets; var isHorizontal = me.isHorizontal(); var DEFAULT_MIN = 0; var DEFAULT_MAX = 1; function IDMatches(meta) { return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; } // First Calculate the range me.min = null; me.max = null; var hasStacks = opts.stacked; if (hasStacks === undefined) { helpers.each(datasets, function(dataset, datasetIndex) { if (hasStacks) { return; } var meta = chart.getDatasetMeta(datasetIndex); if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && meta.stack !== undefined) { hasStacks = true; } }); } if (opts.stacked || hasStacks) { var valuesPerStack = {}; helpers.each(datasets, function(dataset, datasetIndex) { var meta = chart.getDatasetMeta(datasetIndex); var key = [ meta.type, // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), meta.stack ].join('.'); if (valuesPerStack[key] === undefined) { valuesPerStack[key] = { positiveValues: [], negativeValues: [] }; } // Store these per type var positiveValues = valuesPerStack[key].positiveValues; var negativeValues = valuesPerStack[key].negativeValues; if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { helpers.each(dataset.data, function(rawValue, index) { var value = +me.getRightValue(rawValue); if (isNaN(value) || meta.data[index].hidden) { return; } positiveValues[index] = positiveValues[index] || 0; negativeValues[index] = negativeValues[index] || 0; if (opts.relativePoints) { positiveValues[index] = 100; } else if (value < 0) { negativeValues[index] += value; } else { positiveValues[index] += value; } }); } }); helpers.each(valuesPerStack, function(valuesForType) { var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); var minVal = helpers.min(values); var maxVal = helpers.max(values); me.min = me.min === null ? minVal : Math.min(me.min, minVal); me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); }); } else { helpers.each(datasets, function(dataset, datasetIndex) { var meta = chart.getDatasetMeta(datasetIndex); if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { helpers.each(dataset.data, function(rawValue, index) { var value = +me.getRightValue(rawValue); if (isNaN(value) || meta.data[index].hidden) { return; } if (me.min === null) { me.min = value; } else if (value < me.min) { me.min = value; } if (me.max === null) { me.max = value; } else if (value > me.max) { me.max = value; } }); } }); } me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero this.handleTickRangeOptions(); }, getTickLimit: function() { var maxTicks; var me = this; var tickOpts = me.options.ticks; if (me.isHorizontal()) { maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50)); } else { // The factor of 2 used to scale the font size has been experimentally determined. var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize); maxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize))); } return maxTicks; }, // Called after the ticks are built. We need handleDirectionalChanges: function() { if (!this.isHorizontal()) { // We are in a vertical orientation. The top value is the highest. So reverse the array this.ticks.reverse(); } }, getLabelForIndex: function(index, datasetIndex) { return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); }, // Utils getPixelForValue: function(value) { // This must be called after fit has been run so that // this.left, this.top, this.right, and this.bottom have been defined var me = this; var start = me.start; var rightValue = +me.getRightValue(value); var pixel; var range = me.end - start; if (me.isHorizontal()) { pixel = me.left + (me.width / range * (rightValue - start)); return Math.round(pixel); } pixel = me.bottom - (me.height / range * (rightValue - start)); return Math.round(pixel); }, getValueForPixel: function(pixel) { var me = this; var isHorizontal = me.isHorizontal(); var innerDimension = isHorizontal ? me.width : me.height; var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; return me.start + ((me.end - me.start) * offset); }, getPixelForTick: function(index) { return this.getPixelForValue(this.ticksAsNumbers[index]); } }); Chart.scaleService.registerScaleType('linear', LinearScale, defaultConfig); }; },{"25":25,"34":34,"45":45}],54:[function(require,module,exports){ 'use strict'; var helpers = require(45); var Ticks = require(34); module.exports = function(Chart) { var noop = helpers.noop; Chart.LinearScaleBase = Chart.Scale.extend({ getRightValue: function(value) { if (typeof value === 'string') { return +value; } return Chart.Scale.prototype.getRightValue.call(this, value); }, handleTickRangeOptions: function() { var me = this; var opts = me.options; var tickOpts = opts.ticks; // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, // do nothing since that would make the chart weird. If the user really wants a weird chart // axis, they can manually override it if (tickOpts.beginAtZero) { var minSign = helpers.sign(me.min); var maxSign = helpers.sign(me.max); if (minSign < 0 && maxSign < 0) { // move the top up to 0 me.max = 0; } else if (minSign > 0 && maxSign > 0) { // move the bottom down to 0 me.min = 0; } } var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; if (tickOpts.min !== undefined) { me.min = tickOpts.min; } else if (tickOpts.suggestedMin !== undefined) { if (me.min === null) { me.min = tickOpts.suggestedMin; } else { me.min = Math.min(me.min, tickOpts.suggestedMin); } } if (tickOpts.max !== undefined) { me.max = tickOpts.max; } else if (tickOpts.suggestedMax !== undefined) { if (me.max === null) { me.max = tickOpts.suggestedMax; } else { me.max = Math.max(me.max, tickOpts.suggestedMax); } } if (setMin !== setMax) { // We set the min or the max but not both. // So ensure that our range is good // Inverted or 0 length range can happen when // ticks.min is set, and no datasets are visible if (me.min >= me.max) { if (setMin) { me.max = me.min + 1; } else { me.min = me.max - 1; } } } if (me.min === me.max) { me.max++; if (!tickOpts.beginAtZero) { me.min--; } } }, getTickLimit: noop, handleDirectionalChanges: noop, buildTicks: function() { var me = this; var opts = me.options; var tickOpts = opts.ticks; // Figure out what the max number of ticks we can support it is based on the size of // the axis area. For now, we say that the minimum tick spacing in pixels must be 50 // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on // the graph. Make sure we always have at least 2 ticks var maxTicks = me.getTickLimit(); maxTicks = Math.max(2, maxTicks); var numericGeneratorOptions = { maxTicks: maxTicks, min: tickOpts.min, max: tickOpts.max, stepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) }; var ticks = me.ticks = Ticks.generators.linear(numericGeneratorOptions, me); me.handleDirectionalChanges(); // At this point, we need to update our max and min given the tick values since we have expanded the // range of the scale me.max = helpers.max(ticks); me.min = helpers.min(ticks); if (tickOpts.reverse) { ticks.reverse(); me.start = me.max; me.end = me.min; } else { me.start = me.min; me.end = me.max; } }, convertTicksToLabels: function() { var me = this; me.ticksAsNumbers = me.ticks.slice(); me.zeroLineIndex = me.ticks.indexOf(0); Chart.Scale.prototype.convertTicksToLabels.call(me); } }); }; },{"34":34,"45":45}],55:[function(require,module,exports){ 'use strict'; var helpers = require(45); var Ticks = require(34); module.exports = function(Chart) { var defaultConfig = { position: 'left', // label settings ticks: { callback: Ticks.formatters.logarithmic } }; var LogarithmicScale = Chart.Scale.extend({ determineDataLimits: function() { var me = this; var opts = me.options; var tickOpts = opts.ticks; var chart = me.chart; var data = chart.data; var datasets = data.datasets; var valueOrDefault = helpers.valueOrDefault; var isHorizontal = me.isHorizontal(); function IDMatches(meta) { return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; } // Calculate Range me.min = null; me.max = null; me.minNotZero = null; var hasStacks = opts.stacked; if (hasStacks === undefined) { helpers.each(datasets, function(dataset, datasetIndex) { if (hasStacks) { return; } var meta = chart.getDatasetMeta(datasetIndex); if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && meta.stack !== undefined) { hasStacks = true; } }); } if (opts.stacked || hasStacks) { var valuesPerStack = {}; helpers.each(datasets, function(dataset, datasetIndex) { var meta = chart.getDatasetMeta(datasetIndex); var key = [ meta.type, // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), meta.stack ].join('.'); if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { if (valuesPerStack[key] === undefined) { valuesPerStack[key] = []; } helpers.each(dataset.data, function(rawValue, index) { var values = valuesPerStack[key]; var value = +me.getRightValue(rawValue); if (isNaN(value) || meta.data[index].hidden) { return; } values[index] = values[index] || 0; if (opts.relativePoints) { values[index] = 100; } else { // Don't need to split positive and negative since the log scale can't handle a 0 crossing values[index] += value; } }); } }); helpers.each(valuesPerStack, function(valuesForType) { var minVal = helpers.min(valuesForType); var maxVal = helpers.max(valuesForType); me.min = me.min === null ? minVal : Math.min(me.min, minVal); me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); }); } else { helpers.each(datasets, function(dataset, datasetIndex) { var meta = chart.getDatasetMeta(datasetIndex); if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { helpers.each(dataset.data, function(rawValue, index) { var value = +me.getRightValue(rawValue); if (isNaN(value) || meta.data[index].hidden) { return; } if (me.min === null) { me.min = value; } else if (value < me.min) { me.min = value; } if (me.max === null) { me.max = value; } else if (value > me.max) { me.max = value; } if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { me.minNotZero = value; } }); } }); } me.min = valueOrDefault(tickOpts.min, me.min); me.max = valueOrDefault(tickOpts.max, me.max); if (me.min === me.max) { if (me.min !== 0 && me.min !== null) { me.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1); me.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1); } else { me.min = 1; me.max = 10; } } }, buildTicks: function() { var me = this; var opts = me.options; var tickOpts = opts.ticks; var generationOptions = { min: tickOpts.min, max: tickOpts.max }; var ticks = me.ticks = Ticks.generators.logarithmic(generationOptions, me); if (!me.isHorizontal()) { // We are in a vertical orientation. The top value is the highest. So reverse the array ticks.reverse(); } // At this point, we need to update our max and min given the tick values since we have expanded the // range of the scale me.max = helpers.max(ticks); me.min = helpers.min(ticks); if (tickOpts.reverse) { ticks.reverse(); me.start = me.max; me.end = me.min; } else { me.start = me.min; me.end = me.max; } }, convertTicksToLabels: function() { this.tickValues = this.ticks.slice(); Chart.Scale.prototype.convertTicksToLabels.call(this); }, // Get the correct tooltip label getLabelForIndex: function(index, datasetIndex) { return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); }, getPixelForTick: function(index) { return this.getPixelForValue(this.tickValues[index]); }, getPixelForValue: function(value) { var me = this; var start = me.start; var newVal = +me.getRightValue(value); var opts = me.options; var tickOpts = opts.ticks; var innerDimension, pixel, range; if (me.isHorizontal()) { range = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0 if (newVal === 0) { pixel = me.left; } else { innerDimension = me.width; pixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start))); } } else { // Bottom - top since pixels increase downward on a screen innerDimension = me.height; if (start === 0 && !tickOpts.reverse) { range = helpers.log10(me.end) - helpers.log10(me.minNotZero); if (newVal === start) { pixel = me.bottom; } else if (newVal === me.minNotZero) { pixel = me.bottom - innerDimension * 0.02; } else { pixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero))); } } else if (me.end === 0 && tickOpts.reverse) { range = helpers.log10(me.start) - helpers.log10(me.minNotZero); if (newVal === me.end) { pixel = me.top; } else if (newVal === me.minNotZero) { pixel = me.top + innerDimension * 0.02; } else { pixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98 / range * (helpers.log10(newVal) - helpers.log10(me.minNotZero))); } } else if (newVal === 0) { pixel = tickOpts.reverse ? me.top : me.bottom; } else { range = helpers.log10(me.end) - helpers.log10(start); innerDimension = me.height; pixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start))); } } return pixel; }, getValueForPixel: function(pixel) { var me = this; var range = helpers.log10(me.end) - helpers.log10(me.start); var value, innerDimension; if (me.isHorizontal()) { innerDimension = me.width; value = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension); } else { // todo: if start === 0 innerDimension = me.height; value = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start; } return value; } }); Chart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig); }; },{"34":34,"45":45}],56:[function(require,module,exports){ 'use strict'; var defaults = require(25); var helpers = require(45); var Ticks = require(34); module.exports = function(Chart) { var globalDefaults = defaults.global; var defaultConfig = { display: true, // Boolean - Whether to animate scaling the chart from the centre animate: true, position: 'chartArea', angleLines: { display: true, color: 'rgba(0, 0, 0, 0.1)', lineWidth: 1 }, gridLines: { circular: false }, // label settings ticks: { // Boolean - Show a backdrop to the scale label showLabelBackdrop: true, // String - The colour of the label backdrop backdropColor: 'rgba(255,255,255,0.75)', // Number - The backdrop padding above & below the label in pixels backdropPaddingY: 2, // Number - The backdrop padding to the side of the label in pixels backdropPaddingX: 2, callback: Ticks.formatters.linear }, pointLabels: { // Boolean - if true, show point labels display: true, // Number - Point label font size in pixels fontSize: 10, // Function - Used to convert point labels callback: function(label) { return label; } } }; function getValueCount(scale) { var opts = scale.options; return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; } function getPointLabelFontOptions(scale) { var pointLabelOptions = scale.options.pointLabels; var fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize); var fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle); var fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily); var font = helpers.fontString(fontSize, fontStyle, fontFamily); return { size: fontSize, style: fontStyle, family: fontFamily, font: font }; } function measureLabelSize(ctx, fontSize, label) { if (helpers.isArray(label)) { return { w: helpers.longestText(ctx, ctx.font, label), h: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize) }; } return { w: ctx.measureText(label).width, h: fontSize }; } function determineLimits(angle, pos, size, min, max) { if (angle === min || angle === max) { return { start: pos - (size / 2), end: pos + (size / 2) }; } else if (angle < min || angle > max) { return { start: pos - size - 5, end: pos }; } return { start: pos, end: pos + size + 5 }; } /** * Helper function to fit a radial linear scale with point labels */ function fitWithPointLabels(scale) { /* * Right, this is really confusing and there is a lot of maths going on here * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 * * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif * * Solution: * * We assume the radius of the polygon is half the size of the canvas at first * at each index we check if the text overlaps. * * Where it does, we store that angle and that index. * * After finding the largest index and angle we calculate how much we need to remove * from the shape radius to move the point inwards by that x. * * We average the left and right distances to get the maximum shape radius that can fit in the box * along with labels. * * Once we have that, we can find the centre point for the chart, by taking the x text protrusion * on each side, removing that from the size, halving it and adding the left x protrusion width. * * This will mean we have a shape fitted to the canvas, as large as it can be with the labels * and position it in the most space efficient manner * * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif */ var plFont = getPointLabelFontOptions(scale); // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2); var furthestLimits = { r: scale.width, l: 0, t: scale.height, b: 0 }; var furthestAngles = {}; var i, textSize, pointPosition; scale.ctx.font = plFont.font; scale._pointLabelSizes = []; var valueCount = getValueCount(scale); for (i = 0; i < valueCount; i++) { pointPosition = scale.getPointPosition(i, largestPossibleRadius); textSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || ''); scale._pointLabelSizes[i] = textSize; // Add quarter circle to make degree 0 mean top of circle var angleRadians = scale.getIndexAngle(i); var angle = helpers.toDegrees(angleRadians) % 360; var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); if (hLimits.start < furthestLimits.l) { furthestLimits.l = hLimits.start; furthestAngles.l = angleRadians; } if (hLimits.end > furthestLimits.r) { furthestLimits.r = hLimits.end; furthestAngles.r = angleRadians; } if (vLimits.start < furthestLimits.t) { furthestLimits.t = vLimits.start; furthestAngles.t = angleRadians; } if (vLimits.end > furthestLimits.b) { furthestLimits.b = vLimits.end; furthestAngles.b = angleRadians; } } scale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles); } /** * Helper function to fit a radial linear scale with no point labels */ function fit(scale) { var largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2); scale.drawingArea = Math.round(largestPossibleRadius); scale.setCenterPoint(0, 0, 0, 0); } function getTextAlignForAngle(angle) { if (angle === 0 || angle === 180) { return 'center'; } else if (angle < 180) { return 'left'; } return 'right'; } function fillText(ctx, text, position, fontSize) { if (helpers.isArray(text)) { var y = position.y; var spacing = 1.5 * fontSize; for (var i = 0; i < text.length; ++i) { ctx.fillText(text[i], position.x, y); y += spacing; } } else { ctx.fillText(text, position.x, position.y); } } function adjustPointPositionForLabelHeight(angle, textSize, position) { if (angle === 90 || angle === 270) { position.y -= (textSize.h / 2); } else if (angle > 270 || angle < 90) { position.y -= textSize.h; } } function drawPointLabels(scale) { var ctx = scale.ctx; var valueOrDefault = helpers.valueOrDefault; var opts = scale.options; var angleLineOpts = opts.angleLines; var pointLabelOpts = opts.pointLabels; ctx.lineWidth = angleLineOpts.lineWidth; ctx.strokeStyle = angleLineOpts.color; var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); // Point Label Font var plFont = getPointLabelFontOptions(scale); ctx.textBaseline = 'top'; for (var i = getValueCount(scale) - 1; i >= 0; i--) { if (angleLineOpts.display) { var outerPosition = scale.getPointPosition(i, outerDistance); ctx.beginPath(); ctx.moveTo(scale.xCenter, scale.yCenter); ctx.lineTo(outerPosition.x, outerPosition.y); ctx.stroke(); ctx.closePath(); } if (pointLabelOpts.display) { // Extra 3px out for some label spacing var pointLabelPosition = scale.getPointPosition(i, outerDistance + 5); // Keep this in loop since we may support array properties here var pointLabelFontColor = valueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor); ctx.font = plFont.font; ctx.fillStyle = pointLabelFontColor; var angleRadians = scale.getIndexAngle(i); var angle = helpers.toDegrees(angleRadians); ctx.textAlign = getTextAlignForAngle(angle); adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size); } } } function drawRadiusLine(scale, gridLineOpts, radius, index) { var ctx = scale.ctx; ctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1); ctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1); if (scale.options.gridLines.circular) { // Draw circular arcs between the points ctx.beginPath(); ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); ctx.closePath(); ctx.stroke(); } else { // Draw straight lines connecting each index var valueCount = getValueCount(scale); if (valueCount === 0) { return; } ctx.beginPath(); var pointPosition = scale.getPointPosition(0, radius); ctx.moveTo(pointPosition.x, pointPosition.y); for (var i = 1; i < valueCount; i++) { pointPosition = scale.getPointPosition(i, radius); ctx.lineTo(pointPosition.x, pointPosition.y); } ctx.closePath(); ctx.stroke(); } } function numberOrZero(param) { return helpers.isNumber(param) ? param : 0; } var LinearRadialScale = Chart.LinearScaleBase.extend({ setDimensions: function() { var me = this; var opts = me.options; var tickOpts = opts.ticks; // Set the unconstrained dimension before label rotation me.width = me.maxWidth; me.height = me.maxHeight; me.xCenter = Math.round(me.width / 2); me.yCenter = Math.round(me.height / 2); var minSize = helpers.min([me.height, me.width]); var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); me.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2); }, determineDataLimits: function() { var me = this; var chart = me.chart; var min = Number.POSITIVE_INFINITY; var max = Number.NEGATIVE_INFINITY; helpers.each(chart.data.datasets, function(dataset, datasetIndex) { if (chart.isDatasetVisible(datasetIndex)) { var meta = chart.getDatasetMeta(datasetIndex); helpers.each(dataset.data, function(rawValue, index) { var value = +me.getRightValue(rawValue); if (isNaN(value) || meta.data[index].hidden) { return; } min = Math.min(value, min); max = Math.max(value, max); }); } }); me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero me.handleTickRangeOptions(); }, getTickLimit: function() { var tickOpts = this.options.ticks; var tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); return Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize))); }, convertTicksToLabels: function() { var me = this; Chart.LinearScaleBase.prototype.convertTicksToLabels.call(me); // Point labels me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); }, getLabelForIndex: function(index, datasetIndex) { return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); }, fit: function() { if (this.options.pointLabels.display) { fitWithPointLabels(this); } else { fit(this); } }, /** * Set radius reductions and determine new radius and center point * @private */ setReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) { var me = this; var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); var radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b); radiusReductionLeft = numberOrZero(radiusReductionLeft); radiusReductionRight = numberOrZero(radiusReductionRight); radiusReductionTop = numberOrZero(radiusReductionTop); radiusReductionBottom = numberOrZero(radiusReductionBottom); me.drawingArea = Math.min( Math.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), Math.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); }, setCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) { var me = this; var maxRight = me.width - rightMovement - me.drawingArea; var maxLeft = leftMovement + me.drawingArea; var maxTop = topMovement + me.drawingArea; var maxBottom = me.height - bottomMovement - me.drawingArea; me.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left); me.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top); }, getIndexAngle: function(index) { var angleMultiplier = (Math.PI * 2) / getValueCount(this); var startAngle = this.chart.options && this.chart.options.startAngle ? this.chart.options.startAngle : 0; var startAngleRadians = startAngle * Math.PI * 2 / 360; // Start from the top instead of right, so remove a quarter of the circle return index * angleMultiplier + startAngleRadians; }, getDistanceFromCenterForValue: function(value) { var me = this; if (value === null) { return 0; // null always in center } // Take into account half font size + the yPadding of the top value var scalingFactor = me.drawingArea / (me.max - me.min); if (me.options.ticks.reverse) { return (me.max - value) * scalingFactor; } return (value - me.min) * scalingFactor; }, getPointPosition: function(index, distanceFromCenter) { var me = this; var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); return { x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter, y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter }; }, getPointPositionForValue: function(index, value) { return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); }, getBasePosition: function() { var me = this; var min = me.min; var max = me.max; return me.getPointPositionForValue(0, me.beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0); }, draw: function() { var me = this; var opts = me.options; var gridLineOpts = opts.gridLines; var tickOpts = opts.ticks; var valueOrDefault = helpers.valueOrDefault; if (opts.display) { var ctx = me.ctx; var startAngle = this.getIndexAngle(0); // Tick Font var tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize); var tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle); var tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily); var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily); helpers.each(me.ticks, function(label, index) { // Don't draw a centre value (if it is minimum) if (index > 0 || tickOpts.reverse) { var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); // Draw circular lines around the scale if (gridLineOpts.display && index !== 0) { drawRadiusLine(me, gridLineOpts, yCenterOffset, index); } if (tickOpts.display) { var tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor); ctx.font = tickLabelFont; ctx.save(); ctx.translate(me.xCenter, me.yCenter); ctx.rotate(startAngle); if (tickOpts.showLabelBackdrop) { var labelWidth = ctx.measureText(label).width; ctx.fillStyle = tickOpts.backdropColor; ctx.fillRect( -labelWidth / 2 - tickOpts.backdropPaddingX, -yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY, labelWidth + tickOpts.backdropPaddingX * 2, tickFontSize + tickOpts.backdropPaddingY * 2 ); } ctx.textAlign = 'center'; ctx.textBaseline = 'middle'; ctx.fillStyle = tickFontColor; ctx.fillText(label, 0, -yCenterOffset); ctx.restore(); } } }); if (opts.angleLines.display || opts.pointLabels.display) { drawPointLabels(me); } } } }); Chart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig); }; },{"25":25,"34":34,"45":45}],57:[function(require,module,exports){ /* global window: false */ 'use strict'; var moment = require(1); moment = typeof moment === 'function' ? moment : window.moment; var defaults = require(25); var helpers = require(45); // Integer constants are from the ES6 spec. var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; var INTERVALS = { millisecond: { common: true, size: 1, steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] }, second: { common: true, size: 1000, steps: [1, 2, 5, 10, 30] }, minute: { common: true, size: 60000, steps: [1, 2, 5, 10, 30] }, hour: { common: true, size: 3600000, steps: [1, 2, 3, 6, 12] }, day: { common: true, size: 86400000, steps: [1, 2, 5] }, week: { common: false, size: 604800000, steps: [1, 2, 3, 4] }, month: { common: true, size: 2.628e9, steps: [1, 2, 3] }, quarter: { common: false, size: 7.884e9, steps: [1, 2, 3, 4] }, year: { common: true, size: 3.154e10 } }; var UNITS = Object.keys(INTERVALS); function sorter(a, b) { return a - b; } function arrayUnique(items) { var hash = {}; var out = []; var i, ilen, item; for (i = 0, ilen = items.length; i < ilen; ++i) { item = items[i]; if (!hash[item]) { hash[item] = true; out.push(item); } } return out; } /** * Returns an array of {time, pos} objects used to interpolate a specific `time` or position * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other * extremity (left + width or top + height). Note that it would be more optimized to directly * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need * to create the lookup table. The table ALWAYS contains at least two items: min and max. * * @param {Number[]} timestamps - timestamps sorted from lowest to highest. * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. * If 'series', timestamps will be positioned at the same distance from each other. In this * case, only timestamps that break the time linearity are registered, meaning that in the * best case, all timestamps are linear, the table contains only min and max. */ function buildLookupTable(timestamps, min, max, distribution) { if (distribution === 'linear' || !timestamps.length) { return [ {time: min, pos: 0}, {time: max, pos: 1} ]; } var table = []; var items = [min]; var i, ilen, prev, curr, next; for (i = 0, ilen = timestamps.length; i < ilen; ++i) { curr = timestamps[i]; if (curr > min && curr < max) { items.push(curr); } } items.push(max); for (i = 0, ilen = items.length; i < ilen; ++i) { next = items[i + 1]; prev = items[i - 1]; curr = items[i]; // only add points that breaks the scale linearity if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { table.push({time: curr, pos: i / (ilen - 1)}); } } return table; } // @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ function lookup(table, key, value) { var lo = 0; var hi = table.length - 1; var mid, i0, i1; while (lo >= 0 && lo <= hi) { mid = (lo + hi) >> 1; i0 = table[mid - 1] || null; i1 = table[mid]; if (!i0) { // given value is outside table (before first item) return {lo: null, hi: i1}; } else if (i1[key] < value) { lo = mid + 1; } else if (i0[key] > value) { hi = mid - 1; } else { return {lo: i0, hi: i1}; } } // given value is outside table (after last item) return {lo: i1, hi: null}; } /** * Linearly interpolates the given source `value` using the table items `skey` values and * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') * returns the position for a timestamp equal to 42. If value is out of bounds, values at * index [0, 1] or [n - 1, n] are used for the interpolation. */ function interpolate(table, skey, sval, tkey) { var range = lookup(table, skey, sval); // Note: the lookup table ALWAYS contains at least 2 items (min and max) var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; var span = next[skey] - prev[skey]; var ratio = span ? (sval - prev[skey]) / span : 0; var offset = (next[tkey] - prev[tkey]) * ratio; return prev[tkey] + offset; } /** * Convert the given value to a moment object using the given time options. * @see http://momentjs.com/docs/#/parsing/ */ function momentify(value, options) { var parser = options.parser; var format = options.parser || options.format; if (typeof parser === 'function') { return parser(value); } if (typeof value === 'string' && typeof format === 'string') { return moment(value, format); } if (!(value instanceof moment)) { value = moment(value); } if (value.isValid()) { return value; } // Labels are in an incompatible moment format and no `parser` has been provided. // The user might still use the deprecated `format` option to convert his inputs. if (typeof format === 'function') { return format(value); } return value; } function parse(input, scale) { if (helpers.isNullOrUndef(input)) { return null; } var options = scale.options.time; var value = momentify(scale.getRightValue(input), options); if (!value.isValid()) { return null; } if (options.round) { value.startOf(options.round); } return value.valueOf(); } /** * Returns the number of unit to skip to be able to display up to `capacity` number of ticks * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. */ function determineStepSize(min, max, unit, capacity) { var range = max - min; var interval = INTERVALS[unit]; var milliseconds = interval.size; var steps = interval.steps; var i, ilen, factor; if (!steps) { return Math.ceil(range / ((capacity || 1) * milliseconds)); } for (i = 0, ilen = steps.length; i < ilen; ++i) { factor = steps[i]; if (Math.ceil(range / (milliseconds * factor)) <= capacity) { break; } } return factor; } /** * Figures out what unit results in an appropriate number of auto-generated ticks */ function determineUnitForAutoTicks(minUnit, min, max, capacity) { var ilen = UNITS.length; var i, interval, factor; for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { interval = INTERVALS[UNITS[i]]; factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { return UNITS[i]; } } return UNITS[ilen - 1]; } /** * Figures out what unit to format a set of ticks with */ function determineUnitForFormatting(ticks, minUnit, min, max) { var duration = moment.duration(moment(max).diff(moment(min))); var ilen = UNITS.length; var i, unit; for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { unit = UNITS[i]; if (INTERVALS[unit].common && duration.as(unit) >= ticks.length) { return unit; } } return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; } function determineMajorUnit(unit) { for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { if (INTERVALS[UNITS[i]].common) { return UNITS[i]; } } } /** * Generates a maximum of `capacity` timestamps between min and max, rounded to the * `minor` unit, aligned on the `major` unit and using the given scale time `options`. * Important: this method can return ticks outside the min and max range, it's the * responsibility of the calling code to clamp values if needed. */ function generate(min, max, capacity, options) { var timeOpts = options.time; var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); var major = determineMajorUnit(minor); var stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize); var weekday = minor === 'week' ? timeOpts.isoWeekday : false; var majorTicksEnabled = options.ticks.major.enabled; var interval = INTERVALS[minor]; var first = moment(min); var last = moment(max); var ticks = []; var time; if (!stepSize) { stepSize = determineStepSize(min, max, minor, capacity); } // For 'week' unit, handle the first day of week option if (weekday) { first = first.isoWeekday(weekday); last = last.isoWeekday(weekday); } // Align first/last ticks on unit first = first.startOf(weekday ? 'day' : minor); last = last.startOf(weekday ? 'day' : minor); // Make sure that the last tick include max if (last < max) { last.add(1, minor); } time = moment(first); if (majorTicksEnabled && major && !weekday && !timeOpts.round) { // Align the first tick on the previous `minor` unit aligned on the `major` unit: // we first aligned time on the previous `major` unit then add the number of full // stepSize there is between first and the previous major time. time.startOf(major); time.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor); } for (; time < last; time.add(stepSize, minor)) { ticks.push(+time); } ticks.push(+time); return ticks; } /** * Returns the right and left offsets from edges in the form of {left, right}. * Offsets are added when the `offset` option is true. */ function computeOffsets(table, ticks, min, max, options) { var left = 0; var right = 0; var upper, lower; if (options.offset && ticks.length) { if (!options.time.min) { upper = ticks.length > 1 ? ticks[1] : max; lower = ticks[0]; left = ( interpolate(table, 'time', upper, 'pos') - interpolate(table, 'time', lower, 'pos') ) / 2; } if (!options.time.max) { upper = ticks[ticks.length - 1]; lower = ticks.length > 1 ? ticks[ticks.length - 2] : min; right = ( interpolate(table, 'time', upper, 'pos') - interpolate(table, 'time', lower, 'pos') ) / 2; } } return {left: left, right: right}; } function ticksFromTimestamps(values, majorUnit) { var ticks = []; var i, ilen, value, major; for (i = 0, ilen = values.length; i < ilen; ++i) { value = values[i]; major = majorUnit ? value === +moment(value).startOf(majorUnit) : false; ticks.push({ value: value, major: major }); } return ticks; } module.exports = function(Chart) { var defaultConfig = { position: 'bottom', /** * Data distribution along the scale: * - 'linear': data are spread according to their time (distances can vary), * - 'series': data are spread at the same distance from each other. * @see https://github.com/chartjs/Chart.js/pull/4507 * @since 2.7.0 */ distribution: 'linear', /** * Scale boundary strategy (bypassed by min/max time options) * - `data`: make sure data are fully visible, ticks outside are removed * - `ticks`: make sure ticks are fully visible, data outside are truncated * @see https://github.com/chartjs/Chart.js/pull/4556 * @since 2.7.0 */ bounds: 'data', time: { parser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/ unit: false, // false == automatic or override with week, month, year, etc. round: false, // none, or override with week, month, year, etc. displayFormat: false, // DEPRECATED isoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/ minUnit: 'millisecond', // defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/ displayFormats: { millisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM, second: 'h:mm:ss a', // 11:20:01 AM minute: 'h:mm a', // 11:20 AM hour: 'hA', // 5PM day: 'MMM D', // Sep 4 week: 'll', // Week 46, or maybe "[W]WW - YYYY" ? month: 'MMM YYYY', // Sept 2015 quarter: '[Q]Q - YYYY', // Q3 year: 'YYYY' // 2015 }, }, ticks: { autoSkip: false, /** * Ticks generation input values: * - 'auto': generates "optimal" ticks based on scale size and time options. * - 'data': generates ticks from data (including labels from data {t|x|y} objects). * - 'labels': generates ticks from user given `data.labels` values ONLY. * @see https://github.com/chartjs/Chart.js/pull/4507 * @since 2.7.0 */ source: 'auto', major: { enabled: false } } }; var TimeScale = Chart.Scale.extend({ initialize: function() { if (!moment) { throw new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com'); } this.mergeTicksOptions(); Chart.Scale.prototype.initialize.call(this); }, update: function() { var me = this; var options = me.options; // DEPRECATIONS: output a message only one time per update if (options.time && options.time.format) { console.warn('options.time.format is deprecated and replaced by options.time.parser.'); } return Chart.Scale.prototype.update.apply(me, arguments); }, /** * Allows data to be referenced via 't' attribute */ getRightValue: function(rawValue) { if (rawValue && rawValue.t !== undefined) { rawValue = rawValue.t; } return Chart.Scale.prototype.getRightValue.call(this, rawValue); }, determineDataLimits: function() { var me = this; var chart = me.chart; var timeOpts = me.options.time; var min = MAX_INTEGER; var max = MIN_INTEGER; var timestamps = []; var datasets = []; var labels = []; var i, j, ilen, jlen, data, timestamp; // Convert labels to timestamps for (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) { labels.push(parse(chart.data.labels[i], me)); } // Convert data to timestamps for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { if (chart.isDatasetVisible(i)) { data = chart.data.datasets[i].data; // Let's consider that all data have the same format. if (helpers.isObject(data[0])) { datasets[i] = []; for (j = 0, jlen = data.length; j < jlen; ++j) { timestamp = parse(data[j], me); timestamps.push(timestamp); datasets[i][j] = timestamp; } } else { timestamps.push.apply(timestamps, labels); datasets[i] = labels.slice(0); } } else { datasets[i] = []; } } if (labels.length) { // Sort labels **after** data have been converted labels = arrayUnique(labels).sort(sorter); min = Math.min(min, labels[0]); max = Math.max(max, labels[labels.length - 1]); } if (timestamps.length) { timestamps = arrayUnique(timestamps).sort(sorter); min = Math.min(min, timestamps[0]); max = Math.max(max, timestamps[timestamps.length - 1]); } min = parse(timeOpts.min, me) || min; max = parse(timeOpts.max, me) || max; // In case there is no valid min/max, let's use today limits min = min === MAX_INTEGER ? +moment().startOf('day') : min; max = max === MIN_INTEGER ? +moment().endOf('day') + 1 : max; // Make sure that max is strictly higher than min (required by the lookup table) me.min = Math.min(min, max); me.max = Math.max(min + 1, max); // PRIVATE me._horizontal = me.isHorizontal(); me._table = []; me._timestamps = { data: timestamps, datasets: datasets, labels: labels }; }, buildTicks: function() { var me = this; var min = me.min; var max = me.max; var options = me.options; var timeOpts = options.time; var timestamps = []; var ticks = []; var i, ilen, timestamp; switch (options.ticks.source) { case 'data': timestamps = me._timestamps.data; break; case 'labels': timestamps = me._timestamps.labels; break; case 'auto': default: timestamps = generate(min, max, me.getLabelCapacity(min), options); } if (options.bounds === 'ticks' && timestamps.length) { min = timestamps[0]; max = timestamps[timestamps.length - 1]; } // Enforce limits with user min/max options min = parse(timeOpts.min, me) || min; max = parse(timeOpts.max, me) || max; // Remove ticks outside the min/max range for (i = 0, ilen = timestamps.length; i < ilen; ++i) { timestamp = timestamps[i]; if (timestamp >= min && timestamp <= max) { ticks.push(timestamp); } } me.min = min; me.max = max; // PRIVATE me._unit = timeOpts.unit || determineUnitForFormatting(ticks, timeOpts.minUnit, me.min, me.max); me._majorUnit = determineMajorUnit(me._unit); me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); me._offsets = computeOffsets(me._table, ticks, min, max, options); return ticksFromTimestamps(ticks, me._majorUnit); }, getLabelForIndex: function(index, datasetIndex) { var me = this; var data = me.chart.data; var timeOpts = me.options.time; var label = data.labels && index < data.labels.length ? data.labels[index] : ''; var value = data.datasets[datasetIndex].data[index]; if (helpers.isObject(value)) { label = me.getRightValue(value); } if (timeOpts.tooltipFormat) { label = momentify(label, timeOpts).format(timeOpts.tooltipFormat); } return label; }, /** * Function to format an individual tick mark * @private */ tickFormatFunction: function(tick, index, ticks, formatOverride) { var me = this; var options = me.options; var time = tick.valueOf(); var formats = options.time.displayFormats; var minorFormat = formats[me._unit]; var majorUnit = me._majorUnit; var majorFormat = formats[majorUnit]; var majorTime = tick.clone().startOf(majorUnit).valueOf(); var majorTickOpts = options.ticks.major; var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; var label = tick.format(formatOverride ? formatOverride : major ? majorFormat : minorFormat); var tickOpts = major ? majorTickOpts : options.ticks.minor; var formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback); return formatter ? formatter(label, index, ticks) : label; }, convertTicksToLabels: function(ticks) { var labels = []; var i, ilen; for (i = 0, ilen = ticks.length; i < ilen; ++i) { labels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks)); } return labels; }, /** * @private */ getPixelForOffset: function(time) { var me = this; var size = me._horizontal ? me.width : me.height; var start = me._horizontal ? me.left : me.top; var pos = interpolate(me._table, 'time', time, 'pos'); return start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right); }, getPixelForValue: function(value, index, datasetIndex) { var me = this; var time = null; if (index !== undefined && datasetIndex !== undefined) { time = me._timestamps.datasets[datasetIndex][index]; } if (time === null) { time = parse(value, me); } if (time !== null) { return me.getPixelForOffset(time); } }, getPixelForTick: function(index) { var ticks = this.getTicks(); return index >= 0 && index < ticks.length ? this.getPixelForOffset(ticks[index].value) : null; }, getValueForPixel: function(pixel) { var me = this; var size = me._horizontal ? me.width : me.height; var start = me._horizontal ? me.left : me.top; var pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right; var time = interpolate(me._table, 'pos', pos, 'time'); return moment(time); }, /** * Crude approximation of what the label width might be * @private */ getLabelWidth: function(label) { var me = this; var ticksOpts = me.options.ticks; var tickLabelWidth = me.ctx.measureText(label).width; var angle = helpers.toRadians(ticksOpts.maxRotation); var cosRotation = Math.cos(angle); var sinRotation = Math.sin(angle); var tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize); return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); }, /** * @private */ getLabelCapacity: function(exampleTime) { var me = this; var formatOverride = me.options.time.displayFormats.millisecond; // Pick the longest format for guestimation var exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, [], formatOverride); var tickLabelWidth = me.getLabelWidth(exampleLabel); var innerWidth = me.isHorizontal() ? me.width : me.height; return Math.floor(innerWidth / tickLabelWidth); } }); Chart.scaleService.registerScaleType('time', TimeScale, defaultConfig); }; },{"1":1,"25":25,"45":45}]},{},[7])(7) });PKL\|ݠAyoutube-embed-plus/scripts/chartjs/chartjs-plugin-deferred.min.jsnu[/* * @license * chartjs-plugin-deferred * http://chartjs.org/ * Version: 1.0.0 * * Copyright 2018 Simon Brunel * Released under the MIT license * https://github.com/chartjs/chartjs-plugin-deferred/blob/master/LICENSE.md */ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("chart.js")):"function"==typeof define&&define.amd?define(["chart.js"],t):t(e.Chart)}(this,function(e){"use strict";var t=(e=e&&e.hasOwnProperty("default")?e.default:e).helpers,n="$chartjs_deferred",r="$deferred";function a(e,n){n?window.setTimeout(e,n):t.requestAnimFrame.call(window,e)}function i(e,t){var n=parseInt(e,10);return isNaN(n)?0:"string"==typeof e&&-1!==e.indexOf("%")?n/100*t:n}function o(e){var t=e[r].options,n=e.chart.canvas;if(!n||null===n.offsetParent)return!1;var a=n.getBoundingClientRect(),o=i(t.yOffset||0,a.height),d=i(t.xOffset||0,a.width);return a.right-d>=0&&a.bottom-o>=0&&a.left+d<=window.innerWidth&&a.top+o<=window.innerHeight}function d(e){var t=e.target[n];t.ticking||(t.ticking=!0,a(function(){var e,n,a=t.charts.slice(),i=a.length;for(n=0;n0)return n.delayed=!0,a(function(){n.delayed=!1,e.update()},t.delay),!1}if(n.delayed)return!1},destroy:function(e){l(e)}})});PKL\40youtube-embed-plus/scripts/chartjs/moment.min.jsnu[!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";function e(){return Qe.apply(null,arguments)}function t(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function n(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function s(e){return void 0===e}function i(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function r(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function a(e,t){var n,s=[];for(n=0;n0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+s}function P(e,t,n,s){var i=s;"string"==typeof s&&(i=function(){return this[s]()}),e&&(ut[e]=i),t&&(ut[t[0]]=function(){return b(i.apply(this,arguments),t[1],t[2])}),n&&(ut[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function W(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function H(e,t){return e.isValid()?(t=R(t,e.localeData()),ot[t]=ot[t]||function(e){var t,n,s=e.match(rt);for(t=0,n=s.length;t=0&&at.test(e);)e=e.replace(at,n),at.lastIndex=0,s-=1;return e}function C(e,t,n){Yt[e]=S(t)?t:function(e,s){return e&&n?n:t}}function F(e,t){return o(Yt,e)?Yt[e](t._strict,t._locale):new RegExp(function(e){return U(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,s,i){return t||n||s||i}))}(e))}function U(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function L(e,t){var n,s=t;for("string"==typeof e&&(e=[e]),i(t)&&(s=function(e,n){n[t]=g(e)}),n=0;n=0&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e),t}function B(e,t,n){var s=7+t-n;return-((7+J(e,0,s).getUTCDay()-t)%7)+s-1}function Q(e,t,n,s,i){var r,a,o=1+7*(t-1)+(7+n-s)%7+B(e,s,i);return o<=0?a=V(r=e-1)+o:o>V(e)?(r=e+1,a=o-V(e)):(r=e,a=o),{year:r,dayOfYear:a}}function X(e,t,n){var s,i,r=B(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+K(i=e.year()-1,t,n):a>K(e.year(),t,n)?(s=a-K(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function K(e,t,n){var s=B(e,t,n),i=B(e+1,t,n);return(V(e)-s+i)/7}function ee(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],d=[];for(t=0;t<7;t++)n=l([2e3,1]).day(t),s=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),a.push(s),o.push(i),u.push(r),d.push(s),d.push(i),d.push(r);for(a.sort(e),o.sort(e),u.sort(e),d.sort(e),t=0;t<7;t++)o[t]=U(o[t]),u[t]=U(u[t]),d[t]=U(d[t]);this._weekdaysRegex=new RegExp("^("+d.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function te(){return this.hours()%12||12}function ne(e,t){P(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function se(e,t){return t._meridiemParse}function ie(e){return e?e.toLowerCase().replace("_","-"):e}function re(e){var t=null;if(!Xt[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=Jt._abbr;require("./locale/"+e),ae(t)}catch(e){}return Xt[e]}function ae(e,t){var n;return e&&(n=s(t)?ue(e):oe(e,t))&&(Jt=n),Jt._abbr}function oe(e,t){if(null!==t){var n=Qt;if(t.abbr=e,null!=Xt[e])M("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=Xt[e]._config;else if(null!=t.parentLocale){if(null==Xt[t.parentLocale])return Kt[t.parentLocale]||(Kt[t.parentLocale]=[]),Kt[t.parentLocale].push({name:e,config:t}),null;n=Xt[t.parentLocale]._config}return Xt[e]=new k(D(n,t)),Kt[e]&&Kt[e].forEach(function(e){oe(e.name,e.config)}),ae(e),Xt[e]}return delete Xt[e],null}function ue(e){var n;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return Jt;if(!t(e)){if(n=re(e))return n;e=[e]}return function(e){for(var t,n,s,i,r=0;r0;){if(s=re(i.slice(0,t).join("-")))return s;if(n&&n.length>=t&&p(i,n,!0)>=t-1)break;t--}r++}return null}(e)}function le(e){var t,n=e._a;return n&&-2===d(e).overflow&&(t=n[xt]<0||n[xt]>11?xt:n[bt]<1||n[bt]>Z(n[Tt],n[xt])?bt:n[Pt]<0||n[Pt]>24||24===n[Pt]&&(0!==n[Wt]||0!==n[Ht]||0!==n[Rt])?Pt:n[Wt]<0||n[Wt]>59?Wt:n[Ht]<0||n[Ht]>59?Ht:n[Rt]<0||n[Rt]>999?Rt:-1,d(e)._overflowDayOfYear&&(tbt)&&(t=bt),d(e)._overflowWeeks&&-1===t&&(t=Ct),d(e)._overflowWeekday&&-1===t&&(t=Ft),d(e).overflow=t),e}function de(e,t,n){return null!=e?e:null!=t?t:n}function he(t){var n,s,i,r,a,o=[];if(!t._d){for(i=function(t){var n=new Date(e.now());return t._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}(t),t._w&&null==t._a[bt]&&null==t._a[xt]&&function(e){var t,n,s,i,r,a,o,u;if(null!=(t=e._w).GG||null!=t.W||null!=t.E)r=1,a=4,n=de(t.GG,e._a[Tt],X(pe(),1,4).year),s=de(t.W,1),((i=de(t.E,1))<1||i>7)&&(u=!0);else{r=e._locale._week.dow,a=e._locale._week.doy;var l=X(pe(),r,a);n=de(t.gg,e._a[Tt],l.year),s=de(t.w,l.week),null!=t.d?((i=t.d)<0||i>6)&&(u=!0):null!=t.e?(i=t.e+r,(t.e<0||t.e>6)&&(u=!0)):i=r}s<1||s>K(n,r,a)?d(e)._overflowWeeks=!0:null!=u?d(e)._overflowWeekday=!0:(o=Q(n,s,i,r,a),e._a[Tt]=o.year,e._dayOfYear=o.dayOfYear)}(t),null!=t._dayOfYear&&(a=de(t._a[Tt],i[Tt]),(t._dayOfYear>V(a)||0===t._dayOfYear)&&(d(t)._overflowDayOfYear=!0),s=J(a,0,t._dayOfYear),t._a[xt]=s.getUTCMonth(),t._a[bt]=s.getUTCDate()),n=0;n<3&&null==t._a[n];++n)t._a[n]=o[n]=i[n];for(;n<7;n++)t._a[n]=o[n]=null==t._a[n]?2===n?1:0:t._a[n];24===t._a[Pt]&&0===t._a[Wt]&&0===t._a[Ht]&&0===t._a[Rt]&&(t._nextDay=!0,t._a[Pt]=0),t._d=(t._useUTC?J:function(e,t,n,s,i,r,a){var o=new Date(e,t,n,s,i,r,a);return e<100&&e>=0&&isFinite(o.getFullYear())&&o.setFullYear(e),o}).apply(null,o),r=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[Pt]=24),t._w&&void 0!==t._w.d&&t._w.d!==r&&(d(t).weekdayMismatch=!0)}}function ce(e){var t,n,s,i,r,a,o=e._i,u=en.exec(o)||tn.exec(o);if(u){for(d(e).iso=!0,t=0,n=sn.length;t0&&d(t).unusedInput.push(a),o=o.slice(o.indexOf(s)+s.length),l+=s.length),ut[r]?(s?d(t).empty=!1:d(t).unusedTokens.push(r),G(r,s,t)):t._strict&&!s&&d(t).unusedTokens.push(r);d(t).charsLeftOver=u-l,o.length>0&&d(t).unusedInput.push(o),t._a[Pt]<=12&&!0===d(t).bigHour&&t._a[Pt]>0&&(d(t).bigHour=void 0),d(t).parsedDateParts=t._a.slice(0),d(t).meridiem=t._meridiem,t._a[Pt]=function(e,t,n){var s;if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((s=e.isPM(n))&&t<12&&(t+=12),s||12!==t||(t=0),t):t}(t._locale,t._a[Pt],t._meridiem),he(t),le(t)}else me(t);else ce(t)}function ye(o){var l=o._i,y=o._f;return o._locale=o._locale||ue(o._l),null===l||void 0===y&&""===l?c({nullInput:!0}):("string"==typeof l&&(o._i=l=o._locale.preparse(l)),_(l)?new m(le(l)):(r(l)?o._d=l:t(y)?function(e){var t,n,s,i,r;if(0===e._f.length)return d(e).invalidFormat=!0,void(e._d=new Date(NaN));for(i=0;ir&&(t=r),function(e,t,n,s,i){var r=Q(e,t,n,s,i),a=J(r.year,0,r.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}.call(this,e,t,n,s,i))}function Ne(e,t){t[Rt]=g(1e3*("0."+e))}function Ge(e){return e}function Ve(e,t,n,s){var i=ue(),r=l().set(s,t);return i[n](r,e)}function Ee(e,t,n){if(i(e)&&(t=e,e=void 0),e=e||"",null!=t)return Ve(e,t,n,"month");var s,r=[];for(s=0;s<12;s++)r[s]=Ve(e,s,n,"month");return r}function Ie(e,t,n,s){"boolean"==typeof e?(i(t)&&(n=t,t=void 0),t=t||""):(n=t=e,e=!1,i(t)&&(n=t,t=void 0),t=t||"");var r=ue(),a=e?r._week.dow:0;if(null!=n)return Ve(t,(n+a)%7,s,"day");var o,u=[];for(o=0;o<7;o++)u[o]=Ve(t,(o+a)%7,s,"day");return u}function Ae(e,t,n,s){var i=xe(t,n);return e._milliseconds+=s*i._milliseconds,e._days+=s*i._days,e._months+=s*i._months,e._bubble()}function je(e){return e<0?Math.floor(e):Math.ceil(e)}function Ze(e){return 4800*e/146097}function ze(e){return 146097*e/4800}function $e(e){return function(){return this.as(e)}}function qe(e){return function(){return this.isValid()?this._data[e]:NaN}}function Je(e){return(e>0)-(e<0)||+e}function Be(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n=An(this._milliseconds)/1e3,s=An(this._days),i=An(this._months);t=y((e=y(n/60))/60),n%=60,e%=60;var r=y(i/12),a=i%=12,o=s,u=t,l=e,d=n?n.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var c=h<0?"-":"",f=Je(this._months)!==Je(h)?"-":"",m=Je(this._days)!==Je(h)?"-":"",_=Je(this._milliseconds)!==Je(h)?"-":"";return c+"P"+(r?f+r+"Y":"")+(a?f+a+"M":"")+(o?m+o+"D":"")+(u||l||d?"T":"")+(u?_+u+"H":"")+(l?_+l+"M":"")+(d?_+d+"S":"")}var Qe,Xe;Xe=Array.prototype.some?Array.prototype.some:function(e){for(var t=Object(this),n=t.length>>>0,s=0;s68?1900:2e3)};var Ut,Lt=I("FullYear",!0);Ut=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;tthis?this:e:c()}),hn=["year","quarter","month","week","day","hour","minute","second","millisecond"];De("Z",":"),De("ZZ",""),C("Z",Dt),C("ZZ",Dt),L(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=ke(Dt,e)});var cn=/([\+\-]|\d\d)/gi;e.updateOffset=function(){};var fn=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,mn=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;xe.fn=ve.prototype,xe.invalid=function(){return xe(NaN)};var _n=We(1,"add"),yn=We(-1,"subtract");e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var gn=v("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});P(0,["gg",2],0,function(){return this.weekYear()%100}),P(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ue("gggg","weekYear"),Ue("ggggg","weekYear"),Ue("GGGG","isoWeekYear"),Ue("GGGGG","isoWeekYear"),Y("weekYear","gg"),Y("isoWeekYear","GG"),x("weekYear",1),x("isoWeekYear",1),C("G",Mt),C("g",Mt),C("GG",mt,dt),C("gg",mt,dt),C("GGGG",pt,ct),C("gggg",pt,ct),C("GGGGG",wt,ft),C("ggggg",wt,ft),N(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,s){t[s.substr(0,2)]=g(e)}),N(["gg","GG"],function(t,n,s,i){n[i]=e.parseTwoDigitYear(t)}),P("Q",0,"Qo","quarter"),Y("quarter","Q"),x("quarter",7),C("Q",lt),L("Q",function(e,t){t[xt]=3*(g(e)-1)}),P("D",["DD",2],"Do","date"),Y("date","D"),x("date",9),C("D",mt),C("DD",mt,dt),C("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),L(["D","DD"],bt),L("Do",function(e,t){t[bt]=g(e.match(mt)[0])});var pn=I("Date",!0);P("DDD",["DDDD",3],"DDDo","dayOfYear"),Y("dayOfYear","DDD"),x("dayOfYear",4),C("DDD",gt),C("DDDD",ht),L(["DDD","DDDD"],function(e,t,n){n._dayOfYear=g(e)}),P("m",["mm",2],0,"minute"),Y("minute","m"),x("minute",14),C("m",mt),C("mm",mt,dt),L(["m","mm"],Wt);var wn=I("Minutes",!1);P("s",["ss",2],0,"second"),Y("second","s"),x("second",15),C("s",mt),C("ss",mt,dt),L(["s","ss"],Ht);var vn=I("Seconds",!1);P("S",0,0,function(){return~~(this.millisecond()/100)}),P(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),P(0,["SSS",3],0,"millisecond"),P(0,["SSSS",4],0,function(){return 10*this.millisecond()}),P(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),P(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),P(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),P(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),P(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),Y("millisecond","ms"),x("millisecond",16),C("S",gt,lt),C("SS",gt,dt),C("SSS",gt,ht);var Mn;for(Mn="SSSS";Mn.length<=9;Mn+="S")C(Mn,vt);for(Mn="S";Mn.length<=9;Mn+="S")L(Mn,Ne);var Sn=I("Milliseconds",!1);P("z",0,0,"zoneAbbr"),P("zz",0,0,"zoneName");var Dn=m.prototype;Dn.add=_n,Dn.calendar=function(t,n){var s=t||pe(),i=Ye(s,this).startOf("day"),r=e.calendarFormat(this,i)||"sameElse",a=n&&(S(n[r])?n[r].call(this,s):n[r]);return this.format(a||this.localeData().calendar(r,this,pe(s)))},Dn.clone=function(){return new m(this)},Dn.diff=function(e,t,n){var s,i,r;if(!this.isValid())return NaN;if(!(s=Ye(e,this)).isValid())return NaN;switch(i=6e4*(s.utcOffset()-this.utcOffset()),t=O(t)){case"year":r=Re(this,s)/12;break;case"month":r=Re(this,s);break;case"quarter":r=Re(this,s)/3;break;case"second":r=(this-s)/1e3;break;case"minute":r=(this-s)/6e4;break;case"hour":r=(this-s)/36e5;break;case"day":r=(this-s-i)/864e5;break;case"week":r=(this-s-i)/6048e5;break;default:r=this-s}return n?r:y(r)},Dn.endOf=function(e){return void 0===(e=O(e))||"millisecond"===e?this:("date"===e&&(e="day"),this.startOf(e).add(1,"isoWeek"===e?"week":e).subtract(1,"ms"))},Dn.format=function(t){t||(t=this.isUtc()?e.defaultFormatUtc:e.defaultFormat);var n=H(this,t);return this.localeData().postformat(n)},Dn.from=function(e,t){return this.isValid()&&(_(e)&&e.isValid()||pe(e).isValid())?xe({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},Dn.fromNow=function(e){return this.from(pe(),e)},Dn.to=function(e,t){return this.isValid()&&(_(e)&&e.isValid()||pe(e).isValid())?xe({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},Dn.toNow=function(e){return this.to(pe(),e)},Dn.get=function(e){return e=O(e),S(this[e])?this[e]():this},Dn.invalidAt=function(){return d(this).overflow},Dn.isAfter=function(e,t){var n=_(e)?e:pe(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=O(s(t)?"millisecond":t))?this.valueOf()>n.valueOf():n.valueOf()9999?H(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):S(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this._d.valueOf()).toISOString().replace("Z",H(n,"Z")):H(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},Dn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="";this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var n="["+e+'("]',s=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i=t+'[")]';return this.format(n+s+"-MM-DD[T]HH:mm:ss.SSS"+i)},Dn.toJSON=function(){return this.isValid()?this.toISOString():null},Dn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},Dn.unix=function(){return Math.floor(this.valueOf()/1e3)},Dn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},Dn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},Dn.year=Lt,Dn.isLeapYear=function(){return E(this.year())},Dn.weekYear=function(e){return Le.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},Dn.isoWeekYear=function(e){return Le.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},Dn.quarter=Dn.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},Dn.month=$,Dn.daysInMonth=function(){return Z(this.year(),this.month())},Dn.week=Dn.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")},Dn.isoWeek=Dn.isoWeeks=function(e){var t=X(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")},Dn.weeksInYear=function(){var e=this.localeData()._week;return K(this.year(),e.dow,e.doy)},Dn.isoWeeksInYear=function(){return K(this.year(),1,4)},Dn.date=pn,Dn.day=Dn.days=function(e){if(!this.isValid())return null!=e?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(e=function(e,t){return"string"!=typeof e?e:isNaN(e)?"number"==typeof(e=t.weekdaysParse(e))?e:null:parseInt(e,10)}(e,this.localeData()),this.add(e-t,"d")):t},Dn.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")},Dn.isoWeekday=function(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=function(e,t){return"string"==typeof e?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}(e,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7},Dn.dayOfYear=function(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")},Dn.hour=Dn.hours=Bt,Dn.minute=Dn.minutes=wn,Dn.second=Dn.seconds=vn,Dn.millisecond=Dn.milliseconds=Sn,Dn.utcOffset=function(t,n,s){var i,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=ke(Dt,t)))return this}else Math.abs(t)<16&&!s&&(t*=60);return!this._isUTC&&n&&(i=Oe(this)),this._offset=t,this._isUTC=!0,null!=i&&this.add(i,"m"),r!==t&&(!n||this._changeInProgress?He(this,xe(t-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,e.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Oe(this)},Dn.utc=function(e){return this.utcOffset(0,e)},Dn.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Oe(this),"m")),this},Dn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var e=ke(St,this._i);null!=e?this.utcOffset(e):this.utcOffset(0,!0)}return this},Dn.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?pe(e).utcOffset():0,(this.utcOffset()-e)%60==0)},Dn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},Dn.isLocal=function(){return!!this.isValid()&&!this._isUTC},Dn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},Dn.isUtc=Te,Dn.isUTC=Te,Dn.zoneAbbr=function(){return this._isUTC?"UTC":""},Dn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},Dn.dates=v("dates accessor is deprecated. Use date instead.",pn),Dn.months=v("months accessor is deprecated. Use month instead",$),Dn.years=v("years accessor is deprecated. Use year instead",Lt),Dn.zone=v("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),Dn.isDSTShifted=v("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var e={};if(f(e,this),(e=ye(e))._a){var t=e._isUTC?l(e._a):pe(e._a);this._isDSTShifted=this.isValid()&&p(e._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var kn=k.prototype;kn.calendar=function(e,t,n){var s=this._calendar[e]||this._calendar.sameElse;return S(s)?s.call(t,n):s},kn.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.replace(/MMMM|MM|DD|dddd/g,function(e){return e.slice(1)}),this._longDateFormat[e])},kn.invalidDate=function(){return this._invalidDate},kn.ordinal=function(e){return this._ordinal.replace("%d",e)},kn.preparse=Ge,kn.postformat=Ge,kn.relativeTime=function(e,t,n,s){var i=this._relativeTime[n];return S(i)?i(e,t,n,s):i.replace(/%d/i,e)},kn.pastFuture=function(e,t){var n=this._relativeTime[e>0?"future":"past"];return S(n)?n(t):n.replace(/%s/i,t)},kn.set=function(e){var t,n;for(n in e)S(t=e[n])?this[n]=t:this["_"+n]=t;this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},kn.months=function(e,n){return e?t(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||Nt).test(n)?"format":"standalone"][e.month()]:t(this._months)?this._months:this._months.standalone},kn.monthsShort=function(e,n){return e?t(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[Nt.test(n)?"format":"standalone"][e.month()]:t(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},kn.monthsParse=function(e,t,n){var s,i,r;if(this._monthsParseExact)return function(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)r=l([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===t?-1!==(i=Ut.call(this._shortMonthsParse,a))?i:null:-1!==(i=Ut.call(this._longMonthsParse,a))?i:null:"MMM"===t?-1!==(i=Ut.call(this._shortMonthsParse,a))?i:-1!==(i=Ut.call(this._longMonthsParse,a))?i:null:-1!==(i=Ut.call(this._longMonthsParse,a))?i:-1!==(i=Ut.call(this._shortMonthsParse,a))?i:null}.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(i=l([2e3,s]),n&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[s]||(r="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[s]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[s].test(e))return s;if(n&&"MMM"===t&&this._shortMonthsParse[s].test(e))return s;if(!n&&this._monthsParse[s].test(e))return s}},kn.monthsRegex=function(e){return this._monthsParseExact?(o(this,"_monthsRegex")||q.call(this),e?this._monthsStrictRegex:this._monthsRegex):(o(this,"_monthsRegex")||(this._monthsRegex=It),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},kn.monthsShortRegex=function(e){return this._monthsParseExact?(o(this,"_monthsRegex")||q.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(o(this,"_monthsShortRegex")||(this._monthsShortRegex=Et),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},kn.week=function(e){return X(e,this._week.dow,this._week.doy).week},kn.firstDayOfYear=function(){return this._week.doy},kn.firstDayOfWeek=function(){return this._week.dow},kn.weekdays=function(e,n){return e?t(this._weekdays)?this._weekdays[e.day()]:this._weekdays[this._weekdays.isFormat.test(n)?"format":"standalone"][e.day()]:t(this._weekdays)?this._weekdays:this._weekdays.standalone},kn.weekdaysMin=function(e){return e?this._weekdaysMin[e.day()]:this._weekdaysMin},kn.weekdaysShort=function(e){return e?this._weekdaysShort[e.day()]:this._weekdaysShort},kn.weekdaysParse=function(e,t,n){var s,i,r;if(this._weekdaysParseExact)return function(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=l([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=Ut.call(this._weekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Ut.call(this._shortWeekdaysParse,a))?i:null:-1!==(i=Ut.call(this._minWeekdaysParse,a))?i:null:"dddd"===t?-1!==(i=Ut.call(this._weekdaysParse,a))?i:-1!==(i=Ut.call(this._shortWeekdaysParse,a))?i:-1!==(i=Ut.call(this._minWeekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Ut.call(this._shortWeekdaysParse,a))?i:-1!==(i=Ut.call(this._weekdaysParse,a))?i:-1!==(i=Ut.call(this._minWeekdaysParse,a))?i:null:-1!==(i=Ut.call(this._minWeekdaysParse,a))?i:-1!==(i=Ut.call(this._weekdaysParse,a))?i:-1!==(i=Ut.call(this._shortWeekdaysParse,a))?i:null}.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(i=l([2e3,1]).day(s),n&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(i,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(i,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(i,"").replace(".",".?")+"$","i")),this._weekdaysParse[s]||(r="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[s]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[s].test(e))return s;if(n&&"ddd"===t&&this._shortWeekdaysParse[s].test(e))return s;if(n&&"dd"===t&&this._minWeekdaysParse[s].test(e))return s;if(!n&&this._weekdaysParse[s].test(e))return s}},kn.weekdaysRegex=function(e){return this._weekdaysParseExact?(o(this,"_weekdaysRegex")||ee.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(o(this,"_weekdaysRegex")||(this._weekdaysRegex=zt),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},kn.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(o(this,"_weekdaysRegex")||ee.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(o(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=$t),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},kn.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(o(this,"_weekdaysRegex")||ee.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(o(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=qt),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},kn.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},kn.meridiem=function(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"},ae("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===g(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),e.lang=v("moment.lang is deprecated. Use moment.locale instead.",ae),e.langData=v("moment.langData is deprecated. Use moment.localeData instead.",ue);var Yn=Math.abs,On=$e("ms"),Tn=$e("s"),xn=$e("m"),bn=$e("h"),Pn=$e("d"),Wn=$e("w"),Hn=$e("M"),Rn=$e("y"),Cn=qe("milliseconds"),Fn=qe("seconds"),Un=qe("minutes"),Ln=qe("hours"),Nn=qe("days"),Gn=qe("months"),Vn=qe("years"),En=Math.round,In={ss:44,s:45,m:45,h:22,d:26,M:11},An=Math.abs,jn=ve.prototype;return jn.isValid=function(){return this._isValid},jn.abs=function(){var e=this._data;return this._milliseconds=Yn(this._milliseconds),this._days=Yn(this._days),this._months=Yn(this._months),e.milliseconds=Yn(e.milliseconds),e.seconds=Yn(e.seconds),e.minutes=Yn(e.minutes),e.hours=Yn(e.hours),e.months=Yn(e.months),e.years=Yn(e.years),this},jn.add=function(e,t){return Ae(this,e,t,1)},jn.subtract=function(e,t){return Ae(this,e,t,-1)},jn.as=function(e){if(!this.isValid())return NaN;var t,n,s=this._milliseconds;if("month"===(e=O(e))||"year"===e)return t=this._days+s/864e5,n=this._months+Ze(t),"month"===e?n:n/12;switch(t=this._days+Math.round(ze(this._months)),e){case"week":return t/7+s/6048e5;case"day":return t+s/864e5;case"hour":return 24*t+s/36e5;case"minute":return 1440*t+s/6e4;case"second":return 86400*t+s/1e3;case"millisecond":return Math.floor(864e5*t)+s;default:throw new Error("Unknown unit "+e)}},jn.asMilliseconds=On,jn.asSeconds=Tn,jn.asMinutes=xn,jn.asHours=bn,jn.asDays=Pn,jn.asWeeks=Wn,jn.asMonths=Hn,jn.asYears=Rn,jn.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*g(this._months/12):NaN},jn._bubble=function(){var e,t,n,s,i,r=this._milliseconds,a=this._days,o=this._months,u=this._data;return r>=0&&a>=0&&o>=0||r<=0&&a<=0&&o<=0||(r+=864e5*je(ze(o)+a),a=0,o=0),u.milliseconds=r%1e3,e=y(r/1e3),u.seconds=e%60,t=y(e/60),u.minutes=t%60,n=y(t/60),u.hours=n%24,a+=y(n/24),i=y(Ze(a)),o+=i,a-=je(ze(i)),s=y(o/12),o%=12,u.days=a,u.months=o,u.years=s,this},jn.clone=function(){return xe(this)},jn.get=function(e){return e=O(e),this.isValid()?this[e+"s"]():NaN},jn.milliseconds=Cn,jn.seconds=Fn,jn.minutes=Un,jn.hours=Ln,jn.days=Nn,jn.weeks=function(){return y(this.days()/7)},jn.months=Gn,jn.years=Vn,jn.humanize=function(e){if(!this.isValid())return this.localeData().invalidDate();var t=this.localeData(),n=function(e,t,n){var s=xe(e).abs(),i=En(s.as("s")),r=En(s.as("m")),a=En(s.as("h")),o=En(s.as("d")),u=En(s.as("M")),l=En(s.as("y")),d=i<=In.ss&&["s",i]||i0,d[4]=n,function(e,t,n,s,i){return i.relativeTime(t||1,!!n,e,s)}.apply(null,d)}(this,!e,t);return e&&(n=t.pastFuture(+this,n)),t.postformat(n)},jn.toISOString=Be,jn.toString=Be,jn.toJSON=Be,jn.locale=Ce,jn.localeData=Fe,jn.toIsoString=v("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Be),jn.lang=gn,P("X",0,0,"unix"),P("x",0,0,"valueOf"),C("x",Mt),C("X",/[+-]?\d+(\.\d{1,3})?/),L("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),L("x",function(e,t,n){n._d=new Date(g(e))}),e.version="2.20.1",function(e){Qe=e}(pe),e.fn=Dn,e.min=function(){return we("isBefore",[].slice.call(arguments,0))},e.max=function(){return we("isAfter",[].slice.call(arguments,0))},e.now=function(){return Date.now?Date.now():+new Date},e.utc=l,e.unix=function(e){return pe(1e3*e)},e.months=function(e,t){return Ee(e,t,"months")},e.isDate=r,e.locale=ae,e.invalid=c,e.duration=xe,e.isMoment=_,e.weekdays=function(e,t,n){return Ie(e,t,n,"weekdays")},e.parseZone=function(){return pe.apply(null,arguments).parseZone()},e.localeData=ue,e.isDuration=Me,e.monthsShort=function(e,t){return Ee(e,t,"monthsShort")},e.weekdaysMin=function(e,t,n){return Ie(e,t,n,"weekdaysMin")},e.defineLocale=oe,e.updateLocale=function(e,t){if(null!=t){var n,s,i=Qt;null!=(s=re(e))&&(i=s._config),(n=new k(t=D(i,t))).parentLocale=Xt[e],Xt[e]=n,ae(e)}else null!=Xt[e]&&(null!=Xt[e].parentLocale?Xt[e]=Xt[e].parentLocale:null!=Xt[e]&&delete Xt[e]);return Xt[e]},e.locales=function(){return nt(Xt)},e.weekdaysShort=function(e,t,n){return Ie(e,t,n,"weekdaysShort")},e.normalizeUnits=O,e.relativeTimeRounding=function(e){return void 0===e?En:"function"==typeof e&&(En=e,!0)},e.relativeTimeThreshold=function(e,t){return void 0!==In[e]&&(void 0===t?In[e]:(In[e]=t,"s"===e&&(In.ss=t-1),!0))},e.calendarFormat=function(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},e.prototype=Dn,e.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},e});PKL\'!!/youtube-embed-plus/scripts/alertify/alertify.jsnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ ( function ( window ) { 'use strict'; /** * Keys enum * @type {Object} */ var keys = { ENTER: 13, ESC: 27, F1: 112, F12: 123, LEFT: 37, RIGHT: 39 }; /** * Default options * @type {Object} */ var defaults = { autoReset:true, basic:false, closable:true, closableByDimmer:true, frameless:false, maintainFocus:true, //global default not per instance, applies to all dialogs maximizable:true, modal:true, movable:true, moveBounded:false, overflow:true, padding: true, pinnable:true, pinned:true, preventBodyShift:false, //global default not per instance, applies to all dialogs resizable:true, startMaximized:false, transition:'pulse', notifier:{ delay:5, position:'bottom-right', closeButton:false }, glossary:{ title:'AlertifyJS', ok: 'OK', cancel: 'Cancel', acccpt: 'Accept', deny: 'Deny', confirm: 'Confirm', decline: 'Decline', close: 'Close', maximize: 'Maximize', restore: 'Restore', }, theme:{ input:'ajs-input', ok:'ajs-ok', cancel:'ajs-cancel', } }; //holds open dialogs instances var openDialogs = []; /** * [Helper] Adds the specified class(es) to the element. * * @element {node} The element * @className {string} One or more space-separated classes to be added to the class attribute of the element. * * @return {undefined} */ function addClass(element,classNames){ element.className += ' ' + classNames; } /** * [Helper] Removes the specified class(es) from the element. * * @element {node} The element * @className {string} One or more space-separated classes to be removed from the class attribute of the element. * * @return {undefined} */ function removeClass(element, classNames) { var original = element.className.split(' '); var toBeRemoved = classNames.split(' '); for (var x = 0; x < toBeRemoved.length; x += 1) { var index = original.indexOf(toBeRemoved[x]); if (index > -1){ original.splice(index,1); } } element.className = original.join(' '); } /** * [Helper] Checks if the document is RTL * * @return {Boolean} True if the document is RTL, false otherwise. */ function isRightToLeft(){ return window.getComputedStyle(document.body).direction === 'rtl'; } /** * [Helper] Get the document current scrollTop * * @return {Number} current document scrollTop value */ function getScrollTop(){ return ((document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop); } /** * [Helper] Get the document current scrollLeft * * @return {Number} current document scrollLeft value */ function getScrollLeft(){ return ((document.documentElement && document.documentElement.scrollLeft) || document.body.scrollLeft); } /** * Helper: clear contents * */ function clearContents(element){ while (element.lastChild) { element.removeChild(element.lastChild); } } /** * Extends a given prototype by merging properties from base into sub. * * @sub {Object} sub The prototype being overwritten. * @base {Object} base The prototype being written. * * @return {Object} The extended prototype. */ function copy(src) { if(null === src){ return src; } var cpy; if(Array.isArray(src)){ cpy = []; for(var x=0;x 0) { var args = []; for (var x = 0; x < arguments.length; x += 1) { args.push(arguments[x]); } args.push(context); return method.apply(context, args); } return method.apply(context, [null, context]); }; } /** * Helper for creating a dialog close event. * * @return {object} */ function createCloseEvent(index, button) { return { index: index, button: button, cancel: false }; } /** * Helper for dispatching events. * * @param {string} evenType The type of the event to disptach. * @param {object} instance The dialog instance disptaching the event. * * @return {any} The result of the invoked function. */ function dispatchEvent(eventType, instance) { if ( typeof instance.get(eventType) === 'function' ) { return instance.get(eventType).call(instance); } } /** * Super class for all dialogs * * @return {Object} base dialog prototype */ var dialog = (function () { var //holds the list of used keys. usedKeys = [], //dummy variable, used to trigger dom reflow. reflow = null, //condition for detecting safari isSafari = window.navigator.userAgent.indexOf('Safari') > -1 && window.navigator.userAgent.indexOf('Chrome') < 0, //dialog building blocks templates = { dimmer:'
', /*tab index required to fire click event before body focus*/ modal: '
', dialog: '
', reset: '', commands: '
', header: '
', body: '
', content: '
', footer: '', buttons: { primary: '
', auxiliary: '
' }, button: '', resizeHandle: '
', }, //common class names classes = { animationIn: 'ajs-in', animationOut: 'ajs-out', base: 'alertify', basic:'ajs-basic', capture: 'ajs-capture', closable:'ajs-closable', fixed: 'ajs-fixed', frameless:'ajs-frameless', hidden: 'ajs-hidden', maximize: 'ajs-maximize', maximized: 'ajs-maximized', maximizable:'ajs-maximizable', modeless: 'ajs-modeless', movable: 'ajs-movable', noSelection: 'ajs-no-selection', noOverflow: 'ajs-no-overflow', noPadding:'ajs-no-padding', pin:'ajs-pin', pinnable:'ajs-pinnable', prefix: 'ajs-', resizable: 'ajs-resizable', restore: 'ajs-restore', shake:'ajs-shake', unpinned:'ajs-unpinned', }; /** * Helper: initializes the dialog instance * * @return {Number} The total count of currently open modals. */ function initialize(instance){ if(!instance.__internal){ //no need to expose init after this. delete instance.__init; //keep a copy of initial dialog settings if(!instance.__settings){ instance.__settings = copy(instance.settings); } //in case the script was included before body. //after first dialog gets initialized, it won't be null anymore! if(null === reflow){ // set tabindex attribute on body element this allows script to give it // focus after the dialog is closed document.body.setAttribute( 'tabindex', '0' ); } //get dialog buttons/focus setup var setup; if(typeof instance.setup === 'function'){ setup = instance.setup(); setup.options = setup.options || {}; setup.focus = setup.focus || {}; }else{ setup = { buttons:[], focus:{ element:null, select:false }, options:{ } }; } //initialize hooks object. if(typeof instance.hooks !== 'object'){ instance.hooks = {}; } //copy buttons defintion var buttonsDefinition = []; if(Array.isArray(setup.buttons)){ for(var b=0;b= 0){ //last open modal or last maximized one removeClass(document.body, classes.noOverflow); preventBodyShift(false); }else if(requiresNoOverflow > 0 && document.body.className.indexOf(classes.noOverflow) < 0){ //first open modal or first maximized one preventBodyShift(true); addClass(document.body, classes.noOverflow); } } var top = '', topScroll = 0; /** * Helper: prevents body shift. * */ function preventBodyShift(add){ if(alertify.defaults.preventBodyShift && document.documentElement.scrollHeight > document.documentElement.clientHeight){ if(add ){//&& openDialogs[openDialogs.length-1].elements.dialog.clientHeight <= document.documentElement.clientHeight){ topScroll = scrollY; top = window.getComputedStyle(document.body).top; addClass(document.body, classes.fixed); document.body.style.top = -scrollY + 'px'; } else { scrollY = topScroll; document.body.style.top = top; removeClass(document.body, classes.fixed); restoreScrollPosition(); } } } /** * Sets the name of the transition used to show/hide the dialog * * @param {Object} instance The dilog instance. * */ function updateTransition(instance, value, oldValue){ if(typeof oldValue === 'string'){ removeClass(instance.elements.root,classes.prefix + oldValue); } addClass(instance.elements.root, classes.prefix + value); reflow = instance.elements.root.offsetWidth; } /** * Toggles the dialog display mode * * @param {Object} instance The dilog instance. * * @return {undefined} */ function updateDisplayMode(instance){ if(instance.get('modal')){ //make modal removeClass(instance.elements.root, classes.modeless); //only if open if(instance.isOpen()){ unbindModelessEvents(instance); //in case a pinned modless dialog was made modal while open. updateAbsPositionFix(instance); ensureNoOverflow(); } }else{ //make modelss addClass(instance.elements.root, classes.modeless); //only if open if(instance.isOpen()){ bindModelessEvents(instance); //in case pin/unpin was called while a modal is open updateAbsPositionFix(instance); ensureNoOverflow(); } } } /** * Toggles the dialog basic view mode * * @param {Object} instance The dilog instance. * * @return {undefined} */ function updateBasicMode(instance){ if (instance.get('basic')) { // add class addClass(instance.elements.root, classes.basic); } else { // remove class removeClass(instance.elements.root, classes.basic); } } /** * Toggles the dialog frameless view mode * * @param {Object} instance The dilog instance. * * @return {undefined} */ function updateFramelessMode(instance){ if (instance.get('frameless')) { // add class addClass(instance.elements.root, classes.frameless); } else { // remove class removeClass(instance.elements.root, classes.frameless); } } /** * Helper: Brings the modeless dialog to front, attached to modeless dialogs. * * @param {Event} event Focus event * @param {Object} instance The dilog instance. * * @return {undefined} */ function bringToFront(event, instance){ // Do not bring to front if preceeded by an open modal var index = openDialogs.indexOf(instance); for(var x=index+1;x -1) { triggerCallback(instance, function (button) { return button.key === keyCode; }); return false; } } /** * Keydown event handler, attached to the document.body * * @param {Event} DOM event object. * @param {Object} The dilog instance. * * @return {undefined} */ function keydownHandler(event) { var instance = openDialogs[openDialogs.length - 1]; var keyCode = event.keyCode; if (keyCode === keys.LEFT || keyCode === keys.RIGHT) { var buttons = instance.__internal.buttons; for (var x = 0; x < buttons.length; x += 1) { if (document.activeElement === buttons[x].element) { switch (keyCode) { case keys.LEFT: buttons[(x || buttons.length) - 1].element.focus(); return; case keys.RIGHT: buttons[(x + 1) % buttons.length].element.focus(); return; } } } }else if (keyCode < keys.F12 + 1 && keyCode > keys.F1 - 1 && usedKeys.indexOf(keyCode) > -1) { event.preventDefault(); event.stopPropagation(); triggerCallback(instance, function (button) { return button.key === keyCode; }); return false; } } /** * Sets focus to proper dialog element * * @param {Object} instance The dilog instance. * @param {Node} [resetTarget=undefined] DOM element to reset focus to. * * @return {undefined} */ function setFocus(instance, resetTarget) { // reset target has already been determined. if (resetTarget) { resetTarget.focus(); } else { // current instance focus settings var focus = instance.__internal.focus; // the focus element. var element = focus.element; switch (typeof focus.element) { // a number means a button index case 'number': if (instance.__internal.buttons.length > focus.element) { //in basic view, skip focusing the buttons. if (instance.get('basic') === true) { element = instance.elements.reset[0]; } else { element = instance.__internal.buttons[focus.element].element; } } break; // a string means querySelector to select from dialog body contents. case 'string': element = instance.elements.body.querySelector(focus.element); break; // a function should return the focus element. case 'function': element = focus.element.call(instance); break; } // if no focus element, default to first reset element. if ((typeof element === 'undefined' || element === null) && instance.__internal.buttons.length === 0) { element = instance.elements.reset[0]; } // focus if (element && element.focus) { element.focus(); // if selectable if (focus.select && element.select) { element.select(); } } } } /** * Focus event handler, attached to document.body and dialogs own reset links. * handles the focus for modal dialogs only. * * @param {Event} event DOM focus event object. * @param {Object} instance The dilog instance. * * @return {undefined} */ function onReset(event, instance) { // should work on last modal if triggered from document.body if (!instance) { for (var x = openDialogs.length - 1; x > -1; x -= 1) { if (openDialogs[x].isModal()) { instance = openDialogs[x]; break; } } } // if modal if (instance && instance.isModal()) { // determine reset target to enable forward/backward tab cycle. var resetTarget, target = event.srcElement || event.target; var lastResetElement = target === instance.elements.reset[1] || (instance.__internal.buttons.length === 0 && target === document.body); // if last reset link, then go to maximize or close if (lastResetElement) { if (instance.get('maximizable')) { resetTarget = instance.elements.commands.maximize; } else if (instance.get('closable')) { resetTarget = instance.elements.commands.close; } } // if no reset target found, try finding the best button if (resetTarget === undefined) { if (typeof instance.__internal.focus.element === 'number') { // button focus element, go to first available button if (target === instance.elements.reset[0]) { resetTarget = instance.elements.buttons.auxiliary.firstChild || instance.elements.buttons.primary.firstChild; } else if (lastResetElement) { //restart the cycle by going to first reset link resetTarget = instance.elements.reset[0]; } } else { // will reach here when tapping backwards, so go to last child // The focus element SHOULD NOT be a button (logically!). if (target === instance.elements.reset[0]) { resetTarget = instance.elements.buttons.primary.lastChild || instance.elements.buttons.auxiliary.lastChild; } } } // focus setFocus(instance, resetTarget); } } /** * Transition in transitionend event handler. * * @param {Event} TransitionEnd event object. * @param {Object} The dilog instance. * * @return {undefined} */ function handleTransitionInEvent(event, instance) { // clear the timer clearTimeout(instance.__internal.timerIn); // once transition is complete, set focus setFocus(instance); //restore scroll to prevent document jump restoreScrollPosition(); // allow handling key up after transition ended. cancelKeyup = false; // allow custom `onfocus` method dispatchEvent('onfocus', instance); // unbind the event off(instance.elements.dialog, transition.type, instance.__internal.transitionInHandler); removeClass(instance.elements.root, classes.animationIn); } /** * Transition out transitionend event handler. * * @param {Event} TransitionEnd event object. * @param {Object} The dilog instance. * * @return {undefined} */ function handleTransitionOutEvent(event, instance) { // clear the timer clearTimeout(instance.__internal.timerOut); // unbind the event off(instance.elements.dialog, transition.type, instance.__internal.transitionOutHandler); // reset move updates resetMove(instance); // reset resize updates resetResize(instance); // restore if maximized if (instance.isMaximized() && !instance.get('startMaximized')) { restore(instance); } // return focus to the last active element if (alertify.defaults.maintainFocus && instance.__internal.activeElement) { instance.__internal.activeElement.focus(); instance.__internal.activeElement = null; } //destory the instance if (typeof instance.__internal.destroy === 'function') { instance.__internal.destroy.apply(instance); } } /* Controls moving a dialog around */ //holde the current moving instance var movable = null, //holds the current X offset when move starts offsetX = 0, //holds the current Y offset when move starts offsetY = 0, xProp = 'pageX', yProp = 'pageY', bounds = null, refreshTop = false, moveDelegate = null ; /** * Helper: sets the element top/left coordinates * * @param {Event} event DOM event object. * @param {Node} element The element being moved. * * @return {undefined} */ function moveElement(event, element) { var left = (event[xProp] - offsetX), top = (event[yProp] - offsetY); if(refreshTop){ top -= document.body.scrollTop; } element.style.left = left + 'px'; element.style.top = top + 'px'; } /** * Helper: sets the element top/left coordinates within screen bounds * * @param {Event} event DOM event object. * @param {Node} element The element being moved. * * @return {undefined} */ function moveElementBounded(event, element) { var left = (event[xProp] - offsetX), top = (event[yProp] - offsetY); if(refreshTop){ top -= document.body.scrollTop; } element.style.left = Math.min(bounds.maxLeft, Math.max(bounds.minLeft, left)) + 'px'; if(refreshTop){ element.style.top = Math.min(bounds.maxTop, Math.max(bounds.minTop, top)) + 'px'; }else{ element.style.top = Math.max(bounds.minTop, top) + 'px'; } } /** * Triggers the start of a move event, attached to the header element mouse down event. * Adds no-selection class to the body, disabling selection while moving. * * @param {Event} event DOM event object. * @param {Object} instance The dilog instance. * * @return {Boolean} false */ function beginMove(event, instance) { if (resizable === null && !instance.isMaximized() && instance.get('movable')) { var eventSrc, left=0, top=0; if (event.type === 'touchstart') { event.preventDefault(); eventSrc = event.targetTouches[0]; xProp = 'clientX'; yProp = 'clientY'; } else if (event.button === 0) { eventSrc = event; } if (eventSrc) { var element = instance.elements.dialog; addClass(element, classes.capture); if (element.style.left) { left = parseInt(element.style.left, 10); } if (element.style.top) { top = parseInt(element.style.top, 10); } offsetX = eventSrc[xProp] - left; offsetY = eventSrc[yProp] - top; if(instance.isModal()){ offsetY += instance.elements.modal.scrollTop; }else if(instance.isPinned()){ offsetY -= document.body.scrollTop; } if(instance.get('moveBounded')){ var current = element, offsetLeft = -left, offsetTop = -top; //calc offset do { offsetLeft += current.offsetLeft; offsetTop += current.offsetTop; } while (current = current.offsetParent); bounds = { maxLeft : offsetLeft, minLeft : -offsetLeft, maxTop : document.documentElement.clientHeight - element.clientHeight - offsetTop, minTop : -offsetTop }; moveDelegate = moveElementBounded; }else{ bounds = null; moveDelegate = moveElement; } // allow custom `onmove` method dispatchEvent('onmove', instance); refreshTop = !instance.isModal() && instance.isPinned(); movable = instance; moveDelegate(eventSrc, element); addClass(document.body, classes.noSelection); return false; } } } /** * The actual move handler, attached to document.body mousemove event. * * @param {Event} event DOM event object. * * @return {undefined} */ function move(event) { if (movable) { var eventSrc; if (event.type === 'touchmove') { event.preventDefault(); eventSrc = event.targetTouches[0]; } else if (event.button === 0) { eventSrc = event; } if (eventSrc) { moveDelegate(eventSrc, movable.elements.dialog); } } } /** * Triggers the end of a move event, attached to document.body mouseup event. * Removes no-selection class from document.body, allowing selection. * * @return {undefined} */ function endMove() { if (movable) { var instance = movable; movable = bounds = null; removeClass(document.body, classes.noSelection); removeClass(instance.elements.dialog, classes.capture); // allow custom `onmoved` method dispatchEvent('onmoved', instance); } } /** * Resets any changes made by moving the element to its original state, * * @param {Object} instance The dilog instance. * * @return {undefined} */ function resetMove(instance) { movable = null; var element = instance.elements.dialog; element.style.left = element.style.top = ''; } /** * Updates the dialog move behavior. * * @param {Object} instance The dilog instance. * @param {Boolean} on True to add the behavior, removes it otherwise. * * @return {undefined} */ function updateMovable(instance) { if (instance.get('movable')) { // add class addClass(instance.elements.root, classes.movable); if (instance.isOpen()) { bindMovableEvents(instance); } } else { //reset resetMove(instance); // remove class removeClass(instance.elements.root, classes.movable); if (instance.isOpen()) { unbindMovableEvents(instance); } } } /* Controls moving a dialog around */ //holde the current instance being resized var resizable = null, //holds the staring left offset when resize starts. startingLeft = Number.Nan, //holds the staring width when resize starts. startingWidth = 0, //holds the initial width when resized for the first time. minWidth = 0, //holds the offset of the resize handle. handleOffset = 0 ; /** * Helper: sets the element width/height and updates left coordinate if neccessary. * * @param {Event} event DOM mousemove event object. * @param {Node} element The element being moved. * @param {Boolean} pinned A flag indicating if the element being resized is pinned to the screen. * * @return {undefined} */ function resizeElement(event, element, pageRelative) { //calculate offsets from 0,0 var current = element; var offsetLeft = 0; var offsetTop = 0; do { offsetLeft += current.offsetLeft; offsetTop += current.offsetTop; } while (current = current.offsetParent); // determine X,Y coordinates. var X, Y; if (pageRelative === true) { X = event.pageX; Y = event.pageY; } else { X = event.clientX; Y = event.clientY; } // rtl handling var isRTL = isRightToLeft(); if (isRTL) { // reverse X X = document.body.offsetWidth - X; // if has a starting left, calculate offsetRight if (!isNaN(startingLeft)) { offsetLeft = document.body.offsetWidth - offsetLeft - element.offsetWidth; } } // set width/height element.style.height = (Y - offsetTop + handleOffset) + 'px'; element.style.width = (X - offsetLeft + handleOffset) + 'px'; // if the element being resized has a starting left, maintain it. // the dialog is centered, divide by half the offset to maintain the margins. if (!isNaN(startingLeft)) { var diff = Math.abs(element.offsetWidth - startingWidth) * 0.5; if (isRTL) { //negate the diff, why? //when growing it should decrease left //when shrinking it should increase left diff *= -1; } if (element.offsetWidth > startingWidth) { //growing element.style.left = (startingLeft + diff) + 'px'; } else if (element.offsetWidth >= minWidth) { //shrinking element.style.left = (startingLeft - diff) + 'px'; } } } /** * Triggers the start of a resize event, attached to the resize handle element mouse down event. * Adds no-selection class to the body, disabling selection while moving. * * @param {Event} event DOM event object. * @param {Object} instance The dilog instance. * * @return {Boolean} false */ function beginResize(event, instance) { if (!instance.isMaximized()) { var eventSrc; if (event.type === 'touchstart') { event.preventDefault(); eventSrc = event.targetTouches[0]; } else if (event.button === 0) { eventSrc = event; } if (eventSrc) { // allow custom `onresize` method dispatchEvent('onresize', instance); resizable = instance; handleOffset = instance.elements.resizeHandle.offsetHeight / 2; var element = instance.elements.dialog; addClass(element, classes.capture); startingLeft = parseInt(element.style.left, 10); element.style.height = element.offsetHeight + 'px'; element.style.minHeight = instance.elements.header.offsetHeight + instance.elements.footer.offsetHeight + 'px'; element.style.width = (startingWidth = element.offsetWidth) + 'px'; if (element.style.maxWidth !== 'none') { element.style.minWidth = (minWidth = element.offsetWidth) + 'px'; } element.style.maxWidth = 'none'; addClass(document.body, classes.noSelection); return false; } } } /** * The actual resize handler, attached to document.body mousemove event. * * @param {Event} event DOM event object. * * @return {undefined} */ function resize(event) { if (resizable) { var eventSrc; if (event.type === 'touchmove') { event.preventDefault(); eventSrc = event.targetTouches[0]; } else if (event.button === 0) { eventSrc = event; } if (eventSrc) { resizeElement(eventSrc, resizable.elements.dialog, !resizable.get('modal') && !resizable.get('pinned')); } } } /** * Triggers the end of a resize event, attached to document.body mouseup event. * Removes no-selection class from document.body, allowing selection. * * @return {undefined} */ function endResize() { if (resizable) { var instance = resizable; resizable = null; removeClass(document.body, classes.noSelection); removeClass(instance.elements.dialog, classes.capture); cancelClick = true; // allow custom `onresized` method dispatchEvent('onresized', instance); } } /** * Resets any changes made by resizing the element to its original state. * * @param {Object} instance The dilog instance. * * @return {undefined} */ function resetResize(instance) { resizable = null; var element = instance.elements.dialog; if (element.style.maxWidth === 'none') { //clear inline styles. element.style.maxWidth = element.style.minWidth = element.style.width = element.style.height = element.style.minHeight = element.style.left = ''; //reset variables. startingLeft = Number.Nan; startingWidth = minWidth = handleOffset = 0; } } /** * Updates the dialog move behavior. * * @param {Object} instance The dilog instance. * @param {Boolean} on True to add the behavior, removes it otherwise. * * @return {undefined} */ function updateResizable(instance) { if (instance.get('resizable')) { // add class addClass(instance.elements.root, classes.resizable); if (instance.isOpen()) { bindResizableEvents(instance); } } else { //reset resetResize(instance); // remove class removeClass(instance.elements.root, classes.resizable); if (instance.isOpen()) { unbindResizableEvents(instance); } } } /** * Reset move/resize on window resize. * * @param {Event} event window resize event object. * * @return {undefined} */ function windowResize(/*event*/) { for (var x = 0; x < openDialogs.length; x += 1) { var instance = openDialogs[x]; if (instance.get('autoReset')) { resetMove(instance); resetResize(instance); } } } /** * Bind dialogs events * * @param {Object} instance The dilog instance. * * @return {undefined} */ function bindEvents(instance) { // if first dialog, hook global handlers if (openDialogs.length === 1) { //global on(window, 'resize', windowResize); on(document.body, 'keyup', keyupHandler); on(document.body, 'keydown', keydownHandler); on(document.body, 'focus', onReset); //move on(document.documentElement, 'mousemove', move); on(document.documentElement, 'touchmove', move); on(document.documentElement, 'mouseup', endMove); on(document.documentElement, 'touchend', endMove); //resize on(document.documentElement, 'mousemove', resize); on(document.documentElement, 'touchmove', resize); on(document.documentElement, 'mouseup', endResize); on(document.documentElement, 'touchend', endResize); } // common events on(instance.elements.commands.container, 'click', instance.__internal.commandsClickHandler); on(instance.elements.footer, 'click', instance.__internal.buttonsClickHandler); on(instance.elements.reset[0], 'focus', instance.__internal.resetHandler); on(instance.elements.reset[1], 'focus', instance.__internal.resetHandler); //prevent handling key up when dialog is being opened by a key stroke. cancelKeyup = true; // hook in transition handler on(instance.elements.dialog, transition.type, instance.__internal.transitionInHandler); // modelss only events if (!instance.get('modal')) { bindModelessEvents(instance); } // resizable if (instance.get('resizable')) { bindResizableEvents(instance); } // movable if (instance.get('movable')) { bindMovableEvents(instance); } } /** * Unbind dialogs events * * @param {Object} instance The dilog instance. * * @return {undefined} */ function unbindEvents(instance) { // if last dialog, remove global handlers if (openDialogs.length === 1) { //global off(window, 'resize', windowResize); off(document.body, 'keyup', keyupHandler); off(document.body, 'keydown', keydownHandler); off(document.body, 'focus', onReset); //move off(document.documentElement, 'mousemove', move); off(document.documentElement, 'mouseup', endMove); //resize off(document.documentElement, 'mousemove', resize); off(document.documentElement, 'mouseup', endResize); } // common events off(instance.elements.commands.container, 'click', instance.__internal.commandsClickHandler); off(instance.elements.footer, 'click', instance.__internal.buttonsClickHandler); off(instance.elements.reset[0], 'focus', instance.__internal.resetHandler); off(instance.elements.reset[1], 'focus', instance.__internal.resetHandler); // hook out transition handler on(instance.elements.dialog, transition.type, instance.__internal.transitionOutHandler); // modelss only events if (!instance.get('modal')) { unbindModelessEvents(instance); } // movable if (instance.get('movable')) { unbindMovableEvents(instance); } // resizable if (instance.get('resizable')) { unbindResizableEvents(instance); } } /** * Bind modeless specific events * * @param {Object} instance The dilog instance. * * @return {undefined} */ function bindModelessEvents(instance) { on(instance.elements.dialog, 'focus', instance.__internal.bringToFrontHandler, true); } /** * Unbind modeless specific events * * @param {Object} instance The dilog instance. * * @return {undefined} */ function unbindModelessEvents(instance) { off(instance.elements.dialog, 'focus', instance.__internal.bringToFrontHandler, true); } /** * Bind movable specific events * * @param {Object} instance The dilog instance. * * @return {undefined} */ function bindMovableEvents(instance) { on(instance.elements.header, 'mousedown', instance.__internal.beginMoveHandler); on(instance.elements.header, 'touchstart', instance.__internal.beginMoveHandler); } /** * Unbind movable specific events * * @param {Object} instance The dilog instance. * * @return {undefined} */ function unbindMovableEvents(instance) { off(instance.elements.header, 'mousedown', instance.__internal.beginMoveHandler); off(instance.elements.header, 'touchstart', instance.__internal.beginMoveHandler); } /** * Bind resizable specific events * * @param {Object} instance The dilog instance. * * @return {undefined} */ function bindResizableEvents(instance) { on(instance.elements.resizeHandle, 'mousedown', instance.__internal.beginResizeHandler); on(instance.elements.resizeHandle, 'touchstart', instance.__internal.beginResizeHandler); } /** * Unbind resizable specific events * * @param {Object} instance The dilog instance. * * @return {undefined} */ function unbindResizableEvents(instance) { off(instance.elements.resizeHandle, 'mousedown', instance.__internal.beginResizeHandler); off(instance.elements.resizeHandle, 'touchstart', instance.__internal.beginResizeHandler); } /** * Bind closable events * * @param {Object} instance The dilog instance. * * @return {undefined} */ function bindClosableEvents(instance) { on(instance.elements.modal, 'click', instance.__internal.modalClickHandler); } /** * Unbind closable specific events * * @param {Object} instance The dilog instance. * * @return {undefined} */ function unbindClosableEvents(instance) { off(instance.elements.modal, 'click', instance.__internal.modalClickHandler); } // dialog API return { __init:initialize, /** * Check if dialog is currently open * * @return {Boolean} */ isOpen: function () { return this.__internal.isOpen; }, isModal: function (){ return this.elements.root.className.indexOf(classes.modeless) < 0; }, isMaximized:function(){ return this.elements.root.className.indexOf(classes.maximized) > -1; }, isPinned:function(){ return this.elements.root.className.indexOf(classes.unpinned) < 0; }, maximize:function(){ if(!this.isMaximized()){ maximize(this); } return this; }, restore:function(){ if(this.isMaximized()){ restore(this); } return this; }, pin:function(){ if(!this.isPinned()){ pin(this); } return this; }, unpin:function(){ if(this.isPinned()){ unpin(this); } return this; }, bringToFront:function(){ bringToFront(null, this); return this; }, /** * Move the dialog to a specific x/y coordinates * * @param {Number} x The new dialog x coordinate in pixels. * @param {Number} y The new dialog y coordinate in pixels. * * @return {Object} The dialog instance. */ moveTo:function(x,y){ if(!isNaN(x) && !isNaN(y)){ // allow custom `onmove` method dispatchEvent('onmove', this); var element = this.elements.dialog, current = element, offsetLeft = 0, offsetTop = 0; //subtract existing left,top if (element.style.left) { offsetLeft -= parseInt(element.style.left, 10); } if (element.style.top) { offsetTop -= parseInt(element.style.top, 10); } //calc offset do { offsetLeft += current.offsetLeft; offsetTop += current.offsetTop; } while (current = current.offsetParent); //calc left, top var left = (x - offsetLeft); var top = (y - offsetTop); //// rtl handling if (isRightToLeft()) { left *= -1; } element.style.left = left + 'px'; element.style.top = top + 'px'; // allow custom `onmoved` method dispatchEvent('onmoved', this); } return this; }, /** * Resize the dialog to a specific width/height (the dialog must be 'resizable'). * The dialog can be resized to: * A minimum width equal to the initial display width * A minimum height equal to the sum of header/footer heights. * * * @param {Number or String} width The new dialog width in pixels or in percent. * @param {Number or String} height The new dialog height in pixels or in percent. * * @return {Object} The dialog instance. */ resizeTo:function(width,height){ var w = parseFloat(width), h = parseFloat(height), regex = /(\d*\.\d+|\d+)%/ ; if(!isNaN(w) && !isNaN(h) && this.get('resizable') === true){ // allow custom `onresize` method dispatchEvent('onresize', this); if(('' + width).match(regex)){ w = w / 100 * document.documentElement.clientWidth ; } if(('' + height).match(regex)){ h = h / 100 * document.documentElement.clientHeight; } var element = this.elements.dialog; if (element.style.maxWidth !== 'none') { element.style.minWidth = (minWidth = element.offsetWidth) + 'px'; } element.style.maxWidth = 'none'; element.style.minHeight = this.elements.header.offsetHeight + this.elements.footer.offsetHeight + 'px'; element.style.width = w + 'px'; element.style.height = h + 'px'; // allow custom `onresized` method dispatchEvent('onresized', this); } return this; }, /** * Gets or Sets dialog settings/options * * @param {String|Object} key A string specifying a propery name or a collection of key/value pairs. * @param {Object} value Optional, the value associated with the key (in case it was a string). * * @return {undefined} */ setting : function (key, value) { var self = this; var result = update(this, this.__internal.options, function(k,o,n){ optionUpdated(self,k,o,n); }, key, value); if(result.op === 'get'){ if(result.found){ return result.value; }else if(typeof this.settings !== 'undefined'){ return update(this, this.settings, this.settingUpdated || function(){}, key, value).value; }else{ return undefined; } }else if(result.op === 'set'){ if(result.items.length > 0){ var callback = this.settingUpdated || function(){}; for(var x=0;x 0) { var self = this; this.__internal.timer = setTimeout(function () { self.dismiss(); }, this.__internal.delay * 1000); } return this; }, /* * Sets the notification message contents * @param {string or DOMElement} content The notification message content * */ setContent: function (content) { if (typeof content === 'string') { clearContents(this.element); this.element.innerHTML = content; } else if (content instanceof window.HTMLElement && this.element.firstChild !== content) { clearContents(this.element); this.element.appendChild(content); } if(this.__internal.closeButton){ var close = document.createElement('span'); addClass(close, classes.close); close.setAttribute('data-close', true); this.element.appendChild(close); } return this; }, /* * Dismisses all open notifications except this. * */ dismissOthers: function () { notifier.dismissAll(this); return this; } }); } //notifier api return { /** * Gets or Sets notifier settings. * * @param {string} key The setting name * @param {Variant} value The setting value. * * @return {Object} if the called as a setter, return the notifier instance. */ setting: function (key, value) { //ensure init initialize(this); if (typeof value === 'undefined') { //get return this.__internal[key]; } else { //set switch (key) { case 'position': this.__internal.position = value; updatePosition(this); break; case 'delay': this.__internal.delay = value; break; } } return this; }, /** * [Alias] Sets dialog settings/options */ set:function(key,value){ this.setting(key,value); return this; }, /** * [Alias] Gets dialog settings/options */ get:function(key){ return this.setting(key); }, /** * Creates a new notification message * * @param {string} type The type of notification message (simply a CSS class name 'ajs-{type}' to be added). * @param {Function} callback A callback function to be invoked when the message is dismissed. * * @return {undefined} */ create: function (type, callback) { //ensure notifier init initialize(this); //create new notification message var div = document.createElement('div'); div.className = classes.message + ((typeof type === 'string' && type !== '') ? ' ajs-' + type : ''); return create(div, callback); }, /** * Dismisses all open notifications. * * @param {Object} excpet [optional] The notification object to exclude from dismissal. * */ dismissAll: function (except) { var clone = openInstances.slice(0); for (var x = 0; x < clone.length; x += 1) { var instance = clone[x]; if (except === undefined || except !== instance) { instance.dismiss(); } } } }; })(); /** * Alertify public API * This contains everything that is exposed through the alertify object. * * @return {Object} */ function Alertify() { // holds a references of created dialogs var dialogs = {}; /** * Extends a given prototype by merging properties from base into sub. * * @sub {Object} sub The prototype being overwritten. * @base {Object} base The prototype being written. * * @return {Object} The extended prototype. */ function extend(sub, base) { // copy dialog pototype over definition. for (var prop in base) { if (base.hasOwnProperty(prop)) { sub[prop] = base[prop]; } } return sub; } /** * Helper: returns a dialog instance from saved dialogs. * and initializes the dialog if its not already initialized. * * @name {String} name The dialog name. * * @return {Object} The dialog instance. */ function get_dialog(name) { var dialog = dialogs[name].dialog; //initialize the dialog if its not already initialized. if (dialog && typeof dialog.__init === 'function') { dialog.__init(dialog); } return dialog; } /** * Helper: registers a new dialog definition. * * @name {String} name The dialog name. * @Factory {Function} Factory a function resposible for creating dialog prototype. * @transient {Boolean} transient True to create a new dialog instance each time the dialog is invoked, false otherwise. * @base {String} base the name of another dialog to inherit from. * * @return {Object} The dialog definition. */ function register(name, Factory, transient, base) { var definition = { dialog: null, factory: Factory }; //if this is based on an existing dialog, create a new definition //by applying the new protoype over the existing one. if (base !== undefined) { definition.factory = function () { return extend(new dialogs[base].factory(), new Factory()); }; } if (!transient) { //create a new definition based on dialog definition.dialog = extend(new definition.factory(), dialog); } return dialogs[name] = definition; } return { /** * Alertify defaults * * @type {Object} */ defaults: defaults, /** * Dialogs factory * * @param {string} Dialog name. * @param {Function} A Dialog factory function. * @param {Boolean} Indicates whether to create a singleton or transient dialog. * @param {String} The name of the base type to inherit from. */ dialog: function (name, Factory, transient, base) { // get request, create a new instance and return it. if (typeof Factory !== 'function') { return get_dialog(name); } if (this.hasOwnProperty(name)) { throw new Error('alertify.dialog: name already exists'); } // register the dialog var definition = register(name, Factory, transient, base); if (transient) { // make it public this[name] = function () { //if passed with no params, consider it a get request if (arguments.length === 0) { return definition.dialog; } else { var instance = extend(new definition.factory(), dialog); //ensure init if (instance && typeof instance.__init === 'function') { instance.__init(instance); } instance['main'].apply(instance, arguments); return instance['show'].apply(instance); } }; } else { // make it public this[name] = function () { //ensure init if (definition.dialog && typeof definition.dialog.__init === 'function') { definition.dialog.__init(definition.dialog); } //if passed with no params, consider it a get request if (arguments.length === 0) { return definition.dialog; } else { var dialog = definition.dialog; dialog['main'].apply(definition.dialog, arguments); return dialog['show'].apply(definition.dialog); } }; } }, /** * Close all open dialogs. * * @param {Object} excpet [optional] The dialog object to exclude from closing. * * @return {undefined} */ closeAll: function (except) { var clone = openDialogs.slice(0); for (var x = 0; x < clone.length; x += 1) { var instance = clone[x]; if (except === undefined || except !== instance) { instance.close(); } } }, /** * Gets or Sets dialog settings/options. if the dialog is transient, this call does nothing. * * @param {string} name The dialog name. * @param {String|Object} key A string specifying a propery name or a collection of key/value pairs. * @param {Variant} value Optional, the value associated with the key (in case it was a string). * * @return {undefined} */ setting: function (name, key, value) { if (name === 'notifier') { return notifier.setting(key, value); } var dialog = get_dialog(name); if (dialog) { return dialog.setting(key, value); } }, /** * [Alias] Sets dialog settings/options */ set: function(name,key,value){ return this.setting(name, key,value); }, /** * [Alias] Gets dialog settings/options */ get: function(name, key){ return this.setting(name, key); }, /** * Creates a new notification message. * If a type is passed, a class name "ajs-{type}" will be added. * This allows for custom look and feel for various types of notifications. * * @param {String | DOMElement} [message=undefined] Message text * @param {String} [type=''] Type of log message * @param {String} [wait=''] Time (in seconds) to wait before auto-close * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. * * @return {Object} Notification object. */ notify: function (message, type, wait, callback) { return notifier.create(type, callback).push(message, wait); }, /** * Creates a new notification message. * * @param {String} [message=undefined] Message text * @param {String} [wait=''] Time (in seconds) to wait before auto-close * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. * * @return {Object} Notification object. */ message: function (message, wait, callback) { return notifier.create(null, callback).push(message, wait); }, /** * Creates a new notification message of type 'success'. * * @param {String} [message=undefined] Message text * @param {String} [wait=''] Time (in seconds) to wait before auto-close * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. * * @return {Object} Notification object. */ success: function (message, wait, callback) { return notifier.create('success', callback).push(message, wait); }, /** * Creates a new notification message of type 'error'. * * @param {String} [message=undefined] Message text * @param {String} [wait=''] Time (in seconds) to wait before auto-close * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. * * @return {Object} Notification object. */ error: function (message, wait, callback) { return notifier.create('error', callback).push(message, wait); }, /** * Creates a new notification message of type 'warning'. * * @param {String} [message=undefined] Message text * @param {String} [wait=''] Time (in seconds) to wait before auto-close * @param {Function} [callback=undefined] A callback function to be invoked when the log is closed. * * @return {Object} Notification object. */ warning: function (message, wait, callback) { return notifier.create('warning', callback).push(message, wait); }, /** * Dismisses all open notifications * * @return {undefined} */ dismissAll: function () { notifier.dismissAll(); } }; } var alertify = new Alertify(); /** * Alert dialog definition * * invoked by: * alertify.alert(message); * alertify.alert(title, message); * alertify.alert(message, onok); * alertify.alert(title, message, onok); */ alertify.dialog('alert', function () { return { main: function (_title, _message, _onok) { var title, message, onok; switch (arguments.length) { case 1: message = _title; break; case 2: if (typeof _message === 'function') { message = _title; onok = _message; } else { title = _title; message = _message; } break; case 3: title = _title; message = _message; onok = _onok; break; } this.set('title', title); this.set('message', message); this.set('onok', onok); return this; }, setup: function () { return { buttons: [ { text: alertify.defaults.glossary.ok, key: keys.ESC, invokeOnClose: true, className: alertify.defaults.theme.ok, } ], focus: { element: 0, select: false }, options: { maximizable: false, resizable: false } }; }, build: function () { // nothing }, prepare: function () { //nothing }, setMessage: function (message) { this.setContent(message); }, settings: { message: undefined, onok: undefined, label: undefined, }, settingUpdated: function (key, oldValue, newValue) { switch (key) { case 'message': this.setMessage(newValue); break; case 'label': if (this.__internal.buttons[0].element) { this.__internal.buttons[0].element.innerHTML = newValue; } break; } }, callback: function (closeEvent) { if (typeof this.get('onok') === 'function') { var returnValue = this.get('onok').call(this, closeEvent); if (typeof returnValue !== 'undefined') { closeEvent.cancel = !returnValue; } } } }; }); /** * Confirm dialog object * * alertify.confirm(message); * alertify.confirm(message, onok); * alertify.confirm(message, onok, oncancel); * alertify.confirm(title, message, onok, oncancel); */ alertify.dialog('confirm', function () { var autoConfirm = { timer: null, index: null, text: null, duration: null, task: function (event, self) { if (self.isOpen()) { self.__internal.buttons[autoConfirm.index].element.innerHTML = autoConfirm.text + ' (‏' + autoConfirm.duration + '‏) '; autoConfirm.duration -= 1; if (autoConfirm.duration === -1) { clearAutoConfirm(self); var button = self.__internal.buttons[autoConfirm.index]; var closeEvent = createCloseEvent(autoConfirm.index, button); if (typeof self.callback === 'function') { self.callback.apply(self, [closeEvent]); } //close the dialog. if (closeEvent.close !== false) { self.close(); } } } else { clearAutoConfirm(self); } } }; function clearAutoConfirm(self) { if (autoConfirm.timer !== null) { clearInterval(autoConfirm.timer); autoConfirm.timer = null; self.__internal.buttons[autoConfirm.index].element.innerHTML = autoConfirm.text; } } function startAutoConfirm(self, index, duration) { clearAutoConfirm(self); autoConfirm.duration = duration; autoConfirm.index = index; autoConfirm.text = self.__internal.buttons[index].element.innerHTML; autoConfirm.timer = setInterval(delegate(self, autoConfirm.task), 1000); autoConfirm.task(null, self); } return { main: function (_title, _message, _onok, _oncancel) { var title, message, onok, oncancel; switch (arguments.length) { case 1: message = _title; break; case 2: message = _title; onok = _message; break; case 3: message = _title; onok = _message; oncancel = _onok; break; case 4: title = _title; message = _message; onok = _onok; oncancel = _oncancel; break; } this.set('title', title); this.set('message', message); this.set('onok', onok); this.set('oncancel', oncancel); return this; }, setup: function () { return { buttons: [ { text: alertify.defaults.glossary.ok, key: keys.ENTER, className: alertify.defaults.theme.ok, }, { text: alertify.defaults.glossary.cancel, key: keys.ESC, invokeOnClose: true, className: alertify.defaults.theme.cancel, } ], focus: { element: 0, select: false }, options: { maximizable: false, resizable: false } }; }, build: function () { //nothing }, prepare: function () { //nothing }, setMessage: function (message) { this.setContent(message); }, settings: { message: null, labels: null, onok: null, oncancel: null, defaultFocus: null, reverseButtons: null, }, settingUpdated: function (key, oldValue, newValue) { switch (key) { case 'message': this.setMessage(newValue); break; case 'labels': if ('ok' in newValue && this.__internal.buttons[0].element) { this.__internal.buttons[0].text = newValue.ok; this.__internal.buttons[0].element.innerHTML = newValue.ok; } if ('cancel' in newValue && this.__internal.buttons[1].element) { this.__internal.buttons[1].text = newValue.cancel; this.__internal.buttons[1].element.innerHTML = newValue.cancel; } break; case 'reverseButtons': if (newValue === true) { this.elements.buttons.primary.appendChild(this.__internal.buttons[0].element); } else { this.elements.buttons.primary.appendChild(this.__internal.buttons[1].element); } break; case 'defaultFocus': this.__internal.focus.element = newValue === 'ok' ? 0 : 1; break; } }, callback: function (closeEvent) { clearAutoConfirm(this); var returnValue; switch (closeEvent.index) { case 0: if (typeof this.get('onok') === 'function') { returnValue = this.get('onok').call(this, closeEvent); if (typeof returnValue !== 'undefined') { closeEvent.cancel = !returnValue; } } break; case 1: if (typeof this.get('oncancel') === 'function') { returnValue = this.get('oncancel').call(this, closeEvent); if (typeof returnValue !== 'undefined') { closeEvent.cancel = !returnValue; } } break; } }, autoOk: function (duration) { startAutoConfirm(this, 0, duration); return this; }, autoCancel: function (duration) { startAutoConfirm(this, 1, duration); return this; } }; }); /** * Prompt dialog object * * invoked by: * alertify.prompt(message); * alertify.prompt(message, value); * alertify.prompt(message, value, onok); * alertify.prompt(message, value, onok, oncancel); * alertify.prompt(title, message, value, onok, oncancel); */ alertify.dialog('prompt', function () { var input = document.createElement('INPUT'); var p = document.createElement('P'); return { main: function (_title, _message, _value, _onok, _oncancel) { var title, message, value, onok, oncancel; switch (arguments.length) { case 1: message = _title; break; case 2: message = _title; value = _message; break; case 3: message = _title; value = _message; onok = _value; break; case 4: message = _title; value = _message; onok = _value; oncancel = _onok; break; case 5: title = _title; message = _message; value = _value; onok = _onok; oncancel = _oncancel; break; } this.set('title', title); this.set('message', message); this.set('value', value); this.set('onok', onok); this.set('oncancel', oncancel); return this; }, setup: function () { return { buttons: [ { text: alertify.defaults.glossary.ok, key: keys.ENTER, className: alertify.defaults.theme.ok, }, { text: alertify.defaults.glossary.cancel, key: keys.ESC, invokeOnClose: true, className: alertify.defaults.theme.cancel, } ], focus: { element: input, select: true }, options: { maximizable: false, resizable: false } }; }, build: function () { input.className = alertify.defaults.theme.input; input.setAttribute('type', 'text'); input.value = this.get('value'); this.elements.content.appendChild(p); this.elements.content.appendChild(input); }, prepare: function () { //nothing }, setMessage: function (message) { if (typeof message === 'string') { clearContents(p); p.innerHTML = message; } else if (message instanceof window.HTMLElement && p.firstChild !== message) { clearContents(p); p.appendChild(message); } }, settings: { message: undefined, labels: undefined, onok: undefined, oncancel: undefined, value: '', type:'text', reverseButtons: undefined, }, settingUpdated: function (key, oldValue, newValue) { switch (key) { case 'message': this.setMessage(newValue); break; case 'value': input.value = newValue; break; case 'type': switch (newValue) { case 'text': case 'color': case 'date': case 'datetime-local': case 'email': case 'month': case 'number': case 'password': case 'search': case 'tel': case 'time': case 'week': input.type = newValue; break; default: input.type = 'text'; break; } break; case 'labels': if (newValue.ok && this.__internal.buttons[0].element) { this.__internal.buttons[0].element.innerHTML = newValue.ok; } if (newValue.cancel && this.__internal.buttons[1].element) { this.__internal.buttons[1].element.innerHTML = newValue.cancel; } break; case 'reverseButtons': if (newValue === true) { this.elements.buttons.primary.appendChild(this.__internal.buttons[0].element); } else { this.elements.buttons.primary.appendChild(this.__internal.buttons[1].element); } break; } }, callback: function (closeEvent) { var returnValue; switch (closeEvent.index) { case 0: this.settings.value = input.value; if (typeof this.get('onok') === 'function') { returnValue = this.get('onok').call(this, closeEvent, this.settings.value); if (typeof returnValue !== 'undefined') { closeEvent.cancel = !returnValue; } } break; case 1: if (typeof this.get('oncancel') === 'function') { returnValue = this.get('oncancel').call(this, closeEvent); if (typeof returnValue !== 'undefined') { closeEvent.cancel = !returnValue; } } if(!closeEvent.cancel){ input.value = this.settings.value; } break; } } }; }); // CommonJS if ( typeof module === 'object' && typeof module.exports === 'object' ) { module.exports = alertify; // AMD } else if ( typeof define === 'function' && define.amd) { define( [], function () { return alertify; } ); // window } else if ( !window.alertify ) { window.alertify = alertify; } } ( typeof window !== 'undefined' ? window : this ) ); PKL\Mȋȋ3youtube-embed-plus/scripts/alertify/alertify.min.jsnu[/*! alertifyjs - v1.11.0 - Mohammad Younes (http://alertifyjs.com) */ !function(a){"use strict";function b(a,b){a.className+=" "+b}function c(a,b){for(var c=a.className.split(" "),d=b.split(" "),e=0;e-1&&c.splice(f,1)}a.className=c.join(" ")}function d(){return"rtl"===a.getComputedStyle(document.body).direction}function e(){return document.documentElement&&document.documentElement.scrollTop||document.body.scrollTop}function f(){return document.documentElement&&document.documentElement.scrollLeft||document.body.scrollLeft}function g(a){for(;a.lastChild;)a.removeChild(a.lastChild)}function h(a){if(null===a)return a;var b;if(Array.isArray(a)){b=[];for(var c=0;c0){for(var c=[],d=0;d=0?(c(document.body,Ca.noOverflow),w(!1)):a>0&&document.body.className.indexOf(Ca.noOverflow)<0&&(w(!0),b(document.body,Ca.noOverflow))}function w(d){v.defaults.preventBodyShift&&document.documentElement.scrollHeight>document.documentElement.clientHeight&&(d?(Ea=xa,Da=a.getComputedStyle(document.body).top,b(document.body,Ca.fixed),document.body.style.top=-xa+"px"):(xa=Ea,document.body.style.top=Da,c(document.body,Ca.fixed),t()))}function x(a,d,e){"string"==typeof e&&c(a.elements.root,Ca.prefix+e),b(a.elements.root,Ca.prefix+d),za=a.elements.root.offsetWidth}function y(a){a.get("modal")?(c(a.elements.root,Ca.modeless),a.isOpen()&&(pa(a),N(a),u())):(b(a.elements.root,Ca.modeless),a.isOpen()&&(oa(a),N(a),u()))}function z(a){a.get("basic")?b(a.elements.root,Ca.basic):c(a.elements.root,Ca.basic)}function A(a){a.get("frameless")?b(a.elements.root,Ca.frameless):c(a.elements.root,Ca.frameless)}function B(a,b){for(var c=p.indexOf(b),d=c+1;d-1?(S(b,function(a){return a.key===c}),!1):void 0}function V(a){var b=p[p.length-1],c=a.keyCode;if(c===n.LEFT||c===n.RIGHT){for(var d=b.__internal.buttons,e=0;en.F1-1&&ya.indexOf(c)>-1)return a.preventDefault(),a.stopPropagation(),S(b,function(a){return a.key===c}),!1}function W(a,b){if(b)b.focus();else{var c=a.__internal.focus,d=c.element;switch(typeof c.element){case"number":a.__internal.buttons.length>c.element&&(d=!0===a.get("basic")?a.elements.reset[0]:a.__internal.buttons[c.element].element);break;case"string":d=a.elements.body.querySelector(c.element);break;case"function":d=c.element.call(a)}void 0!==d&&null!==d||0!==a.__internal.buttons.length||(d=a.elements.reset[0]),d&&d.focus&&(d.focus(),c.select&&d.select&&d.select())}}function X(a,b){if(!b)for(var c=p.length-1;c>-1;c-=1)if(p[c].isModal()){b=p[c];break}if(b&&b.isModal()){var d,e=a.srcElement||a.target,f=e===b.elements.reset[1]||0===b.__internal.buttons.length&&e===document.body;f&&(b.get("maximizable")?d=b.elements.commands.maximize:b.get("closable")&&(d=b.elements.commands.close)),void 0===d&&("number"==typeof b.__internal.focus.element?e===b.elements.reset[0]?d=b.elements.buttons.auxiliary.firstChild||b.elements.buttons.primary.firstChild:f&&(d=b.elements.reset[0]):e===b.elements.reset[0]&&(d=b.elements.buttons.primary.lastChild||b.elements.buttons.auxiliary.lastChild)),W(b,d)}}function Y(a,b){clearTimeout(b.__internal.timerIn),W(b),t(),Ga=!1,l("onfocus",b),r(b.elements.dialog,s.type,b.__internal.transitionInHandler),c(b.elements.root,Ca.animationIn)}function Z(a,b){clearTimeout(b.__internal.timerOut),r(b.elements.dialog,s.type,b.__internal.transitionOutHandler),da(b),ja(b),b.isMaximized()&&!b.get("startMaximized")&&J(b),v.defaults.maintainFocus&&b.__internal.activeElement&&(b.__internal.activeElement.focus(),b.__internal.activeElement=null),"function"==typeof b.__internal.destroy&&b.__internal.destroy.apply(b)}function $(a,b){var c=a[Ka]-Ia,d=a[La]-Ja;Na&&(d-=document.body.scrollTop),b.style.left=c+"px",b.style.top=d+"px"}function _(a,b){var c=a[Ka]-Ia,d=a[La]-Ja;Na&&(d-=document.body.scrollTop),b.style.left=Math.min(Ma.maxLeft,Math.max(Ma.minLeft,c))+"px",b.style.top=Na?Math.min(Ma.maxTop,Math.max(Ma.minTop,d))+"px":Math.max(Ma.minTop,d)+"px"}function aa(a,c){if(null===Pa&&!c.isMaximized()&&c.get("movable")){var d,e=0,f=0;if("touchstart"===a.type?(a.preventDefault(),d=a.targetTouches[0],Ka="clientX",La="clientY"):0===a.button&&(d=a),d){var g=c.elements.dialog;if(b(g,Ca.capture),g.style.left&&(e=parseInt(g.style.left,10)),g.style.top&&(f=parseInt(g.style.top,10)),Ia=d[Ka]-e,Ja=d[La]-f,c.isModal()?Ja+=c.elements.modal.scrollTop:c.isPinned()&&(Ja-=document.body.scrollTop),c.get("moveBounded")){var h=g,i=-e,j=-f;do{i+=h.offsetLeft,j+=h.offsetTop}while(h=h.offsetParent);Ma={maxLeft:i,minLeft:-i,maxTop:document.documentElement.clientHeight-g.clientHeight-j,minTop:-j},Oa=_}else Ma=null,Oa=$;return l("onmove",c),Na=!c.isModal()&&c.isPinned(),Ha=c,Oa(d,g),b(document.body,Ca.noSelection),!1}}}function ba(a){if(Ha){var b;"touchmove"===a.type?(a.preventDefault(),b=a.targetTouches[0]):0===a.button&&(b=a),b&&Oa(b,Ha.elements.dialog)}}function ca(){if(Ha){var a=Ha;Ha=Ma=null,c(document.body,Ca.noSelection),c(a.elements.dialog,Ca.capture),l("onmoved",a)}}function da(a){Ha=null;var b=a.elements.dialog;b.style.left=b.style.top=""}function ea(a){a.get("movable")?(b(a.elements.root,Ca.movable),a.isOpen()&&qa(a)):(da(a),c(a.elements.root,Ca.movable),a.isOpen()&&ra(a))}function fa(a,b,c){var e=b,f=0,g=0;do{f+=e.offsetLeft,g+=e.offsetTop}while(e=e.offsetParent);var h,i;!0===c?(h=a.pageX,i=a.pageY):(h=a.clientX,i=a.clientY);var j=d();if(j&&(h=document.body.offsetWidth-h,isNaN(Qa)||(f=document.body.offsetWidth-f-b.offsetWidth)),b.style.height=i-g+Ta+"px",b.style.width=h-f+Ta+"px",!isNaN(Qa)){var k=.5*Math.abs(b.offsetWidth-Ra);j&&(k*=-1),b.offsetWidth>Ra?b.style.left=Qa+k+"px":b.offsetWidth>=Sa&&(b.style.left=Qa-k+"px")}}function ga(a,c){if(!c.isMaximized()){var d;if("touchstart"===a.type?(a.preventDefault(),d=a.targetTouches[0]):0===a.button&&(d=a),d){l("onresize",c),Pa=c,Ta=c.elements.resizeHandle.offsetHeight/2;var e=c.elements.dialog;return b(e,Ca.capture),Qa=parseInt(e.style.left,10),e.style.height=e.offsetHeight+"px",e.style.minHeight=c.elements.header.offsetHeight+c.elements.footer.offsetHeight+"px",e.style.width=(Ra=e.offsetWidth)+"px","none"!==e.style.maxWidth&&(e.style.minWidth=(Sa=e.offsetWidth)+"px"),e.style.maxWidth="none",b(document.body,Ca.noSelection),!1}}}function ha(a){if(Pa){var b;"touchmove"===a.type?(a.preventDefault(),b=a.targetTouches[0]):0===a.button&&(b=a),b&&fa(b,Pa.elements.dialog,!Pa.get("modal")&&!Pa.get("pinned"))}}function ia(){if(Pa){var a=Pa;Pa=null,c(document.body,Ca.noSelection),c(a.elements.dialog,Ca.capture),Fa=!0,l("onresized",a)}}function ja(a){Pa=null;var b=a.elements.dialog;"none"===b.style.maxWidth&&(b.style.maxWidth=b.style.minWidth=b.style.width=b.style.height=b.style.minHeight=b.style.left="",Qa=Number.Nan,Ra=Sa=Ta=0)}function ka(a){a.get("resizable")?(b(a.elements.root,Ca.resizable),a.isOpen()&&sa(a)):(ja(a),c(a.elements.root,Ca.resizable),a.isOpen()&&ta(a))}function la(){for(var a=0;a-1&&a.navigator.userAgent.indexOf("Chrome")<0,Ba={dimmer:'
',modal:'
',dialog:'
',reset:'',commands:'
',header:'
',body:'
',content:'
',footer:'',buttons:{primary:'
',auxiliary:'
'},button:'',resizeHandle:'
'},Ca={animationIn:"ajs-in",animationOut:"ajs-out",base:"alertify",basic:"ajs-basic",capture:"ajs-capture",closable:"ajs-closable",fixed:"ajs-fixed",frameless:"ajs-frameless",hidden:"ajs-hidden",maximize:"ajs-maximize",maximized:"ajs-maximized",maximizable:"ajs-maximizable",modeless:"ajs-modeless",movable:"ajs-movable",noSelection:"ajs-no-selection",noOverflow:"ajs-no-overflow",noPadding:"ajs-no-padding",pin:"ajs-pin",pinnable:"ajs-pinnable",prefix:"ajs-",resizable:"ajs-resizable",restore:"ajs-restore",shake:"ajs-shake",unpinned:"ajs-unpinned"},Da="",Ea=0,Fa=!1,Ga=!1,Ha=null,Ia=0,Ja=0,Ka="pageX",La="pageY",Ma=null,Na=!1,Oa=null,Pa=null,Qa=Number.Nan,Ra=0,Sa=0,Ta=0;return{__init:m,isOpen:function(){return this.__internal.isOpen},isModal:function(){return this.elements.root.className.indexOf(Ca.modeless)<0},isMaximized:function(){return this.elements.root.className.indexOf(Ca.maximized)>-1},isPinned:function(){return this.elements.root.className.indexOf(Ca.unpinned)<0},maximize:function(){return this.isMaximized()||I(this),this},restore:function(){return this.isMaximized()&&J(this),this},pin:function(){return this.isPinned()||G(this),this},unpin:function(){return this.isPinned()&&H(this),this},bringToFront:function(){return B(null,this),this},moveTo:function(a,b){if(!isNaN(a)&&!isNaN(b)){l("onmove",this);var c=this.elements.dialog,e=c,f=0,g=0;c.style.left&&(f-=parseInt(c.style.left,10)),c.style.top&&(g-=parseInt(c.style.top,10));do{f+=e.offsetLeft,g+=e.offsetTop}while(e=e.offsetParent);var h=a-f,i=b-g;d()&&(h*=-1),c.style.left=h+"px",c.style.top=i+"px",l("onmoved",this)}return this},resizeTo:function(a,b){var c=parseFloat(a),d=parseFloat(b),e=/(\d*\.\d+|\d+)%/;if(!isNaN(c)&&!isNaN(d)&&!0===this.get("resizable")){l("onresize",this),(""+a).match(e)&&(c=c/100*document.documentElement.clientWidth),(""+b).match(e)&&(d=d/100*document.documentElement.clientHeight);var f=this.elements.dialog;"none"!==f.style.maxWidth&&(f.style.minWidth=(Sa=f.offsetWidth)+"px"),f.style.maxWidth="none",f.style.minHeight=this.elements.header.offsetHeight+this.elements.footer.offsetHeight+"px",f.style.width=c+"px",f.style.height=d+"px",l("onresized",this)}return this},setting:function(a,b){var c=this,d=D(this,this.__internal.options,function(a,b,d){C(c,a,b,d)},a,b);if("get"===d.op)return d.found?d.value:void 0!==this.settings?D(this,this.settings,this.settingUpdated||function(){},a,b).value:void 0;if("set"===d.op){if(d.items.length>0)for(var e=this.settingUpdated||function(){},f=0;f0){var b=this;this.__internal.timer=setTimeout(function(){b.dismiss()},1e3*this.__internal.delay)}return this},setContent:function(c){if("string"==typeof c?(g(this.element),this.element.innerHTML=c):c instanceof a.HTMLElement&&this.element.firstChild!==c&&(g(this.element),this.element.appendChild(c)),this.__internal.closeButton){var d=document.createElement("span");b(d,n.close),d.setAttribute("data-close",!0),this.element.appendChild(d)}return this},dismissOthers:function(){return u.dismissAll(this),this}})}var k,l,m=[],n={base:"alertify-notifier",message:"ajs-message",top:"ajs-top",right:"ajs-right",bottom:"ajs-bottom",left:"ajs-left",center:"ajs-center",visible:"ajs-visible",hidden:"ajs-hidden",close:"ajs-close"};return{setting:function(a,b){if(d(this),void 0===b)return this.__internal[a];switch(a){case"position":this.__internal.position=b,h(this);break;case"delay":this.__internal.delay=b}return this},set:function(a,b){return this.setting(a,b),this},get:function(a){return this.setting(a)},create:function(a,b){d(this);var c=document.createElement("div");return c.className=n.message+("string"==typeof a&&""!==a?" ajs-"+a:""),i(c,b)},dismissAll:function(a){for(var b=m.slice(0),c=0;c' + iabTextParent + ' : ' + iabText + ' ×'); $('.iab-cat-tags-display').append(tagText); $('.iab-cat-tags-display .iab-cat-tag-button').sort(function (a, b) { return $(a).text() > $(b).text() ? 1 : -1; }).appendTo('.iab-cat-tags-display'); }; $.fn.ytprefsFormJSON = function () { var o = {}; var a = this.serializeArray(); $.each(a, function () { if (o[this.name]) { if (!o[this.name].push) { o[this.name] = [o[this.name]]; } o[this.name].push(this.value || ''); } else { o[this.name] = this.value || ''; } }); return o; }; $(document).ready(function () { if (window.location.toString().indexOf('https://') === 0) { window._EPYTA_.wpajaxurl = window._EPYTA_.wpajaxurl.replace("http://", "https://"); } // Create IE + others compatible event handler var epeventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; var epeventer = window[epeventMethod]; var epmessageEvent = epeventMethod == "attachEvent" ? "onmessage" : "message"; // Listen to message from child window epeventer(epmessageEvent, function (e) { var embedcode = ""; try { if (e.data.indexOf("youtubeembedplus") === 0 && e.data.indexOf('clientId=') < 0) { embedcode = e.data.split("|")[1]; if (embedcode.indexOf("[") !== 0) { embedcode = "

" + embedcode + "

"; } if (window.tinyMCE !== null && window.tinyMCE.activeEditor !== null && !window.tinyMCE.activeEditor.isHidden()) { if (window._EPYTA_.mceBookmark) { try { window.tinyMCE.activeEditor.selection.moveToBookmark(window._EPYTA_.mceBookmark); } catch (err) { } } if (typeof window.tinyMCE.execInstanceCommand !== 'undefined') { window.tinyMCE.execInstanceCommand( window.tinyMCE.activeEditor.id, 'mceInsertContent', false, embedcode); } else { send_to_editor(embedcode); } setTimeout(function () { window._EPYTA_.mceBookmark = null; }, 500); } else { embedcode = embedcode.replace('

', '\n').replace('

', '\n'); if (typeof QTags.insertContent === 'function') { QTags.insertContent(embedcode); } else { send_to_editor(embedcode); } } tb_remove(); } } catch (err) { } }, false); $('body').on('click.tbyt', "#ytprefs_wiz_button, .ytprefs_wiz_button_widget_text, .ytprefs-onboarding-launch", function () { window._EPYTA_.widen_ytprefs_wiz(); }); $('body').on('click.tbyt', "#ytprefs_wiz_button_vi, .ytprefs_wiz_button_vi_widget_text", function () { send_to_editor('

[embed-vi-ad]

'); }); $(window).on('resize', window._EPYTA_.widen_ytprefs_wiz); $(document).on('wp-before-tinymce-init.ytprefs-media_button', function (event, init) { var $media_buttons = $(init.selector).closest('.wp-editor-wrap').find('.wp-media-buttons'); if (!$media_buttons.find('.ytprefs_media_link').length) { $media_buttons.append(' YouTube'); if (window._EPYTA_.manage_options && window._EPYTA_.vi_logged_in) { $media_buttons.append(' Video Ad'); } } }); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if ($('.wrap-vi-settings').length) { window._EPYTA_.adstxtLookup(); } $('.wrap section a[href^="#jump"]').on('click', function (e) { e.preventDefault(); var tab = $(this).attr('href'); $('.nav-tab-wrapper a[href="' + tab + '"], .nav-tab-wrapper a[rel="' + tab + '"]').trigger('click'); }); $('.ytprefs-ajax-form').on('keypress', function (ev) { if (ev.which == 13) { ev.preventDefault(); $(this).find('.ytprefs-ajax-form--submit:not([disabled])').trigger('click'); } }); $('.vi-cover-prompt-no').on('click', function () { $.ajax({ type: "post", dataType: "json", timeout: 120000, url: window._EPYTA_.wpajaxurl, data: { security: window._EPYTA_.security, action: 'my_embedplus_vi_hide_feature_ajax' }, success: function (response) { if (!response || response.type === 'error') { alertify.alert(response.message); } else { if (window != window.top) { window.location.reload(); } else { window.top.location.href = response.url; } } }, error: function (xhr, ajaxOptions, thrownError) { alertify.alert('Sorry, there was a network error. Please try again, or turn off this feature using the "Hide Monetize Feature" checkbox on the "Defaults" tab of the YouTube settings. If the issue persists, please contact ext@embedplus.com'); }, complete: function () { } }); }); $('.vi-cover-prompt-yes').on('click', function () { $('.vi-cover-prompt, .vi-cover-clear').fadeOut(500); var date = new Date(); date.setTime(date.getTime() + (365 * 24 * 60 * 60 * 1000)); document.cookie = "vi_cover_prompt_yes=1;expires=" + date.toUTCString() + ";path=" + window._EPYTA_.admin_url; }); $('.vi-cover-prompt-maybe').on('click', function () { var date = new Date(); date.setTime(date.getTime() + (365 * 24 * 60 * 60 * 1000)); document.cookie = "vi_cover_prompt_yes=1;expires=" + date.toUTCString() + ";path=" + window._EPYTA_.admin_url; if (window != window.top) { window.location.reload(); } else { window.top.location.href = window._EPYTA_.admin_url_ytprefs; } }); if ($('.vi-demo-screen').length > 1) { var demoInterval = setInterval(function () { $('.vi-demo-screen-2').toggleClass('demo-hide'); $('.vi-demo-mobile-caption').toggleClass('demo-hide'); }, 20000); } $('.ytvi-step-1--submit-register').on('click', function (ev) { var regEmail = $.trim($('.ytvi-register-email').val()); if (!regEmail.length) { alertify.alert('Please enter your email address.'); } else { $('.ytvi-step-1--submit-register').prop('disabled', true); $('.ytvi-step-1').hide('fade', {}, 500, function () { $('.ytvi-step-2-loading').show('fade', {}, 500, function () { $.ajax({ type: "post", dataType: "json", timeout: 120000, url: window._EPYTA_.wpajaxurl, data: { security: window._EPYTA_.security, action: 'my_embedplus_vi_cache_endpoints_ajax', email: regEmail, domain: window.location.href }, success: function (response) { if (response.type == 'success') { $('.ytvi-step-2 .ytvi-registration iframe').attr('src', response.signupURLParams); setTimeout(function () { $('.ytvi-step-2-loading').hide('fade', {}, 500, function () { $('.ytvi-step-2').show('fade', {}, 500); }); }, 3000); var date_attempt = new Date(), date_expire = new Date(); date_expire.setTime(date_expire.getTime() + (365 * 24 * 60 * 60 * 1000)); document.cookie = "vi_signup_attempt=" + date_attempt.toUTCString() + ";expires=" + date_expire.toUTCString() + ";path=" + window._EPYTA_.admin_url; } else if (response.type === 'error') { alertify.alert(response.message); window._EPYTA_.ytvi_cancel(); } }, error: function (xhr, ajaxOptions, thrownError) { alertify.alert('Sorry, there was a network error. Please try again. If the issue persists, please contact ext@embedplus.com'); window._EPYTA_.ytvi_cancel(); }, complete: function () { $('.ytvi-step-1--submit-register').prop('disabled', false); } }); }); }); } }); $('.ytvi-registration--cancel').on('click', function () { window._EPYTA_.ytvi_cancel(); }); $('.ytvi-step-1--confirm').on('change', function () { if ($(this).is(':checked')) { $('.ytvi-step-1--submit-register').prop('disabled', false); } else { $('.ytvi-step-1--submit-register').prop('disabled', true); } }); $('.ytvi-step-1--submit-login').on('click', function (ev) { var loginEmail = $.trim($('.ytvi-login-email').val()); var loginPassword = $.trim($('.ytvi-password').val()); var errorMessage = ""; errorMessage += loginEmail.length ? "" : "Please enter your email address. "; errorMessage += loginPassword.length ? "" : "Please enter your vi dashboard password."; if (errorMessage.length) { alertify.alert(errorMessage); } else { $('.ytvi-step-1--submit-login').prop('disabled', true); $('.ytvi-step-1').hide('fade', {}, 500, function () { $('.ytvi-login-loading').show('fade', {}, 500, function () { $.ajax({ type: "post", dataType: "json", timeout: 12000000, url: window._EPYTA_.wpajaxurl, data: { security: window._EPYTA_.security, action: 'my_embedplus_vi_login_ajax', email: loginEmail, password: loginPassword }, success: function (response) { if (response.type === 'error') { alertify.alert(response.message); window._EPYTA_.ytvi_cancel(); } else { $('.ytvi-login-loading').hide('fade', {}, 500, function () { document.cookie = 'vi_signup_attempt=; expires=Thu, 01 Jan 1970 00:00:01 GMT;'; $('.ytvi-login-success-message').html(response.message); $('.ytvi-login-success').show('fade', {}, 500, function () {}); }); } }, error: function (xhr, ajaxOptions, thrownError) { alertify.alert('Sorry, there was a network error. Please try again. If the issue persists, please contact ext@embedplus.com'); window._EPYTA_.ytvi_cancel(); }, complete: function () { $('.ytvi-step-1--submit-login').prop('disabled', false); } }); }); }); } }); $('a.vi-logged-in-goto').each(function () { if ($(this).attr('href').indexOf(window.location.pathname + window.location.search) > 0 || window.location.search.indexOf('youtube-my-preferences') > 0) { $(this).removeAttr('target'); } }); if ($('.wrap-vi-settings').length) { $('.vi-how-works').on('click', function () { var hash = $(this).data('jump'); // jstab $('.nav-tab-wrapper > a[href="' + hash + '"]').trigger('click'); }); $(document).on('click', '.wrap-vi-settings .nav-tab-wrapper a', function () { $a = $(this); $('.wrap-vi-settings .nav-tab-wrapper a').removeClass('nav-tab-active'); $a.addClass('nav-tab-active'); $('.wrap-vi-settings section').hide(); $('.wrap-vi-settings section').filter($a.attr('href')).fadeIn(200); return false; }); var iabValRaw = $('.iab-cat-tags').val(); if (iabValRaw.length > 0) { var iabCurrent = iabValRaw.split(','); iabCurrent.forEach(function (iabVal) { var iabText = $('.iab-cat-child option[value="' + iabVal + '"]').text(); var iabTextParent = $('.iab-cat-parent option[value="' + (iabVal.split('-')[0]) + '"]').text(); window._EPYTA_.iabAdd(iabVal, iabText, iabTextParent); }); } $('.iab-cat-parent').on('change', function () { var iabPrefix = $(this).val(); $('.iab-cat-child').val(iabPrefix); if (iabPrefix == "") { $('.iab-cat-child-box').addClass('hidden'); $('.iab-cat-child-box select').prop('disabled', true); } else { $('.iab-cat-child-box').removeClass('hidden'); $('.iab-cat-child-box select').prop('disabled', false); $('.iab-cat-child option').addClass('hidden'); $('.iab-cat-child option[value^="' + iabPrefix + '-"], .iab-cat-child option[value="' + iabPrefix + '"], .iab-cat-child option[value=""]').removeClass('hidden'); $('.iab-cat-child-box select').val(''); } }); $('.iab-cat-child').on('change', function () { var iabCurrent = $('.iab-cat-tags').val() ? $('.iab-cat-tags').val().split(',') : []; if (iabCurrent.length < 4) { var iabVal = $(this).val(); var iabText = $(this).find('option:selected').text(); var iabTextParent = $('.iab-cat-parent').find('option:selected').text(); if (iabVal && iabCurrent.indexOf(iabVal) == -1) { iabCurrent.push(iabVal); $('.iab-cat-tags').val(iabCurrent.join(',')); window._EPYTA_.iabAdd(iabVal, iabText, iabTextParent); } } else { alertify.alert('You can choose up to 4 categories maximum. In order to add a new one, you must remove one of the existing ones.'); } }); $('.iab-cat-tags-display').on('click', '.iab-cat-tag-button', function () { var $tag = $(this); var iabVal = $tag.data('tag'); var iabCurrent = $('.iab-cat-tags').val() ? $('.iab-cat-tags').val().split(',') : []; iabCurrent = iabCurrent.filter(function (ele) { return ele != iabVal; }); $('.iab-cat-tags').val(iabCurrent.join(',')); $tag.remove(); }); window._EPYTA_.demoBackgroundColor(); window._EPYTA_.demoTextColor(); window._EPYTA_.demoFontFamily(); window._EPYTA_.demoFontSize(); $(window._EPYTA_.escId('vi_js_settings[backgroundColor]')).wpColorPicker({ change: window._EPYTA_.demoBackgroundColor }); $(window._EPYTA_.escId('vi_js_settings[textColor]')).wpColorPicker({ change: window._EPYTA_.demoTextColor }); $(window._EPYTA_.escId('vi_js_settings[font]')).on('change', window._EPYTA_.demoFontFamily); $(window._EPYTA_.escId('vi_js_settings[fontSize]')).on('change', window._EPYTA_.demoFontSize); $.ajax({ type: "post", dataType: "json", timeout: 12000000, url: window._EPYTA_.wpajaxurl, data: { security: window._EPYTA_.security, action: 'my_embedplus_vi_reports_ajax' }, success: function (response) { if (response.type === 'error' || !response.data.mtdReport.length || typeof (response.data.mtdReport[0].date) === 'undefined') { $('.vi-report-error').removeClass('hide'); $('.vi-report').addClass('hide'); } else { var mtdReportXY = response.data.mtdReport.map(function (point, idx) { return { x: moment(point.date, 'YYYY-MM-DD').format(), y: point.revenue }; }); $('.vi-total-earnings-num').text(window._EPYTA_.moneyFormat(response.data.netRevenue)); var thisMonth = moment(mtdReportXY.length ? mtdReportXY[0].x : new Date()).format('MMMM YYYY'); var ctx = document.getElementById("vi-report-canvas").getContext("2d"); var config = { type: 'line', data: { datasets: [{ label: thisMonth + " Earnings (USD)", backgroundColor: '#1193aa', borderColor: '#1193aa', fill: false, data: mtdReportXY }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { deferred: { delay: 1000 }, }, title: { display: false }, legend: { labels: { fontSize: 15, fontColor: '#000000' } }, tooltips: { position: 'nearest', mode: 'index', intersect: false, callbacks: { label: function (tooltipItem, data) { return window._EPYTA_.moneyFormat(tooltipItem.yLabel); }, title: function (tooltipItems, data) { return moment(tooltipItems[0].xLabel).format('LL'); } } }, scales: { xAxes: [{ type: "time", time: { unit: 'day', unitStepSize: 1, displayFormats: { 'day': 'MMM DD' } }, display: true, scaleLabel: { display: true, labelString: 'Date', fontSize: 15, fontColor: '#000000' }, ticks: { major: { fontStyle: "bold", fontColor: "#000000" } } }], yAxes: [{ display: true, scaleLabel: { display: true, labelString: 'Revenue', fontSize: 15, fontColor: '#000000' }, ticks: { // Include a dollar sign in the ticks callback: function (value, index, values) { return window._EPYTA_.moneyFormat(value); } } }] } } }; Chart.defaults.global.defaultFontFamily = "'Segoe UI', Roboto, 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif"; var revenueLine = new Chart(ctx, config); } }, error: function (xhr, ajaxOptions, thrownError) { alertify.alert('Sorry, there was a network error. Please try again. If the issue persists, please contact ext@embedplus.com'); }, complete: function () { } }); $('.ytvi-btn-logout').on('click', function () { var multiCatWarning = ''; var iabValRaw = $('.iab-cat-tags').val(); if (iabValRaw.length > 0 && iabValRaw.split(',').length > 1) { multiCatWarning = ' (Note: If you selected more than one video category, you must stay logged in to this settings page for your categories to automatically add variety to your ads)'; } alertify.confirm().set({ title: "Logout of Monetize settings", message: "Logging out won't delete your settings. However, it will require you or any other admins to re-login to change vi ad settings in the future" + multiCatWarning + ".

To actually disable monetization, make sure the 'vi ads are: On/Off' button is set to 'Off.'", onok: function () { $.ajax({ type: "post", dataType: "json", timeout: 12000000, url: window._EPYTA_.wpajaxurl, data: { security: window._EPYTA_.security, action: 'my_embedplus_vi_logout_ajax' }, success: function (response) { if (response.type === 'error') { alertify.alert(response.message); } else { location.href = response.url; } }, error: function (xhr, ajaxOptions, thrownError) { alertify.alert('Sorry, there was a network error. Please try again. If the issue persists, please contact ext@embedplus.com'); }, complete: function () { } }); } }).show(); }); } $('.ytvi-btn-toggle').on('click', function () { var $btn = $(this); alertify.confirm().set({ title: ($btn.hasClass('ytvi-btn-active') ? "Turn off" : "Turn on") + " your vi ads", message: $btn.hasClass('ytvi-btn-active') ? "Are you sure you would like to deactivate your video ads? Please note that your ads will no longer appear on the front end and your revenue will be paused. If you would like them to reappear later, simply click on this button again." : "Click OK to confirm turning on your vi ads. They will appear on your site according to your Placement settings.", onok: function () { $.ajax({ type: "post", dataType: "json", timeout: 12000000, url: window._EPYTA_.wpajaxurl, data: { security: window._EPYTA_.security, action: 'my_embedplus_vi_toggle_ajax' }, success: function (response) { if (response.type === 'error') { alertify.alert(response.message); } else { $btn.find('strong').text(response.button_text); $btn.toggleClass('ytvi-btn-active ytvi-btn-inactive'); if ($btn.hasClass('ytvi-btn-active')) { $('.ytvi-msg-congrats').show(200); } else { $('.ytvi-msg-congrats').hide(); } } }, error: function (xhr, ajaxOptions, thrownError) { alertify.alert('Sorry, there was a network error. Please try again. If the issue persists, please contact ext@embedplus.com'); }, complete: function () { } }); } }).show(); }); $('.ytvi-intro-video-modal').on('click', function (e) { e.preventDefault(); var w = Math.min(document.body.clientWidth * .8, 800); var h = 9 / 16 * w; alertify.YoutubeDialog('BcrNPnWUkVI').set({frameless: true, resizeable: true}).resizeTo(w, h); }); $('#vi_show_gdpr_authorization').on('change', function () { if ($(this).is(':checked')) { $('.opt_vi_show_privacy_button').show(300); } else { $('.opt_vi_show_privacy_button').hide(300); } }); /////////////////////////////// onboarding if ($('.wrap-ytprefs-onboarding').length) { // global $('.ytprefs-ob-nav-close').on('click', function () { window.parent.tb_remove(); window.top.location.reload(); }); $('.ytprefs-ob-nav-prev').on('click', function () { window._EPYTA_.onboardPrev($(this).closest('.ytprefs-ob-step')); }); //////////////////////////////////////////////////////////////////////////////////////////////////////////////// step 1 $('.ytprefs-ob-filter li').hover(function () { var sel = '.' + $(this).find('input[type="checkbox"]').data('obfilter') + '-icon'; $(sel).addClass('yob-icon-visible'); }, function () { var sel = '.' + $(this).find('input[type="checkbox"]').data('obfilter') + '-icon'; $(sel).removeClass('yob-icon-visible'); }); $('.ytprefs-ob-filter input[type="checkbox"]').on('change', function () { var $chk = $(this); var obfilter = $chk.data('obfilter'); var $allChecked = $('.ytprefs-ob-filter input[type="checkbox"]:checked'); if ($allChecked.length && !($allChecked.length === 1 && $allChecked.is('[data-obfilter="yob-monetize"]'))) { $('.ytprefs-ob-step1 .ytprefs-ob-nav-next').prop('disabled', false); } else { $('.ytprefs-ob-step1 .ytprefs-ob-nav-next').prop('disabled', true); } if (obfilter == 'yob-monetize') { $('.ytprefs-ob-step3 .ytprefs-ob-nav-ultimate, .ytprefs-ob-step3 .ytprefs-ob-nav-penultimate').toggleClass('ytprefs-ob-nav-hide'); } else { if ($chk.is(":checked")) { $('.ytprefs-ob-step2 .' + obfilter).addClass(obfilter + '-visible'); } else { $('.ytprefs-ob-step2 .' + obfilter).removeClass(obfilter + '-visible'); } } }); $('.ytprefs-ob-step1 .ytprefs-ob-nav-next').on('click', function () { window._EPYTA_.onboardNext($(this).closest('.ytprefs-ob-step')); }); //////////////////////////////////////////////////////////////////////////////////////////////////////////////// step 2 $('#form-onboarding').on('submit', function (e) { e.preventDefault(); (window.tinyMCE || window.tinymce).triggerSave(); var $formOnboarding = $(this); $formOnboarding.find('.ytprefs-ob-nav-next').prop('disabled', true); var formData = $formOnboarding.ytprefsFormJSON(); formData.security = window._EPYTA_.security; $.ajax({ type: "post", dataType: "json", timeout: 30000, url: window._EPYTA_ ? window._EPYTA_.wpajaxurl : ajaxurl, data: formData, success: function (response) { if (response.type == "success") { window._EPYTA_.onboardNext($formOnboarding.closest('.ytprefs-ob-step')); } else { } }, error: function (xhr, ajaxOptions, thrownError) { }, complete: function () { $formOnboarding.find('.ytprefs-ob-nav-next').prop('disabled', false); } }); }); //////////////////////////////////////////////////////////////////////////////////////////////////////////////// step 3 $('.ytprefs-ob-step3 .ytprefs-ob-nav-skip').on('click', function () { window._EPYTA_.onboardNext($(this).closest('.ytprefs-ob-step')); }); $('#form-onboarding-apikey').on('submit', function (e) { e.preventDefault(); var $formOnboarding = $(this); $formOnboarding.find('.ytprefs-ob-nav-next').prop('disabled', true); var formData = $formOnboarding.ytprefsFormJSON(); formData.security = window._EPYTA_.security; $.ajax({ type: "post", dataType: "json", timeout: 30000, url: window._EPYTA_ ? window._EPYTA_.wpajaxurl : ajaxurl, data: formData, success: function (response) { if (response.type == "success") { if ($formOnboarding.find('.ytprefs-ob-nav-ultimate').hasClass('ytprefs-ob-nav-hide')) { window._EPYTA_.onboardNext($formOnboarding.closest('.ytprefs-ob-step')); } else { window.parent.tb_remove(); window.top.location.reload(); } } else { } }, error: function (xhr, ajaxOptions, thrownError) { }, complete: function () { $formOnboarding.find('.ytprefs-ob-nav-next').prop('disabled', false); } }); }); } // end onboarding }); // end ready $(window).on('load', function () { if (_EPYTA_.onboarded != '1') { $('.ytprefs-onboarding-launch').trigger('click'); } }); // end onload })(window, jQuery); PKL\ty )youtube-embed-plus/scripts/fitvids.min.jsnu['use strict';var epdofitvids=epdofitvids||function(b){b.fn.fitVidsEP=function(h){_EPYT_.epresponsiveselector.constructor!==Array&&(_EPYT_.epresponsiveselector=JSON.parse(_EPYT_.epresponsiveselector));var d={customSelector:null};if(!document.getElementById("fit-vids-style")){var f=document.createElement("style"),l=document.getElementsByTagName("base")[0]||document.getElementsByTagName("script")[0];f.className="fit-vids-style";f.id="fit-vids-style";f.textContent=".fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}"; l.parentNode.insertBefore(f,l)}h&&b.extend(d,h);return this.each(function(){var e=_EPYT_.epresponsiveselector;d.customSelector&&e.push(d.customSelector);e=b(this).find(e.join(","));e=e.not("object object");e.each(function(){var a=b(this);if(!("embed"===this.tagName.toLowerCase()&&a.parent("object").length||a.parent(".fluid-width-video-wrapper").length||"absolute"===a.css("position"))){a.is("[data-origwidth]:not([width])")&&a.attr("width",a.data("origwidth"));a.is("[data-origheight]:not([height])")&& a.attr("height",a.data("origheight"));var k="object"===this.tagName.toLowerCase()||a.attr("height")&&!isNaN(parseInt(a.attr("height"),10))?parseInt(a.attr("height"),10):a.height(),g=isNaN(parseInt(a.attr("width"),10))?a.width():parseInt(a.attr("width"),10);k/=g;a.attr("id")||a.attr("id","fitvid"+Math.floor(999999*Math.random()));var m=a.attr("width"),n=a.attr("height");if(a.parent().hasClass("epyt-video-wrapper"))try{a.parent().addClass("fluid-width-video-wrapper").attr("style","padding-top: "+100* k+"% !important;"),a.removeAttr("height").removeAttr("width"),setTimeout(function(){if("function"===typeof Event)var c=new Event("resize");else c=document.createEvent("Event"),c.initEvent("resize",!0,!0);window.dispatchEvent(c)},10),setTimeout(function(){parseInt(a.parent().css("padding-top"),10)>a.height()+20&&(a.parent().removeClass("fluid-width-video-wrapper").css("padding-top",""),a.attr("width",m),a.attr("height",n))},100)}catch(c){}else{g=document.createElement("div");g.className="fluid-width-video-wrapper"; try{a.wrap(g).parent(".fluid-width-video-wrapper").attr("style","padding-top: "+100*k+"% !important;"),a.removeAttr("height").removeAttr("width"),setTimeout(function(){if("function"===typeof Event)var c=new Event("resize");else c=document.createEvent("Event"),c.initEvent("resize",!0,!0);window.dispatchEvent(c)},10),setTimeout(function(){parseInt(a.parent().css("padding-top"),10)>a.height()+20&&(a.parent().removeClass("fluid-width-video-wrapper").css("padding-top",""),a.attr("width",m),a.attr("height", n))},100)}catch(c){}}}})})};b(document).ready(function(){b("body").fitVidsEP();b(document).ajaxSuccess(function(h,d,f){d&&d.responseText&&-1!==d.responseText.indexOf("';c=c.replace(/~ytid/g,b);a("#watch"+b).html(c);a("#closeme"+b).css("display","inline");a("#moviecontainer"+b).css("display","block");if(document.getElementById("scrollwatch"+b)){setTimeout(function(){a("html, body").animate({scrollTop:a("#scrollwatch"+b).offset().top-50},250,function(){})},800)}};window._EPYTWIZ_.closeme=window._EPYTWIZ_.closeme||function(b){a("#moviecontainer"+b).css("display","none");a("#watch"+b).html("")};a(document).ready(function(){a(".wiz-accordion").accordion({header:"> h3",collapsible:true,active:false,icons:{header:"ui-icon-circle-arrow-e",activeHeader:"ui-icon-circle-arrow-s"},heightStyle:"content",autoHeight:false}).find("h3.header-go").on("click",function(){window.open(a(this).find("a").attr("href"),"_blank");return false});a(".playlist-tabs").tabs();a(".livestream-tabs").tabs();if(window._EPYTWIZ_.acc_expand){a(".wiz-accordion #"+window._EPYTWIZ_.acc_expand).trigger("click")}a("form.wizform").each(function(){$thisForm=a(this);$thisForm.find(".txturlpastecustom").on("paste change",function(){$thisTxtUrl=a(this);setTimeout(function(){var d=a.trim($thisTxtUrl.val());var c=/<.*/i;if(c.test(d)){var e=new RegExp("(?:https?://)?(?:www\\.)?(?:youtu\\.be/|youtube\\.com(?:/embed/|/shorts/|/v/|/watch\\?v=))([\\w-]{10,12})","ig");var f=e.exec(d);if(f){var g=f[1];$thisTxtUrl.val("https://www.youtube.com/watch?v="+g)}else{$thisTxtUrl.val("https://www.youtube.com/watch?v=")}$thisForm.find(".badpaste").show()}else{$thisForm.find(".badpaste").hide()}},100)})});var b=a("#epyt_wiz_wrap");b.on("click",".copycode",function(){window._EPYTWIZ_.selectText(this)});b.on("click",".inserttopost",function(){var d=window.location.toString().split("/")[0]+"//"+window.location.toString().split("/")[2];var e=a(this).attr("rel");var c=window._EPYTWIZ_.getUrlParameter("clientId");parent.postMessage("youtubeembedplus|"+e+(c?"|clientId="+c:""),d)});b.on("click",".resultdiv .load-movie",function(){window._EPYTWIZ_.loadmovieplain(a(this).closest(".resultdiv").data("vid"));return false});b.on("click",".moviecontainer a.closeme",function(){window._EPYTWIZ_.closeme(a(this).data("vid"))});b.on("paste change input propertychange","#txtUrlChannel",function(){if(a(this).val().indexOf("/c/")>0){a(".error-channel-format").addClass("orange bold");a(this).val("")}else{a(".error-channel-format").removeClass("orange bold")}})})})(jQuery);PKL\WeNN/youtube-embed-plus/scripts/ytprefs-admin.min.jsnu['use strict';(function(b,a){b._EPYTA_.widen_ytprefs_wiz=b._EPYTA_.widen_ytprefs_wiz||function(){setTimeout(function(){var f=Math.min(950,a(b).width()-100),c=-1*f/2;a("#TB_window").addClass("epyt-thickbox").animate({marginLeft:c,width:f},150,"swing",function(){a("#TB_window").get(0).style.setProperty("width",f,"important")});a("#TB_overlay").addClass("epyt-thickbox");a("#TB_window iframe").animate({width:f},150)},750)};b._EPYTA_.ytvi_cancel=b._EPYTA_.ytvi_cancel||function(){a(".ytvi-step").hide("fade", {},500,function(){a(".ytvi-step-1").show("fade",{},500)})};b._EPYTA_.moneyFormat=b._EPYTA_.moneyFormat||function(f){return"$"+parseFloat(f).toFixed(2)};b._EPYTA_.escId=function(f){return"#"+f.replace(/(:|\.|\[|\]|,|=|@)/g,"\\$1")};b._EPYTA_.demoBackgroundColor=function(f,c){setTimeout(function(){a(".vi-story-demo--info").css("background-color",a(b._EPYTA_.escId("vi_js_settings[backgroundColor]")).val())},0)};b._EPYTA_.demoTextColor=function(f,c){setTimeout(function(){a(".vi-story-demo--info *").css("color", a(b._EPYTA_.escId("vi_js_settings[textColor]")).val())},0)};b._EPYTA_.demoFontFamily=function(){a(".vi-story-demo--title").css("font-family",a(b._EPYTA_.escId("vi_js_settings[font]")).val())};b._EPYTA_.demoFontSize=function(){a(".vi-story-demo--title").css("font-size",a(b._EPYTA_.escId("vi_js_settings[fontSize]")).val()+"px")};b._EPYTA_.onboardNext=function(f){a(".ytprefs-ob-step").removeClass("active-step");setTimeout(function(){b.scrollTo(0,0);f.next().addClass("active-step")},600)};b._EPYTA_.onboardPrev= function(f){a(".ytprefs-ob-step").removeClass("active-step");setTimeout(function(){b.scrollTo(0,0);f.prev().addClass("active-step")},600)};b._EPYTA_.selectText=function(f){if(document.selection){var c=document.body.createTextRange();c.moveToElementText(f);c.select()}else if(b.getSelection){var d=b.getSelection();c=document.createRange();c.selectNode(f);d.removeAllRanges();d.addRange(c)}};b._EPYTA_.adstxtLookup=function(){b._EPYTA_.adstxtLoading(!0);a.ajax({url:location.protocol+"//"+location.hostname+ "/ads.txt?c="+Date.now(),dataType:"text",type:"get",data:"",headers:{"Cache-Control":"no-cache"},async:!0}).always(function(f,c,d){if("success"===c)switch(d.status){case 200:case 301:case 302:case 304:case 307:b._EPYTA_.adstxtVerify(f);break;default:b._EPYTA_.adstxtVerify("")}else 404==f.status?a.ajax({url:location.protocol+"//"+location.hostname+"/ads.txt",dataType:"text",type:"get",data:"",headers:{"Cache-Control":"no-cache"},async:!0}).always(function(e,g,h){if("success"===g)switch(h.status){case 200:case 301:case 302:case 304:case 307:b._EPYTA_.adstxtVerify(e); break;default:b._EPYTA_.adstxtVerify("")}else b._EPYTA_.adstxtVerify("")}):b._EPYTA_.adstxtVerify("")})};b._EPYTA_.adstxtVerify=function(f){a.ajax({type:"post",dataType:"json",timeout:12E4,url:b._EPYTA_.wpajaxurl,data:{security:b._EPYTA_.security,action:"my_embedplus_vi_adstxt_status_soft_ajax",current_adstxt:f},success:function(c){2==c.code?a(".nav-tab-adstxt").addClass("nav-tab-valid"):0>=c.code&&a(".nav-tab-adstxt").addClass("nav-tab-invalid");a(".adstxt-verify-message").html(c.message)},error:function(c, d,e){a(".nav-tab-adstxt").addClass("nav-tab-invalid");a(".adstxt-verify-message").html("Could not validate ads.txt: "+e)},complete:function(){b._EPYTA_.adstxtLoading(!1)}})};b._EPYTA_.adstxtLoading=function(f){f?a(".nav-tab-adstxt").addClass("nav-tab-loading"):a(".nav-tab-adstxt").removeClass("nav-tab-loading")};b._EPYTA_.gbPreviewSetup=function(){b._EPADashboard_.loadYTAPI();b._EPADashboard_.apiInit();b._EPADashboard_.log("YT API GB");b._EPADashboard_.pageReady();"undefined"!==typeof a.fn.fitVidsEP&& a("body").fitVidsEP()};b._EPYTA_.iabAdd=function(f,c,d){f=a('
'+d+" : "+c+" ×
");a(".iab-cat-tags-display").append(f);a(".iab-cat-tags-display .iab-cat-tag-button").sort(function(e,g){return a(e).text()>a(g).text()?1:-1}).appendTo(".iab-cat-tags-display")};a.fn.ytprefsFormJSON=function(){var f={},c=this.serializeArray();a.each(c,function(){f[this.name]?(f[this.name].push||(f[this.name]=[f[this.name]]),f[this.name].push(this.value||"")):f[this.name]= this.value||""});return f};a(document).ready(function(){0===b.location.toString().indexOf("https://")&&(b._EPYTA_.wpajaxurl=b._EPYTA_.wpajaxurl.replace("http://","https://"));var f=b.addEventListener?"addEventListener":"attachEvent";(0,b[f])("attachEvent"==f?"onmessage":"message",function(c){var d="";try{if(0===c.data.indexOf("youtubeembedplus")&&0>c.data.indexOf("clientId=")){d=c.data.split("|")[1];0!==d.indexOf("[")&&(d="

"+d+"

");if(null===b.tinyMCE||null===b.tinyMCE.activeEditor||b.tinyMCE.activeEditor.isHidden())d= d.replace("

","\n").replace("

","\n"),"function"===typeof QTags.insertContent?QTags.insertContent(d):send_to_editor(d);else{if(b._EPYTA_.mceBookmark)try{b.tinyMCE.activeEditor.selection.moveToBookmark(b._EPYTA_.mceBookmark)}catch(e){}"undefined"!==typeof b.tinyMCE.execInstanceCommand?b.tinyMCE.execInstanceCommand(b.tinyMCE.activeEditor.id,"mceInsertContent",!1,d):send_to_editor(d);setTimeout(function(){b._EPYTA_.mceBookmark=null},500)}tb_remove()}}catch(e){}},!1);a("body").on("click.tbyt","#ytprefs_wiz_button, .ytprefs_wiz_button_widget_text, .ytprefs-onboarding-launch", function(){b._EPYTA_.widen_ytprefs_wiz()});a("body").on("click.tbyt","#ytprefs_wiz_button_vi, .ytprefs_wiz_button_vi_widget_text",function(){send_to_editor("

[embed-vi-ad]

")});a(b).on("resize",b._EPYTA_.widen_ytprefs_wiz);a(document).on("wp-before-tinymce-init.ytprefs-media_button",function(c,d){c=a(d.selector).closest(".wp-editor-wrap").find(".wp-media-buttons");c.find(".ytprefs_media_link").length||(c.append(' YouTube'), b._EPYTA_.manage_options&&b._EPYTA_.vi_logged_in&&c.append(' Video Ad'))});a(".wrap-vi-settings").length&&b._EPYTA_.adstxtLookup();a('.wrap section a[href^="#jump"]').on("click",function(c){c.preventDefault();c=a(this).attr("href");a('.nav-tab-wrapper a[href="'+c+'"], .nav-tab-wrapper a[rel="'+c+'"]').trigger("click")});a(".ytprefs-ajax-form").on("keypress",function(c){13==c.which&&(c.preventDefault(), a(this).find(".ytprefs-ajax-form--submit:not([disabled])").trigger("click"))});a(".vi-cover-prompt-no").on("click",function(){a.ajax({type:"post",dataType:"json",timeout:12E4,url:b._EPYTA_.wpajaxurl,data:{security:b._EPYTA_.security,action:"my_embedplus_vi_hide_feature_ajax"},success:function(c){c&&"error"!==c.type?b!=b.top?b.location.reload():b.top.location.href=c.url:alertify.alert(c.message)},error:function(c,d,e){alertify.alert('Sorry, there was a network error. Please try again, or turn off this feature using the "Hide Monetize Feature" checkbox on the "Defaults" tab of the YouTube settings. If the issue persists, please contact ext@embedplus.com')}, complete:function(){}})});a(".vi-cover-prompt-yes").on("click",function(){a(".vi-cover-prompt, .vi-cover-clear").fadeOut(500);var c=new Date;c.setTime(c.getTime()+31536E6);document.cookie="vi_cover_prompt_yes=1;expires="+c.toUTCString()+";path="+b._EPYTA_.admin_url});a(".vi-cover-prompt-maybe").on("click",function(){var c=new Date;c.setTime(c.getTime()+31536E6);document.cookie="vi_cover_prompt_yes=1;expires="+c.toUTCString()+";path="+b._EPYTA_.admin_url;b!=b.top?b.location.reload():b.top.location.href= b._EPYTA_.admin_url_ytprefs});1 a[href="'+c+'"]').trigger("click")}),a(document).on("click",".wrap-vi-settings .nav-tab-wrapper a",function(){$a=a(this);a(".wrap-vi-settings .nav-tab-wrapper a").removeClass("nav-tab-active");$a.addClass("nav-tab-active");a(".wrap-vi-settings section").hide();a(".wrap-vi-settings section").filter($a.attr("href")).fadeIn(200);return!1}),f=a(".iab-cat-tags").val(),0c.length){var d=a(this).val(),e=a(this).find("option:selected").text(),g=a(".iab-cat-parent").find("option:selected").text();d&&-1==c.indexOf(d)&&(c.push(d),a(".iab-cat-tags").val(c.join(",")),b._EPYTA_.iabAdd(d,e,g))}else alertify.alert("You can choose up to 4 categories maximum. In order to add a new one, you must remove one of the existing ones.")}), a(".iab-cat-tags-display").on("click",".iab-cat-tag-button",function(){var c=a(this),d=c.data("tag"),e=a(".iab-cat-tags").val()?a(".iab-cat-tags").val().split(","):[];e=e.filter(function(g){return g!=d});a(".iab-cat-tags").val(e.join(","));c.remove()}),b._EPYTA_.demoBackgroundColor(),b._EPYTA_.demoTextColor(),b._EPYTA_.demoFontFamily(),b._EPYTA_.demoFontSize(),a(b._EPYTA_.escId("vi_js_settings[backgroundColor]")).wpColorPicker({change:b._EPYTA_.demoBackgroundColor}),a(b._EPYTA_.escId("vi_js_settings[textColor]")).wpColorPicker({change:b._EPYTA_.demoTextColor}), a(b._EPYTA_.escId("vi_js_settings[font]")).on("change",b._EPYTA_.demoFontFamily),a(b._EPYTA_.escId("vi_js_settings[fontSize]")).on("change",b._EPYTA_.demoFontSize),a.ajax({type:"post",dataType:"json",timeout:12E6,url:b._EPYTA_.wpajaxurl,data:{security:b._EPYTA_.security,action:"my_embedplus_vi_reports_ajax"},success:function(c){if("error"!==c.type&&c.data.mtdReport.length&&"undefined"!==typeof c.data.mtdReport[0].date){var d=c.data.mtdReport.map(function(g,h){return{x:moment(g.date,"YYYY-MM-DD").format(), y:g.revenue}});a(".vi-total-earnings-num").text(b._EPYTA_.moneyFormat(c.data.netRevenue));var e=moment(d.length?d[0].x:new Date).format("MMMM YYYY");c=document.getElementById("vi-report-canvas").getContext("2d");d={type:"line",data:{datasets:[{label:e+" Earnings (USD)",backgroundColor:"#1193aa",borderColor:"#1193aa",fill:!1,data:d}]},options:{responsive:!0,maintainAspectRatio:!1,plugins:{deferred:{delay:1E3}},title:{display:!1},legend:{labels:{fontSize:15,fontColor:"#000000"}},tooltips:{position:"nearest", mode:"index",intersect:!1,callbacks:{label:function(g,h){return b._EPYTA_.moneyFormat(g.yLabel)},title:function(g,h){return moment(g[0].xLabel).format("LL")}}},scales:{xAxes:[{type:"time",time:{unit:"day",unitStepSize:1,displayFormats:{day:"MMM DD"}},display:!0,scaleLabel:{display:!0,labelString:"Date",fontSize:15,fontColor:"#000000"},ticks:{major:{fontStyle:"bold",fontColor:"#000000"}}}],yAxes:[{display:!0,scaleLabel:{display:!0,labelString:"Revenue",fontSize:15,fontColor:"#000000"},ticks:{callback:function(g, h,k){return b._EPYTA_.moneyFormat(g)}}}]}}};Chart.defaults.global.defaultFontFamily="'Segoe UI', Roboto, 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif";new Chart(c,d)}else a(".vi-report-error").removeClass("hide"),a(".vi-report").addClass("hide")},error:function(c,d,e){alertify.alert("Sorry, there was a network error. Please try again. If the issue persists, please contact ext@embedplus.com")},complete:function(){}}),a(".ytvi-btn-logout").on("click",function(){var c="",d=a(".iab-cat-tags").val(); 0
To actually disable monetization, make sure the 'vi ads are: On/Off' button is set to 'Off.'", onok:function(){a.ajax({type:"post",dataType:"json",timeout:12E6,url:b._EPYTA_.wpajaxurl,data:{security:b._EPYTA_.security,action:"my_embedplus_vi_logout_ajax"},success:function(e){"error"===e.type?alertify.alert(e.message):location.href=e.url},error:function(e,g,h){alertify.alert("Sorry, there was a network error. Please try again. If the issue persists, please contact ext@embedplus.com")},complete:function(){}})}}).show()}));a(".ytvi-btn-toggle").on("click",function(){var c=a(this);alertify.confirm().set({title:(c.hasClass("ytvi-btn-active")? "Turn off":"Turn on")+" your vi ads",message:c.hasClass("ytvi-btn-active")?"Are you sure you would like to deactivate your video ads? Please note that your ads will no longer appear on the front end and your revenue will be paused. If you would like them to reappear later, simply click on this button again.":"Click OK to confirm turning on your vi ads. They will appear on your site according to your Placement settings.",onok:function(){a.ajax({type:"post",dataType:"json",timeout:12E6, url:b._EPYTA_.wpajaxurl,data:{security:b._EPYTA_.security,action:"my_embedplus_vi_toggle_ajax"},success:function(d){"error"===d.type?alertify.alert(d.message):(c.find("strong").text(d.button_text),c.toggleClass("ytvi-btn-active ytvi-btn-inactive"),c.hasClass("ytvi-btn-active")?a(".ytvi-msg-congrats").show(200):a(".ytvi-msg-congrats").hide())},error:function(d,e,g){alertify.alert("Sorry, there was a network error. Please try again. If the issue persists, please contact ext@embedplus.com")},complete:function(){}})}}).show()}); a(".ytvi-intro-video-modal").on("click",function(c){c.preventDefault();c=Math.min(.8*document.body.clientWidth,800);var d=.5625*c;alertify.YoutubeDialog("BcrNPnWUkVI").set({frameless:!0,resizeable:!0}).resizeTo(c,d)});a("#vi_show_gdpr_authorization").on("change",function(){a(this).is(":checked")?a(".opt_vi_show_privacy_button").show(300):a(".opt_vi_show_privacy_button").hide(300)});a(".wrap-ytprefs-onboarding").length&&(a(".ytprefs-ob-nav-close").on("click",function(){b.parent.tb_remove();b.top.location.reload()}), a(".ytprefs-ob-nav-prev").on("click",function(){b._EPYTA_.onboardPrev(a(this).closest(".ytprefs-ob-step"))}),a(".ytprefs-ob-filter li").hover(function(){var c="."+a(this).find('input[type="checkbox"]').data("obfilter")+"-icon";a(c).addClass("yob-icon-visible")},function(){var c="."+a(this).find('input[type="checkbox"]').data("obfilter")+"-icon";a(c).removeClass("yob-icon-visible")}),a('.ytprefs-ob-filter input[type="checkbox"]').on("change",function(){var c=a(this),d=c.data("obfilter"),e=a('.ytprefs-ob-filter input[type="checkbox"]:checked'); !e.length||1===e.length&&e.is('[data-obfilter="yob-monetize"]')?a(".ytprefs-ob-step1 .ytprefs-ob-nav-next").prop("disabled",!0):a(".ytprefs-ob-step1 .ytprefs-ob-nav-next").prop("disabled",!1);"yob-monetize"==d?a(".ytprefs-ob-step3 .ytprefs-ob-nav-ultimate, .ytprefs-ob-step3 .ytprefs-ob-nav-penultimate").toggleClass("ytprefs-ob-nav-hide"):c.is(":checked")?a(".ytprefs-ob-step2 ."+d).addClass(d+"-visible"):a(".ytprefs-ob-step2 ."+d).removeClass(d+"-visible")}),a(".ytprefs-ob-step1 .ytprefs-ob-nav-next").on("click", function(){b._EPYTA_.onboardNext(a(this).closest(".ytprefs-ob-step"))}),a("#form-onboarding").on("submit",function(c){c.preventDefault();(b.tinyMCE||b.tinymce).triggerSave();var d=a(this);d.find(".ytprefs-ob-nav-next").prop("disabled",!0);c=d.ytprefsFormJSON();c.security=b._EPYTA_.security;a.ajax({type:"post",dataType:"json",timeout:3E4,url:b._EPYTA_?b._EPYTA_.wpajaxurl:ajaxurl,data:c,success:function(e){if("success"==e.type)b._EPYTA_.onboardNext(d.closest(".ytprefs-ob-step"))},error:function(e,g, h){},complete:function(){d.find(".ytprefs-ob-nav-next").prop("disabled",!1)}})}),a(".ytprefs-ob-step3 .ytprefs-ob-nav-skip").on("click",function(){b._EPYTA_.onboardNext(a(this).closest(".ytprefs-ob-step"))}),a("#form-onboarding-apikey").on("submit",function(c){c.preventDefault();var d=a(this);d.find(".ytprefs-ob-nav-next").prop("disabled",!0);c=d.ytprefsFormJSON();c.security=b._EPYTA_.security;a.ajax({type:"post",dataType:"json",timeout:3E4,url:b._EPYTA_?b._EPYTA_.wpajaxurl:ajaxurl,data:c,success:function(e){if("success"== e.type)if(d.find(".ytprefs-ob-nav-ultimate").hasClass("ytprefs-ob-nav-hide"))b._EPYTA_.onboardNext(d.closest(".ytprefs-ob-step"));else b.parent.tb_remove(),b.top.location.reload()},error:function(e,g,h){},complete:function(){d.find(".ytprefs-ob-nav-next").prop("disabled",!1)}})}))});a(b).on("load",function(){"1"!=_EPYTA_.onboarded&&a(".ytprefs-onboarding-launch").trigger("click")})})(window,jQuery); PKL\e"J&&)youtube-embed-plus/scripts/embdyn.min.cssnu[ @charset "UTF-8";.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}@-webkit-keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}PKL\Ƿϖ++'youtube-embed-plus/scripts/ytvi-gdpr.jsnu[/* Begin IAB API V 1.1 Implementation */ var __vicmp = (function () { return typeof (__vicmp) == "function" ? __vicmp : function (c) { var b = arguments; if (!b.length) { return __vicmp.a; } else if (c == '__vicmp') { return false; } else { if (typeof __vicmp.a === 'undefined') { __vicmp.a = []; } __vicmp.a.push([].slice.apply(b)); if (typeof __vicmp.execute != 'undefined') { __vicmp.execute(b); } } } })(); function wp_insert_vi_consent_onload_cmp() { if (typeof __vicmp.execute === 'undefined') { __vicmp.execute = function (b) { var data = {}; if (typeof b != 'undefined') { if (b[0] == 'getUserConsentStatus') { var ViconsentCookie = wp_insert_vi_consent_popup_get_cookie('Viconsent'); var gdprStatus = false; if (document.getElementById('wp_insert_vi_consent_popup_is_eu').value == '1') { gdprStatus = true; } if (ViconsentCookie != '') { var ViconsentCookieData = wp_insert_vi_consent_popup_decode_cookie_content(ViconsentCookie); data = { gdprApplies: gdprStatus, hasGlobalScope: false, consent: ViconsentCookieData['PurposeAllowed'][1], } } else { // Cookie Missing / Corrupted data = { gdprApplies: gdprStatus, hasGlobalScope: false, consent: false, } } } b[2](data, true); } }; if (__vicmp.a && typeof func === 'undefined') { for (var i = 0; i < __vicmp.a.length; i++) { __vicmp.execute(__vicmp.a[i]); } } } } //setTimeout(wp_insert_vi_consent_onload_cmp, 500); wp_insert_vi_consent_onload_cmp(); /* End IAB API V 1.1 Implementation */ /* Begin Consent Cookie Implementation */ function wp_insert_vi_consent_popup_disagree() { var cookieData = wp_insert_vi_consent_popup_create_cookie_content('000000000000000000000000'); wp_insert_vi_consent_popup_set_cookie('Viconsent', cookieData); var ajaxFrame = document.createElement('iframe'); ajaxFrame.src = document.getElementById('wp_insert_vi_consent_popup_url').value + '?wp_insert_vi_consent=' + document.getElementById('wp_insert_vi_consent_popup_auth').value; ajaxFrame.style.display = 'none'; document.getElementById('wp_insert_vi_consent_popup_wrapper').appendChild(ajaxFrame); document.getElementById('wp_insert_vi_consent_popup_wrapper').style.display = 'none'; //document.getElementById('wp_insert_vi_consent_popup_overlay').style.display = 'none'; var wp_insert_vi_consent_popup_settings_button = document.getElementById('wp_insert_vi_consent_popup_settings_button'); if (wp_insert_vi_consent_popup_settings_button) { wp_insert_vi_consent_popup_settings_button.style.display = 'block'; } } function wp_insert_vi_consent_popup_agree() { var wp_insert_vi_consent_popup_vendor_list_purposes = document.getElementById('wp_insert_vi_consent_popup_vendor_list_purposes').value; var cookieData = wp_insert_vi_consent_popup_create_cookie_content(wp_insert_vi_consent_popup_vendor_list_purposes); wp_insert_vi_consent_popup_set_cookie('Viconsent', cookieData); var ajaxFrame = document.createElement('iframe'); ajaxFrame.src = document.getElementById('wp_insert_vi_consent_popup_url').value + '?wp_insert_vi_consent=' + document.getElementById('wp_insert_vi_consent_popup_auth').value; ajaxFrame.style.display = 'none'; document.getElementById('wp_insert_vi_consent_popup_wrapper').appendChild(ajaxFrame); document.getElementById('wp_insert_vi_consent_popup_wrapper').style.display = 'none'; //document.getElementById('wp_insert_vi_consent_popup_overlay').style.display = 'none'; var wp_insert_vi_consent_popup_settings_button = document.getElementById('wp_insert_vi_consent_popup_settings_button'); if (wp_insert_vi_consent_popup_settings_button) { wp_insert_vi_consent_popup_settings_button.style.display = 'block'; } } function wp_insert_vi_consent_popup_create_cookie_content(purposeAllowed) { cookieConsentTimeStamp = Math.round((new Date()).getTime() / 100); var cookieConsent = new Object(); cookieConsent['Version'] = wp_insert_vi_consent_popup_create_binary_string(1, 6); cookieConsent['Created'] = wp_insert_vi_consent_popup_create_binary_string(cookieConsentTimeStamp, 36); cookieConsent['LastUpdated'] = wp_insert_vi_consent_popup_create_binary_string(cookieConsentTimeStamp, 36); cookieConsent['CMPId'] = wp_insert_vi_consent_popup_create_binary_string(999, 12); cookieConsent['CMPVersion'] = wp_insert_vi_consent_popup_create_binary_string(0, 6); cookieConsent['ConsentScreen'] = wp_insert_vi_consent_popup_create_binary_string(0, 6); cookieConsent['ConsentLanguage'] = wp_insert_vi_consent_popup_create_binary_string(4, 6) + wp_insert_vi_consent_popup_create_binary_string(13, 6); var wp_insert_vi_consent_popup_vendor_list_version = parseInt(document.getElementById('wp_insert_vi_consent_popup_vendor_list_version').value); cookieConsent['VendorListVersion'] = wp_insert_vi_consent_popup_create_binary_string(wp_insert_vi_consent_popup_vendor_list_version, 12); cookieConsent['PurposeAllowed'] = purposeAllowed; return window.btoa(cookieConsent['Version'] + cookieConsent['Created'] + cookieConsent['LastUpdated'] + cookieConsent['CMPId'] + cookieConsent['CMPVersion'] + cookieConsent['ConsentScreen'] + cookieConsent['ConsentLanguage'] + cookieConsent['VendorListVersion'] + cookieConsent['PurposeAllowed']); } function wp_insert_vi_consent_popup_decode_cookie_content(cookieData) { if (cookieData != '') { var binaryCookieData = atob(cookieData); var cookieConsent = new Object(); cookieConsent['Version'] = parseInt(binaryCookieData.substring(0, 6), 2); cookieConsent['Created'] = parseInt(binaryCookieData.substring(6, 42), 2); cookieConsent['LastUpdated'] = parseInt(binaryCookieData.substring(42, 78), 2); cookieConsent['CMPId'] = parseInt(binaryCookieData.substring(78, 90), 2); cookieConsent['CMPVersion'] = parseInt(binaryCookieData.substring(90, 96), 2); cookieConsent['ConsentScreen'] = parseInt(binaryCookieData.substring(96, 102), 2); cookieConsent['ConsentLanguage'] = parseInt(binaryCookieData.substring(102, 108), 2) + '' + parseInt(binaryCookieData.substring(106, 114), 2); cookieConsent['VendorListVersion'] = parseInt(binaryCookieData.substring(114, 126), 2); cookieConsent['PurposeAllowed'] = binaryCookieData.substring(126, 150); var purposeConsents = new Object(); for (var i = 24; i > 0; i--) { if (cookieConsent['PurposeAllowed'].substring(i - 1, i) == '1') { purposeConsents[(24 - i) + 1] = true; } else { purposeConsents[(24 - i) + 1] = false; } } cookieConsent['PurposeAllowed'] = purposeConsents; return cookieConsent; } return false; } function wp_insert_vi_consent_popup_create_binary_string(dMask, dBitSize) { var bMask = ""; if (dBitSize <= 32) { while (dBitSize--) { bMask += (dMask >> dBitSize) & 1; } } else { bMask = dMask.toString(2); while (bMask.length < dBitSize) { bMask = "0" + bMask; } } return bMask; } function wp_insert_vi_consent_popup_set_cookie(name, value) { var date = new Date(); date.setTime(date.getTime() + (365 * 24 * 60 * 60 * 1000)); document.cookie = name + "=" + value + ";" + "expires=" + date.toUTCString() + ";path=/"; } function wp_insert_vi_consent_popup_get_cookie(cookieName) { var name = cookieName + "="; var decodedCookie = decodeURIComponent(document.cookie); var ca = decodedCookie.split(';'); for (var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') { c = c.substring(1); } if (c.indexOf(name) == 0) { return c.substring(name.length, c.length); } } return ""; } function wp_insert_vi_consent_popup_settings() { document.getElementById('wp_insert_vi_consent_popup_wrapper').style.display = 'block'; //document.getElementById('wp_insert_vi_consent_popup_overlay').style.display = 'block'; var wp_insert_vi_consent_popup_settings_button = document.getElementById('wp_insert_vi_consent_popup_settings_button'); if (wp_insert_vi_consent_popup_settings_button) { wp_insert_vi_consent_popup_settings_button.style.display = 'none'; } } function wp_insert_vi_consent_popup_load() { if (document.getElementById('wp_insert_vi_consent_popup_is_eu').value == true) { if (wp_insert_vi_consent_popup_get_cookie('Viconsent') == false) { document.getElementById('wp_insert_vi_consent_popup_wrapper').style.display = 'block'; //document.getElementById('wp_insert_vi_consent_popup_overlay').style.display = 'block'; var wp_insert_vi_consent_popup_settings_button = document.getElementById('wp_insert_vi_consent_popup_settings_button'); if (wp_insert_vi_consent_popup_settings_button) { wp_insert_vi_consent_popup_settings_button.style.display = 'none'; } } else { document.getElementById('wp_insert_vi_consent_popup_wrapper').style.display = 'none'; //document.getElementById('wp_insert_vi_consent_popup_overlay').style.display = 'none'; var wp_insert_vi_consent_popup_settings_button = document.getElementById('wp_insert_vi_consent_popup_settings_button'); if (wp_insert_vi_consent_popup_settings_button) { wp_insert_vi_consent_popup_settings_button.style.display = 'block'; } } } else { document.getElementById('wp_insert_vi_consent_popup_wrapper').style.display = 'none'; //document.getElementById('wp_insert_vi_consent_popup_overlay').style.display = 'none'; var wp_insert_vi_consent_popup_settings_button = document.getElementById('wp_insert_vi_consent_popup_settings_button'); if (wp_insert_vi_consent_popup_settings_button) { wp_insert_vi_consent_popup_settings_button.style.display = 'none'; } } } setTimeout(wp_insert_vi_consent_popup_load, 500); /* End Consent Cookie Implementation */PKL\gZ4 4 0youtube-embed-plus/scripts/embedplus_mce.min.cssnu[.wp_themeSkin span.mce_embedplus_youtubeprefs,span.mce_embedplus_youtubeprefs{background:transparent url(../images/btnprefsoff.png) no-repeat scroll 50%!important}.wp_themeSkin span.mce_embedplus_youtubeprefs:hover,span.mce_embedplus_youtubeprefs:hover{background-image:url(../images/btnprefson.png)!important}.wp_themeSkin span.mce_embedplus_youtubeprefs_wiz,span.mce_embedplus_youtubeprefs_wiz{background:transparent url(../images/btnwizoff.png) no-repeat scroll 50%!important}.wp_themeSkin span.mce_embedplus_youtubeprefs_wiz:hover,span.mce_embedplus_youtubeprefs_wiz:hover{background-image:url(../images/btnwizon.png)!important}#media-buttons a.ytprefs_media_link span,.wp-core-ui a.ytprefs_media_link span,a.ytprefs_media_link span{background:transparent url(../images/btnwizoff.png) no-repeat scroll 0 0;display:inline-block;height:16px;margin:2px 2px 0 0;vertical-align:top;width:16px}#media-buttons a.ytprefs_media_link:hover span,.wp-core-ui a.ytprefs_media_link:hover span,a.ytprefs_media_link:hover span{background-image:url(../images/btnwizon.png)}#media-buttons a.ytprefs_vi_embed_shortcode span,.wp-core-ui a.ytprefs_vi_embed_shortcode span,a.ytprefs_vi_embed_shortcode span{background:transparent url(../images/icon-monetize_16x18bw.png) no-repeat scroll 0 0;display:inline-block;height:16px;margin:4px 2px 0 0;vertical-align:top;width:18px}#media-buttons a.ytprefs_vi_embed_shortcode:hover span,.wp-core-ui a.ytprefs_vi_embed_shortcode:hover span,a.ytprefs_vi_embed_shortcode:hover span{background-image:url(../images/icon-monetize_16x18.png)}body #TB_overlay.epyt-thickbox{z-index:100000000!important}body #TB_window.epyt-thickbox{z-index:100000001!important}#media-buttons a.ytprefs_media_link,.wp-core-ui a.ytprefs_media_link,a.ytprefs_media_link{background-attachment:scroll;background-clip:border-box;background-color:#f3f3f3;background-image:linear-gradient(#fefefe,#f4f4f4);background-origin:padding-box;background-size:auto;border-radius:3px;box-sizing:border-box;cursor:pointer;display:inline-block;margin:0 5px 0 0;outline-color:#333;outline-style:none;outline-width:0;padding:0 10px 1px .4em;text-decoration:none;text-shadow:#fff 0 1px 0;white-space:nowrap}#dashboard_right_now .page-count a.ytprefs_glance_button:before,#dashboard_right_now .page-count span.ytprefs_glance_button:before{content:"\f236"}#toplevel_page_youtube-my-preferences>ul>li.wp-first-item{display:none}#wpadminbar #wp-admin-bar-ytprefs-bar-cache>.ab-item:before{content:"\f311";top:2px}.ytprefs-pointer .wp-pointer-buttons,.ytprefs-pointer .wp-pointer-buttons a.close{display:block!important;opacity:1!important}PKL\<}4youtube-embed-plus/scripts/epyt_mce_wizard_button.jsnu[(function ($) { // https://github.com/WordPress/gutenberg/issues/10509 if ($('body').hasClass('block-editor-page')) { tinymce.PluginManager.add('epyt_mce_wizard_button', function (editor, url) { editor.addButton('epyt_mce_wizard_button', { title: 'YouTube Wizard', icon: 'icon epyt_mce_wizard_button--icon', onclick: function () // mousedown? touch? { try { window._EPYTA_.mceBookmark = editor.selection.getBookmark(2, true); } catch (err) { } setTimeout(function () { tb_show('YouTube Wizard', window._EPYTA_.wizhref); window._EPYTA_.widen_ytprefs_wiz(); }, 600); } }); }); } })(jQuery);PKL\oee,youtube-embed-plus/scripts/ytprefs-wizard.jsnu[window._EPYTWIZ_ = window._EPYTWIZ_ || {}; (function ($) { $.fn.followTo = function (pos, startTop) { var $this = this, $window = $(window); $window.on('scroll', function (e) { if ($window.scrollTop() > pos) { $this.css({ position: 'absolute', top: pos }); } else { $this.css({ position: 'fixed', top: startTop }); } }); }; window._EPYTWIZ_.getUrlParameter = function (name) { name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); var results = regex.exec(window.location.search); return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); }; window._EPYTWIZ_.selectText = window._EPYTWIZ_.selectText || function (ele) { if (document.selection) { var range = document.body.createTextRange(); range.moveToElementText(ele); range.select(); } else if (window.getSelection) { var selection = window.getSelection(); var range = document.createRange(); range.selectNode(ele); selection.removeAllRanges(); selection.addRange(range); } }; window._EPYTWIZ_.loadmovieplain = window._EPYTWIZ_.loadmovieplain || function (vid) { var codetemplate = ''; codetemplate = codetemplate.replace(/~ytid/g, vid); $("#watch" + vid).html(codetemplate); $('#closeme' + vid).css('display', 'inline'); $("#moviecontainer" + vid).css('display', 'block'); if (document.getElementById('scrollwatch' + vid)) { setTimeout(function () { $('html, body').animate({ scrollTop: $('#scrollwatch' + vid).offset().top - 50 }, 250, function () { }); }, 800); } }; window._EPYTWIZ_.closeme = window._EPYTWIZ_.closeme || function (vid) { $("#moviecontainer" + vid).css('display', 'none'); $("#watch" + vid).html(""); }; $(document).ready(function () { $('.wiz-accordion').accordion({ header: "> h3", collapsible: true, active: false, icons: { header: "ui-icon-circle-arrow-e", activeHeader: "ui-icon-circle-arrow-s" }, heightStyle: "content", autoHeight: false }).find('h3.header-go').on('click', function () { window.open($(this).find('a').attr('href'), '_blank'); return false; }); $('.playlist-tabs').tabs(); $('.livestream-tabs').tabs(); if (window._EPYTWIZ_.acc_expand) { $('.wiz-accordion #' + window._EPYTWIZ_.acc_expand).trigger('click'); } $('form.wizform').each(function () { $thisForm = $(this); $thisForm.find('.txturlpastecustom').on('paste change', function () { $thisTxtUrl = $(this); setTimeout(function () { var thepaste = $.trim($thisTxtUrl.val()); var badpaste = /<.*/i; if (badpaste.test(thepaste)) { var reg = new RegExp('(?:https?://)?(?:www\\.)?(?:youtu\\.be/|youtube\\.com(?:/embed/|/shorts/|/v/|/watch\\?v=))([\\w-]{10,12})', 'ig'); //get matches found for the regular expression var matches = reg.exec(thepaste); //check if we have found a match for a YouTube video //will support legacy code, shortened urls and if (matches) { var ytid = matches[1]; $thisTxtUrl.val('https://www.youtube.com/watch?v=' + ytid); } else { $thisTxtUrl.val('https://www.youtube.com/watch?v='); } $thisForm.find('.badpaste').show(); } else { $thisForm.find('.badpaste').hide(); } }, 100); }); }); var $epyt_wiz_wrap = $('#epyt_wiz_wrap'); $epyt_wiz_wrap.on('click', '.copycode', function () { window._EPYTWIZ_.selectText(this); }); $epyt_wiz_wrap.on('click', '.inserttopost', function () { var targetdomain = window.location.toString().split("/")[0] + "//" + window.location.toString().split("/")[2]; var embedline = $(this).attr("rel"); var gbclientId = window._EPYTWIZ_.getUrlParameter('clientId'); parent.postMessage("youtubeembedplus|" + embedline + (gbclientId ? '|clientId=' + gbclientId : ''), targetdomain); }); $epyt_wiz_wrap.on('click', '.resultdiv .load-movie', function () { window._EPYTWIZ_.loadmovieplain($(this).closest('.resultdiv').data('vid')); return false; }); $epyt_wiz_wrap.on('click', '.moviecontainer a.closeme', function () { window._EPYTWIZ_.closeme($(this).data('vid')); }); $epyt_wiz_wrap.on('paste change input propertychange', '#txtUrlChannel', function () { if ($(this).val().indexOf('/c/') > 0) { $('.error-channel-format').addClass('orange bold'); $(this).val(''); } else { $('.error-channel-format').removeClass('orange bold'); } }); }); })(jQuery);PKL\C99)youtube-embed-plus/scripts/ytprefs.min.jsnu['use strict';(function(b,d){b._EPYT_=b._EPYT_||{ajaxurl:"/wp-admin/admin-ajax.php",security:"",gallery_scrolloffset:100,eppathtoscripts:"/wp-content/plugins/youtube-embed-plus/scripts/",eppath:"/wp-content/plugins/youtube-embed-plus/",epresponsiveselector:["iframe.__youtube_prefs_widget__"],epdovol:!0,evselector:'iframe.__youtube_prefs__[src], iframe[src*="youtube.com/embed/"], iframe[src*="youtube-nocookie.com/embed/"]',stopMobileBuffer:!0,ajax_compat:!1,usingdefault:!0,ytapi_load:"light",pause_others:!1, facade_mode:!1,not_live_on_channel:!1,maxres_facade:"eager"};b._EPYT_.touchmoved=!1;b._EPYT_.apiVideos=b._EPYT_.apiVideos||{};0===b.location.toString().indexOf("https://")&&(b._EPYT_.ajaxurl=b._EPYT_.ajaxurl.replace("http://","https://"));b._EPYT_.pageLoaded=!1;d(b).on("load._EPYT_",function(){b._EPYT_.pageLoaded=!0});document.querySelectorAll||(document.querySelectorAll=function(a){var c=document,e=c.documentElement.firstChild,g=c.createElement("STYLE");e.appendChild(g);c.__qsaels=[];g.styleSheet.cssText= a+"{x:expression(document.__qsaels.push(this))}";b.scrollBy(0,0);return c.__qsaels});"undefined"===typeof b._EPADashboard_&&(b._EPADashboard_={initStarted:!1,checkCount:0,onPlayerReady:function(a){try{if("undefined"!==typeof _EPYT_.epdovol&&_EPYT_.epdovol){var c=parseInt(a.target.getIframe().getAttribute("data-vol"));isNaN(c)||(0===c?a.target.mute():(a.target.isMuted()&&a.target.unMute(),a.target.setVolume(c)))}var e=parseInt(a.target.getIframe().getAttribute("data-epautoplay"));isNaN(e)||1!==e|| a.target.playVideo()}catch(h){}try{var g=a.target.getIframe(),f=g.getAttribute("id");b._EPYT_.apiVideos[f]=a.target;b._EPYT_.not_live_on_channel&&0a.naturalHeight)if(c=d(a).attr("src"))d(a).attr("src",c.replace("maxresdefault", "hqdefault")),d(a).off("load.epyt");2c.indexOf("maxresdefault")){c=c.replace("hqdefault","maxresdefault");var e=new Image;e.src=c;d(e).on("load.epyt",function(){d(e).off("load.epyt");200k?d("html, body").animate({scrollTop:k},500,function(){b._EPADashboard_.setVidSrc(c, h)}):b._EPADashboard_.setVidSrc(c,h)}}).on("touchmove",function(f){b._EPYT_.touchmoved=!0}).on("touchstart",function(){b._EPYT_.touchmoved=!1}).on("keydown",".epyt-gallery-list .epyt-gallery-thumb, .epyt-pagebutton",function(f){var h=f.which;if(13===h||32===h)f.preventDefault(),d(this).trigger("click")});a.on("mouseenter",".epyt-gallery-list .epyt-gallery-thumb",function(){d(this).addClass("hover")});a.on("mouseleave",".epyt-gallery-list .epyt-gallery-thumb",function(){d(this).removeClass("hover")}); a.on("click touchend",".epyt-pagebutton",function(f){if(!b._EPYT_.touchmoved&&!a.find(".epyt-gallery-list").hasClass("epyt-loading")){a.find(".epyt-gallery-list").addClass("epyt-loading");var h="undefined"!==typeof f.originalEvent;f={action:"my_embedplus_gallery_page",security:_EPYT_.security,options:{playlistId:d(this).data("playlistid"),pageToken:d(this).data("pagetoken"),pageSize:d(this).data("pagesize"),columns:d(this).data("epcolumns"),showTitle:d(this).data("showtitle"),showPaging:d(this).data("showpaging"), autonext:d(this).data("autonext"),thumbplay:d(this).data("thumbplay")}};var k=d(this).hasClass("epyt-next"),n=parseInt(a.data("currpage")+"");a.data("currpage",n+(k?1:-1));d.post(_EPYT_.ajaxurl,f,function(l){a.find(".epyt-gallery-list").html(l);a.find(".epyt-current").each(function(){d(this).text(a.data("currpage"))});a.find('.epyt-gallery-thumb[data-videoid="'+a.data("currvid")+'"]').addClass("epyt-current-video");"1"!=a.find(".epyt-pagebutton").first().data("autonext")||h||a.find(".epyt-gallery-thumb").first().trigger("click")}).fail(function(){alert("Sorry, there was an error loading the next page.")}).always(function(){a.find(".epyt-gallery-list").removeClass("epyt-loading"); if("1"!=a.find(".epyt-pagebutton").first().data("autonext")){var l=Math.max(d("body").scrollTop(),d("html").scrollTop()),m=a.find(".epyt-gallery-list").offset().top-parseInt(_EPYT_.gallery_scrolloffset);l>m&&d("html, body").animate({scrollTop:m},500)}})}}).on("touchmove",function(f){b._EPYT_.touchmoved=!0}).on("touchstart",function(){b._EPYT_.touchmoved=!1})}});d(".__youtube_prefs_gdpr__.epyt-is-override").each(function(){d(this).parent(".wp-block-embed__wrapper").addClass("epyt-is-override__wrapper")}); d("button.__youtube_prefs_gdpr__").on("click",function(a){a.preventDefault();d.cookie&&(d.cookie("ytprefs_gdpr_consent","1",{expires:30,path:"/"}),b.top.location.reload())});"eager"===b._EPYT_.maxres_facade?d("img.epyt-facade-poster").on("load.epyt",function(){b._EPADashboard_.resolveFacadeQuality(this,!1)}).on("error",function(){b._EPADashboard_.resolveFacadeQuality(this,!0)}).each(function(){this.complete&&d(this).trigger("load")}):"soft"===b._EPYT_.maxres_facade&&d("img.epyt-facade-poster").on("load.epyt", function(){b._EPADashboard_.maximizeFacadeQuality(this)}).each(function(){this.complete&&d(this).trigger("load")});d(".epyt-facade-play").each(function(){d(this).find("svg").length||d(this).append('')}); d(".epyt-facade-poster[data-facadeoembed]").each(function(){var a=d(this);if(!a.data("facadeoembedcomplete")){a.data("facadeoembedcomplete","1");var c="https://www.youtube.com/"+a.data("facadeoembed");d.get("https://youtube.com/oembed",{url:c,format:"json"},function(e){e="eager"===b._EPYT_.maxres_facade?e.thumbnail_url.replace("hqdefault","maxresdefault"):e.thumbnail_url;a.attr("src",e)},"json").fail(function(){}).always(function(){})}});d(document).on("click",".epyt-facade",function(a){a=d(this); var c=a.attr("data-facadesrc");c=b._EPADashboard_.cleanSrc(c);for(var e=document.createElement("iframe"),g=0;gi#wP4Ls$zq@>Kgm?l|,u5[ZWiQ|3XYqsa,Q@?Rl|,tYE/=j>"Z;* ڱ'7Kgm_tK ֍s fӥC+_k ՑJ2~YE/=_?{mXk+ŰMA'o!. gg cg)~ _FgeMİ2G6:b0+F;->Lp' 9< ]_?{m cgGMMMnVI Irba8*$U_[ ?3]>Kgm[[YCw Is`j%G`U(:zc_?{m cg+++;+I^8WXc.Ue=,, Ȭ-g 1w>G$({)~ G-Ro.'Yԫ)) Sh)~ G-Ro.&_[ ?3]>Kgm?Yl|,tYE/=je_?{m cgɪ()~ G-Ro.&_[ ?3]>Kgm?Yl|,tYE/=je_?{m cgɪ()~ G-Ro.&_[ ?3]>Kgm?Yl|,tYE/=je_?{m cgɪ()~ G-Ro.&_[ ?3]>Kgm?Yl|,tYE/=je_?{m cgɪ()~ G-Ro.&_[ ?3]>Kgm?Yl|,tYE/=je_?{m cgɪ()~ G-Ro.&_[ ?3]>Kgm?Yl|,tYE/=je_?{m cgɪ()~ G-Ro.&_[ ?3]mxcŞG?.o?gnvkc=p}+eAoPٔQEx&r+6Lm6/ۗ_ZGaO%z6hMcUkOu#9YJLga(]GȯƝq73Y[kyˈm=/-fW l+kn>0Omhz47id?+(qcʒٌ.{NHcZ!Ovo1(W̌rP@8kh/m:ºtoQ5;PaDus9'_>Jj\E$l2P`r8=2?y~94=TE4I ;GὉAkV.̙ޅb|1M>/i; )-5WcKu( ;\+9#þ'}JWWkX1*G >۲`x^-W]-[FFaU)\>-"Մ -k ^I3]ڈDR1.qޅSی#"G|7kZiqE;̷p;gKwF8=5 |G\x(}>rh Krq xFJrx]/aLZdmqwpZ!۲AFbpwu(||vh-5 uG{aA#]=նcmjVKeXmY@`_8@{ovNxڶlag[.P0's%QKIH(P3F(LQZ( 1KEaR@LPQK1@XJ)qF( E.(a(PJSRbQ3@(4QEQJbv1F)h6(QEqF(/h1IN`1F((Kϡ@R E(b\PE%Q@Q@Q@ EPWٟL? ۪FE}p(+өhd{Y[Ld5IUJΝxf徵8ʹanvh3VOLsMjQ7ecgd?*AOVK 6WPgRֽ=^H]FGeYːX+׳~٭|'k} #TGV@T z>&>dB[_V:~ܑX݃ ~}Jf7Yd )#V 4?'|mM[va4)fkPkYG1 #_滵DdMwֿ9&$b+dW33*-vSEM\̬,mOoHm?81z(341Ȉ^',G#yjac;i5Ÿmlg)m1Q_O֡iָL, *Rx>7R3:oE|:-ĆZ/NK, 819ui ~Z(w9M~GO4@2O mOaZi"\,~sm&q=[jCF){ ,JDIZ;,%嵗.rɏQn0>`]b˓ (Zv,R-&+Fx6 0o*5hs[zomsu(wܢe?(/m)WI_x$t5ſ<;m+8Is \ 7luAϒFѴ牿_F^|;ѱTp aoSW,Xbͥ,`?5q0+5O,Lt8\tqGM7Ig}Ӻۙj9N._ogكʜj &*llfOI.H=( g4aX4v6-:!Jt@3R|P]i֫->i[ *gulUtҢӲ -3N϶\3OUY eeAʉڟ?ѧeuZN)9PUL5\y\ÛI_o#L?ѭ{Aѩ&Ṱh7jnMZ_Vq-TT5ѯ1M/3NLp "ҭWRHzW О?s^F֊ wa_'@wV"{x} ѵV7`G#Kq6s$Qza?6 罻kQ=sI9czrjA+ +J =g+TG{M5{CBNܜѧD 늫sJ^TzŸhi_ªx~AɻoCVfޢ+Y=Q)0sRm @+!SȮz \(D8A-/efxffMz5 ;8lPr="[BϟAZVZg"W_ }zTNV4?TkvҺ7Ike! ks ߗǽ:k%Cp `34"g4θ꽪떍nyݱ$1 t5kq.?bbQ>v/ʿf^|nݑzmw"(B;0lZkSipR\U5Iͭo}U>vehC!n[OBuBDqGQXrm!}+9 &oXŜfhE37<(fn+̵;}9xMb/cs \ώ[j n4np+U0q>yo ю +ow2z2iB*R4 iئqP\miwbҤ~sHqNc*j].b"F,""bBIFTs6*y^ſҥ+@I5v0j @6P+Rݎi-0'SV>McۏV_~խ4ToN>O$;0HL 0k8FPs[P]H]פ&_bږs[ёn'ިf.'9%\@KԷ-mp7u"> ֬I+P`,ڃ$]bpZ'?O/ۚ^iA澙rdgsS'#f}yEVF~?A|InU ~t~AGnU~uj7_1g¤tZ 0ֶa)B& VƾI(㊁図PXS?B?x2Ln >_ABD<>~h ,2M[TC >JDp5Ov#_n(AHUzi֋t5Գ+x-prx}1֞-(ydf"g&;c E8#ұDtZܢKʱqZ$p21iv^k~!s{0Z߷dVb];UsW;! m#qefx S9}P6*6m ;L?ݐQum)}L5<*?'G~賯Zl,K5f{Eݲhֈ[uSKSq+ YbSJsGVgtRwn&[hL\)fTI!W.,ђkUs@L+1TxUNEu!U50vĸf9F`ҕɱױ>'+$HK> GylOQڶR{)CvM-;s aiUqz:w< 9Pd,tk[zן^&Rr =)I ޢx;X.-a+*q%k?e̹sB,@%m41N"(%ӱD#DӭÊ6vԺykvHef)J&;Uy-n*V;zqM?5>ߥQe>lExOZsoV؜ ~5=Ȥ4 ֐ᘧSVPHCFoiZ,nH:5\ݾRUaX(Y2EV-Z9%]edҌe*WQhd1+F̴GԉIڪ0&s.?;˺$ ><sJ[Ϯ/ڗHGJέS>_ڐgGJB<]4c?nv֢\EpgR5qE ,N(H hVSl6 &?{>_@v>hWۏ@U3nji$'ʌ&sXZS'qC59$gS %ؓ94}b=gCԾ(8q{{yĪ0!J̢QwZְ&T[AɜגMAz2s#79{U3{I_'50"7q_hg"۾ɢp}{:Z7?)L5oe4iI{77aok2*9J&RzWQZx_km޸z4k\0|qۺ_}*˴*@d5,#3zS-y&+Ko= C_ rVm塚B1.܃Yz&~\VN[5sDûԭck.ќڮIOMvhwO΍*H7nm=W gs%sYnojzkW|qD~+x{ךGK\j ɷVR!T;8H @jpr{V?ٮ!x SN8qOĊcZ=Cpv'Xi Eiu ܃E|&):\xCHj6VwylzڌaV7W8 #áBtWLnZ ])ad?sQ2SS(T@MLT0nڐ)4 @)!!RËv*k3M;Vk"j 2YsYjM@6,U ?J̄ah0`j?W,VV\N:QD^}e=\yGm#)lvgBhsm5wbL?FV<YZDnNVA]FFr*hM[$Qpk{[>BFz6C >h5U]mqݠrDZmU,#`c\ba>r=Ѩ0[F[?.VR1kcNQIRIdm䷾j5֒?bKk߀v51}j,2M  :ü<5G!q~.psL rL4{a5v`HOS,ys Է2ۮx}BW8WcEI"(H(4RBbLP@8<`-5xiĔ*SZ$MiU 4aRW Ե*Q DT,DʼSWVn VF"+4H H=7|kgo:[8LYZ̧yx&^"ڜ33cEH3H'5_mjwWlҾg@u6I 9~1fu< ҐȘZVTmCDfmp 0<{p[`QEg~BGҘUlKz?_ڪ5K2 SJ9<Ոb{U؋lFdQNv^76i_{LLν[a#֣ |:/PUhC<HWk"E1zmIǁ!k88XAv7!(5] icqG=kYPw`B&E>LǶh=smA!5]ڧD݂vVV X'k]WkNWp5zt 7hZ+'Dҹ/Ԕ7qљV{5UA]KJFv='PVU_1f@x j|[6%5A KW5瓢i06׍h] N{8z:35@93\?#8hHq>^^q+Cz58 hXRSȤ0b :r5 "?l8nK `Sg~)kVUS#|iR 18r:: ִ-֨lHvx@^L'5J923Mx &h LsJeYi+֕m[\nEv;ZGnyG%";$ M=kct.6e9" +cLidy14V%ZBM&8}@G^33֢CSU)|mH$WUXl<@!ڣVaytjn U&ңs^ko;MjE^IF?TWGQp<ˑ+hOupW#r\LBZ ӯp}kJjc8QY'S鼯ިuF>f8HYWҬ]f1zT0-~-Z7ǜrqx0kRys ad`\p'&Uڦsؔp,ִci%bS`橙&*LQ@UVUÆÆUj;bi¶3Q.kqn|c{\W9FE+@ZslbJg STjczyjo4@ ֬18,6qZh|=*Q882HXm1J6Mdl3O Eeiym (4>MylQU핔Zse4ZOMhHfGoJϹRt-k*?)Ҥc74dQb }m;n+5}6{gLw>+CͿio 3ߥGW:dXlW>k[~G_&]RZ0? YG&(*PmڛD2uOj1V21|!{LLW]o(N?*F;e@_oleKyC8nm(u"^h+n5/1Hh3o<=X:D +-Z5jrLR8jtp1AX t~[ɻp1kAӒ;vGEH4Zʍ/<)ߢ ,lJ8QPj0pjglªnwִlF V<om4t-,G5jqjԚH`m u&4 Q <=$- 5K譎=X>ZdW'tdr7U-͠3}Z(rA=ѵ֭een+ NKCTiUA;e|L['&*!TGJF6G\UKni/Je)6jޠbldK5|Ll\m:v_ȗsCAp$gnPf[m^[&(.!.>:n\ɷR\OZԓ9^@8M%?w]?xƺz ̳9C՛h'̿/"5l>C_7^e5vC w#1=Us>F9b4'wH/5{mfp3U⨒\m*r:)s J}'9m5u,#89cR'uA*"lOI5۲V31lwnӑpwzT^&^me4TFexPP)iw=]Gÿ׌t4;mO+}MzGF_hM0>{:z8D OݯR?xS a-d'ѱWl7IHff?.=OaXdVŴ(d O|񦉦rM+r18Qڹ-毥d&ᜂ23N9׊3SVݚf įnkykBppGҋm {'kv q Z~>, 4Q Tz:SX.AUOzw~xƖFEEvf+zv56|A#-&Y x,L {Wk|;l`nG91ʹr9_|x XI.$s9ȥt =0Y#5Ht#~|MMr&b>Pp{UK? wpfJ?9)jM#d}IT{.[+ %11$KʍDoh-QrI6+@"tX|1)m >_:,h; {eqۊtJv(scig77#}Z?R_a^W |c`zVZy {,kJkc+Bx xO傱iҁYƳϭfljC_18f3,k< {RaCeiII%SY64V/FR>^MFL)5P+cEԊ}RyPǰ@RXձ ); dޯ[@||?y@&#FzWظ-P[ zW5w] źhYMs4VqdJ`@kemhEDtf͝4s[Pks{VW>:esxR @ܸgL^DVۖ5jm2 CMnMCMr!ᛟ;zwW]i2\}dMЧN$qT.'4fz[icL%*ҳeTBԲmc:y 1˩O5nמk&M ~O5U'6PiY,JǹMՐ#Y{LEm?K ibY_*<ՙw`AvURd%V2KbG.mU֡\cOjLzUhG(h-9pjklF Iyk ;߱x1xrDžN[|?Z3 šA$JR'եIɸ~35{Simm><61 =kwE5iRw1[kҴKRV&b둜0 `IjdԿN^|Mvb#23x[N #~$47SZM+1+nsԎkѤށe Z2!#+iuInNtXqޯxW|M=Z6ƸD=gTи #gpy%}g1F?ZEvA6KF'8'Ͼ C? H.?SkV>px{RדD'C8Ls"F=ּ!x5k aui=c'3 ָm* ǫ_v~'s߻|ݹ+}^> m47,6;+⳺K\-5OݴgB,;o>3{zbm9 zk;|#YG+=HV,-χ! HQ=+~jSi 5BЪZ4і82?dKlw{ r+6|Iz$B?'4I R 9fpC qߓ^i'okgLaP\*Q^J|M/"Ɨ6K(&VuMgO k:]ZΏ{`|ų޸Rx?U%KvE1^Ǟ%ws]A*tHFxpzىʪ!#v)mŏ-qH\ mbrI'Vc7֡:Awnbd[ғOwnkO!O'r=榧TQ\ǘ~C?|H:T5𗖾oS$Pasz-6Ӄq[\p})S@\Y* aNZN#JER(Ҙ:͍8~UU=4'M2pǼ yfCYeq'js#Th.Ke T"lD~AsǡMRm7=zɝ}f#V k"T⠍  I V<:H U"Rr9E '{{ϔdtҰvNk=OGIǝsC#2bعRݞ)++CLy>'?GE\;mY1^Q6Dvb3@ 柇kI۞E'>^cGf[j)  lzܟ\Wsiԭ ۹^+{uKhE}W?khI,qy~ޟSlqҔEMxxV6w=$>w$RB"Bm8zW6TӑTu(LjX/-cu<yӖ +$fmc^sj~Za{_Z]6gKpRib_1~ZIo93\|-5$WG#=ōWVn66mU{=Z?A/E-V` m _̝[< l/E&MĺFS!9ٓ=3'&@Y!y`zb 7Yj`̵j$szp amʑu]jmV=FXԨݐzɓP2΢&Lql?*v2rU{&6i0+#C yޯlx?:&l"J,^/ Ru?_[ Jד]*)5wZ 2ZjB#9EP OJ[A}.Y=k;4(w=oOA4m#In2EzLN@127ɁC>P;=ov/ =dAr/f3 x~+0miG@JiCvyJrs!֘4 3|M}]9sQ?/x( />xׯC_nj>x7uuP筹"iITԈ y@Ak'QO)1s~N~IXd4B)R*?⩛DG(WSc1>4jT"BISY1*HJh{.oR4R5wJ.oT2A=q^/ Zv.dYMhmtaŕ"ٻe܎Dl_P`eIy>Dm4ד^]xs^y;o)O&XJw4;O _՘$ʁ޼:ݰפHҔ6v'f(l-cnoI+[c/+uf^"Kuz \7KSC"$))sN`cH!\0:WTK6vp( ᲣUFqqZaF(7rȾU*<)mVb{ #[+BZZ[!Yp 9;[CήH9+RIgXZY܄fL)Tnydd^Oך(͔k5mOMTZ#&uhXJז *kdheIS<n[$|¥s7Jc䔨{npX>S9Y2sH·fda=jƳ`lZ=mDhjk~ұ!*uvBWG$q_v)#BJ1QQBJH\hC#U45Eq(Q"1U$|5$4۟IFܹ_ & i1$B u㚖xZc:]"AUa85m4u-7^KwZR*:PGj)ozTwm+[b,ju5-˞if8Fj-0&]?5U}6- h[μ8Qiex/ҹ]EkUi55Ug4澯zp?g??nj' ϬhڿH?Jᯃk/HJᯂ]469n<QMITԈzi U=WMN5[R??JM64R1րkAԆ#tS@87?-* jEmÀIa?(ⴴ',k'a-\^Ӿj,f[S5-"l٘h\DC:@SYp\o:b."e5{YFLqXH_ұ{B"W;\xf9kAKp1މjmOC< ,>15;J\Nğz͡A.i6cw"f8wVvf`^Gs{1"_J\KeԳJHWwzn#TG }imRkZklb$@m aS=j_DeEc\Aknd GG,Mc՞nw2}vAsm }+Ugsr{WaO4և͞/OJ{`2=rxagycm.഑?yoƿ izlih\%>Y8ùu2R[Z6s3BȕZ|;t&:\hVJS Wbw}ݸ 7[zV5-lVLr8#)W;\T:k;G#;bAp)4s'|g}*ȷywDJ U$NJ3M3-fF nA5mGӆQ=68}Fp+ U n9nt`ֱtBEJb**0P6d9i,BB=*s/x\KҺ-#<MT?RKfZe@U~e!0I%dZչIQH@R90MԻ36T"v5Nr9y y5pt҆ .0j&{Tr@\Q"4SqT|sdVՇح1(pGhA"}l}kFJ7S^25v=ݨmQ,:ڴ±GmſMNS>C<?nk 3o*ZQEly_i&otҸk0xko7ۧ_]v104QNlfH >TѩAg@-'~H1wVLvh&ԀSҚzxO@O4҅4rM T>*Xb*FW??RAs\yAmDe~Q]|C6^oqBq4KeKr~g#SQn端`&X̓WOxbK /P t wxz쬗 ez_p1\3= tAkW3{3FM[Ԯ@zseXbi#=jKSxQ7ݱBC7xm+[ 5VO*ϵ\b1Ŵ*8wL01W. ֦?a~@>H;qZaq&Ƭ}jR UVU54I\EكMڤި>Hozp/7;Ոl$a6sa]ǵrFik^8cbEPEX~uB2?4P8UAk:MnNeQfʪ=^D31T+ck7ۧ_q&tҸkutRʦ҃Qf3 49"@AZH,bg,q+ Ŗ۝PnpGJMD_c4w }'#Iӊk +0kLb/ ιZ!nZ0zkW#ХB1%Oy RzW뚴HI~4穮n鬥cV`bg[|B-LlcS֫HL9~+):nCa܉Iͯy;^mFV'5\ΒX9q]^iE4,qWMo8? d\UXv1Yz̶29.kX91nOzu;CB@2h1"I$ըmd32KElbs'x{wG\b I\W]SGM3RWN<-Ѳ;ū2§Hm^ Gn $cT(_nR 6hKJuSېCg"|BdqVeArNrU SnW'$3(<\B>3@l b p*-dP N+2RnrM@I! \SdQq[$?5;8MwlT,u .0;ȓԮ֢ߚcۚ.5jb?J7/TUZ&yqϘU$U$p+;I=hfԶXQE7oN?=k!>k%hL FҬ!?+)yaZ*q+fL&5g|O}msQ?qZ[QEωJϰr+wG\5 le= WӃ4C7Qp'+sMVhc~sMy K(viiSGޥ-P5\PJئ :2 HdIx/SUP[7HG> 5حW;27+/vz&(3YԨPs~Di^@o5萪C;V"\ {^^ZoVw(!5;[aVi$WA5Fe#DrZ3ɮSXĜJ5ć5#fEsrI^TFH/T˛+R1 gZ% e cjf5&xKI_Qø8R*YN/ÔgaTȪrՈj*4dP9,* D/SWEjh_fBq6(e#m 46á8<ww<.Ȭy55{n!(U< SeNzS==aB@XpV\U <ÊmQIkY9_p+x0ƣmJga9svEVqNGH搊 "*B)S"dNN% *8cJڣ+ -FecZ1Jώy≠5 69h,t32*2 [#ri_/#^nhh4дQEHG5ȬmVEݏ3&j\,~`X+E"Izұ0j@Z 3E+'A'ۚ8}qEV&~n(O+=AUpTpy+jv9$mӁ;?@-^?ӝ,oɥ.tO(ϖzVjր$<|9Y~t^KbR}S̃調mƕY>ڪ\sQLȨD&1|N9ND4U)n[B}VUH=1G= [|DKc fwQb=-WrS.3μ/>U)df?e#_i\ߓ~uy|NFGbgox­1#|7T8K{Xw:NAeOskq_+*nx ={ڃ5o7'$>u CZX?hZ(7Q픁hrJhivSOv vI:h]˕Y7qRlZP[9s>KM>aX*;nuu//ISN?s[($YocE:M}>c,:4ɏ&5:\NtӴ{4摒ƥ[oX4ɵOtd+Tѥ`]JМ>W,Z}>,"GV(pGWc6V}ޕ( >k6I#M8lU'o‘e 2+MG+&hqWҩ2$1^&-})\]uY j|ڝbf`ƣ=j}m\9K5g|yo__8'oO|ݏL(ؼ]n_[~gs_?K`w>~E߀%\Q@QN.O%\J( E%Z1Ea_EqsM}h@\\џzJ( 2i(W&ƒ^RQ@:4PQJ( M%P (E\њJ)4PEPKIE;Ͻ6.\QE ѓIEQpޛKwNAF&h~_JLQEu&(%+N)(/qIEx6.GQp3 5u_WٟL? ۪@}EP_l^./-3kbwl@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ܺݝԬ,!(ݮߙT1uj ա7bxE o]koR' W?E号"0?5h_uKi1kMƲKpZD#|J>zuKXX4ЈOPE?ׄWoCh(((((((((((((((((+&_|g_f27n(Ѝk=@W2{Ǩ\B7U~f__˟FʵsOVE~.| *׿zeρ?#ZPme 'o^?>Ѝk=@W2{Ǩ\B7U~f__˟FʵsOVE~.| *׿zeρ?#ZPme 'o^?>Ѝk=@W2{Ǩ\B7U~f__˟FʵsOVE~.| *׿zeρ?#ZPme 'o^?>Ѝk=@W2{Ǩ\B7U~f__˟FʵsOVE~.| *׿zeρ?#ZPme 'o^?>Ѝk=@W2{Ǩ\B7U~f__˟FʵsOV:Ƒd3gFq ?ka/_˟FʵsOV ?ka/UxP{;jvc|3H 8< \B7U˟Fʵ+sOV.| *׿z?3h/eρ?#ZQ 'o^͢L>Ѝk=G2{Ǩ62\B7U˟Fʵ+sOV.| *׿z?3h/eρ?#ZQ 'o^͢L>Ѝk=G2{Ǩ62\B7U˟Fʵ+sOV.| *׿z?3h/eρ?#ZQ 'o^͢L>Ѝk=G2{Ǩ62\B7U˟Fʵ+sOV.| *׿z?3h/eρ?#ZQ 'o^͢L>Ѝk=G2{Ǩ62\B7U˟Fʵ+sOV.| *׿z?3h/eρ?#ZQ 'o^ͯ?PU˟Fʵ|5+B;YZB"xƃ,N3._א(%w]hԴ T-چuf\$7j]mmqsSOnk7xqux./%VcqvʡP-9Q&5߇ZzllXW]3e8 '"WI ɾW@ZgTs>0uh2#$q{*\I/-f$@w<=%YXkͯ訢QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETw3kOs4pĸ0U8zcNТ4S1?Sio @\EPѿ/JZ7?!?ƀ~Zh-a 4 EQ-a 4lEQ?)c 4O,!ƁܻER'ehҿ'eh h_W2msD7ͬi/MhQX FE p0}>Om/܀m2`Fwv+4_WW0.T _m/Vƀr 1/Ԃv'MOE1&TluH4R*+/_?ok^OnۍwnLZԢoX?| .:+ .X?| X| IH%hgNTH I!ec2{[Kx-RE*GSx#ڱό4ϊ!`ҘVB/(JݍS *mYiMemmjD )}iھkFWӬ V!7P:ȬA|1h?? ah?fO±iikFM6Y<-! 1MIsµm;{x*GUQ8Xy *=F5wMm}BZE՝q3<C׆?mH~#|=|wqqx?([?<-x??c<7c<7?<-x?hmŞ׮C.\fF)P V$ 3+f +7T*m=oMzst\>ƪ7- g'QEtnY(̾UK6Bʳkzleki]!M*+ er0mNAiG|"[hVO_Ҙ*@u[A棽dʷl2[B{qMe訬rݮ.5*T=j=2IQ&BRSu*IZ|K8> Aj9|Yhĺ4h,}zX٢8}5XZ&붯wjHcildW q*ZQH{0σosы^@^gů# s*ӂz(硪2#.--dq\*SYKx/TxHLwGb1\9o5g9PՇ A\{P[L4AR'=&i\'=) Rm{Ocy9+nom{ge F}k%)Y27QI銳wcqhha{U Z|WOk{E)\U)ظS/UnT֭AQg2rcGһ맶ȸ!Ҳ5SfZgZfJǀkۛ-Eq*))` ^ q:QH\vxo7.KjUNԷL Y!HNtu RZկ.\xQ(rp(.vcyjb@"lc wJ3ϓl#SAg"k`Nrxo,Y>hJ~ЕTm>;}q=[OYdnZOht sYɾM { |c&{i;k]&+|e"]/X´r$cLfXA"|0#RWAss/߿޾?oomg˔QEQE*[ |~-. [PB2zq\\@1j*dHBAT$1fu>Xx*šh/io,s\VF]'] SvcݾW!q ݎ `K~6{#NӦ[O<8KF<=k944L'̬yw8A>޻/zeF (.%U+0Ks=2X|StFɤXIf_>QaiJc0&)Yd?*Hj7 t}P܋k( wMӺ;O"v;u(ҨJ/cR2hfN}W0_$k}RYB&>8Ec0OOz<7&ql.'iMa;WWR,zm߅-fzNv2IٸϮIz*R]Njc *2m*@5h#(Š(zGٕ7%gT>޾̠j ±_lo~l+o%EYhc2٤_-:p}5>9ciOh2sJhWE\%GD1OgSpWr*5xPA8NMr ݛķ,F b|ԭ sɮ\Kk3oe)9ԄƟqfO^=+>IrZ9FeW&W<'&N$nMQNbsx^}%5#i!~~U~v1,h7#lyꠁҴX '`'z?meL^%D8]Ɲ^Bl|v=*v,(=ڼꗄ^穄M%R?9cDui`| "c-On 8"P|3,Xe/86\#nr2HO;QTg>S.j>3V5-ǕgE?5/#Kk# T~ 먱x4kLv=8'SO,y܌sۚs0]5~m(ƆSk.?Zc#8?y-'ʜy}*gV(Et*j m-Lk ^GR -zg[!̤rߠ:l:7+T1QjNx'p! n;JvWY#Tu1ϒW^^}OZtxĺ#Ed To1os\cty|H? I-N{nco6U%#QA$z,5+E%yε|]ni^Rl|CiM$`eҼ['k-*lHwɞ[sV7#@'vmKmAC03zʍ%Is˿Dzj>m*da$eWϞ2csl4^8"*!<88'[dBSr\lV%_V*N:Nh(NJ[—OӪ15~xVZ2.WzVG} eK :Nu&ZMk k82t޼ufSmo^;x"f_`+o+Jѭ&mPA,9%I (o@zR|D4"avSzl^@Q(5>ghɥ^嵑N̜ի/=yhm%7$2H#_»_im!m%bqm.ྪFx54s/߿޾?oom((t_ZYRYaܧ=/ o к>lskеi,>N_ OՆ{X~j>߈d`\iZO1w5t[_{lj2o&eдHnl)P fO,Ur[%@қ^-+XL\K>bI",#zVe:I/g$wɭk շF081ps/~. ΰWngmoac7 }Z⏋*V f-qn3l1q^n#)v.b>x.&o\bap%?)T)JҼ}4aIGb nbvn'qJg-˨|HԬDh!!I03Շzn-o<2޾[[jlTB(9f ?KF^c_x—]&'a{y~h>M?GCf$11GXr]eFV>\^} \LG4ɍ22z7PFԴyR35D|}?~ eXv(z;PPRШo7*A=y:_v38$v~ yb;yQ-fjzZr46&u{fg ȓ`HϾ DkqZQ ͍cYV^!nMմ$.qy;m-!}K`qZbNmXYKKwH/;&l篥mRO8¬rn|Mң׬d `p?Z)]v[O 7$G `BWxE4fVI%lu5zƨ`yF=(s =,.P=9k7~?V& $3%i]hY۱+3OK[G!Cc Vї+aF.v.\f}+ļXd]JS,4>nE|y^=4wɈ;E vrm 䋭CߑQEwG3DƾLf?֦9 ,>KdT'rK! uow?58f@NA5hNmi81QA _M]l4(ktE\M iJ 5[kZKb) J=+-'Se۝:S. Iba!|t>.EdžLH8('1a3(>K p1%jmZw[WBkl6u'ˏwY[sw2C *ZI(I5Nս2$D vӵA?-1X5$hc㌓ڻI.mj'^xK[egi 9lTrNJ4͖i$(\ Ҽ7l\yΡߒHZUl_iS׾9v/vːu7po=XFB_Ƽ⯈a׬A)nʀbT0t p`SVum ۨ5j^"l"AiRv9.KˊZŨC9†hChyy^Cv:).I= |uHʰ(Р {.{85ͥhn.V+Ԛ)Y[<{\AƗs}krWI ӑ*F8(H\v}%K"|awsy^w/! Ŏ>Tysi7+AO3yX NoNhei*LcjXV8kmT= {^ w0^,ke$Xv;Zɷb+|YFIbj2KeS .^MrpxĖ 5+%KfǖQ }5+jI/&ʿ$#9e4vGΑN9݌{U]B(ZjQj1tҋŻ}v#qϭqNno-p4q'28G/oEc[,A]#8hެáW6jfHV[E*ιFGL9e42sQ/SEXAvlynO:% q3H<ݹ過>[kM> "/3دK7k C̚ !XVl Jh$Ϧd~z\KHG˔QEQE:/ӨZJҀ c]\_W+CpyșZMz'$um,rx'|`[u]!`5%: >6bt2(OkxpIU޳9Cay6MBZWٌ~eIRri=̱DXrzc?ҭ%e\, {uiey+x]DAx[w/u.ʴ7S9Z]Xjs;%|8۸>@9lxGQ~~@s;^qcD槡pۈI0S;􏣽Q*e }?:Wu1u䍛w+8#5лJ17p=zz`"k}+| $#h& b['x=*.ƒIP2D@ Q$jH,29Vp}+x-[_~zJhqAqkw$maIufB8V%ux'U-Ijk-O gOȒ ʺTH!$1$gV?>4-߂?c^ |{iuCHH{lğNWC0wy^g^T$58[E`3(8t^}`CgI\̴9* w 4+Ď;6yh@SWW 7s}[". Z|qIh]1t[$nj׼-2&ʹ&j+i'"qOZv9-+AtS>GӤ-?uf*%?pMpt RWk[Y|f 6>/ŤP[ŭ*eIk)VFxEǯ$m#.k jo.Q]%E&Wp$}}uM;B+u8#C4W?+x c>x{k^'L(";,c: Cx N8! (UIwӵhQZ70uZisa ,]MQMȽ9 W<1}y 9I{{4&tdv*Wo|lŨx[K2@|%b00=O 98]~(TVwO v<e'SCJZ>KWdUIٞpO9&LҼˈns>*rxrt>oik}AcAc9=$NOx`lag08rr?>Ed|;nզd6Bm m9&;r8 -6<Fg=3\j*gFRvWzkn<7-A"PֺX$@DV`Z N1Ҽݯ ;O}Aqy^O vv6qo; WǓWIv 8YC`aiw|kFn[*@:n#CKE] ԩ痖9#,$M č%wzdw#- q0t$g{^2:-v pUpFSeKUa()7VHڥEjO_MViAhk#+vOi?eLCl6Œ8{-b m* [L!ҡE"Mpy8խ:wv^DbҢ4#\%ӬuIyb cx_G~:ίR֥AA׃xS>X%dq#Fr81F1:LZ wWo5Z(b欏o)(j1I[X~;k ,lp[a$kھ34IUitc?wMΘ1,?qY|ʣݬy`斪0c1]Qm.y<zb[]Z\Wcb=j֭ys׻ 0vea1lj ݀c@?2UE[3=?h9I&tkX[g8csYJn ұǁ+˖j-G\?UWϮ\ϧZrm˗A&mRTmP{3!{bJ`SXMS!#Y&0AJGs^FkSТO [Z,@֫FzNKCciϽpSϟB* e%]s@_iSU~)Ŧ1"`#FazGԏ^> дֵmGXMʠU 9+۫Hi(ΌuF#;!X'DO~fLNa#xJF "J=3f漡 1O,uy9b/zTrjw2 %R$lӖ9 |A4(\@F}q֥@Y`$M){v9Z *TM`@9B >i,OWp":uhf8YZCGs'6ՍW M.dZ?u蘴:D~rA Ht1arp&'V & %K1TdL^A1UuӮ.B,rcJ3Ғi!vHqʌ8Xb3F:֩xnl4Be8 T1#Xz" +_gV(ʝ$i]gϷ26҂vps֫z%'uK+e)PrF@8'L^i>]k:QidHK1P ڇU&1$QȰxEe 3l{]7νQ5Ko@[#kym\v]G’=y)Efx?oom:s/߿޵:((|8íh6 ҳd~aZ>L^ֿ.e|=?z7>\iЛ>L WӏֺOGiU۰18zR!~xBH-.ld f׹ZY[m2UF8 } ~um&ZI$>ifӯbas,(A' jdiNFVi_7Q+޺ ?\MRFݎ2."mtڽ\= ?!g$rZkG9ܾkYsԕnH_n?)|a:0GI5gO)Rro1О 0?3ZB'I/-:"_&eHR:?*/W:uߝe9uW9Q_S6wVer1㌰ O8~o ψس\>d-܁2*8#96)ESɽ<kzO~ŧZ{^*651k!`eqd|CMȖ!F8sПy$Z֓۬v2Q i$nnzɴkZm6n wF3zty1}jzVx'Dծ@Kn9=3yʴv?Jne/"\.eyZݜ0Bf%` BK=N-Ηmz1aqNjI=XF*ѷ/G9x5kLpl;`Ԛ^yfϭp2`5xJcjatm}/nK<䍱ӞkU:K-1R|ާӇo\k51j$6V tS;\oj.hjwMd7 2{Wĭ%4?=aF1驆q'e)\NR[$?Ntu&Qux_VҪq9"o{T]?q-"[6U {wZƟ*[V }*^oϊta^y:m* x` zOsZg؄%A+z yޱ>uc:Y]0`\c+?dȼCíE|JOxuy |Ì3 *>~8rO_c(FG!7­m6F3{+wx&nSsQ.@'N:}IQmrBH̃|&6O$|K2)+9-G%'-#sn(Nr%G=k흴XضT`zןk,$=I$w][0XB#1߯J՞_ؼvQt黭nLћva#.1,NrB>[Ǽ'ǾOoc=SB [ުs>cԾ$i!tUv$DS`aH$k:Ĥj7 giڅ ȗʩ x-n"ݴ>YN_ d BOZTW\|sGɻ@KLmP&#}g93Gʌxqۿ5Ea98pv}y7iRCuM&eei*5EW/B? Y'iD1Iέ嶿yrf0TWt. -&[Io'#9ff u<#M2-hmC8:Tԭ&DnDB zMMk1!b)<9'M9Ž4"^=nyеnxsjiO`cr w' ͞@=+Rd'rk꭪V1DmO]r~&)-(PhɷD*2{Uǭjg1fgBwcY^h[] 9۟"s݈mLf6GcTӕnjE"+$nIl׽SӬ.Od a7U`Nzg^y亾qr&dc9:ךx'dp*g6S}GY_ H 16IHJ&zC[,ngѯpUءq[NkSJ5y-Lin1K,ֵZoFa2_}G_.~%X.QEQE="l@MIZI R^-~63ߏҖ ?&28_ [ͩuL8 _RQzƌgtm(m,* ێ VW-7C.% 0PK;eV 5?W[m#7$c5XNN+_ >7:Y<~b #=1Q9Q嵻8<' '}NZƯcE5݋}6y0FaЃv@}11:7SMup"RL^^M|"rVOzt(JUt>y,Ȗ64w%۰XAv 1Yq^ae5/Az5k8FPL7mI8xF񄚷$[kYcE,dv: 9<׎u]gt 6Ԙpq,8'g8&`Kq#qUh¹^W쮭/W_L{Xx|3צ8k4]3Rh~0ufЎK>4os3s?6 cŸ%ꚔǗZn/ZŮiqk'4e /ۃyԺe)jWJzju5yimuma_݈a`:[m>[y\NOW=>(uyGٍCƽhdHϳ@G v¶(?y!#&5ǫdK@T,P14m_(*Āi&l~I<^Oæ A? Z^)nQMF9%@HL;HFvB3[Zolwۢ_/jBlAS̐sIgtd2Alzw^ݛfϸd~#M驘/QmK5ҐW #1u0E̾Hs~&MsFѡX#kY&A'ϽuEզi\ӷơxK3zKs.'pI0/o\<l5!o<$|G6|8n5m^de&3,QWe#**<:P&6ҿO+,Oxpd nnnchhr}ky4=NQYi"N`qs;T4ڵ}|1o?]hF0 U-c܋L-m(ANdQbz=yn%3$j9%?: аIլ́sx8m'fWq僂?3WxTU݅lHr̸ OX6gqY$ݜʧ{ݞ;i8s.x]%ck}I-pM{hubVF9=t;&52 Œ+Ĝ=@5HXS4OF]7S¼f٤Z+1  A+4z5|{̗oo_Q_'g cV)oLHze%vNSV4+|ڥmg=I+ѾdծFV1յ-NA8Vh +8 U/$zRx茶"H [DG>vl`' i|L\K⽍-,I+mux-ߝ׸hjZQ%Bgpx^[Kv{x{J(mqήT{˳XBQWk'g:OAa+G 6NvϠƹ.X\) \^@~WVߴ3ι#OWzv=T%@_z<{ qn 6F[n}nưAc4UdO߽zf%1u};Y-N+Wo[ii`KmĒryǷ5g<ԍvcj~U*x~#&i*j]FO*E:JǕ#^\9nq܎0J $ d':d4;\#< (Hل.Sj|֎vYV6((޿a+:e|g Y?7(YZYQ.!uǛ?5m=Os^Li3tف+zTy+ָm>HaXt+*ؙArҋ,go%>yYO];Xs&d.%WAzVnj$v\V+O|V݂\\DF }tҴA>#k8.:y_;-NI >gKWY_}y>Q7B4}䕴M6Y,JťY.:? w>:fU$vќ du"ܭXýXm՛a/M~QZUiI-_,7?c mTqV t As}"6w.7advxX)]mSpr䄤i+Y;9o4Y%OY,{0Ii-+7wX-C$+ tȏW0̨ఏ-G}4Qt|A}/I4nNyGIk-l,j[WM-V.s` !F6Q7SVXW=:~ |5=4ob' ̇90h|L-4d j0z_iGVP2|X[GP*ω:&x̓) ; GtE9?JX*~e`RuK_pRij(Dy?yAfZɩhO $2LJHtHYuwuDe ɟ",)_6."bcѫZqUJ+߭*VwC>xOl-% ﹺ2?$^+揈ZdZKݡdۿ{J ¾_jrZbM>PQ zv5z>{!x|M{,W ɕRYc|UNUwZpXMy424$-IBHRs !7w1ʖǁOs->0t8e WqR1銦\]2|-p8WbQF07E٥^ oklsXjƃc@Mt x,.BDWzU2`ۀN1ϽUtv>æҍ ؎eksU1j\{[|#@`t1o9I"@>h sEH%܉1C|垃,֎Ef#~;C}dS$J8e y:L!PW}-kB~)#FV>O˨F{a@ҼMur BÎRnǺ׶$6ghZ]!#9:+וJqe/hShNF3jZs*C}0Oؚ k>Nk7M,@#ӯPhG6[{Ųƽ"LEW?|/K幻_RVM:tI'%(i\ķV1|HoQOKfH $C'8{(mmJ1f9T;◄> M㫛7"!|O`湘'2\x\DLwi; vV4k[#{ƫd0 O9?ؓ]/˨x F.kc'/+ O.e'<]m%Gݏ|}pkïYiE2bz'ޢwJEkre .I $SLj`7°fA4Q@m0JSEEwa ]"i)mboH#W#rС'WA'͚[?^id\c*ڏFRN H*Q*4^c4+B7ISIyUo EuڿFu㯽yw5.n/uZp]ɖg@? Һ+xxt Q[LҼy}ruO%Gt9?`@zwF51^K# g7Wu<^Iofw:޵ך$H8qW߆:]X[;ŻJqu# {K xH<;Ku;bEx/+^G#ʫTiwoVpXY=s֮ 7} ze=,hH+\ 1o c(/"rlmG=u_Eێ~sT ?Fs|<; l}.`,moƯIx-%ҧ8yxu^W.O kѿ6(8[H*kr=fB&Yai?T5sBB[]'9OrOJ5^XNڜ1_*! UvL){{ ( ( *+֙lku0cձnM4_jRٿk[ A?}Āp4Wkkk<2{rΉ >}^GmSߝexg͑:g_]-nn46V&4m*,m ~6Im7' G8<9 vWkK+D<ʄ#nA=zUa [f{\Xe؅eduOnwWqMR%Ho#Yc1D(di <&4[ٮ5 r< 3,~hҨ>Z]֭ayb")$7lo!FTpA<_ǫ]ݾcd1(܀\tUmjvWnt;:x&xlcʑ:9kMw{g\g^ypK.l dwW^SB62Qvm2;tD{|Ej+q@E 6͟1t +%tT;ͬ\\i0ɶ8?+tdj~<iC,.؏0Ol~U[>€="uY)|lw xףcf"f“GJķqKČI:[y&;r&\NcJ_ĭR2KW ͏.Fk?\/<3D-ĤءpȎvr8;+{tiI&,Q ^>1wT֙y*²RVnHdf0c{AEy%-nK[/KDwb p^_ŗAct- qk!~bph{^K-,y_f&Cs202T<WSۉnKI;h8?_((!]Cm=O @#r6%0QbGyŠc5 W(D D OIQ7֒[=N ;xF4o`dZe :ֲ7vX^[\ڷ-2<[ 6qگ$@Ep%Ԣ֩$Ev prLaXrxn4M$7oːGQYmp3?u,HrYCs? Ѡ((((((}jM>H~%+O=K,_j"0r{mtoud'%"fYUd{ p{g_PSthI"X#x;er#sOӼ_k=^@ֱobA4ds-;wj#e rSLŤhK3Fɾ6i 7)G xLwKUH= *!0:x"-^ 0¬JF\ӨSwی}cZvE*(vO4*oC9vvsZG1&A.rH0(ljmkY(y1, UU9!vwvO>,LxK6|)Zz31;pJcTzEխ]#Hen OJq{FN㸊)DHFǐG2SN=o1qᇁS72\~ u0 mʲ2ǵ2ܨ=>`+((H"IWHvP:'5%QEQEQEQEQEQEQEQEQEU}BP]IurA*r323{Պ((`˹   TPEPHёRCCE*)PEPEPEPEPEPEPYXw %bB{Ɵ^YfTM[J!X[cۆU'YOm^l nYz9_^ XI $@ 94iVTcC <Ʉq@Oql;q[LF1d";~qFGȡ;dИLrq$CۮG ~Xݵ-Iޭ FU 9n@4ny SbE]nF!ʰQ\9OI$."4Q$ 5ĐA$jGm7gf0?t:(((;h"E @Is9''5%PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP~@|KnU |__y|G8QǓ |f Zmj1O+YN:nӒL*TW[GEv-lZ|%mf+?a}S#(~x`JZYvL+^}.i}{ J〢Ơl}o#Xx@,o\^G4}w ?ފ#p4WY|<5[[i}:;떋x9ϱJ42J4˳ } |=Hk}/r8RsRQeQ[KYo)"w3W~'xm-D(5k ^[A%Ez |䭍xd~)pAOފ#pWGor lG}5^? [cl??7_za Eu2xđ} _d^nh`w__yK+e/%E5`2V}fZ_{F٦OdˬV-"XJWrW˟|u][iZ~ώ|Ei [=4l)GG ffQZk k=o,+OwG߆ .̢50ko xPv .ɢo)_ EYV𧉏MSg _DQB]Em#uOC_. EYtV!+sUW V:oV[G .âW Q^?‹1(DOBO( 3>0$Կ‹1Fk+\ң*r(sGٕ=ōSz2Ċ^_eS?ۓJΗ`(}x-{%gK?> ( ( ( ( ( ( ( ( ( ( ( 3Mvoo_ٟmSóz(9$]_Z[ zױ|G;|~O3ы^Okץ|v/O՟M៯˧"tTMy⪋|kmP`^,7k+ֵaSk8A.V,MVRBjDW *0zUq (Fc氚\=RX?#Ǹ55#e̬qZmK+)nP2I=OJ<_rJm>m6+:E玿ynKX7ܚ,\}l|Nzv'sF_JKw^NN.FzJEf#JEqc|D]CZ'cn ѽ: SCVvÂ:iT7`sܜ_+ú%7I27\Զ?0nh*_{w^}jwVgFR>nNGq=;VnRY7z°mNT?ӷ]e(^gkYXfO$MZ.xXZ޹u(+K$eٕ`xmz5*ZͨN[NA`Zs 18M &]p͜W~\=or}q]O.= u\Obe (%{RzSg^׉Xh׶Wü*j;Ei@$ڨGjQ꟝p6uj[ʌIrsu{nt0[p#nƷ5 ]4Мr'h:-KuZ殗sx [31ڠ W?zphBqNwfF̥ FkkI.XaAf?jy$C2e7?o:Ҝ pϹ'72ES[o. Gw!b_5(ųۿbӟ?G_^?_MO+;|grYuMQ,R{W%gK?>⼫?3"@sSli]Otԗw9Wv~[QX)p\c51Gݬ1Z.ƜfͳƎO/ ҰncJ˿<+WL/E@dq'ZO2Ҭ>mq{/ak$8hػ-cXZ-3ė#;!mfѥUd>޴1szwNMZ9C@-JxT&/zՠo/k/$й%d7>^*-BV%|!Q!1.~;hj]_!*K֠ۥ.Yw: ֹ[dٙCNrrط Z4zm$ġq ~7Ae۹aR ?a^4?|Vzoq";JKg/m丒ad_z|:ݘ.i}{RYj7N^HY-"n$y\\7~RSՒ&yN:'ƼF柨;5mݫ>?kMa7wEA.M8%+9Jj76婻k ;Rj~n>eGSҪG϶6sSǭtV6P$0i3v;mj`E #8֨^X>|(׈࿷6MpF t%i?M'uE~#> -'%L"Z+uVM\m+W _l& KXR~~׬Ts'S"rE #( W7$T"޾6k} &?;7EP/Ux RaLjWwcZZG%|oɴ[|7Ggp?~Q&^F8ܦダpy[hdQCGz0p1/}ꛇ8p2FK y}0w;v^Mw*BakRFyw3 jw3s`pδ"_e *pT\dץdEpG6[;{VƎi~kQI#ʍIܝ`:1[ªd?[ګ[$NRX\9+ߝ&7v4*Vw1y;XjRM4@#Z~?ujoCʟqJH,ҵ- պqZr"XvzG`w#Jl$::C, rvҽCnV$'A+ϴg- ѳ0I3?jhk đ#m:+rǭ4k9TrjG'$,mJo5duI ؗ^\g*!,8$WKf`~ץxx/Z20Q$Pw{8/v6GLՑ(5~a=?$pyHю9>~=q%zTc Joex:y^^%RH#>~k׭3HAݏVUXzEtޮs$jD­D꟥eEtj7?~uLX։Ge 6u \RqRh_e9ٟ5vGT"ՠZW\UZQ_皿jdƲ[&\cکxD 㺗e72 g8ǯJZ##;%@dՓ<(U$ WԭϥX>\0s{Wɩ_Tk[9V9]q*=2Z  gAB?vkM W=̢ }n9txQ[V8etD@9׊xe5QN}؅GgaP{'94AL;~`?_Ҽ+J-@B7%߅/.$Ѱv)׸9C]Xr7˺Ԋ9dzAw3$^=thas\)HڿWf|Cu%IMpc=nnZ0$vժIjsLa,J嗜T jϓֽHB ridm'=i٭1lkj'>D3ܿbWNs[S> B>3?GW#fIק~ܟVtC+~S覥?;35)[h'nr*E )b6: w=lbfԠV`x^ytI(<ތ%4j%EbdRs浵kU G5gpij+)Psv&ܙBM]ڔPT{XzҀw( J*?J|Ci2L{U2i3.Q^5'~Me_ZkHp)R;WKnljUwwni{IiK6 F}k{ 4)Vݠ||۳wdj-r[9=+j+ !A-*핔ᢟ,A7DHFk~6ہ҉ϗ@MHf46Ϲ\W|/;9y0[r>И@zK I-1.ò6#Mc*(kcRwًDE'?ëۉ?5 0t|u :u捧;h2nK8AױZ,Π >^,|aj++s8_Ҭ,4y#G8Ms?"smq *=}y.5->Gk0vȨ~2}qiMN%2$6H*TԔ>#=",oPÜ~uU7!L9vGMw\Ā/jk-%E 8 3ی"9Vi7Us=I>AwQVZI2':U=vd*TNZT؉Re#z5=q'U;:;7!e .0+ʣB)[iXdiɒg=Nr:ɐT z֓{`+&c:㵜gi14j5=u}+s+Կg[3ƆDeZb9~5GV܈˝I0 ᾓv_ǩu ]L,68մ#NHE 6 `\ lVjo{꽮w̅셁u-yZ[D!7k5Vݳq]sW%53557ݞ8EQXdoegqڻ-:rPzV: %QڛnO$QspHz}8Z=G6v2S|X&iƲ{\w3.V$MZk_{dvq=[Wڽɢ}ʃv *ά$3$0A^Akh@(U{Wã9&PRgt%- A*bN'7?_k>sX O'WIi#~9V{BVw>f=5i#Uhxv謭E'-NSW)%s%c.C؟\xe|1iwgx89E"\FāWg[4 $ݓ2W4774[562%V#ǭo|.|o1TC48P?.4H7sR NxtO ^xk\ԒWpK [׶@),4=Z0r,I#m$n;g!ӎ"۔ %BdJi- ipxi6iv#᫉hοcY7x_mSózO5W7$T"޽S=( Q|!z$njE!(V3=q"}CZ|>!na^޳X# K!Y6Ibq}]<]ɴiXH8;VEQjah7+#GSXڷ/d+}O WGu]az+,RoS=3g4qbGJ4>\֒Qu +{I\9o/%j2Ǘ)xoqx)mVcV~ϫ[;K}CޯאjzlyOs4K6ӣX7J{UJKC)<-$;/*r=kH|g:Ri1jh K`/剛 g=AבZ~F[=N<""\0Vt bF:zKpDS̉VbZ%[0pkŤ%հ_R}*ݣDfHe`~`jۈy^yXN)“ArD>Qh>*h :"AXWo$1Һ←c>wp^ >#ժGX }׌7?c%7`\0\1=7W8um`0fG+:!IHEͺnU*@sϽt]5vKFs1$S]D+siFrc.zW?*%ܱf`q&39vvfcOs]XZhˍdE{Ƹ-]5&8Z"Q W }*wyglLd PcX65$ 'ԩ 궚^m xt+-cWnK1,5{PS4 m6=*r?|NPI樔Wi?Rv`|Eo :{&RadiO?wF/ `#oDOV+/>fхnA2q =xuI?n\tadS=i=1A'֓x#8Dgz=ԗwKC5N1VLk=x>qt@)$ i`HⒽxkr] n#5ꛣ8kg="2UjK"̨8ɪt1rMz#>8{cP8nɵ{I`n9U3M6MOL5s ⪠֭jMٚB~hrџQKjc:wzma+ݰOi{dgޮz3;m Ek[!s)U.++;wMf>-'C@˴(ȍGP~-IҪhsp\.DjZ3紾/F%XeH~ 1nahHؑXZ-glGϴgkF}VkHY$8Sv1<5,5kqqF=9jh:y.:Xҹy\jr'ʃ* ݻ-Md1HA.+KY.gmƻJp%=\5l+K]wecY2\CB;V4Wr!(ɸ*sVt\[N??? xץEm͚{Gqu)wAW2< 9QI-oY?κ {e5S9%G0;X rV \޲|svBa]ַscA /s^e7r,[k2VKC\I* fXV0qT[v?ל\15nWÿmya[+/۳9n?m8> gHv I dyJ\Q(ۃAOP@4-BX$wqM"(lf=3^{g56ߜ#"]8ԋK]񬬊w{4x׬F¸ k VgSc{ @DC~̨^[,(G}+$L7&p=G5dBU2M{#YKЌ5 dFOlcj&b=0hE&c*F|֡zΚGńG__W߱Kn09| P%gK?>=|eqmק~ܟVtC+;հCnǖJG%tRI(CO!2(/jyg7B6jQq.AcTΡٶ%h* j(PJ9%EJ X-"v˒?RiA4JO*u74C;n9ǭt6QEd q1MLjA !* 6tf*ztZ=m8L ;irXI{';J: %r ֏a>/[yoWRHn p|Sm1I!RĚ<:ʹڢ]H;h ltjJKJz< 4xu;ԃ1CS_00k+mL" TFӯmMGW+~j#ϚWg 2$j(X[:VU׉WYϭB͝c+%J]Q#el~5az7J={ל[x Z^0"_ErO˰{-^P%ec':.VFU_8xMI[CYTdν㧅OU\>Ȕ>!G-DL5-%0XzAnko~x ]W)V~/躖&{6Ii_#J1{F`8'Z5Fr[+_hֶCp J|SE-0Aw=EYT6GU9×]Ndoa$ڧf>_7$T"޻N3ި~-(o`x(P:>@ԿJ_סK^vKO򈜊]'i!!ա)(aWZps`hcc;^GwOz֋\^ڬwlN[AyNk/Zݥ0蚎2F#{vrBqʹ}hֲ#>8[m}/yjKVt7j>!MW=rzCxz]cLPĬVL(S 1TCeXR*Iҋqqm'ޛhkH_%ZR[VѶ7`cq^-m+Au?kM0Dv\;JI9=ksSs\ƞ r|UƋmӗźm׬ +A>T]N?kq(?WWԂ%qT<='Q_Y< /+Z/T,-^(XzKh}bLӻWy@g?*☺ڦk>g%ZwL؋zJ89ȫw5 nm#1g3ECҖFbcv|L,ZjQU+o3V9cT<~*X3`p Uύu/!눱\GB;A}Sޣf ~ҿf?Oy;9ژ q^ @Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@} &?;7oI6aٿE{Q@; RKJ\y\DF +/ЗGERkc %sp4o97j6%֗=3KvX*W A8q˹K h %sp4~"}M{y <&.~| KZBH#7&TT:u.7 ~\?Mx&ЇoAV m1ϭ_ -^ROAc׼IXxG$+iiɸH17 \X΀'q? "W?C )VM^i^Kym")mݥ,[Ĥ/cp)/z"8.ndNluc ~DE>ЇoAU}3 ٮq",VȲm˕sǭ^0si|ƻ- ۸4+![¸yBQW4r-Ng.- {!ۑ桫Fctm1H`P>ЇoAQ ~DE[׵ux4XØKAb: ϹrERZ4YE#(c7M;-??\|<([78YUoބ~rsO!\fQN3r[#̸`r7М>ЇoAQ ~DE[ӼD^!m$*J$ld;0p09oP- ~DE[|#PPҼ%X^E.N) *2 Bkz+/_燼Aoh:^}Om#ݍw\JԢ9oW?C (q? "[9!F0ݎ3٠s-??\|<(pAm ,&yS+`j"kJO:m뙕]*ıW.d *¸yBQG+![f^F^}H{ >ЇoAQ ~DEYHڍ*|aIFH+KM-VdA#pCb¸yBQG+![[:ɿnmGvG@ۘ*b;ms_^w ?3?tzo+![¸yBQV_C%BɕtEF @rÇF:ju)ЇoAQ ~DEohڍVNt܌?$} n1? WAkZ6rk;vBA*YT2ǰ( ms~׮\֍\b5)PBe$ qk?-?h[-??\|<(XԬ->xYgfm"@e=[LmbkBORxA)},= \|<(-?+qxڎwjM,Q(o0 VA˥YKL >q 9q? "W?C * ?Gm, 07ۖH/QvdU B3|sWXIiY_.R&F#1ebIʂ:s-??\|<(yAcK[",Z,a9OS_O_N%wٸo(qǡ >ЇoAQ ~DE>VVk-Ɵy77&'ymqpS(f? gCFנ,-VheP*+x W?C (q? "kWQo\-iw2X#/;\l6p2WqɬEa[1<͛Cy G3OW?C (q? "H"2HK UMʠ&[Y4HYϷxIVeOZq? "W?C *KWZCq~OL͗u}^I•lr3e'V.ef0#X?'<ր/¸yBQG+![n/%,^OE,Kf#r?pvj Ők7[cI$RV= wϰ\|<(-?u߈/Ym/5)E ?dݵۓ0'xWw67KyX\>䌞3O!H 9̆I䕛]Sy$qagp63EV-n' \tK)^f ud$fctamld5EdsGfMC!q"b۾` zR{Hb@B4sȎmVV <Eg[hz]$Dl$lySZ4Q@Q@Q@e/tNE4GV/n׷/;<$K) wctGe=ݲ+&9<prp*;MB cw1y-Żi{=7Ii;lZܬcq `pz7@:6lv~i!Xa=چ_2E3OɅ89!oOj/ M/d qrs@WOLH<qDvĖvQ%o &Kq מ V,iIS['o2hWA7$|ARcHtN?LrGsjvH 6Ydʷ@$T5x~snvc(e&O4qr =@6"*6ɐvp$gviǑwiefmq%Pv}?kpKou 䍙1qjI, -y-RŶ3Ԃ| v-Z1o(B0PAѻu  ŧCG HO>EV*1`m#88bAMb;iZOE<&F>^wA#ixs׺o.-QYdG@9F]L zs6iַ^BF VF]Q4<}xYfoEz,c_0|}޴k7Ҳh(@0(zOr$x#sjAl Kwei'݋,ŘI'rxSXoZh֮œO ϗH8SMwOq X-YA67`v0#hNEKp0B8&]{IydA$Xđ$e`T9~[.uQ۴ö&$@",ѷ ^Hh$?2?j>؃c~v9c=i$DzbNHsVkwzeEZGg6Ho6WG̸ Ӳ((&]'cQT&,r:\Y[V3 mjQ@z/$z2:i- ܓZzq^B%HIn# EdoFkIx7. C+q3.t}@򢷂\vQ\ EM!!Ǐ,_h^c0<ZާXxy׏. dv+ީPx/o,a|W_7[~'{"ϣ-n08=_m냍QǵM<0+>fjo_|O{XX`uhU u8Uʍ+|gc}?Y)9;m>ߺCb8Z־B_aG4<Żn_ͷ8u`-=j9 N9X"d*.@9;RU]* tD*.%;pt/%UׅR4x*2GUuMwGZ6Ba/`3~z5}UGIgIw@p{1K0]٧Wc#gw $c7N+tc οoWo2_jh9=cFOSƚF5u7~ ЧRC7-4VD~Sjdj^TL 7Jf/^\QRHxRGecx3J,+.ռ/9cҽsm)b#vf_R F\dϥ5o>9T=]?Kg볷:Q!R oKSqE#p;#kվ" uӴGu\kW=u\I#c_Eg{FGVEmkVurP+E-aJvg|NjO⻛-QMv*>q$`я|s^^cu*GA^)jh?76W 0')GX4NCwSmnm0QOCwSmnm0Q,z4kƨCwSmyߕ?z4kƨCwSmy@pQP; {?/_5^_*6C@PCwSmnm/?>=C MTA^)ji?XuR? h?76Q {-h8P=? MTA^)j06?]P; {?/_5^_U?h?76W?|GEInyň0\"s_ moCWٟ#>GOe\-h_|gNJmL==wHwsN*Ēlp1uxS@886Py8-Z4mHFj}ЕM@HP{QB =CA[}+F%lJm<*'g{E gf\EtUAZ[@x>աala#FA<u)#jF 6aFiЃq*I +f)".ѻnF+E? pr+ -!4n0&/o|5K-\csWz8isCSCz7?Yql8͌'uǾı?#~(a[~%|:ԑ55۸U7p? לtg߮޶:wcHdM4J6%֭|ƹe/9,UGv do\MiZY.&Qvg.XlYAF=kW| |IozO ̎T+?tK)/ R[Sc/|}|l̥oBQ8QERR8{yMy aI%-,sW**8Ad}}*FB+6Hб ҴCJ ]^Lv,#=##n֨A.X GZ6Җw_ n~Xeb^ٚ" iR%yç{=^O' : P}85BO^eWf WyWq4vqq("p:B8VNI{0 f\0o]zYJ9_$fOM(ɥ} h+E9qz/5oW#q`WrSbѮLʘ9]l W!U1}a)4͡m|E8Jφ>zz8Wzf~#~f-GTcf@f:[B|G%u8"oڲ+'`H&F<麚 i7ʌb9z~RzT+Zk[if|Gݭe*R w λ^_GBդq*/>&p?[|Fϊ<ht\b{&wSrz6P6 69gԑ$* v!Z̵Ҧ)qجl{$QӁ<Ӳ[?^6k*[~]?e\+w3I T\={V]Վiy^L-g<~59n0FRWs w8Hdi꒩Y/.VwTV%D%yI#aI$V\zkt#D1gy:o7l]7OkhCI$ {qPI7%0%82].}R[ٜ18'=?T2H,1ry4ks \#~T_ q1]5}Qm,ɧgozxSԴFW%KW__Jmluգo㨭8T]iS8R(Q3wo{ :y'Ozs\-ޣsuq,D%uJ1ircSӎwO+q+rOIBHwSLty$uK[YV)fUrbyfjy~^*Ï+hRtdM=gyM O3E\?ٵy/4zEQTpoMLUd2 8P;ٿGo_o)-F)z4^9'$WE5iPF~yd c1ҽk[ˆzKC IUm;K._;l-3Nm6c c?J[hQ+Ωy)_Nz.P7n%h]Oc϶+nwN-x?9+fczz[=!Ob~V%A#\ g9=UfP65`v¨Ǡ\Pŀ+xȷiej;gZƻ-#iXub8籒@X]`O8#fS{xP~Up swZLGvuxz{VW.\'`OPS;?Ȧ8渫!Gֽ-.XF:3j?AF`>?6^z+W-5"OWq;L2+ъKyXxdYҳ5FpIsZ~ϕzG?({ZD[񁚥 ,KNa+J0ǒaܹ9ofd B>nq펵҉?rQjhs<|2J .pǟƧ%Y"mBAq Y@#g*5+؄wsѩ#< # [\Cw_1 A?HiHp#["ΐ'A߳NA{86)hݒNpRϳ+?^³&4kf y$iӼ+ #b+i'νr=- 4)@ 70'&ݏ;$ >>QTdEWSR,7<5Rа{€Gs75V4A{JlåDl#T<jŢ'5c@rP5 = Mހ:Sk{×-:Zik LQ*r3KXSy,ko˳TvEE5%Əw2y-yq\LG4A5_Rק% q89'cnLg|c<ˌ'#5m{uN 6m;kfr>KhEoF/ڔ.?vr}ʮo.+ճIڐ̿J1rG~48WRۏUm&ig 9rIJWCUE 놖MdY-?23+Io.&_7!빆O~5M\Z\* .:↺ɸ*w?QֶKtc((Rem k?IA_g-CMsbO@nO=}kXP2kgI@{f/$j2 *zcsܯteXy8T뷞!s`̢ha<F: c7Wrj7^t(?vs V[nt֫C>G{ìIm-d`M 7P-n,a,O+ +6rx"]sͧ-R¹6hZ0 ng#8{j{}#Q#!~$עZsȤ\= W?%6J{Tl~>u5Pqp&o(m&=V.XZvFOֲsR#JvW7գqQ򮠏qTdVD"`uRR܅ 6(=:bif~=+>"|3ϥ*H}$5uK {: ≮_Vʎ2go|eYF1w`dׯ7y9-s~ѫsƍy/l]ˏ:z P-CR)פ#lCOXTQ(R<ԟ*A\Vondxg%2fr[X>W?|ֵjBT-ϧUN Gw*'g.!Kg8kKue64Pa@Xv6qZDM!"X yR;oqo{WHI^Du$Z(_d|qMt߳~;xzF㛬8Yk'L[Ҟ;YH~k?f+]/Rek=ڼCʥN FIv>?mhW2 i:JK;HGSPijd3%¨~0BTy=j:*aҩDy\LTBo 1 Һr;H׽fmkYA5dfoT_TҵQĐT+WH7M3AnXci\/5-Xv\!=k_5s{x[݋VP%qҍ;##7iPk Xj+0ƬY)aQFNL}k 9 qc44g"Go`+NEr΋ 2?x,s+O!P_0r_9X/]Q*(?(%4"nv BZ_N#]}ư4=YlWYaX(M3nZc.?$uu ' #t}++hl3ݦ,Y6|ilY%?ζ?jZlj::nk38|41&CLԏCa\!0Q]>b$sw^HnPU_z|74Mo0y}Eyz/mz Kc^m/.0,pGz<֖2~c9d\kVV7s֣. ?މ`Ѳ 횿o9 9kMPYOWGqԵ:eGPџMzr{357[` {Y4A%o.2Ȼ4hz#Nv>Eh}OR-kdGgQwڥC2o .i-}BƽrRp"":Z.2Ւ­N~[#~)6-5[b&'d3[׌=RM4L>3('9orƺZh,0HMq‚@53 H;FJ9ǵzI.KTќxǚuVGwG#Lf0*pT2רUym$r`8yV6)K1O3 xJnjly(ǘ$nOW^mdPhjvL8VY__ɆYJJ(NJxųREXNQ]JwѭnfFDGE1ͼsTTL iO~ m'8,UYWK|{]YÆ8W^x#wn~ESm1Vi\^uնw0E?39UY⾤gý@t&jPŽG۾jD^'EPsoM(o SS|M0ܐE}K ׆qZoQWW:|hU-=_Q'Ws9{m8 f\U;H$79iR\`]b`W汩+R)3HAEޥHmP_EbjY|`q甜 };31 5ْcz=)灊-Xdav.CUUR8?"<4AQ7ޛ#95[R,tsu\mM6$eKy  ֹ]{JP͞HpeItUWbo4A++$.?Ű~o|(C񌼟sMW|WL~&|O 9?Zر<=xޖ$fn=[x`uT>KHբMs*uG5' Ye U r;քA;`! g<ל~upPGQPeJz[q{1U_6Rͦh؋7Q T&$8<(x~SZ |^|Jp癕*QO#nz̐#c9+d6%ռnns;~$PX`d,%tp?潛qpF4B3c%U8M[秖BsytO>?mDhW2?hW[>o<#hGl Ա楈D;.~R͚jJm1ҸWFf pLA<֎xAfkjW@$CFOQƙ4ۉ 'MQj"֥1{T6k[e\sһBM[N61w)V~a$>kU}1\ht1%{ i/⼵#]Eqr%YcșW|O΂7pTg^y\Ri*9\Ո.卆2iUs&摛:KmnxbbrbG@5=۴ff9eԖ̲bs5kc%ϳc?ֹ @J>ƶ?k<{q MW Zugy*mzYA?\zd{u`ڹaPA0y烊ЮŤ.8q>K}켢Ibkk #\ú2厧Imgo(QpQqs r\4.gAգ w~²/4Md/)|˓ҵt锢혖 1 1)5} 4#n}nX)B9)>܃WG(1H[KiܩSʹ]lsƽ<1Z-!GxmD'V-8(9yp]dv;G8VD h񃎧ʽ9ԗ?*f$Q O gdƴa#br$8z |J3ѝVm;ɸ #?ߝu7ȑIڹ[`rOjl*HJ3nt;k3?iץKoe;T]`2jE$rmYs~$r6Q pO'U;F8҅FΡ Ŧ۴' tO%lb/] GQ@xRʗش.#= vZRl1,\mypݝuYdlmӖIIok! mʁcں;ݳs-KK:58&L|L9 pq&QoB^|"O(dh,ڨ!k&mմ*ٹPY?uO@}3RxuZM Ytr0sSڸǑ%=Yr~򨞋.tJ+AP%vJ0έ}k/@qp1E'9A?Jb6wgAcБTQUkqs?ľ|y|ͫx[ÖIszT!oqB~W[˲QyS]sJN+#5H(I_D-]SoC8G^OWNިcPN{5fҷ )|1 j=7nsgj_ +ޟ4R7b8# c@@hǪ\'EAtF'eBC c*8kSK]7+Cfm dx 4+cZ(梴Omu8?#4HUoƏxkTƤZǗ]Ke$2>` $+)J]G+SUiӋt>j^OʣJRe홳=UFg~d>A["E5ϳjjJ M::&Xx$-Us- ƾ.n )rbHQ}m`Y"+{ux_lRWv>e9|gFKk{V3rZZZ kٵvϨ~&rh>K[6[A$8!8 _ mG=Nysmkg g11y[U Dt8xW[7Ka=eCcre(Wap+)}b}'1Q (WBqOFn ::ugYi^ ='ܱ\rrZ^|7 ? rxz$9RHҾxR4ق4=mnlo%ḅI#)Tyhiʲ,L(2k{IJ?EJ-'Pd,OlVgq_Ceky"(C2jڭaǰkZxG2*i-z.oى4+sX/ծuk1a$c^CZ,-Ĝ;' x~fU,'~XF絧< Fj=I}G oᧅpvaɧcc-o!v|V5'n}k9ZXmvWOQ`Wz5_+Z\CYuͷ5ci֬07~Ю:zɟV#5>Ձm-cUɤF*9< E9:;4ּS{_5`zWm , Ν|Ђǘ!_Γ Ȱ+@4V[?F(d|nS´[GOt|CSl9Ң>c0G7\y48 3|O\z+տkpO}=BH1 gt=kī+A=rgы8`m5Va:TkcWm2'z]u4q1Jk^N\6a_ 'ޝqq`w;wXirXw~kžoCYHVMyG ;2Z2ihvU(q=j t1$ sk$- aïj -%8ֱԪ6gM)ϒ07r籯K4ME S<.Ҹ,A8xm[<'&HIW,>nXȯB 6' "pUc%h3_N=+.yYθ|ZU8tpԋg"(R'=?«X vfVGo֣hٶ[ysNYX spk%+\QD.n 9)]S-NӁ>+踊GkkI$@=^o|Adܖw T~mW^a;3){"g| kViKm8ّLd_$ʹ3>_\DG{?X'IܝEyp˕z?Θr d*J-P3^\ײǏSOȭ#)(쇟VچG%0ˊd}@ KaEeO*(>. 榄+Q?_@ԿJZMsN)~m`o"< ){6hxKu zd- )ocf }99dyts3Vwlk^ic'˔0qԨnL γyiVE;9N2rkȣJxMl(d4uxzĿi5gX#IQe>q}ޛih6Vof.-! H9+\:YVM]>t"f&4;N8*U\jEߙ勒vAڭ.bdkwv@=sMsF3P=ϯ\ƥyO\*BX`v<^:7Q,O*.ým{=7;T=i[>5[\qu20,Dmy$Visf9$mj+J9U'qe(Ɗݞ>U!=WA\/ֲ[LsOu)0V`=YvֹHOR;2΍b1Kw(^zq V$xd]24 >/ )W'8>H"4Z~GWw5WQlPrZ ˒}>|Wb&i0?狚uXLeLNre|ߏ0RZ^EDAwq<!gWז|/uҧQnIT3 ?SWtVM,k[Nf僠j7Rz=h/5:I Rg$*{sqKij4{m+OSj|p9f);=yww۽ٶ p=>U7AYJ<|QUOy;kY-[jz-Nt,E-mp Ufe֪xX|3ugK_-֬O׸A nbk'$|\FtߙG(FfW/ZΑ^xOס+,+c;tWKm5j$=e7ǵB~XY>$~cl?qOtԼY 0 ,D7lف!RP*ZMВ7 :+3A {&n+(}k>Em9hVE9QM&x0Llږ#\Yyx~ޯMNcW⦚(i~g_:+J$SJȣYwu48_>z#֕}r\4_O?k M36zd⾟4_?yK翩{|U)ⵟpszoSF{!j'žʟx=2ƍS^7oĂvO7?jZ//S Abys$mš"A5cW^o!GQMҼU|GdI ^rYcH֒VGg4ۺ1"4 U[z*\-bfMjYtJ#IN]?Xtjt(Y浮|U6S?ptVU&niN'h:j Sew?w&觞s'^[Es,<:<;}_Zi=6;)'T2LL|M˰9w"1jrmhg D/ b,KJԭ.ok"Fdq(켟Vp)VI5ghE,Wr*v*HǮ${˹˿;s%qփ^ͤ3[. OҫGDD&iUGrGs/ӿ"! {_1W`+Zwfz%X\Ao}r`iS蠜t?#ԟZnBԘ֗3-ᨿ㏏Uc lq3?+?G}z[k;ŹtHa$r`$~$Ғjw Ȓ;cL;A`G3'?}CIY=Hx~]Hִss=լ Eyr#BZ3%`Vԋ9 z/a|3?.}+z<+Km}w[~"6[nB[{E(GbwP_pV)xo/o2ۜOEoT;(֩Bj7f*c(SEvzimK2…qc{{ HBV~EԺRhe BXT(l;0pG\ӥ_sg?_s|=?OUֶ5+9dqqΥ Q{*+h3iۻ,??w}g?_r|=?OU\6i ['dt@ 9H'3u ;*T$ȷmBۙ@=s=?~_7JިAeS5+s?"xb,?ά0 qWYY}VdK24=x_sg?}KVe_3ׇ%J8{'g}6B"CvVK&AVGPG^ayijv7P][vK ѻpG&_I,(X7@ԁBcy?+ :.xq7>k\Ut6QA/y4j,JH{c4] ]Rͅ E9jc FNp'! u\ݽYDC}A\dUD`.$i썟f56C<%<A={ƫSX <_hM 3枚&\Z"2 u u,?x4O_OgO_)G WF3j7XT.q͸ Tw<gmI*E)/̙n~@d8gO_?<A=ƫƱȐ^\<3fXBbsٲx>};M{Ii1%"+*!<Qa\_gO_?|A=ƫeVopnKϱp>|NHbYq9*| /Ad;r?gk/5RGsc<_n%uW^.SD?L՛+bvFVꬤ AvQ4?CNW>6sӯ}R(JnU)_!\5 j EU$Bѱ\GS|S0)ʟ?3 >)?z4XuY%:dwHX s5zmsI{E-$7j1Qxa<[S|S0?>g?jmsEUf4ՏE 13۴?>h>g?S|S0Y|KȖ8rב[x>:CM Xg΅ng?f^ӂ-˥\HodHfq u$Ɔdx[#` f8?/CҀg?n]WLkmQkaNO(Hr<S|S0?>g?r)onm`0$co?%}wK[S/&7q/n?ʟ?3 >)?{tq&g-kKtZDAΩ\/_m)Qɉ89mU w#= >)?ʟ?3 ׷jmc]InfHfWhϣx<AO҅R$jGk9F@= s@? >)?ʟ?3 ״A h[BZ&'9Ϧj}'RլOf@*G(?>g?LUFq={fò" aoZ먠(( [G[SN3dv.3 Un1ޱ|n%ޡs5\p [%BF7ᰈ 9j{šxVk'yv.I恐 9{֏8DX,ŷ 9wG-Crswq-Febq8(mƍKK );n8LT|9}sb:-+d}ށSh =6EOK0|I!8!w%4{ϕLlkm8sר=+9 KS*b۔r@fOEsw,kmԢ{V . *Iy8#$nbn3 g 3׶1ֺ(1aԈ,N٣UYb{e?&ZLz^e2J?L{8#11ۧ0:䚇vyyyCpk&_K-}YE 쒫X2m qvtPoXfR)w4;#{a0+mvm{&+ 8Q@Q@Q@彿hmш uڄ̿wV׼3ͨ\jK-pa$r't>]ʨld|ƻ:($ڌrjd[]F$߇;>lI5iڤYl*\Y԰?)Yik^d^'UڎgEٷpvmv,XPPR ag?1Sj"fW>e,{] H5$UgSIZ=bgѯ-"awq%Ly;-SCk äEq yIfX<Ȥ 1 2pExFV7Kbfۓ 71y0$]+,$$ze~\Mb`RKCw V;|6Ȥ2|iَᵻAͱ `D"5݅̅wTEY$4hTL}kҴ=CJ;;YgK;(IO6 s9B<)3xXS3EUf#k^}mLj/6& jjW GO 9p{+#{ VۨV?D2gurCutccZI-HF9cT@档j7ܰVX±\B@b/oWGO_I؞E7%.йk`Gꆶ|Jamfܒe9 3т7/{git(/Y2v[$ch[>Py仗xQ-տ4 ]jmĀ68h܉Oܘdg_Yx]t,x6-2g$4">Uhz:QEqgWikmrӪI0lǠ9qMOs+HˈJ嗝Ǡ$9JТ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( GUt(X`2FyO4dciS ( ( ( ( n<͋wczfEQEQEQEQEr]'5/ghFH7^ sT+?K_uҨk?km?qK iRV?M|jQZ\ϧ@i+b(jlskO?)?X5)!wQXgd4}5'gdcO+D4@I4B>J?k|?hn-$zT[H(ŃV?E(@h4~`RTTx浍8[h~y+?j̅_.M>9}; ]RUM!Bi駥W;>+8+d&i:@2V?M!?@iX ]8.3\`VEu? ?hNSy?~n͑fN/ e<ue__: O1ZzWU(9}99-%10EWSW](kvUù9>ɐ һ(Ϛ)u&M 1iij6"ƱSM\eDzGKIf.=Mz%_W+4>((((((((((((((((((((((((((((PKL\p]V3C3C#youtube-embed-plus/screenshot-8.jpgnu[6ExifMM*bj(1r2iz'z'Adobe Photoshop CS5 Windows2014:10:02 00:18:47Z:&(.HHPhotoshop 3.08BIM%8BIM: printOutputPstSboolInteenumInteClrmprintSixteenBitbool printerNameTEXT Adobe PDF8BIM;printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@W$ vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@Y8BIM__8BIM&?8BIM 8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMM:Z screenshot-6Z:nullboundsObjcRct1Top longLeftlongBtomlong:RghtlongZslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong:RghtlongZurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM!UAdobe PhotoshopAdobe Photoshop CS58BIM#http://ns.adobe.com/xap/1.0/ XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@       :ZL  !T1"2UAQSaqBRrb#34Ccs6 !1"2ABQaqCRbr#3Sc ? & BH (B@H$ h A I@#CKFi0M 8h7Lҏ6"3ImVt#VMyե6$cJVk1r=;m b>B-/Dn &FRY*;3F&Vnh噏,gLZEhlj9"|DD|eAAVeIfCOWȬ;+qj#Fs k];cDy2D)Hҥ*qi '.[WHAIg\#nXm;ȸ{M)Q [[7e͕D}]P٥$9yu-KIhN<45;K[,aiP b;P~SaQ؛(V[^w,LEG05/S* '"Gtvҍ 9c*+ohاFF޳+,BJLՐ"-,Y%mº j2&9^bZfɍE-JEXoBɏ^_"LvXۇjWx|RRДIIüM15k9D̬q7en6΍fvLl#0pɨSUAodˮFTbe.7DOES"i8b6LnOˈfmTc(ghr Y8i#II L{@ L{@ L{@ L{@ L{@ L{@ L{@ L{@ I' ;'&BPʓ 1 Z徼ێcqęIfڒӽ-9ZZ;2E[9ڏ"s1>M+$,3w/rS>W3t$tײE>3PxBS(x½JI u+:hm9kl_*G-6+Fa8eׁ#._lA,np`No'˛ّ!\RjQn憝GwXfFc*R ǚYXwY"YWz+'\rbDVH%,FjQ1IM㳪Ei_Y&XyK 'eVvǚ!6/YrERw4L,اv>raNQao l:S5 q v*bK{5wѦ\[sW/f刎yD˔h4?7 #\uq2RMƔɵ7$شt]f|a.7eZ-'+5oAFU4qDnVz$nG.@i}!x9Yܖ#)&}o6^*ӏet9r~i<,d8gޫc͏YP&f0JWIIKl7 (OpA4s>E?˩'ĴڬXql oZ4*LL2$m%a\zJ]AF lvHNhȏxWQ%eaRc}vq[ ] q6K=1Nmn1 U~3N8oUeKIRV"[O6N WfnKe(EÍٿj-rV&Z6EnVz;/Ap27KJ5%+$ҒCѵf-j? _gӘ>VG32o~ b[պ~!4]ƌs[u;xumdɑY[ l6,XTH9N囌 " '&jRy{ZԳH<.Ycfȱoz7x&lsmm#dB:WDx̳jPli%b[ZҫN]M4Ivޣoٷ7օm2[NQeHwZW˰+,ލ1.ͦԗ|?RyuX:ߘk3e^Qo҂q͇2q?2O.l-@ g5l6WsPDH_J0O,zHW^n Ec?t䧪D.u2MG}Lk$SK1r scܷ&Yfr3cBֆ}{PgoǹfJNQ BjzFݕ'_]rGAIuS%q?#B갶Y;i3hd2v<ڛ?rihge7omJb#+>s]lkF߭|ǣ?Ӻ]1z}u<'.bGkNȥU:ed@mWi䪃4j2ղJ}p*ui, 榁J"2[9&l~skgɭ<0"Quh%(IА4F;j: K4SfND|,mY^qgoezIBI"Rʐ QW2"LE8lGi)4\7H?M2}fE)T2$. wPNZN=Pm*AV!K~1vT= Jbbc:YS14g;=?~} LYv6n"*O$R!\u[c-_+YNDG/JޜTW D%SZJa KKJqt&@wwv@ r; ]~ݐ\W|_wd+W/û`+0 wwv@ r; ]~ݐ\Ȓ+W/û`+0 {wv@ r; ^~ݐ\ȉ+NC\W|_wd+W/û`+0 wwv@ r; ]~ݐ\W|_wd+W/û`+0 wwv@T.In: |Ȉ,.;a[!AR0 /#z$&DHSGDgTgI%gwṵ%[>U4-eu'AtɆ~aݑR0*S&I!B*F^~ݑ$ r; * }'jiL;`+0 {wv@컆LZHo"(MH+W/û$p2e-ö~P5#y\_5BimS$*ZL08ӣBJm+Q{F|twGd=hcq18z]>̈2-þ #y\W_wd~| B% U2ݝM8N%YIIt|u++阶i4>4t] &|tW_wdh3 r; ^~ݐwMQ&&cqqџTo&B`zAzrhURqɉ3[~$U~Bwex.=]gSrZ5}Tо5}o}Bv}ٌ>M c1yT=mmIJM6]s.uLߦ|:}4'{𝝜=w2Թ&di'u-{C)+/?cMR +=HN*LSDb'E-(I!XBEiY-͖rҳXWaUUzXjU*%5#v,LD-%);~1OKMǷ/"nTݠ>2M:\=}n8Di}n֐+gӓ)5 Gm*TiMakaW^SNҕo'ɫQWNJr"Ky[K>ԡn$ҲmVv@"zT)*,Vﳦ⏼/)3wik|nhI$W-Ncjjusj=Nv !yƬCEe+o\ V5ߑi͹NF&VW7d;:T S_ml>yeq \vj3z U͜N1FqQTk1:o8y8btq*57c`'MXy8btq*57c`'MXy8btq*57c`'MXy8btq*57c`'MXy8btq*57c`'MXy8btq*57c`'MXy8btq*57c`'MXy8btq*57c`'MXy8btq*57c`'MXy8btq*57c`'MXy8btq*57c`'MXy8btq*57c`'MXy8btq*57c`'MXy8btq*57c`'MX1:o8 N1Ftq*57c`'MX\'e>$#ߒt^r{`r{`r{`r{`s{` $|TJ"LaQ= 7Q3 A(m)q\YYfgﰖDy[1lOLP>zQTܷ94E(*ME QڣlHZ/ګI(^M72Nj5*'NmQi;Rnk]+S}j$E&er2[ijm Q$ЃYI'@}:u.JTc4vq&ޒHT]BKpಹ;djQ8:4@㔚QcDC"2}M, ` rY)IL(dDJn=8Jm&Gd% n4(m+QjQ@ f%YFI鰮Zv[sKKdzQNNrҫ73]=Iy䠜GHOQ]QvZiʭP«MQc?1ag9 G3%JlY >?۽2;8::PL Ej|ɽʗ-#IdT[EoBU_iH2TLbIM%2ȴjR2`E /Du:FKr8".5!3fKܙ%RIzm-$,Zf;g?5o?+';['(6˽k{#u"֛1NZ)jw쿳NmZvmesʭ H9jkzIij5DJt!NuRSvXϒR)3-kv_? J2K5xpQ<8xڽ\]6۳iQ#y%7mSiCY24-Si2\\Y)řr;؛H i[Jj̿S:r FbJbITU+d4$*[ʬRr** RMQm{ؓ4:.5dEn5'zu1ZH%$=ǤɏQt7#JFÒl>F\9HQ.BRKpɵ64$QK*hrGR=Z)lQj2|BNeivAmaMSs)TwR4%4RosTz,T=,{JmiO^4, dW*&O ;w;ovtYzƀ2TZS S]Jv$Β| uez]wp̐f):/[`깙kYZR$]F[-P$eiX} Y͕|^.|e_??@zL v@ 5JtiBRwjhV,P`*d\i17$(q6t$6s6嚕)&⌜5mNcLhԨlNMAuDW?Q'6PZ7J)D3"t(WBE^jWS:bku%DOIZ` 9w2ne\IG*۴cD7uw{6s.J~KffSSQ;)6V&:?A >>>@PKL\?DMM#youtube-embed-plus/screenshot-6.jpgnu[6ExifMM*bj(1r2i ' 'Adobe Photoshop CS5 Windows2015:07:30 20:22:14ڠ&(.HH,Photoshop 3.08BIM%8BIM: printOutputPstSboolInteenumInteClrmprintSixteenBitbool printerNameTEXT Adobe PDF8BIM;printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@Y8BIMHH8BIM&?8BIM 8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM08BIM-8BIM@@8BIM8BIMG ssgallerynullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM!UAdobe PhotoshopAdobe Photoshop CS58BIMRhttp://ns.adobe.com/xap/1.0/ XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed         < !"1A2QaqB#Rb3rUuVC$dԕ7ѲScs46ƒDT%t5Ee&F !1"A2QaBRqbr#3CScs$4 ? oL*,B!'OitJ7UJҬ6LKbU!*u$u}պVPg-) D-cfI`:8m*!JٶfN&o."A'JX۫Vc 'iskQԄ53׺=''^2|w\ghjo-_ZiVBY[vAȄ[U. nдpѾ\zx E[OǺ9:Q]9:$EӪwO y4N?^9Fݟ5RW6>eiRTԢS>7ps̩i 'j63" #JI[QYh79mC Bz9/i"/+K" 0T& "n72\VHmVF\֦KKYz Q"( v|@&.{X=5=KV`- *.ʙWwkOcy7fO[ KKJ/_\Vդ4Fe] 'Zͧ6t}y.LVzm*'z87k=]~ Wͱ/F:<]q *U-*ZnV;~Gh5O2W=FK<2(STUmY_HpU(SjD; Kaڍ>oO/WEe0J.Ai쯪I{"m"MZصZLĮkrNKJDꄧ(5/o 5g ;*#UՆ%Z ˢS!*:cExtp[>C~dT>XhqK2ޙ(] U]Hc.h>Bo%^YN2VRU%D"8U+Z9,MԱT[IMg0TU䚦K)bj( (?j`{IS u7Ҧ鎡 a-v0Xz "UV0pZ{Ňԟ%uX C_XV[Mfļ՜Cw8{6(5`o ;UYqWji.a:<Ǩ_E_""%v"tZ:oiV =ݺ+& KK9YR")Nա-$Q|[cUM pZQ0 !62]qq7*p05z9qÜJ t%a-ȥDQ;5LmG%H& 'MfGV5ZZ/MLP ( mphUҗZDn7^FkC XRAtOeZ{U(mn;Uæ{;:j=6M-{]OB UAQvn)Qhv[1'j2ᎧhOmS\~{V~`TwooKŗj|eB.˪יB2dzr;s C5t[kI($~VhQjT父epQ+c7?7(,@fco.E^cqx7Vֶm *׫׫̎HYO '׬,ut@'fjIRhT1ڥ9Md@|ZV9tq 52.*8<)V-EDnXdr{ o*r{<VʓʬI=JceQ1Roveu[ڦKSK-LTVE@( (?t֎SiSeլJaPMԫZ W f%FڐTr^9W MkYḿ7iG˦QjxEuU 腈*;^aބ忒d)IpV9BK.MVW E6TBH8k;oh! .i.E#l2vWLzUt謝 o%MQ=3qIxr]1 7 6%揦W=.di>g%)]6WUSer˶cʕ,WMNqQzmn462ԯ[mb YVHujf\֒"BQ"( %_. Sa3$eV50֝ZM<"f~*Y᾿u`AyRrob8 (ll#tR>MQ<ŗWGoNw QqR+>+ۉq==m{{a<68d&,VEEN51x!AD]ehZdu\]C҈X@t⚰LPKDNe5ļ$(ǕB*d=RL+5̟Ý˃XX M7TDcxla|}ͣ# j?H /իFĮۡE#gVvW_T[~Io+-YY+ֹWaX6Vrps1e=XU*H%c.UDaTiW cY2҉qW<3FUW<4Jpl˦5u7GTuQq;l8<]5fڊXZ(yլgFlJikj@PU S ڿ. 3/Ma(zk_WBCL7kTpَ¥1u"#׵Vkʺe+}=bUf]Վص(jk=iQc [ڲW3U,.{֑ɧ>,^wu|:+˾QPX)}"*ءR[W,W)1`ڷt7^8u$^յ0#_11MLRkzBG+m铈9HkjMia &2RIaD :R,jer׫ξ d!oZ4`Y~Uz5qWE:+nVZ nֽ7{W+ĺ$GRH;tuCɟRۓr۫j71!.#xX=WIk^Um+}}]^GB|*vPA٬5^ S~VQ1ۚm k[GTK%s[ [qjcLxL^ZҎ+Nv+]э'2ڹ4MQjN$NpCVܻfe(R~94ZJ屽4V8I<ҤTUgzK*Yz*@P %KЀ0,PxuQ1;f!UQ8*1-;+ZSg9N-+lWNfK=C^o=wx$6.' AEFDJx<3(mw ^zW°iT(GܷxuV4DTsg\‘<6J񮇹XA0^& B*1TjY9f8 HDUV8M`~[R\SIgj'1˨V^;$+ryvR8 %ly]V+xksi K0wѩ'Ch9DVUjЬ6Y:i AjLptqZۣV\u8(L8U. zt<T3*"ka"(K3hD|zvӵy-J2YSm*v}4-%?m=|@URКԪP@P%z6^&0v WOhu|kH5K#DpV{nkme5ypr ~JkH引{F!]\vwTw{VdIa=5j-i\ډTSɃ5MˇҎ+JqOLc`0d)N)'Bl짚WK/KIăO*)E|=?٢999Ye+l}{n)|DԘ*(ڞv#].>r{fdU65Q;Ϋ-;w3HP/D^^9N}.t525q7j(pA[kqr‰eT:$V"-uSܶ^o/~%F.5KI@.y<4 Y ciPg,SwVڣЪ];hyEz֯NΒyPEc]%d$*qYSAM]5 iWTٖKu[]Oj[1.]4*S\ؠ2^{z-?jbɷJ:{ky秼U{KRji|շ[Me( =oe|C:=/y *63짏*"]LeijiR]}OqgXo[Q\mKֻxCڕyGh+9|CPGV?e6%Wd19iQ~My3$JLf9.HSGFu-mg 6+jO018hTnZKt\>Omu4"zľxE(<6.}ͺUGxw:TwB"mu'W17s:|իJoտbYc#,I"8ԓ@zkkKi/sn7ÇD q#Umu'W̄w 1$n[ o^m:u:8<6QSZeRbcnvj7߮n,rJnnoZ2_]t^-D_*ծKuzaRY[U|Zۢ {ݮXqǾ ]Z]W |M?ZwWV-Se.5]-cmKe[UOQ~vOGph|%^&gEcfSSִyw ȷOSWL (Q8U̶a, U=5YKNVūs}Mb"Dm2R*]l;{_kei.KZ燙~Ǜ!+O]PjUT@PA#uWV+a1TNiW/_įmXoB/BV^1"UrmmxoT-}NJ\4ǩEGܭ-)FN5x#XҬ5-rhOMiGb]ؔG&Qs!6<8|g]O(ÂHmԓ%W *WʮՀiI ncLԮ^Vf>ҽqՎeyY:|/zS–[_Ms8狺⥕;{.!G6Hgyz:JtܬW$1 1IW;c.8ymSq~wLpG0ڻKkοWj&ŽcZCʲ+Ф3tbHo"mFz<[3w&k]ёiQe4,'Bյ2b[Co%t& :KMyWthfx63BƲkҵ9-Ɍq)5^X( (&ʫԬ6W^ ZVܽ=K˗trBI%g,<^vU|7ʴ-0n.X"kJKDzNP*է_J.:*"WeHh)"94u-)=5^~bYj//gJÁN˚8v+{WLYz+v{6DNyVs)9y&Pa;ᛪD^EJb{iAIL XbEgUSp"T! oe:A/\?F2BLE]fĪL^>ړ;HNd^8D9[zTL}RNk8z"јK刐VmQK^y?|/w̻@H+_-wꯥwr"(%U !^jepуtUU2$E۷nũC3%r)Ļn OffMg0 6.ҶþTNm+yU^Twy:OFX#Vں.9b-=.>Z{ ◳G1"ص6vmsYj'57j,AK"%W]^N,o-7e{q a.5L4fOvb\ U#u验P@P0tU%UZTJ*՜[1{8JzO*"^C~~6>$ZkKQZ:#҉ĕ׍u{T=ıǨ2>%ź=pr4d>OZK?ֹ*uSzVn'R"J|39/юۭhI#ݢdv_r("^_R Լ\7Ht%JKB;pΥ(UھG0&EzJ9w@es;B]OT٪,k5w~Q^\w2ڤiql{*q| W1o$N)u=)MW-]^3e >zh-o-(PJ$%_ ٤Й/d=5IOl^=GB5u|]:%X+klO>Wn:2t)Ж+MSMKЀ.gcW|?DZ-yמ_WX78c^y^o͘d6WlxzpoʏBaVc/(zlˎ4g]u|68*iQ.Zq[lc+hyGT|qVM1@PA0VoZ]R)tJ=5ٽm. ⯵_=E9oxRTVL'Je1HcBZ/CįZYVm}2EN𶬷t|nqLV%ϏQkZ\~GBEYtJq7Qn.*tZp9-WN@7 Sb"]|@$E) tE[Ӧ(VrMYnTERJEmM EZ%` ZĊ?GeLJ%VxiTa ej!xEB +"ξJa$"r[Y6yQu1r(o `Bx˰g2aɞRq|O6v$JH/%Kf]Faw_Т՗ycK!"l٥m EnڈkAQ/G_tYؐ V^Ɵj)=zk/^g1,)^|C}cͯt} Izy.%QL‰]kNfYbɳʩEJJUGj-Fgd){y| VR"j.ȴ1WOR݊%IbU(N[%T[}lv-B%BBO}=݋[W+u5VD-S%Oℨ,}ڭ-^AK\[|$+~RJnO:r*@f ~8qNm7̆(w ="ox#û{ÇYh0:[=?`?0 n׳T_^c+ׄ\C]:[ 4׮O+}N*(龩\45Lez<>V?yՙ^W יޗ4W4{W.9[h^G_KTRRK ם!O^|u{t-k:pDZ뎏7ל+vMk^vίv$'Z'1HpBIh]b6+^hϯTY^ω\d ZV e ֵWgtzl*BX( 2-z/ƥewwW{m ]<\("RT!vtE媈]"bO*/L+sbt`lL[ t%P MzөjUƈPmuE[:$3U*ɭކ~K} ߵu(56^DMVyVEm,;e$TT±#}]kԘmUsM$/J(; Q]@N("'G\Sm6ծ!7@TWRGzV߳"PEVIet_^~Eؕ[_2c*{|HYXkkOM}M_=sULz? ,/MKoK[2Zۣ+̟Sk_¨z'7BJsꇩXq2U_SW&*󓄝jNTh$]/XZyix6(^EЭuO/ͯrq]zX^|MFOc \]?1Qh`*|~t@םو-gNy(ri^|vcVl+={Vʼf䓰RZg* '_BmYaOi@ОUJ*b( 7Y=iX*INoLo6yr%cʞ.mnX9UtG*ŏ龋YK𣔎A/}X^֪63}_1bm.)\ %%*J|(FjjQ#z{E慢HϪ!N} pɳmJG'JDJpK_5vv}h-{݉VDAEBXc9Y_bߦ9}+5z Z6]o:V-SL|ʉtudBrܯD/{1ĕ.HIQܾælK\]uMָ0Tæ l̷{զz]ԏ嫒Gm랖~Mq+_ yE!R﬜s.o\tP?i7ҫI=:Ut-A{E[L|E$+QkεŖ${Y8}ڭkLBʼc_wMЕ\t+\cаrAk''B-Գ7oWIKT՟rQvI]$6O^|^,fqeF_ЋWeim{il,Xk0qUkOnp*R\&U@P1l4Z۪G7qK}}I)j[#J>6qV/uqcE+=_:;FU#}%ROꓔi}y* vW'>ǏIWʩˉ}8S\s\F-!d_ukщ|YjeP..jB>bj;t]VD$TAb*J;`ZPn T+GuEKTWlVhi/:Z'{ Rh.E^Ud*І@Dro6Vgh[C/ݨ 2F8TLTɺlfЍ.k} R|cF/]xP}*d)d0}s=F^f\5QnU^~KբΫTی;yeRGuVG5#ɒml٫-v.\J鸧Ү>yVHtOMsDm\lH$t v*/T_M{W>٘v$yBӋטhV+ֹZ\ze)С]{/rL̍ZD|bu3X0>k>{7&mWRLˋZӔ~D[-_MzTccT{)|iآ=qGĬ-UHa(kkA)˄Ԫ P@P3 =5׿T0nHɺ^kպVZޏ.̃IIZUVwvSOJIz˗ȯ'xVvw=R³/otzUYio-wWἨdCJ<ƏD>jK˯=Z#|b-oJ伺dSJ"l%i.VQQmSPIԪtBŪTEQ)F2$W^- U:zFyx"uuA-}N8{YUyvNM0r@uKgeJIhDa6ѵH*M4W϶՚ߧmNPtXݠ)z/L(06* /]561m/7GSKTD9:*SYMw5 PZگ\LSj߻nؕ27/k!HOMR'ؐ= Yس^,nU豜hiUoVؚYm^f>mpI%sXMֺN򧞺ϥxm?-SǞZ|?[]!d^35sF9M|yUU IMnWFbl&gpwWk/GHde/Ҧ`Zʲex5vA6R~p"zȒuf@P3)鬡lMbb-qn8-5v5<+gz W+Q*mO Mz) 7T|(\=Fjd|Outcrv-WNi e ZJU}(#vo䮪K+XpDa:쨟ZtL4[KQ 1[[^ ]z 2:x[lNS #uNZdҠ$ 6UV& | >½  aS5*Hų,z D<{}\ KR+ЌGq}r_JuSh mԈcDYͪu ˾pߓunםy}E_\:=R` g+YyTXUb^#3 9z+ ǕLiWn+]1/sM.zk[ty]8D#oWAWGG╍.~ij9瑎[IIpTթ,!-}dQtXtoou*,qE:m{Zk/Ï'RZ 7gD< E6ס8|ߛ32Mf @P92oN"t&Q$v8 zw,AO=FxIQMy6Tq6R(]8U2/ݮ] 89o+wW|pV@"."G(jd]U^%J_hp*/ׯOD;Ez\kqEڵHA }h{n6h:' T}Q_I ؂W6 /WO^$ΔTTI6}%@DTmu01%9o0|hJ'lζbi{Z⋌2ﴪjXX_krd5X"սR @<|bihʾjgƴ,|4a1'q yj%hLdR\S<ƕv,*8UO&ťiý*%y~Drα+QEx++?s[jZymR?^KV1=5n4_5SǏSΔn \..Į{c_/qh4Y3LR1n 0yky''-g<н"+a]te0G+ץk>z396(@PR*{NbkwW|췩֧nRqգbY$%z͗8&TıXwwH/E<_bKIok/Nu+*-9RlzxԮk'wɜlN5D^9|ָ,h'xwko"y?] qWE^z.1.x o%$^h*%$' Io?,8tNv4E]<ߝWה\k>M\ezmQrսxY+%!m_2%z>k5T?-"ye##Ge K" Ib@̼s.8--,^-R$8fCcAZ̺U|PƝq5&WNEV{Wbz6j'"BuR҂+SDL6URm]pTפK[D 2 < Kk>V\yXK[sRzTtUM*-BL?:@ !i[_\Zr j9j2/,Lt^!l֦nVYzZ>k{9ٔɩœҚ{ծ=_AyQ'\=O[֒ɹW6g6XKWUIdƅkm19owKʔ^|om[H{]XM+=vpCQכȯɃeҦu߶ W0لM,OG1cYj歵חθ[]~OWޞ%!)ktֽ:vDB"T ^׫_;y%UZCʵg2-UW,Q0(j@PDΏkKFG\x'bժdkkIrkܓbD/h0VuSWQRQT cjU6:~_*/Glrφ*<ұzO$akoo&'ty>$Ϩ A3:Y"PUG̽:i?6g:i)B!$o\Tk 9V3k!){dE_ThR3H.Qx# \Nl\t{Ȉ'>!>bU-IF"$kDCMz:jZR8NA)12 Hmx<6^Κ]}Ĭ)^:LDB[W" Ki̲g9;1)&8ԶRmr4MRuV#G]>.uG̿&{l<[~|M>g*%tf0尝a=N"RDEU^•y;":NUU]Zի|q LڪRaQf( Z<>¯""R׿HڼCI='ֺTCc0 ٞtO5xjyz+ϫѹ%Fւjo8<4Z%oPUZ_;` }?'O*W}&0V+Şl]D:ѲyߚǪ^Zk7T]/\0[}(I4#WsDEJP'-v]* H US5EM XQK Z'A(lխbP3CڄN0NY%Gpow}uz:ҒDa[iIU/T""|F:z Je%>$ UWmH$l_A%i# BM>Z3h֣eEZd*e]$j=IjGGSQj* ZT ]*Ն7ۘEC{j<]W5*%m?;MtDIgvT坚eJPkDJ!(lED(?dQu<^ub uۃd]%TIEgⵜk(gk?E#;}/9ד?RrGO<"rx]z:{擝d0$5L~k: *Ïŧ3(OX>vin') %Z"1ye AM ׺"1мU$D6zP &򸎚: &7UR;(.KRͩZH߿+mu[\l疢g s8\Ua>)"+ *t ·~ q^y21:"ZUz]]<"[X}#J~?!QRWA(uR!l$K/j&p\ +"-+uTZ >orYˏ(@yami"zn T-c\jUkXÃviRdڳ;5D[ez*FHSQ*f JډH(  DcOUԌ3/HU%-ggMd ⵮;ΌZ%)+lr| 뮱luVvwir^'%*٧FsW/.F+#^c-O P]:EKlCćرz]\R]dr$$ZdkĊ6BPI#-h&Ev*BO&͋O5JtZ 'A/Axj]=exԒ5RѾyۣ#%A."[^!8/E^g}|9w$%im%D/_s++$W8.Bn$!~ۢ' Er b3LH00Gwm5]*itg'*Sy5,ELۆͭ&U6zָ33l5WVCJpQ9&/M[<]rcԕ~DEpr]q\tzUV?t1ëX_ʵw|fKB2%0יݾQ*&{V-JTi-d@TMD P (?%ٯ6{nnVyoDZ]P%vUeI7%W󣌞z+ eDW3؈9gbVVwivs+WWv%Cm)crdH޾;E[Tb.̑޽/8|gϧ-iptWaA'עQ4m8ibJ+}C\fJHje 6`oj!JyU/L&bN'B[eJ0~.^H&eU"MMj;r[鼅ΝlTu(Eͭ<6k-[1 бu']g &p_B!UlhU.*K;kʓ,b [k[^V=ѧJ^ jbyk9F"c)Ed^Ulsvd1#ļ믏5 kiZ{brěųʎXbcstO}Wm#?KGW6VzSw̻qH|Sl|_Θowt~?oB?ܿ|mR|W׏1i_jcǷ [Pz/zkw{7*j÷꽵e{s:\q՗[?{ɋT <_>s1%U+N-vVo.R[d$.4.铸y29穀.FE[y_PF pEZmO^;Y5lHzMIһ)wA.m쥼;~o.@⒪+WTԷ.^fYlw=XXV\ֆV JZݤ7l0Nr9T(ɰ}>'ݳg1̲qj2A,}@d IY]9c͘!nGiFR ԻFZKy=# cOihK? l(˿}͓:'[ 0m?0ށȮY| /OWҽ&9IH窪?b{ɿ/_R˿}[ d~b.2?1 ȗdy}FNI[ ;VSR}LB!9o/Gx[ Nő?2?wd-;O_N̟)g+g/> [ 蟈?2~e-> [ |A^x!rf^ Df^,6n iPZz!xrܖfacО'4 XiHӠ7Ub qpf D {lN{:Ds1w~n>sr6̀#@krQlٳQzU4t-[Rɽw!<Ƥ,QlAq M[dJJ- 1uuE`՚:|Nz@177GKtc=:~8r|mLН)4 TWsm먙goHH*P@P@P@P@P@PAX9E} 7WJFc?ļf-̔I>3C#@i-U]H$* }d4ӎ#@ሓAE[)*y&r\H`rN1:-(4ˊ8V$A/rԜf IM:Y.6&Mu,j ;=ҢL!2O7RAAQw:1y[ÉCFDgA4(d<jՠs-p8؏8 ]7۵()tl뼭 ,M=:@$p_kx5nM:+)Ae9ҹhe7 h$xɔiIOIïgfAAgNs>Z>8vpT+)EA9%r6Km4jAdFʂ.{,)qm4%D_ek{6#)TcHA4HiRr =7pֻ6(숨# #gl !f:CM[$ɰq@A8ޯV} Zm-]Զ~şso-fטa@iYi>;B˺.܁3guB 4Wվrk?m?;?܎%\*p.sۘ; Z@d[5-Z=Zg3O^ݾgggw us9缗2k2jqIEzQAp4j/Z-zo[#fuo*7޺u)8yMUq.>艠%E3T- iӫ~_6s~lGV?qLGCSu&*ࣀ*Mv;לc\[-_s~Xyɰ:@+ 1щKJH+#mGWD?NXx%ϕtĿ,|į,|ehrhLVIh?V%|+K3+Շ_Y_'@~WD?NXx%ϕtį,|?V%~f|+K3+Շ_Y_'@~WD?NXx%ϕtį,|?V%~f|+K3+Շ_Y_'@~WD?NXx%ϕtį,|?V%~f|+K3+Շ_Y_'@~WD?NXx%ϕtį,|?V%~f|+K3+Շ_Y_'@~WD_N)ᏉyT_|ra"ul; *Ies"FWK$b/f 5A5#({4Axf|[k^>8![bDQE2+дD?NM@P@P@P@P@P@P@P@P@P@P@P@P@P@P@PM@P@P@P@P@P@P@P@P@P@P@P@P@P@P@PM@P@P@P@P@P'vMޚ۳~jKs_:niA~LD!a6F4H.8:cX{{:LO[~X*y/+ƽGi S.}-?E/o٥Ly+,3b8mN`Q A1Auq\wuj?n8Rcݶtlvkj쯽U-ֺﲶ˽گmORc'ΑaL|܃Xˈ,QP:ӮIsFFUGYs;4G6z}_!+^^suj;9T gn.+bzc;{}}v;)3_k>Oӷl"K1q$*ݥd( ( ( ( ( ( M@P@P@P@P@P3d;+Ɏ+hᯐUiQ3+j4)xiX)f6Dp %JqϾZ 5zeVrkZӛ-59br GIg$lv9d|Pq 4Uq-OǪ[gc5V>j\w8Oiŵy|Ʌtn`OlQFAEZۏ6MvvӺ_Rbި+K?wM /J""zGԩ9XqiY#p9 -KH`6Z41> }Gޭ3@_,|큝V$Le%["b9N.;}S>N2#<*Lh$>KowvKc-=l[-ޯgoz\Gt]>}=ݵ}]ɑH-a`9z ɥ ^TI;wtNj j)ŻOM7wL}ԥuˆN"0(@P@P@P@P@PAM@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P ?D5=g%o"S-ǟ H9tKflKMOdx2gLvJc\<&+;{%ϑdISǿ O>Fo^vWY_4f3Y#H~C LG9r%҉ftSd/|%I_5Yvoυ>'ϛ~3SNOdtDUl.>FS,>r r+3bLJ&*>F>&Nc'~FO&+O+s.V=̆_|ӫxngDDt-dmLQ2yUUS<1(D5g'v$3YEzrk|_LEVdgqK*C?u%[uQ۪%YY'/_Z@+^ϾKJ`ũĢm$fqqBi%J=į>J}5衁XIt[*_Z%͌'%J'EJg%~"֠\4*p5 o:M*1S@&ZmB3$MH67RgkoaYrYpe]3-"KaE) <"}o?&?_M@xE$ߑI#A~F>~>7h~F>~?7h3 <"}o/&?_M D4I#@D4~>7h3 <"}oc@E$ߑI#AHk\ݷ8=ަ%yV7JbH[JDeQ#1n:\B%t_ε흰q<#o6yu]zms\SݿdC"Jv]i˲imH&1IQۣzx%e kיwS\GYhFMlU(j[nV-MrI.%_X!#h"zYz;qGeUb k~rrN-hD._1EjE_JU#<{ϱ+ڑ"|' r?-}־(y©V}VӮ{wnƤ{SqSxƪK\iGBx(<ˉT6:#Z鷪?6{򽧌xs?߃h@Pq8'Kpc*o;k u -E57|Kc؟ǿbGvJot鬦'.JqZ[Y| ə3"wDURvf&zwuȕ]T٫j8qc*en@Z( PJ䍍W:^`ItVޕ'oZI}hQAa7U3]UG8uY '}V#nS4y_2F#KBQԶ:h+Vb.3Oa1pN:j]+툎;}(-d&Mǰ`,(5$E&+ĈQYmRz{HzB-DvchKa)SFҦz4~Cceߛ>^c[ͿTrT*() +9ZԴ摲`ե3TU&ΪdT!Ok~V{hg~E~e8kY%eh+Zg 6DetmN%bJYRTE7}:֩ikH&* LStza T`@wTAd$ҡf A&X6KN :ڍe-hL/1ax2@dQ5^ls $|GB9oJEaɴ{Slj9!Yit=S1Ugɖ0]&-$t8]U 6is- iIE#2""mUUZ!x5YۓySSnBMf''!EQ0̢UKfU90kM>~8Sg?x3I1xVT@Pp@I"j#-VSJWN&kYqAK˒8WݰU/ˋd嬾lfsaSXꊨGЮ8w޳^+'.gc1n8m 'vkD4Â%w@P J QGSžeIW=PI}+Y[0q?8J43̿^c)_VgGXi6 Xx;nY$*d 4۹m>LF3at|i#\+@M*%+ 3+_:P!̫T x/I+{P]}]5q+\k^Of;e]!Y%NRz+zVWmzQ4k_ EOg^A<{zJjҩn7G(QB["[U%Xa ZK C<׶rVe[iegUR~_C߃G;v*(Ḟ؊X~̶֔gR QWy:RfH.moMν ,1K8*U}EԘ"rx(%VU^STDPM+oBzIdV3"҈KѲXuEWry'vqt"~Mp[ȼ]XV0Ke;KHn+LjCM(ZvltW2$9<'8tiTi[]<҂⧯խ":2=L݀1VOė-.׺6ЊmZsO w杘JώmS-#&FE]R]Gx[?3Ī5LxtE$q2 7L\zz=kMSX[mo~B rMy<̫jj(QwVZ&3e/5L)aE; Vu̴![ۗb~=UŸ(~ZWN*NRB̈zrC*ب\I:+Rk"~5ԙ+y*3I1xV@P *W]mDC{lR"gurvN^nؒN; vBV]^`%ԵDi4@J( /ԥex͡C5I[SFMJ:I>Vmtݤ*cyM 8T=ډt;,rleyoey*]kprFWΨ%h}6ي!7S5ɫw3+o#3 %1܈VFHVBճ%#3wb70ʵ$&*qTU6MQ;Ѯ#.@$O]FZITZgMㄨ:)iO{ *&}0*I[xf7eO^tGԎ7ߔb8JJ_9OAMn7Tʚxh$k5%^:93KR&5%#dZMzZ=߫QE;ETV:֑ ɔi"mdV$Z'%@Opqv FT/IqvUOqd/W>,y-DKtD֨zԐUpaݕ6y됑5tBO+kgѿ$538İb8|L"rfX6i2Z]S~@9׎rZ'Ng )˙iDiB胩dYuY[Dw=H q)s탢|F{Bz]s3Inp{ 0j:d Sו &H2!uQM&;^jJxc>Xsnd)\8UQoWu`pNclz֡ԟ]8?a}. tES :JլIg{Du3<8 UኺjKlFZjm|Zq^cle7Cjl];']Q=2sjDŽtkWĞM--2YSuAV.*=JTs^&'l/1TfK8A5dAtC]"-SQϰYe,[!j= er3.gsfO$!.0FNAae5ͮMEoKpїa+1hMWʀhAo[}Jx᜾/ y i&t $ | c-BGWN~W-qӈ*Jxy{(qdj+` E];ŪRg>OzU'֏ds؞l.W.lA :.]Z{+=o̙4/?Ma|Umzo{l^wKVy= Fetܜ!tilkLg9*kuq~qǷ՚r]Çmg*1x9.0Yi)ETݝBiL$$HT^T@@PAPc\מa^qi5n;ձjo+j 'O*/JCį&CZ[d$0DJUU^>s6 AAUtW[-^\M$ĺKZBТ @ڵ𥣑!ql;{YU$ik HWiם9"_^jM*n%S `rYL~5[: Cr1UvDshT~Sp群/*4_ry?uۍ}$}Sd!i0ڲ)!]hJֳe"+z=-=ӓjOR~_C߃G;v*(1GqV1QJ2o+ CʕӺGq3DzV7I ҈6lm%3 ?%?1)Q["R(Vi"p5xPn(7.֕Dl%x̽!@N;cuQ=tu|ijiN"5%4"S"eQxVZKZz? ݉wkbc IHBH؁jHio{߰/ˉ~&s2o+AOm*VJlK)̦<94d".GpAoKDtZ>LX4v|3 ~,fېe.Dp}zkyyS!pv4_&]mqGI"Z.h-#WM?o}/|M#&62*@r0cA*JHhm8\lӳ5Vs(.bʳ",2 %F[ӥ@]@bf^wq$',k ϙDZz!b( ߵםKf&'_4iqXwIxm" &;k&8a̚0@oEhީi;+_v9}[#5$`i")Ј\9[ƻ|kmbU{P'Pu#w&wAJ!( W 2Ms%t"*AgRoU ݓ)ZKڽu6+I8eyAPZ{kd{Ҫį5k< v;+bogdSMRV78W 2&ƈhPn{4xL"C\n0+*/UsQY;4_'Fڔ8Li#^'B)z+*@PbA/r0?iaLF m1Wʕv_'598ˠKoD|鍙-]-]lӵU-[KGr.U*$ڟAnzfp45$ڥ'?+=4z3Wb5~a7 FxBV#|YOW6yT`JV$'j-f9c]c$YgzkŠbSEE[1E]V&gڟ&3Ƕ-=s.&`N -Ve>]m.+L9K mv6 >e|L".!O*.TUVZZeX\;Q8Ơ֓4 ` o6%}}1?qr\0H8b1e+'ˡ,ٹo^^ǏLJ%Z˫AA:*`k B,t }ȥviK7ϫ28Sf+0h*;a;S;w3ʈ-6.<|&: P_Q5QQ-fi"^Ooz~u7&D[mj귕oNwrN6dȌٸ ˆ}#kikgm58`E@tMTD@7MRU `f7j>p|MBSctRvWg;c(3zL'#eHWYJFR#6# 8H.TM[j)6O(ԞtZVp8~%~eDMb5c7_%!_3?9*/9_b+ S6˞HH^;jTs1i'a.3@x"'UhD}J.@-.qlW4jvS%X2?/o\׍_~Fž%qDj$@2K]Iv],/1z"W9MzFSb" uǏV~q{~Z>=_I+̆~/B)ʨ]v_=^ΩIvѴԩRiOۗMM:,K*-$9X솭 sDD۷eƣ)!7 JeN\Q]W,K}k8˷gM}7I~aZ[з'歭Ypܽf~B7Đ񈒢[Bd;1Cms2G0݀ZB1v-HQzUej|o&=_yg늒#: *bբN'vPu͡[!z9xJczThoP?e!YѝqP(dk@naT*VcН &O2in֭lT `K}lAG%CF4?N% B;h tbE^_8NMA .%K*^).D`SU\lQH(kmҴ :`ʧ7+O1;*9ڭN3 "*TiTZL&%ff56jAEZ*m1"|Iǐ6HJ .&2D_eT@Pb4揝:=>vȉB/dIVv0x}'x4wL[}Z߷5y+g[DO޶kdL#G8D=baѷ}5WBmias^p8sǼhrvkAD{~gվݓ>[۔Ʋ-2 &γօ w)NGMF!2o}EK/N÷ȶ÷$6 =)m4JD!O׈dIm婘SZgdjR 1[ TaUg?e!Yѝp/gb.1;Yl^A!K-u[%m a3)?:Q-앜S$}D&cLe]UW76ڝW:<-EG|'[15-bڵk]QWܤ[$F.4A^OJՆcXD0 +kzjbI/mWE*%Ε(#"RH͋HDb[0Ф.jZmԽ_AUO7S&N( U;+3XŦ'(o9 ! TEڵ G˰[[&K*mD^}v2Afs$BD1E𺨻4S$2b17lk~^PN14{WGVMcE;vh;c( ނZ]u/seZ=SlMuP#48[.}+{,c$hJ^J ϐ[&[uZPEЁխI(J r/6BnhEڵ@CBŧ.EFSvZwJY5-@^zGьOQ9F1?cC,?1FX]x}1c 2ï1?cBfd~|=1|G'Aχ1Р-gc['-W>?FB?E#|_7?E#|_7E#|_7\{/c s#o(%qX\69Ff1MQIEahPG9wO2$QvC h(F*nDk|ǏJ5r+ L4DͿͧl&bkgӶ q_" ]m:>֣>2p%[:*ѧd}t&N oqoAJ3,=V}jvdK(EhS ?4ll 'D&?S <.P8WIT_qRfIb"laUSSX2IelRy#KN:2eTvs-7͑,\ѧl&nڿl-rNbdۃ!1[" i2A91ʎi-m004BBW @<<0t|G'@~<<0t|G'Aχ1Р?W>B\{/c s'o(χ1Р|GPgs#o(χ1Р|G'@~<<0t|G'@~<<0t|G'@~<<0t|G'AM2G xG`j1Ec*y"~Qu197$@B$kQ12̉ \wIT]4ȳ"\Ƞ$B0T48l]qr["Bّ!!]P^^s@P \qw=1Fw׍ӣ:k$ؒ9F#f. գuBlā}h%*TxDvVUt IʽA.;,5$Q4(hG&DpHĔ%2DQ0o6BW#$h J-wr(db[,iy<e*ah; :.*iyNNk)>\aF]ktH[}SqjVdTi1OĚQ+иLY!h6@K̘Õ@\5 Nw" mwi4ry3XLJ+3#,l0H;*ۻCh+R6B= sr\w* 3\WbdiCrYx.„M1'e8UaV;q0բ0V.5 ،mDHB43"s#"@PEs4c!am#UpPPEmt|! ;0GqIIl \ 7TE = $Ya+$A8QWP4Tt㝵iS8}:< 4l ɎnV\5G[)Ww!=z~+{ޠyFIz ̱Ɗ˒\i Lp]H XPE,9h0~vqPF\(Lim]R :qV=hPi߅K {fLjuhё wl 3Ҍ7&K$|%}SF,Z p8`m8\ cӖ7Lr 5yPpo@[]Tl 7WywhPI1nqrV3rXtMӮ) ;+:-hpsDL ɵ<ͼ5uH-1lɻ s b|5, % BR-":ځYÀ rQX&S 9. }ՠm+1p'ad>6#B[ {Wfb( hcAsSc`u xfmXA<k ʍ䱧 ttWDMd$|7]1\La.vBl,e- ;:h1AخT,Q&G@gZ:\2o rYٚ)0iuCm{@Zڠ`h-|6I66%|wn ?} ]B #ވIO8V?_V#no#BܒFc!@Z]* N9Zi䳭ظAD]q@PANg,mh6b+nީdEpڞkOGK.,a7[Y""n :MCXO)0pYnkmIEQtPQ T7oVҁyr$|Nes[:.AtM=ף^qY<\|ȉ3%}c!e>/6MFЪ*Cq <,4:Ȓ#qBMAg( ( `.[4j& _i&Ġɷɸ4lMT8ՠLVVl8'dH | T*9C@W,Kc,!4S"IWjWEH݂c8bx8^yQi-4rn9ޖ.Cncp:3N*} PZh MAȽ p4"2XwR*eMPjT74 A[Ezom:Uzk7Gf3IaW2+b\!$$9&Qt^ 2@Mr)5ɳ1Y.! N N22l6|G;: \XV8SH/?D+[a1ܑc@ICJ/FŷH=`m!~!p >l8ɠqK-A@Ȯ؉8FZw'c9t,{d/"4$*C@ŋaW\Tgm⡾(JqMw|7}j%5*3r.&dۢ @P@PGȼoDUm7 Qu"ӧmu r<ʼnIҝ4x$m]FUҎ & ;-P ͸>W8{. ]TMi@4iNBL{IS2ِ "р8"bOMF.\*m!oy͑A"&wF-P8s7(EI"ttdD}ڽ@74FQ%Ieǔ㼭]FC, ؚDSOiDD] ,gx2EfRu Tdݑ:Rޭ qGl'i6lN2!!h7.dŎOqv>QeHy5))21^;ZӺ |5\hy$a wf*ݠa8Tթ )"*Ɍ'v!8f zA͜R^=@ʳG!AJMC}OZρ%`4cˍ04F%Ton52.d&M+,M2ƥ1p8ᓜ6Z4nj Pq2SPwrnjؽ4^Y/0d>ޤ8˭ DQ͡&'wի r.V1c儆~.8[⋁7 oa iaURl|MЂE. ^ohdXh ( ( v1ٌ V$ȊFFU6Yh!yGa\l\⣚6MEtS+$z~Hh{5Lc&k2^yb, \.֗(,xG/6 *"r#jWAE0QKf̶#2@a$ mF%77u[T%$Č} f*A6IHtR"#|:&&^-C# 2E) N+wջc|  MJB@崼=״ (QƑ \AimIw\1!M˄zdxO r .ʺoz4PfW.w>6̕RաGTjOf>_-#r1FσiN2-l} >jnEjcE0M 䍨~yVIKԈAGn5cYQ5 &CĠCXvh:3(:zȭuq@PAM@P@P@P@P@P@P@P@P@P@P@P@P@P@P@PM@P@P@P@P@P@P@P@P@P@P@P@P@P@P@Pq(@_Ojp??N /G~'?)`??b~'?)a~<׏y1DKx0r33#:$K648ݻ~D/<9X|xQ+4)8 1Y85Id%5/ j㦭"e|&P'K! +"=ȹnt񓙰4'$fJ[oؒ6]D~&(+P [ /EO2SU|A_OcSx ?7??LdX 6ڗdXTôx5ϹvyY\1ؐ"EPqQqu]&0roSN3 N#oIttGiKbҴ1ٷpr s2>1؍6Z?}m^o|nƕdzvmiz:uF T88_' k^,?:/K/S-~*x6Y \$i"W=W="?ʽ㹓YDr/Ӷ2WfeUb#L"k鱠'\+M#+F6*i>pcL)o6Btl;/UgV3m"^ȅRk^鴙M穌m4TmYw7穞# G \r/m}Em8sTW_6"BDOU:ٺqVTG1`°I h3}I1e^"LEŷ'*[]A dJ5,os职 Gu;͈ȅNJ6h:-䚬[l TJ/192e2")8(H*+b8??b;'C_ZTJy>Is붼 ^#R>^O啿Y<)ǧ]蚾8:E&sDy-s^mwOI!.XO6?UߢFYO9#zb"8뷶*監O%}+]_~_e?{<0ʉmce>c}LV zx:m^'$9C G-zꍲi.y?j/,.zL''__R>^ai^{bOq29?XLi~O+?(e NX< 2ƒU(3A%S̴{!rV;_䧶TEK}.u$"D"@M.5a YseUSRTHA lْ OjVc "a|m=QS8Ħe׸fh0G''w #wb "P"}G8sNwO.O-)1 3"QDؚ JthtAM$F(ItEUK]Sm0-BI (1j멁_w~U{h[uDU5~NbqU] 6/fre+/E_DnX5p4 UvpӳROwSgw}x>pgԯK }u6ug3~kAFa%=Vi 洡Aڻ, N4 l+Z!ɳܸJjscM*n ұ<:jܧOz嗩X /!uP#(6b1+_3GgRCקN5^/}UM5ʷRzw{eM̟& 9!Ҩ#ktmz1b[[\L rHD6; M."߇=%g>r/hx{6Y_o3:"^Jdu%vx̲8Yq5(쯨񩊼o'nDU_etD,^^VeoUps@( b]W5$En积Yּz醻}_.ds-PUS ={.z̬`$#šHlDEU&a)N"4qHFPh=l"ūWTv3'tq R *!(`'T3B(`^ᐉu-Yԉz4Dƒ @Pf m^nFsuؑW\FAT[ 3̲ aZ|yo?9Hi.r hM vïORW8^.pIDw]${zi>2c21ʔDoE;Ew{URe^&3 1T(`P6I|M8|*L2r6ET;斏'DNCoԦ]S/W$䣁sxe$mcW$GH4IßM9|I|ʹbݵRc 3s .BZ`&ר^ȳi?'m/gZe4&^Ɠq6'J{]c dZGDCQyRGX''B&瞫į5&daguM]UY 77gm*iNʟhϩx@1n-R)Fw׋Wži}QBǴ 0)-G5î""8RaEƚMDCA%k/}ZJvLr:9 ٧Uz5 Jm[_5|m#:u48*M6^xS%S^ˉɃ=6/j׎2ޖ5_o3:"^D+ įOƫt+*6Hت+ ^-j]% [%[VgisU]xezqCVyNl% &eׄqݏC]pm5)|L%Դt/l7\s|ɺlŊ ," i~nu;?o!G?͢.U_?GҀ⹓۔a7҂zzz0N j5_]ܓYC %FANAԞ,ƾ,OI_y9vEmĺ:PlTٱjrnSBNc'iMiU'czj0׽W E%(Kڪ֔a{Le&'͒F@KUZDv-X$r^J6 fh^ʑ"iFuwɬEbߚ<ɚ.S*P Ȼzތ1åavU' Q:.ԝu{{F+^9ܤTX"s㦫G o{=\<_+\^0fqMuZj5U_zMZoya[r9 EAK&W\m7|[!\-f;c%JڝYJC N8K,wٱ:k~>cʷu84įnMz[AaRjs(<ɛERl btׯ_lfXV҉8k/7&10ڌD>~J :Z>ml^\׿f;~ϫԷkx}4FM ;%bQdݸW[w~>,3{?+o/ 6-HI2JoƽJyzD>=dڵ*6 i1{k+-[L:g.B$![Q5UQ@%غS{~.&8e)64MF8엛'_yd K s[NOHpqНhˈ]ٳjZ+MsR4ylnZTQU/ҩ? ~,mz" aYzYY[h{OZo\Xllth٥*() LNX%SO&m(!j+H\0U"ҫ}Z5]Xdz´Dž ąnB "ڒot&ղuMsťxs8oJ':@unRm=bddS6l*&zՍ᾽} zn5y(U&:_Yocp-C!ߴpFU[rׯ%gZG͠(7_G[3\уg#D//~JL6z*j3~J1/MoNe-09VDMj-|mhm_;kksxYBl yke%SU޽m4`+dq$Jj W T]{"C_;]Fz_OS\v}^zv%"Cn7+ii1Rh \N&-Q=_ofſj~<9[dǶbiTyIź{I.WG93jOb\,5I!\qL0c=ن.rNѝ55Ÿy3__SyqQH^i]CEUPެq5]3=+Wt^Dp;vhѫv-gW>js-o&踦 3ʷrUU"Tut::4z5W/nmfUSΫo]6CB Y(?€JYy N -_&_446d6IX,]aQDRNKjKxo<_[N AK"5䟍|ddħ}Em"!Z"O5[ں-( UjJ S $Z2lVʈHfбy<$$q(icWN^K+UzVI.ʯ~ TKUP^-D{2؀ʫ)^6VNn]jDYPf;(6wp%mT s8L>j'tncq.^ 7j%139b+uՙEHs#sOG'J.: %TԶ5߱19XncoGb嵨 Y=kT(-dedllW%@'UQh(M$e|`UŖ-YRo"EHWhj͜ӓlùL @-&H!Gh=I.ʯ~ R]?hɧ9(궘ET֯o5ZO}(A;KHZɵEզT. 1蠒e 0 U ""6-L'8p~Y~a$Ed*H /I bh|gT\(+O)` [)nֹa߫a ^ҊtV3â9 *IjW_s9 d"[/ TbUm}M8qF*çBغUU="HKukY@&9w橭^[PE^0`Ώ2ժd kHU9DF!-Ǵ[FBJ+/pU!*wDK ZYez4n)oH~M/Ә%y3TVzm+XoH3[דզ4+o, <pYV簚[y٭OOX핇<@1"Dž1+tF/Wl]~Om,|"J1hÜ5Wbc'%"(Z/iTH'U'Nz#8\h] hhmkxXOrsw-h@Dtkz18k{aDf)g&ZBDJ)'qݜq_-Vͧ׊eyq=x")I~tP/zWMk ﵸmzSQ[ajr,vX>A2'+YŔANB&@5k]mH+_F@[c€ ԤtMQ,E<Ȗ3BnZQU0P r**; .YWh{GCs %03*uГQ;nmCac5! *tfsbȮdFI甒zi $i+"Qq |nh򬰏2m̷l0"jC/<6TQ&7 F_zgsMNces[ܧࣄIP2Z WY۪%*qͱS jguvr:*UMEA$ĄmzjNfN("SCKDZasbaM} :v}H8͕'%qʇ9Qy._"{ZȭX7~Ln>DJ JQ6"W$^e1Xri7Ie6Q22E4dI:uf1m3WS= E[LkdN<؊Rizz)--XǼèd[FZ}DE!Ri-Wt11,!hqiU+uU >exI4$nDLeM슦ҞUIEg\vM"6]]Er־^Wefg3'<6&\K?a6y >pT@s7߃/Dk(J]0$j+zEu4ݤCt]bU\j uQ["\= mZ$ѷhQT 6*t}DL7nDn@6.OֿLO8:ɟBhЖcӺ,vLv_7%IN6J:J" ިSQk7Rk8FJ_F6ղjr#~˫B $QDPvզQV;-6ψXgGdzS5Y5Rzןk -z~DT-Bֈd:=K.*4zQ.UCqzU,“Wf'mLŕA&į=H|Ԕs?j%lhWb/Z5ע)r]@ݵ:JwD۷Uk3imyצg/- 1T$TvQ_{6Un#n33l$hzaMǺ'{{gц䌎xR xbFJ(IwGT||Zzu!$0u*i^UijGC匬^^*bJnc֯Zo.ZuXi(EU$B2+iըk]wkpxN PmiS]DvGL;l+f[LH-зiEP_h{5KZaK<\7[T_#WM SRk{"/^-b^UH'620:ӞΑTFR1X×}3q-1?:BB٭;\Mu f0K5?$KS %^%VQj5YE)e*`qmSpDRꪽ@-4AQZ ^cMDQ1Avܨ^$2lԚpo$JypKŷBTfQ7m=-ʈvL \1uzE^R[lJҗO4؆Aiޡf/Rk@rLH $+ﯵuYHmiSP^Ew}L?ƒU/@^"*"jmZībؖ-䬓"۶Ȕ0ˬ"߬W-SXU6ʟBLZW? ,^f`:y-aY[8Nx(ABOj 2qgv]$J :K*Tŷepж&=T{08ő>OT-"Z%d:=K.ʯ~ TKUP>>Kix!5AUێ}j3Ô6Ԫ-6]mRH&w. u)"J~# &# FSvmOGB.sfW0 1]6bKejxmM"3~d0zȹ oE%کZRZmoMa^$n*pY Q<^c:/ŊoUВdFdxǧylW7tGEX##@EBHǡDu U~ o\vG<)yu0ƙ%ժOW+gXQhl im嚕!1>L"KZ\;_Е{r!ͭ&1'.{R+)khW9s“Nɤ=  ."IUwpFNpU fܭr-jF=~^bU UHQ/ԗ_WG1ۈ6QkHc{pg}B!_o3:"^ERa %T %GFЕ]U+ZoI"!9)&a`+㺅!%vG"ٕgkM|MYʡf4R!7[Bj |_N羻W` tTd.9iQQV-F8Z\O]B\0L!$Q[*mE djjjDKuU[ڧ2`?1ƴɂjхBzӹ9_/_/N,/-/_/N2?P- _p^d~[@|;̶ZA$U_/VZ~-w 9 Қ/ d]|2>xe)\+{x ڸJ𻞱њG@qI8%+o.{TBxo<}-rq@H!We;xK]Ř*! ӥVB*^o |J 7pRVCM~Ejw#{DA%WʃbZZBӹ1(uſ Ӹ/?/_/N,-_p^]^Q.V>1܃i\i۴L2Z7(t|x˝y08-fuvDhPC-4w|ȏUo3_^cJ'F'UMڥfmtR!࿉T\*-eDu^έZ-"M9'O\ЕEK}#[Go"&?6 Q}tv(%*OQ;1ӔkәҎxwⴵC,)hJsˋbSVA:}f鏾禋}z7k&g5Ddwk0c_(wT/sE)57Wug\/?߈?j>\/?߈jM@P@P@P@P@P@P@P@P@P@P@P@P@P@P@PMA% 1Þ$rR 7 iw%E=+s$QB$!@~fÈM,FCV-h%6ARǼؼ#-^GC{Xi5<=CFLUgB-'7Oct ^7 3'[&FmC'e\P[Ƹ">gs1eȇ5L[ql vRDp[pjsdp!peC~3rvF4V]u2_5gP'XrH6duG$F4G"ۊpMcߴ!k s~TaKŴk(rI< (m]~5|vEȼr8[q:ܣGN; xzkG`$&sDxdl_vsH4Gn#67YL=`9Y FFH\ZVUiP8*(xaw4m̐QƉwhckC0 6$Wl$ȵ| ~{AK~;!൦S, hsf= H`/6:ɒ ٹstA]ư/85;ַp]-8Dz? yԉj+ФwL.Q\GQ(d]ސd|FMy\}=&1tTWK.: _g@tcb!D*dbQy`n㭲<7=KY|^1c%Ðشwp6P[K;2 Ze2q Z@p [,X9ǚ,d} ΆexB#nt\amP+'5 Q4WTPzwI"p{wUyh2y΃`UZ5Kd( ((1yD\(H< aB<#]ݧӡKɶ׾ccb1;a =p# |M cy,B.MPaI|[@2&X3 C˱Hi/.drPu63%cH+ra MPR A4O} RA0CxV>h5E k Mme!J!B2ndq]p#^yԶqpv4lHH:h!mH/ڠn<89CO*6%AKJvNTlF5w#TEXQj&upGKFk* 2P,)$aDi#'Eq]J:oQzCN_Mɻ bINKRzڄamż9Aܑ>BB8ʢ༢ @vΰ$eIRer"@un :Qn(?M@PV"r;Qs! [y\1Eݴۆ֝=ZymObI4 kNG8;Wةokd#-ȬgsQ;1ȔǍfn |\SKkX6V4PqFVuj^yrβ YAd Q ⋂^4*A&cFo LxbLEeLp2ioHq7(-FbPc!:AXB#qi5-[$]g,ͻF>J;=YknuwhNH!Ԏ#‚_7z73 s:BI1\Q!l]lt 68>x}&ިD 9݌5YWq.! db{@$!$\|=3!!w>uf| >X5ǽ`MNM!p"$n}^>Vr( 1ڇK^;8):h\Ay]"-^Mri4Ѥa)㬈Ɓcei`w7(Me07@eN4~H g79LmN|"\Zy*lnH##qyc+p[{1=ƀkʌ-=>0f":x|PIp6q%'V9!/3#KE߲k3^s72℆%Gq䶕VI9h=zxL'!y226m]NkfvGUlIf51Ra T%>pL. PonN]c6|&Y'ITWtKdiPE;Sdr@hC̫G]>;ٌa4$Ø2 GG7y>[V+XEFY3F Ⱥ: P { ap1-H0$:1 Ѱd dWN٠m;%&8Gem٢l0!g OFէF :(eSA rAbnEq I;\еzvh*-(Giuk"I GOWӯh5p:±.G [Gu .#77Z4q܆CpoiZn 0lfnuu:IIag]rX4VN/9x-:\tY+. RvC,D.nvМ7٦:|O|d9M"6+Y(}N}< dbKQlrob8%h-$Wcsw|-"""("M(?M+׺ svZF74qM h-N;jyQ@Mi▂ih?9ImٰN.{ùXjduvLB+܆*EjtOO~N7PM֕Zѻ{@qgylhn452ʿ|UF6̤o{3+ќ.b4M$oHN)2OVZ (?MRα6h87Kj$ꠅs}F\;:us6Gri !Ssr&nJ$ ف " -q{;rY6??yDptm w+ęp8Ex&N2*hS V3ӽP4,4oqq!DUxh?`_c@At<;"$m2 q>7Pe9F0w-VUEDTaBqN.q4 YEO{!cKō6.,:]N"F>/Qѭ:%NIz{TːcEu{3%hVqGeqamHv$ď.>#dGE~IP!#O=IIxUIh1tUkIkeh(a͕X%Ԗ\QJDoXi s) _G_>"7fŽ-. 5aztـF&%M(6l _7j둠G8"n6ե6hޠ}&f$dTrQ!K[Jpa>QP<( ( `@h+95%4M%`8 M n7GGxm8ӥ!ng'\ 2 դ7Crg0npr$Q=td V\ ˋ>LvDA0#zѺ !CP!E*ACҢ%ih#T {W!KN@~\ɇV%d1%") )^!i'A)ʙXR NH8Gzw[ 2/* .dr8lF'f[G}6+_ pB#M#H~? &fWUQPwSP9ss).0"ŏ Ɲ,ɷ m Gs_3˟u"dϳLfD4Rn`8*2#[G 9I}`Ȋpӿ0ڃAm 3v_\8TڐMyN6@yQiwiY4 9)qD!!UTTXӛr>&.Dv26$ҔtR h4{Ť8reKj+KeQ6974[FP1k gb&n<^A'xD tlډh* JIQSȴ( (g罎dr "BwQRm4B堮.gBg u 'm`t1q13Fi֞Rvp߲\wV uwwMA5\Lā fj M'tn 6vQ9"a0I6@ٙBOWkT\ŗrK̸+-/G[G,w}`V~o-? %@Rq3)`L4sEkDDj (J`[}疁ʄiRbeF26r ΉJ\{:;uv= +9rY8Ѷ6N Edj ,HeCdIѰWn>=x4\9ʔlHj( N69"yۇFiޠs?3O!{!AQCe_#M*݅?FNC܉-O6 ckj(#] ( Y3VĞmQ$O2 QAf1jސ~7@c@99LX[6|Iv\q!a!mkZ*̛gs 1!0 +=0Hh>zG-0ipC}B{ a1lSӑ "3Js[->څ/2"IGmIlh8Fkhkhs6 r*ma[VLDׄz Z~@C*lcd`%Ggt :(Ml ?ԩѱ/LH& O! 6ufn)h(+y*C%@?@iFLDQj>lJ24Ub{cbʌpS/J1&>}Lh&y̼O4QqM/{iͤfh% M@Pb-`%qT*"* `Nr s\]HHE3(MV!dT');+N>q} %hDhpq͸@PGOgCYDDwx7$VaZ:E(%W. P>0($7m^\Wnn6~ȷwh%p^f3R1E8a\WZ()b+E@͞^HJ96릀bF#@ GӠ7Ө7ʸ0G}FfIqhD2 iP -| Q10K*:8$7]tR_{ַJPe&SAj [VaOV78ׁk,TNlXD.aMhɸ4mw}![ lo7fv(& ( #͆9!č%i຦4Q$*]*Gz1djejv[{ý@rq6M^7x ҊNYneyoNI2in!畮+&.Zm.TU|7_j,l^tEyt۴T a/e6 Z}ןl!A&m0lMx1'gmD(m2%Ilޒy!A0+g0&$fE} "VcT /.aVxEJ,VN3  4p꺮 mTr+?A,> "!7T2ӷvUA9$ɧ܇WV-kZHb :1N"ݠ_ǹ"pc8#Jwb=%.hV.ZZWV頍c}`c6D$uT @7:4TraE OFtU]eKފ "ˊNg'yk}M [#Zif81)/ƍܙ=òx[cabm-"rGeiVKk'P}_MeY:%[kyY=O,w~ ~DòW:^U%,OQo,0Q3iUSpqtx2<#4G  =:5yGoj7{/<7Q^sWm:"AXCH * +Ӎvɮׯvy;y b'IG4OJpLMNl{h1ݠoW o-t=ڗ蒊}Ba{^kMxsqH**ۀw]})uo{dோ5x6ѳ&H^AREdVrgHVfLt/Q>Y)-BU%eyD7x*[JVv`f9VD5~IMݨ uu/d[T٦ LIa|֑ʢ[!My4ig 2V[&Kʝ=Uyb#AwUvy*&K*4} HE+jBOUϱ5ёF";'L:JU=pESf|>4ce &zo["^~RcVc.ڴ³fJVl߻Jr%5ZM'[3CY*-gh̐Ty+8n${)Է UFuZꂽoko^CʈrJ.@m[.kƜWTAtea6Oo: ^ƞfkM;R&1pVm 4./J(ezIst5q,OM<6^z*&cVn!C-mXx6Vښ%"h}5gMc;J<ݭKVW =M+w~ 9!+$Px#IJdU\.PТ.NJkLk62GSցl=&gfshƺ}Y{D:V涣*7ϵ"/!D@u_oѭ|Z~U:m+]4Zts !]ڳ/~1Т4 Vm-:Jf]Bj0M1]e B^cN&ul7wF5qkv~S~5ĿHcԨZ$[kTڨԕ0{#k!8mp$TbCn )*(WRO4V1zWV{9vbBȊu>ۦU~V׶Ԭ浔q ^%3C-T@W]sꇴដ/}g~ tQcM0!м TO{zMܬxAʫAu7ВY= X'_0@cJV-,c- lsz@ܮSoY9ىyu"ISTnCGmQ HŰHIz#=I @JZg^խeSl'_Q(mjq2|oX:t|`1Ѽ!Fi$EUUS"'˛uWLQvQ/la1Mw1H/=oD꩘C:)L/ bWDO-+ V𥡕kZ[IzRP/GSkxSq>a6ta-^cmE'VbDwm׮O#KD{#'U{Lȃ2Kw˟!~yT7x?߃ +L.Ȣ*iqԶ؝UDnXr$Lxɷ|}F>YOV2>곇ҩtq-%tP"|ct"% agfy%fݒahH׫F|^GM0qk)^УEŊ)5)AMET讧zQ3ӆqITg&eղyMqRԊ@ڣHcլ@֒Bݮ)ɍ̱])֛^mef֞w '`lҡ%{]>JO;OwT~Jj2F˃c$~D -GټzOw[]Zܬ. cZ[è7{=ltD?7}ŕy_h& Ի:R|E-aV9B#vꯡr Z!YtT-lq+X[9`UU_[;%OJZGwRzUL^[wȦUk ehϩYcdǏ,Z P\!FlνVfc.1;ٍ$ZyD $ :|^|Ļ""`Gk86|iߋ`*n5|F1\O)%Q[}u!˷TOd5=M; ֎ILr:/X[$ldiO%+8gX"БSʵH[ 9!7Q[Vg}#7/Z瞉/[~V{h`TR"-(-}];μx1Ovg>MWywr.5u@.8c죫گ̽ӷ1缆rN3mpyٚˬEw".|qj3TؖWʸpȶ !;pT+{^Oz؎1{t6m)EㅮEmc?2hf-Ϊ{#_g;c«Z,O(IXx,%r*EJ=~66UV**u/ ?Y_D)WwRBVeUGX:Nog!um.*8#ԥj5[D3h5pQ zE]7R"" emȖصyJ h/;]E/%v=9DŘ%4mVYE0U$D=/鯔rQVk2o/ܷ`DD}b/ԩL 1.,FdM #. MMt%x՟hs̜)vl8M}UؾW2-ĴCB3{T+䌏KֱH7a>c4Ym|W-"IDc5X}咶Z `+45/Ӭ^6>нzR8RT7dR*iV9F2ᛎ7 {Q[66Q {-K_kdE3 5( ^j"Z15fz<W$);-{RA^1[1 ZL=%M6-m"NL`dN VѫU8K̻MO~-f@/x/*JD?}_[%cn߲y?߃G,%Bo?!Oh{9bWC21ulAE_XlGYg6Man#D^Z=U+3|%Z<{ƫJa*N};4+mlb=Һb:2:l[AO^]gq7xB*dc[4OΑ Z!3!PDAIJxfLP&1$]/nZ g446TU}*ڻ2"IuD^ZYh!=R&t%쎥D޼yTf"|=?ǥd^Bқlm_s<)Ew$!Љ;HWEg[\tkhTѶkiRB*H[K*{tWMcokO3%"u)kD&<6.|ʇ$fFuEWKXH-azE֛&u\4e3NR۷W 鈗Dܢ=>a ѻQBmE t6vDa*4d%e=G R⫷Jۢã^fb]`&Ŧxch-nin>VLzdXT,W =.-LǼJ=^%x?)Ig1/mc-GS^|kOOhE<;dڹGbs@ ߋ!Oh{(8n[dMCeJ} `Őd׉S^[']yG̭1LOfܶ#%7n:27MJm-fe5h2zWWG+A0.K*/]W8[G4' (PDz鯛j"LװjlNڿ2"|xF leV_[۬)"YNEH$MqiȤ]ia˲U2RhȐ],3'Jv*'}mokukV+ !3 Es/IZC\ "yv[oJuR@p.{oֵ3HՌ|Y|{wKQWؽ*B"^>X6b/:į Eܒ=R^3:<* Fh"Du_q+E!3ץvSoբbgLO'x!y$g .nJ3W\gx˅{fmpЪC!-[~>V։zUt"_5ZM$!! !7Vd$ 55.+&Y GC.i}K.UډU4M^"&1n 04rmG\]"!zկU~,GU2 Fjcݲ%οhFZk)[z?z믿;uM6Lg G ȔN'wⷡnmETDyŽ}KjѬs K8^eHyn ~_Z39?)gl1zmEJL#+LJ& л}J7O-)Ccn顿13$*[ޅ)WKټzn9ah:FO+?xIڸݗEyWjןyɜ&"Q|R3rȗЊk"q'ݧE,g,'x\vtCx.`q%}k~KDjz#@‘+C=5ˏ7K DF:}je='ςJBTUt_|ҟϜ{]'53$%8:tSGtt'Q B6uKEUUT$A|c&X$5Y/^ׯLgB溄`V39@x#t[q$l(Ko&ZR1E-9G$im*#/ -b} j~Tza tz mm+KO,f=3۲$9ᶿj#rt%_JWVug) 8b=F E3.CEQ@EkW2D$Gx.٢lU(<0Lr=*ukݿx=橗J$ڊ) !?.ne/ݵDENTԪz^x]^Je%y/{e}rH1,m_Ix[%0dBG |5_S{q,zbQr>V$H4cT=O2=0yj*_JGF;=N~)o=!Ͳ1.Rx)L:RǴWJ/V~ }~%wR#h8ap~OYk[ʮKLk0 ;Tݶ7lqîy8Fr1I-HҋdeԟcJaٴ;6nʤʇ 6Ds+D$azQ6*l ފexmNs@] DVt Ulj%Dy'mʓ9B'`eW iUQ;=J~vֳ[f&чhmŘBj([dؗCBM_K3 Z;Vߓwc)BՔ/Z#W0LJ"KKziwO6_ƳT tVC[+›QDjwJ:d-*.ޭV}V? I UG֕Ved:g5)7ҮYlnMk\oላbaWP8*K WgtL80Qt$:4V,- x75K:5ꂛFȈȖUԂFDKR_hpU1~^%lʠ $_ZT eυz]I.x魢|bзKKSi$>4U*(θ PI]ܫGF'?e_솮G.cQ@y LcVp}+NGV9oA؜zdI4{8#O-t?-泇 X( @!d2PM)^ f3vDt^l ESXW˥+gMBjj*E/vB<%QQ謦+CEx[E2W5TKUtW =njh.V]Fv{HMxvlw-1!KjҿIG۬vxzi*.o6ɕuTW ޤڲׯz;==Q(/A8n-mkf1)^HB͑:-oNժ3=Uӫ"M]%6Qzܢ2S-Q#qՕEskO=ʙX7$R&IҵvôWu&zE睱BPzQn6xr#_r?ii: ~>yW<&D$?MDSٷƢe},awX !i&[1v^љ}Ir987k5"?1`8cG=LImBth/1\Jepi܌vCqe%'  wJݫ_Čg bÛY $:֨HjjkXu[8Q;.2jhh+D"}d`7TTNȕwpR(x(rEooi*fksh 8g)q7J볭SJOߙkdĄsl=-ڭkMs?13Y<ٜ 0*f= +pRkdk}^?VA~~nS,8VO`TD7t%]}ꆺ)ߚ|D?Zic8KC+wk+v>W4f2'U>uin _Nv=k⩺JfvO2Vw=m5OO:+<~6_VeHѽ|paˋ4%Jz:DW]h*k96 IveZW=^?+=4zz9O.Vdo$H<[_?_e"NG"G^xsMNb+;bYZYj%k*t [tW>])ڻ`f-6܀fh'QPͨ^F湪k]Ö^i ^eK'0knO8Q_Umn]JJvW&ϗn3 ǓS8y*NrtA#@T辥N'O"=m@ulS2sI!{0ee!%Nߧjsˬ(10ZmBxl{խ5Vg&SIHnl!ztX/^ʭz^?9 m*d|7IǕRe_v<]&Ǐ~D9{Q]+F vǰEmQmvv%Ve1 |TuSG 'SD+ЏTE%Y|8,6HQ/qU5ʒ.a/@⯸ X?m&c-Pqbȓ1E 5hT'yyOFLT\uv]!z|l=aW!~4rV[Q)،k-=SڏKhvaf$⚢FOX[x QZSRtU7QL[OS_sC7Ym ;`aBa:$4%TtⲦj~O*TQTfA $]^>ⶏQC(F ]6RkqGXgd^}N;y/pi[8;xėQݚP}m[o&q#GGI{6=ܺUxv/ZEyq|坝uN}U .zU]5&/ҌXiyu2<0jfj~%qq=ٙJ:VpINy. tdb;k6m< ,bD}nDT2EQ+BzF[̜}ėW󳄊L6 uMֽ׌|{zUZIUlSlx؉*%Oy5#V. /rrlkWϑy>6/jv'ȼZ@qFS~-oD%t{hթ1u911$Q_kz5!e̴_slOmOtc-r,S |/թӒ*y8ѿ# *z/4o`<>ELYU:.U&2o5UV9必ZnϤȤ(Y6Zo3e,'ȩ{dQSbSe?fGD~ *c~#Jms蝓?SO[>>l%"읓^S4OOy1d|Dt) ?s[fTWRh}ڝ{o[ۭuS]8sؖz:ܯ}\~?{M ˍ,G%"2jli+ O?գŏ߇@J{)yD;]U:>')ڱo+> )MJOG#[#_$OOQS?fD7&>* Xy^T+tiMٗiBҪG[nˆ̏Ȉ?)b%$Ev:*j`k"ʋ*/W*'ҍL#,.BWoh郸YV2}0d 9rF#/+vLc5)q l8(H, X2('*;rc=ltYmjZZ 6K]|ᑍ-Fdn":D.MpjӫQV1C<_N>K.z: z#Vۭnٗ[K ̚ ןj#dQ-i=~6?T|Oŕ$i81$ shnkNR7r:-Q}. >4o#@>لNu1zu+m%#цnHfnؐ" aE-~XEŦ&}ٯDw[ ZqߦhI;?ٳ sY4u7ȄTֱ{ڤki85 m\)Y#E5u$EKl53Lq#rQr NɓCv:dESجˡ.U LznJ[#&`g&aѹe GI#ݨuֽ6'[yO 4 atȚMWmB&rd|弆BD3'KQ"8ΑK UAM_FZFق ) ggƪѾnWTIsJ?%UZWSg֏,MMbㄨ""uUU؈AɎn""!PUzTZ( yqhTtDE.D:V714Oc'Gr3ZUAIl5u֚htŶ'%AKDJS$n.fS&d6RZ j(0`C$E*"A'GI5"p( (#&G-AeEmު a8-6j7%AIl҂:ZBTMFoVEA,w F) e<:Vj:t! j**Pf( ]u7]1mI PDEꪫ !c#8mIEWFmZy1q P訩QRj( (QA"n0bD=ZWeiApA]- !*&TU7+"ހBl0#q|Ŷdh62$ʈrc:}N Mbㄨ""uUU؈A!!BBK&TZ 2. $M!"EOT7( Mo3yoG(+s)!{f&:+#* S: dC"`s绎g mGi[GQ3GoucO 9N47[ kOWWnNsLdf64Dq>8:VW N<^o;K(YA4o/=("e\E$|K3y72>>PhӨMOL{K^ȫٽs G@@xhvat-3dA\\|$<f(٦[N}c8Mcb5])(.[X[1^/^EUIQ,Y(3@P@PH"KaD"%04Ja.*hȨh]ib ܓsĺfH O6ʧ8G˄a[o^j|{61 D8("族e久8YW3@GF*DP 2\TJGCSEdJ^,]<{a/(F,Ynue!'t:npxuerQsG*#e&a Gh:ui&kU!sGWJ]IJ!llٶzMӭNӂdBBeEEبAa#,EzQji5jmN˳X*HdBB]  pk5`yoNADBq+kM[sIm@HDƁfpv%9-1ږ^ gbdh@Pa4, Qlc dFR!dK%h( (#&-N'baJq Ϊa_ߟvnlN#SV$ԉz0Psa!)m"T#TE-4>$PtkߤMIB <.'hA7ఙTm2ћS-UiօKځj^]#38\`H3mL`@Kh$F4`'H'Sꂈ(?}";}ZA\ Fd1PŘfm#ˊSm4 u  h₍ AD(Ӡ΀,6h@$ ErڷHDn,aG ) ␢X4iMl xS@@Zh@Ӡv@P@P6" b4M> .K*YDKAqĺ k*c5Tw5&PH4(`:P<DlDD@PMA[pʞg fb$ѼٱQ$ջ  932ȎE.#cpQwޱ-D c岏cZ4$UxS44'Fۅ=]: w/4Q2YlxcGI/9 Ê)7Hu&-:~7*=.*!vvvۨwJEr< %\ c JF12{0sX|9AM;Ṡn9(&Sp81/"#u3[{:YfQ8rmʎAc(2ICZ+M;[I"3ܼx,P(M6{i=]IoLuٞ i H]74 sVO )%mӬltP[h{N8^^kC=r.62ajCP  $Eh{ާs*|J\,q ldhd4\ӨZ:@P@P7_2!q t-,ko-; v|(+%옥7VCd.)w/lyգ P1SJ. 2Fԙ}^a>q> Yp|䥷 0 q#J{BG9o$>hw堸B׶׸'AnMdD2gɿ9UM1i@h jqc-XE{ D#@BwHx+ל4Q" .x9?+Njt{A Sqxquw- 4ȟJN!! vKYw 3P;7 yimv|:o<g b0>Y۹ ZBȽ6ksg$8m}#N#ecf\/fJ.rz9LPe1?~1D#F3+Hȸ|U(#<ˆhrV;H( rȢz8G_r JrT[8Olbޢ)$Zۃqq @7;uK)d}/e`MH\'E]-Ta'Da9}]VLYBB=FSfK2X<YmbmRۗ\iM8*Z{:}^b9rT9O2r^>)<[yDC!ꀍ?!yY&zwS6 BT$VVSm@PMA<`}YV2 ;x1uPj!<č)ut[*z@P Yɺ%'$U|Bi~}\X ǣdU6lG7`ŏ(DuifCūO@A>hɘ_݉2MB$M..csA'.|%v1GA'@U}/OdHh% J~TduoAqUQcVHwaǛt  c<S%KM;&7?٠( ( (#X,vEvGmEj*G#K&rL\XohPh4 l"7ݲ( 7Ä?hb7CV_T@P@P@PxS;n8nΗB5]nSe\1q8_Fl\(fMȂIړFsB01q[0G#%$3)evq%9gH 7P@\gSqDFTd$qɩ$-ld zHtR{0-fK-TWr3- D#آ %wz .Xނ9h!19oYVG_"L6ZBРkmڠk弤!$STFt4I"8Dm:?{P+"_ϰQf"#LPh"Cmk3V`-k-eA+Qߑayr:m* v&݈4A\{Rt]VHE{t@8-bɚ(utT1ї}nP"VxuiiZ~4żW>pfi8\ǽ.BqE `c<* $,\2~2CyXm\6hK`]T@P@PB{N-8t}W )8*yբ)l>ui@ctkpiDUk* c qqxވr1soq%΀J8mCr2`ikHQ*:Ptu : 鱻xqjuQ-؎HNjj$h,d"fb0ff"9^N62bF;eI#R%1^.xyEXduPv%}loUD/]Vr(6=n^D4Dڠ"m^:mXAgwbŘvf0i>ny-p4EHvU>5~p KpZ>ՕVnړ^ǯ m3dDJ=㗅9cҝZFi_|'Oyg&ǿf|2ag~niǹuc ֬D cjPM,2 =Bay4[nUUU""%Uz(3/P`p[7@K*"'U(C0CC["lTTEJc[-$ꩠ u)&mZ -ktDQ!8h4a[8E>q[I/8z[Uq6#>D&mв"ի1nメeOVx{蘆|HCە0f!ɳQAlTºE;VLƏ cuҮwYj7էa#*+Q-`xBPŇG_4UH`i4V&;qnCN6\ lQRQqLΰt1^`3PE>YDhߐ唴ةXQIl)ZLDu&qS]:/䫿'OeE>i%O#?I~> (z+eN7?kԚ9mI#VVijI#Q D4쓲Goǿ&|GlGoǿ&|GlGoǿf|;dr?_~~=3i>߄ߏ`r{9/Fۉ0JpwS쪖W3|L䆝V\itWJk>yZD9㿅MMQ0U1:&9kI#L'{gð}xO,ϑaY#L?>FыaLXkLB#դd-%EZ#ZPoJVN#zӘㄾ+;ˑgeD -!: Jzu'PVz*YÒ_JV?0@b 3f# `F(h _xZGZj2U9%|‘-Hc]J8EѽuꥺXW5 n(+L:vʋsDx,VE.8egJ!*]{nՃ.>!5"™ƚ!BI.Jtm׶:#2c +raE BMH RPPAs umJSg?-˘eJȫI#)̫jG~__ i~z ک23jQ(-Q d4Che]?us\Ϝba !hQ %gvˆ#+բpJT&RZN,l)ꏺRvOyi>$mEyz21\DCiI|jδkWg+w#:L }UD\iMeϓNy i*iu艌.h&ȢEv\W^u߫c8,iDݵ/RןbᣘfwT!y+Fe9Hy*B{BIj)xf5,|ez ʲê1HF~g!" bƮ* RUUTÛawr%6+DCOV5Xk" 6MOH-ڧ9ky (4Eҷ]#Xsb`⢐n>ZhejpCvʢ[geN۪ WPĖ,WVeתPi0cJÈSSkuW!*'ﻐapU^nD|(m/3$6+uKے 'P7u֟ƧH qڶ؉~{kyVu_9# 7Μ5B#=&$-t귙?\b Eԗҝ*dRUS`Dӵ[tӹ8*QB)[?FyhS8%[P׷Ute//ȝ'DQ4 yh*j dSC&-/ ӯ[Nt"(VG96jt1UEEM_c>_NHgr QPEv^kM.JAɰ)nd_RgɶvLĮ)s73d\RZUʞUA[;Çt.veJ;s_1$U%&Ε샺N].t;EUfȧ"O :txwBu9?'0+*R}毨6։J/J.-\IS[Gy4Ib?q)>:zL1.|XFҭH@話QS]ut9_.LmD[VRx7 :? ĩO덜nC''r8>-eUB'ޮO. 9xh Hz6zU*r̩FDQWm]R @D5B Y} W ʗFӉ7 XEDaղ?-B@s_fU*Ay*~V,NCدTD'*JtC)%YSʻĭ^{G mnOVZ/ZnԁHa['U_K\S_u0mޟ.+Nm2dm%vc cV:Dm@iD:no"ejvvbr9T(%gH"חsi1Xqk27)]Ӫ1/"ٲsUJtI0b"EV1 ̻W8(L'-2& ׭"]"U'UcKXWA_ป}[B`Ql. lEckQuIQQ7I:/|JPHҦ<7IxR#VTA6ZREKZm1g9h{JV'&\ =*JIm;um'gh-yeW&ڑv[[z~+yWQOod4MQ]mQrҪ3tSB:Qm}=r&u"ol|M4د}!XϜq  T&eBgj|,`ͦ4M }Baw{y$e6˯G\&" H+dB[% ` ¶N{. _~;4ԃǥH*"ykIVCX.)t_RfE뙥F,nuᾌ]x-ϗhxμ96ꦒMmMȩ:r" b U}-ҵ<%d?М.oZPxUkݵZJkBD"} 7[*_LZ0/JVUĦ4{OU7|붽ŭtb(WbyˈlD{MU䊕pmZ* ![Е2YDFWXU s%TrvTNpZ-1Xy?rGCxᏮ߯o\ڶMxӼW̳1OgWM_ԏgЄoku`*UWoO)MAy>'vzG*^U8Mb쩲.I&4VQnkzzyI2[s]1 LJ&[*Ux?2_&wmPGRבEUcR' Ңp^O=kkJ)L9Es0*Y^"miQnRwЉM] I"cC.Mj.:2{s[}:dz4Q/?tt]a /Z^Zu-ղzÎEyq}ő)ݚ<^M[e=7Mō+iÌlUK^d6=+c' sXԕmU6BTqgz%&Htܛk5AOT֗po6 -3WR]&T9 Sb˩dNȽoUy^؋}N=Hia)%n%U;gU9.9g:i'Mf~/YsZs$IYIƆk*8z ZWxJ|HGuJ +j6&:M‰5m.kNdBgqdAInR![պEU4fL!DgMT>3fo'N:{ӫE#2YEm)Ļq]vL: zn9ctt,ɥÆTЅo6\*'󈰉[lUqwѻȝ U|b/3Br$tJWҵNȖYcz_s!2&T,| 0hjx/kjh833:{dM !nW^c 󂰯7 #FDAU}ŮV}۔<ߓkŻ{֧.*(]ڕk헭zx~&"ѬLz3 6(6"*jD~i_^W>%ls?mD*cFex8 +2 %^EU߯0gY`-tN4N_ J`F -, Y3rstF[H;+ʷWe<74:O<}*[jeRH(}tR{j-HݛK%|ni mVaamZ"`kp^ʮJlRpT0"6{T}R+::K^VZ\Q(b%J}J[R32HU9H[ukMpqInK{Vg2{8s9K"4}Q^4N]ݖu^_5gBi\ n ZHx]=%vDc" nfD; d5Wtۡk|Dzg2>aŲ "%^+6dR|k*=O^>;f(q٪UKOB-yl]T c[h}ZDJ%㗡]j*z&jeeԨ2; <$6xdF%TF-n)d]/ͬU*=U ؾ:%DoaZv&5Σku6*h?wjlٙP䏠!&UK"@zPݭq}Z߉NgtDL#M, dK.U̫˿8i|~jMl[}<_sڟeSlks.nGz@p4 *;"M5jݯ3ffgyϺqDaum pԖê꽠TLո+"SVSzWA>OkթgF fYǡC#- $M61ѧoG^aoNF.dEM ^[a^Mzjey Ԉq_" ;Ӹ_пY M. 'VSF[tUj_JߣPngTS<>jiٵRAzh&9aإߝyՇPZb[_Q#T%'1K9Ǫ?oQQlt^QjMgkh \ <Ea(6l{s(|aZSU%֋uԫ][+vy>1d,^ ^n_Q--}QL`1⑒"&vvZo/.4Kdߘ dHs|b?61AabLErv"V6ZO޶m^T{^,gvวUz 3֩dʦb<럭eÍmI7/dܫdbFl؝+j&sŴju ElTO!p|]9tZ=pUY-eVJ(VVVMMoU핲լ`$PNWHi[yKcv@{MZSoU$v ."TT])Uf0+=9 PKZa[PTLa.-8iS}_קW1glL:,v[8&BiA_Qz} ^VԴѾ|Da#MieQ[mLm"NFqːJnU^3DK'@C&2\4yPovsYukJ'c$hx?VHZ<n6ڈK߳q r7UxVo}v¨ib:d qBJJE;엩VgUYG\/dM"F)';R v!9Ir1daDPmƉj:HGA)n}væ,\<EYt)tlKI‚ޤ]&{mO%;L~%UXZYmE"Ӵv[Ai .VN$WĹ`(LZ蚍nv42<'%c Z Z3Y**-ǒtֺY:VC!gh'tYl]W&UJ ^c7s5{Gx[֩8>Cе|=OWOg~0%6KKVLLvy$KJe$T" fC|Wvk`Dhyh.n oBV{l9yWSq jah7_\ӳz~aw{HJ&CWʵգǘyw;G6kUb#"yl6t} \o+ta%_BY+Vbaزj)h.Za.)Q)2hj7Q-%A\ B˿x8B 2#ʄl pC曈oUNAtɞ&F*sWg hB#.RۻWd/wN#hqb(E:5oLP@PB3,ypJ8MzEӢx\׃ڄPQaŒmd"BKto ĞB3Rwع=][^7433SnmDՃe&!iGXJWPR C6U9鼀]|\ˏf^H&:88eg>gRDt5q?taXԗ#t!ad6tBr:[ȷ9$j: u j7KnV/qs_8Hb1R^( M6o I}8%S E]Vi۫VtE3fǺ)9 #vEvTAJp7=bqى\x"#EE"M$zFQNWb*6s/ceǮZpHQx G -ױƢ+eġPCHhKsB`Eʝu]&Wڍ9xemǣeb˓4]9ho#Mb$a#ljE˭$5$ dV;"Pȍ%FuFx\2X78"gAk xyl88$(؁cz;3C2ScKR!MqZ5w.B"O`,0˃ Qe_sBp Dߺ{-NnPG1˲;g:BX7D3o.Cc@ #M{'ʁ; 0üd7V EquEBIoVlo/ȎK^әYrJ2m::Т./+ )P@7L dEKʎ8iԄF_eAm( l2|2ewHq?+J%h4j !6ғz׃!_Bx[D3vd9!!̢dpeeں1wuwwh&pF'@IGڋvՖE[o@ĹrHG[e$-8o  3"l+*g&Rk<&L_ףz\/e"œdHRdM.]-oA\=! ɚKp2*9{-4'I(śG 3*:MHq@4\Ï6Ő9( ?pм)-+(wd:Wȳ/%60(0҂>!q}ed/V~`ûa6jSn& ŧt6ib!f_sA䷕n^1YIN)8*wuT=c3We9DH(9~DwC{̛H7?~wSb=9(xd "O,6hbHF@P@Pe>0wdr1|tcG ]N LTI-As f"PE8}S5F${MsS|Ŧ:z".bQUwtGWݠd'ebӭ5&NH^)Me+ [NH-MC(C/7[2M""Uձ{\O,M80]g+$<F-"R X2ˎkջ %(q])Gg!3Iڴnk$3ߙc+J+=CXEnyZqDH6 WH) aZgv.Ym,i4&Y6q5y^tCyl3P蠑#7DžSc0m*D`8,ioP-47gBM.?IH&S QD2R@PM@PDq[ /&dBp[V6vj|2a{WQSi\eD#a q`@y+l)iMGl` &ZuD hKT,CǴ锁"oW do>b8F:Owp6籘fY$X2iBy`}w{ҠJO4#M(O>hn24ێb \N(hW DtwP/@ŶKWUzIXRJ  >hs%1qy".41zM58j86KqZK{t#?<TY 35\P2HoKb̵t8gIۥrtMvtG49LaaGtGQt;.iK)$8c&T;k{K"  ٓqLI6B*h&.:(T ( g+/y&#u!YiݶP"2a K)H܎1-M8-B- vNF:OHÀIPó4 #FC$2Ox芯Y<7WHNw~.=V!51]qyҎkF+ qs@zwGl5dqZ}hL|%Tq mEu$4FlDlF COX ؼ8.!ni71QEr_nLeq=F$M |`(@iqLt-eD5@,&knm[m@1m1!l7M4%kpH6lktE oSdniקXj Z( (" S}IO2ĚYm>6yyg)4 fr cύCF;7-AzZ)J ,ye`Qt!"~/=ɓZD#fCFsA]ѷ&QP\Ѻ[AM@PCNw82ZZۭb.^Z~00v1>3SSQ-|+6\s_à_r$.0(:{eVЛ="6*f&R;.f332,ʐbQfSd:|Ę⛍I737a:2u 03y6Qخ\>zh ( (!9#%'rl8.+s]pQ'Zzm5Ӫ%GL:!1 4nj&J.4Zx8A=:h%X.덒̆V;TM*$~XЉH1 _71@X1e[)-4BΨJB`GtjKYyEȸ$Iu3论BvNP?{pE2n6 K)[A\U7G19ɀHGՖԗ+>b;m6$ࡰ٘j%W3| $E!4MAEPM YvBCЅpN#F~Ԟ3;sXكx\\$2Pl( #k39G1[WN2FVIVnǓ>h^n5Y88 3. mn+/LjOAs(KCθ.E#H'r̋Yrdyyi& ;g*˙6ɷ=AQEoqvܠ?+K섗]Z4 {hP2r[ĨmK&"HJt^D#>&Pq5#\}M;' OrnxzgM@\|1wbqNg _tni6UX! \d ÙeeBٹ넆+'o&ndAl#ԞҨ(ߴNpц3N}EFI-곾]  +?>nnv=c-*Hqc!8K󄫷wKzwKQvh3#qqKLj (heWK:OZ@'ܵ8J@m܆ =oX%јY8W>m:7xmtC'B.%ova9e] Ebm_$lxqA5@?y4 h5rGtb;<-O:-MW A~!8m۠Цf2mqDQZ(8ۚH] *޶w:u041Å)RiCqIKYn k](}ۼ99l75E m+fuj = u6NL7$hfж6mx7H;D&"<7$Iܖ|6Z3wIG~3nȮ\qܙP+@P@PW3N >*Z4" G<){ФT,elu .2EqncP0XnTҡB~)L-oC6!ɶOx ˛䱔AHȐlMhF>}mrH&2[@n1m':" l|j􂒳s1߃$#m_iURQ mmk/|2q$ d; r.#H>ˆڂwxsF'A|XLLHcF";vR63 d=!/ހj ֻ<ݗ@P@P@P@P@P@PMA erU .i򈱿"BGPж'4'di YS-s+H’wNifZ L_%3Ӭ O\8΢ɶTl5=zZPJGc9*xHmbL#!yAѧZ|g;B^VlՔ@ȋcź}|1l=] FDAM5 TGЂO91['غ@#o^|vk/$Lc?ذL֒:1Zz;*HYm4N)* )w]-rqXƣLF'Rcͫ $u6끤 5sg! ԟY9MRR.شG8@痹ap <U^|Eo6@4 m9G(c88ڮ.7+whcf[CYBd\[d5cv j}qy#g@!yyPnLi&6VaGz%q,@#-kpi4φz4ޢ"$( ( c|"xVz;|kkBAq ;,|\I'E #:Eѣ7s[w 9,N0!b" Qեul||3!LQ[mV"8fZWψ.i!W/)NDZ2v19}* @" tGˆ׳.%rf%"K/oǒC0{8h56iq=E&_*Y `eB59JO<%8hȹ.Gk /FV!k-HD輗H#4\gV{f":c[1^е:nA/@P@P@P@P@P@P@PM@P@P@P@P@P@P@P@P@P@P@P@P@P@P@PM@P@P@P@P@P@P@P@P@P@P@P@P@P@P@PqQ=4dq,+ӏ [jDE~u#8>RS$i5磙; "L)8ϱVu'L֨+I,Cl!oJ,NVG3_Rr|y ~(IKo7iWO*LNniUձ"/SOOJ4OUAᵫ mUEcï*O>.6/rnTQHu Ek=ߢ8 4Hmz4tR5$E3!$Z?~!.'*C]O b?b^!.'WK@/UG2PdjbS Q8#~!U=kT߉\qf=w8:7EJì'l%f3ZϘ):Un^m8Z<:wNv?-?Ƅ94`# MKeա_\m8KL}N\? 2z?WT^ |B!L~&Ȼ=x0Wj (?؏dX?WAWG2PKr+Yibdńl6ڐ(>IInJҔ 9 ;0"OÊTTlPMnUb׈l%/;'ZMVO9G km~Eex<oGn߇Vex<o|W;_o#ߛjm~C~G km~DwSpnWOm^O٪qDZ fAK._[QR=^_;scgsabbGN=[!hӜfȪd7\!C&ca8oubg?^eǞX%?rGM~?U'Y}_֝day~_5k 4!_jcTl]OmLsuHec1׳Pb>DȐ +QmHv Qy?{}W>f ۯJE0愽$Y*0X3aD#J$DuTCD}3?Q:Z/.x䳒_plnӨ7m$D}O{Z4b+ˑ0<);KplWKꉥ'Sݧ꧐:+ b Q9#*;2cӢc$բf'0^ɥ rQ1N+Jj"u Svټ]>_ȿ~ͱڕ\+~;C?ȠRZ:h2 L0&hCQQ|Re q2drtZ@ .u-_m=qX:8q{_C@SqHwDy]s3Оc3ܧJSNbBK]4/Eqy5L/LKÆ L茉Bt9䷻]Yyzc]"~ϩZ5VϖI!CÏ +$(=A)~P')?m_ү^VVmҕM&a\ 5I&%RYL6J-U2Ȑ>Cƪb-UJ{E|뼽J.2f[O@Y!"9dMJ(:q{DZ3 w-=# msXP jUZwq?ųdaj:qH[ZK>"bq1fN.QV ;[nos֯{eixoKύho UdlJUfĝ oEQxaPoQ$ɀ. E?VGФr Ud}ķԬ]Q{OMTP~!2I 8kݜx[WU: }]Qm_O#e` ඖ yVlN=RkJЙbCքhH|x3Ք[.m= *"W4M#C)ElD%_"V{&Úљ̹6-'i8lt!E^4wC+Y|qnBi^W=;}Vie%噭0 [aSxdӨTnu3 umgkrQ)ed;J(v"';}1YE}ձ芝{k/D1Rhdq FV[UI=۶(sfƥY p+\FQռvGqǏzR:(>5V,w A( B*%H֥7?`e*ڶ6IЉwezOqR7""[iQTU#1#kinJc²8#.hJ|{8=s~eZR tY4Bm:+k*u.޽:i?J:3lϒk@^_x{~&髞:iM5YK<cZ9aZn>Yr ' 4Bꏞ7΍3-̧ҟ}xO}ߨ׽4˭muMJJk'Uӿlc#llb%/+-1.)W;tK=b(*q./R-h"bb>MlID$ir4ڊ(t 9LsĦ{0m4]W_D%nƨ㊶t'bsʹ''Bn96"[Imwh#2;E!TK]W_da=ǧ%7!ltQ[v|U}11d:VW8>0mNE}[-l|+iAPKnWxx?=ioZmmWWc$3L1AݾLԂYUEZL Ԫr.3%8 O3"A>gdRL/A|\?V\ITzW*?cYlJV)/uVUFvѶ5T\' ۀQTU)(#)t ␪״ĻQ2Ҷ@*ɱ.iznj qQ /R!yuWV9PrTثփJ^gX& JmZ螪ynx/9[׍/mjm_!nd_[.JڻQIEHۺMZ [G\۔Ȼ"o85/B'+4c4Zfg?g,{WV-K{1b:ZX;,hnj˅Q eГnʤlkb/aE6TB_'Mm9zqcオݪѝc>nBӎ:iuhEpArbDWof3ubc`f:,Ӏ:u"w}JX{\c0be-&,xs\QGDK~NWŘTc)rFƑGAZ>n^##9#,%$HKQTv3u*_Hl'W8ӜyBTPJoxXDI>QUŐ#Y->UݭTzzP=L̹ٔ5O51he1sG |f2p0_mZ 5|Z=Zę5mJߙÔx/aC6𒼯HaKUkjiZ:P1_ a$]Vv^כo#]\lIRSJ 4wP6:4וlF9z |ZL!Ub_e$Fʎ6,FQ{y듾%g g&a]~3y H+ӳ\:tڳgy0mFfODXlUMU{[oE9ӤH54@E@D_VdRxE~%!6u*-wIq[įт:Ht-5|َR),s WE-V]uwW?k2ǓWn^=-J:H/׍׳g~ɋNcQ9 ɁZžqֵK_dZn+zlD["jTvZ+^Ec11WJ :{/Ӫ4-xl.%,êAySR.!D/B%f-6ܜ${vjDGuv"4JCD4le5g6EˏJujFx}#>\l즮pO7?c d$.Lrn)a PSgZj+6uSs|~6[ ΔSTpؖ6^Ri/ZVg\Yj3DEc.Hԅ}HbKzzsF> 'd~wj ؄EWѦx̹fҞot[ؗ@:۸6Z $лSQ3ʛ-iRqٯVW+TKߵ_2(9\[πBieZh&eDN֌`96/b,"8ŵP7+vw3 =X ^~%臘5LHTXyTwEϸs-7hOԦ/MYݱ%D <-Q !cG)f<66jUZ]2:W,s'YF $4; @SvKJ{yyfE ' w٢S7 uvw+:3kb1P>V9d(n0 mDR-1"R-6F>_K*ˤVg{jCypLG%U"/*լka4-!0HBTM(ҵzkc=+x!%mZifoCd1ӗ!҅׾]p-i{uSǥq~qc)9ab7(ӌX/jV>ƞGmtGrC 4 /RMw>y ?+WHP{WyTTS%n|PJR) L-T*rex@+&*J -]~-f\^\D9,hrddlUPIJ\8)ַ7ْD[&$YWm{ٮvE'JIӮʈ]8cϛ̬|t&22)FhQTK]WyaK6q>#{QUv˲5G2pSeZj* mja,eε9@W%UfRQ}H nUI np̅M Ӈt})SݨVYWUQ"һg\xoD ap"]DOJvyfzgJ3r34}Mz-ӣ]~\>"@nhQᙋ @&4(ѐЉYDUMWh61q0 8KL-\K:v]3nG|G^1{& 5TK YꚇRzQxYn=&Ib6qTYon--UytZE&UP9X9!]j`oڋ]x8`MlDѲETUKXxm9.*CRJbڶw]D"JcY1* >F Jյ:#Qrad#>-6ı ¿A хʧx`k{ g'=TFPlL2KӷV&>e7W\N1Zr`!qH[oPd PjqqZٜ=`!0ǚķ2}A[(⭮%K8;W{v)SKr9C0X3xqrmz &Yۨq^Jx/ Y̑2D)T6}&s-/,QjڴuKk["/վ;g O_Xߪ*Zj !dPr\, "ȎT6{}*jcsǙ,ԪmId[ŦW-hucr0-i"#PYPn,"sqּD0e-,е*!"-uڗO%ңNWR5 j AAiUQozD'Dow}ٛzkIoUpTUPtSk)i0ZzBȪH Kn+ҧƉuv+i^Ƿ?ubjvG;G&%BnbGT}֞&1d˹{jOHڶYuO=Y^=X RsOM]E~ˇwұ2' vREpjUNTۈyGMOf3rdMaeWU M[ڸŞu=\{v?v?8p֍M"( z5jfc՚v~k-ntdM婍cr'U8k(E6W=r(h6B:v]˦i ':9x/Boٲ3:i1e|=ۭD ?kPN,o"/wKRiηQqpn$He oS08,1:Ķ6]}[ rׄ C !ÉsM>ͰN[aKẑ8j(6&lLI\0|0/FE詫J}i/)Mo?gѼ8 ^_"X 4j:ۧ_%gD΋-e>WΗ=1/ktc;O5V,w A(.LWΓ.LQQSΕ^g18Y US[dSAB4K|R]/hɃr[ K_Pu*J99 ^\DEkv*ՙJ㰘}I-/XD*oER5kX2#ݻ$l+'0c+[ ܵګiB Р"Yz5$s^KPknϭn}sIV@AH1֨`qt̵8{/kˬ[\ļV&ks?-ydO40-*6Ɲ-פwaWO;_lCŚrfA#I Krc6Hh"SGtpB^W C|B"|{j4{}.. B_VnV/*7f%^#ﲚ3]D*4{qY1RJ"QstB_XCoɄyDU1KkJ"'||2q8`Vo5wSZ[!1DŽ"C{%uyVF[z~WkOs<1A<܀dj""^}J:cͺ4-iǿ~w|Ieh5d@PU||o_v x0{`C"%^""%"U ֙Ymdd_گ~Hg4fBށ)URu-)ִH znZ'ڻE;q* zV,Bk#!.ETڷ;F] ]vlD}$e'%[(;z6EMQiC)UVC,>NIbҾ_%c2#FeQTR:I4>j*ESHHK^Ŭe8*IЪ{TMIҨL L,x\Z!PU1"JAtFoXMmϱK)K`΋}ϴ$zڬxMs5g-`u*uu%Q4|Iۻn A<•^i̸/n.atɌsKG_2*Y>ڹ߶oİ#J0IUQz+˾ 2K+;KԾDWw{> )4v8O#J""*m]HZ ۮ!f:SN%5x=WٱSH3ye;|ي2(Cm5k}Un* ANˆu-ue2_T$j'{TL&EꬭXi"v4j|pŰDK""'B"VxVs3Geyuْmxr;l $Qq4lDL}.ɝuq U$ TMMzzt9fGt#8{ߦμs`n[v]EU{VEgz)r}7"cNw(fējLtAu;&[p|,Nu_V8x[^u,5!B-P'\<{9+,g7$5X+" ćTQ;p<5ɽ^0c<˛`<6J9af5\Q r PDGuiw_ Ϫߍ;&b+yLH͔z o60-/ޜv$2yT0!66.HU0Hht;oFWZD eE]#"TطrcBg =JKȊڎڽ's¦Ȍ44t!E]Iԇ^2s~aV:^>O΍y9 uK+~^_Ww8yOXL'VemU@tؾtcdGDlCK*exTo=g9C3kwj΋\l.i_|<^A.g>\/~|U06T^ W`,nx4_|_cU%/{eWklRpTdy |EmiB $ ?}V荵D[߼Z6WVvD%~&j~-~w ࿉wbR׉"NG&dZtxD7yTOt3rބUf2dA{Q6Yn߈?j.! k GX/ ,I]Q KM>e^R[ .MTF^A~3Y[y3lRꨉuZǴWefzE56Df#q˜7Wh߻oy_m?7M-N'UGQ2VG9 |A:钊Λvkg3Ѫ՞a^cIwgkV^s# 'ERTԮ"X:+k[lkU?(ǘ8EW?Ƣ*>:]"2&cwFRpTTUk /d!@% i1>Ve?ES }&'y)dWĶb|;`[b|;_L_K+NF$&*lH9ZQL6Si'L5ӽC[}Q^ +ߴk.S2/+pƨL/~!j_M@P@P@P@P@P@P@P@P@P@P@P@P@P@P@PM.n+N*d$BE (+ rpx@) Yg"Vt EjR?q$rQnmٽcĝ]6ARǼؼ#-^GC{Xi5(CA4yM&48 !_'(56lN`Ɗ $S![Ux W큄ne|LAa.ih\4' 6s[p4c6 @&d|h8m̜tsnZ 5&yȸq]oB (ȐࠈZ}$#ᷠH= JFtlw]Q`ɷ}!]H3cDž0b6b("58H*:eHNT_]~R7x!׫AoS9Ngۊ􆅥yl +qlH[6? %^XcSD-wd i~3r>T3yƢ4x u'?h-sX;gXɨ,x#$$8ޖ׈D*ͨ{@@Pxs#(Vp6!'d6rp@ T8G >mTe^G }uXPp-&/hsF4.>.lnL@F Eqelq;M gg a* J軦,hr6/YI*L$&IDb[ƚ֪ۍ!ِeC~+vɻin#M]u5_5gP=G#('u MֈHWpjyVhpx( ҺB@ iϳyRE3' G`[Ay"ɜY \$Hwukl,⽳-psP5Ѥ06r5"!͂"-|TaE'DcApHÆ.Jm\&YڋOZw%#x3-ϑd$\F-%vR?5C~g #g(|$㬡+>^ṾlEsxdIc(mɘuh6ӋSx L ڠOF")y&VRҜ#ttHڠ}@P@;%L CFyƎȶ0mHVtJ3w1$VFN41.<⎔bЛEk 7ޠXqB]SFB.ȺP[Ѹ]A#~CLLNj!#m!h{F_42 1RFejdmG8: i!A5{-{P2#2㖦q$M@@PMA yYx7:zEovwx Xyfw|#E~ԿO|7lw#Y.j3Gb;9ٛ0 !2x5{ʐ(."ZQnFQtssBXe n:vo٠rV:^i8fI* jңĵ]i-] _,‘y 1!:F`I4d`vnzv#}-#;lo4m뤫 n:{zy3:>bSmrVTZnA8#@79w%dm$|]. zFͷi@ߙ suV\a8ÃQئND/=knuKM|'%{ƗdE1ṾqTx[i- aI[eViQ:+|&f0Adž(qHsfNkj Z(0hJ*eҪD^F)]4/!dVn*7zmhVSNdPIxaZhaH-'w r\3UvCq=\nդ( u}er<ըpq"tlFKWkP@rqώ76O ؃)P5WF4VjйJr,s']0+Pq-#tt8E.7gLjm< }G0[LC{#F:8(a ƟTۦgw &%#%*93L)pq}oyAL_#fNsqڸ8'JKqR!aG*+Jŋr3({6.ԭBjJJF'-?ѶSM#412p=ʷrۢꀢhӺ#4 1܉vZF9y%)8IU/{b pԖEx+c@M*>&B*[V=4xaX1ȣ|fZ&Dv8ݯi@( N~˅ޙq%i t堈cF96jDH{I{A3 5#lpU!7 ՠ#Eg4n ݽF+~'3"cOS=(徛6{ 8qKf1nύvh!c){< ^;F;F ANdb`9-$IϛJ"㍰ hchǵnQ+[3Z#_}>ҁ9bDjGwƓ*{1iG$++tG[lkӾa@pĒs  -mpOG :csYZ&O 4+ <22hHb"Ѹ "Bަf.Fbɿ"A4⣠ҫnTlxv=hϞ_w)^$L6qdaa&K8=ZtIEhD$HbTu;!w1d7ADCjBG 6W4 7Ǒz.FbBap<x#s(Ƒ $f101_"4ZW&Df َ[c6r&;+.|H9k1$QCRkxL4qjZu 9yr1H>ʲ*H@ 8m;ݟAfa@Sc=}eRy"oP6.#e"ͱմ9= i+ni9@P@P r9>"JQFDhU[ԋ.pPF3ϗݛm,Ɇn#`,Z&hc "sRdj)"@3HRl!Z@Ɏ &Uv;o mu[߾z4d8[0\qdhp !!Đ꫃t =;g DlƖYm\":+@O. i|mW2Ad$>c)lxMm zEGl1f7Yo 22`2r&ȽF 'k@GF2L6wM 6c9ݖ8%md8 nq8{--|B:x(`,>I j~"*Zp58N4_ѾA90o$D7ŐjX- l @~G^5,8܌Ƴ\<|$+4|1UCSD"N?oqHuGd(Kq4 qZߏqݱ1ӻ@L#cᅸ>, ÎR1[I6.}AeqBTt{#)6L)OcPlW蠅E ,mi۟vMȴTΆƃAlxęw47V;m:wzŀA<bJx1Ui#6m]3hH[o@ < lj:\F3pI),4.4J$FH7{+yF RHULΖҋM ' q=f㝝 1^4ڂ K]K[Wi `d" ܡi}T#n(ii%iNc<ع,⭫R;koqg@G刍(H}FX7\Po<R:HwcHnPe9xY'.*MuAm#*2)\FMWm{>EG6d 2N"7@@}P@o+GfId#LHw[ِ*!q&]pJ8څ%fM `D,a{@P@Pɉ,j J( 8*F (KMm٠/ ;K1V-7iEmB P! qLǗ*2`۵Оp \v"6=N2FE,qj &"zP7rYrNr;[4>Zǜ91g**ghgX}ٰQ#8Mi`c:/ bf7lhP-gJr@L6M$V5q ,c`w{7C@7s`ΨJ)4sj0l UxAx\! \b|i^ )+]7ԋO@F"|"g"O gR"0!aW u(k>@P@P!2gbɌ|XlT J:6H@D$&ُi*;|Wܓj>PGQ֜aPQi 7h5V26BS Ɇɲ#z\lQuZuv!H|eH6zTX#Msp/j>iը˰mqG1IETT)uh2 ˵~l9`imZS377 dpI͐Y6\xQq6dھ&VKFa-湐U]p!]Ƨ ޷ N*㡰,mvޫ*]kuO ʓ‡'/O-J65(=tZ)񢖩" 57M6s$QOf-c2"3\-N)Ғ$sxDC^f@PM@P k0R-Ei'0O;p ;gf{$#Od;2BB0(li[ctsG"y.v'%$mQdZLŜ5Obӱ۱d qtv Lvof{ _ XhCLxc$pTdGhe]e2r Lqc39UEimwZ 6l֦I:#T ( ( ( ( ( ( ( ()oNc<ːQYlCBFLAMQt5K^en8ԸMYbd5X0qMTY/A,0e6qI蹆\.AnG |MȽY/I0X*%mwx5||h0ķ #r<'[}^'S"d d:]%t;ꃀ|\m`M|GI'udZA&]h ( M@Pb dӋnC+\VL\-`$\1'6>#8o4:ب EH."P(h$ ( M@P|2\Z̈|9Q<d-& "ؑEl֔ß?Jʟ2TT[P"Se7*ꣲ*mI"'bF#S V>+ViA%r[쬛́zpRb})V:xCA?_1yR Q%Ʉ"pT{/ u#Gwٺ;4-[r<& n8MdB1OG=S 7ј9*,`(`QuUF7(̴zlfr)N{ϰI$ :"oR.GwL^o$OriD4)Umpk=^ N74e?钲K1܄2d[kXpZ}<}i@P@P@P@P@P@P@P@P@P@P@P@PM@P0D $T!T*/J*P1bbguxm0 Eu{ L'4S`ǔ$o4 vБP''2$9XدWF;6m{ @"Dle5lYSD^]D.E~X HÉ$26ҺE;77a"A ]apELQIP5'p&րjB҂J"?aKo:N,6D> UxȽ"gYXg=?Rq~ȼ듟7Y2_W]Vvr `۶k[d,FA8Sm_'w+vzn3ֶwv`{,3drV$z&Qi\lt eTZ:Nr{-}so5 AsrnYx Ӓ6?#Pi>Oݭxu9&vr#O|bJ9FCى{FɷGp\{/eu[I>){λl_vL9r.aCB.I&}wr]e A:Uqw~O~ϼoW3 gB^M.68gw}w00\HcyaLAW'!#Mp3pիO؏-1{?~j}܎=ч- |Ds8íK͉:?j@P@P@P@P@PAM@P@P@P@P@P3f5+ Q 8D5DOI:tC63鐟)d)qZ1!) 4%KX5xE6/9*qϱ$৤G'䛗++hӍТi 96cT&~W/_{f׏֭mj~ogTycy)KjOX9$L[dlmƙBq74nl\S_Ŀw~ZmoS?k6/MRzJ ThAl6pj<֝uH -e E-lk1VӜ1` >bGCo#(B[xB*A!wNl{Hb~Wg{߷TD]mޯ\0%ċ4Γ qj^C'T &kVtwx;mgn[iz?11M~{;veG!u=#7#L'voiWdž4;Wb"8{[VR3߇eee3)ǵǛ%Z!P{F):֣ٮ߫Mu>}tjnOd`H+QPDSTA~>lw2]ɹb?gk7l'SzUsoޕzZocmsvKجf&i}rmHٔ{ ]i@f{&=˵vz^Vݴ;=wUGu4Fn^^6gڎ#feE%6=^Q6IptbϫޯS}ߍ/2{ϿFϲ+yvZ&H9ќrL'EſU~Dgܥ?K/wm;?)GDʼ}⨪&4 $Sfzzkkӈ/ٲׯ_Y-䢱H( ( ( ( ( M@P@P@P@P@P@P@P@P@P@P@P@P@P@P@PM@P@P@P@P@P@P@P@P@P@P@P@P@P@P@PPKL\3<9youtube-embed-plus/includes/gutenberg/gutenberg_hooks.phpnu[ PKL\>yy0youtube-embed-plus/includes/vi/vi_admin_menu.phpnu[  Monetize', 'manage_options', 'youtube-ep-vi', array(self::class, 'vi_admin_dashboard')); }PKL\`{.;youtube-embed-plus/includes/vi/vi_login_success_content.phpnu[

Hooray!

Click here to complete setup » Click here to begin customizing » PKL\5N 4youtube-embed-plus/includes/vi/vi_login_complete.phpnu[
PKL\`-youtube-embed-plus/includes/vi/vi_actions.phpnu[

A game blogger posts Nintendo Switch game reviews and monetizes them using vi. The player combines a funny ad about Switch's chipmaker with an interview about Switch game quality.

A food blogger posts a tasty pasta recipe that's monetized using vi. The player intelligently combines a food promotion followed by directions for a complementary salad into one ad unit.

1) { $multiCatWarning = ' Note: If you selected more than one video category, you must stay logged in to this settings page for your categories to automatically add variety to your ads.'; } } if (self::$alloptions[self::$opt_vi_token] === false) { ?>

You now have the option to make money embedding quality video ads that offer up to 10 times higher CPMs than display advertising. The ads that you will embed are privacy/GDPR friendly, powered by vi video intelligence, completely separate from your YouTube embeds, and can provide extra income on top of revenue from your current ads.

Instead of an ordinary video ad, vi ads are so effective because they wrap an ad with additional useful video content that you yourself don't have to produce. Embed the vi player, and the content will automatically match your site's topics to attract your visitors' attention. You get free related content that you're paid to embed.

Check out the demos on the right. Below, sign up for free in minutes.

Need help signing up or signing in? Contact support at ext@embedplus.com

vi.ai Terms & Privacy

Not interested? You can hide this by checking Hide "Monetize" Feature found in the YouTube Settings "Defaults" tab.

Loading sign up form...

Step 2 of 2 - Complete Registration

  1. Register below.
  2. Check your email for a confirmation link. Vi will verify your site for quality standards, so it may take about 48 hours for approval. Weekend signups will be processed starting on Monday.
  3. Come right back here after creating your password id, 'youtube-ep-vi') !== false || strpos($curr_screen->id, 'youtube-my-preferences') !== false ? 'and refresh this page.' : 'and click here.' ?> (Note: Skip the "integration tags" step that you might see after confirmation, because this plugin will automatically do that step for you.)
  4. Login below to complete the setup.

Note: The vi feature is being deprecated in the next version.
Please contact ext@embedplus.com for questions.

PKL\C D-D-#youtube-embed-plus/screenshot-1.jpgnu[6ExifMM*bj(1r2i ' 'Adobe Photoshop CS5 Windows2013:12:23 01:38:51%&(.HH2Photoshop 3.08BIM%8BIM: printOutputClrSenumClrSRGBCInteenumInteClrmMpBlboolprintSixteenBitbool printerNameTEXT8BIM;printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@Y8BIMHH8BIM&?8BIM 8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM08BIM-8BIM@@8BIM8BIMC%sshowto%nullboundsObjcRct1Top longLeftlongBtomlongRghtlong%slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlong%urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM!UAdobe PhotoshopAdobe Photoshop CS58BIM#http://ns.adobe.com/xap/1.0/ XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed        ""   % "2#!BRb31rCS$AQcaqs4TDd%5ÔtUf "2BR!br1AQa#3CScsqѳ$4d ?^P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^֕ oZW%} .疚"iZ\ btsV1١dž@+qlW?V+D/֠ZtJbgj+D/֠ZtJbgj+2\IPcؠ2Hm{ rus;z ְC4FX\/Ō/OCbqΩU TWEB Z:NE&~SOICg1jci՟נ?@?)V^~SO?Yz5ɐh `Wkk7@nP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(Wu-^({R"&p`Z~^**I&vv7m*Zdv 9^4*$Ss;OCn}Z?V#IsM&:ěcy2QNf ct.jNk7"e l\wN=C7-4G1ڣtm77l!nSa N6F]xX. ;`'f-4G1ڭnO4o2M옝۳v7)3;\U L׿Fb!+7Z=ZMm=gGa% ok)* 12^\T#6"̞Y|Mki)}ΓhSEDP>2`ǟ[у3H9O"j+Z;b u2lv*, L0uA$c*ŞՓ^ݥ7ߺ! xfDj7yWQ*H:T;K_ڤX|x;dCm aP>}5;7[ .pJo`<yreU5`"dSx\ RbY`i~̀O5}\G"ƕQR*,Oշ.QXy_/@/-LO`{;Xې ;6A&J[4 ͕Xlz#{q4Ruv5 ݲoiԖp{4%+-B-ώ9!H!wW3)jIewv%M<{8MdoVnT,d.-QYq{0G&8^W7DUwkG_lk% FC䥱ZvdfNbæ8 VAU=mGz&{D]@.J!ZV{ v YqŌ?-@yek;O#pwwٻ}vn)jZ.* VY˴CYMvfu{kgcqɌr ܼt$yO9H=nuy:] _2|/7AzO˿S_;f]]s/dPޮrTaY2?Wiw*?$L[Oq, 6,Oc^WUK|·hFgf'^sr4yy%OQIQ۝ٹlb D,DN` jOS7Mݺ{Y L5}sߚIRM2geL>t* =NҔlkO,SXC GT&W)kfUI,[ר$E@ܺn|ESe?b/R~-GBۤ9?Ds?&,|KUlwO6;L6Z$8T+ |d(2]KPt|L\>gsJe%RboRKVz6/kbÏCFէ陓ґ%/5f>iW9͒TdLV k+EHs?5Um;M,ʙ,tt6-Sp;v!;ǻb5s[8j\b5٪ՕUpdoj9?SKPI=-l~q=xwJ$|A|5B:X%Fwe&jnl79u0rĖ;[-|9lF_o#,|XcI1UWKe\f~K3dߧ̚i9k{zF {ݥu^:@+ zڪ7/x͕j9<,e}vkr]ߥv{g~wYGowng2U6GżlYj_,ܾuTGC陘z`Tw-Go2ʕ_wJYl[9=m(o&خHxa2Z̗Ylu3#.flJ_| >\X6='f=J-vj +̵[8]UDW+m5|הc|ɕ[3+oO/ow~nّX6F _3,j=ңFrovOV-s233fVJ:mV}Ucam%ۥ"[ ėV_jM735HfI<Ԛi]T1vaGIh/h5݁a_!1g,6ce*lȇ9:jg <~8עuzIOgΔ=~O$Z~oQV#Ij(cOx|ǔ5PTZdg|1z.;2~I~i|8g>owҺl58g̰O>*/ XXt2O7sך_'jo~,D4fzH^wq{;=DK)>W;#-V?2GP/lmRw"j)[ԡ`E 7*g*h6?ِ͔K=}-k-f$}Q ZQe!2lჭx3S*G4ْvKU*e{rݯ*2wen9Ya/wVj(#x?oo鑏trMҾ-z(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P ^( fmR⵸ZWr\GnT~Gd&8L/TO5Q&O-sn2]-7[>k[uDODb$}ϼR"EcQFv7&riDKFnät驸{btF=1z0ESSĮ,bKTEBdXqӪN.^"F%iųri2/)QdcN+2ae\@^`jg\tIxF8 o:-}x?V*EQv\$6y\<`@.Z>=?,9/jͽ3'&ԓ_IUO.D9-ku8[k `geԢh^۴n޷ oyQ*(N,D,7P`|C˪F6<5rO<ݵ~ X5Į3=Auܙs<nZ63`]1qklvlmk5bڐH|("BDSC- %o\נ?/ [{fڡu\ {ذG4 cӺa><:x+}"͟@~@冺yp1e.\8Պ)QHw1 ™(]vcrX%% y~,tD"atnt}Ò!-Wu͌VbzAiy8y*eڵ6Qnvu>ۍguxkq>T`tO.绎!6A1VKlJ#r %_QZLFs<>_/75HGV<ev̸vUb\eƽ؛ײ1sr7)oYWjx%4"j/D)]$wRA#ZO8sOqپxvW-~][xZֱpĭk xGʸe72G#~w>I_7Lۤ7K0aŋ/r <t,9Hf1e:+?_|/I1e{O_$f?CiO/]~L^|.q?Y?iwZ䟬y?,{ݱxgcq5^ h5^~OU!dk濡zD{eأ>^gsM˵^n fmv9Ye[&pꝕ"'뗕?qSz};W⋼.XH`!I;/|{?\Dr>o7tʱk8G\1rFvvo+>+:n-4CS&3cfP"KǺ,Ys>_կ^V\toɢNK2;柧.0ݻk Awrc=Pl0|'3#?OޖNfT&Ӯ?'|aTۥq\x'7KDk!/n3%Ufj8W3//NLV6wdmG$SY\1 ͹m}{<yyUM%Y\֭Z=L٬nnWtZɑ?%+5җEdFdr^]8r~uʑ#41~?Te*F}6~6¹whR,ɂZ7?Zll1O?.VL.VfL6#>R]\K:&fO~dUq1KM1*V=Hi9}6~._R[]uS"}6&'3p#E]E~n7y~/UW,ɺrk[\CvoS9v2?KL M#{,Fvcb9 $?̯H.[_F-϶F~v^*rjږm߽=q.5;2Õ\Il_ ]3z 'W% flFK{zÚa7U'{ٸP8lIikGdE7J;afn::MUn_Ldɇ* y!2q?"kر!&b`&=*-{cݗ?C3=c漣Jfљv|;fqCp?ӫUYh+[73-3̝rLԚ.dũ140X*Ӣ]YO:޼I<99hL;H[y;t3Y -{|&p^d3"f6O*/~^OK;ߖOu,ҙ30 u}!+jq"&d&A=]: z,鿾)nfvC:-9꫒5VfrWd1U˸"\}Nˀ~+,a]W&.WFJ=ѹ VLζVlMM{mQL"չOc@x AB߳G\ʈT.ݓl{ޫLlgγ6_w)-?MllN\a+Hp 69؎*_L䙙~x{p^m}nsMLLxa~,xF7.W+ÔeBFYم25€P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(1?/@o?^ћeuN Z޲GmѠd@:Fu?so$~ߏHͿ4~?hY#6GmѠd@:F^\ۅ6-Wn6@E]F`\{7~)Ps?p??Р\O(W3 Bus?p??Р\O(W3 Bus?p??Р\O(cIZEa Dž/&P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(7E ^{pG \ :߅d#oߝmh_|IEyǀF_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?Uz@4~+ު_P whWTG?U}6{^#[ی['E_;6$ f&v]Z{^ݬ"rP.Gkee0J$aʿ%Xig@Pw7xXLY7" eV"`j{Nqe{8q;pHq.J%Xh2PK$2׸nwz-XDH leLrY ?EpJ%%Sr<8)}`^_Ѭ4@B˕QX VDHX 5<6EXU y'9bG8Vċ|Xl {79XHrTM)t1mJmu}CV~Z5I,ٲs"pj 8ۅ5DqNa>c~R9{jƤi AōnaނުRPXiS5#{q{[rr9pͯHa[dJְۉj1c{M ?o/P\$mq@n۵v;/zsttxLJl>rvn_F Rlnkv nj.#9pxx_+zF_m"R,ZZ;UBW]qֿ)cr9{@ggNX+^#v3oDEnL|UjB]Ԕs{c[{uPoޓhlPŃ鵯nh[dX#pJJ jw mnҴ_챰{jMAvͺ)c8dY65Tk{?U"ê[ DtK8d۶,+KW\\xq{ձ)kXi]-. ||+ˎ$W }4$XM>ꂉ0ni> OT6Ĉiȶ*Xo~ TQ @޻y[d  ba!nZ]Wl߅ȋoE[S[֘J)ɳ$ZQ!ϖN1{XhP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(?^#fv׿~>ҿ_@:WKJx?]_/+%t修tҿ_@:WK mU;WPP @(P @(P @(P @(P k(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^#:ߪ_ƀf6φ8]hTiN}v od2>Wkit;vy`ֽCX B CE%v+Z q[P\9eҌEVo*F^({߹/i X{k_Tr*/ jm縩ېnrw8"׵WO&{VS Rõ'e ̭a[ʞRE: P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(?^#:ߪ_ƀV>Ij,:>Z#/$])L[ՀXJE;ˏ51 iZTMRa;SkޤDFT{nc;ê&L~R57wG|.-oC4;])mGЇai8Cnb8\xEN\3ʻ<1} _*O*;>w3'SC.(q(Lk{񽈽rz;;߸c-{ Yi_ Dl-}cF`wmڟb?F%`%!!˓ޮt^9%|v>[6]zv=Hr[lYAEð)ڶxq>[^b2.v06_W 斿0=&|-,8|w?c?GiCtG$I?׿_t$-?T/?K? ⋵O+qr}[_|5j贑)^71^⋹2a[;[}zRc쒋Nn1~ j!s rv;ێV6h|j#*T1ʮT館bQ6p}<;zn>|yw;v!\ɼ~ `#F -K}b n4'q—uI*#|W!lY/Xrs/ʘ\>h;qtJ/B- Hc/+Î| 2wpy;-~>q"gZW$dċ/p6POqtf̖ .RӰۉ @U=Wy/6.+I|K(V#¤k۶_-|n_,ŚxgU;/}Nxj9eyfI/?f^;퍷q,3EM2Mx1`akimN#-UQUq+~ }ʑlqX9pX 'rbrHd~^:#PsWՍz/]/scfykOzӺGF1@0$Ij"%DrYA.nle[X7JC8:m׷n2MPv2ɿ]x͗GRrӮ{҈g}_ّdM--񕛋qg7Z䃥jpc)Vڞ&#3{)"ƽ2BfE=(E6M@ w>>M0v.EÜO:K#5MMc].5ekp7ȶ[qGo),s |jX)+mR_sZmv^ׁ|h>89Rs[ {9tl89caerוoۻX>n!1@K6bKQ y sc]Ql{giҜ s7Oh}3-芈`f )齁'#5F,Ӻ7-}NZTkJl9u1in}2_MDVFB f0?eWe5ߏvy&Wp[IWtl Tw-|L͐,u`XbUMc{vv/ a=]<ៃiW՛u9:RQos΃}ʑU xf>-0H2e2Gйi[4meBFԀiX[Xcy|ҫצF᪽jf\MiF֎Gn4yO6\ZeV E\ { qP5wXrJe;p 5,r'<@H}&%WUWJpFZ[*S%8eq=Hd61U=ݻ]qPݽR>Euh"e@C+sd-ƂKm[|/pvMnO5ޣH}Ѿ̃5@62-lF`淳r>*5.VoNHΛ>a&;ib,vYl2L!=83PݕmL"5<~[%c\bLG9qJ+g{٠R!w$g mL` )q]iWjE^znc\U7֬kU<X@buۅq2u?jJj5)~vJltGZIoO6^׹mc7c Xcp封.8|e7K7;5[LKf鮕`v!E젾2كѢe!ȼ-YR7]NxSU]XnVlRxut>2 fZX.I a7Nryz&eώ[ZS금1So]AEccpX0:ٌ@І"d-L!~7 X$Մڭr5poV X#"#K,kL#hzyy=5ߢ%wn$%a WfwPBXgi/oٵ\֎JRzķw+ZHrP`v_+5^!_EH6w殄]j؁,TOIqK2tsĜE<UΛbG5OI/N6} t e"̴/3]䓆9 n tX'rn\h[ \y)h$ 8R˺bZLz,?3-6 mm`L6{>#?0ަSC~K9}4w P=7>RHCMdӖ[S/a6&vd;p+fͲ\\/`3K# OHDYyunV/v-&.xlU0;vޫYm~LUq`el2O*ѳ-ks/eϩ[v/U[pXvV3$/`# o FlZ针".)]qe1xʗDn<8Bu/jHbh,DrkU;:sKbuZX֯.oc$d=QqiG`ipPDE! \σQuҫu׺nFdޕ߾OYi` %E75XNdXy`=Bx1 iL!qޭ%0g1+XuZ6I EHI8aPp5ƦpQ`wImfm'?|CݕіavX%ey&:|J,O7֓dd'ERPP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(?^_-@RE˰nk؄"e1&WNtl(?InT:-"OyBci,*ߥ N^^&u568J-+iW#qڅ%KlVJɩAdeoKLv5q_oi~ނ9^.mHc  YhG77b:jRhҎEOo w-LoQx Ed)?/DTG?uRtcn{SQ+;y=[z ZUajMV/!{\X̃6OgMO ɸ3?njO]dF;bW}y"VKo";y_/rJ #rjOfgP|Z~ ț,^ܘ}ryU$Ի73 t˅۵dm~Y.ѡ1[ -<=jrW.65/=&F=do.C?=}_~]1^újbvߕ0I~9c܊rfMƙt3ΎfK>Dwo<ۙ5ɽshě-w+ N0Z~a ;NBѪD]eo:q!n}wOvhyA69bQȻe:}13 ?/&/*=s4٩ʖ[V:.q_m >sU#I fZHCcHjdl?/bҝ[].3.S.].t.fPHo/ [GH-*C I VT_e@ P&xFE|r3e1bM+7m]pnk68RQؗ,H.Z`f3PKu):\]~dڷoL]1>Y$'N(XX idz =֠ C\mops9{5NK=7dXTikfFߦ IQn6HdK|Sұo.C$0Ƶ*~_z3WWO}6WW;?lnlCZ4"41fq#;_՟ltɗ(Y<ڤ*wzni[T]T7=AjɁc5`nqU c'3մRHkOf6J麜^l)3ךdFx,g$6-r%n<:i9~%o&f${ح\GL vb{uΎdI׳81do;Hl)qcCz_%9LYpeĖ0g݌{fv M։*<HnWkdcFr/ղ^\fz>B"co}?oݛ)F|d,sr!nYk?cvgcw,l!zVHMUGbuۡnqP %η .2Z-^e%k&o==Uc ^f_T/̩ʏ ZQ,N!G /TiMU k5K^# E+͂˵Fuٟ <y)2fUf|ὊmPI$nl:MlWDh݉?[o|&}֣@T:)+xsu_mG駃'+/c<ītEfR:-Bcc(EKy*;75 4NK黳.a.Ç^j̎DFE;39F͊1Z{v |qVX;oIbz,]Ҭ_?Z劬/5Ҍ߲NK^\ZT`vN+bKć+%#x@K*ԝ Z䬎E\SS1 ;-u6VnLn`(ֱ0C' $wZrkU"jAWDNwmaqmTہ!`^Xr,Ek4Wy^뱹N-]|'5i{[LS6G8Wy`B" tuUoYҐG򽾹W~Η}ת[WǍêqcZՄVp9c6}DaRL(amI'c'$DϨ4;rJRMxJ.],lkښ[̪:fթvluê~fu=ye\NX/3+f3&˟)$EXc75EZ r:1Ms'nU<9Kͳ{oHҍ ;t@HvFˌ cFy?4kJ6>vUVROzUrGKOtkvbbmi"ʈ6\ZIh3` FaeSV 7#ٽnӶ[{;gx[ nВ=W;J Soj0YJ/fb33YN~stYE"2Y$iP>Ӣ[ +yJ5z9+e 8Y%{SKrv̪:f׻'^JRuܔf6Yu:4dt|igm븻Z:Y|Fg%{Iw?W7)ѾR6"nPmHAGt5:B՞ QbU6UٟÙ->~UAX6 uK)Hu*)Z}\ћ=RN# y*bz^R]rӞmܒmZFj*۹L0H хQMc_Ut >eKrݷArϫT+2n%#[@:a AtVFzk\lJJ,R)=68g%d+ֵJ%@垦zIξnjDܝ7;^\!V ncy/ '~– q^:1cey˖/֤stMqhINr|-1%Z($|#1 yE9fDw}7{J rIƫ o5]FL-5u94$WmwI]05n-92Gz"];q28Fr[dq1,b,墤m;经.rikf]yy_-L9-i]e{p [" 98GSmqMwI&We{n|M9 X4E% )w7fm^viTbUi#82DIQ-*xx0%0U)hf"|!&ũN)^j5to4tηǂ#?5਼ΣKL=SޫzU;j*UKTދv.`% -k4&q%gRUD-\XJ{kvijHߔlsۺ]vǐVȌg ]4. 1X&AWʐ+7pOJ"}QMֽxhRs1& Us0+i7M@T"ǻ{ݲ۽Cj7G'NNʌ.񚸏Id+cǨM [Ú4pG| u v_;eolS{|&K%R 8A Wa$?dSv}d֥yRi/{<ީLeVOSBՖAx%$2MbcVT#{T.K,GnY{ޗYV aEXA߅dj P VM^n^,qo>Y~>c-Z($k9[mapMsV= _̯qVU@ '^G.JE[m{gε6"^~k6g{Yf%}m鋾hy,EkZZF!ҶNUh>̕Nyjĝg1nlV7ki%Yϗ浸*ضU$֒i[d'sqp'(g.7巚I5:.G-72ٗZĪhTJ~+soO%Rev3A=Lj\8cqє/٧R})|1*0_fy0#q^QԞ2`UprA S|~Ο/f7+rbZHeã;^c~H(^6tdYe[.Tc7C.MQ#k5LBK(!%"֏dܯkq-g}SCq5,?v2y.wٹg2lfH|6^][|^בЦB8((/2$]lYwAac^_4ZW%(jmZZ}j~snR2Y,3fB6C^m;2152,u߻Sڤط7.T[AzeT(I;DXCǦS,..g11G7?1{Ԑݢ@twpv1bQ#HRb-!ź ̼aw"a|MҎ՗W9%;&̟'oGUc%h& vF'ϊt[j1ڕu𻖺T wM8C>%\^ћSTW.XRdLJڪmnlVKvlel4D5+L⿍h^1?UӇӽ_Ib[i18Su%pFfۼ#D8I1.1-d^;%fL6at齡̼=Mwf[ͫ!A;-kY%d;&ȅ}b[fMmM/6jJ>R#+[ڦB *YV[m;Ml]Zf_fˉd]k;ok߅dW/7;GLJ-R._O3)?|&pNXn2-k^; 9MmvYXct"jwO[ԟIìl{0#M$vƱqs0r^ijrJ$ai\͗dښ-i"G7k l[OpO}*<I2m4Q;N]U6\3+]jao(lmZ(;?fݷ6tbgqY@$cdUr䮞TUv׻IvySOr%fwkWОѾR6"nPmHAGt5:B՞ Qb뒶fʻ3s%o X6 u7Cm4A.'X4zb)h оowc~ZQo}$6m,{pteLȂ3. tĹn.5"jKsdz/.KsfLIKuo1!-xwf,DrJOQg5+aZI>9>QfKr&=)XObui v^t\n)v7](i[vVXP9`EUUV{=*&{e˽n٥n c{@<@_ V:HiKDzimqֶLU{f% zI|5NKZ\rlVwxHDn8łUWbUknj(59lNBETٔl;璪]{ֺ[zF2Qދ saُUcr֯i]L!zn]6׏Vk1LVadž5zuyCD~3vi]dwi}a@κԖr\#$&~jc:p.U6w4W\zlِQL SL~/wiqlڵs$#i;i|ɌLMJpXCYkWwmMŊ)]8jE`wz׳mK4<-&,ۆ~ePsVGDfeVgMT{S&GƓ,i|Py-Ҥo l{F&\T6xS5ȽZl+і-QibsMYO{.ᘛz2QR6$\DJ|5l! 5a'gX"[jEahzb |B<@t"#֦d[s;{&5QR>HUa g3VT 4RBѕMȈݧXol"'7{M/^mM+^|cv (%b Tbs&mx[iʺk{k\TֹE*͆CP2j+^ipةDZf57toa&ML,Dk 5L1Lil:Hvg|0Qb2a)f\,+|F =m]gohSߵfvIkH,[Z̎RY{:#%!bZM=MTnܻ4nr/l)zvnuLL ;^+6t@Ŗ&,8iG{5lcWtcqwܸGz"rfM&`kCnj59mNfRɰֱSŻj鳻{{49%Aq"V1z,{aS凥}NDr=[C9iX%m6^䥿KH@6 ,Gڥn9ͺQQMF(˖srWuǎ4n, X`ObwcY8ЊewjQhQ))Ȍl6;vWIŽ+Urkk\Qt$}2ka԰K{vM7۷oxL"<5%0Ï T1 `s5]:#{zyl7Sn fYlZq+Ǜb`W5v*|=ަMmLqKܴD} 2c[r0"遰ޛZ^V S ҭg&Ĝ|%y?Ƶm[>&vخɬg!qUf] a`p v,<`#eƢ{OfCe."m̽E2kvXF5gZNl$v֭ڰuS{lT@64RRA'jf@cXڻ4-SIjgk&wmn2]Grl?i{*= Ҳm"fLde1-b}3P2$umj蚣%^g5l[eP_Ohb!TݵnְmHv#z nѼ Uv0f8srQԛw׹.3Kzذ%-p-oO6/yWD{p8Ҩ޲iO~m-XY+b.kNJ&FV9eH֦m3 8HmYwg+6,'yhU lf:˙f*Xf`en2M~{WEn ;̸ތDL ⮙"[Yzwݓl"̊4"+-b5-cx|*".4o3gfFdҪ#ʲmP32,[j`^u Ty9hv7^6^<nd+a^(ސjy5`nf6۷j]v]ji"[JĻ 0L`.)JبkQ4=2کMg;۸avӼSJ29-HYH5 &ک^'X&CV~7q1;fnüvEJv.q,b bO|1Fݛ7jM{i{ZC< B~ !V0hoqZ]W];6R a:7 aZ;٢n$-ZcNjn}޳pݕ #ũݖӵ+pp,/z1dEUwռnZN/n؎QSR\ŚۆځhPYËZY9f+*쭃asjm$5fj;Z^Y=Ta1Ob0W6`-aiBI1ڵN7av& ﭡkCu}P$V\U7/58k/fSp{[l?]>ɪ/=Q+8=,!κQ#.^ecDH^LUakVX{:q/vŲVCLHrıM+DۺБ+Ǽ {JuKK~?k02ÚWB*_Es7Z-*}?!{{B|}Mܕ;G._@]Qe[< Vfp;߲ژBIڰ;7=4+8-V. 9Hc_>J2g]0Mj٭twVK7 awry)!°.>R7a4/, JVnfֵvQԤ}2wfq[E(`RGp}O`t #H9HK"Y,LY{cXS &EnkOm-eXn| GH.R5UUmUQ+KkچDF3 "~4U_1˭ Nlٵ_Blk>mJDZװp"pE&vGjyvv; pIij̨}{]Nƹ%E\/L{_O{Mfgm[2}Q6sk"{UѨɵ C;E$67b[jD+3^4bo*̽-U_:FbKK͛RV6;|ݘB$cF+#xR ^xQ2#Zw]|ڡQfTKͲDO=/kvp#iO\5"/VkRR. wg+r;F>-g }\ڤ. 7]oAfFXn\[G]c\{5s1dOԎv~ oqob5"mOuzy5gijmQGWmv۝Ú߈e{QԤW6mKˬrߴD˄h`0Skj <1NUI.t,gP7#'=J5~BۀzGsY6,[C-Ùg8?Un훛p<,mx"`L[\yjLbrZdv{o~qv Va_RR,kKX FGL nQ"F7 Kg٪`/ cȳB "ht40՗ݪ-޻Q9-$& ,)yi8NmVɗV\ rŚǟ,2vND۾p7d L=&0൮%`~ޮc/:9۶xe5Zݵeĸ]͒1#;YL!"Qy'Ȗr3:6[l5;w|Swn+u4d-NJ.ұ8ѵwyX]{.5^YR!lЦSԗ,-h˖#3!_!jT絼ɊZeR'7rlf$v/ Ir/H5<ҰMvh[1Պ"&6]r?{;n:!Y<5cW`j_%F+uX,5Og>SlV([J#Q2R.yG\V_jfKdGUnL֏*+6*>"L\nHbYcY%%[k_\MSa!j~+izii%WZh3lXc5<VMܶbiXy]YvJ;l{b!oٸ*nLގ^C*jo2L\TaoQ&Ƽ2׌7;]kw aqf<@^gBX*#v"˼VFݢ@ŬJJAj!:c#SUC9Ӻ"zo6Mf;i/kgr!Xk tvn3 M=v-6Wa'nm>! {70f  QgA-Oieh&I?P!ojI;dX1M+;1JO_1gZl&gmW4XGUxn^''v()5^iic^?kiV&C,kZwZMH"W&2i26[*]åc9 pf1jMSr WYLCz"<[(nD#vk`%s-J6h.[/&$FU:,Dt~Yia|F Yx{6wݹn[ԘjZlG[etn+tϖGε2=7545k4R|Z{lT@64RRA'jf@cXڻ4-SIGk;Xw5ƩyFsY)p 29.pƍlM-SߵfvL6i fJ@ExHv;x!lo?ph0mv_ fVXqȇ>""Ghv*{PE9LI ZrL!?`y˔9>wQ-m:ya.)K4vCe5P [f0屩jAhrtk:M:ؙźj^E /k[!Y9khcf"aXݬ<es;mx}冖#o-]b&XpC q/K!js"*nZNt߰EdY:M&c*!nmU ?7WWsnobn&ř#ڭkۥϽD<@V[T۷ij!vKiYYiJ̿%+^"vdf5KjLr4殎vbk޻Z$ղsuY𤥊QotjKj\V];Yd鵮UK;2ʹl:Utڙ9ѵw|m{]V( 趸)U-4mOh 8 Zڑ!}rx\kU_3aMݷxJ:6z.DDW ZưZČn[5;h6[ak 17SV+ I] c-bt*6һy/P3ϪjyQ#FܙMh"d,F;i28-y4 w"w,l" rd[d5hz>_)>*-+k vea~ڒ)fLݻe޸v\ hY@LlbPf@$5anCk>ˋz(^_-@sTI{mvՔ@8x!/.!orj$17uTEӅ8]ۺUߒFaCW9gWGz?&YcSC#}_b>w b{`H[;٥{dv>ߙ<)R?-{?7` ?nnݬO`+X* O@fWĄ1I|ֆ tnvȴ&.ڼڳ"v-:\;!$QgYPKn! LdRGxumrJxxn.P]/y(^LTM-͕l6I7UЋbM>߫Ӟl(&)Wl;0V#/,4<%fU,ۓ=vϽggU:Vudڃ$ݷ}{鴆8El̐ Q&!!.lie$+0-NUčX);}b)[x H*0}q,/YbkR֢wۺj+Nږ{J,b)rA'N2Y1~SȎDr9ӭM\uUIVfiZjnѸx*[c_ˊT$)w_ m8XUIqnk}h{ۇS h6E,-Vw'H2nR;xg:\8ԃWsHڷѢz%GRHTjY(C%JmYpn`aK,Sγ;fZ4nU7VjngجԽh "y [QQsVSiכu].,Zνh>ʜspU$?C qX(x7B"}[[8[eXbkݵSze{1mpn VuvߗYcᎶ O1zֽj6ʫYݱ3nXX`X|A뷈~C^^^sTj}Td}3Vzxg;H=n1&K6ј1YRQxYe]誢^tn7.W^M.>.3/fnj\9b8. ]ciT5o Af-<ׅGvfyجFfMN?Pj~xflQ~m{cE9!Q]#zB,/ ~6.m3ޚڪsʻTuZ)zc+};#Ydr)[ݮ&R:+yrM]I;'mK=RCh"3\iwI堧2Y1~SȩQտ/,TyRsETF;vXYgاn|ݶ5:ḻ)>jUr#cNKyb]-ޫ%$4Kyxݤ.12.r'T}GͳimB&_~,;YK7fLdVL if< c+RIܹ(j+]Mfˈ$QQ<>QڢIma:ڤu)+;lwKFSO Zʨ̧Z4a[t;e{T;g{}2 HR\c5Hyɇ ĬlQw[Hts%o[=G0&Qr>/N<Vݧ.yjZ\ɛESBA1^,v;Hk{3=L ʏuKV;ٶܷ!a=\n@Z9Z2/6ɮ}+_{xuZi$lnmKζi8?+8-Vj6x34 e%Xv,&̋%dp)ʹ]3oUD\3]v"XEcnrKrҳ&6Nr|6%vӳwN"t!$ e~o1< f:Rt9^;kC1w~:/duH__|FGJ.g>c\ғnh|^|xsn[SL%CSTz!kt9CʩTK3]rYW:غxۇQ+d+]a6(V+f% dP0O49rm+*q9ح*/{%E[lfVۡnϏ~/ kKa.fK+Zuj70lb75eg053-4^&G{TSs۾Z[[4ͥ53R Ƕ Vn7/q(JrW<-X[._S-_Yӕ{SZtY~ut٢F$`wY ڼK#5r9ʩyUNMV 9X[FZ)dFk9Nk?8`x|Ղ5~.ro/ϪTɉFzB`6V'| B-&`G{13"rEx֦]wM*KہV0ԛzyy['N>w{]vq&XcQssP1VdhLKOF%]j[e{6JYb% fSӊ;3vn\W:]!"@ǏZpL5X2CQ+:莊̷s:Nm3Y&vX]ìb/wpm̅˹YnzJ%d](dB<)TIuWfeثD~lZSSk(5X1?Un^PkKyW>_k"nYY;k^JLG4Ύt2U+*fG?gkXVj6xnf~dMDVl&j o{[" /"*O1csW5QSQ /Qi=:F(+HHc2+(eZ עAȝ7'g1pI~kX*VݶlɵPrjY[iEuL2`!5VmS_k%Lm{|se7}:>эX[!//:誓o 6 odTlթB$|3M3)ޣ~#_;+-ө!u2Ϗ>ZhQ*wܱW붟k Y MۙKfShfޫ̈jfDLj0݉eכfMmVlmYJ]fG isVݢ^ְڗ""DkrHNw7xv>~۾߽#vK!c㧗%PTIgk&{62aVa~ 'dK$J(8ñEes'/ |̫dK..Rn0v!Au'Mi@|\wfy^YED{V.Y^>r2q74ꇹH1eFަ1]k]f硠@5Zzwk2cUr*˹'7ߧ{-wGMj 0ྜ1 jx6A5Tf.7fMiYv[p˽kj{gwlQz1zVMurn&zy3Viݳ%mVCCV\hnK]q7{_jkcw )OQc j0@ y,G^[?e/ 5V48Ki_wvmNh0Ke6SV <*q/wc,IՓQE,Nzl뽳|^}{Y׾ȃ *\+W%ky ET n*2Xs , fڦj+7_ErVg>\ +!]l6(y:~E2_|UbS6YL' W7){,ل a%&Ð-#p,k 1ڳڦbnˮފWUۛ>K41vĜrlr o /1Ùtf++oB*&:I.H[nN2A60ڻL|E"a,\JBʖx}kjsP}Z5YŖ:Nץ0;{r_'slRf^ B; w"HF),i2EןbF U33[inv^ntQ%J3Ȏm i q/ JّcFZ+~U@BЬ lw.Πd] y3Y3V(]2WF%Mԯ[MI;&jю8U]qfD+YHylYC̹r=iu7Wgťo~&7խw}z=K9%(UYW`HSOQtts}ӛS>j^̲Wcxvp&X&\%!{#r,IY2Xi-?`BI}.նW{8uu>Hj klڙ׊zqw?R( E0(RVg/^yntʪʈn]O_Eb8,^75͚S;&_󣴪l#ww ^➒sbԅŗt q- Ti &PBaZ[3z:)3&LaMsK$ޟa=gӹՠ BL] i,4{^ƴ_zec OXe9-VSKm"_~^Joa;E'tem* \뵄fLmc gwqy!Uv+{w(ur%l5]nGU/ c>`%퀑d BkZͦ|y~Do8W8E]O&2R2E]+>n~n^˟ܶa 6}R%ҫ6!" j yPpƫ5bDYvəZj]ӈڛ9ʅ.dȤR-w25D$2$t3O4ϙ V)sjyRVRZqlŚŪ{a͕pRdHTd1 LI7g@Ř #Y<|B|u*U)rbPٗ]hZ]wi;9}1Zi>aDL8lWzժl7|exNu;1H7L{|w`/O\sZk]>H[/sc&<ڻ*t]1@(+eyYC//G?0ELfb1-_dʰU_m^lɵQ;&jю8U]qfD+YHylYC;U ileU`fcČd|fb/&Dj$3YJi]:U~]lwfvClLZdp\V)qf;E>cU qC,V0g9زio{65AoWjOS+6ҘltCf<o19ˈc]RtTWrSԊJ^ۼ7 ۮq MI71,9yFsdD{vf_ ZSiRmH*s&KGFG͙I Ycf}N7U }4 fHi7ՌMEFKmϘ/~jɂcVN,f&dR+L#anNzxmw՛uZ^gqo{xN&/09͙j)`SˢiB躉-!%NYc9Zj%\S*vmaul- Fb3ꀻQz,p#J,UgrUޡO )NwzwM{ҜvHQػv:eG 7M_(3J`/3eNo3fѩ[+xN;ͻoFVQ6;% 6.~C"wgVo=ۻ&~1_&,9۠S PZ2P2X^Yʸ.׵f.'vvwjfcj0P]fF6;2C\7 U`#SgV;7h"~~+vP @(^_-@IP @(P @(P @(P @(P U&μ6 eqB?"DW6T$LĀkZޱR&,UDPGFDyDmTQ m4P @(P @(P @(P @(P @(DJLڰcokZֵnw`of@(P @(!,VGTز8׷,Yb560$FV-kDD}#JҤ@XhPlg9RST,HΣ+d M  B( vݞ}""ݼ3P.qLG,r/lt@.y":!0x9<^ZOya@(*"ejYk%kB\7T11a( 6pU(#MͲtΗmb1cs KqF5t @(P @(P @(P @(P @(P @(P ^_-@e>|}.cHU3;*Hﭥ{ WJ5Geۏ)z/] L{a1,ݭ7M?vï AL0U h+ lNޱgx*6 ۱7Y[.maf X]ʟ7wS[SR膿-:~cBb*`Û: 5{3/uݦbĭ.nx%Z ZWaܬuVˇQ$c1\k vu͵$Skwƽtxwzԛ⇴\Q8-Jc{  ȹƲ:`lhYɱ'8I^Oq_wϭIx+k>HuEYHl=;/1:z2)!HqePYFK[`/|l:Dzwݖ#j${Y֦zqS[ *ݵv=d. fgee+2:Pqxtڙ96-1T`~;Yý<k%6Qܭ{)8ŚGʦ=CD}-z4nYrLbXdd5q > [Z&Wn-'0g/T,104_|U+`man۬/R":ݽf-cIT,S7Ć$%oA ZRX}Q[v R:-Xe/CbF#o)F6wwr[ӳoMQ+ ^FT5j35ens2ZE#gwͼr쾠nJ+[F) n93  а14|uǴ|L k0+b`*.; ȝMerfZFIh\,XG(O00rS L/o6} Y$ :$ʚpߘlڬլQWXox튗hҳ3f JV(8:DLkWwƖԘi0?gk&Ž鵮UK;2ʹl:Utڙ9ѵw|m{]ǡ[Y^ξ1, nzGBaYٗ[Um5R L; %fG=|1mk^$+@)س¢O ^F5#zn#>6-XLSSTݦFPЮ޵:k-VykioD۸!Nuia2Sb7𞔕q!ϐy;em룷V7?q.Gf'kj WLSp>l\[ =CBݢId[Mn&X`l?gPp-mbmwٹ{2k5.'![ŀ<'!Tg|0Qb2a)f\,+|F =m]goh:[7+CڻpKWkh`*Ұީ1![w:\jJ6vha{lJҷxqW5Sj^I)Keū+;D-ӊzE#mYrtfd+4mJ1KUD[]ИB.).PbǟZV nf6ڱD_Dݛ n-$Jac4c :1$BO/dQc՛jf+ֳE7yдkrpS?eZ{jmp;fŕq xؾis%ChUn v3QsVjbŢ<28r֩#AZ\6UjxWa1߻[<[s^i aXx )l0aX+ YZfFR>on8~ÔEq"2Ŧ-14)_`b[R$/nY/ zJl?ɶZ7vKIde2/IK7铳ϓXڻ;ڗpf&=ߟ2:^& ְY5jVFXv/i7C S߶J2O"lStȱ2ċ`8w>:XuSXqmmHռ׳km6̴ٖVYIv9 pށ>jM~qvZ},??P6k'++-+ޝE!Xde!mnϱ;no{ εNܷX)p.|d5dZq;X"kjG|/1P3IIxR+c80 WwmMŊaU-n}іeP^L8uuHfFiiV2͇Z 4˝4RRA:DLhڻKjLr4D{U&$)dAr V@43,1iWKݲ406nYcӡ{\i*mbm$-)\Yi,.PHeDޘ,7e5q8}%$ b=LQYi#Kֶe /?v&GM.1xv. f#!ćy+}SJ;l+vڷ' h<$k3\HByG6rs(UnC YWa0hAq3h[#PP0<F*Yk{b0W9-e'%Z~.I1ڵĦ.]1anH2ى>]XM7msٓeq{lT1mk^$&@)3YaH"] U`-TFm[-߳=vbxf`ؼt7`x%Us;D-,dQEئbe ^6q}/uHڑy=f*-Gzmi),n&Xr|ԛVԵ5\96+;X~ hͿvu3հjZSq᪍p^>ju|`df27 wɆϏ91'8g_'s R+Fsyy-fhMo35ۚ1m۷[acc6cˍ˟ ktܹT/6[3=rcﴳjF jiY6Zf+^lKc X|fgnL mf=敻Ŝ.&Cr(-p1sjZ&HhiLxgОڜ2z;%{e9xceXaiޣ¬#k{m"w[|llqcInApπr#es{?̨pd.di5#+ט 2X(s/pfVopUrM6?f([͙љ\V-50/{d:*pfD ¸\ra xifq|=/n4|VKfi].m o7O2JkSiLs_#,VZu,Ͷ1c#v6_fY'a+J'Djc86euVh~U,:=iDn -vmh0$/ W*CŋTjjB'~~U&ߐOFТ;٨~+R,Az^"!uŇ\S[H}^4wݷ\ iV!\`/R ^_?1` M'-&ov[D]c~U~rqW -m"Fzhi,sg/vDkո{V-!r~&.;s7d $9qUUj#NHTLJrÿw-},Id%HbeuJqɒil #9eQqI6RYJEKNlRo[jv +r @?rKŔW/?e˿k3Zj,R)w+*:+Bޡ#".y#pڕ]&6xe2KALr$aF:-&JùX `IǐcZ?ݝRE6qk٩G{׭I7|mR]ӥDW+i7M70#OBK㱇|Xmiq5ݝ\FAa{ 7~zT9ǧl`Vq["RR"e5$ZTԌ5?c+~*N͹|G|/1P3IIxR+c80 cjMSr Wb#SZVKtŶ+A4ܭ `2/#tnUh־vF׽2\\HU=*n(7[]܊iyv$w!V [t ts05IR7uq] 7–oUr$$M-fG)e`SXː̄ -NJtHw˼ңq{öټtO )Mk/8D^<@± ],[%!N&E 1}p!OV+k vea~ڒ)fMV%2lcm.ϒj`tt~cu[S͇o|!znHp~rGӓcQ%yAe7jES˽Eiu].RbV'o.k!ni$9ldKbuAGyZrC|PUkzoaCZGmwX{ISN12{ Mze> EE˷&gYY]7HܻnۮHs 4v+q0)/SE`n&B7M-uĐY)v+ |U;g$Oſoq ^Wr .$vo8{hVq6Z\Lsr A|ceΩݦRĭ.nz52e5khϐ"wg]\^ PK//H|u>Iy-]0fݚNwسX]V^Tpk6 7O~-1߻<) rv)iYXL ZiY lڻ&eS|n7w+--`/![-f/Q4wk&wz`u +J[.P49dJu4b{6nJYzg:ޚE?^_-@U#tp'x_;>XFUGw친UkʹRiEEN_6}׺l!@-Ȗa>C^J􇙎~ʶXuW|> J:-U'F{D`L.6#}1ǎ^&xyyjˊ_-H1}G4s.yA61Dr ĂYv q-2 WH[.W-{ڸU?dڳk!d+Qk[r DޮUeR];+_dľ LI-!Ze$QXz ٢YӦ{dmWn[{rw}\+eVm_wϏ%q V ]Kၩ|T9 YM24O4̳7ũe?bWnfoҳr\hJduL*BL8Yu-Bxe]<|N\>/d76bjY%w$gk{|ܬwճmoB2{s ܀@r&e_fm]0VwL구I./&mq~W[jqχ>Z1`l98fi/JY MۙKfShfޫ̈jfDLj0݉כfMmVlmYJ]gDs#CI1kp˚cyj;tr);'d1Zw7bUxu^WLоF]l|ƹ&3ъ1eȽp>:JBrS*f冲 uYt?׵h8"jD"ۗ8 rLyaD|5ݑ֦[7%V!4o+ݳmw S'k>PˎBA/-YS[-&T|akR~ꭻ&6]v׻n_-7v"~]h:1Qfm?gr;:t 00,Pen%,WxZ  -KapHܧvU\mOUNŸ{FKvck,LZ8جcm@!3agtE\8ڶ޶rԓvHȶQ@5 $ed|G-6{)ԛzYh$ATKز@2,Y 6tͽWru؈aMa3yz%uYj'U[;3Ldڻ?7Nͦ߶lflCdcFSFyY9:.Vd PYkseEӕWݭa[ܩlQg̕Ʉ!q}]6yKt%" yd+]DksaqjWk7ݱ&JRWj Tt7meɴ$ =GW&~ޜCVKēInY^{YSU|eLnx.O6dDĸwkJk ״4%g=ESj[C̮{Ls9x\ʬ73]37;Gz#I! %ɏ6HŸd1irj 5A!bhR/WbWBS3\Yuuv:>؍YF9.vjrZz`RhEև$ָvrU=D>Nޓ107 VXaph"KOK`4HS3sMV՗d趚mְt4y%rr9<')ekQn_o;Mt91oGb)sY'q\r3*u#Ꝫy]WrʳKy}DQ~ R 2;!dk~~a4FGj:\mŭ-L`֫lS:Z[hx6ŒkjY :̐ GN/99zMkɵIeԥoIRܸO$v@k0J=&#6ꖳѩUtˑKgv#E>|N.ݶi;+d8TC#u&7{ 5C1̳^$=*)xM\-;B7)Fl*OI*ʰI3a1F2E>EFhL1g?"5iVWi}n4*.jq{Rt9mt5qAg{=0 en9}\cl?uy-1l!o5Ng{]vq&XcQssP1VdhLKOhؤSltqTK,WSҎ%S3ON*Jwq\9v? %j,A2S@=`O DX:+2n:&g bB vDfW{0T]l=S]2.jdJ\s8M(t+5xR)'\ss=Wbv[-jMN/Ѭ֜<`DT~AyA-._^E:eF55g{o-Jvf%S];6sH"#+a+U]ٮnƐXĬ؋8XF5tH5ͅW=xL̟ :8:mfdxD}6ǸH,䔢SUe\^f7U ^M?kWdK]ENmLR=g+{2_ef,cskʌD%fFa E%V^R!/jf{^)g혨OpTkbBTht,0u:+}/}Ky`$Y(|keo,avTKα]DWqNYc9Zj%\[*vmaG;7!kӸHZ]#&1 NPMg#=MSȅ[V.v][+L34ͬ~Kq2yl坯kĕn`ISr -Al&MYe[e qK0]q1pievA--QĴ J$R VGjz}\t[MeˍvekX V>?ckYMD޳r_ *d7ndY.%ANmz2"婚 . v&f9_^n6u[ff+v~nn KyvC[ pY50=f&];}l]1CV1芔7xIf2 挮 Ʃ4B:mYN{?O]VWo~ڛd^#n2l8Ʊqmhdb9y rCR4KN)i/7/Z[{l`wu+&n. IR@7B7W6wlT~]yf˴ÄY2p!51) A5 bJ̍ Ii0KuNS+KV_3[fSӋmQX.~ b~-+ߕk"3?:讋Wĕ߫Vrh!Xe߆?Yy/xK4'峂iΙэ2xjg:< nkgs湋7)L+罌o!~Ƥo{UW*YmWvl}`D%Vj9zC\rHO_|Z*"GLyMvfK=i6Yi4}+f>=Iwmnr#{&*dxc{06 h ,Ť,k%Dw5Ml֕tc5Ӻ~ vt``X-A!JX%YsiUǥN9{iٿj]> AլxHG"mb*;9U oDۧmzۚ,$Xnv3,~^u^riGL75Uޡ|WBYw{^`6V'| B-&`G{13"rExԦ]wM*KۅoO/+dsǬbdNt9.,[ld2YdBBAf~^<-X$Kw9n>J+llOj,3s%sT e"ހɉV{1"̚X sգ3+qI<-Ɩdnt]_)qq)C"p[ΓZ1*Dj*kYÇˮNcSEW"ƕzg/w*3hm hbB$ew Y!)y3\f*˛=+m<#v]Ecx3z=~ۘµ*nke }M&691jcci<-l>ǑL,jKĤz{W 2"_2X<bYQ]U_.s5~V^^,i.ԇ_IͧW-Й5HhjL9Q^ojXȑƉy 8jLڲW2zpfe_/Mɋ]?Yv6I˼o3dN"~]eI7k8Xy,3.,RW/`:`IVlBFB%"<=0R" w6733qjyuڛ&{σM쭻t-wV{V.W#rY%62$qvݚF,{Rv ۇmHS-7xo"dXp\l X()k͎DXtV7ϪّRVec+ުgTY.w54^ٱ5IQؒ[l@plI`qF_+O)Hj7+b-vl NܷftnZ;v~z޽U6mݢ۶7 uT7Xz_ oYj2M-˦JH"WʦvH=&%w5[^Ճ !c7/\"OɖUHoNgQdݴCVC5Z1+9,Ԉk:-+6yZ߫ڗ]TJy̚VʿlO^ynN9}gSX||~93DWg势]X_wn"xôaFj~[s^gxR/~lܿCSc7-̍wNC'[$reX$#"k"4Y"LզI[7^fҺtIvTm\k\9b⮊!Öp3=V wsCa@|m!9cÎ^1 qTrs+=ۻ&~1_&,9۠S PZ2P2X^Yʸ.׵fw72ٲvԈ}DId$ؙ(0Pq*誴goGCq}&1t;ΛS̯;{r0Dp;Uٍq-rEZhfSl v^?Ԟs|'Cݷ>{wfEVv*d9K!oE\Q;rfLSCsM2 JGVl[@ ͺHWyfzWΪ밻.0nfdpAsb40Z sYif˔jjj¬-LIwsy[/ٽi%6wlӬ{3$^ 'GmKc%aC܊;NlH1\F˼Sٕ3QVY*eNXx0g,/ef XR/D9`^kܿwNC'[$reX$#"k"4Y˔I+f+~RtWN_[8٩7ۿDX\4n1r,Qr\h,Q>_ ʃ\c8g .K߷G&ܬ+,h6b>`cR :Wz[Mܷ=8Z~Vk.ԛYWQpN?p%bF7 glB ?c]Qc /˥_ʔ:m3-f}_c @^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P \ʔD)q+_BB^*DXET`(cJ$ @( vɖrk}o[/.ʀP @(P @(P Z)$f&G{Zֹ G#eP @(P @(P @(P @(P @(뒲CX ĄkZBCA ZR&J6oـFLP;!JvuaP @(P @(P Tx7nDWֵȯ/e|6 @^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^_-@AFٷ2L<5K6+"%cP*UtbsYM*kygwA.17qx]ƴ h =p^!_sH9`&=mVkak= ߻>ǐǸة*ErТ9 S0xMM3H]r+dZ0@o& J3Ë#Ü9¡ꨊeW\VZ#{Ud߻+93sg4RD|^ClQ.KliБ⅝KTl*Rһ`+\Y$ :Tt=754mvhE\>-b;n8 x6Ric.N_k4^ tGRo;5;BܤmAbcI"݀yd- 2W#8z_ .n,&:(IA$Ie0bZv%)jㆣ"hU҉g<) SxM>E!K."8$z)__Y&j$\ēx/wlB69uR `EKj NR w{`jy<1tř#ۺk]`&νϴaج% R1aع2;yZ6:pw]5#ČI_mX+[܄JLϏΟj (7MnM~)86"j/ډu)S37znyjf]Qn'6L4O2#!]ƬVT2~L _0ᵧWd:aY:҈ɑ8а՟sLGTg d&7&IWL3aDboQ7 YWj1;WA(VWG͸ϛPDlt,kD{G=ZB#VOlWψ]}1#WEj{O)T @D[]@&Y&qKtg!,5-6&M{.5^.ͷ=wOrľfK rx=M0׳5RԵ[_S ] 1$lMujbkpÛŧ嘕c*DTv] &G;M2Vģ=,^*sP|:&-biTNqPл{~f߸Fk5 _ވP*Б[vavglcMGvm!RbÏ TkS-f27 wɖ06 %7;-*coEK`/.rS[-j[\QIj@jc"_טּhD#U`mjWa14{v;v*;AhLcfA )jo-`R;jN1~첍@Yef^uעr5,GO#"Gjg8u ZjL{iE,w+<&Uq&sc*UM\ 65!ᵧWd:aY:&ELt,5gQzen0)9Z}0;t-OwzH.+.*#ٳbiW™i"[{ncVVxlWXqZsM9횩R죝dD &D< -JbHւĩ`Lo ,X"iO3/,Y54"e( ӓ^ h >n\U6 v]gO6ڽTlbHQ0)-Y&ً r|ֶ3#7:Ҙxgٯ ҫtLB@c,'raĴϓ,O5t ]c/ݣr 1YcRh)_~7sLHXI&@+FѾ3I-#UjK]!HX6FFsX4ی9=̍dnj69ێ!4kHFDgB#|Uj+mfAO/reEڦz~;\Ymҁ+qhYm`eXl!綞:Gý,ef}?͑^զ /QI}JI2ڲ(P([vI(g KM:`Xl;Ho=bpzݸm; X{r`X_$bݲ,@+--^?)DKE Q1ƭ&!p]s[\gQcJM TV,ZQ$(8n8!] ۮgbc -^U]#tౄ08`yzo!$*T̛Z,ҰXֵ/YYRͼH초җVjfZdLZc4?ڮz682<>\^Ҹ*ʫlT'JIJJWrn| \# 8ŢZ*6I0ey-b\ +ZS\EVyV;v[6[*:+! rY9LXCYi鲺wk?zc^7gWڪ3SkjߖYo IiJE_WS.}DE[vtM)4"_TlTp^ @۫}U)Y$Uf@,}eZ\o"1ҖeG+biS7ꢣ#n kzwję9S;7zX/Ӌ|vfpߨnL&̴~2#rp ]d~asgr*r=F(7,NLHIvbZ601jIE!w\|:[}4+ {^>15\y64f"wn幣jAS[Xk#P$ZͲC'^:D,o+ݹLw&ݱjw应m Ulb;Fm֠b kæ,ʡ*ҖdkfvkV ji9zN (TTߒ*s4b:Ҏ$0HВY1F'u5^N =p2ßɡR?/mRKkiҋiޞJ 2w`ݘ|(Lu8nr5yb+N,g>$ڵH:]Ut=4kI3٘jyՖ?e»llC,+-l!%0[fz8' RHd#J膵7 sټWq:Fr%Kh`%kln $:VTuoޛx/r%^Ҟ;βӻ2Y--!Rd=Oe-? UE<6ķҡO֯o6]!H+d{[F#Gu/9 q= >]%R i?6ӳ}T'DFZs͏/(aZ&>*Uϵ7I˸L綧^Y-c{^726lZXUY[)]76k-޲Q>DB^%+@-Fyl٬B:%wSe̯ ^ }̦SO ʅߒorPBuGEKZbB6bȰ̈}ʥEЉi-J?ёM+&_gxwuemo #5Ny5T=Ḩ}+SovmLmRV&4Hs'Je"7 C*Nݓ:!] rK$n҇yi\Ƴs 09[ HeB:{/< NN~\e`(IH-Dy(|oFéP>/w$W6lml.TDg ]do-LZ2#׻GUDȺ!a['֮״Ln-K\."N2]'j_ۚ_Psn YaTGySB:;3ceM.҇};OjqCéKW膵2|>{141-tv,ѸllQ\:bbhy8sQtCZ%tGv滈$DVU Q ץ!m4夝=U+dB5"e7 r3'wW|D#n&X0wWe?f*m㇪-=*x\:ʽב%e@1 [F ЎF7]Üd!+SnKI,bbwdځoF║X9$5"*̳aji4ovvo;Qt-r <ϗ>A'WEl$闻S70掦oLnڪ[,/f4tk`-4|z ?T6Botu=M6ķ{6>L[2ڰIk0El/>rU*DW]lyQq҉wiH]4`Eb"c.ba<%ƄA? Ob*:gՑ+3*jFy2妏w7ͱ툅fૺ5a2+z9y KĪժ__3$qRFG}L *]+a ]9!u2Ö4wG;Z泈i˧ew QOzmQ2iek)DFB1X*Vem7'3]akOYmǩpuřtf$x6UUkGP.`$X9bXhVɾd^ƻ4R|{݅a0JG'PGqEݵ+_C&^ݮi?zoQ 1L[q/k,jkY&=6.ͺhn@P{)<ǻm|ŷ:wĚ˥DVh@k0+7|Ui@1~.§MlSJGvQjaq;l#d3|x_!!.Ř DU ]͒1#;YL!"Qy'Ȗr3:ݵcZ͜A;w|Swn+u4d-NJ.ұ8ѵwyX]{.5^ѩQv4$\lM[4{%tu3+r$y,!j&kYl\lj _umtF1&#{\rA,,Kc!rcTlWҰO{G8O+hhfgŪz+4j&ԤWamL5ւTO-L˳>7w~D/$K^\Du2&>cKbUH*On:ɈqvdKLuV2p i Xt9fERީ+xݷI C#^ T@uA<˞1W.*1b.Y.id֦Onw|]8ҙ-Qحu0!11=阈c5xNYk4<yi-v;e͋{60JFHhRc`[a;i FB!._1r˘kLua|&kz%ܟP3nhJ3BWL,5bKdJd1Shj^73zL:\JO@pZEύQ nc<VZTy r?3/ɷLztpֿByv'ӎ A]2Ci6mkOL̹Wx۪;&ZmZp]ԩQ.Gyly C޷l[!!*Y67EI[bN/֢/[-qgMfZ)f~+ljݻx[&,)ȚRVO `>CyAvԓ&7jEI͟nqܗsKEg{[v4V@>/~_6xWJ]⒗Kq4hIvlzvfݘA}6/ z\t|yPŌcqoL[CZnI}sk&~6k,Zg$Qſghڻ:8Ål޻QBϨ/t4atzLܱ Z-OL]$(Č#{Ͳb%VO =߻=InH_m"#JEUoJ,|vt !QI"JBo?:)bg5-*,\Aܳ;gZlDkذ {E/m}2hIy uyu#-{Wuf9"AULYM2ڿ3%+ۗ;s0MYmzQܰR~\''ާ%#e&w֞7ێۏSk ^-3gxJ"wO&FKBV} Xɍgh!XFSH1qY#P 4k6ojs5츧XHJ' wVr ̜Ls@V~.dR72 v?3}Gl]a"@ 5)uV_eDY^WNXau i1㍅c\y?MJu3tYjΗ81嵱k^ܭ07Nͫe[#F 7칊RmFfǗ*X")t'uWel]oVmXc7oq\+wwX"Dl@k;*0i1|3%TbLf)PU?RO"-/k>{͆Ʊ}m78v\qm&찉 X/s7>]vA*Ўcl6uo5Url.Na/bEZ®ΑS>a\xك(NJĵK5+y&dzSjkm8|]=dԞ*Tkzo {oYjJ߃<{kT0l_jȤcwܲݔ]׻_k S!2Q 5W^ K)%UV+kN)Lccy/zi[ k\xJÛf8iX޿͕+eٴw'sXj棤n-B,=LI 3TSEL; .SٍCZ;Z8DuF٭s W%t5l<86&U1-];ިvv=3EFjd4MЦ9m;.0ϥ8UARd[1ވz~Nuu\[?EL6Tdgł }k_Ʊt,>8*mv+f6R=÷jT ޛR&eL 7T1q69'/$[Qt,7Sc^͑wѷY/h܆7,P,)G᧨D'v3W*fxq=> ~B- C)qYeJX/(|ʄXkOHYqk"HVͺLv2 Y@YX[vmcs0qMz-%WNK…^_-@TwI?rWih[.]#7\HryafV\IobJmK.v?-L6Q۽%#nH9- %!|g!:"RlV+f-vl Nܷfwj۳kVڶ޶rԓvHȶQ@5 $eD|G-6{)ԛzYh!RJ]M^NwCb["ǃ'+k2yzu&g˜L}xk~{#PC;$ NRÀL$QAQkySqe.Lö:pj.?E9rycai Q>o͛vcJ6qA]2 ƻ4IF9e$*%u3ysugxJVZj8,ФSb䒳J9d^I 뻝3ܩy%Z"oYj: ;&J=bؒXGCsQ$W4ЈovMgosbkUS1۬}drn.ߜq^%XRyzЭLo?~^Mjڔ~yǽrQd]-_)w{t|DKkʱR˪̩\ٓ;gG~jcd&h A+\7Aw喫!y!SFj3i25sb,l:o"nn_LjGi aûw{q lErLb?/ƺ"#V e_?noZo9[K~3>s׎69Pry,[ DRf|_\ڲ[M|ߛâ԰=+v2_nKNljmsva٣䱜_qڧ8x}ڸ"Su~1*VӝwܼV56lxk񽺌%8 G\uW4lroGf:*훙BvMD>d3Up9Һ2HVbay܏Ze]l }!iEDyɮ5kn6]b̨DCuW3/uC#-lGw O)O[Pxk߸l;!QHjK5\+vfc炗f<ÌX#~~m\9/{.I;dN7Uܨ{IIal/!7P)ڷ3rFWۈ}w{c{rM57:V?/G"# agU)+OٿTj:Mie5RfdإPn6D~m+Z¨KQbZ^=:UU<ҵOSlV}6rʲ8yfv6 4) Uw 2:?_=DZjeɯZ~ڂ2n7mMvݺ3-!RWXY&k,* lu5,2=k.hV5k-P]~ͷvj0›$-n?9'b)@nxy{ZԗF˛#kfSMցE<]mұ~UYώY8F$\ sp~/%v Rd'׽E7njk*8qtZ fMv3~ԃcet>D'My.W2 kDj,{+M;'5UrkioݺFÑ'+vҾ9 zwb TkdF1ɺg}Y V.v][+Lt6Q/M峖[O@n(R g}Οɫ"A"#W;X%]B[b\m 9cE"7#Mvz&搫;Xv((r16 N2# !-2^@_R$h>.>Q3cetV7}Ն5=?r}1mI]$pj Xg$ qo#K*"hD<̙SfY {o7 괶ROx0(Tdt.XF2;,y:hj+dgW׍v"K;Nf[hΑX60"]fEJ/dcsxr.3sw>]3JhrtsOrv_n{ntG-}^,kFڎgRZjg٧zcܞi/K7[,?Jhn8l^Tr·JZp˧C2oN\h~JQ5ɼV躭o*wҘۯ>LC/Qvx,V!4$ HՂ52hZ(5\ue+4"Fȍ_Ik˰{!D!QLXf2zNl*r2Gp,gحLl[5FyOQ*ߛ4Í[G@̖b|Ƭ g c6kϽ^ҷ;GVc撊d& _b)7=b$k6湒/Vc4c)VnvݖߵE׶6-SEӒ\ø$scCXm˨ԛ1H\{ώdAtӹzi12'!lXބ +iA?M˨o=qzEVjꪜ-5=iɵbҷd׷ӴM9!Wě05,(\Q] UK6sgRF*Gֲ=V}쮍^=伯7^2,aiMaobRP)oFhImPj~ٺ'MU6䉓e R;.^n89mt05Me2֐!ĕM\g6+k klx;Snbn&2QXLfdHU|ToRۥ .D!fk-ٯZmid#;vgsylqFᚣ6FNN(䆭?L±AmWؓg6?//}MNnɘ[jng;8 R4dt>ڵ,c53bѻskF\Gb,L;tkػ% Q$I7q/i LEZݛNztcnsخڲM$nܢo.*3]bUpسs00\9eb[kCr{.-4$"\}ӗ4bukiح!Bl~Rŀg]^*& ;S5lZ#t+uMud9f|7oŒL>YnC}HܥL_aXuV,1sErv,Kk\,Ν[KDolI~/l$@h;ZVm3%x1¦j%|ɹ} ̾JW}ܽ?)l5p쇡rŗ{n䁖W2%%E^^릅zne3t˧Nf#~4xMwdMt $3FV,)n-VCBQvLk\3;X9causrcR;OulO ۸ۈ]mb+gbe~5K-Dwsz}NU\[nI ~|'HE7mmFbԲ85gmu<8J5.Lo]tD-o'̵F>ڝ5+כILzlB7aSh;[*qU;Z•fHjf7{67yٷy=lbd`o3k7 HyijOen3;NLo'n hքjN:œK.NG)I.CeHSx%5lܚnOeGkmo6,)Th1Y٠l# =N|:] dqk7|=O"zJ6!2W9%],_Tђ-knn~$GjiBS dsr{5e6,l6쉕Dj̫E\ݲ0AZ2CwL4en)M{$Hg.tay/l͓Q6u:wZ4Օfo [kav[߻* D- ˬqXB` KyHuСW9EbDvlj.+zWʦwvY hf R"w$BKvv\L<|fX+R6+.ٳ2ݴj)m>?rGx/m" u{PvL~ W/775טXT9QɰnN&g\F๼DB77mqC(a݋ +Tk,&N'?wUEzo=[ئRڒ]Ek drI܈8Ed4(O& y?@=k4# e՟OdLm2m6.UkR3@ӂF9EL+7kY=ԵX+U]nLgkNn=oն%Xe[\diZCN>d"m*teK5*!* DvGړM3{[nT^M6ݍ3!)V]\M bvJicEuTLynLֻ%\MG>ey]GeVy۞H=ղ!>Bl6wnn!uRLXgXբ#V e_?noZo%U\[nI go{4n֌R.nH[cDHCժţ±r{KVTDnò6*͵ۗWٷǗ1nf`G*JXW`[<ĝbXz˫՛zi9Gg-k :D.X'wdZݏ/-j_8B$|Fs%lm-7΄dmklX,68 L4ӪEM+f3qň}dklX@>ʜspU$?C qX(x6DOcv_7kgYamvqMKIz0{ly3JI]K5lQYıٱ߷&W.Ij\9BQ\9?͏c˭O]WTkSm6(;|c6)O"A*  >ǛH<#󍧟4Qn=whѷ"lXJ|D L7,q%^#ϓ- u" ]?-n7=QrwIĭy1iFlDcC["ʞiU.)4M fñ]n.6-- H[ϟMԞE'}/g[*6^WealyMDvK(f\/-RUۢ(Ĉ#p dj=,@9cJRK_,<.CdUєcv䷉{jL6؂Ȑ]p [7P1Uf[;RԖt)Hd1Z.<ªOgKȍB e' ˌ=c=_&Bc5;-{5Sul*7jomJEݎ<ղFW up5]Sus8յnyhk]R-cVCQ`Hۅ D[<%J=hPhM M3!Q4h5tv җ5 9in -~92-|TMPtm$Y\ ѱ_+do顨$mދZ@(f4l&مkp&򏈨4@( Q&5(]aĊ߇eES P @(ӶȳĭGfX12)cDбHhP @(P @(#H"r=+cIVzg{d[ō@IP @(Zڙ2ۡÎS{^Ϻkb>v:Q4wYP @(P @(PWl[A6q-*[r.TP @D{} 6,cabv!O,|ėkpP @(ӶȳĭGfX12)cDбHhxPXDBI`#s/}6B@..P^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^_-@@lv 6r׹Nj1{YDKk8(EU?(sb%!4jdy `24LDֶs0C͕St< f;BGҍ-{cf_k\h]l9jxy5WGyDߩc HdYI[ _hG#SF[?NfTjS7vվ@L D Jp*zL3vMGK %s$YgXx{Hnһn-lxR" `0M) `FU2;W_phgXx9ȍdlV_/o V{SG٪2{+CE^R0?7jꭂ-o̮m<5fH]g/_tx:RZ˽->ogtw{=?:<2>q[ |Tu= WwiJͷ--IB>KnAő~+aNF?ʈK=}&S)a|He%ܽ42-*S4cOHˏ+2! kL5o sÒK n `3Hۙ @?gGRW \0N$?CG8qm!|~^GUcG?:Bp=nrΖ=4ƈq6 GPVBEMsh١6ld7,1cK.Xbek剁c{M:.]=ӹ6ͦ7h{Xo4Ya|zgYa۶x490hPe@>zSeTSxd*y=Y?)ns b + GB^Uwݳ)`{}Y!ڶq2<{pZw!֮&13㼍jhsq[ R@ng{Xmn7ZVTH;i0Gzn-5B2-] 14/sSFEMh&~*.hM*ηiaok>A?9v ,,GG$ }kQ#Kg^#ߪlZֹ̾h)NJ,л-_rxkOwkLyLXU'a^Y%DGyw63+):v<< Op]LJcZ8"OKx4wsF#Y~O٬w2?[Re;+2"*sY%;#{!"JCP@c,ŗ |5&OK5IP ګnuGYŘ⻍1iq໅yktGG/nTiRHg:@E2/ra{m&H%{ZJ7S2ȼ0,zwfφZyxa⡪%Ƕm e07Nhy.EаR(7>62'4Ba_ѭoaJG@{FMhxkYjЈq(%.IT,SĆ$$>zHhSblUߛli,-<Lj*s+fng:ę/3wب'QP4?vf6W+pس6bIw-JZi1mi4ae\G|/,ݛWSpݷw۹( Uc50LGdB<*Ha;_rm˥OhÎ,@ƪ ۶6m[d:n4 \<.gb <+_Rc[7X.XxK&Y c&ٳaDㆻAypcC۝2,ȘRIe+SZ+ӐbX~Ul-5ԦHӣa`7/:TU5*Pv{mQ\qED!Vpm1l .:W'ֹ̾h)NJ,л-_rxjNt.j,4$(QX2-w|>Snژwr#`;+ar `\Gtma1vpXLor]7UyT6WqmS$JBdhX| ddXĭ,b5S܄J@! & bKzR OwnҸǏw׽A`)!D7ks>QJv>/.^ӯt t 1% )&creB>O[[D~ǿhi Re?;kÕR\HrE573̶r3E6e/BrxjSOqKٻ)[,Z18[g~kR)F?#Oꖑ{imTi4AW]d yvk:+CL/a%,@ksp^0-U 0dtD+ $ L6!gCyMf]|M1 ьl9"["̄|D!@CܛfF-zxAPAy]t.@n `9d= +fqʿ3H=ji+vivi\Wb1׿̄2,BҲ|&旉v:H{diaZ10I4,W,/g;ɒe j1Z6W-ĿGAtmS1&GrcۋMm>i bEy"l4fNEdcxfcǖمީ{EUټV[kRn/o ['Dsvb6+^׵81˔/9-).zm`+c+eʬKSIjׅ${5k|Y)rW0HLk܁d7f6t`LH{t=ҽY3,yKCԬEJp.8t}!=z\wD9rAzzB@fJ?D{W֒m(մ̑hQfl@#ee{Di]E07 5#l4Z>fXG:q8M*پn{M\5,jjxpǛ? kbi0=(_Fۃ/{]e|s9N֚vBi+U4PX̐"![]Z*w6g4#r|.ܰ,j.{JңF60 $7BBC!/z",n'?K$W-\lo/Vwe3fXcGmLmIm4m٘S:NthVGfKMV_,jۯТ&׸ö+w;Co+Hk -iBU!W&6(?jr~5Y$.IC+ ky(]Vvs]⠿On$sLp"Daf-\dsǘ,|vWݳ_tHzw,Yۯf]r^_mܬ2Z|9EYÀ0j԰*DXZʛ3'o2ww4T*4onS;SeD۠no3"RN/q_3nUr`|UoD3_/Oܦ9Z:Y{]7~#]Ngˆ^JX[jqE[Cx*嵷wIJ>>UT@pRƻ-$l5됀q<55s'rakG'qqu:.Җ[f&뽹:/muc*;@T71$X3f&p7sfݵÇ`YwtFQ*'*=+՗CPTRٳ`lrmf7}N!HFm2R9,B٥ą^ǃeQ-*յlWY,ᘵ~Rndʪ.>nGe<~Y{pw3ǰ,/*UCE}鸌"8M19"% %:Zq*kv&?ls\.ꝑ`_V -MV/ӽ>LV,׳CŪ!nᐏ0G>ז~ +*Gz7BUs%b'Y}Y*nil莌P/ci kZIFyXRS5prjxBNEuKwe <4K;vf'f?{fk)-w9We, fmD}U"_>9^tETHhtw&OδTxn˷ڡVȹS,3m23\E8fz9(cnٗ.Y:ʢ*%ȵ+sәUi%{ӲUK7{{֍̱~fxfc* ]pqvȹa@y))C) tXe$%Kʪ]~V-]*$3kH:{wn.7}uƻ:YUC~Sm):K6jv\~!BMo>b@5YW ~E|$5D[v]5{+ns,"T+e]6i!o$n18 wC! bY Z l6NwY9J"}cxO/vO}/EOp !q#5gq97gxc/oj? UA߻M xĄxs{o݌ofE;ޏ'6lM*fnC\t: 2KbJppC/LY.,uO9*7d`wR\GOKevILomKπ&9#]Ewl'f)PXofoLK9nÌ!όQکq k=HmdȇJ3"9@]QRa./D`.nUٗfh( c5'SAK7R%O|"峫%TK򺹒'vQ8kZff bjBF2뛶IuƎ-jnݑ$L-2HP 4XYs,f,]rIjeGL"D6r v$RF``Y9ݢFQC&t/z|-l_; H~wvòo$n ZKfdd`K=A]z.ckܽ7-2Q7P[GQٛzq\Ԩ7f|.?Q=楗UQ"-rr0X[51s/ieC6b8 ln[SqmKvW\+l[⛄NF*VKa5bmVgTH#]2tn9:zZ^v2\&];yX}kdx1O]+w6ʗ̓25k)3+7n6AӺwdƎ 4 Uǔ4PȰf4Ă;Wj!] OK==v9{hY7 F@Š7V{#\"}j;r \ub]Yy{ݝ-䘻B20"~A9GUʵG:vM+8}۫,-9*0*Ņ0E)\ӎ^u*^}SX>F̓ V-fի۱Όɐ|xט`fD198XXG.|\SD}*e;2YR0MɡŊin97q}:l 2A1 r葢z|UYC)+lׂ.g?Ue\D[vkw\v4k1HZ٤V`9"ijm[}5?9.*yg ~9#vBfϓ,N.jN2+[4Hc4h[Mc#+opr̊{1u}WUfo!Eiw$5Ear6Xcdoslێ| ((f&cPrf5Q?:Ջʋo-YӲZmkUKSh=U’{K̚ J\D =P<4c.EEY̲LҒ?ޜE9ɡS_R}]kt8췝{\&_N!9U Ы봧Y7JsA9;-,/k-:ǯq-OYz$bYC27L0S7{=n{MzKKL9Y!VQ7UZj9 *loCWͽU13df(P713rA1Xyb;^[/l+%^;o0z- N%Ck1"ݦMɎ];.Ng;mIj&yws#PnC'901rxyDRM!**Aft˿O7.f _#3jV/6V2}lǵ%n'gfbkS[ 㳙zD~lR3geJXYVzzU\UmO~泲9/=n4n{ؙHppCv4)hǺf!MА1}zFQM-m u;]Ӛp9Kwjr) bĂn6~ 4.(s6Xu.:go6nQ/aq\^'up, {l% d Gz~ilxr?1ygur5Y:[+MeYŁ&@:W&ZnnS+qr1;Fτns 9M;IWa(ܶTҍD̗q37Zzh<)3NkSw%`ldRYG}tX>.ZT\ƪ}"Q̫TLg3^[DwˎwjM:h7fTFw;,kZ+S ,fIc re WKYpa._?ٙY̅Qd[lڴvV\(@@Śd Y@6o8]R+/LqH5|#j픲%ģ>h\.+Z\}Z~^\Nҏ LۑqGNg(AYjX~1`fL~fO#1(hZwFQ 8İ&ry~[1o%n^Gw6bKWp#=,V؍%]a DZš=C2ҤOk?:^=-*c=ȯ~`|>*9`_6c֜rd.B@ٷ!kcAI& Kj/c\ޔ=1/:՛qF;mo{ThE&rkjGeJ:$ϪQ;OEKݛ2fem;HݾsC}+7 FT.V` U߫gVY]_/ZKk9pXݰrL=B[DtO eʽDc.Z uyb]G˭r**[~jYoi*nᕯ-t1t9r$g3t,{$,th.H!u&>U&C]L(,7k>W>oX+&+?6v;/y1TX]e0TD}OkzznctSyc%ۘG IӲR y۾~҃*fknsRw  Xf-vrb0Аfkc'ҨZj]gSM?AIP @(P @(P @(P @(P^_-@IP @(P @("#sqlm\DT7{,yhAt|Nl2qk`8L?N9Q4GX.jǞY 7I2I;q .`_bMEl#A+ [M"#;ss5RID&@AnCr`HPCxÓ<(?ǷI:P @(w(sCc%lLxk#Jk6BֵjXTeXh챷uZ<#Uqظ{-k/SsQADбvy!'P @(P @(]kd)˳Pp!m{^B\c5M ,7k 1czD5d+sVL ZEP @(P @(0B$l ppP @( BkC`rַz=/P @kd(w+ { ] !*HVٶG#8WnDFw#3"32#2.jXMaP .GKr W~#q+JT\5Eo.%P @(^k0N:Fk}Eb=>uWqTJP @(P @(P @(P @(P @(P @(P @(^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^_-@TwvtYޏQodb,Ǘ΄ cfXz-({opl嶆bvJb!*?(@Ik%\X,|~T4H{u6q0쬍MW:O#k9Y'jXRvݷ\@,^`,˗Py j$#U0,$ysajGlp8a61fYYViT[揲Z^W;6YQk#]vAl%}cki$"0HccnaL in0@25DB9^Z1+۩kKxV2kś.eX*f?)SB!"ng6&=xf1^de0#5nض5~Gd_@r>`egBe,/ݗ}ۥ 99?R6̆0^yf+ LjƬa3\y`]ԓ3qs3vN\Ysck6د\#̼8aS#7q#۝᫣k_8{{<~#ۗЊZUY#WnRvݮ$vAU${ݖ" 8:NFf4а՟YcedQzJkk0!b YzE;9ܰ^4a- v{Sbc׍`>o CIYR:Y&hM+[D 1X-K-b Za )ZR_nk\vp\,<>"Rw/@XkNo9}ȱJf2[$@X `0&s͕Rw*׵jHz|R~s+rFpdž\YEֿT3c KfF97

:b!1(,5YHn"Q$|[:wJ߿YZ- 5o}6MOi>NQM,+*~saKEYvfF7oqt~,|M)tYv̸2@H ^\#,3jHr90.oY l6-}enV-'11EGf axa}W? ^IsGWi953-'(k vOu3X6ZYu:^C#&ְtM-RkDss_N[{{k{u6q0쬍MW:O#kBV~'=1߶4C{HcTQui5쌢P1x2|y]9qOzxXZC0w j999񗬽vqMH۶IXt[{aFNgM"Ɠ^+a`@Xa#WVܼNz`5 un-e@)!7lS #dNpW>0{jɷ3#g;Jkpшn7D n>bf Yi>pYT=Dv&߂;&NcQ"_;?5k]MX K*U퍘|8ᕲkbHNltȋʏ:33m>9W7:TӮQY|!'lVRNcZ6+f?[Umd|][{lR[%c.e6 ckO,I~`syޤ<ғOwnһO-pȶHlY+>2ZD.O0ǔՒCARIX] r_ŨFRF G\* r,H ݢi K•2:nwQ6̏L<,GD۴6B1-w0Zx"bƆzMBzfPqOF7Sş-JiMKZo{J%F,rk}P 25,X=a44?ZوЩNoͺI~$& f0,B'! biH]+=/Z p4.pW✵<<&B1 521x}s{.R#(G:<9IU5lv򱕭4_1X|d5[sps2fj;#bW)ֶ&QTHJf lBxu sٲo*lݢ:kFHux40Drv$M.5SLkFlsI=1eGeiX a>YV ֥c-f$F5;tuͧksIvQ\xٜ83 K6T-;Kb!9rcÌ2`n%n#gL-#I <܏t2O:ٺ~fjQMUߡ:YZw*v݆ #"6+[6/JTEqLEras[9͹~eeW+cǏ>jcZ6as  ˺oLlEkxKpS/u.t>u$sw]Z65]9of {l]sz`ZY6c&<519[yN,t͘sml$ &{pOǑ-dD[I.װ%*]lM3OtETCbr7ÐAżD k/,Ʀ)RL?R{nwgk\\l./-"yV{+(e pǛ*:`Oq#~-1Db32; YZ`] Hc9yL=>VOoU; ͳ~堠/F ~.O >{tT !`5w<+KyQ1GnkGWmQV{k<װ5B!QthP)SMmdlzgZ)hF4ݢ{EtRd!Q:R#lh^`q#T*bٔ}%ҏrO;bK,x{yxjc=-+؊dw}8-Ap c;m׏i~m=%X*{)vb~#툞$=61MX.a`b0!L<{sFͱʼnBWm2i0T sx4Ρ2:5VF䟝).7rL107ˍyWuܲ1̒bbm >RҰkwWfM1tiYwkvk͵M{|Y-|sH4 <%-N5thS~BU/Td7&\GdMW+"Te]9(k'TlX <u=OŕR$USg{d-s.:T5, D51?ԂIΌ&$؜,^$/0Kªa{ !.K)fv.>YǂD{aRR$VwN ˋ.ltf; dyl4LtF"|*|vaD^V*H;&&"DT_$gVxjVCYvٶJݶX/6xhTSc&PA],2sWElQn~esi!2E<9Ė 1X-K-b Za )ZR'*t#ZF Da(ݖnKrX*^vkHsp&EBS1J؉$ Ělhg3NlYUWBGs◈;Z{./qpiEֿT3ʀ^˾^<1^V"<9r6X$o.^fo-5 i[uk 99xM7P @(P @(P @(P @(P @(^_-@r[6;iO F72.Z6KƎKnx2|Q}AQN Ǔ@jhi[5<Ԏ.G;xAOqY4M6KPDlxbL *c|=F}_dfUצP-l;}۹nJctDt{[JDc{S59_ Iɉп5ݫm7m~˴{EHw" [jFD\]Xޛ>w}kVn4cl{ sdoƝõwDZ2 e-Yx`Dr2qneXkCiUu+Vq}^ =oH|JQ PwXjN<tmkƈs nL]{("3uDgw}4R]C"r~VF8c:VĶ,%jOw _wqu3~ _i"ta֞׬@Q Wc>vft&Fs7DO4,FTBFdz  [F61vT]Ѷtj~rIԗoԭl'۶1$T"I`۪d)9^VXJ],s\}gR66m8┶[n'ٝ<[R5q(7DMyѺ( G3=d~^:TH]O{nk٭bKIo !v|8^0XxY?i"Kedf6^Q]ݶs;I_6R'L %EmN$NT[6TtMotֲp^6̤1 M l>ط7Nu]۰XmZ=ګ kdVG1c*z=,nG˵-w])rLV8>.DhoLY EӻXH?9U&kKf5UU۵vQv~~8KZ:=fo7DŽ&Vz_6[w}n2LאЁ)6wUgm~ < 1ԯ˭z_wn4%w6L_wᑄ[V))1biS#\ZytJx0eBZfgW Ge[-VTE-/ Le}F2["ɲǓ.QluJ"H榳tvHҨLepFK!TT7! 1ABIuLGPEWЉ ]cqn5XZt~_-mvFS7ڦOC`#+!b 胬طɺ,ۧtozy#u-df7N.1Ato:\MG ۹uuZ,k:B[/ʸj8$dX>n!62Ze]ofp"v>xpr\غ>:9*E32lR=/Tmr1z @I[,\o4Y7ekqڤŲ͆БIb W݊(M#/X:b:.ʡ4"Bt[nV*Z?4 _;^9\vpMѨ7.6qLbϟ.b,Ҳ]'$_.*[Li1 v q LeE!kUiYVKegN;:S-Dn\bǍ˚O .ݦp])ԕ)"b!ZkܯCG54*F3-y{Xp[:nJY-wAd tk3:~T9T4y|=33ؑ.Bv=9OLo$سK"I"%|ǎ5];Իj|z{bv+Uδz$vrӳhsY6®7"a?jCHO\DeT5g Ţ"9cv*]s|b=$aJn6VX]k5cWʹ~]|%D~U18 @n[x-<ˆ,Qcs*L;jmv$ӽw\\d,s{!4@y!ymX+Yc幗kDm9lE$)r7#! HA!+s!&Ay6#tǍ)YܗEWScVÀ;o {c3 t+^ӯS9K3.}U&?wYS+,ٞ;=a7M'6MޝVIM;Tc#mm2,ݺ}ȄTHL[,ۣL$478l}mRUd1wwK~WԮWkDž|o"C!Iv,:0fMQ=\zgqQ)s%kҹU%9ReWTU.jn3'χLeqv^gFVMGkxKUl;sVhϓjj* Mkzs}k{g:Ew{pu!{3mY\K͝ʟX2鰜]L߂iȉw6HŹ jQT-@2j=I u_܍٥]M4erXVybym{z͵U{Sz8Ѥ#Lt8[KHEt3 S ܘu+F=9^uT꾝,Z. NN ?q-6kB,upVEXi&m;fwK5樘ʻ,ڑ-qSًyTȻPұgzt~w 'V,oXk/țh6=aJDT{jA&neYs_km]d-9tSW6fkeiZm:"ѶCҕhJd=LwJ⚚):Zz1cK5[Nwۥtg,<^ {Nn^6.^dgD-wDDMI #/3KˉYM/ڵ^qp:fd07(bݷݢ|bK'-i0CIicQsUٓo?=޳Lw{&=;+EQdy׽h_~g~ 3GOU31x~~?yʮ?˻gw{9[cJ;"鄐16@kYf^b%#io*0s^|'sޱ['qlːȭo*BFDGhr,Sħ<߻9e[*[dq'nr!ͰwQڟ0pǵ)fN3jS ^+ݟeW)ڑd@f2PE^)=7 i*3^k%nt&EwS-al=Tg' {]w(5I/7ޮZ5or/so9 p-~#qu(r3[>_ʼX>q:zu:SMG7;iaCtL}omMMkp=SʭaQf,RnZVRwj}{-{޽qCo% $ӌjx]VbLrFi<]'Um49&lˑtTޜth\sSu'ԙt83[rr.l(e2LLqyN7;Ù9rPݳ.\t?ETRm>^9YnVW0rT{F+ʼnPNnuiyUQ[xjfI;k{!Yخ`.wV1-rB7y4-ߖ_M*ܹ馢4$-I ur9v93CwN2,7X4ZRx7ttq0p#1=zhXIi?6ܬg X=U;pQxI=*3(js`9 ,U_:olVٶ2Zv!v͵.ɀ k@yϝf]Ó&O-wsvwwS#̔ЎAn`CK_ltڴϙ[%wӼ׶W-jdHY05]"-VaT[wمmNqΉ"*!E$̮aŠKG'hzFx}O'i- 'S.$XNd{^mJ)qs3c̰ve;jK$Sh^swXum'^]V'Zsu/6t#n#];w/ZBؼb1MQjGKKT)^LQo ^}n[5ټ#31km9DIJ,HLSdtXw3?f3 m[gvdAw=[ٹsLw.v詔EXc "OBx9pxkkG#]Ś$u}F$q{KW{4ݻڀ.|whu:xo)%>$6tjAʞLug=yfqv.wr\)AI ^%Dm!V-%N&`!kQQ C:s8s53lv[4'nط69ve & qم4d |u$4 Qlii|[S6U[̖[&AK |xzJ/l"$b"4XsC97)ޗ2gZ6M1D3%lON?t{=!.: `![{rҖF9}LxyH-876(ݺyޛ\3 مa*X4]=muomlY#F~-YgC/׫1QUʗ6콽k$CB&f%vԥӼ׶W-jdHY05]"-VaW߳n209]׶ZLA}ٹD K Qp $Xŕ}2%3e9&X}-Qt6u;v."$0Y*&؇ Zls~eo͓ٯscdwݱk&3.N%kCܲau֌p@ /TW~FUGEPT咯K!)=#`IJz%7ihnKL`6,r.9xPoenUbwo{Sdνn:Tr52Wfbb:b9r傷iJC%Gbw `mvH!V)8+MM?Q6˖ q=:]tK_Uv[W ->?O:{3hJ.)枚X櫐7ZXT+xq*PSTnB%y,Ȍ{ "ZDdz"̊!۵At:P @(PSTnB%y,Ȍ{ "ZDdz"̊!۵At:P @(P @(P @(P @(P @(P @(P @(?^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^_-@IP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(^_-@DM,[KjZJe V2TNL^ʻ6p]B>lo-/%>oUd{'moԨCU&eJ͝ۊvJQJn}-d{gy%jz$)|RBcqeb2=ҪIE|EwpwӰ .^ځk730@ Zu\(Q1MksZR?ehx5G[3.TYj(}.A#1|XtʱcV-ZfDwex7HƵ2"]F"W44hbn~S*\lʛ;`;Du;z3:yn֟vnħxM 7TmQSU6Jmh;|c-`Čm{XMW3~d{sxMmw{;sܩCv Ԣ0 6]2,ȘRIe+SZ+ӐbXctʯeoCMlENfH(c6IbpolIJlH۴)ϼ'ʼlTXM4<{%|< ֑Ui`5:I]SjR֍{/c9OuʏLˍذ%$}+\3JZ I?k5jvߛN .)좹8pgA倖m+[UrviCV-svqu9mdl7\JF>6[F yeRutY̢ͯCjt-|UU9~~U,#)"0ҫMIr_1$V 2JmSA̘\ܹ|SӭJlH1O"h״{c'jM''SNH$u^Çj`]͵ d{Nh]dž'-O7X{]捃6c24a1+c`#p1hڑvjTBʽ-k;Ί+cÎ6ˇŠٕ$mq.Q1 %2,p!`j_]]"&²qklɇkt[А}xᗻ\ڱD\Q{BBaʽ˽[8#lak e5DW$ 2/+ P#VD;;B*[3EF3Ϧ鴱'5?iT#'eRZ-Z˳5'h>n߉ٲ5mOso3*tLG8YWvՎY!j&]k?WOA{/;l^\HmӤH*_%rx&fNڳ1 M=^]8i:_rNqWԵ27&H̹ <Ȗ[53(O*)e敵 ^ wAtF7eeynm7+>+kq+d#^džНvj{튞1HeɐȩGk^ bZe [xk9ꦔD[L[5tGSidt65$8m}ve^y, j Y,T|bi֚kd=IijUyſ:krF<3P. Im&BZl+!512ґɽK/ia\(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P ^_-@Q}E/Ve]rb\BQ7!,5]Dgٍ}v0q\kVR/K˗IQٿ;&DdHܧmKF4L{`Z҄${Pu]zlɥ3r{ɯ{MێHV->,G5XXsH,-eMLfREj\S)Y2+ [q2f ͌*ISW?4#I5/ZzckT3uan.^fòpE,z~͖Y.\XcZ͵xl{8옩]JZuRەj,jnڬUHHɘ _#qIZLAXDh.+!zgjߣ3M~ꟛR:ڦ36˧w/i` XHv09/eժH}*nr96f:-'vͺH< WXdnC/xm\57nv벩[N Ov畎,wSb=mScQXXcZ9GiEӚ;7[R{d⽺( fIF7#R< WM` &qӭDNcni?LVhkݿ!J$t6 dB8]^W`y{.<n5>UQ[xjfI;k{!Yخ`.wV1-rB7y4-ߖ_M*ܹ馢4$-I ur9v93CwN2,7X4ZRx7ttq0p#1=zhXIi?6ܬg X=U;pQxI=*3(js`9 ,lBOIVOf꽜u!O G7rY؛}vE~LmG)UnÂ1ص%)޷[e˽sn|^UvwL>-{di{le)^I-%Zm_*鑖:nݕs_%$SQ7M.5bsIBP @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(P @(?^_-@IR:k#qHx-oȿRGΪ*UP @(~pj_$H9ffv "VSHget_results("SELECT option_name FROM $wpdb->options WHERE option_name LIKE 'youtubeprefs\_alloptions\_backup\_%'"); foreach ($backup_plugin_options as $option) { delete_option($option->option_name); } // delete vi data $vi_table_name = $wpdb->prefix . 'vi_consent_logs'; $wpdb->query("DROP TABLE IF EXISTS $vi_table_name"); }PKL\3~&~&#youtube-embed-plus/screenshot-5.jpgnu[JFIF``ExifMM*;JiR >fisayo9494 2013:12:23 09:11:102013:12:23 09:11:10fisayo http://ns.adobe.com/xap/1.0/ 2013-12-23T09:11:10.940fisayo C   '!%"."%()+,+ /3/*2'*+*C  ***************************************************" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?F(((((((((((((((((((((Ľ"i^#Oբ]6n[eOc$[p#,9 @#<oQTtkKmJh/[eά p1±CSwmq4q۰I ؊kI.+b('awtH$FYT\[3 ǝ9ҀҢ:, حc<ǝÂNxDRM:cOK2Ca3}(Jipxs_e4mcdSê7 xKַc^[]cٔWF _6ZVjxC[m-gO}Qsn02swtJ玴 hE鋭fW \ ÃеYEW."?2Yp$x?Qĺ:,G]d*_iBFN9_EfD?l>}+h.qHrE6 ݼWޝ<3\})"I皐p_KYNo AȡA gTZ.m̷Efۙ,&RA9oP2T{SnZVNC%&-R1PIb2}|]oZ=ݱ8Hܟ#b pJ(mQvIvGoN.{QlWv5iPU7<պ7nw?1"]~4扩ZMoqBmMA0L ӳ,__Ș/+,BᯀnG n0Qo+> |zy~ZGy4˯:5/ҭ )"{d0#eṚ!Oe^&7_F-af8Wr3[PmL$Ԣ6GUrX<:#i^+hT0HL{x#W%\,jSoC2Ti:io[n:^ZMo?fJlܤnn`zdm鶞GeFkY\b(;c+ +eФm٭JGuo'HOѮ-/"2ymn%)ZxSDQ{R{a)@ :WeElQ+6וk|I]<ڌ͝^!,.bҒu!zҵ5G5hWzp*oM 7֚k7O@+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ++|V׼{mBHx8ʖX=s޸Oi7o;$R*=[8>viٵ]>gtWɟ:n (#wVG#?c>/>L#wVG4A _T>//g4A ?5S~Aϩ}Ϭ诓?5Q !FG~[ܿΊ3C_[:n (~Aϩ}Ϭ诓?uQ #F—#?c}K_}gEx?Ÿ<]eouI%*I!b3Tg;׼VU:-&Ӻ+鴚EWO{yiFO'֋;[9U>k,QEgk喅 [?3AF.NMF(QErg_kKq^V~͝!NsMmMI);UTWw)gg5̡CHzx%M/ZDwmȦcU ںҥ)v*B]Šh?gdn۷hui:W#(wػc(Sm+n~ST?,WYGi!@AjQgku{QHaEekQHtKP1aov`V-;}N[=X2ʷۄRH. ~khЩ8hf2PoVuU=P,/T 7v3r\[LI&QHaEWo»r MM,K$g(N:N:+ ^#GӴU̱ 2X* N\Rf˴HePTPsN((ڇd_]\}am"<(j;4+(kV}EV߷nqVu_Z:X6ᜡCU.^n)r&[* )ʐB#K3rMg˯[=Z BPZBZG qUF2ȗ%:(((((((((((((((((((((((2)&Č(eom/k~6~ j[=,{Taps^z #ُyjlB)21!涡-ݣ H}+P%G4{F>hVrIhWRѹQ.9GΙDԮ0YO 2MtvѾ-}ώI+YcYnVПðu8QSsopy\彼j/7pTQ۱qsBjzo xOYT7s_XW̟X?52M0*َNJ$dgw`z/+|/I2OQDV6$h 4uw'~-~)ZOh E4庐1^EoB=u [j ]lCo)TD#9ۇ)u&/g?׿OjcDօySwIu@! Z5ztf{+_^7.^ Tٷ߿8?2ƞ Z+[qv>q^EL[߁PrYt#\iͦJ.??` ]mWjg"׾~<߱z9*+*mm6v] >M"Ằ)'I-F2=z=XR?0g${es>Vߗzkhy8ۭ}~h}W[v<QM,xI?DEE$M>s}Z?ł%S>߁7Rj(X[Gh}wצ;iji;i6m4*U}ےq~oBּM uV[p%e&'kh[]y{ܨb[Mv]}{Z(F]!&|w6縃X,r3DBFWoM:UVɗZԧ32MfpA?tW[Kͦ߷\4պt| G$:s_ϋέ<38{1gQ$݂Xn=}ɯYX枚h].(,K]uz1w P6f56J2yێVN|AsG`c\f'oe=A==(>J,]7:v7ctk/z^kHgkXW;ݻ=tmd{̙ ?/B+({],9]kn']C?)?x1ګi[<a(ڙ'?k^(ʹzRq/̨0giȢHsƥeH[lޫk%Q8<`E۰zkܡBgK/A 7+;!o'@nL߼؃>Zڲ"}gߵIWU%UH3Zf`oçBU^[NOSĨ\ِ+ɩ \,f͝gl-t˯!nH;wG#V$Cm5T<*J1⠬t>u9fޢ68ԫR;wյef(awgV/KN[鿵WY3A2Jy.#ꧧ|V-K89` O__M漪9vYׁHem:Hϩ\hBd1qF[W "ɦ-ƒepyqc|Cun f{k4%PC+|[ g8/#֌Zs)\;b~_0rg ^wlc 0;Xo `KⓓO_$sP>-WWGrt;c2$ M%kd8:/h0{H2EkxmCD68( )lq9bYjJή8mgľ%ӬT{ShLdl̗ * _3uqq]}Ln~W-Aj}ezUUԭ/-e-F(HuUP!ym/nN);[\&-!,escƯל>94iˢ[[q7h)i!dpB`^BzV%& U<#=F-ZƦMgD[oW2dڀ߂pM8[=k:{ݬ<@=Eq5|e Ѽ+͋.Ğ\7w6:_+ .kkB1|0bn4H \dB=q=?﷡j+sңq,I" }ޥicqgԾ\y봝ﱟ>TcyrN/Gus=20D,19W6 \x!I)uҵ}:I2 TQ];]RFjq.=q}Mo=͹ˌjjφGdIhhckyT(ǵax/>ipH#jDP4'`dsRW6_֧q>ioC..Ii;2q4]Z wBmD5Xd#<Xi͖@#s,T30,Pn[(_ӡ\a#O() _K$Rh 橤$?::}ݤq"b gU=ĉZMwGm{hpW J0썼 V]fcg͛#SY~ltSN/=K,f^V,Q6N$i&дi]fvo^iӤɶ+LOM[ MCqwo-0`X9yׄ.^Տ!5߶'sjDdhFe%g Jռ啼Wtmd"YLM"ڊW,?LK?e_* !}ņn6֭WK=hqe4ws,| -1,3mo-']_[jv>]z>f!DfM U154ZVMJ-V 6IqwqE" s ^bxI:ς}{!0CedrW?Ժu]O¶2ec%YEfU@3-9v2VZƻ5qżv8?4=s(Y8QkӼ;⦱,"fҮ4]-E"7Md#ҪEYNJh+Oo@^X.YyR7>[}CZKkdEy~}BǓwO9,R)}"-Ⱦ[@S!AGд&HIWXay6F #-Uɖƽ53IK1 ĨIVy~y|@xj)Y]A Io䰓9GҧԓW Ԭ4>HtO픺LŮ&ʤ$Sr qow̫.QX> <'oa vH&xUO*Ƹ 6 #kտN:߇5+{QjKFs#wN}zM_F)=QϵYsuc˶{ v?3{ME]ݤ\Cn@Y55VZ_ik~_Ǥ^[?u(n4gKSӮRmd $lnTьS.ziSj:x]3bKyf?Pl;#bɞ մiZiZ\^]^l k1vQw.q`|ż $7v#6`Ns qmMSѭV=\bNo9?r26eWx\ڞmX]"ܢH+%>F~FcޟovW:+&ߊm|/qis^KvKqq >hwCٽuKj{Nc}`P~SiZYwW\xCgMfv.Q Im̓[ZW5m+TM*uoRkYn `rKvsG*_'7-!,escƯ K=ׄ'7#E#$~5k^u҆/)!ᶎK)lYܩm.i9LK2| ]ʲ=7O-+JdnbcI2<8sWͯ s6ꉥ.u쯙)W*I^7 r*~e؛5*GkbE$B~y-),ѦLL/V ܿcQ*6vckzUKW7V-oQan%| 0m'y|{sGi?e? 5$k8djC?riŠ(aEPEPEPEP?D[Ph\G{vnvÕ3^H_6N+Ezx8[c~1jm/̴5 YnowuϴW7T"{F=RIܜu[w:Pӣ5+dcҪ55n|5 ݤXU);IM"YH"ʣI_hZz\li @n^iRfKR;F{ycYsR j⫍6.#uYw ӣPF Fz}k-IyoUvޓw7 uh'啙fgBzsUMB(66ϞwZD03@<~Ihfvs9*Mأތ9`# R9l;ڿg?I}e_'~HSNki*ŃH(n#k>'Z\B&vRQ(9濙Ϛf8_=Z>k?k'h'8_=Z>k?k'h'8_=Z>k?k'h'8_=Z>k?k'h'8_=Z=6cS]v[/۳683l"yF֖.irZQT5]bH3]8t>XtJ*EyaYXEhAi|5,phῘj+k'h濙O?pz5?|4O_O?pz5?|4O_O?pz5?|4O_O?pz5?|4O_O?pz5?|4O_O?pz5?|4O_O?pz5?|5Xk؏"gW/R.7R\SEWQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|D-@N+ώύy _jRXGο/(=Bڣ#OkgxQ 8MseFnW$K24qr,\כ(G SsF;Cg;Ow-Ɠfn䌎 6-:lrJθӜc.,{Fab =RGeZ<#$g5h* V6275m8~{uFg;.BPGBƼ9\ךX]C4 :a?x\N8a`fnR/$KQUJA59R;W`BTTH(#Iھ>YCWu)*KVsj??g,;y8Wk/ [lA?=k,3nuu{? '-\stׇޘme.VNz#fO_.'<;\bϝG]֣j@𭲋kD3$H iKK0ҵiHj698ni-m_uo1<7H&o9:: z-{[FGJA$#Ei,~_tsK='Nغ,;BrxC/1,F]?<<-7:z}ȷA0+|??—ֲٍUy"e2ۋt8юɎ8WVΣήMӗAڽռ\B0`̮vRxJOxrMnŦ[OHՈ ,Iz)>G8O:WGc UǮźfh.Y aJՏoe7jqcW9-<-9S/y/kX1#Szx6x1LWe }n7=Vv8::`xcX ʡATWxgt4am#N'}V'N1630UYIZڞEQS76|U ?RsZ5ƴ1Ly:Uƌd<34vΣή/[?j֓HZ#Y GLScv>^c(ӌ]FQ^KE'ywG^YhwZ\\Ū4OtppSU( ѥ:l"ٗ?To$5 x *kvN+Ω-䳿W#[:útn&e.Sv33?\23-SBdڣJT=gմQ\eI}-.%S0\K96,2I\`bd@0yltW>?u-R%A ,Oq;Yp1X3:5)ZK8 dުHaC\mQ\ľ]j:ב w<򺢰 J¥-@Ӆ^o건V e? }Ennlt5˭\v\^=TNn+qfn-ܣœ ۶k&I&k#o>VNᎇ"z_ɒ'GA&(Կ KFSW"I ĎJ09>{>Sd{ .^q;c>z7BqE܋1('&(Կ K6g[Q!wL770@WsxDp"(kdcNy:o/׿aKԿ Klj_ɥ =HKgxnfu U$\B1Z:VzmČt&B߃  Ӛ/O~E8Io'?ƥ@o_cR7M/V5όA_w ,:BU/'$sM>9M+q5αT(bݞ:} j19Կ Klj_ɥ /o6=V *M/Oң/pϘH @ 0i<]4Yc75*F|]V }0rgyyyԿ Klj_ɥ 5zVޯŅ\V'6|v<=hqjd,.aIS*H=A#W1rKEK4Gƥ@o__i:WLr+db9I횯 ͬ6 izI3#QpXr/Ocsg&(Կ KZԒ,/m$9Erw+0ꤊ-M6\liQq.OH#/M+/-Fƥ@o_cR7M/V~<.4s<%Y¥W@'hMrt}% tؒy P̤r~ȿN/kuiK4Y#[$ Gyɍ#;6c5h~3U:UPP۷5âR|#Կ Klj_ɥ Om Bya @]ۈr`` P+P_Grf6mZYV5oޢnlxA~?JiK4\WEc[H#lNcrsV=έu,%0mmNՍPH7) `$cR7M/Q&+2i%vɪՐfh-`c$d m:)kEvT1+)ǚ I*p@<~!9^/]&(Կ Kh4CK$[FT4+(c!WQg\{O,m$xX[ :N^.܋ {v=cR7M/Q&+>m2ɍtũ?OQH=xU_Z]jPgj=^HO4% ˎ"b Pxzȿ1rI?K4Gƥ@o_ |}Ťj-ߓwKƻp0`7|prEniW5~pܱLcnA1?~?_inEj|Dme0Pٸs^\n?6:! cQZ@Oi}^j8:Ihb0RI>i~f'qZQ?Z T4{OgO0_̌sğjh4Smm f2$->Tjo&@Oi}Q<&6j҃*8$v.]|K.K 06vI {O??罧MclfHu7vmm0G4}GQ{)?јR{O??罧MW1M[1/gyp1VcE$vQb[h{O??罧M/W1i2[[>Z}96+u?3Z_jo&@Oi}]cd[=Cykikk.>:wipc$y ;_R?5?i*ǀ$8m$yƖ[cMkzoH HԕmώE|Wyy7ozиe}OTp;T<z֍b6W; 't;eEn+ƒmS߈'m vkErNYI&::th*RIIuxsrjGsnś I=_>%;$VbR-QS4W_rkSvIwZ7=͠ayH7nH81l[{ߺCqscΣΣRJ+7[_kv mW#; .y^Vɮ}a7l+ j0Ð@\0uLQRt(w!VOf-Cmj(t? dGNoן|KωM&;KiF (Ok $V7sOw> &?Zj?$^((nG+r)|o1WÿYYgg.` 3Xuu}ukKgw ճY#l8}o?Ng=ֺF-ȍ>T=TaٮWΣΥ**^/-$xVe͘c*PB8pp3ұWY]Yu?;^,q3x9 sןZ:qwRT5(-uu?cE.}o~g{-OHWdkp~fMBU.95 {N5v''VQ)tVaMJuW-TԴM^ŭ/2D0쌌C+ !CV诀>Ń:,s-E%wR<2,+vEIӊe Xu;Yͼ$Cg"yaqq/wVuvߛ/'7.bxk0K2ۏ N9ˏiAXzeȻ[w2c19YYnS?2 W bA@ QF1uX-$0\\,E;w{5Ĭ0xy#V 995?蚵][Γzv1_…3kZ+Ʒl 4nTn[6ʪz7Hѭ#u۫4߰"*Z+OU\3os=g#A-Gu?%]JiYG+[i1[]ApŸo[ey; c@(7#A-Gu?% {s[G2 i\|֐0OkxY*%͝1ol mբ!o$?9FFA1Ek:ZGSZQzW7 mx7QK]1=t;?x$V[L/İw 6,A*pK`u rF#A-Gu?%/5no9{rx:iw:t n̍+mWqUbqKzmݟ-/ 6ٴ&"x0Uc";dnoH'<]?#A-Gu?%;o U_BRi.K/M1aʖR7 5`+ڽ[ ۇ[dhX}T溟GSZQKQj/O~o9#x.Zj?&ڛݞ^qXM1qуD^şR&6f6pE~@ :ZGSZQz_4~&--2kۭ*{vOƱ[P+8=/l <Wnw?O j?G#A-GN_vLKoX\.nU[~_$r>^:wM4X47Z@b18ǖF}#$w֣^~6oƼfuo~_]GvDTrU8ev#,UbR! 翆Z69_v7!B`c{:Z/]?˲jm-M/W$Ls>\/8潶֝jc:SW<Q/g}G +}RbG(way(*<Q/g}G ('}RbG(way(*<Q/g}G ('}Rv,<<{Wx'v> ,UrN琒#c$Ʀ"Ui搣NV ]Oؽ++`IHA tVIFVg<^y*ǟ:dS?bG+hTog}G ?bG+hOG;?0~Q ?^E];PTx73C _ 1ߣ4QOG;?0~Q ?^E];PTx73C _ 1ߣ4QOG;?0~Q ?^E];PTx73C _ 1ߣ4QOG;?1E~Wa^7ML=`?Z+:,.)A1QElQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEDp\rƫ4dpߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTP.?TlߓTPEP?)I? d ?wuOQGuG~ ğO?T^h)M_}!g)_G? d O]$SyE/;?/a? _}+_zߊiaF2A5ʭY Ԏݫ3nn?uX9{9=WECEl$TKvd*3vTZ'X~ ~#Km$ $¹/39Yu9|Ev¸szNJ-u HXD̋2n2}=+50X]k~35NVX}^dHi^8#N1mw vcZRtӻ쿯: _B-J̆v$`1sjbmbg_5v9=9+V:-S2CnI&'^SWc6YZMϕqGs(_N^kvDv%wo{lʡS -J6wAPAȯ3×h1hAe{SO10۞ utc]74xH.3;`qSSN1ӓZi_g^FFj\OkXvp~VOZjo.Ӧ[g,q7^1ְ|Qoǖ_g,#]:@/l@,;Lk$^Zx>= o4Z'sw96?w<{ VFtkt"U*FEȧ&c,֪pҨ1)[{u!uK&FKeo՘a+o}|=.R"Yu+{Hٶ* 6[[w{ J;`*z'nk,Z-&v\U>Vysil":.1*[=mLi[izSjrIrjj̠=XgZ}eBfӮ່6JA=y&m|7wnx-%g6NA=|VZ";,iuI0H֓[ܺbQzpNiBն*y=2@yW3+k};4f9#~uMïRO Yݹ*0iZjg)nKOPvK;KsIHZTn|&KQ"O#ҟyscP-mN*pzO[jiJi-o&TkAӯ^YxMG]Rv!Oskp9ь#7= y W(vu7k4Twr>Dٔe9犇AN8(ΌξfvI{qY&<6z$`2>R클 oûQMuz9&&${KߨQ*4Ҩo=^IR#Y5+{DcZU 4俳hXd?uJ:>/!#ɭI}6;7 .G~b/jG Ow4E5%)n3.}XyYCDwOr T,os}/8ki$sy˱؜8'#*ah+ePYk,g2y.@|zTP^fۘxe]; ɍ r01V\vmgiZ; J$, dg4tkivyhK$V?/G4 \me2,q$]p9?a_dz/n4I5VcM+b  O^84gi6^oU_UoAmRQfyyb?1l0z֝ƴxJm3ndG`py1\ch0&@cM qi>K|1Ҵ\ɧ̏$WR(D@*ޜѵm}Z㴇\nnSRFv@'i~ Ѭ.VpZ9QgA =HEU[2,q.b:|Ik"TNyalp *SKLMJq/oo2FA#?$),p>lW}B+k[V;( 9:V/{9/|*GgqzM$v@6pѦc5hu)GtbցkSV]"M.5Q0k[jm̖ZE89sy֛ڤ~ҵM NN# ~eҪH8wT-9cOR㷍Yal;64&._MAI-m{gj=(Hi!]Tcs^̲mLҼ[Ŷ~ hR˪J:-xMNQ}k{s} ,V`:^E>]vOFL.F{oM,bMH#,,g$0izֱO 3kV*A=ehxw*A4v)YW6pzwsS:+tJ\8{kKf[Jِi62?>WO[/s+:*GQyuJNtI-; { t^m>6C[αk)1cu~mm,e*w{kann/aHI=9apGlprHllQYxF6W 0+6Tz-Aciz̑^qgi uM-gԭܼ;“A5~>ly7r]) Cړ@ע|#aLg ݢ]2JWq`p~(`5H;XpH?Yc~m)u5״ç2-ؼfPK@0jw70ʻa[X,mcb%ڈ*Zu)m㝵;1 5Hnkĸ 9Qe Ze[[-bȰuArsm݂V4W3xC>-+L[A.co6'ԓzV]Kost%Lܧ8#.#QEҢEX"0^&w =*$ΟĶjO2t ȹz@iQY= 羅5=Եb [3;Zj6ZRKayqHHʮ) Gqڏ0,QYQ\:$K$Kyfr[u4tu;95(S|Kpd^9)r9# W;4G>qoA߁ )HwḮ^s;cb3gF2IGTtb ej/'N !dl޴qw<uq>][4*8pGEr1`^e{)\}E\pLΦ Yw;i: "ƅ'91V'G-KRwVIYJ bK9WHI@]E>[n pKqu(Kv|/ էR* 惣h6FUkˈ7u^!YW2Ѡ5oֶ cAd t+Vy 2sض=B "v}a5-{?0}``B7㿢!$xCP_lݦ2_Ӵr4*HHsG\5"K]B,//m,o &;NCcn׺{[25Mg3VXh䍙 =?s/v{b=--u =Bqp-sk &,o?)='gtvhqŶ*֋cl-e7n8޲k:/7X%ռZQBφ%O0F|E|f =|U6gH¶]-b;/tj\BB +U-]/?Hoڭa?!]q=d=Ҹ]-Kk{, ] -(ǖ .zm䷠QBѧZ{n3ɬ& =`!oE<+5L{}mZ%2)`Nw7uQޟ0۾vghڔ^nQ53<s >(m$[jsIJ8HԱlX͒́^E;&חSSfu85w?e4H_]F.sQۇČbJIEiQJ^TOx;z߁,ԭlt"]fYWi>f5c'9=#@W͕w9ݵ8g(t8(<#2ZiOHxbÈ܇P0Fqƙom+mVL[dD& hѯԧ&;|XV7On#X]I l  =O4Ymc-DYE|)ufN_<hiW'J+G.dv# #l <[ZςuYPMgaQ0Im;Q8F #$d=\<.㳆#bFQj nc$FGc#WDLf2[YA{.feH"Ir°.NBvtRNו{g Mi.Z-%crAV/n/.#Ok|}2"RˌnE(o2~xQ./K(PInBlU!$`,M5U#P?*EX_֡w^G|:խtKYIuB>^ZԳia]6TI vcq矜;d FxroF[8~}_;g8KEެQEQEQEQEQE|H_6N+4q#^H mW|"t_ y %?x3l3^u'^9ϟ\ ?pH)ONUynD-ni#m$n el=ʿ2^,=NW lcuZ47tՓcƮ#SSH*~5*j)h2OCܺ}MuNIĨ =t"H孑Ʀ`񲞝:4wvyj?qֲ]uFgD<=+~ R|E,FyJ" O|.j(ɯ:>(η,Q/2FsZ^Ñl8!pkSuj~eJj7c?ij??Q KQq"ݣE(Hea"vz'--Gy|?ij??WͶḍGRЃҙUg`Dn);93?ij??WAៈje"4׍Gv][Kmx獔І#,ºR卝hc Q_}hQEQEQEQEQEb\jZjVKig3ܹ~:nvDmXj}4V~OZ}]_y>ɛVڵM;z>ծiߓw}ծiߓw}ծiߓw}ծiߓw}ծiߓw}ծiߓw}ծiߓw}ծiߓw}ծiߓw}qYܱI(S w5|7a_7Nk:4¿6pa>*<lͱAֽSlA5}M+ag+Ix `xᷕʇ(,z@^ {5iLۿvgPp .sOyp$9I+fɨza^6so^>+)~gc)t4e2ޢ|!]6iԗU3X8Mym6N/-"fâ8ĺń&Z"ŊCr=NY^chI-↑)VΛzimﹳnt xjI-Ms</>Y:[z~6ӭnźڒF r <GM^{6Uپr9siVHm}Nekt7 D%~QQJ׿>}~Jܝ.xSF.)4; |Ybf a ;I4WxƱ$|@b-|OjG{.zQ)Xk. 6r'׵(DF1ll[{7oq_a?=U#xz}P5͹7#m2u!:8sZR;A^4f{tڭW$!.nP_Dc,Seˍ[٭!pzn^.ռ?!4q6 &GӺ>z{M$1$E-T\ٯ!'/pԔzǹxnlI{+5 /sykK_u"988z׌Ey$$GFR:{&Lf.w0ӱ~UʬԔȚU:n-_[ ~5 {yXghUٕ 8r3R? ,cQѬϪ*3R3_gGzsl4gY$ʟj|IgZ?j-N,ʕ6p2Q8ɮoNmȺ]/ Qy.E XN̐y+3yX[3.5l;9[̹p؈]\0q $-E/CT1JOLm\dVXrSSm{t]7=iZt͡ t"y*sOqZ压oZ^iSZ3- ʤw}^/~_'|Ǖmc@ikSKq38,V'8cZ'U .%V‰U#=׉xZɽ/"$.kuK7۔Tֵ UX:n09AWsY/7寯x9vy׉C-UdIi$#ryo>֫tcLSk{'t~uxVy[e9uiO<4kښ݋.f?w85gkdRp^|-ɠҡ3ܵ|!88$OUKND.eB8؃TQ͛qMBڢђnSN\Ux#DCɽG!HZ@8Sn崿e),3 tu=ASƾ#.? 5|#mj16Q ) U\cF2C̚ŗb;^+)&Ư(RWj31ƭh:Eucoc+dXn  ^jXإ+IJ GpVѭ9W*F.&e9]ʼnRjFIֿe )7>pead=3kַ؛P^#Srr$穪w棧tMi}ɹ;hŻ1W\4{v]6kzQ# |yi}g*V15[eds v6Ic'ix.hӮ0B]EIߥlK9NHӈh,`THw(Axn9 I]H#+wݯ`W_y-η ^ 3R'kp{Ѥڭ-m_I}e(* xU霓^ch}J'6ZFd@UH=x=d84m>9RjIw);6=2}ir?iak~}پw,1c e%~l\}*.OyV:,WSK]ۍ@퓒T|oO0+]Hwhv`什GJ Ri:oEiE(VpC/':CFlX5̖FB+m dp*-G"+H~U̶ 6XC(`@Z)5W-?ڟu/zdt+) cݜ(d)25=.ObO:aRUp'1'.ԳdINhQ?#*xvWzbE-^Iϙ<݇$t܊?obմXb8mLȷ10;1 _ ifEo+t,!"DQ(T6 mI$2;]4mV 99Iz4jv7l6XJٗR5rVH,~'uMMY)OqёÃԏ tyn-緵Gp٘TNU%񞳩xbE&Vhwd2q{KkP{2;B+BXl\A⫷S-M+pnw,rG)Y9ll'/_"ׯkTRMotDdd+f6Rߞmr Zfau1~oscK(G9Pg^ &K'&wN,1rrNrMC')tldʹ2i- ݓ^:I_Gث:^ɡvRHR77%и,\$vKy` Iּ7q.iwd̖JrPy7 h9zנ*^^} ͬ-Y#m}Ruly,q_:OɎ_zxFiw*5J-cHȺV\]̺y{9 e? 3vAF-Ƚ'qq#m-fۻn8`дchmV/F*ɝrx9I;Vz7ڌOiemv)U opb̡~qحk͠izZZA6%//˸*]TUUTS:Ik21o"߷8sܚsVi'Y-o&Ѥ9kႱ;IӳiL:_bW{3X".0-1thVu}U (K7d5)o__͢Ybh.2gy==,v3lATtF "8WuLvP:sKrHIwH݊#ʀpt&_??'r:'5kO ؟ԣm-B{YX>c`ι$r:ՍN{^Qѵe7rGC2ÿt`b|;6iµ[X_=4u:#I*` VW{wZ<6*Vhlf1RGcSwkZ|&nbx^}Z]Š1{#(q,&N:og8MuVNdmpxUGVt_ש:_CF(Q8h&_Nh ȳdbRu'j_R$-SR}EwU9%M6[b%Fm캟'j*h!O?U'R_WGHx|OI4'j*k(}_?>'!O?U' CğO(a|Gt?TTG)ϖ?ƾآo+#R$-SRZ b=|_WGHx|OI4'j*k(}_?>q/Mo¾4v~ fU,x~uV8ʳVV5tT+yƫI|$Bgp;q ǽk͵//+˜@03bc49Lfןww{3ƉA{ ^5l/캽ww{3ƉA{ ^4l.txoG^ ^4޸kRt:p{QNocv㽴kOv 955xn6r[_R 2n.!ꪖ(z?^ ^5Sᎋͧ.KԒ.|M;Z9d5)EQEQEQEQEuiח-=;_{ c *9A.1̯Ftȯ43ϧEZ+OVg}?_qΑ>ƏFtȯ5EXa*Ftȯ43ϧEZ(o{eOWe3ϧE#}?+jG+3{*ʾ+#}?+_kV>[SU__hgHOZQʟgHOG#:GWբVgT}W#:GW??"֭}b?2?"Α>Ƶh=?_qΑ>ƏFtȯ5EXa*Ftȯ43ϧEZ(o{eOWe3ϧE#}?+jG+3{*ʾ+#}?+_kV>[SU__hgHOZQʟgHOG#:GWբVgT}W#:GW??"֭}b?2?"Α>Ƶh=?_qΑ>ƏFtȯ5EXa*(M((((((((((((((((((((((((((((((((((((((((((((((((((vrVDPߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=''G''@Pyߒ4yߒ4=Q@ǭ^}ZŪF@H #ҼSxZ W,5(Գi?󣉯7.Ji|(=?照Uo*q__(=?照Uo*e>SxZ Q <-?X_!__(=?照Uo*c>OxZ Q <-?8_!q__(=?照Uo*e>k.>:#GY@# y {_RX1+)sF;o~U-b&k]  ZxOJe ?F⹷:(;PS7 3ðO1Hp v֝7QNj hfǚO#6ƪϧ#Hcs%Tu tHvcf݂pF2)S/{|Ī{??Efh#|G跫r6YYOlqӃYUmxu455 v4f~zNuQ\EEW{;Ko42 $Y122N1㞧kxfR6:q\LLX`09N; Y;r*vt4W,e.ku8O)i7یdr⳦[{-%CF-cϥThVbɊUi_3K5 luKɹVې)&,9dA1$)*kVik^i;v:j+K񧇵I3S{&]봐zO-KR,$Ԯ!w@u'rj%Nq,*5!%x[x×u힤GfIc+@$d1g>/|Ikujp[[Sp}OTPn#n*.v4V_hwomj+~ax#jv/ڱ4N)$"c#k~yy]اV|JI E6& ܫ`Cl _^USGŷØ"\`/pi5g^۠jK-:+|agڬW֮.UUb0?CگxGKTca #f2qBeՄ̞W/}Dޟp5C!iE9\P}_=ۡq #ʄ.7e*וKR_iw:+RLJ4O?P#crlf 5&-D1KR/:5=Ͻph9T*]n_-7cnakXE{γ̻DG>EXiٖj(C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>L?n?WlW~7_N+#ނ,To(?g)~c6f(^Dv݌AR)7HއXqSʭq%--fI ;TQ-ЀeW'@=k[k%er\igkaZ$!\7)ְpыoOVNOL_Jע$o>*-_}WYNYnBC:+66c"𮬞 썐z|'9B85sMiu{9!ƙc0к;z}X쵻s o__-btIY>k"; ./  TrA,GrvӃqEfRJ*1J޽~vmn/^WZՃkq髺 dգnR3߀ƚ-毧Yɦs\X]V}3g=*bNt(a8-Yiޭi[KI1=vp<Ŏw^0=+[mޏ>QɹXHc.r **b%8Y%eƊwoG#uKZNH-r9#Tz/tؤK$\ź-h3J?t_x<-'WF{F_~mx⊩cg'w~ȅ-^~GɣI旧<*y^`׊|1yxLyUg~w Lh*r-nE;JѼ):+#Hk¥GRnovmǕQYQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|H_6N+@I98mWW1 ?K (6x3sIE8QRbBA8֘j\U|;x;Jr$Mn"Mg<`zT&`O,H$^w=GYFtS%ac#{֠VKev#"0z@^|?isץ^>\}R BKT*+p\gUծ|]},V>u;T*H]WJgWG}aqtQT/U4=ImN|eNk?s9|O澰_K+gHUV)1 6󄷒i2?ȑe@x 2 +mZk3<%QnP`ɴI}SP+2mٻRG9Yޱ[Wi֩G{g\jpM=< ,2r%n{U0^ǣGne[+{v폖- PF;h6ΗR lDs[K; xC!#B+?SRBFԖX1;1 |9kך]KHEEDfbj/͹r{ W/Z []_ՏPyA5jUI+jI?UjvO:.glHd1-'k0КK-Ij|FvAOpI覩>ҵ6g{8]dy͟?@I(!5K3J߭Dtnc1JaG^6HG 9ȧ.C"}dq)%sk(PKF*N3-,ѭ5.nKlF7(_-0ˁ ԛúz:[{%Vؙ| dAe߮`mޱs$ZE^wjmwJ .AF?{da___/I>!xjIkٿSCPb#v2+GZhB3+xKK# -YNxfm.`pn6vQ&~;1u<! Mdu#sFvRo*&Z\*;}#K$:z s$^-g{a%IM$%TSĀ823x;Xu2ɸYD'IoʡYHKmTBxr@Z]"vb#;"ibA<  {[E?hWL4i M9Hb%G#YdXA[cIݔ<؍D T烎IMi}*ib{,[-"+{7M.[pRrYO6\ֲqk+>20PA8Žw Z_c Κ/K Bd$lLdO':KCU?#2lvy+3Zz֜u} N[-ZO!1`W%6MhnEumc x*nrr$nH?'4Hh5fgg_=,gqBCBbAیN>#t֊3ڭG٣yӁk>ǬiQXZ[e>!p}*g ! lx;Q%zm˵Υsm2F3$k͗c)e*i: _ڜVR\M*o X҄عFx#9ž*Vislַs[2d6v䁝Ud| *NGofs,hM0)v# /x{CК{Ō2KH#}8aWzѠ}߭ЍjOɤ&xmhGL !6ܮm `imŤG2\X#!2p  fYx")Zm j1dbS#UfڪIU i Ɲu+Uiy$%;rH `'mr3kͦ+e0A$N;Z9YN@ 5Zx[Rk K>;[k9Ebn8玘=^fji-͘ qyWC Ҵ /nⴳ}JY5TYY;GNߎ?SâXϬ+\c ĖV7/i 8Q|ci)YWO(PKK57g#x[9V>3Wwڴto7ךl-K2< qI ܆g0S/3Wt_~!pM.ne`1hc#'PYE[v8$nrp< ۜwf)h.,H5m4_@QC  '4]$K1)xЪ >5 =5%now{ow<֯c Lnm& iE([V?h3qtf>bm>|ȆB ~/*5OM{܍N&mmqa.0{!2*~ 6Ʋ/zjkfٝ,EߗReGDYVˉ,n^@q!; }kZWKk kp]F%c7nj_ϪEhq^kQYtWv!F2'sT|mj"zvrsm, vKH2˜UZYguoqfS$qf39XxfRE Q! pSs׎ov-?eQx_X,cq%ֳ[c`J |ue}Ooxn,.`͐J1v H]_Y+Z;Vt%(T>Vw%+s1]}SWnl`{K#$xUy]x'_Cje35ۙ,0=].02wEb^|Cu-KN -n,uKk=͕(OΑF>aUvp ST$-{vMbF>X UG77Ee^ Zf'°IDmuU\5bn6\wNnCa'/JWwPQX)4_ K}.i$\M k}>mj-q*0vw )cx:mFk[}HO˅Ug*z֏߸WgM_iZuUfI)bz ' OY驢J,uaծgOIb;n1L`-֒`KQ\[yHpŢw)9r85]:$:~Ihot#.IQpqiY-?Z֓y5ų=}ѩ1љ zxN:Ck}uzւH \FϽTFK# `HSXs|(5[,ڍ ?Η?ə FwFm,ױZ^iw{y&3DOѐ ]8ЊW=-Z~&uԟSy%k&+6 rrGrǞK%KH嶴t )"MČn#5[II5X/[P~ߔm^6ǾsJoizmY>oeigo,F#rC nmrr(O [VOԭ,e.!N#v08' Stz^sC'=[O$m$1 _v3֟=m]5, 2ʲG2M·ٍcE|Ww@yaeP—z^/0)j0[YL:-`B NN`]ViD) ';Z9YNK%e&N7Scu[dմ۟%ɲ&rI"[|߭Box? hMk5ҵ\1$TXcElA2[4aȡHXKr-Yb){dErq֢m7ixuC$V ݗa Ń=M.0} *zu>m>=*QEQEQEQEQE|Gq^$ܚ;G IxzxGi_PM-Ną\Rgz"Vv}حIԭod!b>RzzfHfBF]XrIM=ZX0?r!@d6Cl`185s"Q_,./ګi ytF2pz`voM .VA Skz{wWīqj`T0Xg$,|A+FpcWsr1L?S]) 9#֦ð_Ft@~so\{jl"Ld}jzg=qgs_Xɿ?ʻqR a>* *Ťs9Gזj59X?<F[wOd^#Kn}aO?'?'1] :J'߮\VKmJ~a}=+>þ2@UKZ@;f# ּ9c⟋[ƿ[Wݥط9@#ضO\䄱ly(j@ɼ3UYFdZ7+CY+NJh2H[RR SSgNk*3ogs_YV3j__8p_?7Y/Atʼgί]<3lkDݾg>Fޙtm ymH$zQ8u{gS+c(:#aqҼ&[dٲaA?V I56@L H=0NNpgQ_^_"^߷N^uuzZEbj8c"r3 Oj/te:Omx>i+9s{'gMcyo[jEap;3O: ?ζh&5̓][n!7۽u>sٷ;i֫50L0pVa$os _i9`ɟP|F%gzIV ܢQɓ;ѻ? e;Nob*M-zN.1}-xʼn|Cy|8k~0ɳ1b־w({_3ݟk)&8Գ1hkʥDԀ$I8++w),. :|AὤNVC <~~9+S#N7Rv|*Nes̭[|8 e>gfO.x\vdqQj|Ib2NM>}5ω9y8>q_*URЩaRv1ԗu;&۩]’ ˆ{RYU. #Դaa[ L Lۯo+cVBA,N>uw)!9)vZ͖G]ZZqw=:I{zuOJQ_; "[~auOxE{NȷB?`bj ?Ayu C$w oóq1:]4k>Xhkm$+Cp1k~xgҮ"gjڼA q)Iip'<ۊҚ[mwu<={=vZhy5Յ+qk"O*v coBÏ֪yyh~'-#MSe[W 29}N.NdW}M~l=9k=_2˽X.>RhNfB+vkxoE49Kyn<ѻgIp~fdЅvgVknr:>ʬc{}cP[XYwq*^Yp:ǀ=M\׌^;itKK<Rd(rxS=2?=>uM?Y[" =*1 Z1Եkg nC<䤅O*DBnrv͖l/&ԍGNU$tyQsO4ZK,f}1\$d8RJ0} ^?Ś> Xg0 +Kۙ$i##esmp0PR+&)cjƞNX_>4h'@qjڻ]?Šn<=ZIwaO]}6|_*yZ?U+񾡫 gZtˉc.Z* \ ı栶]Q5il̥!nT ? ݬ_/]7켭_*yZ?U+a4i(2^<*GIcePOI $cRtw3YsOƇ\g.W @֏ku{/8m~fc%R+WJskPiփP[ktkxYp"`.8=j, tKR!G,q)*NFZ}x~_re*){w;/+WJVAJu}o^|I-Bl|?YK v1ҭ?'"Z2d0 2b^}wt^ow/?4w^VAJ<_*j1׬}6QSx`I:~]oY|;{[YRMjT1\zxV}&kcV5mXyeT%\Ž:eť4%I:U&?wve/4/gu{~OZ?U( V>꺭eoŢ< і]f'n·W:w^kaX#8;݄۷iUZ%/7۲+د?~VAJ<_*iww66~KFf?p$s޻x\}*yⴚ;X%gu=gֽI}TZggjT1X1z(E}9uu2yTvKc9? Ql#oftlpN$R~^~^E{=+1Gc%RXFԟOWh.#P)#|Zg:ůWW0Gue4QѡTHUõs){_%/һjT1\ ^_ D" TcwZͥ]p4Qmdg~GN܃c&֋] \Syߕc%R+WJqq^9:v"L < D i ִӮ>vZ[qkq?rr2Ȝ>_r]:tG QjT|V"((,r$ܒj>%/'ٯ?EW g##u|8}W[NO^[iIe#HXJ97kVm(? Zv<xx}pnwG3v@ rxH_ c=3ZV&4{*V33,rcQ+?ᛵ]m ݯ:mƗ}v?/./?._״7k_uSA$x'&g'ݩO, $fL׶7k_uRAY4d׸7k_u? _ ٻFs_Y׃)Sx/W:|Fs-(Nz{/gӴR߫ I&V7<'lMx/_AaҮuO hE|_5{}Gr[^ghy՟_֏cM::_֎`4<<ǯG=Z9?xhSCΣάݷ2g0r9TP[6Im A+3: 8MZ(+D6#w~Oz誼}&GnOڔ u_3[] 2K{'U)$R2 A@IwYyF"weg Op7:r}kW+O oGV>´~?<(,mG[kI?|-?iK_(h_F-_Qυ_Ry袊5 ( ( ( ( ( ( ( ("=q/msy`Lr΄)o5MIT{y ;?7Q ;?7WW'ݓQ ZQ Z=py(όG(ό^E}{8v<wo֣wo֯Ci>=;y ;?7Q ;?7WGv>OG 태<cZ<) ^\h6+B)KvR[ ZkDݦa8~5v7?M+Hsc g(ό^Ei'ݑǞŽOŽOtQ'݇c?Gx'|fj?Gx'|fj:(ñ>3>3z{IaQ ZQ Z=py(όG(ό^E}{8v<wo֣wo֯Ci>=;y ;?7Q ;?7WGv<мxrj L 8ߢRݍF+dQEIAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPOn9fi?ݕ?MhGd(zoG#Ɗ($ޛH7>4}?MhGd(zoG#Ɗ($ޛH7>4}?MhGd(zoG#Ɗ($ޛH7>4}?MhGd(zoG#Ɗ($ޛH7>4}?MhGd(zoG#Ɗ($ޛH7>4}?MhGd(zoG#Ɗ($ޛH7>4}?MhGd(zoG#Ɗ($ޛH7>4}?MhGd(zoG#Ɗ($ޛH7>4}?MhGd(zoG#Ɗ($ޛH7>4}?MhGd(zoG#Ɗ($ޛH7>4}?MhGd(zoG#Ɗ($ޛH7>4}?MhGd(zoG#Ɗ($ޛH7>4}?Mh?PKL\h3$youtube-embed-plus/styles/index.htmlnu[ PKL\C )youtube-embed-plus/styles/ytprefs.min.cssnu[ .epyt-debug{cursor:pointer;text-align:left;background-color:#ddd;color:#000}iframe.__youtube_prefs__{border-width:0}.epyt-gallery{text-align:center}.epyt-gallery .epyt-figure{margin-inline:0;margin-block:0}.epyt-gallery iframe{margin-bottom:0}.epyt-gallery.epyt-lb iframe{display:none;height:0!important}.epyt-gallery-list{margin:0 -8px 0 -8px;position:relative;transition:opacity ease-out .3s;display:block}.epyt-gallery-list .epyt-gallery-thumb{box-sizing:border-box}.epyt-gallery-list p{display:none}.epyt-gallery-clear{clear:both}.epyt-gallery-list.epyt-loading{opacity:.5;transition:opacity ease-out .3s}.epyt-gallery-thumb{position:relative;box-sizing:border-box;overflow-y:hidden;display:block!important;cursor:pointer;opacity:1;float:left;padding:0 8px 10px 8px;height:auto}.epyt-gallery-thumb.hover{position:relative;opacity:1;transition:opacity ease-out .3s;height:auto}.epyt-gallery-img-box{width:100%}.epyt-gallery-img{height:0;width:100%;padding-top:56.25%!important;position:relative;overflow:hidden!important;background-size:cover!important;background-position:center!important}.epyt-gallery-playhover{opacity:0;position:absolute;top:-10px;left:0;width:100%;height:100%;vertical-align:middle;text-align:center;transition:opacity ease-out .3s}.epyt-gallery-thumb.hover .epyt-gallery-playhover,.epyt-gallery-thumb.epyt-current-video .epyt-gallery-playhover{opacity:1;top:0;transition:all ease-out .3s}.epyt-gallery-thumb .epyt-gallery-playcrutch{display:inline-block;height:100%;vertical-align:middle;width:0}.epyt-gallery-playhover .epyt-play-img{height:auto!important;max-width:15%!important;padding:0!important;margin:0!important;min-width:30px!important;vertical-align:middle!important;display:inline-block!important;width:auto;border:0;box-sizing:border-box}.epyt-gallery-title{font-size:80%;line-height:120%;padding:10px}.epyt-gallery-notitle{padding:4px}.epyt-gallery-notitle span{display:none}.epyt-gallery-rowtitle{text-align:center;width:100%;position:absolute;left:0;top:100%;opacity:0;z-index:10;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.epyt-gallery-rowtitle.hover{opacity:1;transition:opacity linear .2s}.epyt-gallery-rowbreak{clear:both}.epyt-pagination{clear:both;text-align:center;padding:10px 8px 10px 8px}.epyt-pagination.epyt-hide-pagination *{display:none!important}.epyt-pagination>div,.epyt-pagenumbers>div{display:inline-block;padding:0 2px 0 2px;vertical-align:middle}.epyt-pagination .epyt-pagebutton{cursor:pointer;display:inline-block;padding:0 10px 0 10px}.epyt-pagebutton>div{display:inline}.epyt-pagination .epyt-loader{display:none}.epyt-gallery-list.epyt-loading .epyt-pagination .epyt-loader{display:inline-block}body .lity-container{width:100%;max-width:964px}.epyt-curtain .lity-opened iframe{opacity:0;transition:opacity .3s linear .5s}.epyt-gallery-allthumbs.epyt-cols-1 .epyt-gallery-thumb{width:100%}.epyt-gallery-allthumbs.epyt-cols-2 .epyt-gallery-thumb{width:50%}.epyt-gallery-allthumbs.epyt-cols-3 .epyt-gallery-thumb{width:33.333%}.epyt-gallery-allthumbs.epyt-cols-4 .epyt-gallery-thumb{width:25%}.epyt-gallery-allthumbs.epyt-cols-5 .epyt-gallery-thumb{width:20%}.epyt-gallery-allthumbs.epyt-cols-6 .epyt-gallery-thumb{width:16.666%}.epyt-gallery-allthumbs.epyt-cols-7 .epyt-gallery-thumb{width:14.285%}.epyt-gallery-allthumbs.epyt-cols-8 .epyt-gallery-thumb{width:12.5%}.epyt-gallery-allthumbs.epyt-cols-9 .epyt-gallery-thumb{width:11.111%}.epyt-gallery-allthumbs.epyt-cols-10 .epyt-gallery-thumb{width:10%}.epyt-gallery-allthumbs.epyt-cols-11 .epyt-gallery-thumb{width:9.090%}.epyt-gallery-allthumbs.epyt-cols-12 .epyt-gallery-thumb{width:8.333%}.epyt-gallery-allthumbs.epyt-cols-13 .epyt-gallery-thumb{width:7.692%}.epyt-gallery-allthumbs.epyt-cols-14 .epyt-gallery-thumb{width:7.142%}.epyt-gallery-allthumbs.epyt-cols-15 .epyt-gallery-thumb{width:6.666%}.epyt-gallery-allthumbs.epyt-cols-16 .epyt-gallery-thumb{width:6.25%}.epyt-gallery-allthumbs.epyt-cols-17 .epyt-gallery-thumb{width:5.882%}.epyt-gallery-allthumbs.epyt-cols-18 .epyt-gallery-thumb{width:5.555%}.epyt-gallery-allthumbs.epyt-cols-19 .epyt-gallery-thumb{width:5.263%}.epyt-gallery-allthumbs.epyt-cols-20 .epyt-gallery-thumb{width:5%}.epyt-pagebutton.hide,.epyt-pagenumbers.hide{display:none!important;opacity:0!important;visibility:hidden!important}.epyt-gallery-subscribe{text-align:center;padding:15px 0 10px 0;clear:both}.epyt-gallery-subscribe a.epyt-gallery-subbutton,.epyt-gallery-subscribe a.epyt-gallery-subbutton:hover{display:inline-block;padding:5px 10px;background-color:#e62117!important;color:#fff!important;text-decoration:none!important;border-radius:3px}.epyt-gallery-subscribe a.epyt-gallery-subbutton img{width:20px!important;height:auto!important;vertical-align:middle!important;padding:0 6px 3px 0;display:inline-block;background:transparent;-webkit-box-shadow:none;box-shadow:none;margin:0}body div.__youtube_prefs__.__youtube_prefs_gdpr__{background-color:#000;background-image:-webkit-linear-gradient(top,#000,#444);background-image:linear-gradient(to bottom,#000,#444);padding:25px;height:auto;text-align:left}body div.__youtube_prefs__.__youtube_prefs_gdpr__ *{color:#e3e3e3!important}body div.__youtube_prefs__.__youtube_prefs_gdpr__ a{text-decoration:underline}body div.__youtube_prefs__.__youtube_prefs_gdpr__ button.__youtube_prefs_gdpr__,body div.__youtube_prefs__.__youtube_prefs_gdpr__ button.__youtube_prefs_gdpr__:hover{display:inline-block;padding:5px 10px;background:#e62117!important;color:#fff!important;text-decoration:none!important;border-radius:3px;font-weight:normal;border-width:0;box-sizing:border-box}body div.__youtube_prefs__.__youtube_prefs_gdpr__ button.__youtube_prefs_gdpr__ img{width:20px!important;height:auto!important;vertical-align:middle!important;padding:0 6px 3px 0;display:inline-block;background:transparent;-webkit-box-shadow:none;box-shadow:none;margin-left:8px}body .epyt-gallery-img-gdpr{background-color:#000;background-image:-webkit-linear-gradient(top,#000,#444);background-image:linear-gradient(to bottom,#000,#444)}.epyt-facade{position:relative;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%;-webkit-transition:.4s all;-moz-transition:.4s all;transition:.4s all}.epyt-facade:hover{-webkit-filter:brightness(90%);-moz-filter:brightness(90%);filter:brightness(90%)}.epyt-facade img.epyt-facade-poster{display:block;margin:0;max-width:100%;width:100%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);border:0;height:auto;cursor:pointer}.epyt-facade button.epyt-facade-play{background-color:transparent!important;position:absolute;left:50%;top:50%;width:68px;height:48px;margin-left:-34px;margin-top:-24px;-webkit-transition:opacity .25s cubic-bezier(0,0,0.2,1);transition:opacity .25s cubic-bezier(0,0,0.2,1);cursor:pointer;border-width:0!important}.epyt-facade button.epyt-facade-play svg{height:100%;left:0;position:absolute;top:0;width:100%;pointer-events:none}.epyt-facade button.epyt-facade-play svg .ytp-large-play-button-bg{-webkit-transition:fill .1s cubic-bezier(0.4,0,1,1),fill-opacity .1s cubic-bezier(0.4,0,1,1);transition:fill .1s cubic-bezier(0.4,0,1,1),fill-opacity .1s cubic-bezier(0.4,0,1,1);fill:#212121;fill-opacity:.8}.epyt-facade:hover button.epyt-facade-play svg .ytp-large-play-button-bg{-webkit-transition:fill .1s cubic-bezier(0,0,0.2,1),fill-opacity .1s cubic-bezier(0,0,0.2,1);transition:fill .1s cubic-bezier(0,0,0.2,1),fill-opacity .1s cubic-bezier(0,0,0.2,1);fill:#f00;fill-opacity:1}.wp-embed-responsive .wp-block-embed.wp-has-aspect-ratio .wp-block-embed__wrapper .epyt-is-override.epyt-facade{position:absolute;top:0;right:0;bottom:0;left:0}.wp-block-embed.wp-has-aspect-ratio .wp-block-embed__wrapper .epyt-is-override.__youtube_prefs_gdpr__{position:relative}.wp-embed-responsive .wp-block-embed.wp-has-aspect-ratio .wp-block-embed__wrapper .epyt-is-override.__youtube_prefs_gdpr__{position:absolute;top:0;right:0;bottom:0;left:0;overflow-y:auto}.wp-embed-responsive .wp-block-embed.wp-has-aspect-ratio .wp-block-embed__wrapper.epyt-is-override__wrapper:before{padding:0}.wp-embed-responsive .wp-block-embed.wp-has-aspect-ratio .wp-block-embed__wrapper.epyt-is-override__wrapper .epyt-is-override.__youtube_prefs_gdpr__{position:relative;top:unset;right:unset;bottom:unset;left:unset}.ytvi-story-container{display:block;max-width:100%}PKL\ 4youtube-embed-plus/styles/epyt_mce_wizard_button.cssnu[i.epyt_mce_wizard_button--icon { background: transparent url("../images/btnwizoff.png") no-repeat scroll center center !important; } i.epyt_mce_wizard_button--icon:hover { background-image: url("../images/btnwizon.png") !important; } PKL\я¸'youtube-embed-plus/styles/jquery-ui.cssnu[/*! jQuery UI - v1.12.1 - 2016-09-14 * http://jqueryui.com * Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px * Copyright jQuery Foundation and other contributors; Licensed MIT */ /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } .ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; border-collapse: collapse; } .ui-helper-clearfix:after { clear: both; } .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); /* support: IE8 */ } .ui-front { z-index: 100; } /* Interaction Cues ----------------------------------*/ .ui-state-disabled { cursor: default !important; pointer-events: none; } /* Icons ----------------------------------*/ .ui-icon { display: inline-block; vertical-align: middle; margin-top: -.25em; position: relative; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } .ui-widget-icon-block { left: 50%; margin-left: -8px; display: block; } /* Misc visuals ----------------------------------*/ /* Overlays */ .ui-widget-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; } .ui-accordion .ui-accordion-header { display: block; cursor: pointer; position: relative; margin: 2px 0 0 0; padding: .5em .5em .5em .7em; font-size: 100%; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; overflow: auto; } .ui-autocomplete { position: absolute; top: 0; left: 0; cursor: default; } .ui-menu { list-style: none; padding: 0; margin: 0; display: block; outline: 0; } .ui-menu .ui-menu { position: absolute; } .ui-menu .ui-menu-item { margin: 0; cursor: pointer; /* support: IE10, see #8844 */ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); } .ui-menu .ui-menu-item-wrapper { position: relative; padding: 3px 1em 3px .4em; } .ui-menu .ui-menu-divider { margin: 5px 0; height: 0; font-size: 0; line-height: 0; border-width: 1px 0 0 0; } .ui-menu .ui-state-focus, .ui-menu .ui-state-active { margin: -1px; } /* icon support */ .ui-menu-icons { position: relative; } .ui-menu-icons .ui-menu-item-wrapper { padding-left: 2em; } /* left-aligned */ .ui-menu .ui-icon { position: absolute; top: 0; bottom: 0; left: .2em; margin: auto 0; } /* right-aligned */ .ui-menu .ui-menu-icon { left: auto; right: 0; } .ui-button { padding: .4em 1em; display: inline-block; position: relative; line-height: normal; margin-right: .1em; cursor: pointer; vertical-align: middle; text-align: center; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; /* Support: IE <= 11 */ overflow: visible; } .ui-button, .ui-button:link, .ui-button:visited, .ui-button:hover, .ui-button:active { text-decoration: none; } /* to make room for the icon, a width needs to be set here */ .ui-button-icon-only { width: 2em; box-sizing: border-box; text-indent: -9999px; white-space: nowrap; } /* no icon support for input elements */ input.ui-button.ui-button-icon-only { text-indent: 0; } /* button icon element(s) */ .ui-button-icon-only .ui-icon { position: absolute; top: 50%; left: 50%; margin-top: -8px; margin-left: -8px; } .ui-button.ui-icon-notext .ui-icon { padding: 0; width: 2.1em; height: 2.1em; text-indent: -9999px; white-space: nowrap; } input.ui-button.ui-icon-notext .ui-icon { width: auto; height: auto; text-indent: 0; white-space: normal; padding: .4em 1em; } /* workarounds */ /* Support: Firefox 5 - 40 */ input.ui-button::-moz-focus-inner, button.ui-button::-moz-focus-inner { border: 0; padding: 0; } .ui-controlgroup { vertical-align: middle; display: inline-block; } .ui-controlgroup > .ui-controlgroup-item { float: left; margin-left: 0; margin-right: 0; } .ui-controlgroup > .ui-controlgroup-item:focus, .ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { z-index: 9999; } .ui-controlgroup-vertical > .ui-controlgroup-item { display: block; float: none; width: 100%; margin-top: 0; margin-bottom: 0; text-align: left; } .ui-controlgroup-vertical .ui-controlgroup-item { box-sizing: border-box; } .ui-controlgroup .ui-controlgroup-label { padding: .4em 1em; } .ui-controlgroup .ui-controlgroup-label span { font-size: 80%; } .ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { border-left: none; } .ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { border-top: none; } .ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { border-right: none; } .ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { border-bottom: none; } /* Spinner specific style fixes */ .ui-controlgroup-vertical .ui-spinner-input { /* Support: IE8 only, Android < 4.4 only */ width: 75%; width: calc( 100% - 2.4em ); } .ui-controlgroup-vertical .ui-spinner .ui-spinner-up { border-top-style: solid; } .ui-checkboxradio-label .ui-icon-background { box-shadow: inset 1px 1px 1px #ccc; border-radius: .12em; border: none; } .ui-checkboxradio-radio-label .ui-icon-background { width: 16px; height: 16px; border-radius: 1em; overflow: visible; border: none; } .ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, .ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { background-image: none; width: 8px; height: 8px; border-width: 4px; border-style: solid; } .ui-checkboxradio-disabled { pointer-events: none; } .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } .ui-datepicker .ui-datepicker-header { position: relative; padding: .2em 0; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position: absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } .ui-datepicker .ui-datepicker-prev { left: 2px; } .ui-datepicker .ui-datepicker-next { right: 2px; } .ui-datepicker .ui-datepicker-prev-hover { left: 1px; } .ui-datepicker .ui-datepicker-next-hover { right: 1px; } .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } .ui-datepicker .ui-datepicker-title select { font-size: 1em; margin: 1px 0; } .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 45%; } .ui-datepicker table { width: 100%; font-size: .9em; border-collapse: collapse; margin: 0 0 .4em; } .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } .ui-datepicker td { border: 0; padding: 1px; } .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding: 0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width: auto; overflow: visible; } .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float: left; } /* with multiple calendars */ .ui-datepicker.ui-datepicker-multi { width: auto; } .ui-datepicker-multi .ui-datepicker-group { float: left; } .ui-datepicker-multi .ui-datepicker-group table { width: 95%; margin: 0 auto .4em; } .ui-datepicker-multi-2 .ui-datepicker-group { width: 50%; } .ui-datepicker-multi-3 .ui-datepicker-group { width: 33.3%; } .ui-datepicker-multi-4 .ui-datepicker-group { width: 25%; } .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width: 0; } .ui-datepicker-multi .ui-datepicker-buttonpane { clear: left; } .ui-datepicker-row-break { clear: both; width: 100%; font-size: 0; } /* RTL support */ .ui-datepicker-rtl { direction: rtl; } .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } .ui-datepicker-rtl .ui-datepicker-buttonpane { clear: right; } .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, .ui-datepicker-rtl .ui-datepicker-group { float: right; } .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width: 0; border-left-width: 1px; } /* Icons */ .ui-datepicker .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; left: .5em; top: .3em; } .ui-dialog { position: absolute; top: 0; left: 0; padding: .2em; outline: 0; } .ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } .ui-dialog .ui-dialog-title { float: left; margin: .1em 0; white-space: nowrap; width: 90%; overflow: hidden; text-overflow: ellipsis; } .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 20px; margin: -10px 0 0 0; padding: 1px; height: 20px; } .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin-top: .5em; padding: .3em 1em .5em .4em; } .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } .ui-dialog .ui-resizable-n { height: 2px; top: 0; } .ui-dialog .ui-resizable-e { width: 2px; right: 0; } .ui-dialog .ui-resizable-s { height: 2px; bottom: 0; } .ui-dialog .ui-resizable-w { width: 2px; left: 0; } .ui-dialog .ui-resizable-se, .ui-dialog .ui-resizable-sw, .ui-dialog .ui-resizable-ne, .ui-dialog .ui-resizable-nw { width: 7px; height: 7px; } .ui-dialog .ui-resizable-se { right: 0; bottom: 0; } .ui-dialog .ui-resizable-sw { left: 0; bottom: 0; } .ui-dialog .ui-resizable-ne { right: 0; top: 0; } .ui-dialog .ui-resizable-nw { left: 0; top: 0; } .ui-draggable .ui-dialog-titlebar { cursor: move; } .ui-draggable-handle { -ms-touch-action: none; touch-action: none; } .ui-resizable { position: relative; } .ui-resizable-handle { position: absolute; font-size: 0.1px; display: block; -ms-touch-action: none; touch-action: none; } .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px; } .ui-progressbar { height: 2em; text-align: left; overflow: hidden; } .ui-progressbar .ui-progressbar-value { margin: -1px; height: 100%; } .ui-progressbar .ui-progressbar-overlay { background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); height: 100%; filter: alpha(opacity=25); /* support: IE8 */ opacity: 0.25; } .ui-progressbar-indeterminate .ui-progressbar-value { background-image: none; } .ui-selectable { -ms-touch-action: none; touch-action: none; } .ui-selectable-helper { position: absolute; z-index: 100; border: 1px dotted black; } .ui-selectmenu-menu { padding: 0; margin: 0; position: absolute; top: 0; left: 0; display: none; } .ui-selectmenu-menu .ui-menu { overflow: auto; overflow-x: hidden; padding-bottom: 1px; } .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { font-size: 1em; font-weight: bold; line-height: 1.5; padding: 2px 0.4em; margin: 0.5em 0 0 0; height: auto; border: 0; } .ui-selectmenu-open { display: block; } .ui-selectmenu-text { display: block; margin-right: 20px; overflow: hidden; text-overflow: ellipsis; } .ui-selectmenu-button.ui-button { text-align: left; white-space: nowrap; width: 14em; } .ui-selectmenu-icon.ui-icon { float: right; margin-top: 0; } .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; -ms-touch-action: none; touch-action: none; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } /* support: IE8 - See #6727 */ .ui-slider.ui-state-disabled .ui-slider-handle, .ui-slider.ui-state-disabled .ui-slider-range { filter: inherit; } .ui-slider-horizontal { height: .8em; } .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { left: 0; } .ui-slider-horizontal .ui-slider-range-max { right: 0; } .ui-slider-vertical { width: .8em; height: 100px; } .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } .ui-slider-vertical .ui-slider-range-max { top: 0; } .ui-sortable-handle { -ms-touch-action: none; touch-action: none; } .ui-spinner { position: relative; display: inline-block; overflow: hidden; padding: 0; vertical-align: middle; } .ui-spinner-input { border: none; background: none; color: inherit; padding: .222em 0; margin: .2em 0; vertical-align: middle; margin-left: .4em; margin-right: 2em; } .ui-spinner-button { width: 1.6em; height: 50%; font-size: .5em; padding: 0; margin: 0; text-align: center; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; } /* more specificity required here to override default borders */ .ui-spinner a.ui-spinner-button { border-top-style: none; border-bottom-style: none; border-right-style: none; } .ui-spinner-up { top: 0; } .ui-spinner-down { bottom: 0; } .ui-tabs { position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ padding: .2em; } .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 0; margin: 1px .2em 0 0; border-bottom-width: 0; padding: 0; white-space: nowrap; } .ui-tabs .ui-tabs-nav .ui-tabs-anchor { float: left; padding: .5em 1em; text-decoration: none; } .ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; } .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { cursor: text; } .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { cursor: pointer; } .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } .ui-tooltip { padding: 8px; position: absolute; z-index: 9999; max-width: 300px; } body .ui-tooltip { border-width: 2px; } /* Component containers ----------------------------------*/ .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } .ui-widget .ui-widget { font-size: 1em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } .ui-widget.ui-widget-content { border: 1px solid #d3d3d3; } .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff; color: #222222; } .ui-widget-content a { color: #222222; } .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x; color: #222222; font-weight: bold; } .ui-widget-header a { color: #222222; } /* Interaction states ----------------------------------*/ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default, .ui-button, /* We use html here because we need a greater specificity to make sure disabled works properly when clicked or hovered */ html .ui-button.ui-state-disabled:hover, html .ui-button.ui-state-disabled:active { border: 1px solid #d3d3d3; background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #555555; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited, a.ui-button, a:link.ui-button, a:visited.ui-button, .ui-button { color: #555555; text-decoration: none; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus, .ui-button:hover, .ui-button:focus { border: 1px solid #999999; background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #212121; } .ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited, .ui-state-focus a, .ui-state-focus a:hover, .ui-state-focus a:link, .ui-state-focus a:visited, a.ui-button:hover, a.ui-button:focus { color: #212121; text-decoration: none; } .ui-visual-focus { box-shadow: 0 0 3px 1px rgb(94, 158, 214); } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active, a.ui-button:active, .ui-button:active, .ui-button.ui-state-active:hover { border: 1px solid #aaaaaa; background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #212121; } .ui-icon-background, .ui-state-active .ui-icon-background { border: #aaaaaa; background-color: #212121; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } /* Interaction Cues ----------------------------------*/ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { border: 1px solid #fcefa1; background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x; color: #363636; } .ui-state-checked { border: 1px solid #fcefa1; background: #fbf9ee; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a, .ui-widget-header .ui-state-highlight a { color: #363636; } .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { border: 1px solid #cd0a0a; background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x; color: #cd0a0a; } .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); /* support: IE8 */ font-weight: normal; } .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); /* support: IE8 */ background-image: none; } .ui-state-disabled .ui-icon { filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { width: 16px; height: 16px; } .ui-icon, .ui-widget-content .ui-icon { background-image: url("images/ui-icons_222222_256x240.png"); } .ui-widget-header .ui-icon { background-image: url("images/ui-icons_222222_256x240.png"); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon, .ui-button:hover .ui-icon, .ui-button:focus .ui-icon { background-image: url("images/ui-icons_454545_256x240.png"); } .ui-state-active .ui-icon, .ui-button:active .ui-icon { background-image: url("images/ui-icons_454545_256x240.png"); } .ui-state-highlight .ui-icon, .ui-button .ui-state-highlight.ui-icon { background-image: url("images/ui-icons_2e83ff_256x240.png"); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon { background-image: url("images/ui-icons_cd0a0a_256x240.png"); } .ui-button .ui-icon { background-image: url("images/ui-icons_888888_256x240.png"); } /* positioning */ .ui-icon-blank { background-position: 16px 16px; } .ui-icon-caret-1-n { background-position: 0 0; } .ui-icon-caret-1-ne { background-position: -16px 0; } .ui-icon-caret-1-e { background-position: -32px 0; } .ui-icon-caret-1-se { background-position: -48px 0; } .ui-icon-caret-1-s { background-position: -65px 0; } .ui-icon-caret-1-sw { background-position: -80px 0; } .ui-icon-caret-1-w { background-position: -96px 0; } .ui-icon-caret-1-nw { background-position: -112px 0; } .ui-icon-caret-2-n-s { background-position: -128px 0; } .ui-icon-caret-2-e-w { background-position: -144px 0; } .ui-icon-triangle-1-n { background-position: 0 -16px; } .ui-icon-triangle-1-ne { background-position: -16px -16px; } .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .ui-icon-triangle-1-s { background-position: -65px -16px; } .ui-icon-triangle-1-sw { background-position: -80px -16px; } .ui-icon-triangle-1-w { background-position: -96px -16px; } .ui-icon-triangle-1-nw { background-position: -112px -16px; } .ui-icon-triangle-2-n-s { background-position: -128px -16px; } .ui-icon-triangle-2-e-w { background-position: -144px -16px; } .ui-icon-arrow-1-n { background-position: 0 -32px; } .ui-icon-arrow-1-ne { background-position: -16px -32px; } .ui-icon-arrow-1-e { background-position: -32px -32px; } .ui-icon-arrow-1-se { background-position: -48px -32px; } .ui-icon-arrow-1-s { background-position: -65px -32px; } .ui-icon-arrow-1-sw { background-position: -80px -32px; } .ui-icon-arrow-1-w { background-position: -96px -32px; } .ui-icon-arrow-1-nw { background-position: -112px -32px; } .ui-icon-arrow-2-n-s { background-position: -128px -32px; } .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } .ui-icon-arrow-2-e-w { background-position: -160px -32px; } .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } .ui-icon-arrowstop-1-n { background-position: -192px -32px; } .ui-icon-arrowstop-1-e { background-position: -208px -32px; } .ui-icon-arrowstop-1-s { background-position: -224px -32px; } .ui-icon-arrowstop-1-w { background-position: -240px -32px; } .ui-icon-arrowthick-1-n { background-position: 1px -48px; } .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } .ui-icon-arrowthick-1-e { background-position: -32px -48px; } .ui-icon-arrowthick-1-se { background-position: -48px -48px; } .ui-icon-arrowthick-1-s { background-position: -64px -48px; } .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } .ui-icon-arrowthick-1-w { background-position: -96px -48px; } .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } .ui-icon-arrow-4 { background-position: 0 -80px; } .ui-icon-arrow-4-diag { background-position: -16px -80px; } .ui-icon-extlink { background-position: -32px -80px; } .ui-icon-newwin { background-position: -48px -80px; } .ui-icon-refresh { background-position: -64px -80px; } .ui-icon-shuffle { background-position: -80px -80px; } .ui-icon-transfer-e-w { background-position: -96px -80px; } .ui-icon-transferthick-e-w { background-position: -112px -80px; } .ui-icon-folder-collapsed { background-position: 0 -96px; } .ui-icon-folder-open { background-position: -16px -96px; } .ui-icon-document { background-position: -32px -96px; } .ui-icon-document-b { background-position: -48px -96px; } .ui-icon-note { background-position: -64px -96px; } .ui-icon-mail-closed { background-position: -80px -96px; } .ui-icon-mail-open { background-position: -96px -96px; } .ui-icon-suitcase { background-position: -112px -96px; } .ui-icon-comment { background-position: -128px -96px; } .ui-icon-person { background-position: -144px -96px; } .ui-icon-print { background-position: -160px -96px; } .ui-icon-trash { background-position: -176px -96px; } .ui-icon-locked { background-position: -192px -96px; } .ui-icon-unlocked { background-position: -208px -96px; } .ui-icon-bookmark { background-position: -224px -96px; } .ui-icon-tag { background-position: -240px -96px; } .ui-icon-home { background-position: 0 -112px; } .ui-icon-flag { background-position: -16px -112px; } .ui-icon-calendar { background-position: -32px -112px; } .ui-icon-cart { background-position: -48px -112px; } .ui-icon-pencil { background-position: -64px -112px; } .ui-icon-clock { background-position: -80px -112px; } .ui-icon-disk { background-position: -96px -112px; } .ui-icon-calculator { background-position: -112px -112px; } .ui-icon-zoomin { background-position: -128px -112px; } .ui-icon-zoomout { background-position: -144px -112px; } .ui-icon-search { background-position: -160px -112px; } .ui-icon-wrench { background-position: -176px -112px; } .ui-icon-gear { background-position: -192px -112px; } .ui-icon-heart { background-position: -208px -112px; } .ui-icon-star { background-position: -224px -112px; } .ui-icon-link { background-position: -240px -112px; } .ui-icon-cancel { background-position: 0 -128px; } .ui-icon-plus { background-position: -16px -128px; } .ui-icon-plusthick { background-position: -32px -128px; } .ui-icon-minus { background-position: -48px -128px; } .ui-icon-minusthick { background-position: -64px -128px; } .ui-icon-close { background-position: -80px -128px; } .ui-icon-closethick { background-position: -96px -128px; } .ui-icon-key { background-position: -112px -128px; } .ui-icon-lightbulb { background-position: -128px -128px; } .ui-icon-scissors { background-position: -144px -128px; } .ui-icon-clipboard { background-position: -160px -128px; } .ui-icon-copy { background-position: -176px -128px; } .ui-icon-contact { background-position: -192px -128px; } .ui-icon-image { background-position: -208px -128px; } .ui-icon-video { background-position: -224px -128px; } .ui-icon-script { background-position: -240px -128px; } .ui-icon-alert { background-position: 0 -144px; } .ui-icon-info { background-position: -16px -144px; } .ui-icon-notice { background-position: -32px -144px; } .ui-icon-help { background-position: -48px -144px; } .ui-icon-check { background-position: -64px -144px; } .ui-icon-bullet { background-position: -80px -144px; } .ui-icon-radio-on { background-position: -96px -144px; } .ui-icon-radio-off { background-position: -112px -144px; } .ui-icon-pin-w { background-position: -128px -144px; } .ui-icon-pin-s { background-position: -144px -144px; } .ui-icon-play { background-position: 0 -160px; } .ui-icon-pause { background-position: -16px -160px; } .ui-icon-seek-next { background-position: -32px -160px; } .ui-icon-seek-prev { background-position: -48px -160px; } .ui-icon-seek-end { background-position: -64px -160px; } .ui-icon-seek-start { background-position: -80px -160px; } /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ .ui-icon-seek-first { background-position: -80px -160px; } .ui-icon-stop { background-position: -96px -160px; } .ui-icon-eject { background-position: -112px -160px; } .ui-icon-volume-off { background-position: -128px -160px; } .ui-icon-volume-on { background-position: -144px -160px; } .ui-icon-power { background-position: 0 -176px; } .ui-icon-signal-diag { background-position: -16px -176px; } .ui-icon-signal { background-position: -32px -176px; } .ui-icon-battery-0 { background-position: -48px -176px; } .ui-icon-battery-1 { background-position: -64px -176px; } .ui-icon-battery-2 { background-position: -80px -176px; } .ui-icon-battery-3 { background-position: -96px -176px; } .ui-icon-circle-plus { background-position: 0 -192px; } .ui-icon-circle-minus { background-position: -16px -192px; } .ui-icon-circle-close { background-position: -32px -192px; } .ui-icon-circle-triangle-e { background-position: -48px -192px; } .ui-icon-circle-triangle-s { background-position: -64px -192px; } .ui-icon-circle-triangle-w { background-position: -80px -192px; } .ui-icon-circle-triangle-n { background-position: -96px -192px; } .ui-icon-circle-arrow-e { background-position: -112px -192px; } .ui-icon-circle-arrow-s { background-position: -128px -192px; } .ui-icon-circle-arrow-w { background-position: -144px -192px; } .ui-icon-circle-arrow-n { background-position: -160px -192px; } .ui-icon-circle-zoomin { background-position: -176px -192px; } .ui-icon-circle-zoomout { background-position: -192px -192px; } .ui-icon-circle-check { background-position: -208px -192px; } .ui-icon-circlesmall-plus { background-position: 0 -208px; } .ui-icon-circlesmall-minus { background-position: -16px -208px; } .ui-icon-circlesmall-close { background-position: -32px -208px; } .ui-icon-squaresmall-plus { background-position: -48px -208px; } .ui-icon-squaresmall-minus { background-position: -64px -208px; } .ui-icon-squaresmall-close { background-position: -80px -208px; } .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } .ui-icon-grip-solid-vertical { background-position: -32px -224px; } .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } .ui-icon-grip-diagonal-se { background-position: -80px -224px; } /* Misc visuals ----------------------------------*/ /* Corner radius */ .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { border-top-left-radius: 4px; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { border-top-right-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { border-bottom-left-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { border-bottom-right-radius: 4px; } /* Overlays */ .ui-widget-overlay { background: #aaaaaa; opacity: .3; filter: Alpha(Opacity=30); /* support: IE8 */ } .ui-widget-shadow { -webkit-box-shadow: -8px -8px 8px #aaaaaa; box-shadow: -8px -8px 8px #aaaaaa; } PKL\(\PP7youtube-embed-plus/styles/alertify/alertify.rtl.min.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dimmer{position:fixed;z-index:1981;top:0;left:0;bottom:0;right:0;padding:0;margin:0;background-color:#252525;opacity:.5}.alertify .ajs-modal{position:fixed;top:0;left:0;right:0;bottom:0;padding:0;overflow-y:auto;z-index:1981}.alertify .ajs-dialog{position:relative;margin:5% auto;min-height:110px;max-width:500px;padding:24px 24px 0 24px;outline:0;background-color:#fff}.alertify .ajs-dialog.ajs-capture:before{content:'';position:absolute;top:0;left:0;bottom:0;right:0;display:block;z-index:1}.alertify .ajs-reset{position:absolute!important;display:inline!important;width:0!important;height:0!important;opacity:0!important}.alertify .ajs-commands{position:absolute;left:4px;margin:-14px 0 0 24px;z-index:2}.alertify .ajs-commands button{display:none;width:10px;height:10px;margin-right:10px;padding:10px;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.alertify .ajs-commands button.ajs-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC)}.alertify .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC)}.alertify .ajs-header{margin:-24px;margin-bottom:0;padding:16px 24px;background-color:#fff}.alertify .ajs-body{min-height:56px}.alertify .ajs-body .ajs-content{padding:16px 16px 16px 24px}.alertify .ajs-footer{padding:4px;margin-right:-24px;margin-left:-24px;min-height:43px;background-color:#fff}.alertify .ajs-footer .ajs-buttons.ajs-primary{text-align:left}.alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary{float:right;clear:none;text-align:right}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons .ajs-button{min-width:88px;min-height:35px}.alertify .ajs-handle{position:absolute;display:none;width:10px;height:10px;left:0;bottom:0;z-index:1;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==);-webkit-transform:scaleX(-1);transform:scaleX(-1);cursor:sw-resize}.alertify.ajs-no-overflow .ajs-body .ajs-content{overflow:hidden!important}.alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content{right:0;left:0;padding:0}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body{margin-right:-24px;margin-left:-24px}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content{padding:0}.alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content{right:0;left:0}.alertify.ajs-maximizable .ajs-commands button.ajs-maximize,.alertify.ajs-maximizable .ajs-commands button.ajs-restore{display:inline-block}.alertify.ajs-closable .ajs-commands button.ajs-close{display:inline-block}.alertify.ajs-maximized .ajs-dialog{width:100%!important;height:100%!important;max-width:none!important;margin:0 auto!important;top:0!important;right:0!important}.alertify.ajs-maximized.ajs-modeless .ajs-modal{position:fixed!important;min-height:100%!important;max-height:none!important;margin:0!important}.alertify.ajs-maximized .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=)}.alertify.ajs-maximized .ajs-dialog,.alertify.ajs-resizable .ajs-dialog{padding:0}.alertify.ajs-maximized .ajs-commands,.alertify.ajs-resizable .ajs-commands{margin:14px 0 0 24px}.alertify.ajs-maximized .ajs-header,.alertify.ajs-resizable .ajs-header{position:absolute;top:0;right:0;left:0;margin:0;padding:16px 24px}.alertify.ajs-maximized .ajs-body,.alertify.ajs-resizable .ajs-body{min-height:224px;display:inline-block}.alertify.ajs-maximized .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-body .ajs-content{position:absolute;top:50px;left:24px;bottom:50px;right:24px;overflow:auto}.alertify.ajs-maximized .ajs-footer,.alertify.ajs-resizable .ajs-footer{position:absolute;right:0;left:0;bottom:0;margin:0}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog{min-width:548px}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle{display:block}.alertify.ajs-movable:not(.ajs-maximized) .ajs-header{cursor:move}.alertify.ajs-modeless .ajs-dimmer,.alertify.ajs-modeless .ajs-reset{display:none}.alertify.ajs-modeless .ajs-modal{overflow:visible;max-width:none;max-height:0}.alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin{display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC)}.alertify.ajs-modeless.ajs-unpinned .ajs-modal{position:absolute}.alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=)}.alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body{max-height:500px;overflow:auto}.alertify.ajs-basic .ajs-header{opacity:0}.alertify.ajs-basic .ajs-footer{visibility:hidden}.alertify.ajs-frameless .ajs-header{position:absolute;top:0;right:0;left:0;min-height:60px;margin:0;padding:0;opacity:0;z-index:1}.alertify.ajs-frameless .ajs-footer{display:none}.alertify.ajs-frameless .ajs-body .ajs-content{position:absolute;top:0;left:0;bottom:0;right:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog{padding-top:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands{margin-top:0}.ajs-no-overflow{overflow:hidden!important;outline:0}.ajs-no-overflow.ajs-fixed{position:fixed;top:0;left:0;bottom:0;right:0;overflow-y:scroll!important}.ajs-no-selection,.ajs-no-selection *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:568px){.alertify .ajs-dialog{min-width:150px}.alertify:not(.ajs-maximized) .ajs-modal{padding:0 5%}.alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog{min-width:initial;min-width:auto}}@-moz-document url-prefix(){.alertify button:focus{outline:1px dotted #3593d2}}.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-property:opacity,visibility;transition-property:opacity,visibility;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:250ms;transition-duration:250ms}.alertify.ajs-hidden .ajs-dimmer,.alertify.ajs-hidden .ajs-modal{visibility:hidden;opacity:0}.alertify.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-duration:.5s;animation-duration:.5s}.alertify.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-duration:250ms;animation-duration:250ms}.alertify .ajs-dialog.ajs-shake{-webkit-animation-name:ajs-shake;animation-name:ajs-shake;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}}@keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}}.alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-slideIn;animation-name:ajs-slideIn;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1.275);animation-timing-function:cubic-bezier(.175,.885,.32,1.275)}.alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-slideOut;animation-name:ajs-slideOut;-webkit-animation-timing-function:cubic-bezier(.6,-.28,.735,.045);animation-timing-function:cubic-bezier(.6,-.28,.735,.045)}.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-zoomIn;animation-name:ajs-zoomIn}.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-zoomOut;animation-name:ajs-zoomOut}.alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-fadeIn;animation-name:ajs-fadeIn}.alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-fadeOut;animation-name:ajs-fadeOut}.alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-pulseIn;animation-name:ajs-pulseIn}.alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-pulseOut;animation-name:ajs-pulseOut}.alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInX;animation-name:ajs-flipInX}.alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutX;animation-name:ajs-flipOutX}.alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInY;animation-name:ajs-flipInY}.alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutY;animation-name:ajs-flipOutY}@-webkit-keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@-webkit-keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-90deg);transform:perspective(400px) rotate3d(1,0,0,-90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,20deg);transform:perspective(400px) rotate3d(1,0,0,20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-10deg);transform:perspective(400px) rotate3d(1,0,0,-10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,5deg);transform:perspective(400px) rotate3d(1,0,0,5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-90deg);transform:perspective(400px) rotate3d(1,0,0,-90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,20deg);transform:perspective(400px) rotate3d(1,0,0,20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-10deg);transform:perspective(400px) rotate3d(1,0,0,-10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,5deg);transform:perspective(400px) rotate3d(1,0,0,5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,20deg);transform:perspective(400px) rotate3d(1,0,0,20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-90deg);transform:perspective(400px) rotate3d(1,0,0,-90deg);opacity:0}}@keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,20deg);transform:perspective(400px) rotate3d(1,0,0,20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-90deg);transform:perspective(400px) rotate3d(1,0,0,-90deg);opacity:0}}@-webkit-keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,-90deg);transform:perspective(400px) rotate3d(0,-1,0,-90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,20deg);transform:perspective(400px) rotate3d(0,-1,0,20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,-10deg);transform:perspective(400px) rotate3d(0,-1,0,-10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,5deg);transform:perspective(400px) rotate3d(0,-1,0,5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,-90deg);transform:perspective(400px) rotate3d(0,-1,0,-90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,20deg);transform:perspective(400px) rotate3d(0,-1,0,20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,-10deg);transform:perspective(400px) rotate3d(0,-1,0,-10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,5deg);transform:perspective(400px) rotate3d(0,-1,0,5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,15deg);transform:perspective(400px) rotate3d(0,-1,0,15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,-90deg);transform:perspective(400px) rotate3d(0,-1,0,-90deg);opacity:0}}@keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,15deg);transform:perspective(400px) rotate3d(0,-1,0,15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,-1,0,-90deg);transform:perspective(400px) rotate3d(0,-1,0,-90deg);opacity:0}}@-webkit-keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@-webkit-keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}@keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}.alertify-notifier{position:fixed;width:0;overflow:visible;z-index:1982;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.alertify-notifier .ajs-message{position:relative;width:260px;max-height:0;padding:0;opacity:0;margin:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}.alertify-notifier .ajs-message.ajs-visible{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.275);transition-timing-function:cubic-bezier(.175,.885,.32,1.275);opacity:1;max-height:100%;padding:15px;margin-top:10px}.alertify-notifier .ajs-message.ajs-success{background:rgba(91,189,114,.95)}.alertify-notifier .ajs-message.ajs-error{background:rgba(217,92,92,.95)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95)}.alertify-notifier .ajs-message .ajs-close{position:absolute;top:0;left:0;width:16px;height:16px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAFBJREFUGBl1j0EKADEIA+ve/P9f9bh1hEihNBfjVCO1v7RKVqJK4h8gM5cAPR42AkQEpSXPwMTyoi13n5N9YqJehm3Fnr7nL1D0ZEbD5OubGyC7a9gx+9eNAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:center center;background-color:rgba(0,0,0,.5);border-top-left-radius:2px}.alertify-notifier.ajs-top{top:10px}.alertify-notifier.ajs-bottom{bottom:10px}.alertify-notifier.ajs-right{left:10px}.alertify-notifier.ajs-right .ajs-message{left:-320px}.alertify-notifier.ajs-right .ajs-message.ajs-visible{left:290px}.alertify-notifier.ajs-left{right:10px}.alertify-notifier.ajs-left .ajs-message{right:-300px}.alertify-notifier.ajs-left .ajs-message.ajs-visible{right:0}.alertify-notifier.ajs-center{right:50%}.alertify-notifier.ajs-center .ajs-message{-webkit-transform:translateX(50%);transform:translateX(50%)}.alertify-notifier.ajs-center .ajs-message.ajs-visible{right:50%;-webkit-transition-timing-function:cubic-bezier(.57,.43,.1,.65);transition-timing-function:cubic-bezier(.57,.43,.1,.65)}.alertify-notifier.ajs-center.ajs-top .ajs-message{top:-300px}.alertify-notifier.ajs-center.ajs-top .ajs-message.ajs-visible{top:0}.alertify-notifier.ajs-center.ajs-bottom .ajs-message{bottom:-300px}.alertify-notifier.ajs-center.ajs-bottom .ajs-message.ajs-visible{bottom:0}PKL\mOCPP3youtube-embed-plus/styles/alertify/alertify.min.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dimmer{position:fixed;z-index:1981;top:0;right:0;bottom:0;left:0;padding:0;margin:0;background-color:#252525;opacity:.5}.alertify .ajs-modal{position:fixed;top:0;right:0;left:0;bottom:0;padding:0;overflow-y:auto;z-index:1981}.alertify .ajs-dialog{position:relative;margin:5% auto;min-height:110px;max-width:500px;padding:24px 24px 0 24px;outline:0;background-color:#fff}.alertify .ajs-dialog.ajs-capture:before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;display:block;z-index:1}.alertify .ajs-reset{position:absolute!important;display:inline!important;width:0!important;height:0!important;opacity:0!important}.alertify .ajs-commands{position:absolute;right:4px;margin:-14px 24px 0 0;z-index:2}.alertify .ajs-commands button{display:none;width:10px;height:10px;margin-left:10px;padding:10px;border:0;background-color:transparent;background-repeat:no-repeat;background-position:center;cursor:pointer}.alertify .ajs-commands button.ajs-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC)}.alertify .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC)}.alertify .ajs-header{margin:-24px;margin-bottom:0;padding:16px 24px;background-color:#fff}.alertify .ajs-body{min-height:56px}.alertify .ajs-body .ajs-content{padding:16px 24px 16px 16px}.alertify .ajs-footer{padding:4px;margin-left:-24px;margin-right:-24px;min-height:43px;background-color:#fff}.alertify .ajs-footer .ajs-buttons.ajs-primary{text-align:right}.alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary{float:left;clear:none;text-align:left}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons .ajs-button{min-width:88px;min-height:35px}.alertify .ajs-handle{position:absolute;display:none;width:10px;height:10px;right:0;bottom:0;z-index:1;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==);-webkit-transform:scaleX(1);transform:scaleX(1);cursor:se-resize}.alertify.ajs-no-overflow .ajs-body .ajs-content{overflow:hidden!important}.alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content{left:0;right:0;padding:0}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body{margin-left:-24px;margin-right:-24px}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content{padding:0}.alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content{left:0;right:0}.alertify.ajs-maximizable .ajs-commands button.ajs-maximize,.alertify.ajs-maximizable .ajs-commands button.ajs-restore{display:inline-block}.alertify.ajs-closable .ajs-commands button.ajs-close{display:inline-block}.alertify.ajs-maximized .ajs-dialog{width:100%!important;height:100%!important;max-width:none!important;margin:0 auto!important;top:0!important;left:0!important}.alertify.ajs-maximized.ajs-modeless .ajs-modal{position:fixed!important;min-height:100%!important;max-height:none!important;margin:0!important}.alertify.ajs-maximized .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=)}.alertify.ajs-maximized .ajs-dialog,.alertify.ajs-resizable .ajs-dialog{padding:0}.alertify.ajs-maximized .ajs-commands,.alertify.ajs-resizable .ajs-commands{margin:14px 24px 0 0}.alertify.ajs-maximized .ajs-header,.alertify.ajs-resizable .ajs-header{position:absolute;top:0;left:0;right:0;margin:0;padding:16px 24px}.alertify.ajs-maximized .ajs-body,.alertify.ajs-resizable .ajs-body{min-height:224px;display:inline-block}.alertify.ajs-maximized .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-body .ajs-content{position:absolute;top:50px;right:24px;bottom:50px;left:24px;overflow:auto}.alertify.ajs-maximized .ajs-footer,.alertify.ajs-resizable .ajs-footer{position:absolute;left:0;right:0;bottom:0;margin:0}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog{min-width:548px}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle{display:block}.alertify.ajs-movable:not(.ajs-maximized) .ajs-header{cursor:move}.alertify.ajs-modeless .ajs-dimmer,.alertify.ajs-modeless .ajs-reset{display:none}.alertify.ajs-modeless .ajs-modal{overflow:visible;max-width:none;max-height:0}.alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin{display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC)}.alertify.ajs-modeless.ajs-unpinned .ajs-modal{position:absolute}.alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=)}.alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body{max-height:500px;overflow:auto}.alertify.ajs-basic .ajs-header{opacity:0}.alertify.ajs-basic .ajs-footer{visibility:hidden}.alertify.ajs-frameless .ajs-header{position:absolute;top:0;left:0;right:0;min-height:60px;margin:0;padding:0;opacity:0;z-index:1}.alertify.ajs-frameless .ajs-footer{display:none}.alertify.ajs-frameless .ajs-body .ajs-content{position:absolute;top:0;right:0;bottom:0;left:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog{padding-top:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands{margin-top:0}.ajs-no-overflow{overflow:hidden!important;outline:0}.ajs-no-overflow.ajs-fixed{position:fixed;top:0;right:0;bottom:0;left:0;overflow-y:scroll!important}.ajs-no-selection,.ajs-no-selection *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:568px){.alertify .ajs-dialog{min-width:150px}.alertify:not(.ajs-maximized) .ajs-modal{padding:0 5%}.alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog{min-width:initial;min-width:auto}}@-moz-document url-prefix(){.alertify button:focus{outline:1px dotted #3593d2}}.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-property:opacity,visibility;transition-property:opacity,visibility;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:250ms;transition-duration:250ms}.alertify.ajs-hidden .ajs-dimmer,.alertify.ajs-hidden .ajs-modal{visibility:hidden;opacity:0}.alertify.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-duration:.5s;animation-duration:.5s}.alertify.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-duration:250ms;animation-duration:250ms}.alertify .ajs-dialog.ajs-shake{-webkit-animation-name:ajs-shake;animation-name:ajs-shake;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes ajs-shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-slideIn;animation-name:ajs-slideIn;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1.275);animation-timing-function:cubic-bezier(.175,.885,.32,1.275)}.alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-slideOut;animation-name:ajs-slideOut;-webkit-animation-timing-function:cubic-bezier(.6,-.28,.735,.045);animation-timing-function:cubic-bezier(.6,-.28,.735,.045)}.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-zoomIn;animation-name:ajs-zoomIn}.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-zoomOut;animation-name:ajs-zoomOut}.alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-fadeIn;animation-name:ajs-fadeIn}.alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-fadeOut;animation-name:ajs-fadeOut}.alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-pulseIn;animation-name:ajs-pulseIn}.alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-pulseOut;animation-name:ajs-pulseOut}.alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInX;animation-name:ajs-flipInX}.alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutX;animation-name:ajs-flipOutX}.alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInY;animation-name:ajs-flipInY}.alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutY;animation-name:ajs-flipOutY}@-webkit-keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-pulseIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}100%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@-webkit-keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes ajs-fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes ajs-fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@-webkit-keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@-webkit-keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@keyframes ajs-slideIn{0%{margin-top:-100%}100%{margin-top:5%}}@-webkit-keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}@keyframes ajs-slideOut{0%{margin-top:5%}100%{margin-top:-100%}}.alertify-notifier{position:fixed;width:0;overflow:visible;z-index:1982;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.alertify-notifier .ajs-message{position:relative;width:260px;max-height:0;padding:0;opacity:0;margin:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:linear;transition-timing-function:linear}.alertify-notifier .ajs-message.ajs-visible{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.275);transition-timing-function:cubic-bezier(.175,.885,.32,1.275);opacity:1;max-height:100%;padding:15px;margin-top:10px}.alertify-notifier .ajs-message.ajs-success{background:rgba(91,189,114,.95)}.alertify-notifier .ajs-message.ajs-error{background:rgba(217,92,92,.95)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95)}.alertify-notifier .ajs-message .ajs-close{position:absolute;top:0;right:0;width:16px;height:16px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAFBJREFUGBl1j0EKADEIA+ve/P9f9bh1hEihNBfjVCO1v7RKVqJK4h8gM5cAPR42AkQEpSXPwMTyoi13n5N9YqJehm3Fnr7nL1D0ZEbD5OubGyC7a9gx+9eNAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:center center;background-color:rgba(0,0,0,.5);border-top-right-radius:2px}.alertify-notifier.ajs-top{top:10px}.alertify-notifier.ajs-bottom{bottom:10px}.alertify-notifier.ajs-right{right:10px}.alertify-notifier.ajs-right .ajs-message{right:-320px}.alertify-notifier.ajs-right .ajs-message.ajs-visible{right:290px}.alertify-notifier.ajs-left{left:10px}.alertify-notifier.ajs-left .ajs-message{left:-300px}.alertify-notifier.ajs-left .ajs-message.ajs-visible{left:0}.alertify-notifier.ajs-center{left:50%}.alertify-notifier.ajs-center .ajs-message{-webkit-transform:translateX(-50%);transform:translateX(-50%)}.alertify-notifier.ajs-center .ajs-message.ajs-visible{left:50%;-webkit-transition-timing-function:cubic-bezier(.57,.43,.1,.65);transition-timing-function:cubic-bezier(.57,.43,.1,.65)}.alertify-notifier.ajs-center.ajs-top .ajs-message{top:-300px}.alertify-notifier.ajs-center.ajs-top .ajs-message.ajs-visible{top:0}.alertify-notifier.ajs-center.ajs-bottom .ajs-message{bottom:-300px}.alertify-notifier.ajs-center.ajs-bottom .ajs-message.ajs-visible{bottom:0}PKL\4b :youtube-embed-plus/styles/alertify/themes/semantic.rtl.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dimmer { background-color: rgba(0, 0, 0, 0.85); opacity: 1; } .alertify .ajs-dialog { max-width: 50%; min-height: 137px; background-color: #F4F4F4; border: 1px solid #DDD; -webkit-box-shadow: none; box-shadow: none; border-radius: 5px; } .alertify .ajs-header { padding: 1.5rem 2rem; border-bottom: none; border-radius: 5px 5px 0 0; color: #555; background-color: #fff; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 1.6em; font-weight: 700; } .alertify .ajs-body { font-family: 'Roboto', sans-serif; color: #555; } .alertify .ajs-body .ajs-content .ajs-input { width: 100%; margin: 0; padding: .65em 1em; font-size: 1em; background-color: #FFF; border: 1px solid rgba(0, 0, 0, 0.15); outline: 0; color: rgba(0, 0, 0, 0.7); border-radius: .3125em; -webkit-transition: background-color 0.3s ease-out, border-color 0.2s ease, -webkit-box-shadow 0.2s ease; transition: background-color 0.3s ease-out, border-color 0.2s ease, -webkit-box-shadow 0.2s ease; transition: background-color 0.3s ease-out, box-shadow 0.2s ease, border-color 0.2s ease; transition: background-color 0.3s ease-out, box-shadow 0.2s ease, border-color 0.2s ease, -webkit-box-shadow 0.2s ease; -webkit-box-sizing: border-box; box-sizing: border-box; } .alertify .ajs-body .ajs-content .ajs-input:active { border-color: rgba(0, 0, 0, 0.3); background-color: #FAFAFA; } .alertify .ajs-body .ajs-content .ajs-input:focus { border-color: rgba(0, 0, 0, 0.2); color: rgba(0, 0, 0, 0.85); } .alertify.ajs-resizable .ajs-content, .alertify.ajs-maximized:not(.ajs-resizable) .ajs-content { top: 64px; bottom: 74px; } .alertify .ajs-footer { background-color: #fff; padding: 1rem 2rem; border-top: none; border-radius: 0 0 5px 5px; } .alertify-notifier .ajs-message { background: rgba(255, 255, 255, 0.95); color: #000; text-align: center; border: solid 1px #ddd; border-radius: 2px; } .alertify-notifier .ajs-message.ajs-success { color: #fff; background: rgba(91, 189, 114, 0.95); text-shadow: 1px -1px 0 rgba(0, 0, 0, 0.5); } .alertify-notifier .ajs-message.ajs-error { color: #fff; background: rgba(217, 92, 92, 0.95); text-shadow: 1px -1px 0 rgba(0, 0, 0, 0.5); } .alertify-notifier .ajs-message.ajs-warning { background: rgba(252, 248, 215, 0.95); border-color: #999; } PKL\a 6youtube-embed-plus/styles/alertify/themes/semantic.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dimmer { background-color: rgba(0, 0, 0, 0.85); opacity: 1; } .alertify .ajs-dialog { max-width: 50%; min-height: 137px; background-color: #F4F4F4; border: 1px solid #DDD; -webkit-box-shadow: none; box-shadow: none; border-radius: 5px; } .alertify .ajs-header { padding: 1.5rem 2rem; border-bottom: none; border-radius: 5px 5px 0 0; color: #555; background-color: #fff; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 1.6em; font-weight: 700; } .alertify .ajs-body { font-family: 'Roboto', sans-serif; color: #555; } .alertify .ajs-body .ajs-content .ajs-input { width: 100%; margin: 0; padding: .65em 1em; font-size: 1em; background-color: #FFF; border: 1px solid rgba(0, 0, 0, 0.15); outline: 0; color: rgba(0, 0, 0, 0.7); border-radius: .3125em; -webkit-transition: background-color 0.3s ease-out, border-color 0.2s ease, -webkit-box-shadow 0.2s ease; transition: background-color 0.3s ease-out, border-color 0.2s ease, -webkit-box-shadow 0.2s ease; transition: background-color 0.3s ease-out, box-shadow 0.2s ease, border-color 0.2s ease; transition: background-color 0.3s ease-out, box-shadow 0.2s ease, border-color 0.2s ease, -webkit-box-shadow 0.2s ease; -webkit-box-sizing: border-box; box-sizing: border-box; } .alertify .ajs-body .ajs-content .ajs-input:active { border-color: rgba(0, 0, 0, 0.3); background-color: #FAFAFA; } .alertify .ajs-body .ajs-content .ajs-input:focus { border-color: rgba(0, 0, 0, 0.2); color: rgba(0, 0, 0, 0.85); } .alertify.ajs-resizable .ajs-content, .alertify.ajs-maximized:not(.ajs-resizable) .ajs-content { top: 64px; bottom: 74px; } .alertify .ajs-footer { background-color: #fff; padding: 1rem 2rem; border-top: none; border-radius: 0 0 5px 5px; } .alertify-notifier .ajs-message { background: rgba(255, 255, 255, 0.95); color: #000; text-align: center; border: solid 1px #ddd; border-radius: 2px; } .alertify-notifier .ajs-message.ajs-success { color: #fff; background: rgba(91, 189, 114, 0.95); text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.5); } .alertify-notifier .ajs-message.ajs-error { color: #fff; background: rgba(217, 92, 92, 0.95); text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.5); } .alertify-notifier .ajs-message.ajs-warning { background: rgba(252, 248, 215, 0.95); border-color: #999; } PKL\#7P  >youtube-embed-plus/styles/alertify/themes/semantic.rtl.min.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dimmer{background-color:rgba(0,0,0,.85);opacity:1}.alertify .ajs-dialog{max-width:50%;min-height:137px;background-color:#f4f4f4;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none;border-radius:5px}.alertify .ajs-header{padding:1.5rem 2rem;border-bottom:none;border-radius:5px 5px 0 0;color:#555;background-color:#fff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1.6em;font-weight:700}.alertify .ajs-body{font-family:Roboto,sans-serif;color:#555}.alertify .ajs-body .ajs-content .ajs-input{width:100%;margin:0;padding:.65em 1em;font-size:1em;background-color:#fff;border:1px solid rgba(0,0,0,.15);outline:0;color:rgba(0,0,0,.7);border-radius:.3125em;-webkit-transition:background-color .3s ease-out,border-color .2s ease,-webkit-box-shadow .2s ease;transition:background-color .3s ease-out,border-color .2s ease,-webkit-box-shadow .2s ease;transition:background-color .3s ease-out,box-shadow .2s ease,border-color .2s ease;transition:background-color .3s ease-out,box-shadow .2s ease,border-color .2s ease,-webkit-box-shadow .2s ease;-webkit-box-sizing:border-box;box-sizing:border-box}.alertify .ajs-body .ajs-content .ajs-input:active{border-color:rgba(0,0,0,.3);background-color:#fafafa}.alertify .ajs-body .ajs-content .ajs-input:focus{border-color:rgba(0,0,0,.2);color:rgba(0,0,0,.85)}.alertify.ajs-maximized:not(.ajs-resizable) .ajs-content,.alertify.ajs-resizable .ajs-content{top:64px;bottom:74px}.alertify .ajs-footer{background-color:#fff;padding:1rem 2rem;border-top:none;border-radius:0 0 5px 5px}.alertify-notifier .ajs-message{background:rgba(255,255,255,.95);color:#000;text-align:center;border:solid 1px #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-success{color:#fff;background:rgba(91,189,114,.95);text-shadow:1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-error{color:#fff;background:rgba(217,92,92,.95);text-shadow:1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95);border-color:#999}PKL\>g''9youtube-embed-plus/styles/alertify/themes/default.min.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dialog{background-color:#fff;-webkit-box-shadow:0 15px 20px 0 rgba(0,0,0,.25);box-shadow:0 15px 20px 0 rgba(0,0,0,.25);border-radius:2px}.alertify .ajs-header{color:#000;font-weight:700;background:#fafafa;border-bottom:#eee 1px solid;border-radius:2px 2px 0 0}.alertify .ajs-body{color:#000}.alertify .ajs-body .ajs-content .ajs-input{display:block;width:100%;padding:8px;margin:4px;border-radius:2px;border:1px solid #ccc}.alertify .ajs-body .ajs-content p{margin:0}.alertify .ajs-footer{background:#fbfbfb;border-top:#eee 1px solid;border-radius:0 0 2px 2px}.alertify .ajs-footer .ajs-buttons .ajs-button{background-color:transparent;color:#000;border:0;font-size:14px;font-weight:700;text-transform:uppercase}.alertify .ajs-footer .ajs-buttons .ajs-button.ajs-ok{color:#3593d2}.alertify-notifier .ajs-message{background:rgba(255,255,255,.95);color:#000;text-align:center;border:solid 1px #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-success{color:#fff;background:rgba(91,189,114,.95);text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-error{color:#fff;background:rgba(217,92,92,.95);text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95);border-color:#999}PKL\  :youtube-embed-plus/styles/alertify/themes/semantic.min.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dimmer{background-color:rgba(0,0,0,.85);opacity:1}.alertify .ajs-dialog{max-width:50%;min-height:137px;background-color:#f4f4f4;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none;border-radius:5px}.alertify .ajs-header{padding:1.5rem 2rem;border-bottom:none;border-radius:5px 5px 0 0;color:#555;background-color:#fff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1.6em;font-weight:700}.alertify .ajs-body{font-family:Roboto,sans-serif;color:#555}.alertify .ajs-body .ajs-content .ajs-input{width:100%;margin:0;padding:.65em 1em;font-size:1em;background-color:#fff;border:1px solid rgba(0,0,0,.15);outline:0;color:rgba(0,0,0,.7);border-radius:.3125em;-webkit-transition:background-color .3s ease-out,border-color .2s ease,-webkit-box-shadow .2s ease;transition:background-color .3s ease-out,border-color .2s ease,-webkit-box-shadow .2s ease;transition:background-color .3s ease-out,box-shadow .2s ease,border-color .2s ease;transition:background-color .3s ease-out,box-shadow .2s ease,border-color .2s ease,-webkit-box-shadow .2s ease;-webkit-box-sizing:border-box;box-sizing:border-box}.alertify .ajs-body .ajs-content .ajs-input:active{border-color:rgba(0,0,0,.3);background-color:#fafafa}.alertify .ajs-body .ajs-content .ajs-input:focus{border-color:rgba(0,0,0,.2);color:rgba(0,0,0,.85)}.alertify.ajs-maximized:not(.ajs-resizable) .ajs-content,.alertify.ajs-resizable .ajs-content{top:64px;bottom:74px}.alertify .ajs-footer{background-color:#fff;padding:1rem 2rem;border-top:none;border-radius:0 0 5px 5px}.alertify-notifier .ajs-message{background:rgba(255,255,255,.95);color:#000;text-align:center;border:solid 1px #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-success{color:#fff;background:rgba(91,189,114,.95);text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-error{color:#fff;background:rgba(217,92,92,.95);text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95);border-color:#999}PKL\3$q;youtube-embed-plus/styles/alertify/themes/bootstrap.min.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dimmer{background-color:#000;opacity:.5}.alertify .ajs-dialog{max-width:600px;min-height:122px;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5);border-radius:6px}.alertify .ajs-header{color:#333;border-bottom:1px solid #e5e5e5;border-radius:6px 6px 0 0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:18px}.alertify .ajs-body{font-family:Roboto,sans-serif;color:#000}.alertify.ajs-maximized:not(.ajs-resizable) .ajs-content,.alertify.ajs-resizable .ajs-content{top:58px;bottom:68px}.alertify .ajs-footer{background-color:#fff;padding:15px;border-top:1px solid #e5e5e5;border-radius:0 0 6px 6px}.alertify-notifier .ajs-message{background:rgba(255,255,255,.95);color:#000;text-align:center;border:solid 1px #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-success{color:#fff;background:rgba(91,189,114,.95);text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-error{color:#fff;background:rgba(217,92,92,.95);text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95);border-color:#999}PKL\ %%=youtube-embed-plus/styles/alertify/themes/default.rtl.min.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dialog{background-color:#fff;-webkit-box-shadow:0 15px 20px 0 rgba(0,0,0,.25);box-shadow:0 15px 20px 0 rgba(0,0,0,.25);border-radius:2px}.alertify .ajs-header{color:#000;font-weight:700;background:#fafafa;border-bottom:#eee 1px solid;border-radius:2px 2px 0 0}.alertify .ajs-body{color:#000}.alertify .ajs-body .ajs-content .ajs-input{display:block;width:100%;padding:8px;margin:4px;border-radius:2px;border:1px solid #ccc}.alertify .ajs-body .ajs-content p{margin:0}.alertify .ajs-footer{background:#fbfbfb;border-top:#eee 1px solid;border-radius:0 0 2px 2px}.alertify .ajs-footer .ajs-buttons .ajs-button{background-color:transparent;color:#000;border:0;font-size:14px;font-weight:700;text-transform:uppercase}.alertify .ajs-footer .ajs-buttons .ajs-button.ajs-ok{color:#3593d2}.alertify-notifier .ajs-message{background:rgba(255,255,255,.95);color:#000;text-align:center;border:solid 1px #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-success{color:#fff;background:rgba(91,189,114,.95);text-shadow:1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-error{color:#fff;background:rgba(217,92,92,.95);text-shadow:1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95);border-color:#999}PKL\_,,5youtube-embed-plus/styles/alertify/themes/default.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dialog { background-color: white; -webkit-box-shadow: 0px 15px 20px 0px rgba(0, 0, 0, 0.25); box-shadow: 0px 15px 20px 0px rgba(0, 0, 0, 0.25); border-radius: 2px; } .alertify .ajs-header { color: black; font-weight: bold; background: #fafafa; border-bottom: #eee 1px solid; border-radius: 2px 2px 0 0; } .alertify .ajs-body { color: black; } .alertify .ajs-body .ajs-content .ajs-input { display: block; width: 100%; padding: 8px; margin: 4px; border-radius: 2px; border: 1px solid #CCC; } .alertify .ajs-body .ajs-content p { margin: 0; } .alertify .ajs-footer { background: #fbfbfb; border-top: #eee 1px solid; border-radius: 0 0 2px 2px; } .alertify .ajs-footer .ajs-buttons .ajs-button { background-color: transparent; color: #000; border: 0; font-size: 14px; font-weight: bold; text-transform: uppercase; } .alertify .ajs-footer .ajs-buttons .ajs-button.ajs-ok { color: #3593D2; } .alertify-notifier .ajs-message { background: rgba(255, 255, 255, 0.95); color: #000; text-align: center; border: solid 1px #ddd; border-radius: 2px; } .alertify-notifier .ajs-message.ajs-success { color: #fff; background: rgba(91, 189, 114, 0.95); text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.5); } .alertify-notifier .ajs-message.ajs-error { color: #fff; background: rgba(217, 92, 92, 0.95); text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.5); } .alertify-notifier .ajs-message.ajs-warning { background: rgba(252, 248, 215, 0.95); border-color: #999; } PKL\s**9youtube-embed-plus/styles/alertify/themes/default.rtl.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dialog { background-color: white; -webkit-box-shadow: 0px 15px 20px 0px rgba(0, 0, 0, 0.25); box-shadow: 0px 15px 20px 0px rgba(0, 0, 0, 0.25); border-radius: 2px; } .alertify .ajs-header { color: black; font-weight: bold; background: #fafafa; border-bottom: #eee 1px solid; border-radius: 2px 2px 0 0; } .alertify .ajs-body { color: black; } .alertify .ajs-body .ajs-content .ajs-input { display: block; width: 100%; padding: 8px; margin: 4px; border-radius: 2px; border: 1px solid #CCC; } .alertify .ajs-body .ajs-content p { margin: 0; } .alertify .ajs-footer { background: #fbfbfb; border-top: #eee 1px solid; border-radius: 0 0 2px 2px; } .alertify .ajs-footer .ajs-buttons .ajs-button { background-color: transparent; color: #000; border: 0; font-size: 14px; font-weight: bold; text-transform: uppercase; } .alertify .ajs-footer .ajs-buttons .ajs-button.ajs-ok { color: #3593D2; } .alertify-notifier .ajs-message { background: rgba(255, 255, 255, 0.95); color: #000; text-align: center; border: solid 1px #ddd; border-radius: 2px; } .alertify-notifier .ajs-message.ajs-success { color: #fff; background: rgba(91, 189, 114, 0.95); text-shadow: 1px -1px 0 rgba(0, 0, 0, 0.5); } .alertify-notifier .ajs-message.ajs-error { color: #fff; background: rgba(217, 92, 92, 0.95); text-shadow: 1px -1px 0 rgba(0, 0, 0, 0.5); } .alertify-notifier .ajs-message.ajs-warning { background: rgba(252, 248, 215, 0.95); border-color: #999; } PKL\>;youtube-embed-plus/styles/alertify/themes/bootstrap.rtl.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dimmer { background-color: #000; opacity: .5; } .alertify .ajs-dialog { max-width: 600px; min-height: 122px; background-color: #fff; border: 1px solid rgba(0, 0, 0, 0.2); -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); border-radius: 6px; } .alertify .ajs-header { color: #333; border-bottom: 1px solid #e5e5e5; border-radius: 6px 6px 0 0; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 18px; } .alertify .ajs-body { font-family: 'Roboto', sans-serif; color: black; } .alertify.ajs-resizable .ajs-content, .alertify.ajs-maximized:not(.ajs-resizable) .ajs-content { top: 58px; bottom: 68px; } .alertify .ajs-footer { background-color: #fff; padding: 15px; border-top: 1px solid #e5e5e5; border-radius: 0 0 6px 6px; } .alertify-notifier .ajs-message { background: rgba(255, 255, 255, 0.95); color: #000; text-align: center; border: solid 1px #ddd; border-radius: 2px; } .alertify-notifier .ajs-message.ajs-success { color: #fff; background: rgba(91, 189, 114, 0.95); text-shadow: 1px -1px 0 rgba(0, 0, 0, 0.5); } .alertify-notifier .ajs-message.ajs-error { color: #fff; background: rgba(217, 92, 92, 0.95); text-shadow: 1px -1px 0 rgba(0, 0, 0, 0.5); } .alertify-notifier .ajs-message.ajs-warning { background: rgba(252, 248, 215, 0.95); border-color: #999; } PKL\_g7youtube-embed-plus/styles/alertify/themes/bootstrap.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dimmer { background-color: #000; opacity: .5; } .alertify .ajs-dialog { max-width: 600px; min-height: 122px; background-color: #fff; border: 1px solid rgba(0, 0, 0, 0.2); -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); border-radius: 6px; } .alertify .ajs-header { color: #333; border-bottom: 1px solid #e5e5e5; border-radius: 6px 6px 0 0; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 18px; } .alertify .ajs-body { font-family: 'Roboto', sans-serif; color: black; } .alertify.ajs-resizable .ajs-content, .alertify.ajs-maximized:not(.ajs-resizable) .ajs-content { top: 58px; bottom: 68px; } .alertify .ajs-footer { background-color: #fff; padding: 15px; border-top: 1px solid #e5e5e5; border-radius: 0 0 6px 6px; } .alertify-notifier .ajs-message { background: rgba(255, 255, 255, 0.95); color: #000; text-align: center; border: solid 1px #ddd; border-radius: 2px; } .alertify-notifier .ajs-message.ajs-success { color: #fff; background: rgba(91, 189, 114, 0.95); text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.5); } .alertify-notifier .ajs-message.ajs-error { color: #fff; background: rgba(217, 92, 92, 0.95); text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.5); } .alertify-notifier .ajs-message.ajs-warning { background: rgba(252, 248, 215, 0.95); border-color: #999; } PKL\S<?youtube-embed-plus/styles/alertify/themes/bootstrap.rtl.min.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dimmer{background-color:#000;opacity:.5}.alertify .ajs-dialog{max-width:600px;min-height:122px;background-color:#fff;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5);border-radius:6px}.alertify .ajs-header{color:#333;border-bottom:1px solid #e5e5e5;border-radius:6px 6px 0 0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:18px}.alertify .ajs-body{font-family:Roboto,sans-serif;color:#000}.alertify.ajs-maximized:not(.ajs-resizable) .ajs-content,.alertify.ajs-resizable .ajs-content{top:58px;bottom:68px}.alertify .ajs-footer{background-color:#fff;padding:15px;border-top:1px solid #e5e5e5;border-radius:0 0 6px 6px}.alertify-notifier .ajs-message{background:rgba(255,255,255,.95);color:#000;text-align:center;border:solid 1px #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-success{color:#fff;background:rgba(91,189,114,.95);text-shadow:1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-error{color:#fff;background:rgba(217,92,92,.95);text-shadow:1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{background:rgba(252,248,215,.95);border-color:#999}PKL\5\dd/youtube-embed-plus/styles/alertify/alertify.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dimmer { position: fixed; z-index: 1981; top: 0; right: 0; bottom: 0; left: 0; padding: 0; margin: 0; background-color: #252525; opacity: .5; } .alertify .ajs-modal { position: fixed; top: 0; right: 0; left: 0; bottom: 0; padding: 0; overflow-y: auto; z-index: 1981; } .alertify .ajs-dialog { position: relative; margin: 5% auto; min-height: 110px; max-width: 500px; padding: 24px 24px 0 24px; outline: 0; background-color: #fff; } .alertify .ajs-dialog.ajs-capture:before { content: ''; position: absolute; top: 0; right: 0; bottom: 0; left: 0; display: block; z-index: 1; } .alertify .ajs-reset { position: absolute !important; display: inline !important; width: 0 !important; height: 0 !important; opacity: 0 !important; } .alertify .ajs-commands { position: absolute; right: 4px; margin: -14px 24px 0 0; z-index: 2; } .alertify .ajs-commands button { display: none; width: 10px; height: 10px; margin-left: 10px; padding: 10px; border: 0; background-color: transparent; background-repeat: no-repeat; background-position: center; cursor: pointer; } .alertify .ajs-commands button.ajs-close { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC); } .alertify .ajs-commands button.ajs-maximize { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC); } .alertify .ajs-header { margin: -24px; margin-bottom: 0; padding: 16px 24px; background-color: #fff; } .alertify .ajs-body { min-height: 56px; } .alertify .ajs-body .ajs-content { padding: 16px 24px 16px 16px; } .alertify .ajs-footer { padding: 4px; margin-left: -24px; margin-right: -24px; min-height: 43px; background-color: #fff; } .alertify .ajs-footer .ajs-buttons.ajs-primary { text-align: right; } .alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button { margin: 4px; } .alertify .ajs-footer .ajs-buttons.ajs-auxiliary { float: left; clear: none; text-align: left; } .alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button { margin: 4px; } .alertify .ajs-footer .ajs-buttons .ajs-button { min-width: 88px; min-height: 35px; } .alertify .ajs-handle { position: absolute; display: none; width: 10px; height: 10px; right: 0; bottom: 0; z-index: 1; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==); -webkit-transform: scaleX(1) /*rtl:scaleX(-1)*/; transform: scaleX(1) /*rtl:scaleX(-1)*/; cursor: se-resize; } .alertify.ajs-no-overflow .ajs-body .ajs-content { overflow: hidden !important; } .alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content { left: 0; right: 0; padding: 0; } .alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body { margin-left: -24px; margin-right: -24px; } .alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content { padding: 0; } .alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content { left: 0; right: 0; } .alertify.ajs-maximizable .ajs-commands button.ajs-maximize, .alertify.ajs-maximizable .ajs-commands button.ajs-restore { display: inline-block; } .alertify.ajs-closable .ajs-commands button.ajs-close { display: inline-block; } .alertify.ajs-maximized .ajs-dialog { width: 100% !important; height: 100% !important; max-width: none !important; margin: 0 auto !important; top: 0 !important; left: 0 !important; } .alertify.ajs-maximized.ajs-modeless .ajs-modal { position: fixed !important; min-height: 100% !important; max-height: none !important; margin: 0 !important; } .alertify.ajs-maximized .ajs-commands button.ajs-maximize { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=); } .alertify.ajs-resizable .ajs-dialog, .alertify.ajs-maximized .ajs-dialog { padding: 0; } .alertify.ajs-resizable .ajs-commands, .alertify.ajs-maximized .ajs-commands { margin: 14px 24px 0 0; } .alertify.ajs-resizable .ajs-header, .alertify.ajs-maximized .ajs-header { position: absolute; top: 0; left: 0; right: 0; margin: 0; padding: 16px 24px; } .alertify.ajs-resizable .ajs-body, .alertify.ajs-maximized .ajs-body { min-height: 224px; display: inline-block; } .alertify.ajs-resizable .ajs-body .ajs-content, .alertify.ajs-maximized .ajs-body .ajs-content { position: absolute; top: 50px; right: 24px; bottom: 50px; left: 24px; overflow: auto; } .alertify.ajs-resizable .ajs-footer, .alertify.ajs-maximized .ajs-footer { position: absolute; left: 0; right: 0; bottom: 0; margin: 0; } .alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog { min-width: 548px; } .alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle { display: block; } .alertify.ajs-movable:not(.ajs-maximized) .ajs-header { cursor: move; } .alertify.ajs-modeless .ajs-dimmer, .alertify.ajs-modeless .ajs-reset { display: none; } .alertify.ajs-modeless .ajs-modal { overflow: visible; max-width: none; max-height: 0; } .alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin { display: inline-block; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC); } .alertify.ajs-modeless.ajs-unpinned .ajs-modal { position: absolute; } .alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=); } .alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body { max-height: 500px; overflow: auto; } .alertify.ajs-basic .ajs-header { opacity: 0; } .alertify.ajs-basic .ajs-footer { visibility: hidden; } .alertify.ajs-frameless .ajs-header { position: absolute; top: 0; left: 0; right: 0; min-height: 60px; margin: 0; padding: 0; opacity: 0; z-index: 1; } .alertify.ajs-frameless .ajs-footer { display: none; } .alertify.ajs-frameless .ajs-body .ajs-content { position: absolute; top: 0; right: 0; bottom: 0; left: 0; } .alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog { padding-top: 0; } .alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands { margin-top: 0; } .ajs-no-overflow { overflow: hidden !important; outline: none; } .ajs-no-overflow.ajs-fixed { position: fixed; top: 0; right: 0; bottom: 0; left: 0; overflow-y: scroll!important; } .ajs-no-selection, .ajs-no-selection * { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } @media screen and (max-width: 568px) { .alertify .ajs-dialog { min-width: 150px; } .alertify:not(.ajs-maximized) .ajs-modal { padding: 0 5%; } .alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog { min-width: initial; min-width: auto /*IE fallback*/; } } @-moz-document url-prefix() { .alertify button:focus { outline: 1px dotted #3593D2; } } .alertify .ajs-dimmer, .alertify .ajs-modal { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); -webkit-transition-property: opacity, visibility; transition-property: opacity, visibility; -webkit-transition-timing-function: linear; transition-timing-function: linear; -webkit-transition-duration: 250ms; transition-duration: 250ms; } .alertify.ajs-hidden .ajs-dimmer, .alertify.ajs-hidden .ajs-modal { visibility: hidden; opacity: 0; } .alertify.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-duration: 500ms; animation-duration: 500ms; } .alertify.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-duration: 250ms; animation-duration: 250ms; } .alertify .ajs-dialog.ajs-shake { -webkit-animation-name: ajs-shake; animation-name: ajs-shake; -webkit-animation-duration: .1s; animation-duration: .1s; -webkit-animation-fill-mode: both; animation-fill-mode: both; } @-webkit-keyframes ajs-shake { 0%, 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } 10%, 30%, 50%, 70%, 90% { -webkit-transform: translate3d(-10px, 0, 0); transform: translate3d(-10px, 0, 0); } 20%, 40%, 60%, 80% { -webkit-transform: translate3d(10px, 0, 0); transform: translate3d(10px, 0, 0); } } @keyframes ajs-shake { 0%, 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } 10%, 30%, 50%, 70%, 90% { -webkit-transform: translate3d(-10px, 0, 0); transform: translate3d(-10px, 0, 0); } 20%, 40%, 60%, 80% { -webkit-transform: translate3d(10px, 0, 0); transform: translate3d(10px, 0, 0); } } .alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-name: ajs-slideIn; animation-name: ajs-slideIn; -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); } .alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-name: ajs-slideOut; animation-name: ajs-slideOut; -webkit-animation-timing-function: cubic-bezier(0.6, -0.28, 0.735, 0.045); animation-timing-function: cubic-bezier(0.6, -0.28, 0.735, 0.045); } .alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-name: ajs-zoomIn; animation-name: ajs-zoomIn; } .alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-name: ajs-zoomOut; animation-name: ajs-zoomOut; } .alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-name: ajs-fadeIn; animation-name: ajs-fadeIn; } .alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-name: ajs-fadeOut; animation-name: ajs-fadeOut; } .alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-name: ajs-pulseIn; animation-name: ajs-pulseIn; } .alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-name: ajs-pulseOut; animation-name: ajs-pulseOut; } .alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-name: ajs-flipInX; animation-name: ajs-flipInX; } .alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-name: ajs-flipOutX; animation-name: ajs-flipOutX; } .alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-name: ajs-flipInY; animation-name: ajs-flipInY; } .alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-name: ajs-flipOutY; animation-name: ajs-flipOutY; } @-webkit-keyframes ajs-pulseIn { 0%, 20%, 40%, 60%, 80%, 100% { -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); } 0% { opacity: 0; -webkit-transform: scale3d(0.3, 0.3, 0.3); transform: scale3d(0.3, 0.3, 0.3); } 20% { -webkit-transform: scale3d(1.1, 1.1, 1.1); transform: scale3d(1.1, 1.1, 1.1); } 40% { -webkit-transform: scale3d(0.9, 0.9, 0.9); transform: scale3d(0.9, 0.9, 0.9); } 60% { opacity: 1; -webkit-transform: scale3d(1.03, 1.03, 1.03); transform: scale3d(1.03, 1.03, 1.03); } 80% { -webkit-transform: scale3d(0.97, 0.97, 0.97); transform: scale3d(0.97, 0.97, 0.97); } 100% { opacity: 1; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } } @keyframes ajs-pulseIn { 0%, 20%, 40%, 60%, 80%, 100% { -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); } 0% { opacity: 0; -webkit-transform: scale3d(0.3, 0.3, 0.3); transform: scale3d(0.3, 0.3, 0.3); } 20% { -webkit-transform: scale3d(1.1, 1.1, 1.1); transform: scale3d(1.1, 1.1, 1.1); } 40% { -webkit-transform: scale3d(0.9, 0.9, 0.9); transform: scale3d(0.9, 0.9, 0.9); } 60% { opacity: 1; -webkit-transform: scale3d(1.03, 1.03, 1.03); transform: scale3d(1.03, 1.03, 1.03); } 80% { -webkit-transform: scale3d(0.97, 0.97, 0.97); transform: scale3d(0.97, 0.97, 0.97); } 100% { opacity: 1; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } } @-webkit-keyframes ajs-pulseOut { 20% { -webkit-transform: scale3d(0.9, 0.9, 0.9); transform: scale3d(0.9, 0.9, 0.9); } 50%, 55% { opacity: 1; -webkit-transform: scale3d(1.1, 1.1, 1.1); transform: scale3d(1.1, 1.1, 1.1); } 100% { opacity: 0; -webkit-transform: scale3d(0.3, 0.3, 0.3); transform: scale3d(0.3, 0.3, 0.3); } } @keyframes ajs-pulseOut { 20% { -webkit-transform: scale3d(0.9, 0.9, 0.9); transform: scale3d(0.9, 0.9, 0.9); } 50%, 55% { opacity: 1; -webkit-transform: scale3d(1.1, 1.1, 1.1); transform: scale3d(1.1, 1.1, 1.1); } 100% { opacity: 0; -webkit-transform: scale3d(0.3, 0.3, 0.3); transform: scale3d(0.3, 0.3, 0.3); } } @-webkit-keyframes ajs-zoomIn { 0% { opacity: 0; -webkit-transform: scale3d(0.25, 0.25, 0.25); transform: scale3d(0.25, 0.25, 0.25); } 100% { opacity: 1; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } } @keyframes ajs-zoomIn { 0% { opacity: 0; -webkit-transform: scale3d(0.25, 0.25, 0.25); transform: scale3d(0.25, 0.25, 0.25); } 100% { opacity: 1; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } } @-webkit-keyframes ajs-zoomOut { 0% { opacity: 1; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } 100% { opacity: 0; -webkit-transform: scale3d(0.25, 0.25, 0.25); transform: scale3d(0.25, 0.25, 0.25); } } @keyframes ajs-zoomOut { 0% { opacity: 1; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } 100% { opacity: 0; -webkit-transform: scale3d(0.25, 0.25, 0.25); transform: scale3d(0.25, 0.25, 0.25); } } @-webkit-keyframes ajs-fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes ajs-fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } @-webkit-keyframes ajs-fadeOut { 0% { opacity: 1; } 100% { opacity: 0; } } @keyframes ajs-fadeOut { 0% { opacity: 1; } 100% { opacity: 0; } } @-webkit-keyframes ajs-flipInX { 0% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); transform: perspective(400px) rotate3d(1, 0, 0, 90deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); transform: perspective(400px) rotate3d(1, 0, 0, -20deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); transform: perspective(400px) rotate3d(1, 0, 0, 10deg); opacity: 1; } 80% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); transform: perspective(400px) rotate3d(1, 0, 0, -5deg); } 100% { -webkit-transform: perspective(400px); transform: perspective(400px); } } @keyframes ajs-flipInX { 0% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); transform: perspective(400px) rotate3d(1, 0, 0, 90deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); transform: perspective(400px) rotate3d(1, 0, 0, -20deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); transform: perspective(400px) rotate3d(1, 0, 0, 10deg); opacity: 1; } 80% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); transform: perspective(400px) rotate3d(1, 0, 0, -5deg); } 100% { -webkit-transform: perspective(400px); transform: perspective(400px); } } @-webkit-keyframes ajs-flipOutX { 0% { -webkit-transform: perspective(400px); transform: perspective(400px); } 30% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); transform: perspective(400px) rotate3d(1, 0, 0, -20deg); opacity: 1; } 100% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); transform: perspective(400px) rotate3d(1, 0, 0, 90deg); opacity: 0; } } @keyframes ajs-flipOutX { 0% { -webkit-transform: perspective(400px); transform: perspective(400px); } 30% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); transform: perspective(400px) rotate3d(1, 0, 0, -20deg); opacity: 1; } 100% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); transform: perspective(400px) rotate3d(1, 0, 0, 90deg); opacity: 0; } } @-webkit-keyframes ajs-flipInY { 0% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); transform: perspective(400px) rotate3d(0, 1, 0, 90deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); transform: perspective(400px) rotate3d(0, 1, 0, -20deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); transform: perspective(400px) rotate3d(0, 1, 0, 10deg); opacity: 1; } 80% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); transform: perspective(400px) rotate3d(0, 1, 0, -5deg); } 100% { -webkit-transform: perspective(400px); transform: perspective(400px); } } @keyframes ajs-flipInY { 0% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); transform: perspective(400px) rotate3d(0, 1, 0, 90deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); transform: perspective(400px) rotate3d(0, 1, 0, -20deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); transform: perspective(400px) rotate3d(0, 1, 0, 10deg); opacity: 1; } 80% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); transform: perspective(400px) rotate3d(0, 1, 0, -5deg); } 100% { -webkit-transform: perspective(400px); transform: perspective(400px); } } @-webkit-keyframes ajs-flipOutY { 0% { -webkit-transform: perspective(400px); transform: perspective(400px); } 30% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); transform: perspective(400px) rotate3d(0, 1, 0, -15deg); opacity: 1; } 100% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); transform: perspective(400px) rotate3d(0, 1, 0, 90deg); opacity: 0; } } @keyframes ajs-flipOutY { 0% { -webkit-transform: perspective(400px); transform: perspective(400px); } 30% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); transform: perspective(400px) rotate3d(0, 1, 0, -15deg); opacity: 1; } 100% { -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); transform: perspective(400px) rotate3d(0, 1, 0, 90deg); opacity: 0; } } @-webkit-keyframes ajs-slideIn { 0% { margin-top: -100%; } 100% { margin-top: 5%; } } @keyframes ajs-slideIn { 0% { margin-top: -100%; } 100% { margin-top: 5%; } } @-webkit-keyframes ajs-slideOut { 0% { margin-top: 5%; } 100% { margin-top: -100%; } } @keyframes ajs-slideOut { 0% { margin-top: 5%; } 100% { margin-top: -100%; } } .alertify-notifier { position: fixed; width: 0; overflow: visible; z-index: 1982; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } .alertify-notifier .ajs-message { position: relative; width: 260px; max-height: 0; padding: 0; opacity: 0; margin: 0; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); -webkit-transition-duration: 250ms; transition-duration: 250ms; -webkit-transition-timing-function: linear; transition-timing-function: linear; } .alertify-notifier .ajs-message.ajs-visible { -webkit-transition-duration: 500ms; transition-duration: 500ms; -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); opacity: 1; max-height: 100%; padding: 15px; margin-top: 10px; } .alertify-notifier .ajs-message.ajs-success { background: rgba(91, 189, 114, 0.95); } .alertify-notifier .ajs-message.ajs-error { background: rgba(217, 92, 92, 0.95); } .alertify-notifier .ajs-message.ajs-warning { background: rgba(252, 248, 215, 0.95); } .alertify-notifier .ajs-message .ajs-close { position: absolute; top: 0; right: 0; width: 16px; height: 16px; cursor: pointer; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAFBJREFUGBl1j0EKADEIA+ve/P9f9bh1hEihNBfjVCO1v7RKVqJK4h8gM5cAPR42AkQEpSXPwMTyoi13n5N9YqJehm3Fnr7nL1D0ZEbD5OubGyC7a9gx+9eNAAAAAElFTkSuQmCC); background-repeat: no-repeat; background-position: center center; background-color: rgba(0, 0, 0, 0.5); border-top-right-radius: 2px; } .alertify-notifier.ajs-top { top: 10px; } .alertify-notifier.ajs-bottom { bottom: 10px; } .alertify-notifier.ajs-right { right: 10px; } .alertify-notifier.ajs-right .ajs-message { right: -320px; } .alertify-notifier.ajs-right .ajs-message.ajs-visible { right: 290px; } .alertify-notifier.ajs-left { left: 10px; } .alertify-notifier.ajs-left .ajs-message { left: -300px; } .alertify-notifier.ajs-left .ajs-message.ajs-visible { left: 0; } .alertify-notifier.ajs-center { left: 50%; } .alertify-notifier.ajs-center .ajs-message { -webkit-transform: translateX(-50%); transform: translateX(-50%); } .alertify-notifier.ajs-center .ajs-message.ajs-visible { left: 50%; -webkit-transition-timing-function: cubic-bezier(0.57, 0.43, 0.1, 0.65); transition-timing-function: cubic-bezier(0.57, 0.43, 0.1, 0.65); } .alertify-notifier.ajs-center.ajs-top .ajs-message { top: -300px; } .alertify-notifier.ajs-center.ajs-top .ajs-message.ajs-visible { top: 0; } .alertify-notifier.ajs-center.ajs-bottom .ajs-message { bottom: -300px; } .alertify-notifier.ajs-center.ajs-bottom .ajs-message.ajs-visible { bottom: 0; } PKL\5cc3youtube-embed-plus/styles/alertify/alertify.rtl.cssnu[/** * alertifyjs 1.11.0 http://alertifyjs.com * AlertifyJS is a javascript framework for developing pretty browser dialogs and notifications. * Copyright 2017 Mohammad Younes (http://alertifyjs.com) * Licensed under GPL 3 */ .alertify .ajs-dimmer { position: fixed; z-index: 1981; top: 0; left: 0; bottom: 0; right: 0; padding: 0; margin: 0; background-color: #252525; opacity: .5; } .alertify .ajs-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; padding: 0; overflow-y: auto; z-index: 1981; } .alertify .ajs-dialog { position: relative; margin: 5% auto; min-height: 110px; max-width: 500px; padding: 24px 24px 0 24px; outline: 0; background-color: #fff; } .alertify .ajs-dialog.ajs-capture:before { content: ''; position: absolute; top: 0; left: 0; bottom: 0; right: 0; display: block; z-index: 1; } .alertify .ajs-reset { position: absolute !important; display: inline !important; width: 0 !important; height: 0 !important; opacity: 0 !important; } .alertify .ajs-commands { position: absolute; left: 4px; margin: -14px 0 0 24px; z-index: 2; } .alertify .ajs-commands button { display: none; width: 10px; height: 10px; margin-right: 10px; padding: 10px; border: 0; background-color: transparent; background-repeat: no-repeat; background-position: center; cursor: pointer; } .alertify .ajs-commands button.ajs-close { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC); } .alertify .ajs-commands button.ajs-maximize { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC); } .alertify .ajs-header { margin: -24px; margin-bottom: 0; padding: 16px 24px; background-color: #fff; } .alertify .ajs-body { min-height: 56px; } .alertify .ajs-body .ajs-content { padding: 16px 16px 16px 24px; } .alertify .ajs-footer { padding: 4px; margin-right: -24px; margin-left: -24px; min-height: 43px; background-color: #fff; } .alertify .ajs-footer .ajs-buttons.ajs-primary { text-align: left; } .alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button { margin: 4px; } .alertify .ajs-footer .ajs-buttons.ajs-auxiliary { float: right; clear: none; text-align: right; } .alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button { margin: 4px; } .alertify .ajs-footer .ajs-buttons .ajs-button { min-width: 88px; min-height: 35px; } .alertify .ajs-handle { position: absolute; display: none; width: 10px; height: 10px; left: 0; bottom: 0; z-index: 1; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==); -webkit-transform: scaleX(-1); transform: scaleX(-1); cursor: sw-resize; } .alertify.ajs-no-overflow .ajs-body .ajs-content { overflow: hidden !important; } .alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content { right: 0; left: 0; padding: 0; } .alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body { margin-right: -24px; margin-left: -24px; } .alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content { padding: 0; } .alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content { right: 0; left: 0; } .alertify.ajs-maximizable .ajs-commands button.ajs-maximize, .alertify.ajs-maximizable .ajs-commands button.ajs-restore { display: inline-block; } .alertify.ajs-closable .ajs-commands button.ajs-close { display: inline-block; } .alertify.ajs-maximized .ajs-dialog { width: 100% !important; height: 100% !important; max-width: none !important; margin: 0 auto !important; top: 0 !important; right: 0 !important; } .alertify.ajs-maximized.ajs-modeless .ajs-modal { position: fixed !important; min-height: 100% !important; max-height: none !important; margin: 0 !important; } .alertify.ajs-maximized .ajs-commands button.ajs-maximize { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=); } .alertify.ajs-resizable .ajs-dialog, .alertify.ajs-maximized .ajs-dialog { padding: 0; } .alertify.ajs-resizable .ajs-commands, .alertify.ajs-maximized .ajs-commands { margin: 14px 0 0 24px; } .alertify.ajs-resizable .ajs-header, .alertify.ajs-maximized .ajs-header { position: absolute; top: 0; right: 0; left: 0; margin: 0; padding: 16px 24px; } .alertify.ajs-resizable .ajs-body, .alertify.ajs-maximized .ajs-body { min-height: 224px; display: inline-block; } .alertify.ajs-resizable .ajs-body .ajs-content, .alertify.ajs-maximized .ajs-body .ajs-content { position: absolute; top: 50px; left: 24px; bottom: 50px; right: 24px; overflow: auto; } .alertify.ajs-resizable .ajs-footer, .alertify.ajs-maximized .ajs-footer { position: absolute; right: 0; left: 0; bottom: 0; margin: 0; } .alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog { min-width: 548px; } .alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle { display: block; } .alertify.ajs-movable:not(.ajs-maximized) .ajs-header { cursor: move; } .alertify.ajs-modeless .ajs-dimmer, .alertify.ajs-modeless .ajs-reset { display: none; } .alertify.ajs-modeless .ajs-modal { overflow: visible; max-width: none; max-height: 0; } .alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin { display: inline-block; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC); } .alertify.ajs-modeless.ajs-unpinned .ajs-modal { position: absolute; } .alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=); } .alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body { max-height: 500px; overflow: auto; } .alertify.ajs-basic .ajs-header { opacity: 0; } .alertify.ajs-basic .ajs-footer { visibility: hidden; } .alertify.ajs-frameless .ajs-header { position: absolute; top: 0; right: 0; left: 0; min-height: 60px; margin: 0; padding: 0; opacity: 0; z-index: 1; } .alertify.ajs-frameless .ajs-footer { display: none; } .alertify.ajs-frameless .ajs-body .ajs-content { position: absolute; top: 0; left: 0; bottom: 0; right: 0; } .alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog { padding-top: 0; } .alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands { margin-top: 0; } .ajs-no-overflow { overflow: hidden !important; outline: none; } .ajs-no-overflow.ajs-fixed { position: fixed; top: 0; left: 0; bottom: 0; right: 0; overflow-y: scroll!important; } .ajs-no-selection, .ajs-no-selection * { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } @media screen and (max-width: 568px) { .alertify .ajs-dialog { min-width: 150px; } .alertify:not(.ajs-maximized) .ajs-modal { padding: 0 5%; } .alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog { min-width: initial; min-width: auto /*IE fallback*/; } } @-moz-document url-prefix() { .alertify button:focus { outline: 1px dotted #3593D2; } } .alertify .ajs-dimmer, .alertify .ajs-modal { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); -webkit-transition-property: opacity, visibility; transition-property: opacity, visibility; -webkit-transition-timing-function: linear; transition-timing-function: linear; -webkit-transition-duration: 250ms; transition-duration: 250ms; } .alertify.ajs-hidden .ajs-dimmer, .alertify.ajs-hidden .ajs-modal { visibility: hidden; opacity: 0; } .alertify.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-duration: 500ms; animation-duration: 500ms; } .alertify.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-duration: 250ms; animation-duration: 250ms; } .alertify .ajs-dialog.ajs-shake { -webkit-animation-name: ajs-shake; animation-name: ajs-shake; -webkit-animation-duration: .1s; animation-duration: .1s; -webkit-animation-fill-mode: both; animation-fill-mode: both; } @-webkit-keyframes ajs-shake { 0%, 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } 10%, 30%, 50%, 70%, 90% { -webkit-transform: translate3d(10px, 0, 0); transform: translate3d(10px, 0, 0); } 20%, 40%, 60%, 80% { -webkit-transform: translate3d(-10px, 0, 0); transform: translate3d(-10px, 0, 0); } } @keyframes ajs-shake { 0%, 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } 10%, 30%, 50%, 70%, 90% { -webkit-transform: translate3d(10px, 0, 0); transform: translate3d(10px, 0, 0); } 20%, 40%, 60%, 80% { -webkit-transform: translate3d(-10px, 0, 0); transform: translate3d(-10px, 0, 0); } } .alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-name: ajs-slideIn; animation-name: ajs-slideIn; -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); } .alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-name: ajs-slideOut; animation-name: ajs-slideOut; -webkit-animation-timing-function: cubic-bezier(0.6, -0.28, 0.735, 0.045); animation-timing-function: cubic-bezier(0.6, -0.28, 0.735, 0.045); } .alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-name: ajs-zoomIn; animation-name: ajs-zoomIn; } .alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-name: ajs-zoomOut; animation-name: ajs-zoomOut; } .alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-name: ajs-fadeIn; animation-name: ajs-fadeIn; } .alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-name: ajs-fadeOut; animation-name: ajs-fadeOut; } .alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-name: ajs-pulseIn; animation-name: ajs-pulseIn; } .alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-name: ajs-pulseOut; animation-name: ajs-pulseOut; } .alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-name: ajs-flipInX; animation-name: ajs-flipInX; } .alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-name: ajs-flipOutX; animation-name: ajs-flipOutX; } .alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog { -webkit-animation-name: ajs-flipInY; animation-name: ajs-flipInY; } .alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog { -webkit-animation-name: ajs-flipOutY; animation-name: ajs-flipOutY; } @-webkit-keyframes ajs-pulseIn { 0%, 20%, 40%, 60%, 80%, 100% { -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); } 0% { opacity: 0; -webkit-transform: scale3d(0.3, 0.3, 0.3); transform: scale3d(0.3, 0.3, 0.3); } 20% { -webkit-transform: scale3d(1.1, 1.1, 1.1); transform: scale3d(1.1, 1.1, 1.1); } 40% { -webkit-transform: scale3d(0.9, 0.9, 0.9); transform: scale3d(0.9, 0.9, 0.9); } 60% { opacity: 1; -webkit-transform: scale3d(1.03, 1.03, 1.03); transform: scale3d(1.03, 1.03, 1.03); } 80% { -webkit-transform: scale3d(0.97, 0.97, 0.97); transform: scale3d(0.97, 0.97, 0.97); } 100% { opacity: 1; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } } @keyframes ajs-pulseIn { 0%, 20%, 40%, 60%, 80%, 100% { -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); } 0% { opacity: 0; -webkit-transform: scale3d(0.3, 0.3, 0.3); transform: scale3d(0.3, 0.3, 0.3); } 20% { -webkit-transform: scale3d(1.1, 1.1, 1.1); transform: scale3d(1.1, 1.1, 1.1); } 40% { -webkit-transform: scale3d(0.9, 0.9, 0.9); transform: scale3d(0.9, 0.9, 0.9); } 60% { opacity: 1; -webkit-transform: scale3d(1.03, 1.03, 1.03); transform: scale3d(1.03, 1.03, 1.03); } 80% { -webkit-transform: scale3d(0.97, 0.97, 0.97); transform: scale3d(0.97, 0.97, 0.97); } 100% { opacity: 1; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } } @-webkit-keyframes ajs-pulseOut { 20% { -webkit-transform: scale3d(0.9, 0.9, 0.9); transform: scale3d(0.9, 0.9, 0.9); } 50%, 55% { opacity: 1; -webkit-transform: scale3d(1.1, 1.1, 1.1); transform: scale3d(1.1, 1.1, 1.1); } 100% { opacity: 0; -webkit-transform: scale3d(0.3, 0.3, 0.3); transform: scale3d(0.3, 0.3, 0.3); } } @keyframes ajs-pulseOut { 20% { -webkit-transform: scale3d(0.9, 0.9, 0.9); transform: scale3d(0.9, 0.9, 0.9); } 50%, 55% { opacity: 1; -webkit-transform: scale3d(1.1, 1.1, 1.1); transform: scale3d(1.1, 1.1, 1.1); } 100% { opacity: 0; -webkit-transform: scale3d(0.3, 0.3, 0.3); transform: scale3d(0.3, 0.3, 0.3); } } @-webkit-keyframes ajs-zoomIn { 0% { opacity: 0; -webkit-transform: scale3d(0.25, 0.25, 0.25); transform: scale3d(0.25, 0.25, 0.25); } 100% { opacity: 1; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } } @keyframes ajs-zoomIn { 0% { opacity: 0; -webkit-transform: scale3d(0.25, 0.25, 0.25); transform: scale3d(0.25, 0.25, 0.25); } 100% { opacity: 1; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } } @-webkit-keyframes ajs-zoomOut { 0% { opacity: 1; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } 100% { opacity: 0; -webkit-transform: scale3d(0.25, 0.25, 0.25); transform: scale3d(0.25, 0.25, 0.25); } } @keyframes ajs-zoomOut { 0% { opacity: 1; -webkit-transform: scale3d(1, 1, 1); transform: scale3d(1, 1, 1); } 100% { opacity: 0; -webkit-transform: scale3d(0.25, 0.25, 0.25); transform: scale3d(0.25, 0.25, 0.25); } } @-webkit-keyframes ajs-fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes ajs-fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } @-webkit-keyframes ajs-fadeOut { 0% { opacity: 1; } 100% { opacity: 0; } } @keyframes ajs-fadeOut { 0% { opacity: 1; } 100% { opacity: 0; } } @-webkit-keyframes ajs-flipInX { 0% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); transform: perspective(400px) rotate3d(1, 0, 0, -90deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 20deg); transform: perspective(400px) rotate3d(1, 0, 0, 20deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -10deg); transform: perspective(400px) rotate3d(1, 0, 0, -10deg); opacity: 1; } 80% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 5deg); transform: perspective(400px) rotate3d(1, 0, 0, 5deg); } 100% { -webkit-transform: perspective(400px); transform: perspective(400px); } } @keyframes ajs-flipInX { 0% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); transform: perspective(400px) rotate3d(1, 0, 0, -90deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 20deg); transform: perspective(400px) rotate3d(1, 0, 0, 20deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -10deg); transform: perspective(400px) rotate3d(1, 0, 0, -10deg); opacity: 1; } 80% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 5deg); transform: perspective(400px) rotate3d(1, 0, 0, 5deg); } 100% { -webkit-transform: perspective(400px); transform: perspective(400px); } } @-webkit-keyframes ajs-flipOutX { 0% { -webkit-transform: perspective(400px); transform: perspective(400px); } 30% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 20deg); transform: perspective(400px) rotate3d(1, 0, 0, 20deg); opacity: 1; } 100% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); transform: perspective(400px) rotate3d(1, 0, 0, -90deg); opacity: 0; } } @keyframes ajs-flipOutX { 0% { -webkit-transform: perspective(400px); transform: perspective(400px); } 30% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 20deg); transform: perspective(400px) rotate3d(1, 0, 0, 20deg); opacity: 1; } 100% { -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -90deg); transform: perspective(400px) rotate3d(1, 0, 0, -90deg); opacity: 0; } } @-webkit-keyframes ajs-flipInY { 0% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, -90deg); transform: perspective(400px) rotate3d(0, -1, 0, -90deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, 20deg); transform: perspective(400px) rotate3d(0, -1, 0, 20deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, -10deg); transform: perspective(400px) rotate3d(0, -1, 0, -10deg); opacity: 1; } 80% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, 5deg); transform: perspective(400px) rotate3d(0, -1, 0, 5deg); } 100% { -webkit-transform: perspective(400px); transform: perspective(400px); } } @keyframes ajs-flipInY { 0% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, -90deg); transform: perspective(400px) rotate3d(0, -1, 0, -90deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; opacity: 0; } 40% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, 20deg); transform: perspective(400px) rotate3d(0, -1, 0, 20deg); -webkit-transition-timing-function: ease-in; transition-timing-function: ease-in; } 60% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, -10deg); transform: perspective(400px) rotate3d(0, -1, 0, -10deg); opacity: 1; } 80% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, 5deg); transform: perspective(400px) rotate3d(0, -1, 0, 5deg); } 100% { -webkit-transform: perspective(400px); transform: perspective(400px); } } @-webkit-keyframes ajs-flipOutY { 0% { -webkit-transform: perspective(400px); transform: perspective(400px); } 30% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, 15deg); transform: perspective(400px) rotate3d(0, -1, 0, 15deg); opacity: 1; } 100% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, -90deg); transform: perspective(400px) rotate3d(0, -1, 0, -90deg); opacity: 0; } } @keyframes ajs-flipOutY { 0% { -webkit-transform: perspective(400px); transform: perspective(400px); } 30% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, 15deg); transform: perspective(400px) rotate3d(0, -1, 0, 15deg); opacity: 1; } 100% { -webkit-transform: perspective(400px) rotate3d(0, -1, 0, -90deg); transform: perspective(400px) rotate3d(0, -1, 0, -90deg); opacity: 0; } } @-webkit-keyframes ajs-slideIn { 0% { margin-top: -100%; } 100% { margin-top: 5%; } } @keyframes ajs-slideIn { 0% { margin-top: -100%; } 100% { margin-top: 5%; } } @-webkit-keyframes ajs-slideOut { 0% { margin-top: 5%; } 100% { margin-top: -100%; } } @keyframes ajs-slideOut { 0% { margin-top: 5%; } 100% { margin-top: -100%; } } .alertify-notifier { position: fixed; width: 0; overflow: visible; z-index: 1982; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } .alertify-notifier .ajs-message { position: relative; width: 260px; max-height: 0; padding: 0; opacity: 0; margin: 0; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); -webkit-transition-duration: 250ms; transition-duration: 250ms; -webkit-transition-timing-function: linear; transition-timing-function: linear; } .alertify-notifier .ajs-message.ajs-visible { -webkit-transition-duration: 500ms; transition-duration: 500ms; -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275); opacity: 1; max-height: 100%; padding: 15px; margin-top: 10px; } .alertify-notifier .ajs-message.ajs-success { background: rgba(91, 189, 114, 0.95); } .alertify-notifier .ajs-message.ajs-error { background: rgba(217, 92, 92, 0.95); } .alertify-notifier .ajs-message.ajs-warning { background: rgba(252, 248, 215, 0.95); } .alertify-notifier .ajs-message .ajs-close { position: absolute; top: 0; left: 0; width: 16px; height: 16px; cursor: pointer; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAFBJREFUGBl1j0EKADEIA+ve/P9f9bh1hEihNBfjVCO1v7RKVqJK4h8gM5cAPR42AkQEpSXPwMTyoi13n5N9YqJehm3Fnr7nL1D0ZEbD5OubGyC7a9gx+9eNAAAAAElFTkSuQmCC); background-repeat: no-repeat; background-position: center center; background-color: rgba(0, 0, 0, 0.5); border-top-left-radius: 2px; } .alertify-notifier.ajs-top { top: 10px; } .alertify-notifier.ajs-bottom { bottom: 10px; } .alertify-notifier.ajs-right { left: 10px; } .alertify-notifier.ajs-right .ajs-message { left: -320px; } .alertify-notifier.ajs-right .ajs-message.ajs-visible { left: 290px; } .alertify-notifier.ajs-left { right: 10px; } .alertify-notifier.ajs-left .ajs-message { right: -300px; } .alertify-notifier.ajs-left .ajs-message.ajs-visible { right: 0; } .alertify-notifier.ajs-center { right: 50%; } .alertify-notifier.ajs-center .ajs-message { -webkit-transform: translateX(50%); transform: translateX(50%); } .alertify-notifier.ajs-center .ajs-message.ajs-visible { right: 50%; -webkit-transition-timing-function: cubic-bezier(0.57, 0.43, 0.1, 0.65); transition-timing-function: cubic-bezier(0.57, 0.43, 0.1, 0.65); } .alertify-notifier.ajs-center.ajs-top .ajs-message { top: -300px; } .alertify-notifier.ajs-center.ajs-top .ajs-message.ajs-visible { top: 0; } .alertify-notifier.ajs-center.ajs-bottom .ajs-message { bottom: -300px; } .alertify-notifier.ajs-center.ajs-bottom .ajs-message.ajs-visible { bottom: 0; } PKL\í0youtube-embed-plus/styles/ytprefs-onboarding.cssnu[/*https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/ */ #wphead {display:none;} #wpbody{margin-left: 0px;} #adminmenuback {display: none;} #adminmenu, adminmenuwrap {display: none;} #wpcontent, .auto-fold #wpcontent {margin-left: 0px;} #wpadminbar {display:none;} html.wp-toolbar {padding: 0px;} #footer, #wpfooter, .auto-fold #wpfooter {display: none;} #screen-meta-links {display: none;} #wpfooter {clear: both} .clearboth {clear: both;} .pad20 {padding: 20px;} .center {text-align: center;} .bold {font-weight: bold;} .orange{color:#f85d00; } .smallnote { font-size: small; font-style: italic; } .indent-option { margin-left: 25px; } .ui-widget, .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: inherit; } .ui-accordion .ui-accordion-header { margin-top: 15px; font-weight: bold; } .ui-accordion .ui-accordion-content.header-go-content { display: none !important; height: 0 !important; } .ui-widget-content a { color: #0073aa; } input.ui-widget[type=text] { margin: 0; padding: .4em 1em; width: 450px; } .txt-button-align input.ui-widget[type=text], .txt-button-align button { vertical-align: top; } #epyt_wiz_wrap .ui-button { font-weight: bold; } .ui-button .ui-icon { transform: scale(1.35,1.35); } .copycode { background-color: #eeeeff; border: 2px solid #c7d6e4; display: inline-block; font-size: .9em; overflow-x: hidden; vertical-align: middle; white-space: nowrap; width: 400px; padding-left: 15px; padding-right: 15px; } .pointer { cursor: pointer; } .relative { position: relative; } .epyt-fitvid { width: 100%; padding-top: 56.25%; position: relative; } .epyt-fitvid iframe { position: absolute; top: 0; left:0; right: 0; bottom: 0; width: 100%; height: 100%; } /* STEPS ************/ .wrap-ytprefs-onboarding h1 { line-height: 40px; } .wrap-ytprefs-onboarding h2 { line-height: 2em; } .wrap-ytprefs-onboarding .box-vi-not-interested { display: none; } .ytprefs-ob-step { position: absolute; visibility: hidden; opacity: 0; transition: opacity 300ms, visibility 300ms; width: 100%; height: 0; top: -200000px; } .ytprefs-ob-step.active-step { visibility: visible; opacity: 1; height: auto; top: 0; } .ytprefs-ob-title { font-size: 2em; line-height: 2em; text-align: center; } .ytprefs-ob-subtitle { font-size: 1.4em; line-height: 2em; } .ytprefs-ob-content { max-width: 800px; margin: 0 auto; } .ytprefs-ob-nav { text-align: center; margin-top: 20px; padding-top: 20px; border-top: 2px solid #dddddd; clear: both; margin-bottom: 50px; } .ytprefs-ob-nav .ytprefs-ob-nav-hide { display: none; } .ytprefs-ob-nav button.button-secondary, .ytprefs-ob-nav button.button-primary { display: inline-block; margin: 0 10px; } .ytprefs-ob-nav button.ytprefs-ob-nav-prev, .ytprefs-ob-nav button.ytprefs-ob-nav-close { margin-right: 25px; } .ytprefs-ob-step1 ul.ytprefs-ob-filter li { margin-bottom: 15px; } .ytprefs-ob-step1 .ytprefs-hover-icons { width: 160px; float: right; margin-left:30px; min-height: 200px; position: relative; } .ytprefs-ob-step1 .ytprefs-hover-icons img { position: absolute; top: 0; left: 0; opacity: 0; display: block; width: 100%; height: auto; transition: opacity 200ms; } .ytprefs-ob-step1 .ytprefs-hover-icons img.yob-icon-visible { opacity: 1; } .ytprefs-ob-step2 .ytprefs-ob-setting { display: none; margin: 10px 0 25px 0; } .ytprefs-ob-step2 .ytprefs-ob-setting.yob-single-visible, .ytprefs-ob-step2 .ytprefs-ob-setting.yob-gallery-visible, .ytprefs-ob-step2 .ytprefs-ob-setting.yob-standalone-visible, .ytprefs-ob-step2 .ytprefs-ob-setting.yob-privacy-visible, .ytprefs-ob-step2 .ytprefs-ob-setting.yob-live-visible { display: block; } .ytprefs-ob-step2 form #responsive ~ #boxresponsive_all, .ytprefs-ob-step2 form #facade_mode ~ .box_facade_mode { height: 0; visibility: none; opacity: 0; pointer-events: none; transition: opacity 300ms, visibility 300ms; } .ytprefs-ob-step2 form #responsive:checked ~ #boxresponsive_all, .ytprefs-ob-step2 form #facade_mode:checked ~ .box_facade_mode { height: auto; visibility: visible; opacity: 1; margin-top: 10px; pointer-events: all; } .ytindent { padding-left: 15px; border-left: 5px solid #e0e0e0; } .gdpr-options-left { width: 65%; float: left; } .gdpr-options-right { width: 33%; float: right; margin-top: 20px; } .gdpr-options-right .img-gdpr-message { width: 100%; height: auto; } iframe#gdpr_consent_message_ifr { min-height: 250px !important; } .ytprefs-ob-step4 .ytprefs-ob-content { max-width: 100%; } .ytprefs-ob-step4 h2 { /* max-width: 600px; text-align: center; margin: 0 auto;*/ } .wiztab-screenshots { float: right; max-width: 50%; height: auto; clear: right; margin-left: 30px; margin-bottom: 15px; display: block; border: 5px solid #dddddd; } .ytprefs-ob-success { color: #00a000; font-weight: bold; } .ytprefs-ob-success:after { content: url('../images/adstxt-valid.png'); } input.checkbox[disabled], input[type=radio][disabled] { border: 1px dashed #444444; } input[type="checkbox"] + label .check-note { display: none; } input[type="checkbox"]:checked + label .check-note { display: inline; } #not_live_on ~ #wp-not_live_content-wrap { opacity: .3; } #not_live_on:checked ~ #wp-not_live_content-wrap { opacity: 1; } PKL\_  +youtube-embed-plus/styles/ytvi-gdpr.min.cssnu[ #wp_insert_vi_consent_popup_overlay{position:fixed;left:0;right:0;top:0;bottom:0;background:rgba(0,0,0,0.5);z-index:10000}#wp_insert_vi_consent_popup_wrapper *{box-sizing:border-box}#wp_insert_vi_consent_popup_wrapper{max-width:480px;background:rgba(255,255,255,0.9);padding:20px 30px 20px 30px;position:fixed;right:0;bottom:0;color:#000;z-index:10001;-webkit-box-shadow:0 0 16px 1px rgba(0,0,0,0.75);-moz-box-shadow:0 0 16px 1px rgba(0,0,0,0.75);box-shadow:0 0 16px 1px rgba(0,0,0,0.75);border-top:1px solid rgba(0,0,0,0.2);border-left:1px solid rgba(0,0,0,0.2)}#wp_insert_vi_consent_popup_wrapper2{text-align:center;margin:0 auto}#wp_insert_vi_consent_popup_wrapper h1{line-height:42px;font-weight:400;font-family:sans-serif,Helvetica,Arial;font-size:36px;text-align:center;margin:0;padding:0;border:0;background:0;color:#000;display:none!important}#wp_insert_vi_consent_popup_wrapper p{font-size:14px;font-family:sans-serif,Helvetica,Arial;line-height:20px;margin:10px 0 30px;padding:0;border:0;background:0;color:#000;text-align:justify;font-weight:400}#wp_insert_vi_consent_popup_wrapper p a,#wp_insert_vi_consent_popup_wrapper p a:hover{font-size:14px;font-family:sans-serif,Helvetica,Arial;line-height:20px;margin:0;padding:0;border:0;background:0;color:#000;text-decoration:underline}#wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_actions_wrapper{text-align:center;margin:0}#wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_actions_wrapper #wp_insert_vi_consent_popup_disagree_btn,#wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_actions_wrapper #wp_insert_vi_consent_popup_disagree_btn:hover{cursor:pointer;color:#000;background:0;border:0;padding:10px 30px;text-align:center;font-weight:600;font-size:15px;font-family:sans-serif,Helvetica,Arial;margin:0}#wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_actions_wrapper #wp_insert_vi_consent_popup_agree_btn,#wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_actions_wrapper #wp_insert_vi_consent_popup_agree_btn:hover{cursor:pointer;color:#000;background:rgba(226,226,226,1);border:2px solid rgba(197,197,197,1);padding:10px 60px;text-align:center;font-weight:600;font-size:15px;font-family:sans-serif,Helvetica,Arial;border-radius:18px;margin:0}#wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_links_wrapper{text-align:center}#wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_links_wrapper a,#wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_links_wrapper a:hover{color:#000;background:0;border:0;padding:10px;text-align:center;font-weight:400;font-size:12px;font-family:sans-serif,Helvetica,Arial;margin:0;text-decoration:underline;line-height:24px}#wp_insert_vi_consent_popup_settings_button{font-size:13px;color:rgba(146,135,131,1);background:url(../images/privacy-eye.png) no-repeat left center;padding:0 0 0 32px;position:fixed;bottom:10px;right:10px;cursor:pointer;z-index:10002;font-family:sans-serif,Helvetica,Arial;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_message{margin-bottom:15px}#wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_message p{display:inline!important;text-align:center}PKL\.W/,/,,youtube-embed-plus/styles/ytvi-admin.min.cssnu[ body.admin_page_youtube-ep-wizard{background-color:#fff}.clearboth{clear:both}sup.orange{text-transform:lowercase;font-weight:bold;color:#f85d00}.align-middle{vertical-align:middle!important}.vi-registration-box{position:relative}.vi-cover-prompt{position:absolute;width:100%;height:100%;top:0;left:0;z-index:100;background-color:rgba(241,241,241,.88);text-align:center}.vi-cover-prompt::before{content:"";display:none;z-index:10000;position:absolute;width:100%;height:100%;margin:0;padding:0;-webkit-filter:url(#viblurfilter);-moz-filter:url(#viblurfilter);-o-filter:url(#viblurfilter);-ms-filter:url(#viblurfilter);filter:url(#viblurfilter)}.vi-cover-prompt-buttons button.button-primary,.vi-cover-prompt-buttons button.button-secondary{display:inline-block;margin:0 5px}.viblurfilter-svg{width:0;height:0;margin:0;padding:0;border:0}.vi-cover-prompt h1{text-align:center;margin-top:50px;text-shadow:0 0 14px #fff}.ytvi-wrap *{box-sizing:border-box}.ytvi-wrap .center{text-align:center}.ytvi-wrap input.regular-text{width:100%}.ytvi-step-1,.ytvi-step-2{text-align:left}.ytvi-step-1{width:auto;padding:0;max-width:870px;margin:0 auto}.ytvi-step-1 .button-primary{font-size:16px}.ytvi-step-1--form,.ytvi-login-success,.ytvi-step-2-loading,.ytvi-login-loading,.ytvi-login-complete{background:#fff;border:solid 1px #e5e5e5;padding:15px 0;width:100%;margin:30px auto}.ytvi-step-1--form .side-signup{width:49.5%;float:left;border-right:1px solid #ccc;padding:0 40px}.ytvi-step-1--form .side-login{width:49.5%;float:right;padding:0 40px 0 30px}.ytvi-step-1--form .side-login h2,.ytvi-step-1--form .side-signup h2{font-size:1.15em}.wrap .ytvi-step-1--form h2{margin:10px 0 15px 0;font-weight:normal}.ytvi-step-2-loading,.ytvi-step-2,.ytvi-login-loading,.ytvi-login-success{display:none}.ytvi-loading--message{text-align:center;font-size:16px}.ytvi-step-2 .ytvi-registration{max-width:870px;margin:0 auto}.ytvi-step-2 .ytvi-registration iframe{border-width:0;padding:0;margin:0 auto;width:100%;height:575px;display:block}.ytvi-step-2-msg{background-color:#d8ebf3;border:1px solid #d0d0d0;margin:0 26px;padding:10px}.ytvi-login-success,.ytvi-login-complete{max-width:100%;text-align:center;padding:25px 40px}.vi-adstxt-diff{text-align:left}.vi-adstxt-diff p{font-style:italic}.vi-adstxt-diff code,.adstxt-verify-message code,code.adstxt-block{white-space:pre;display:block;overflow:auto;margin:25px 0}section.pattern h2{background-color:rgba(255,255,255,0);transition:background-color 2s ease-out 0s}section.pattern h2.ytvi-hash-scroll{background-color:rgba(255,255,255,1);transition:background-color 0s}h3.sect{transition:background-color 2s ease-out 0s}h3.sect.ytvi-hash-scroll{background-color:rgba(255,255,255,1);transition:background-color 0s}.vi-forgot-pw{display:inline-block;float:right;padding-top:5px}.vi-contact-support{margin-top:30px;clear:left;padding-top:20px}.vi-logo-text{height:1.2em;width:auto;vertical-align:text-bottom}.vi-demo{max-width:1360px;margin:0 auto}p.vi-demo-lede,#ytform p.vi-demo-lede{font-size:17px;line-height:1.5}.wrap-vi-settings-pre p.vi-demo-lede{padding-top:.75em}.vi-demo-col-phone{float:right;width:330px;clear:right}.vi-demo-col-content{width:calc(100% - 340px)}.vi-demo-mobile{margin:0 auto;width:300px;background:transparent url(../images/vi-mobile-phone.png) no-repeat scroll;background-size:cover}.vi-demo-mobile-caption-list{position:relative;min-height:115px}.vi-demo-mobile-caption{font-style:italic;margin:0 10px;position:absolute;top:0;left:0;opacity:1;transition:ease-in-out opacity 3s}.vi-demo-mobile-ratio{position:relative;width:100%;height:0;padding-bottom:175.89%}.vi-demo-mobile-bg{position:absolute;top:0;left:0;width:100%;height:100%}.vi-demo-screen{position:absolute;top:5.5%;left:12%;width:76%;height:auto;z-index:1;opacity:1;transition:ease-in-out opacity 4s}.vi-demo-screen.demo-hide,.vi-demo-mobile-caption.demo-hide{opacity:0;transition:ease-in-out opacity 3s}.vi-demo-screen-2{z-index:2}p.vi-ad-source-row{text-align:center;margin-top:20px}.vi-ad-source-row img{vertical-align:middle;display:inline-block;margin-bottom:13px;padding:0 13px 0 13px;max-height:20px;height:auto;width:auto}.login-expire{background-color:#d8ebf3;border:1px solid #d0d0d0;padding:25px}.wrap-vi{max-width:1064px;margin-bottom:100px}.wrap-vi h1 .yt-admin-icon{width:16px;height:16px}.wrap-vi h1 a.button-primary,.wrap-vi h1 a.button-secondary,.wrap-ytprefs h2 a.button-primary,.wrap-ytprefs h2 a.button-secondary{float:right;margin-left:15px}.wrap-vi section{margin-left:20px;display:none;padding-top:15px}.wrap-vi th label{display:block}.wrap-vi th small{font-weight:normal;font-style:italic}.wrap-vi h2.nav-tab-wrapper{margin:22px 0 0 0}.wrap-vi section#jumphowitworks{display:block}.wrap-vi .no-js section{display:block}.wrap-vi h2{margin-bottom:30px;margin-left:0}.wrap-vi h3{font-size:1.2em;font-style:italic}.save-changes-follow{position:fixed;z-index:10000;bottom:0;right:0;background-color:#fff;padding:0 20px;border-top-left-radius:20px;border:2px solid #aaa;border-right-width:0;border-bottom-width:0;-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,0.75);-moz-box-shadow:0 0 10px 0 rgba(0,0,0,0.75);box-shadow:0 0 10px 0 rgba(0,0,0,0.75)}.button-primary{white-space:nowrap}p.submit{margin:0;padding:15px 0 10px 0}.wp-core-ui p.submit .button-primary{font-weight:bold;font-size:21px;height:50px;padding:0 20px 1px;background:#2ea2cc;background:-moz-linear-gradient(top,#2ea2cc 0,#007396 98%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#2ea2cc),color-stop(98%,#007396));background:-webkit-linear-gradient(top,#2ea2cc 0,#007396 98%);background:-o-linear-gradient(top,#2ea2cc 0,#007396 98%);background:-ms-linear-gradient(top,#2ea2cc 0,#007396 98%);background:linear-gradient(to bottom,#2ea2cc 0,#007396 98%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2ea2cc',endColorstr='#007396',GradientType=0)}p.submit em{display:inline-block;padding-left:20px;vertical-align:middle;width:240px;margin-top:-6px}.vi-red{color:#de1515}button.button-primary.ytvi-btn-toggle{float:right;position:relative}button.button-primary.ytvi-btn-inactive,button.button-primary.ytvi-btn-inactive:hover,.wp-core-ui button.button-primary.ytvi-btn-inactive[disabled],.wp-core-ui button.button-primary.ytvi-btn-inactive:disabled,a.button-primary.ytvi-btn-inactive,a.button-primary.ytvi-btn-inactive:hover{background:#e51f1f!important;border-color:#a22222!important;box-shadow:0 1px 0 #a22222!important;text-shadow:0 -1px 1px #a22222,1px 0 1px #a22222,0 1px 1px #a22222,-1px 0 1px #a22222!important;color:#fff!important}.wp-core-ui button.button-primary.ytvi-btn-inactive[disabled]:hover{background:rgba(229,31,31,.5)!important}button.button-primary.ytvi-btn-toggle .ytvi-notyet{display:none;position:absolute;background:white;width:540px;height:auto;top:25px;padding:15px 20px;border-radius:10px;box-shadow:5px 5px 10px 0 rgba(0,0,0,.2);right:0;text-align:left;color:#333!important;box-sizing:border-box;text-shadow:none!important;white-space:normal;border-top-right-radius:0;z-index:100}button.button-primary.ytvi-btn-toggle:hover .ytvi-notyet{display:block}.iab-cat-parent{margin-right:15px;display:inline-block}.iab-cat-child-box{display:inline-block}.iab-cat-child-box.hidden{opacity:.3}.iab-cat-child option.hidden{display:none}.wp-picker-container.wp-picker-active .wp-color-result-text{font-weight:bold}ul.list-ul{margin:15px 30px}ul.list-ul li{list-style-type:disc}.alertify .ajs-dialog{max-width:600px}.alertify .ajs-body .ajs-content{line-height:2em}.alertify .ajs-body .ajs-content code{white-space:pre;display:block;overflow:auto;line-height:1.4em;margin:1em auto}.ajs-button{cursor:pointer}.ss-vi-img{max-width:700px;height:auto}.ss-vi-wizbutton{max-width:100%;height:auto}.vi-how-works{margin-bottom:40px;position:relative;margin-left:10px}.vi-how-works::before{clear:both}.vi-how-works p{line-height:1}.vi-how-works img{width:50px;height:50px;float:left;margin-right:15px;transition:ease-in-out transform,opacity .1s;opacity:.5}.vi-how-works:hover img{transform:scale(1.1);opacity:1;transition:ease-in-out transform,opacity .2s}.vi-how-works h3{margin-bottom:0}.vi-how-works .vi-num{position:absolute;left:-20px;font-size:22px;font-weight:bold;color:#000;opacity:.2;font-style:italic;transition:ease-in-out transform,opacity .1s}.vi-how-works:hover .vi-num{transform:scale(1.1);opacity:1;transition:ease-in-out transform,opacity .2s}h2 .vi-num{font-style:italic;opacity:.5}.form-table.form-table--vi-appearance{width:100%}.form-table td{vertical-align:top}.vi-story-demo{width:65%;position:relative;margin:20px auto}.vi-story-demo--box{border:solid 1px #e3e3e3}.vi-story-demo--screen{width:100%;padding-top:57%;background-color:#888;position:relative}.vi-story-demo--screen span{color:#ccc;width:100%;text-align:center;font-size:20px;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-style:italic}.vi-story-demo--screen span small{background:#ddd;border-radius:5px;display:inline-block;padding:5px 10px;box-sizing:border-box;color:#333;max-width:90%}.vi-story-demo--info{padding:8px}.vi-story-demo--featured{height:20px;font-size:9px;text-align:right;margin-top:8px;text-transform:uppercase;line-height:20px;font-family:Verdana,sans-serif}.vi-story-demo--title{font-weight:bold;line-height:1.33}.vi-story-demo--featured span{opacity:.5}.vi-story-demo--box .vi-story-demo--featured img{width:20px;height:20px;vertical-align:middle;margin:-4px 0 0 5px}@media(min-width:768px){.form-table.form-table--vi-appearance{width:53%;float:left;clear:left}.vi-story-demo{float:right;width:44%;position:relative}}.nav-tab-valid,.nav-tab-valid:focus,.adstxt-verify-message-valid{color:#00a000;font-weight:bold}.adstxt-help{float:right;background-color:rgba(0,0,0,0.07);width:390px;margin:0 0 20px 10px;border-radius:20px;box-sizing:border-box;padding:20px 35px}.adstxt-help img{width:50px;height:auto;display:block;float:left}.nav-tab-valid:after{content:url('../images/adstxt-valid.png')}.nav-tab-invalid:after{content:url('../images/adstxt-warning.png')}.nav-tab-loading:after{content:url('../images/ajax-loader.gif')}.vi-report-error.hide,.vi-report.hide{display:none}.vi-report,.vi-report-error{text-align:center}.vi-total-earnings,.vi-total-earnings-error{float:left;width:25%;margin-top:60px;color:#1193aa}.vi-report-graph,.vi-report-graph-error{float:right;width:75%}.vi-report-canvas-box,.vi-report-canvas-box-error{height:300px;width:100%}.vi-total-earnings-num,.vi-total-earnings-num-error{margin-top:20px;font-weight:bold;font-size:3.7vw;line-height:3.7vw}.vi-total-earnings-num-error,.vi-report-canvas-box-error{color:#ccc;font-weight:normal;font-size:45px;line-height:45px}.vi-report-canvas-box-error{background-size:10% 10%;background-image:linear-gradient(to right,#ddd 1px,transparent 1px),linear-gradient(to bottom,#ddd 1px,transparent 1px)}@media(min-width:1280px){.vi-total-earnings-num,.vi-total-earnings-num-error{font-size:45px;line-height:45px}}.iab-cat-tags-display{margin-top:20px}.iab-cat-tags-display:empty:after{content:'None selected yet';font-style:italic}.iab-cat-tag-button{display:inline-block;background-color:#0073aa;color:#fff;padding:5px 10px;border-radius:30px;font-size:12px;margin:0 12px 12px 0;cursor:pointer}.ytvi-msg-congrats{display:none}PKL\u&Tkk,youtube-embed-plus/styles/ytprefs-wizard.cssnu[/*https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/ */ #wphead {display:none;} #wpbody{margin-left: 0px;} #adminmenuback {display: none;} #adminmenu, adminmenuwrap {display: none;} #wpcontent, .auto-fold #wpcontent {margin-left: 0px;} #wpadminbar {display:none;} html.wp-toolbar {padding: 0px;} #footer, #wpfooter, .auto-fold #wpfooter {display: none;} #screen-meta-links {display: none;} #wpfooter {clear: both} .clearboth {clear: both;} .pad20 {padding: 20px;} .center {text-align: center;} .bold {font-weight: bold;} .orange{color:#f85d00; } .smallnote { font-size: small; font-style: italic; } .ui-widget, .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: inherit; } .ui-widget .ui-widget li { font-size: 13px; } .ui-accordion .ui-accordion-header { margin-top: 15px; font-weight: bold; } .ui-accordion .ui-accordion-content.header-go-content { display: none !important; height: 0 !important; } .ui-widget-content a { color: #0073aa; } input.ui-widget[type=text] { margin: 0; padding: .4em 1em; width: 450px; line-height: 2; } .txt-button-align input.ui-widget[type=text], .txt-button-align button { vertical-align: top; } #epyt_wiz_wrap .ui-button { font-weight: bold; line-height: 2; } #epyt_wiz_wrap .ui-icon { display: inline-block; position: relative; left: auto; margin: 0; } .ui-button .ui-icon { transform: scale(1.35,1.35); display: inline-block; } .copycode { background-color: #eeeeff; border: 2px solid #c7d6e4; display: inline-block; font-size: .9em; overflow-x: hidden; vertical-align: middle; white-space: nowrap; width: 400px; padding-left: 15px; padding-right: 15px; } .pointer { cursor: pointer; } .relative { position: relative; } .epyt-search-results a.pointer.thumb.load-movie { float: left; width: 160px; height: 90px; background-position: center; background-size: cover; display: block; margin: 0 25px 10px 0; } .epyt-search-results .resultdiv { margin-bottom: 40px; } .epyt-search-results .resultinfo { text-align: left; } .epyt-search-results .resulttitle { font-weight: bold; } .epyt-search-results .moviecontainer { margin-bottom: 40px; margin-top: -30px; clear: both; } .epyt-search-results .closeme { right: 110px; top: -10px; position: absolute; font-weight: bold; font-size: 50px; cursor: pointer; } .epyt-search-results .resulttitle .ui-icon { transform: scale(1.35,1.35); } .epyt-pagination { clear: both; text-align: center; padding: 10px 8px 10px 8px; display: none; } .epyt-pagination > div, .epyt-pagenumbers > div { display: inline-block; padding: 0 2px 0 2px; vertical-align: middle; } .epyt-pagination .epyt-pagebutton { cursor: pointer; display: inline-block; padding: 0 10px 0 10px; } .epyt-pagebutton > div { display: inline; } .epyt-pagination .epyt-loader { display: none; } .epyt-gallery-list.epyt-loading .epyt-pagination .epyt-loader { display: inline-block; } .epyt-pagebutton.hide, .epyt-pagenumbers.hide { display: none !important; opacity: 0 !important; visibility: hidden !important; } .ui-tabs .ui-tabs-anchor { font-weight: bold; } .playlist-tabs { margin-bottom: 20px; } .icon-playlist { float: left; height: auto; margin: 15px 30px 0 0; max-width: 150px; } a.ythealth { clear: both; float: right; margin-top: 15px; position: relative; } a.ythealth .tip { position: absolute; width: 450px; right: 0; top: -100px; display: none; background-color: #ffffff; padding: 20px; border: 2px solid #dddddd; border-radius: 5px; } a.ythealth:hover .tip { display: block; } .h3_vi_monetize-content { background-color: #f0f0f0; } #wpwrap .ep-wizard-preview-video-wrapper { position: relative; padding-top: 56.25%; width: 100%; } #wpwrap .ep-wizard-preview-video-wrapper iframe { width: 100%; height: 100%; position: absolute; top: 0; left: 0; right: 0; bottom: 0; } PKL\θ'youtube-embed-plus/styles/ytvi-gdpr.cssnu[#wp_insert_vi_consent_popup_overlay { position: fixed; left: 0; right: 0; top: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 10000; } #wp_insert_vi_consent_popup_wrapper * { box-sizing: border-box; } #wp_insert_vi_consent_popup_wrapper { max-width: 480px; background: rgba(255,255,255,0.9); padding: 20px 30px 20px 30px; position: fixed; right: 0; bottom: 0; color: #000; z-index: 10001; -webkit-box-shadow: 0px 0px 16px 1px rgba(0,0,0,0.75); -moz-box-shadow: 0px 0px 16px 1px rgba(0,0,0,0.75); box-shadow: 0px 0px 16px 1px rgba(0,0,0,0.75); border-top: 1px solid rgba(0,0,0,0.2); border-left: 1px solid rgba(0,0,0,0.2); } #wp_insert_vi_consent_popup_wrapper2 { text-align: center; margin: 0 auto; } #wp_insert_vi_consent_popup_wrapper h1 { line-height: 42px; font-weight: 400; font-family: sans-serif,Helvetica,Arial; font-size: 36px; text-align: center; margin: 0; padding: 0; border: none; background: none; color: #000; display:none !important; } #wp_insert_vi_consent_popup_wrapper p { font-size: 14px; font-family: sans-serif,Helvetica,Arial; line-height: 20px; margin: 10px 0 30px; padding: 0; border: none; background: none; color: #000; text-align: justify; font-weight: 400; } #wp_insert_vi_consent_popup_wrapper p a, #wp_insert_vi_consent_popup_wrapper p a:hover { font-size: 14px; font-family: sans-serif,Helvetica,Arial; line-height: 20px; margin: 0; padding: 0; border: none; background: none; color: #000; text-decoration: underline; } #wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_actions_wrapper { text-align: center; margin: 0; } #wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_actions_wrapper #wp_insert_vi_consent_popup_disagree_btn, #wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_actions_wrapper #wp_insert_vi_consent_popup_disagree_btn:hover { cursor: pointer; color: #000; background: none; border: none; padding: 10px 30px; text-align: center; font-weight: 600; font-size: 15px; font-family: sans-serif,Helvetica,Arial; margin: 0; } #wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_actions_wrapper #wp_insert_vi_consent_popup_agree_btn, #wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_actions_wrapper #wp_insert_vi_consent_popup_agree_btn:hover { cursor: pointer; color: #000; background: rgba(226, 226, 226, 1); border: 2px solid rgba(197, 197, 197, 1); padding: 10px 60px; text-align: center; font-weight: 600; font-size: 15px; font-family: sans-serif,Helvetica,Arial; border-radius: 18px; margin: 0; } #wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_links_wrapper { text-align: center; } #wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_links_wrapper a, #wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_links_wrapper a:hover { color: #000; background: none; border: none; padding: 10px; text-align: center; font-weight: 400; font-size: 12px; font-family: sans-serif,Helvetica,Arial; margin: 0; text-decoration: underline; line-height: 24px; } #wp_insert_vi_consent_popup_settings_button { font-size: 13px; color: rgba(146, 135, 131, 1); background: url(../images/privacy-eye.png) no-repeat left center; padding: 0 0 0 32px; position: fixed; bottom: 10px; right: 10px; cursor: pointer; z-index: 10002; font-family: sans-serif,Helvetica,Arial; -webkit-touch-callout: none; /* iOS Safari */ -webkit-user-select: none; /* Safari */ -khtml-user-select: none; /* Konqueror HTML */ -moz-user-select: none; /* Firefox */ -ms-user-select: none; /* Internet Explorer/Edge */ user-select: none; /* Non-prefixed version, currently supported by Chrome and Opera */ } #wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_message { margin-bottom: 15px; } #wp_insert_vi_consent_popup_wrapper #wp_insert_vi_consent_popup_message p { display: inline !important; text-align: center; }PKL\ 0youtube-embed-plus/styles/ytprefs-wizard.min.cssnu[ #wphead{display:none}#wpbody{margin-left:0}#adminmenuback{display:none}#adminmenu,adminmenuwrap{display:none}#wpcontent,.auto-fold #wpcontent{margin-left:0}#wpadminbar{display:none}html.wp-toolbar{padding:0}#footer,#wpfooter,.auto-fold #wpfooter{display:none}#screen-meta-links{display:none}#wpfooter{clear:both}.clearboth{clear:both}.pad20{padding:20px}.center{text-align:center}.bold{font-weight:bold}.orange{color:#f85d00}.smallnote{font-size:small;font-style:italic}.ui-widget,.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:inherit}.ui-widget .ui-widget li{font-size:13px}.ui-accordion .ui-accordion-header{margin-top:15px;font-weight:bold}.ui-accordion .ui-accordion-content.header-go-content{display:none!important;height:0!important}.ui-widget-content a{color:#0073aa}input.ui-widget[type=text]{margin:0;padding:.4em 1em;width:450px;line-height:2}.txt-button-align input.ui-widget[type=text],.txt-button-align button{vertical-align:top}#epyt_wiz_wrap .ui-button{font-weight:bold;line-height:2}#epyt_wiz_wrap .ui-icon{display:inline-block;position:relative;left:auto;margin:0}.ui-button .ui-icon{transform:scale(1.35,1.35);display:inline-block}.copycode{background-color:#eef;border:2px solid #c7d6e4;display:inline-block;font-size:.9em;overflow-x:hidden;vertical-align:middle;white-space:nowrap;width:400px;padding-left:15px;padding-right:15px}.pointer{cursor:pointer}.relative{position:relative}.epyt-search-results a.pointer.thumb.load-movie{float:left;width:160px;height:90px;background-position:center;background-size:cover;display:block;margin:0 25px 10px 0}.epyt-search-results .resultdiv{margin-bottom:40px}.epyt-search-results .resultinfo{text-align:left}.epyt-search-results .resulttitle{font-weight:bold}.epyt-search-results .moviecontainer{margin-bottom:40px;margin-top:-30px;clear:both}.epyt-search-results .closeme{right:110px;top:-10px;position:absolute;font-weight:bold;font-size:50px;cursor:pointer}.epyt-search-results .resulttitle .ui-icon{transform:scale(1.35,1.35)}.epyt-pagination{clear:both;text-align:center;padding:10px 8px 10px 8px;display:none}.epyt-pagination>div,.epyt-pagenumbers>div{display:inline-block;padding:0 2px 0 2px;vertical-align:middle}.epyt-pagination .epyt-pagebutton{cursor:pointer;display:inline-block;padding:0 10px 0 10px}.epyt-pagebutton>div{display:inline}.epyt-pagination .epyt-loader{display:none}.epyt-gallery-list.epyt-loading .epyt-pagination .epyt-loader{display:inline-block}.epyt-pagebutton.hide,.epyt-pagenumbers.hide{display:none!important;opacity:0!important;visibility:hidden!important}.ui-tabs .ui-tabs-anchor{font-weight:bold}.playlist-tabs{margin-bottom:20px}.icon-playlist{float:left;height:auto;margin:15px 30px 0 0;max-width:150px}a.ythealth{clear:both;float:right;margin-top:15px;position:relative}a.ythealth .tip{position:absolute;width:450px;right:0;top:-100px;display:none;background-color:#fff;padding:20px;border:2px solid #ddd;border-radius:5px}a.ythealth:hover .tip{display:block}.h3_vi_monetize-content{background-color:#f0f0f0}#wpwrap .ep-wizard-preview-video-wrapper{position:relative;padding-top:56.25%;width:100%}#wpwrap .ep-wizard-preview-video-wrapper iframe{width:100%;height:100%;position:absolute;top:0;left:0;right:0;bottom:0}PKL\Izz+youtube-embed-plus/styles/jquery-ui.min.cssnu[ /*! jQuery UI - v1.12.1 - 2016-09-14 * http://jqueryui.com * Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px * Copyright jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup>.ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup>.ui-controlgroup-item:focus,.ui-controlgroup>.ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical>.ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label+.ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label+.ui-controlgroup-item{border-top:0}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:0}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:0}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc(100% - 2.4em)}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:0}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:0}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px .4em;margin:.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:0;background:0;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #d3d3d3}.ui-widget-content{border:1px solid #aaa;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#212121;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px #5e9ed6}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-icon-background,.ui-state-active .ui-icon-background{border:#aaa;background-color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-checked{border:1px solid #fcefa1;background:#fbf9ee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:-8px -8px 8px #aaa;box-shadow:-8px -8px 8px #aaa}PKL\k|}(}(%youtube-embed-plus/styles/ytprefs.cssnu[.epyt-debug { cursor: pointer; text-align: left; background-color: #dddddd; color: #000000; } iframe.__youtube_prefs__ { border-width: 0; } .epyt-gallery { text-align: center; } .epyt-gallery .epyt-figure { margin-inline: 0; margin-block: 0; } /*.epyt-gallery div[tabindex]:focus { outline: none; }*/ .epyt-gallery iframe { margin-bottom: 0; } .epyt-gallery.epyt-lb iframe { display: none; height: 0 !important; } .epyt-gallery-list { margin: 0 -8px 0 -8px; position: relative; transition: opacity ease-out .3s; display: block; } .epyt-gallery-list .epyt-gallery-thumb { box-sizing: border-box; } .epyt-gallery-list p { display: none; } .epyt-gallery-clear { clear: both; } .epyt-gallery-list.epyt-loading { opacity: .5; transition: opacity ease-out .3s; } .epyt-gallery-thumb { position: relative; box-sizing: border-box; overflow-y: hidden; display: block !important; cursor: pointer; opacity: 1; float: left; padding: 0 8px 10px 8px; height: auto; } .epyt-gallery-thumb.hover { position: relative; opacity: 1; transition: opacity ease-out .3s; height: auto; } .epyt-gallery-img-box { width: 100%; } .epyt-gallery-img { height: 0; width: 100%; padding-top: 56.25% !important; position: relative; overflow: hidden !important; background-size: cover !important; background-position: center !important; } .epyt-gallery-playhover { opacity: 0; position: absolute; top: -10px; left: 0; width: 100%; height: 100%; vertical-align: middle; text-align: center; transition: opacity ease-out .3s; } .epyt-gallery-thumb.hover .epyt-gallery-playhover, .epyt-gallery-thumb.epyt-current-video .epyt-gallery-playhover { opacity: 1; top: 0; transition: all ease-out .3s; } .epyt-gallery-thumb .epyt-gallery-playcrutch { display: inline-block; height: 100%; vertical-align: middle; width: 0; } .epyt-gallery-playhover .epyt-play-img { height: auto !important; max-width: 15% !important; padding: 0 !important; margin: 0 !important; min-width: 30px !important; vertical-align: middle !important; display: inline-block !important; width: auto; border: none; box-sizing: border-box; } .epyt-gallery-title { font-size: 80%; line-height: 120%; padding: 10px; } .epyt-gallery-notitle { padding: 4px; } .epyt-gallery-notitle span { display: none; } .epyt-gallery-rowtitle { text-align: center; width: 100%; position: absolute; left: 0; top: 100%; opacity: 0; z-index: 10; overflow-x: hidden; text-overflow: ellipsis; white-space: nowrap; } .epyt-gallery-rowtitle.hover { opacity: 1; transition: opacity linear .2s; } .epyt-gallery-rowbreak { clear: both; } .epyt-pagination { clear: both; text-align: center; padding: 10px 8px 10px 8px; } .epyt-pagination.epyt-hide-pagination * { display: none !important; } .epyt-pagination > div, .epyt-pagenumbers > div { display: inline-block; padding: 0 2px 0 2px; vertical-align: middle; } .epyt-pagination .epyt-pagebutton { cursor: pointer; display: inline-block; padding: 0 10px 0 10px; } .epyt-pagebutton > div { display: inline; } .epyt-pagination .epyt-loader { display: none; } .epyt-gallery-list.epyt-loading .epyt-pagination .epyt-loader { display: inline-block; } body .lity-container{ width: 100%; max-width: 964px; } .epyt-curtain .lity-opened iframe { opacity: 0; transition: opacity .3s linear .5s; } /* columns */ .epyt-gallery-allthumbs.epyt-cols-1 .epyt-gallery-thumb { width: 100%; } .epyt-gallery-allthumbs.epyt-cols-2 .epyt-gallery-thumb { width: 50%; } .epyt-gallery-allthumbs.epyt-cols-3 .epyt-gallery-thumb { width: 33.333%; } .epyt-gallery-allthumbs.epyt-cols-4 .epyt-gallery-thumb { width: 25%; } .epyt-gallery-allthumbs.epyt-cols-5 .epyt-gallery-thumb { width: 20%; } .epyt-gallery-allthumbs.epyt-cols-6 .epyt-gallery-thumb { width: 16.666%; } .epyt-gallery-allthumbs.epyt-cols-7 .epyt-gallery-thumb { width: 14.285%; } .epyt-gallery-allthumbs.epyt-cols-8 .epyt-gallery-thumb { width: 12.5%; } .epyt-gallery-allthumbs.epyt-cols-9 .epyt-gallery-thumb { width: 11.111%; } .epyt-gallery-allthumbs.epyt-cols-10 .epyt-gallery-thumb { width: 10%; } .epyt-gallery-allthumbs.epyt-cols-11 .epyt-gallery-thumb { width: 9.090%; } .epyt-gallery-allthumbs.epyt-cols-12 .epyt-gallery-thumb { width: 8.333%; } .epyt-gallery-allthumbs.epyt-cols-13 .epyt-gallery-thumb { width: 7.692%; } .epyt-gallery-allthumbs.epyt-cols-14 .epyt-gallery-thumb { width: 7.142%; } .epyt-gallery-allthumbs.epyt-cols-15 .epyt-gallery-thumb { width: 6.666%; } .epyt-gallery-allthumbs.epyt-cols-16 .epyt-gallery-thumb { width: 6.25%; } .epyt-gallery-allthumbs.epyt-cols-17 .epyt-gallery-thumb { width: 5.882%; } .epyt-gallery-allthumbs.epyt-cols-18 .epyt-gallery-thumb { width: 5.555%; } .epyt-gallery-allthumbs.epyt-cols-19 .epyt-gallery-thumb { width: 5.263%; } .epyt-gallery-allthumbs.epyt-cols-20 .epyt-gallery-thumb { width: 5%; } .epyt-pagebutton.hide, .epyt-pagenumbers.hide { display: none !important; opacity: 0 !important; visibility: hidden !important; } .epyt-gallery-subscribe { text-align: center; padding: 15px 0 10px 0; clear: both; } .epyt-gallery-subscribe a.epyt-gallery-subbutton, .epyt-gallery-subscribe a.epyt-gallery-subbutton:hover { display: inline-block; padding: 5px 10px; background-color: #E62117 !important; color: #ffffff !important; text-decoration: none !important; border-radius: 3px; } .epyt-gallery-subscribe a.epyt-gallery-subbutton img { width: 20px !important; height: auto !important; vertical-align: middle !important; padding: 0 6px 3px 0; display: inline-block; background: transparent; -webkit-box-shadow: none; box-shadow: none; margin: 0; } /********* GDPR */ body div.__youtube_prefs__.__youtube_prefs_gdpr__ { background-color: #000; background-image: -webkit-linear-gradient(top, #000, #444); background-image: linear-gradient(to bottom, #000, #444); padding: 25px; height: auto; text-align: left; } body div.__youtube_prefs__.__youtube_prefs_gdpr__ * { color: #e3e3e3 !important; } body div.__youtube_prefs__.__youtube_prefs_gdpr__ a { text-decoration: underline; } body div.__youtube_prefs__.__youtube_prefs_gdpr__ button.__youtube_prefs_gdpr__, body div.__youtube_prefs__.__youtube_prefs_gdpr__ button.__youtube_prefs_gdpr__:hover { display: inline-block; padding: 5px 10px; background: #E62117 !important; color: #ffffff !important; text-decoration: none !important; border-radius: 3px; font-weight: normal; border-width: 0; box-sizing: border-box; } body div.__youtube_prefs__.__youtube_prefs_gdpr__ button.__youtube_prefs_gdpr__ img { width: 20px !important; height: auto !important; vertical-align: middle !important; padding: 0 6px 3px 0; display: inline-block; background: transparent; -webkit-box-shadow: none; box-shadow: none; margin-left: 8px; } body .epyt-gallery-img-gdpr { background-color: #000; background-image: -webkit-linear-gradient(top, #000, #444); background-image: linear-gradient(to bottom, #000, #444); } /********* facade */ .epyt-facade { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; -webkit-transition: 0.4s all; -moz-transition: 0.4s all; transition: 0.4s all; } .epyt-facade:hover { -webkit-filter: brightness(90%); -moz-filter: brightness(90%); filter: brightness(90%); } .epyt-facade img.epyt-facade-poster { display: block; margin: 0; max-width: 100%; width: 100%; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); border: none; height: auto; cursor: pointer; } .epyt-facade button.epyt-facade-play { background-color: transparent !important; position: absolute; left: 50%; top: 50%; width: 68px; height: 48px; margin-left: -34px; margin-top: -24px; -webkit-transition: opacity .25s cubic-bezier(0,0,0.2,1); transition: opacity .25s cubic-bezier(0,0,0.2,1); cursor: pointer; border-width: 0 !important; } .epyt-facade button.epyt-facade-play svg { height: 100%; left: 0; position: absolute; top: 0; width: 100%; pointer-events: none; } .epyt-facade button.epyt-facade-play svg .ytp-large-play-button-bg { -webkit-transition: fill .1s cubic-bezier(0.4,0,1,1),fill-opacity .1s cubic-bezier(0.4,0,1,1); transition: fill .1s cubic-bezier(0.4,0,1,1),fill-opacity .1s cubic-bezier(0.4,0,1,1); fill: #212121; fill-opacity: .8; } .epyt-facade:hover button.epyt-facade-play svg .ytp-large-play-button-bg { -webkit-transition: fill .1s cubic-bezier(0,0,0.2,1),fill-opacity .1s cubic-bezier(0,0,0.2,1); transition: fill .1s cubic-bezier(0,0,0.2,1),fill-opacity .1s cubic-bezier(0,0,0.2,1); fill: #f00; fill-opacity: 1; } .wp-embed-responsive .wp-block-embed.wp-has-aspect-ratio .wp-block-embed__wrapper .epyt-is-override.epyt-facade { position: absolute; top: 0; right: 0; bottom: 0; left: 0; } .wp-block-embed.wp-has-aspect-ratio .wp-block-embed__wrapper .epyt-is-override.__youtube_prefs_gdpr__ { position: relative; } .wp-embed-responsive .wp-block-embed.wp-has-aspect-ratio .wp-block-embed__wrapper .epyt-is-override.__youtube_prefs_gdpr__ { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; } .wp-embed-responsive .wp-block-embed.wp-has-aspect-ratio .wp-block-embed__wrapper.epyt-is-override__wrapper:before { padding: 0; } .wp-embed-responsive .wp-block-embed.wp-has-aspect-ratio .wp-block-embed__wrapper.epyt-is-override__wrapper .epyt-is-override.__youtube_prefs_gdpr__ { position: relative; top: unset; right: unset; bottom: unset; left: unset; } /********* YTVI */ .ytvi-story-container { display: block; max-width: 100%; }PKL\&]99(youtube-embed-plus/styles/ytvi-admin.cssnu[body.admin_page_youtube-ep-wizard { background-color: #ffffff; } .clearboth {clear: both;} sup.orange {text-transform: lowercase; font-weight: bold; color: #f85d00;} .align-middle {vertical-align: middle !important;} /* registration ************************************************************/ .vi-registration-box { position: relative; } .vi-cover-prompt { position: absolute; width: 100%; height: 100%; top: 0; left: 0; z-index: 100; background-color: rgba(241, 241, 241, .88); text-align: center; } .vi-cover-prompt::before { content: ""; display: none; z-index: 10000; position: absolute; width: 100%; height: 100%; margin: 0; padding: 0; -webkit-filter: url(#viblurfilter); -moz-filter: url(#viblurfilter); -o-filter: url(#viblurfilter); -ms-filter: url(#viblurfilter); filter: url(#viblurfilter); } .vi-cover-prompt-buttons button.button-primary, .vi-cover-prompt-buttons button.button-secondary { display: inline-block; margin: 0 5px; } .viblurfilter-svg { width: 0; height: 0; margin: 0; padding: 0; border: 0; } .vi-cover-prompt h1 { text-align: center; margin-top: 50px; text-shadow: 0px 0px 14px #ffffff; } .ytvi-wrap * { box-sizing: border-box; } .ytvi-wrap .center { text-align: center; } .ytvi-wrap input.regular-text { width: 100%; } .ytvi-step-1, .ytvi-step-2 { text-align: left; } .ytvi-step-1 { width: auto; padding: 0; max-width: 870px; margin: 0 auto; } .ytvi-step-1 .button-primary { font-size: 16px; } .ytvi-step-1--form, .ytvi-login-success, .ytvi-step-2-loading, .ytvi-login-loading, .ytvi-login-complete { background: #fff; border: solid 1px #e5e5e5; padding: 15px 0; width: 100%; margin: 30px auto; } .ytvi-step-1--form .side-signup { width: 49.5%; float: left; border-right: 1px solid #cccccc; padding: 0 40px; } .ytvi-step-1--form .side-login { width: 49.5%; float: right; padding: 0 40px 0 30px; } .ytvi-step-1--form .side-login h2, .ytvi-step-1--form .side-signup h2 { font-size: 1.15em; } .wrap .ytvi-step-1--form h2 { margin: 10px 0 15px 0; font-weight: normal; } .ytvi-step-2-loading, .ytvi-step-2, .ytvi-login-loading, .ytvi-login-success { display: none; } .ytvi-loading--message { text-align: center; font-size: 16px; } .ytvi-step-2 .ytvi-registration { max-width: 870px; margin: 0 auto; } .ytvi-step-2 .ytvi-registration iframe { border-width: 0; padding: 0; margin: 0 auto; width: 100%; height: 575px; display: block; } .ytvi-step-2-msg { background-color: #d8ebf3; border: 1px solid #d0d0d0; margin: 0 26px; padding: 10px; } .ytvi-login-success, .ytvi-login-complete { max-width: 100%; text-align: center; padding: 25px 40px; } .vi-adstxt-diff { text-align: left; } .vi-adstxt-diff p { font-style: italic; } .vi-adstxt-diff code, .adstxt-verify-message code, code.adstxt-block { white-space: pre; display: block; overflow: auto; margin: 25px 0; } section.pattern h2 { background-color: rgba(255, 255, 255, 0); transition: background-color 2s ease-out 0s; } section.pattern h2.ytvi-hash-scroll { background-color: rgba(255, 255, 255, 1); transition: background-color 0s; } h3.sect { transition: background-color 2s ease-out 0s; } h3.sect.ytvi-hash-scroll { background-color: rgba(255, 255, 255, 1); transition: background-color 0s; } .vi-forgot-pw { display: inline-block; float: right; padding-top: 5px; } .vi-contact-support { margin-top: 30px; clear: left; padding-top: 20px; } .vi-logo-text {height: 1.2em; width: auto; vertical-align: text-bottom;} .vi-demo { max-width: 1360px; margin: 0 auto; } p.vi-demo-lede, #ytform p.vi-demo-lede { font-size: 17px; line-height: 1.5; } .wrap-vi-settings-pre p.vi-demo-lede { padding-top: .75em; } .vi-demo-col-phone { float: right; width: 330px; clear: right; } .vi-demo-col-content { width: calc(100% - 340px); } .vi-demo-mobile { margin: 0 auto; width: 300px; background: transparent url(../images/vi-mobile-phone.png) no-repeat scroll; background-size: cover; } .vi-demo-mobile-caption-list { position: relative; min-height: 115px; } .vi-demo-mobile-caption { font-style: italic; margin: 0 10px; position: absolute; top: 0; left: 0; opacity: 1; transition: ease-in-out opacity 3s; } .vi-demo-mobile-ratio { position: relative; width: 100%; height: 0; padding-bottom:175.89%; } .vi-demo-mobile-bg { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .vi-demo-screen { position: absolute; top: 5.5%; left: 12%; width: 76%; height: auto; z-index: 1; opacity: 1; transition: ease-in-out opacity 4s; } .vi-demo-screen.demo-hide, .vi-demo-mobile-caption.demo-hide { opacity: 0; transition: ease-in-out opacity 3s; } .vi-demo-screen-2 { z-index: 2; } p.vi-ad-source-row { text-align: center; margin-top: 20px; } .vi-ad-source-row img { vertical-align: middle; display: inline-block; margin-bottom: 13px; padding: 0 13px 0 13px; max-height: 20px; height: auto; width: auto; } .login-expire { background-color: #d8ebf3; border: 1px solid #d0d0d0; padding: 25px; } /* admin *****************************************************************************/ .wrap-vi {max-width: 1064px; margin-bottom: 100px;} .wrap-vi h1 .yt-admin-icon { width: 16px; height: 16px; } .wrap-vi h1 a.button-primary, .wrap-vi h1 a.button-secondary, .wrap-ytprefs h2 a.button-primary, .wrap-ytprefs h2 a.button-secondary { float: right; margin-left: 15px; } .wrap-vi section { margin-left: 20px; display:none; padding-top:15px; } .wrap-vi th label {display: block;} .wrap-vi th small {font-weight: normal; font-style: italic;} .wrap-vi h2.nav-tab-wrapper { margin:22px 0 0 0; } .wrap-vi section#jumphowitworks { display:block; } .wrap-vi .no-js section { display: block; } .wrap-vi h2 {margin-bottom: 30px; margin-left: 0;} .wrap-vi h3 {font-size: 1.2em; font-style: italic;} .save-changes-follow {position: fixed; z-index: 10000; bottom: 0; right: 0; background-color: #ffffff; padding: 0 20px; border-top-left-radius: 20px; border: 2px solid #aaaaaa; border-right-width: 0; border-bottom-width: 0; -webkit-box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.75); -moz-box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.75); box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.75); } .button-primary {white-space: nowrap;} p.submit {margin: 0; padding: 15px 0 10px 0;} .wp-core-ui p.submit .button-primary { font-weight: bold; font-size: 21px; height: 50px; padding: 0 20px 1px; background: #2ea2cc; /* Old browsers */ background: -moz-linear-gradient(top, #2ea2cc 0%, #007396 98%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#2ea2cc), color-stop(98%,#007396)); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, #2ea2cc 0%,#007396 98%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #2ea2cc 0%,#007396 98%); /* Opera 11.10+ */ background: -ms-linear-gradient(top, #2ea2cc 0%,#007396 98%); /* IE10+ */ background: linear-gradient(to bottom, #2ea2cc 0%,#007396 98%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#2ea2cc', endColorstr='#007396',GradientType=0 ); /* IE6-9 */ } p.submit em {display: inline-block; padding-left: 20px; vertical-align: middle; width: 240px; margin-top: -6px;} .vi-red { color: #de1515; } button.button-primary.ytvi-btn-toggle { float: right; position: relative; } button.button-primary.ytvi-btn-inactive, button.button-primary.ytvi-btn-inactive:hover, .wp-core-ui button.button-primary.ytvi-btn-inactive[disabled], .wp-core-ui button.button-primary.ytvi-btn-inactive:disabled, a.button-primary.ytvi-btn-inactive, a.button-primary.ytvi-btn-inactive:hover { background: #e51f1f !important; border-color: #a22222 !important; box-shadow: 0 1px 0 #a22222 !important; text-shadow: 0 -1px 1px #a22222, 1px 0 1px #a22222, 0 1px 1px #a22222, -1px 0 1px #a22222 !important; color: #ffffff !important; } .wp-core-ui button.button-primary.ytvi-btn-inactive[disabled]:hover { background: rgba(229, 31,31, .5) !important; } button.button-primary.ytvi-btn-toggle .ytvi-notyet { display: none; position: absolute; background: white; width: 540px; height: auto; top: 25px; padding: 15px 20px; border-radius: 10px; box-shadow: 5px 5px 10px 0 rgba(0,0,0,.2); right: 0; text-align: left; color: #333333 !important; box-sizing: border-box; text-shadow: none !important; white-space: normal; border-top-right-radius: 0; z-index: 100; } button.button-primary.ytvi-btn-toggle:hover .ytvi-notyet { display: block; } .iab-cat-parent {margin-right: 15px; display: inline-block;} .iab-cat-child-box {display: inline-block;} .iab-cat-child-box.hidden {opacity: .3;} .iab-cat-child option.hidden {display: none;} .wp-picker-container.wp-picker-active .wp-color-result-text {font-weight: bold;} ul.list-ul {margin: 15px 30px;} ul.list-ul li {list-style-type: disc; } .alertify .ajs-dialog {max-width: 600px;} .alertify .ajs-body .ajs-content {line-height: 2em;} .alertify .ajs-body .ajs-content code { white-space: pre; display: block; overflow: auto; line-height: 1.4em; margin: 1em auto; } .ajs-button {cursor: pointer;} .ss-vi-img { max-width: 700px; height: auto; } .ss-vi-wizbutton { max-width: 100%; height: auto; } .vi-how-works { margin-bottom: 40px; position: relative; margin-left: 10px; } .vi-how-works::before { clear: both; } .vi-how-works p { line-height: 1; } .vi-how-works img { width: 50px; height: 50px; float: left; margin-right: 15px; transition: ease-in-out transform,opacity .1s; opacity: .5; } .vi-how-works:hover img { transform: scale(1.1); opacity: 1; transition: ease-in-out transform,opacity .2s; } .vi-how-works h3 { margin-bottom: 0; } .vi-how-works .vi-num { position: absolute; left: -20px; font-size: 22px; font-weight: bold; color: #000000; opacity: .2; font-style: italic; transition: ease-in-out transform,opacity .1s; } .vi-how-works:hover .vi-num { transform: scale(1.1); opacity: 1; transition: ease-in-out transform,opacity .2s; } h2 .vi-num { font-style: italic; opacity: .5; } .form-table.form-table--vi-appearance { width: 100%; } .form-table td { vertical-align: top; } .vi-story-demo { width: 65%; position: relative; margin: 20px auto; } .vi-story-demo--box { border: solid 1px #e3e3e3; } .vi-story-demo--screen { width: 100%; padding-top: 57%; background-color: #888888; position: relative; } .vi-story-demo--screen span { color: #cccccc; width: 100%; text-align: center; font-size: 20px; position: absolute; top: 50%; -webkit-transform: translateY(-50%); -ms-transform: translateY(-50%); transform: translateY(-50%); font-style: italic; } .vi-story-demo--screen span small { background: #dddddd; border-radius: 5px; display: inline-block; padding: 5px 10px; box-sizing: border-box; color: #333333; max-width: 90%; } .vi-story-demo--info { padding: 8px; } .vi-story-demo--featured { height: 20px; font-size: 9px; text-align: right; margin-top: 8px; text-transform: uppercase; line-height: 20px; font-family: Verdana, sans-serif; } .vi-story-demo--title { font-weight: bold; line-height: 1.33; } .vi-story-demo--featured span { opacity: 0.5; } .vi-story-demo--box .vi-story-demo--featured img { width: 20px; height: 20px; vertical-align: middle; margin: -4px 0 0 5px; } @media (min-width:768px) { .form-table.form-table--vi-appearance { width: 53%; float: left; clear: left; } .vi-story-demo { float: right; width: 44%; position: relative; } } .nav-tab-valid, .nav-tab-valid:focus, .adstxt-verify-message-valid { color: #00a000; font-weight: bold; } .adstxt-help { float: right; background-color: rgba(0,0,0,0.07); width: 390px; margin: 0 0 20px 10px; border-radius: 20px; box-sizing: border-box; padding: 20px 35px; } .adstxt-help img { width: 50px; height: auto; display: block; float: left; } .nav-tab-valid:after { content: url('../images/adstxt-valid.png'); } .nav-tab-invalid, .nav-tab-invalid:focus { } .nav-tab-invalid:after { content: url('../images/adstxt-warning.png'); } .nav-tab-loading:after { content: url('../images/ajax-loader.gif'); } /************* chart */ .vi-report-error.hide, .vi-report.hide { display: none; } .vi-report, .vi-report-error { text-align: center; } .vi-total-earnings, .vi-total-earnings-error { float: left; width: 25%; margin-top: 60px; color: #1193aa; } .vi-report-graph, .vi-report-graph-error { float: right; width: 75%; } .vi-report-canvas-box, .vi-report-canvas-box-error { height: 300px; width: 100%; } .vi-total-earnings-num, .vi-total-earnings-num-error { margin-top: 20px; font-weight: bold; font-size: 3.7vw; line-height: 3.7vw; } .vi-total-earnings-num-error, .vi-report-canvas-box-error { color: #cccccc; font-weight: normal; font-size: 45px; line-height: 45px; } .vi-report-canvas-box-error { background-size: 10% 10%; background-image: linear-gradient(to right, #dddddd 1px, transparent 1px), linear-gradient(to bottom, #dddddd 1px, transparent 1px); } @media (min-width:1280px) { .vi-total-earnings-num, .vi-total-earnings-num-error { font-size: 45px; line-height: 45px; } } .iab-cat-tags-display { margin-top: 20px; } .iab-cat-tags-display:empty:after { content: 'None selected yet'; font-style: italic; } .iab-cat-tag-button { display: inline-block; background-color: #0073aa; color: #ffffff; padding: 5px 10px; border-radius: 30px; font-size: 12px; margin: 0 12px 12px 0; cursor: pointer; } .ytvi-msg-congrats { display: none; }PKL\e4youtube-embed-plus/styles/ytprefs-onboarding.min.cssnu[#wphead{display:none}#wpbody{margin-left:0}#adminmenu,#adminmenuback,adminmenuwrap{display:none}#wpcontent,.auto-fold #wpcontent{margin-left:0}#wpadminbar{display:none}html.wp-toolbar{padding:0}#footer,#screen-meta-links,#wpfooter,.auto-fold #wpfooter{display:none}#wpfooter,.clearboth{clear:both}.pad20{padding:20px}.center{text-align:center}.bold{font-weight:700}.orange{color:#f85d00}.smallnote{font-size:small;font-style:italic}.indent-option{margin-left:25px}.ui-widget,.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:inherit}.ui-accordion .ui-accordion-header{font-weight:700;margin-top:15px}.ui-accordion .ui-accordion-content.header-go-content{display:none!important;height:0!important}.ui-widget-content a{color:#0073aa}input.ui-widget[type=text]{margin:0;padding:.4em 1em;width:450px}.txt-button-align button,.txt-button-align input.ui-widget[type=text]{vertical-align:top}#epyt_wiz_wrap .ui-button{font-weight:700}.ui-button .ui-icon{transform:scale(1.35)}.copycode{background-color:#eef;border:2px solid #c7d6e4;display:inline-block;font-size:.9em;overflow-x:hidden;padding-left:15px;padding-right:15px;vertical-align:middle;white-space:nowrap;width:400px}.pointer{cursor:pointer}.epyt-fitvid,.relative{position:relative}.epyt-fitvid{padding-top:56.25%;width:100%}.epyt-fitvid iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.wrap-ytprefs-onboarding h1{line-height:40px}.wrap-ytprefs-onboarding h2{line-height:2em}.wrap-ytprefs-onboarding .box-vi-not-interested{display:none}.ytprefs-ob-step{height:0;opacity:0;position:absolute;top:-200000px;transition:opacity .3s,visibility .3s;visibility:hidden;width:100%}.ytprefs-ob-step.active-step{height:auto;opacity:1;top:0;visibility:visible}.ytprefs-ob-title{font-size:2em;line-height:2em;text-align:center}.ytprefs-ob-subtitle{font-size:1.4em;line-height:2em}.ytprefs-ob-content{margin:0 auto;max-width:800px}.ytprefs-ob-nav{border-top:2px solid #ddd;clear:both;margin-bottom:50px;margin-top:20px;padding-top:20px;text-align:center}.ytprefs-ob-nav .ytprefs-ob-nav-hide{display:none}.ytprefs-ob-nav button.button-primary,.ytprefs-ob-nav button.button-secondary{display:inline-block;margin:0 10px}.ytprefs-ob-nav button.ytprefs-ob-nav-close,.ytprefs-ob-nav button.ytprefs-ob-nav-prev{margin-right:25px}.ytprefs-ob-step1 ul.ytprefs-ob-filter li{margin-bottom:15px}.ytprefs-ob-step1 .ytprefs-hover-icons{float:right;margin-left:30px;min-height:200px;position:relative;width:160px}.ytprefs-ob-step1 .ytprefs-hover-icons img{display:block;height:auto;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s;width:100%}.ytprefs-ob-step1 .ytprefs-hover-icons img.yob-icon-visible{opacity:1}.ytprefs-ob-step2 .ytprefs-ob-setting{display:none;margin:10px 0 25px}.ytprefs-ob-step2 .ytprefs-ob-setting.yob-gallery-visible,.ytprefs-ob-step2 .ytprefs-ob-setting.yob-live-visible,.ytprefs-ob-step2 .ytprefs-ob-setting.yob-privacy-visible,.ytprefs-ob-step2 .ytprefs-ob-setting.yob-single-visible,.ytprefs-ob-step2 .ytprefs-ob-setting.yob-standalone-visible{display:block}.ytprefs-ob-step2 form #facade_mode~.box_facade_mode,.ytprefs-ob-step2 form #responsive~#boxresponsive_all{height:0;opacity:0;pointer-events:none;transition:opacity .3s,visibility .3s;visibility:none}.ytprefs-ob-step2 form #facade_mode:checked~.box_facade_mode,.ytprefs-ob-step2 form #responsive:checked~#boxresponsive_all{height:auto;margin-top:10px;opacity:1;pointer-events:all;visibility:visible}.ytindent{border-left:5px solid #e0e0e0;padding-left:15px}.gdpr-options-left{float:left;width:65%}.gdpr-options-right{float:right;margin-top:20px;width:33%}.gdpr-options-right .img-gdpr-message{height:auto;width:100%}iframe#gdpr_consent_message_ifr{min-height:250px!important}.ytprefs-ob-step4 .ytprefs-ob-content{max-width:100%}.wiztab-screenshots{border:5px solid #ddd;clear:right;display:block;float:right;height:auto;margin-bottom:15px;margin-left:30px;max-width:50%}.ytprefs-ob-success{color:#00a000;font-weight:700}.ytprefs-ob-success:after{content:url(../images/adstxt-valid.png)}input.checkbox[disabled],input[type=radio][disabled]{border:1px dashed #444}input[type=checkbox]+label .check-note{display:none}input[type=checkbox]:checked+label .check-note{display:inline}#not_live_on~#wp-not_live_content-wrap{opacity:.3}#not_live_on:checked~#wp-not_live_content-wrap{opacity:1}PKL\CC@youtube-embed-plus/styles/images/ui-bg_glass_75_dadada_1x400.pngnu[PNG  IHDRDgAMA a cHRMz&u0`:pQ<bKGD1tIME  "&~KIDAT8cxa"*n{11abgb4a)&v110101fb\ 3EC _>o%tEXtdate:create2016-09-14T12:31:34-04:00-%tEXtdate:modify2016-09-14T12:31:34-04:00\RIENDB`PKL\b^<youtube-embed-plus/styles/images/ui-icons_888888_256x240.pngnu[PNG  IHDREr@gAMA a cHRMz&u0`:pQ<bKGDI( tIME 5sIDATx{eE}?H(bX!²[R`JH!wMbݱFѨh ڥXT#D T;"baRqw}G)b}N9νsOsϯOw~8<3 @@F3 $ +\$ Ook؞0Z ""`JyQzB7iQ'.qIvCT2mk5e[7Gt ͩk!HL^?3dJ[ fZS0Ms}`T8t US˴ @1a`fekï6^/  @px{|AQ"iO=]}=\z\mc-ܷ>(DЯ'L6=;㴓l ۧ=M/>ڠ̓6(ڬ0$%GI_km+$.q W7~!pxh84^/ ƐQG8UkV}A 栺*s%~aJYT}-c*vۭ.J=C `+~P}\=. 43%4 Ph F,_\ֱWRЃ>4j"mhi@IzJҼy tsY@ee'C뱅rjm܍C&[LM%m{e^.%flNźuѶd{$*"nK9(ufc/ӯ<-!LUi{&0lWW/  @pxh8͡phxѮO)LQ.ޫU@P--[jj6ƵKǎɟ 5r 7phۊ{]Zn!w3ڹRzz[ ta.m[uD,i9ХcwnϹCzƠ Gm,o}RfNaÔ Juˁ ]oۯ-Mu`f]gJ(U@E N=Mϯ,U `z~S=n0o粤= ̙hJC,KJs /&޸咲C9Uhuav^u9&mtjc(0 H @ᗂ/  @k R]y{L*k ,CV= &*aTW;uMB-b5߮ `bp]Ӵy4ttClhbٔއA/(qW\;ȊG'+? U@낢sBd * Ȱ$=U!zӊUO{'!`5͔:KU=Œ@mRal{IB%b5}ZƀT7 셲jDe!014]Fh4^/  @1|Ef /nl&tBnȫؠ ʹwSLODHZpU]g@*y;i-JӅR޽HCt5jNާr Ls_S>ܵG]ϗ- 򩸹h_Y=^4Y kNջNc>BGA"I՚L@<4AG<!s"=;a[@ȼUw0b?X =0Hjr~zV(U&v$>R@P骁lO$H!`;pdvY$4m^U_B`ڑyP0l'z&m0Oౡpxh84$Jl_ҿAw`\qcM !OJe8|z==[K<.iǸ"0kޘW =r)0O1%^q&l ;GX)[ʝυc CUrH=Ž1eq3PRN%F./TDUC|'ȔՇx ;w1ws:?r^fOE1~6 Y\U h&( 80h'yW'w(:* yMjmv/ {pnx/ (?_iRz5^z,f\ ,OsxYM`/*6;xg2Ë %sW2ia l!ަ)9ϣՕAE~5]f"G"z ^`[[UE0C!f ,h5c5Cm:X@`IbSdshye QwB~+`$;\lc#%V]I%uB59ů9\ @LVIT5lΜoavY~/zq,b/쇗/&oMޮPH:`oaLc$1>a_~EvQ5yK wہ]V\MbL} n{7_$_f@M?g|vhЇOiT=wx96MRD?Pd3ddco/\=Zy*N֫Ig/7؜(86~bC2XSɇv>G[UBuS f%&?g.n^[$CA9D`}O&R5jQ|O c]z@hd} vnAsw$S&qNw8BHH.al/.uS?-¯[ Qߍ0~-ӗ쏌}dK@3>Lb,㺪k,OxAJL Q 4^/ yU4TtUm`:!E0ݮu\k_A>>^Ż 1y(u.pnf>NȭJǹ"o͐g(m!dz5p휝=Nن~Y/1 YP,DO>٩E {Q\)|uz}(BOU#/}WH6gvs!Pf^3dB3uBJ|ye0 ,p%dANؙ"oԧE~)_Fxq/O^_V=gOw V.+"8<g''d颹)cRDzIZXE|7F(S@;fqYw\Sc^sgqƕ-vE}ta;K3!yo`10wUMcʢ òZ]!N p⿖tz[8]L.IH⯀H1EU?~Ιl6ngs9;uW0QK|#h'_iDu5F4xVFt?@TC7Cln6p6UvE9V9rf 1k `[6"AvE'xxhQ Js998_Sq/\ALvIl_DN3t& c,{ou'p2M1>JZ˿5F-?>oʅؖT^r ZJjhFnm9zޭν:y0c ?]yUm-~C/d|l7? e_>DѡW_ִ%XZ5,./ Gt4^ _Agܣ7ˁsE!ܧW*Agޣ>p9rNٟнQ $=f?qb_fƅd &(_5q^ϒ`_ƳCNEDs @Xd6\hl^͍B,19M2 ^G -WCf[X.I!n?.3_Ppǹ@}d@'3d>U?RI:}]k<`\LXfSX Y  E㶎ho~scv=C`x+!bc;y6SiqRN, :WqUw;9~8cS_\w'^xq'c :QFf߷~,%}ϠW';[=Z6^$!E$'-vs+sU(tgMÁ,Qh<1cXIxm`pxh84^Xo26nQHAI4;F[ՒaA*jdҦa=4tX/,~RJ*o-O]UŪiS +8³*dބC)^H~M?f{lC ]GG %П֡ΨYT O BٯyXR >F/XכI,*YS/ (`}D,(KXgp4bZD'OWh+RCCMyЍYs'!nJC C#\r=hLݔï6^/  @Ñ[93\;4[C#=G=6!hMݏ^NW9:,so0Cd!8;2&s\KtŽl:-*%A$-G94?B8=:5FTcw[8͖?kxkj/~}cn"]o.0x+>`/]ޭ5.`+g("Fers"bۍ+"xxp=NKLBg [y E?Ga*J$su̟2$JLqW3[77CD0~ķx%>1 X)Ϲ G`j!gFoprpxh82PR ^[ ~F:.f~o8\#u]y K |@4dmSQ\WӣeWC|[V~[OItMt1RDU͕lw؃zwp]Wv` 鑫K~-ְ|1t40wq>PsߜIdhE%u]\1{ΘM`OpV$ /#=65ك|S~XB!~_1j])}S/G" C@4 F_&Dxv{\(rݯHj$ +oد~jIDpT@+yz;6~hoK?B?o˿)~yUY: uRD"GYNK.F޶a~os8KGY/pu}l42AHᵁ  @pxh8Deta{T O)Cץ{ C@=PSqHO3`cΗwC鑇=B_nPQ!`B*rls گMUUuN=ΩSx4g : 6!Agb3 6+JD0&s؇N_Bs&&ڏ>~= c{vj%_DYEF qܸG RSơCEہ!' NP)~tϷ=;wהmeBH{s S&S6MCP6z̐!(hnE6VjնcO6y7iʶ~fKjڬT0<26+^;4~%pxh84^/ :2n6eLh`~=uprn0sOs횶WrGh _ Cmz-=)wFi#@u-cթPO{Ss˛^|BA'm TQn`.[ܫ |Եt7^p @pxh84^sC8UkN}A 栺*s%~aJYT}-1pTVP%%?p(>~PA.E ]1^([#\ֱWRЃ>4j"mhI@I>]yҙA6E:q7n05AuPy L8Pj K9 [EZ.Ȫ.Lu֛L;Xt0Ua29@às_!_ l84^/  @7R?~¥\4F>R7F{VCl9wT.[)?}ڕk Po5othz'\CVgskۥb%@6[\ܩ۶`6YsKݞs7jAAnX2G?1R6+u W@P"[U|~mm`3` { H+"ȤN=Mϯ4U `z~S=n0o粤= ̙hJ#[4ٗv4`5@bt n0w59-̩B(X'[67i3SP@  Ĥ/7^/  @:6U.EowsXE{LsUXcau7WvR҅l~٭Nv]h;Іi;MGC'{I79J*F ͦ> B\u}A窞o<ȟVaCHP"nLum߼]݅=eMFdUf;Il;:DCߪiŪ'Ƚǐ_VL:p s/5V.~{3R[IAH]$fCT5 Pہ(Ku^([ݬN4]&E@.`C5oJ @pxh84'Җ:6lB'.D Рxw5%1\U)F:Jm^[uRdTwOtI&~|Uͩzq;j~đ TsD_S>ܵ TG4m5'W:m" VH#t|dM‚ nz: um?bGA-<[ez#S/\хyDV{+ @u6y#L<"<]5d lj&˺'Y%iFbgJ AH} P=o2O౩pxh84$Jl_ҿAwp( UNQ߆'$kLe>Wƞ%ײ:RfQkb½?.ux8LPr07jNװOfX˼I\99Tn?S#Z֙kk@ g?mbiʘ,kċr]= JOE*We~ 4 -E,dN9wuʬqw>c3e|qEwKځ3%,y ]Y$p)CǢ yR<KۿK}AHD`!@}Enevp7/ 4shVTʉXJ`ג ~\#gᅑ./T!Ij|*<^T@+]uƜO eә"O>^(/檜}cݾ~["ɯx·z&$u7@L&ir=G g jw)ZLZsܗ~M+@>7pZOI'y#GSAS^zUK! ;4Og0͂_ ]%=e`d ԣ=K?RPz12Ӎ-x9uJZ[Ԛ[@byvp#ai.\wiC#Y. ǵꚸM*R6ȩ-~fZ>Ohզ:as|3|*f0S}a?~oVJ]@l,5}c×%ESԸՙ_T !co `_Xp j9C>|"qOꁾKt͝i' t #{P&rej5hv^M8GE h&]@X֔AfaJɂH*_VnX3ug<}hr PPv!o[@ [DF- 2)oCOSP{y#\_.1C|ܼ],ҥKY단Kssͅd w2L)߰O˾e+'HL$1 ?Ѽz>!0r>:xGtb*h8.pxh846VtU9Oyw莇!+IT .ZvZF "pS΃ѯ?!p !B|5CޞH(zzi8[97Q{ z_b:LXTO>٭E {R\)|er}o+BO#/}WH6gvs!Pf^3d"#Qgh8la0`XJ&ɂ`7;a E EO8SҿLD_:Z Qz2*T55XQ{8!WfS~!a89'JHSle'@&3YE,_ɷx1O WP1E#u3jkEyg\iQbp-; ;ť\ {ǔU5e)6ti,UJ6os&X!؉N3˔A! :)OFH*V3 9g[yTΞ,FU &_C<ҫ(_?(W1p? OW p!3J8ҨoWd'`9MYa,3˳|ClSŦ.׳wU!ܟzBļ:b ؑr@jvx_ E4X3|8Wi5gqqp/+3v+s+Q7].v )gp (6G,(6G ?Xd ou'p0M:nCfF/?>mO΅ؑT^rR[M)<#5Ќݤ>;rZs[{uY0c?]yUm-~/d|d7?C e_>DѡWg>iKݑX8ƫ "Jfqvqxh8 p_]|-Yw :o\+ >%W7 :r.\+tW#*Oԃؗq!TFQu~rÁ &(_=q~}`_ƳCN%EHs hkQEϬ6\PO6/I m!ƹClg>҅ 1O 6X}G.M.W@@,TKD6k,s?ofR"vޣMt2'zlY=@'Ӥ>U?Rω;}]q?ko)\LXfӜ4X jJĽAonLٮg{SaDVf2n2tdcj˚k$ Ongyv'C46ާ~4=MI3dF9ݑW= dH!R u}8o=-p`$ ^/Oe4VF/X[II V=zd1abXC :oFE,(`p4lbZD'OWA]4RCC-yЍis'/US$C C#\r=hLݒï6^/  @Ñ[D*-> Mk_>zlIТ3,ruX(+d<dBqv%^IgPY=:-*%]~E#grboncLE8ȝ6ΰO;㚌u5>zAC &C&gIZP bsb/p.o'G+o^_n\! 噻/fvq=fJ>yOeĢHES|fD<`gizI>7p5SZت!{y{~=4@#˹5"p@yU8ZSq ?*66x{ϖ/  @Ñ <п8~o>U8/yu67s|Wٿpo.P<]ץƟ/Doz7hz ! 6*Uyjr6~`oK?B?o˿9iic.ͅ%wvms%]\7}U]7%~T_|JOvh務Ѹ[鄚{ [@+r.~ٳuĭO"2#f`Ͽ=MMv7Q}WLZnJߔ B &+$U= ;T=(r/Kj +oد~jI8&e 1Uyz;6~hoK?B?o˿)~yUY: uRXX ^fNK)Fi޲i~o8KX/pu 97:dس~o! 6^/  @*l;ݣdmxr ]1t(XnM^ j!!/6nt1P;FXQA^qƍtCTxDqۜBk 3||9/`/  @pl]h^@l!=mV$! 3hZ`꠳9 `x_ akݞ=k.|!,!ثØ~A+l[U?d0ğrB0_S<ҥI_~?CWS|3ȇɲ_>Nք(az X>E=<Y=kuo UX0%tEXtdate:create2016-09-14T12:30:40-04:009qq<youtube-embed-plus/styles/images/ui-icons_222222_256x240.pngnu[PNG  IHDREr@gAMA a cHRMz&u0`:pQ<bKGD"btIME 5sTIDATxm%Uy $!,h ,%&@|IEMrݱD2;f ܉A^$5Ƣj^K@U-wWD`|q"t>ν3}S~9}<>|Dg7\J{4K 3tfZޱ`7u7Yɶ~f]<4m*<%%{^`FR l8<Oh8<Ok2n6cL`>]=u$,`&+hk6J_*|K0?@lxdom]L3ݞߌ0.;TE,;4tMOmPLUA&e+`8u]577~"h8<Oh8<]C8YsZ}iA ֠)ȞsW.!m. z[#R䨚 \R{v r R ?˝#[|f`y)A-QN 4wϮ:Kr{河3ZP!0t{l\YwSnPIA.Vm-R $ysI@;eغX.vYvB n]gWcVn*ôyT=Mhpt +3 '@ px4 '@ pC`=x?.jlk]R Q.ޫ5@P,[Zj6ƵKɟڕ[ ,P/5/thzG]Yn!wk9څR+@K tťa.mKu DM篂U!LgK\At$VrX˒`LoMe/R+X.X.]L]Nq%e7w"< ּp뻴ʩ@  uǤ OO7 '@ px4 PdrvM{wQve{Ȯ]0d1w%L,vQwqyyx`]jW.!WWl/D3,v܁6]iZ<:IݯtM~9UPi!snS!QyU緯lJ Ț!$(7-/ޮB¤F[^)F#*U$`7\!OUŪ3ǐ_J:𨃏ܽX6X!|.!}t$ePROQա/P[Cmb,=XA!tho14]Zh=Oh8<#@keEٲM&IKѢ&b04(.%thtIH2>Dgͳ]ݢ@NE]hɟ|T=m5@ .#BW2wQ׿¨alrvEb)n#ය݄F/N6%t]KX" nz"t.'`[A-y-LTi rgW=)lj&˺;YeF,6CG_0l;y1|5'@ px4SLT_ʿߐ:ADV\cK !e8L}F{=.y0~w,ݭ9^n gH]Y,b}H!0 La4-Uڣ$R|crQx/a _seRmDz$V\ 3<ɔ0㗹1VD#a=5!*,6~ ^#Jt Wg{ȃsd,o9X1 ?*uuB,=`޻'1l$[Gx4 '@ DΞ-z)E}:g˖ gÁyk>fiNa~  ɏk`.73PȸҜ;+ ZpMlbinFݬLپȓ4 :a.0JN.pk8NPx\lh݅x2iǹ?OH5M@.K4p\a/>ay%^zU25O'0VOsMR4"0VܞFqyYEL0])PK~Irx /Qs*SL1fn>6U4>i#\}cJjrjo_u8n,JFgyFk6a[0y|kS\6 + )L*g EDخq|Y_'-?Z";<Wϼ= [\IL}‹7OqX 4<z7=~CP6w'ƟL~*?7ȳg%npMBC{ L^O2;C!-c%DP]y_VaX1uҗEc_t'[PP> `4B "O7ՑF3 <5ϝ|B.0#bb],ҥK{/QWܯd0~.ꏜ}eK Y@3>?_"X,u5OԘ(xsG4DI 4 '@ p4XNIMs(,ѡކ<&R=>@]ZG^ _Hk|p7rFp,/^>G-B+7(z3d-A^'qzj z_`I:L0T|aɄ܇'/CTS̤ U (.2Rr ?< aGBKsRƔ[IlcylU_ɷxO QH1NcӺ#?5f4ߣ3lgGAnjԄ&"\r'VZvD)ykCbW;I[‰k!fuiQ*tWsN_~W< g)'8}ږjHzD66Dkx3?xFy znoO+v,bcxsLwxtnGĝlNn2ھIOΐlƟw g kг=ޜlAl)l; )"W2:-.H٥aq66$\0oqnjcC[Oh8<O":F@j1Xg dbݖ3zELHWW+wx0- pxk` px4 '@ pAܣDkH2u]AzwnPExFyAum 0F0bG:1;L6|CGICHRݿ6y~˘{o}@]Q~"h8<Oh8/~B P-d׻͒£"D ;R򠫹 `d] a{ -+PS#R3@O z-̒ ¿rvJQz`W_9HGx\EA2͌r͠&~U>wS[Σ- `9'C~ C@eCٹq_ XzN%tEXtdate:create2016-09-14T12:30:40-04:00fisayo6969 2013:12:23 09:12:192013:12:23 09:12:19fisayo http://ns.adobe.com/xap/1.0/ 2013-12-23T09:12:19.694fisayo C   '!%"."%()+,+ /3/*2'*+*C  ***************************************************" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?F(P;($(rV<\G_[w}N9TOVݵrvmhOg4A ?5QHϩ}Ϭ诓?5Q !F—#?c}K_}gE| !Fi 7o}n__r3:+i 7oHk+>/>L#wVG4A >}n__r3:+i7oH+HrRY^ⶽOY[jIe#ʒE%HXLÕzI m&QUb}Zcvѓ/2t{Wgo=HSq[dqUEYs(b0^+2hSKwV=amqym)U`H$Jtg p??avǾs5w?ZN3H<.=:=J۫78_ET5%QGHrq3g'ڭY]^ERQYZR3RX[1ݹcSC) !; @qߚ4*NkD6p>SG":Sӳu{t9=Fl,Cj< BS,wE62T#={Ӫ *-WWhCxo ;N+ ++gw7ۼwCzU]CWd쬣Ζ=͸g(srKbJ\ɖ袊d0HRǰYAVP+Fd)9>Q%GsN(((((?Ia~#9D 3.Yt<[K|ߍl0cmF>bW^cf$g)~g$m!u8$/Jzh vs0##yoeKeh9%Ja-Dя>՜Z!UTnp#FK}m}ia5+S3]ovKy_s@+Xk'pp=]O)W&xvyy^)z5{Uc~83uQg|T9ҵz'R6g%.{e2FZL'kе [oF TT;F1{9oo4ǨM\>yTiv\qкZ:C$0U*M;}'VMe c"*q_ʿ6c?>( _ LGts'8kա草8¼)]ydo4/Gַ"M(n}zW[Эek뱝H9ǖ<B['q[Js)&vy {붚=|]龺6`sߵzDh$dh Q~5EgW"km*N?ԿO ?)+S6ݧ_·K(4{}w:7zeb&>HaN18Px^?j+51FłF{Jm`bI^K_]70kz t~^DŽV8$rqڼ1èkr-Ɠ3~4}n4Vq*)SC:|(ic jPY<ڌ1pzWc'`x_uKw}}:q]5Uʬe}]?Țxhqj+lxaH||/%ߌn}55ysq[Nc>Ueֵ)eLYA#gtVssiwW1M5n;_#QIsG?g-,K8K;]^#|]`:%!Yy_M&Rv̞vE\f"Dp%POOjJ*c%w{mz #Τ ]zR+36#7nzE]#鱟[Y-&ABsзJ )+nkWmۺ %PO^1l,9mƫm;b㸖2O#,]z1Ƹ$F4xdZU۱=YǮiгT+xyivyI?Š+Oi77򠢊+"Š(~7!IdtZW3m'68[ܡd<.oKC)W(8';Ԝ_K*=2Yyr(cno,[9lwZpN!;876A06$@ހ(Pt ~c [f( ۢ76 ϖlR}IUR1֙*8*Еj׾xӤ-**W6d'<`t 2jpCmU '~5񒥌x+>Nl7c-y=ٷ͎5*,f/zDž5mBn%9#Xz88RӖoUǖLL'<_v3h'Mq݁/l\wrL 3ʘnՓD`^ͪXJe7]22rKP5&NAF+d\A82Ks1ךn5>hDrqMVM*(W/bp2N8i%%]F8?[W+kyc&\" 'J:6.ԀNk15h8#\Vg|Ol.1RK}+_2|KhA>Cu*]Vuu(j:žyN3W&"#y2< FzgQiHi o1pf1\Fu9~_x~5[mm^OR.oM{1|!hE.kuȑpKh^OGu_OI?uGD1[("[JČ8,;9lגx'^Nyfw^ {.XbʂF.h ԭ >{.?6fT?r3r2[K[SN;xZg$ڦk4$FU8$X^ eχo7p\6R.ڴ $$*xF0ddgdOZ[PˋxN䌨c``=V]Ь[D 'e0VH>{~8(Ukrʰ-2]ʒw5|=4MFGeŝ+.KD|6qבmwoHvLj+qi<5y!kI^-:m@k8bu $birⓒjݶrR*#idXשe}ִku ꚞW^[>{;ԶmL݆S=Je>eeP>pp1*GbNݧG :_M:6vclA=kJ<7!Ė,I4)n~АH"s67*d'? xBoh4KEs".!fck3ɩ-E7jz[v wv3}WmXfrE߃3TӴkkkpu~"Fٗd 28%AI-_o[闚m#>rm( 7-gykxGt]p29x1c^qu c;HMwڷ34I}|H49uoeo]0YdhH6 .(?C_~5nWʅ%CG_qa[ #eURZ1YEs=Ŧ*>H.KLK1 crW=ú{.d Ϸp1>MKV]bpH9tB_Z!mi}}[]wīCB]Z;yefiٙОSP+ ]%}h1 sZ?ٝNz t3v(4Ny5ԩ[#Fs_YW߳??ƵƦʿ6q`* *+`if`$5ֶ&;h<Ч(abFv;+k'h濙g~G?FϚfZ>k?FϚfZ>k?FϚfZ>k?FϚfZ>k?F|Vp͘]x6N$_a[j5Z\U WX-LNr.O;2/^y/XVVZPx$g-d5z +??8o=Z>k?k'iec?/Ey-d5|4ec?/Ey-d5|4ec?/Ey-d5|4ec?/Ey-d5|4ec?/Ey-d5|4ec?/Ey-d5|4ec?/Ey-d5n{V#ȸ#*CYT8hԗ,eEvQ@Q@Q@Q@Q@()xP{o3mG^BWھtԣ?8K3jjP1: }neSi'⃞BN?\ YQ`k|I<+ \p /o5iJ-#(юP:SrpKqٱ[9##qMN`854.:K &1o'$ѲXgOBk`֬D0B Yw6{im1U"| p} [N)_1^]Q+и7=;WzF=C o=vπ=ix9JR_Ն\G6K?dN>vzVPOZrK,7s["G^xjﮤF+*!'8$>{bKU2`>ل+4ˉ3سQWuڧ,<+l'8l8=8RvfxR 4rZy#ڢ= /~h5[j[ktO .ɽ;_Σή~EQҐIdK!ß#>+g\𶃩Iӄ.=@&Cܞ;i'KQO::;/zhzMΥ<-A* c.~cCu$Vǻq~: xrh{޿ Y+} QWksiz}^帅mR-`\-4ܚեM3_-X!h_xo<_I hˈ%WoF-z2^&)d8c+CV>Kf?U\䶰OU]b;` N>Y&F?Z[{2՝;ΣΨ4Elu.^)42eg 9~*o{#L/{[C8sӰ1_U:yo͡|*mO#>*҆ WyhΣkƶ0 tW[SQܚxgRi7G]!,CU]i,č.bˏ]>w6ee-L0$E>J4/5om:OG]rhӛ˨>=41Cy g<β g⻛})h܉eE[yaz z֐FE]}4"xYBm-uuz ƑkSoeĺclWq y0=Oм35gJ{#Df6nϱeN1mu#oM$O>gy{oǫ^Oic+q=46_}F꥔2n+t- a;1a{GKyZ6 %@kf$xVQQ-nDn60z+CKm4;2}PGK x81xz\1iRov쎏h⥢ޓ<ΣίBԬ?;]o..b'D88)̀?R9-[Ka"*zO꫎eMM]򦿧oK;[Xq?i^|;I2jQ\O%7c9>5ș$#+wZ5hɭF U{ϫh5xidG[h5;İHcb$U (A CEp3S'R^aX4<,l 185}SP<jsZš M꤀=QnJ&,iM.bȄty]QX%aRϖ' *7chC:j@ u&YD%ف92k[/*s#zaGM,WAryr p7nJ rS Fdk(S st1AۚI]oo :z+|}jmY4.L+`˵F^Qg62(l@9q^.u7?ZZD׎u{Wfɐ1(yG ZrT$x1jnq$43I(m{O??罧Ma|w/F9\bOֵ4o^h)O3B*O@Oi}G Z5iAv;M.%vC%WIOuHiv͇T??罧Mjo&϶lZ j:n6H# ]KھHWy?罧Mjo&^Ouӛ\ğ/@Oi}G Z1L-<ܵ׍4e E5e|HEΝotӸ1F<k ǟߕ_cJU68^gyF\VG+ݝĺuY"SI6 {)oo6UtIf9',r\gGY:4e{kZ$:9yt5#9awnb$K/IH~) W[ANsk+쯹;>%muQ0  $d,O,$>[>w'km+~Md6:1kץJ ӫ^M-|IkFk{Sn<$!d9s?j/|e-7AaXG9\{?l? 6? ^+6o>x/5z횱y6t@K%YQ(.eHk42?l?ŠIt`fg%Aח|IƼّ2n+?42?l?¹0BtToE+?b/AyaqDLO"Wҿ?l? 6? V:+ |ͳ3? j躵ZA$LC d`rYHe`y # 6? G@O#rpP;{{+GJn.8szWA۫iVo$ 7NaXZCd;V_-@VPvE1fr.ݢ2;̤Nwf$byn鯬mK m/c p˸ AAk)<7$D%-#gӽv0i>:Ƀ,[..Y份Vh< OtMZ.Iu2Mnj81v1RGQs)݆ER((((((((ūXꬎY\dz^A~φkKO 8>mZ/Υ(TwaQ/½븟f_Tog}G ?bG+h븟aJʏwaQ/½>vT'{1^_?jǻ}*K1֩Un摧 jV: (&s'AM&ݐI]ѴN@ԯ/%{ْqi]gGYL>#Y(Yo5Uf{ '#$a,¤[Nݶ8:rO;ޭcy$%lèsu?"WSij47):ܸ-D;T1 b⫽snHlcW\$$*.I1],׺E)-9N3д;K8xa7ss&|S@[i.&Ra̍ȩ%ycxgZ.+}6{\ؘ$7n|W[j7f495繹Ihx9*غ;+ۥVp_wiiz=gsdCM=?xxEޡuo>26>Qt[>|)-og{ɍy^Y4q;[S`Tv#ny WF:¥ŀG;dy'o_nSRUC,{{HYDJX  sV.%ןJ92I|R"[׎r1vF2z`(WQ}kK_r@ 꼢7p8V99dI]~=g<% 4fuq׉;٭g򜯛Gu=C{ץx-*I,FLHsս|:mqw_IKI# +r\9go 7tM3i`׷wz_ Ǯ %Ajoj_dyO:8%XH'8^9ïkܰwjױY|TqVNEWǟNQEr~-@tW1 O_KhERQEs`ђ=›{C~OS@lߓQ{C~OS@lߓQ{C~OS@lߓQ{C~OS@lߓQ{C~OS@lߓQ{C~OS@lߓQ{C~OS@lߓQ{C~OS@lߓQ{C~OS@lߓQ{C~OS@lߓQ{C~OS@lߓQ{C~OS@y X#f.ƫ{ҨDi: (A\;:뫞Ζτnc;^A؎GڌjOFubNQ]S>cͦ^iFp =GWd_:V-]39'f?::>_ΏE=#\QVg"ȿt{HG3Ed_:={#iyՙȿt}/违=Ñ4_Ώi~uuf}/违lz/Gp}?::>_ΏE=Gr>ƟGYlz/G"#9cOΣά϶E=EW|}-^fTdc1:_;u^ME(_ i|3+]+<\b>+]=TƉv]hu='0(;+K7o^%\¬H^k ğOmW׭_R$akrǢy|5*W]$SI? d J+?P]$SI? d J(#A ?gKKO?k'Q ğO4;?P]$SI? d J(#A ?gKKO?k'Q ğO4v]#S'.Y?¼Ќu0/>/o^4v~fV,xGnu|7a_7Nk:l+dࢡ"R*jwMӥd2Zna-fLs?j?%LJb6F A~a\H"߉;t\ֹcWFK_ fEaHP˷>ED,B.y5\I}?ꚏEa,M/2HE۴kNh1)F:i_!]_XI%fC X09G^ұ6] B/xSMu)[MK١HO7}rtP_zeE)[Cam;!W@WRBQ瓳^֧;IK+^vzI.-ZӼrO&Fs=a²j7¼>\f/#),Z gs5Zǡiy$ o=-/ZUh#o!6|u6OUgkڅvI$p*Lf@c9湯#ZYb2O\Va5_qvZy`lp.5;KlEyRҿ@C(*Ad޲\Jb&V7ph9x'٢/|Mii֒ĆI#F2Zu߈Kf/ ch&DFq/'æzZ7Fhgh},>篙PmxVR}ޠF{giqH"+4r@ X"5(nkVBGbTOk2ʄr+k}{ޏ}֡sE|d̄ɖxjH%r9$;K{ҨDisؤjM 7)Wc.yQNE7%O-΂(FI6Rs\T|wb+y/#brI5ejEnUh*?6?Uoozؔ?wn/MO?h*7ޏ7ޏJZd{&'ʏMO?xoGG%a[=m~OG&'ʼ70֭ ?'m~O^CkVrDQ ?' }}ġ?vGmDWybPfջ#ܿ6?Tm|z\+!~I8q\UB=lKH_6N+09?hNB?k,,FSw(\\{ eBv)o?oݚy˓UP"?E`*BLQHeNDаL_{ wrKTy3=lE\M:1 OƸ<'_ ms+VxD^1y:vI #`+Э)߱YW_8s?+񌌫?΢+5YJs*n:fu3RpӹXM58m̗4(0y9኱>7<)oZ뺲HPH\o!ʽDO?z/m7rEpHۂ[n4B\qxV:VG(o4A2^\@* ͪ6v`̸ : k'Tk& \zpqNpQnz#u|9ٿFs_Yסi~l'WOF7F;1]CMVఎFynp|YJ[[,c e.4gU]#F|;y8Xuu\~3sd^+_a4]kZ <>agO7z\ߧ)4w9%M#_\2]O$#p8X<ךssXkJ=.Vӣ[{iXvRjwx﨤ӿvhƿu3Dcԯ%BrAgws1\5/{84&7*a-g)}ޣ#9)\wTR+|Sicjpiz\|^U仮C~y|GO__?jǻ}*K1m);QL<;nU~z'{sMkþ_aal^|<ֿmR;E͏Æs3ԤMR4B 2uҝxGާ>}1vlq`}޺pBI]t9NAB6}OLhԓJ]􄽺f I8-qU?Wی-{Bǜd63 g7`[1i?m֏,ͦhE$ lN1氾6+O>~~_UORk_\}+vre.{waKy{iepmkva$_k vwZdC:}O9=n!}@ LhCUdՖ__0g}ۧ]?SľCC[LHL.9QܚMB2trǥb~1ռ+e]h0- 1Wnj.1%Zn7c 9#=j߰ ZޣM&Pn?wh~^f1ڬ[9!J=xK;[i^{=+0coKƬw\?NJ8h "b*qA" P^h2^\:42EY!rW3k;HoW?ͯe?݃wj ԋnmۯrߵ[[/i:u漭#j-xV7Y]@8?sV>KxRNd}\z`3`x cg&&۔\}J߰om4n֓>Y|n 9ty14_nߧ۟Q5;-tݻ/Qx[-)M20yf3Faq'SYzuY\^<@DeH\=>$z4Pg_s ?Y(D&ץeVUHFcwk^-sN8nOr:XI}\]=Ihvc=}Z^-4[efIQ9|`kӔJk]NMFTƥJ| \OoCqn%;# ֮Z* _?ۖk{)$` u'{|F\Zik˻vx$}0^8ҭtKLÿh/'۵+BTdp00=ɥ)c_ᵾ}~Ĩ } &EPɟo⼟G?5ϋIy/b/WNebS;{Λ?s5P]5گ⚊X,Wp+B66FJVʀs*q\1iI+q^Qzy?1'_CC7MY:ov8jز>E?U4`;|ZIjXX}f[ Ym >]=˩@'TJJGJ-DZjf)دcˣGwilG}k)Y$kyOcҽ7 -GRn')\'φ2?Mm37q׵ u2oRޙdUnb~xBĖz71RT8b";#T``.ty3Wn'5|9Is_Xָͩ~lp_?ᶢCre`$g5J9Í*:|F7VXʴv=<E+9$RV O:#'(8\=}jv8 Ԗ_n]%w&z'--Gy|?ij??WԞu?'!}{.!)W}w~.Ư \?ȗam?cW)QU5mC˫TtQExyƶ++v|?:~)l'R=WŸ]vv*q&-RIӛ*T点yշ /^?Uo/G+__ 7ԫ)QV+__V7 oWSΣέV7 |o@?0R'G[|o@?Z2Tha>_LO::Z2Tµe8}Juumµek}Qp1<<k}Q C *byyշ /GUo/G+__ 7ԫ)QV+__V7 oWS ’Ojcj0,3X} 5+ƽl6A%_EivaƁڪ¼LN lz 4SZ+=SoZk/ҹŠ}gV}?B*^E(Š(?iIx;#C׶?7_Ϳ|P #/̴o `AVQf5’[NNf׵?8xQe抟gBbkXjo3r(Oefi懨`v[nF228>{8Z+CnL~|F,%MX؏>Ogm!CwqkMZko \}hir[-}yQ*<qfV嘚ҴdtK2(΢KܒܒQבVRiJxp&kR%a%uMxGSRIBHFO!csסMy{n-cca=*9Z GSocw.2NNg9E(pJmϜ˹ٻFs_YN/ Ugm6? xg-7? i[ ' K(fY&N. 2klEi:vyi6H.=x%,!0,REpZcBIow}QJ7ntދKm}͞siW6IlWkIy-G 1К״M?[kuMon-$`!PngpN&=ZMlzr^~$6>xڲ"tGltkߟ]z?bi%nNCúeEhu,Ia4Q|rnyRqjSR5ړI;3Ѽ .j[m~;=s^FcMz JWV%*+;hcI ׇ?#$k=CN9A'G'^@:Mxs?O&: +ß4u ?(G I ׇ?#$hN9A'G'^@:Mxs?O&: +ß4u ?(G I ׇ?#$hN9A'G'^@:Mxs?O&: +ß4u ?(G I ׇ?#$hN9A'G'^@:M5u>Mԓh@:= FX UBԶՏ9U]COiJ ([A֫cqMz=[S>lOLs=+6Ymu sA*)2<Gjwcz X.c0\E)7|vx= M"LueM6:vZ4so$f@A nTׁKxoCCcFÕ-TqPB3c'֚*oMKTQEI'?< Ɨaӯ,2,<؅TGIڼ?TT_lQ]NIsM-XQ{.Z ?Hx|OI5|_W#R$-SRZ b=|_WGHx|OI4'j*k(}_?>'!O?U' CğO(a|Gt?TTG)ϖ?ƾآo+#R$-SRZ b=|_WG~ [,>ݧ_Yixs (:߽}E"գdp+u{-п\`9+A6FAl/CmK/ Ǹ{2, )?L~G NkCuxG^ ^4dxz޵'G3ƉA{VP2 div:not([class]) { height: 100%; width: 100%; display: block; } } iframe { width: 100%; height: calc(100% - 60px); display: block; } } .epytblock { .components-placeholder__fieldset { max-width: 100%; } } /*.edit-post-visual-editor .block-editor-block-list__block[data-type="epyt/youtube"] > div:first-child { padding-top: 16px; padding-bottom: 16px; } */ .wp-block { &[data-type="epyt/youtube"] { > div { &::after { content: ""; position: absolute; top: 0; left: 0; right: 0; bottom: 0; opacity: 0; cursor: pointer; } } &.is-selected > div, > div.components-placeholder { &::after { display: none; } } } }PKL\<<'youtube-embed-plus/src/block/style.scssnu[/** * #.# Styles * * CSS for both Frontend+Backend. */ PKL\-%%%youtube-embed-plus/src/block/block.jsnu[/* eslint-disable quotes */ /* eslint-disable space-in-parens */ /* eslint-disable valid-jsdoc */ /** * BLOCK: epyt/youtube * * Registering a basic block with Gutenberg. * Simple block, renders and saves the same content without any interactivity. */ // Import CSS. import "./style.scss"; import "./editor.scss"; const { __ } = wp.i18n; // Import __() from wp.i18n const { registerBlockType } = wp.blocks; // Import registerBlockType() from wp.blocks const { Component, Fragment } = wp.element; const { Button, Modal } = wp.components; const { serverSideRender: ServerSideRender } = wp; //const { withState } = wp.compose; import debounce from "lodash/debounce"; /** * Register: aa Gutenberg Block. * * Registers a new block provided a unique name and an object defining its * behavior. Once registered, the block is made editor as an option to any * editor interface where blocks are implemented. * * @link https://wordpress.org/gutenberg/handbook/block-api/ * @param {string} name Block name. * @param {Object} settings Block settings. * @return {?WPBlock} The block, if it has been successfully * registered; otherwise `undefined`. */ registerBlockType("epyt/youtube", { // Block name. Block names must be string that contains a namespace prefix. Example: my-plugin/my-custom-block. title: __("YouTube Wizard"), // Block title. // icon: ( YouTube Wizard Icon ), category: "embed", // Block category — Group blocks together based on common traits E.g. common, formatting, layout widgets, embed. keywords: [__("gallery"), __("live"), __("video")], // playlist description: __('Embed a video, playlist, channel, gallery, or live stream.'), attributes: { shortcode: { type: "string", default: "" } }, /** * The edit function describes the structure of your block in the context of the editor. * This represents what the editor will render when the block is used. * * The "edit" property must be a valid function. * * @link https://wordpress.org/gutenberg/handbook/block-api/block-edit-save/ */ edit: class extends Component { state = { show: false }; constructor(props) { super(...arguments); this.props = props; //this.onMessage = this.onMessage.bind(this); } componentDidMount() { window.addEventListener("message", this.onMessage); this.gbPreviewSetup("componentDidMount"); } componentDidUpdate() { this.gbPreviewSetup("componentDidUpdate"); } componentWillUnmount() { window.removeEventListener("message", this.onMessage); } showModal = () => { this.setState({ show: true }); }; hideModal = () => { this.setState({ show: false }); }; onMessage = e => { try { if ( e.data.indexOf("youtubeembedplus") === 0 && e.data.indexOf(this.props.clientId) > 0 ) { let embedcode = ""; embedcode = e.data.split("|")[1]; // if (embedcode.indexOf("[") !== 0) // { // embedcode = "

" + embedcode + "

"; // } this.props.setAttributes({ shortcode: embedcode.toString() }); this.hideModal(); // close modal this.gbPreviewSetup("onMessage"); } } catch (err) { } }; gbPreviewSetup = debounce(myContext => { setTimeout(() => { window._EPYTA_.gbPreviewSetup(); }, 1500); }, 50); render() { if (this.props.attributes.shortcode) { const ssr = ( ); return ssr; } return (
YouTube Wizard Icon YouTube Wizard
Click the button below to easily embed a video, playlist, channel, gallery, or live stream.
{this.state.show ? (
q = $search; $search_options->pageToken = null; ?>

title)) { echo 'Playlist: ' . sanitize_text_field($odata->title); } ?>

Insert as Playlist   Insert as Gallery   Customize (PRO)

Or Copy Code:

Playlist Layout: [embedyt] [/embedyt]

Gallery Layout: [embedyt] [/embedyt]

snippet->channelId); } } else { // channel id $chanmatch = array(); preg_match('@/channel/(.+)@', $search, $chanmatch); if (!empty($chanmatch)) { $thechannel = self::get_channel_snippet($chanmatch[1]); } } if ($thechannel) { $theplaylistid = $thechannel->contentDetails->relatedPlaylists->uploads; $rel = 'https://www.youtube.com/embed?listType=playlist&list=' . (esc_attr($theplaylistid)); ?>

snippet->title); ?>

Insert as Playlist   Insert as Gallery   Customize (PRO)

Or Copy Code:

Playlist Layout: [embedyt] [/embedyt]

Gallery Layout: [embedyt] [/embedyt]

snippet->channelId; } } else { // channel id $chanmatch = array(); preg_match('@/channel/(.+)@', $search, $chanmatch); if (!empty($chanmatch)) { $thechannelid = $chanmatch[1]; } } if (!empty($thechannelid)) { $rel = 'https://www.youtube.com/embed/live_stream?channel=' . (esc_attr($thechannelid)); $final_title = esc_url('https://www.youtube.com/channel/' . $thechannelid); $final_title_prefix = 'Live stream from channel'; $doing_live = true; ?>

Insert Into Editor   Customize (PRO)

  Or Copy Code: [embedyt] https://www.youtube.com/embed/live_stream?channel=[/embedyt]

id; $final_title = sanitize_text_field($live_attempt->snippet->title); $final_title_prefix = 'Live Stream'; } $rel = 'https://www.youtube.com/watch?v=' . (esc_attr($theytid)) . '&live=1'; $doing_live = true; ?>

snippet->title); ?>

Insert Into Editor   Customize (PRO)

Or Copy Code:

[embedyt] [/embedyt]

Is your live stream not working? Read more here: https://support.google.com/youtube/answer/2474026?hl=en', 'text_domain'); ?>

Check my general YouTube embedding instructions and settings.

Single video directions

https://www.youtube.com/watch?v=YVvn8dpSAt0 or https://www.youtube.com/shorts/J38Yq85ZoyY)', 'text_domain'); ?>

' . $step1_video_errors . '

' : ''; ?>

Note: You can also search YouTube videos by title in the text box above (example: TED talks). However, searching will use a significant amount of your YouTube API quota.

Embed a playlist.

Playlist directions

  1. Go to the page for the playlist that lists all of its videos (Example »).
  2. You may then click on the video that you want the playlist to start with (this step only applies to self-contained playlists. You cannot pick a starter for gallery layout directions).
  3. Copy the URL in your browser and paste it in the textbox below. You'll notice that a playlist URL contains the playlist ID (e.g. "PL...")
  4. Click "Get Playlist" to continue.
  1. Go to the page for the playlist that lists all of its videos (Example »).
  2. Copy the URL in your browser and paste it in the textbox below. You'll notice that a playlist URL contains the playlist ID (e.g. "PL...")
  3. Click "Get Playlist" to continue.
' . $step1_playlist_errors . '

' : ''; ?>

Embed a channel.

Channel directions

Example: https://www.youtube.com/channel/UCnM5iMGiKsZg-iOlIO2ZkdQ

Note: the following format will not work: https://www.youtube.com/c/customchannelname If you cannot locate the proper channel ID format above, then try the other method below.

', 'text_domain'); ?>

Or, simply enter a link to any single video that belongs to the user's channel, and the plugin will find the channel for you.
Example: https://www.youtube.com/watch?v=YVvn8dpSAt0

' . $step1_channel_errors . '

' : ''; ?>

Embed a live stream or premiere video.

Live stream or premiere directions

This will embed a specific live stream or premiere video.

  1. Paste in the direct URL of the live stream or premiere below and click Submit.
    Example: https://www.youtube.com/watch?v=5qap5aO4i9A
  2. On the next screen, customize or insert your video.
' . $step1_live_errors . '

' : ''; ?>

Unfortunately, Google has recently removed their YouTube API feature that used to support automatic channel-based live streams. It appears they won't change things back. However, you do have a couple of choices:

  1. Use "Direct link" live streams, as explained in the other tab. The trade-off is that you will have to manually post and take down your future live streams every time they start and when they end, respectively.
  2. Or upgrade to Pro, which has a solution that brings back all the "set it and forget it" features of channel-based embeds. We spent a significant amount of time developing a stable, long-term solution around YouTube's limitations, so we are releasing this effort exclusively to our Pro customers.
' . $step1_livechannel_errors . '

' : ''; ?>

Earn money embedding videos.

Check my performance, blocked countries, deleted videos, etc. (PRO)

0) { return true; } return false; } public static function get_live_snippet($channel) { $apiEndpoint = 'https://www.googleapis.com/youtube/v3/search?order=date&part=snippet&maxResults=1&type=video&eventType=live&safeSearch=none&videoEmbeddable=true&key=' . self::$alloptions[self::$opt_apikey] . '&channelId=' . urlencode($channel); $apiResult = wp_remote_get($apiEndpoint, array('timeout' => self::$curltimeout, 'headers' => array('referer' => site_url()))); if (is_wp_error($apiResult)) { return false; } $jsonResult = json_decode($apiResult['body']); if (isset($jsonResult->error)) { return false; } if (isset($jsonResult->items) && $jsonResult->items != null && is_array($jsonResult->items) && count($jsonResult->items)) { return $jsonResult->items[0]; } return false; } public static function get_video_snippet($vid) { $apiEndpoint = 'https://www.googleapis.com/youtube/v3/videos?part=snippet&maxResults=1&key=' . self::$alloptions[self::$opt_apikey] . '&id=' . urlencode($vid); $apiResult = wp_remote_get($apiEndpoint, array('timeout' => self::$curltimeout, 'headers' => array('referer' => site_url()))); if (is_wp_error($apiResult)) { return false; } $jsonResult = json_decode($apiResult['body']); if (isset($jsonResult->error)) { return false; } if (isset($jsonResult->items) && $jsonResult->items != null && is_array($jsonResult->items) && count($jsonResult->items)) { return $jsonResult->items[0]; } return false; } public static function get_channel_snippet($channid) { $apiEndpoint = 'https://www.googleapis.com/youtube/v3/channels?part=contentDetails,snippet&key=' . self::$alloptions[self::$opt_apikey] . '&id=' . urlencode($channid); $apiResult = wp_remote_get($apiEndpoint, array('timeout' => self::$curltimeout, 'headers' => array('referer' => site_url()))); if (is_wp_error($apiResult)) { return false; } $jsonResult = json_decode($apiResult['body']); if (isset($jsonResult->error)) { return false; } if (isset($jsonResult->items) && $jsonResult->items != null && is_array($jsonResult->items) && count($jsonResult->items)) { return $jsonResult->items[0]; } return false; } public static function clean_api_error($raw_message) { return htmlspecialchars(strip_tags(preg_replace('@&key=[^& ]+@i', '&key=*******', $raw_message)), ENT_QUOTES, 'UTF-8'); } public static function clean_api_error_html($raw_message, $add_boilerplate) { $clean_html = '
Sorry, there was a YouTube error.
'; if (current_user_can('manage_options')) { $clean_html = '
Sorry, there was a YouTube API error: ' . self::clean_api_error($raw_message) . '' . ( $add_boilerplate ? self::$boilerplate_api_error_message : '' ) . '
'; } return $clean_html; } public static function get_search_page($options) { $gallobj = new stdClass(); $pageSize = 30; if (!self::has_api_key()) { $gallobj->html = '
' . str_replace('###', 'search', self::$get_api_key_msg) . '
'; return $gallobj; } $apiEndpoint = 'https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=' . $pageSize . '&type=video&safeSearch=none&videoEmbeddable=true&key=' . self::$alloptions[self::$opt_apikey] . '&q=' . urlencode($options->q); if (!empty($options->pageToken)) { $apiEndpoint .= '&pageToken=' . $options->pageToken; } $code = ''; $apiResult = wp_remote_get($apiEndpoint, array('timeout' => self::$curltimeout, 'headers' => array('referer' => site_url()))); if (is_wp_error($apiResult)) { $gallobj->html = self::clean_api_error_html($apiResult->get_error_message(), true); return $gallobj; } $jsonResult = json_decode($apiResult['body']); if (isset($jsonResult->error)) { if (isset($jsonResult->error->message)) { $gallobj->html = self::clean_api_error_html($jsonResult->error->message, true); return $gallobj; } $gallobj->html = '
Sorry, there may be an issue with your YouTube API key. ' . self::$boilerplate_api_error_message . '
'; return $gallobj; } $totalResults = $jsonResult->pageInfo->totalResults; $nextPageToken = ''; $prevPageToken = ''; if (isset($jsonResult->nextPageToken)) { $nextPageToken = $jsonResult->nextPageToken; } if (isset($jsonResult->prevPageToken)) { $prevPageToken = $jsonResult->prevPageToken; } $cnt = 0; $code .= '
'; if (isset($jsonResult->items) && $jsonResult->items != null && is_array($jsonResult->items)) { foreach ($jsonResult->items as $item) { $thumb = new stdClass(); $thumb->id = isset($item->snippet->resourceId->videoId) ? $item->snippet->resourceId->videoId : null; $thumb->id = $thumb->id ? $thumb->id : (isset($item->id->videoId) ? $item->id->videoId : null); if ($thumb->id) { $thumb->title = $item->snippet->title; if (isset($item->snippet->thumbnails->high->url)) { $thumb->img = $item->snippet->thumbnails->high->url; $thumb->quality = 'high'; } elseif (isset($item->snippet->thumbnails->default->url)) { $thumb->img = $item->snippet->thumbnails->default->url; $thumb->quality = 'default'; } elseif (isset($item->snippet->thumbnails->medium->url)) { $thumb->img = $item->snippet->thumbnails->medium->url; $thumb->quality = 'medium'; } else { $thumb->img = plugins_url('/images/deleted-video-thumb.png', __FILE__); $thumb->quality = 'medium'; } $code .= self::get_search_result_html($thumb, $options); $cnt++; $code .= '
'; } } } $code .= '
'; $totalPages = ceil($totalResults / $pageSize); $pagination = '
'; $txtprev = self::$alloptions[self::$opt_gallery_customarrows] ? self::$alloptions[self::$opt_gallery_customprev] : _('Prev'); $pagination .= '
«
' . $txtprev . '
'; $pagination .= '
'; $pagination .= '
1
/
' . $totalPages . '
'; $pagination .= '
'; $txtnext = self::$alloptions[self::$opt_gallery_customarrows] ? self::$alloptions[self::$opt_gallery_customnext] : _('Next'); $pagination .= '
' . $txtnext . '
»
'; $pagination .= '
loading
'; $pagination .= '
'; $code = $pagination . $code . $pagination; $gallobj->html = $code; return $gallobj; } public static function get_search_result_html($thumb, $options) { $get_pro_link = self::$epbase . '/dashboard/pro-easy-video-analytics.aspx?ref=searchresult'; $escId = esc_attr($thumb->id); $code = ''; $code .= '
' . sanitize_text_field($thumb->title) . '

Customize (PRO)   Insert Into Editor

  Or Copy Code: [embedyt] https://www.youtube.com/watch?v=' . $escId . '[/embedyt]
'; return $code; } public static function user_in_roles_any($user, $roles) { foreach ($user->roles as $idx => $r) { if (in_array($r, $roles)) { return true; } } return false; } public static function is_restrict_wizard() { $curr_user = wp_get_current_user(); if ( $curr_user->ID // logged in && isset(self::$alloptions[self::$opt_restrict_wizard]) && self::$alloptions[self::$opt_restrict_wizard] == 1 // restricting && is_array(self::$alloptions[self::$opt_restrict_wizard_roles]) && !self::user_in_roles_any($curr_user, self::$alloptions[self::$opt_restrict_wizard_roles]) ) { return true; } return false; } public static function media_button_wizard() { if (self::is_restrict_wizard()) { return; } add_thickbox(); $wizhref = admin_url('admin.php?page=youtube-ep-wizard') . '&random=' . rand(1, 1000) . '&TB_iframe=true&width=950&height=800'; ?> YouTube Video Ad ' . $_SERVER['QUERY_STRING'] .'
'; if ($pagenow == 'plugins.php' || strpos($_SERVER['QUERY_STRING'], 'youtube-my-preferences') !== false || strpos($_SERVER['QUERY_STRING'], 'embedplus-video-analytics-dashboard') !== false || strpos($_SERVER['QUERY_STRING'], 'youtube-ep-analytics-dashboard') !== false || strpos($_SERVER['QUERY_STRING'], 'embedplus-official-options') !== false) { ?>

×'; } ?> Seems like you have two different YouTube plugins by the EmbedPlus Team installed: YouTube and Advanced YouTube Embed. We strongly suggest keeping only the one you prefer, so that they don't conflict with each other while trying to create your embeds.

options . " set autoload = 'no' where option_name like '" . self::$opt_alloptions . "\_backup\_%'"; $wpdb->query($sql); } // backup settings for migration if (isset($arroptions[self::$opt_pro]) && strlen(trim($arroptions[self::$opt_pro])) > 10) { add_option(self::$opt_alloptions . '_migrate', $arroptions); } //vanilla defaults $_center = 0; $_glance = 0; $_autoplay = 0; $_cc_load_policy = 0; $_cc_lang_pref = ''; $_iv_load_policy = 1; $_loop = 0; $_modestbranding = 0; $_rel = 1; $_fs = 1; $_theme = 'dark'; $_color = 'red'; $_autohide = 2; $_pro = ''; $_nocookie = 0; $_gb_compat = 1; $_facade_mode = 0; $_facade_autoplay = 1; $_gdpr_consent = 0; $_gdpr_consent_message = self::$dft_gdpr_consent_message; $_gdpr_consent_button = 'Accept YouTube Content'; $_playlistorder = 0; $_acctitle = 0; $_migrate = 0; $_migrate_youtube = 0; $_migrate_embedplusvideo = 0; $_controls = 1; $_oldspacing = 1; $_frontend_only = 1; $_responsive = 0; $_responsive_all = 1; $_widgetfit = 1; $_evselector_light = 0; $_stop_mobile_buffer = 1; $_restrict_wizard = 0; $_restrict_wizard_roles = self::$dft_roles; $_ajax_compat = 0; $_maxres_facade = 'eager'; $_ytapi_load = 'light'; $_defaultdims = 1; $_defaultwidth = isset($GLOBALS['content_width']) && is_numeric($GLOBALS['content_width']) ? intval($GLOBALS['content_width']) : 800; $_defaultheight = intval($_defaultwidth * 9.0 / 16.0); $_playsinline = 0; $_origin = 0; $_pause_others = 0; $_defaultvol = 0; $_vol = ''; $_apikey = ''; $_hl = ''; $_dohl = 0; $_gallery_columns = 3; $_gallery_collapse_grid = 0; $_gallery_collapse_grid_breaks = self::$dft_bpts; $_gallery_scrolloffset = 20; $_gallery_hideprivate = 1; $_gallery_showtitle = 1; $_gallery_showpaging = 1; $_gallery_autonext = 0; $_gallery_thumbplay = 1; $_gallery_channelsub = 0; $_gallery_channelsublink = ''; $_gallery_channelsubtext = 'Subscribe to my channel'; $_gallery_customarrows = 0; $_gallery_customprev = 'Prev'; $_gallery_customnext = 'Next'; $_gallery_pagesize = 15; $_not_live_content = ''; $_not_live_on = 0; $_not_live_on_channel = 0; $_debugmode = 0; $_uninstall_data = 0; $_admin_off_scripts = 0; $_defer_js = 0; $_defer_jquery = 0; $_ajax_save = 1; $_show_pointer = 1; $_onboarded = 0; $_old_script_method = 0; $_vi_active = 0; $_vi_hide_monetize_tab = 0; $_vi_endpoints = ''; $_vi_token = ''; $_vi_last_login = self::$vi_default_date; $_vi_last_category_update = self::$vi_default_date; $_vi_adstxt = ''; $_vi_js_settings = self::$vi_dft_js_settings; $_vi_js_script = ''; $_vi_js_posttypes = array(); $_vi_js_position = 'top'; $_vi_show_gdpr_authorization = 1; $_vi_show_privacy_button = 0; //update vanilla to previous settings if exists if ($arroptions !== false) { $_center = self::tryget($arroptions, self::$opt_center, 0); $_glance = self::tryget($arroptions, self::$opt_glance, $_glance); $_autoplay = self::tryget($arroptions, self::$opt_autoplay, 0); $_debugmode = self::tryget($arroptions, self::$opt_debugmode, 0); $_uninstall_data = self::tryget($arroptions, self::$opt_uninstall_data, 0); $_old_script_method = self::tryget($arroptions, self::$opt_old_script_method, 0); $_cc_load_policy = self::tryget($arroptions, self::$opt_cc_load_policy, 0); $_cc_lang_pref = self::tryget($arroptions, self::$opt_cc_lang_pref, $_cc_lang_pref); $_iv_load_policy = self::tryget($arroptions, self::$opt_iv_load_policy, 1); $_loop = self::tryget($arroptions, self::$opt_loop, 0); $_modestbranding = self::tryget($arroptions, self::$opt_modestbranding, 0); $_rel = self::tryget($arroptions, self::$opt_rel, 1); $_fs = self::tryget($arroptions, self::$opt_fs, 1); $_playsinline = self::tryget($arroptions, self::$opt_playsinline, 0); $_origin = self::tryget($arroptions, self::$opt_origin, 1); $_hl = self::tryget($arroptions, self::$opt_hl, ''); $_dohl = self::tryget($arroptions, self::$opt_dohl, 0); $_theme = self::tryget($arroptions, self::$opt_theme, 'dark'); $_color = self::tryget($arroptions, self::$opt_color, 'red'); $_autohide = self::tryget($arroptions, self::$opt_autohide, 2); $_pro = self::tryget($arroptions, self::$opt_pro, ''); $_nocookie = self::tryget($arroptions, self::$opt_nocookie, 0); $_gb_compat = self::tryget($arroptions, self::$opt_gb_compat, $_gb_compat); $_facade_mode = self::tryget($arroptions, self::$opt_facade_mode, $_facade_mode); $_facade_autoplay = self::tryget($arroptions, self::$opt_facade_autoplay, $_facade_autoplay); $_gdpr_consent = self::tryget($arroptions, self::$opt_gdpr_consent, $_gdpr_consent); $_gdpr_consent_message = self::tryget($arroptions, self::$opt_gdpr_consent_message, $_gdpr_consent_message); $_gdpr_consent_button = self::tryget($arroptions, self::$opt_gdpr_consent_button, $_gdpr_consent_button); $_playlistorder = self::tryget($arroptions, self::$opt_playlistorder, 0); $_acctitle = self::tryget($arroptions, self::$opt_acctitle, 0); $_migrate = self::tryget($arroptions, self::$opt_migrate, 0); $_migrate_youtube = self::tryget($arroptions, self::$opt_migrate_youtube, 0); $_migrate_embedplusvideo = self::tryget($arroptions, self::$opt_migrate_embedplusvideo, 0); $_controls = self::tryget($arroptions, self::$opt_controls, 1); $_controls = $_controls == 2 ? 1 : $_controls; $_oldspacing = self::tryget($arroptions, self::$opt_oldspacing, 1); $_frontend_only = self::tryget($arroptions, self::$opt_frontend_only, $_frontend_only); $_responsive = self::tryget($arroptions, self::$opt_responsive, $_responsive); $_responsive_all = self::tryget($arroptions, self::$opt_responsive_all, $_responsive_all); $_widgetfit = self::tryget($arroptions, self::$opt_widgetfit, 1); $_evselector_light = self::tryget($arroptions, self::$opt_evselector_light, 0); $_stop_mobile_buffer = self::tryget($arroptions, self::$opt_stop_mobile_buffer, 1); $_restrict_wizard = self::tryget($arroptions, self::$opt_restrict_wizard, 0); $_restrict_wizard_roles = self::tryget($arroptions, self::$opt_restrict_wizard_roles, self::$dft_roles); $_ajax_compat = self::tryget($arroptions, self::$opt_ajax_compat, 0); $_maxres_facade = self::tryget($arroptions, self::$opt_maxres_facade, $_maxres_facade); $_ytapi_load = self::tryget($arroptions, self::$opt_ytapi_load, $_ytapi_load); $_defaultdims = self::tryget($arroptions, self::$opt_defaultdims, $_defaultdims); $_defaultwidth = self::tryget($arroptions, self::$opt_defaultwidth, $_defaultwidth); $_defaultheight = self::tryget($arroptions, self::$opt_defaultheight, $_defaultheight); $_pause_others = self::tryget($arroptions, self::$opt_pause_others, $_pause_others); $_defaultvol = self::tryget($arroptions, self::$opt_defaultvol, 0); $_vol = self::tryget($arroptions, self::$opt_vol, ''); $_apikey = self::tryget($arroptions, self::$opt_apikey, ''); $_gallery_pagesize = self::tryget($arroptions, self::$opt_gallery_pagesize, 15); $_gallery_columns = self::tryget($arroptions, self::$opt_gallery_columns, 3); $_gallery_collapse_grid = self::tryget($arroptions, self::$opt_gallery_collapse_grid, 0); $_gallery_collapse_grid_breaks = self::tryget($arroptions, self::$opt_gallery_collapse_grid_breaks, self::$dft_bpts); $_gallery_scrolloffset = self::tryget($arroptions, self::$opt_gallery_scrolloffset, 20); $_gallery_hideprivate = self::tryget($arroptions, self::$opt_gallery_hideprivate, $_gallery_hideprivate); $_gallery_showtitle = self::tryget($arroptions, self::$opt_gallery_showtitle, 1); $_gallery_showpaging = self::tryget($arroptions, self::$opt_gallery_showpaging, 1); $_gallery_autonext = self::tryget($arroptions, self::$opt_gallery_autonext, 0); $_gallery_thumbplay = self::tryget($arroptions, self::$opt_gallery_thumbplay, 1); $_gallery_channelsub = self::tryget($arroptions, self::$opt_gallery_channelsub, $_gallery_channelsub); $_gallery_channelsublink = self::tryget($arroptions, self::$opt_gallery_channelsublink, $_gallery_channelsublink); $_gallery_channelsubtext = self::tryget($arroptions, self::$opt_gallery_channelsubtext, $_gallery_channelsubtext); $_gallery_customarrows = self::tryget($arroptions, self::$opt_gallery_customarrows, $_gallery_customarrows); $_gallery_customnext = self::tryget($arroptions, self::$opt_gallery_customnext, $_gallery_customnext); $_gallery_customprev = self::tryget($arroptions, self::$opt_gallery_customprev, $_gallery_customprev); $_not_live_content = self::tryget($arroptions, self::$opt_not_live_content, $_not_live_content); $_not_live_content = empty($_not_live_content) ? $_not_live_content : trim($_not_live_content); $_not_live_on = self::tryget($arroptions, self::$opt_not_live_on, empty($_not_live_content) ? 0 : $_not_live_on); $_not_live_on_channel = self::tryget($arroptions, self::$opt_not_live_on_channel, $_not_live_on_channel); $_admin_off_scripts = self::tryget($arroptions, self::$opt_admin_off_scripts, $_admin_off_scripts); $_defer_js = self::tryget($arroptions, self::$opt_defer_js, $_defer_js); $_defer_jquery = self::tryget($arroptions, self::$opt_defer_jquery, $_defer_jquery); $_ajax_save = self::tryget($arroptions, self::$opt_ajax_save, $_ajax_save); $_show_pointer = self::tryget($arroptions, self::$opt_show_pointer, $_show_pointer); $_onboarded = 0; // self::tryget($arroptions, self::$opt_onboarded, $_onboarded); $_vi_active = self::tryget($arroptions, self::$opt_vi_active, $_vi_active); $_vi_hide_monetize_tab = self::tryget($arroptions, self::$opt_vi_hide_monetize_tab, $_vi_hide_monetize_tab); $_vi_endpoints = self::tryget($arroptions, self::$opt_vi_endpoints, $_vi_endpoints); $_vi_token = self::tryget($arroptions, self::$opt_vi_token, $_vi_token); $_vi_last_login = self::tryget($arroptions, self::$opt_vi_last_login, $_vi_last_login); $_vi_last_category_update = self::tryget($arroptions, self::$opt_vi_last_category_update, $_vi_last_category_update); $_vi_adstxt = self::tryget($arroptions, self::$opt_vi_adstxt, $_vi_adstxt); $_vi_js_settings = self::tryget($arroptions, self::$opt_vi_js_settings, self::$vi_dft_js_settings); $_vi_js_script = self::tryget($arroptions, self::$opt_vi_js_script, $_vi_js_script); $_vi_js_posttypes = self::tryget($arroptions, self::$opt_vi_js_posttypes, $_vi_js_posttypes); $_vi_js_position = self::tryget($arroptions, self::$opt_vi_js_position, $_vi_js_position); $_vi_show_gdpr_authorization = self::tryget($arroptions, self::$opt_vi_show_gdpr_authorization, $_vi_show_gdpr_authorization); $_vi_show_privacy_button = self::tryget($arroptions, self::$opt_vi_show_privacy_button, $_vi_show_privacy_button); } else { $_oldspacing = 0; } $all = array( self::$opt_version => self::$version, self::$opt_center => $_center, self::$opt_glance => $_glance, self::$opt_autoplay => $_autoplay, self::$opt_cc_load_policy => $_cc_load_policy, self::$opt_cc_lang_pref => $_cc_lang_pref, self::$opt_iv_load_policy => $_iv_load_policy, self::$opt_loop => $_loop, self::$opt_modestbranding => $_modestbranding, self::$opt_rel => $_rel, self::$opt_fs => $_fs, self::$opt_playsinline => $_playsinline, self::$opt_origin => $_origin, self::$opt_autohide => $_autohide, self::$opt_hl => $_hl, self::$opt_dohl => $_dohl, self::$opt_theme => $_theme, self::$opt_color => $_color, self::$opt_pro => $_pro, self::$opt_nocookie => $_nocookie, self::$opt_gb_compat => $_gb_compat, self::$opt_facade_mode => $_facade_mode, self::$opt_facade_autoplay => $_facade_autoplay, self::$opt_gdpr_consent => $_gdpr_consent, self::$opt_gdpr_consent_message => $_gdpr_consent_message, self::$opt_gdpr_consent_button => $_gdpr_consent_button, self::$opt_playlistorder => $_playlistorder, self::$opt_acctitle => $_acctitle, self::$opt_migrate => $_migrate, self::$opt_migrate_youtube => $_migrate_youtube, self::$opt_migrate_embedplusvideo => $_migrate_embedplusvideo, self::$opt_controls => $_controls, self::$opt_oldspacing => $_oldspacing, self::$opt_frontend_only => $_frontend_only, self::$opt_responsive => $_responsive, self::$opt_responsive_all => $_responsive_all, self::$opt_widgetfit => $_widgetfit, self::$opt_evselector_light => $_evselector_light, self::$opt_stop_mobile_buffer => $_stop_mobile_buffer, self::$opt_restrict_wizard => $_restrict_wizard, self::$opt_restrict_wizard_roles => $_restrict_wizard_roles, self::$opt_ajax_compat => $_ajax_compat, self::$opt_maxres_facade => $_maxres_facade, self::$opt_ytapi_load => $_ytapi_load, self::$opt_defaultdims => $_defaultdims, self::$opt_defaultwidth => $_defaultwidth, self::$opt_defaultheight => $_defaultheight, self::$opt_pause_others => $_pause_others, self::$opt_defaultvol => $_defaultvol, self::$opt_vol => $_vol, self::$opt_apikey => $_apikey, self::$opt_gallery_columns => $_gallery_columns, self::$opt_gallery_collapse_grid => $_gallery_collapse_grid, self::$opt_gallery_collapse_grid_breaks => $_gallery_collapse_grid_breaks, self::$opt_gallery_scrolloffset => $_gallery_scrolloffset, self::$opt_gallery_hideprivate => $_gallery_hideprivate, self::$opt_gallery_showtitle => $_gallery_showtitle, self::$opt_gallery_showpaging => $_gallery_showpaging, self::$opt_gallery_autonext => $_gallery_autonext, self::$opt_gallery_thumbplay => $_gallery_thumbplay, self::$opt_gallery_channelsub => $_gallery_channelsub, self::$opt_gallery_channelsublink => $_gallery_channelsublink, self::$opt_gallery_channelsubtext => $_gallery_channelsubtext, self::$opt_gallery_customarrows => $_gallery_customarrows, self::$opt_gallery_customnext => $_gallery_customnext, self::$opt_gallery_customprev => $_gallery_customprev, self::$opt_gallery_pagesize => $_gallery_pagesize, self::$opt_not_live_content => $_not_live_content, self::$opt_not_live_on => $_not_live_on, self::$opt_not_live_on_channel => $_not_live_on_channel, self::$opt_debugmode => $_debugmode, self::$opt_uninstall_data => $_uninstall_data, self::$opt_admin_off_scripts => $_admin_off_scripts, self::$opt_defer_js => $_defer_js, self::$opt_defer_jquery => $_defer_jquery, self::$opt_ajax_save => $_ajax_save, self::$opt_show_pointer => $_show_pointer, self::$opt_onboarded => $_onboarded, self::$opt_old_script_method => $_old_script_method, self::$opt_vi_active => $_vi_active, self::$opt_vi_hide_monetize_tab => $_vi_hide_monetize_tab, self::$opt_vi_endpoints => $_vi_endpoints, self::$opt_vi_token => $_vi_token, self::$opt_vi_last_login => $_vi_last_login, self::$opt_vi_last_category_update => $_vi_last_category_update, self::$opt_vi_adstxt => $_vi_adstxt, self::$opt_vi_js_settings => $_vi_js_settings, self::$opt_vi_js_script => $_vi_js_script, self::$opt_vi_js_posttypes => $_vi_js_posttypes, self::$opt_vi_js_position => $_vi_js_position, self::$opt_vi_show_gdpr_authorization => $_vi_show_gdpr_authorization, self::$opt_vi_show_privacy_button => $_vi_show_privacy_button ); update_option(self::$opt_alloptions, $all); update_option('embed_autourls', 1); self::$alloptions = get_option(self::$opt_alloptions); } public static function tryget($array, $key, $default = null) { return isset($array[$key]) ? $array[$key] : $default; } public static function wp_above_version($ver) { global $wp_version; if (version_compare($wp_version, $ver, '>=')) { return true; } return false; } public static function do_ytprefs() { //add_filter('autoptimize_filter_js_exclude', array(self::class, 'ao_override_jsexclude'), 10, 1); if ( !is_admin() || (self::$alloptions[self::$opt_frontend_only] != 1) //|| (function_exists('wp_doing_ajax') && wp_doing_ajax()) ) { add_filter('the_content', array(self::class, 'apply_prefs_content'), 1); add_filter('widget_text', array(self::class, 'apply_prefs_widget'), 1); //add_filter('bjll/skip_classes', array(self::class, 'bjll_skip_classes'), 10, 2); add_filter('sgo_lazy_load_exclude_classes', array(self::class, 'exclude_lazy_sgo')); add_shortcode('embedyt', array(self::class, 'apply_prefs_shortcode')); if (self::$alloptions[self::$opt_migrate] == 1) { if (self::$alloptions[self::$opt_migrate_youtube] == 1) { add_shortcode('youtube', array(self::class, 'apply_prefs_shortcode_youtube')); add_shortcode('youtube_video', array(self::class, 'apply_prefs_shortcode_youtube')); } if (self::$alloptions[self::$opt_migrate_embedplusvideo] == 1) { add_shortcode('embedplusvideo', array(self::class, 'apply_prefs_shortcode_embedplusvideo')); } } } if (self::$alloptions[self::$opt_defer_js] == 1) { add_filter('script_loader_tag', array(self::class, 'defer_scripts'), 10, 3); } } public static function ao_override_jsexclude($exclude) { if (strpos($exclude, 'ytprefs' . self::$min . '.js') === false) { return $exclude . ',ytprefs' . self::$min . '.js,__ytprefs__'; } return $exclude; } public static function exclude_lazy_sgo($classes) { $classes[] = '__youtube_prefs__'; return $classes; } public static function apply_prefs_shortcode($atts, $content = null) { $content = trim($content); $currfilter = current_filter(); if (preg_match(self::$justurlregex, $content)) { return self::get_html(array($content), strpos($currfilter, 'widget_text') === 0 ? false : true, false); } return ''; } public static function apply_prefs_shortcode_youtube($atts, $content = null) { $content = 'https://www.youtube.com/watch?v=' . trim($content); $currfilter = current_filter(); if (preg_match(self::$justurlregex, $content)) { return self::get_html(array($content), $currfilter == 'widget_text' ? false : true, false); } return ''; } public static function apply_prefs_shortcode_embedplusvideo($atts, $content = null) { $atts = shortcode_atts(array( "height" => self::$defaultheight, "width" => self::$defaultwidth, "vars" => "", "standard" => "", "id" => "ep" . rand(10000, 99999) ), $atts); $epvars = $atts['vars']; $epvars = preg_replace('/\s/', '', $epvars); $epvars = preg_replace('/¬/', '¬', $epvars); $epvars = str_replace('&', '&', $epvars); $epparams = self::keyvalue($epvars, true); if (isset($epparams) && isset($epparams['ytid'])) { $start = isset($epparams['start']) && is_numeric($epparams['start']) ? '&start=' . intval($epparams['start']) : ''; $end = isset($epparams['end']) && is_numeric($epparams['end']) ? '&end=' . intval($epparams['end']) : ''; $end = isset($epparams['stop']) && is_numeric($epparams['stop']) ? '&end=' . intval($epparams['stop']) : ''; $url = 'https://www.youtube.com/watch?v=' . trim($epparams['ytid']) . $start . $end; $currfilter = current_filter(); if (preg_match(self::$justurlregex, $url)) { return self::get_html(array($url), $currfilter == 'widget_text' ? false : true, false); } } return ''; } public static function apply_prefs_content($content) { $content = preg_replace_callback(self::$ytregex, array(self::class, "get_html_content"), $content); return $content; } public static function apply_prefs_widget($content) { $content = preg_replace_callback(self::$ytregex, array(self::class, "get_html_widget"), $content); return $content; } public static function get_html_content($m) { return self::get_html($m, true, true); } public static function get_html_widget($m) { return self::get_html($m, false, true); } public static function get_gallery_page($options) { $gallobj = new stdClass(); $options->pageSize = min(intval($options->pageSize), 50); $options->columns = intval($options->columns) == 0 ? 3 : intval($options->columns); $options->showTitle = intval($options->showTitle); $options->showPaging = intval($options->showPaging); $options->autonext = intval($options->autonext); $options->thumbplay = intval($options->thumbplay); if (empty($options->apiKey)) { $gallobj->html = '
Please enter your YouTube API key to embed galleries.
'; return $gallobj; } $apiEndpoint = 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet,status&playlistId=' . $options->playlistId . '&maxResults=' . $options->pageSize . '&key=' . $options->apiKey; if ($options->pageToken != null) { $apiEndpoint .= '&pageToken=' . $options->pageToken; } $code = ''; $init_id = null; $apiResult = wp_remote_get($apiEndpoint, array('timeout' => self::$curltimeout, 'headers' => array('referer' => site_url()))); if (is_wp_error($apiResult)) { $gallobj->html = self::clean_api_error_html($apiResult->get_error_message(), true); return $gallobj; } if (self::$alloptions[self::$opt_debugmode] == 1 && current_user_can('manage_options')) { $redactedEndpoint = preg_replace('@&key=[^&]+@i', '&key=PRIVATE', $apiEndpoint); $active_plugins = get_option('active_plugins'); $gallobj->html = '
CLICK this debug text to auto-select all. Then, COPY the selection.' . "\n\n" .
                    'THIS IS DEBUG MODE OUTPUT. UNCHECK THE OPTION IN THE SETTINGS PAGE ONCE YOU ARE DONE DEBUGGING TO PUT THINGS BACK TO NORMAL.' . "\n\n" . $redactedEndpoint . "\n\n" . print_r($apiResult, true) . "\n\nActive Plugins\n\n" . print_r($active_plugins, true) . '
'; return $gallobj; } $jsonResult = json_decode($apiResult['body']); if (isset($jsonResult->error)) { if (isset($jsonResult->error->message)) { $gallobj->html = self::clean_api_error_html($jsonResult->error->message, true); return $gallobj; } $gallobj->html = '
Sorry, there may be an issue with your YouTube API key. ' . self::$boilerplate_api_error_message . '
'; return $gallobj; } $resultsPerPage = $options->pageSize; // $jsonResult->pageInfo->resultsPerPage; $totalResults = $jsonResult->pageInfo->totalResults; $nextPageToken = ''; $prevPageToken = ''; if (isset($jsonResult->nextPageToken)) { $nextPageToken = $jsonResult->nextPageToken; } if (isset($jsonResult->prevPageToken)) { $prevPageToken = $jsonResult->prevPageToken; } $cnt = 0; $colclass = ' epyt-cols-' . $options->columns . ' '; $code .= ''; $totalPages = ceil($totalResults / $resultsPerPage); $pagination = '
'; $txtprev = self::$alloptions[self::$opt_gallery_customarrows] ? self::$alloptions[self::$opt_gallery_customprev] : _('Prev'); $pagination .= '
«
' . $txtprev . '
'; $pagination .= '
'; $pagination .= '
1
/
' . $totalPages . '
'; $pagination .= '
'; $txtnext = self::$alloptions[self::$opt_gallery_customarrows] ? self::$alloptions[self::$opt_gallery_customnext] : _('Next'); $pagination .= '
' . $txtnext . '
»
'; $pagination .= '
loading
'; $pagination .= '
'; // if ($options->showPaging == 0) // { // $pagination = '
'; // } $code = $pagination . $code . $pagination; $gallobj->html = $code; $gallobj->init_id = $init_id; return $gallobj; } public static function compare_vid_date($a, $b) { if ($a->snippet->publishedAt == $b->snippet->publishedAt) { return 0; } return ($a->snippet->publishedAt > $b->snippet->publishedAt) ? -1 : 1; } public static function get_thumbnail_html($thumb, $options) { $escId = esc_attr($thumb->id); $code = ''; $code .= '

'; // ooopointer $new_pointer_content .= '

'; // ooopointer $new_pointer_content .= "This update fixes issues with the channel-based automatic live stream detection feature for the Pro version, and provides better compatibility with PHP 8.3+ for both Free and Pro versions.'; if (self::vi_logged_in()) { $new_pointer_content .= "

Note: You are currently logged into the vi intelligence feature. vi support is being deprecated in the next version, so we recommend taking the vi ads down from your site. Please contact ext@embedplus.com for questions."; } if (!empty(self::$alloptions[self::$opt_pro]) && strlen(trim(self::$alloptions[self::$opt_pro])) > 0) { $new_pointer_content .= ' Important message to YouTube Pro users: From version 11.7 onward, you must download the separate plugin here to regain your Pro features. All your settings will automatically migrate after installing the separate Pro download. Thank you for your support and patience during this transition.'; } $new_pointer_content .= '

'; return array( $prefix . 'new_items' => array( 'content' => $new_pointer_content, 'anchor_id' => 'a.toplevel_page_youtube-my-preferences', //'#ytprefs_glance_button', 'edge' => 'top', 'align' => 'left', 'active' => (!in_array($prefix . 'new_items', $dismissed)) ), ); } public static function postchecked($idx) { return isset($_POST[$idx]) && $_POST[$idx] == (true || 'on'); } public static function settings_nav() { ?>

YouTube API Key

Some features (such as galleries, and some wizard features) now require you to create a free YouTube API key from Google. The instructions for this are very specific, so we created a video for you that's hopefully easy to follow: Click this link and follow the steps on the page. Then save your API key below.

YouTube API Key:

type="checkbox" class="checkbox"> Show "At a Glance" Embed Links on the dashboard homepage.') ?>

type="checkbox" class="checkbox"> Automatically center all your videos (not necessary if all your videos span the whole width of your blog).') ?>

type="checkbox" class="checkbox"> Automatically start playing your videos.') ?> Note: If you're embedding videos from your own monetized YouTube channel, we advise you to read YouTube's resource page on ads on embedded videos: https://support.google.com/youtube/answer/132596?hl=en You'll see that videos that you want to monetize "should be embedded using the standard click-to-play embed and NOT a scripted play." Unchecking this option guarantees standard click-to-play gallery embedding. (Another Note: Desktop browsers like Chrome and Safari are moving towards preventing autoplay for any video. But, your chances are improved if you set your videos to initially start muted.)

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

>    >    >   

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox"> Width:   Height:

type="checkbox" class="checkbox">

>    >

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox"> Volume:

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

Select the preferred default language for closed captions (when available).

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

Use "Not Live" Fallback Content For Live Streams: (More info here) This feature lets you display alternate content if your live stream is not currently active. This feature works for direct link live streams (more info about channel-based live streams below).

type="checkbox" class="checkbox">

"Not Live" Fallback Content:

7)); ?>

Security Options

type="checkbox" class="checkbox">
$role) { ?>

type="checkbox" class="checkbox">

Privacy Options

These options may help with privacy restrictions such as GDPR and the EU Cookie Law.

YouTube API Loading: Choose when to load the YouTube API. The "Restricted" or "Never" options will help with GDPR compliance:

type="checkbox" class="checkbox"> Note: If your visitors click a red accept button but your site doesn't reveal the video, you probably have a caching plugin. There should be a setting in your caching plugin to prevent caching the consent cookie. The name of the consent cookie is: ytprefs_gdpr_consent

22, 'media_buttons' => false, 'teeny' => true )); ?>

Example of message and button:

GDPR Consent Message Example


type="checkbox" class="checkbox">

Note: Checking this option may introduce issues to features that depend YouTube's API, such as the ones listed below. We suggest testing them out to make sure you are still pleased with the results:
  • Galleries
  • Hide related videos at the end of playback
  • Volume initialization
  • Simultaneous playback control
  • Playing video on mobile devices

Visual YouTube Wizard Directions

While you're writing your post or page, you have the ability to search YouTube and insert videos, playlists, and even galleries right from your editor. Below are directions for each type of WordPress editor. For pagebuilder instructions, scroll down to the "Pagebuilder Tips" section.

Classic Editor

Simply click the YouTube wizard button found above your post editor to start the wizard (see image to the right to locate this button). There, you'll have several options for different types of embeds. Each embed code will have an "Insert Into Editor" button that you can click to directly embed the desired video link to your post without having to copy and paste.


Widgets

To insert a video in a widget area, use the Text widget that comes with WordPress. Simply click the YouTube wizard button found above the widget textbox to start the wizard (see image to the right to locate this button). There, you'll have several options for different types of embeds. Each embed code will have an "Insert Into Editor" button that you can click to directly embed the desired video link to your post without having to copy and paste.


Gutenberg Block Editor

Click on the (+) sign for the block editor list. The YouTube Wizard block is located under the "Embeds" category (make sure you choose "YouTube Wizard" not "YouTube"). Then your page will show a placeholder where you can launch the wizard. In the wizard, you'll have several options for different types of embeds. Each embed code will have an "Insert Into Editor" button that you can click to directly embed the desired video link to your post without having to copy and paste. You'll also be able to preview and interact with your embed without having to view the page on the front end.


Gutenberg Classic Block

Are you using Gutenberg but not quite ready to start using all the blocks? Well, you can still access our wizard if you wish to continue using Gutenberg's Classic block. The Classic block brings back the former editor you used before WordPress, and so we've added a button to it you can use to launch the wizard (see example on the right). Simply click the wizard button to start the wizard. There, you'll have several options for different types of embeds. Each embed code will have an "Insert Into Editor" button that you can click to directly embed the desired video link to your post without having to copy and paste.


Pro Customization

Even more options are available to PRO users, no matter which editor you choose! Simply click the "Customize" button in the wizard to further personalize each of your embeds without having to manually add special codes yourself. The customize button will allow you to easily override most of the above default options for that embed.


Pagebuilder Tips

Most page builders have a text widget in which our plugin's wizard can be launched. Watch the videos below for some popular ones, namely Elementor, Beaver Builder, and SiteOrigin.

Note: Please do not check the "Also Defer jQuery" option if you use a pagebuilder. Some pagebuilders cannot work if jQuery is deferred.

Beaver Builder

Elementor

Site Origin

Visual Composer

WPBakery

If you don't see your page builder listed above, don't worry. For pretty much any page builder with a short code widget, you can also embed your video, gallery, live stream, or premiere by creating the short code using the plugin's wizard and then embedding the code in the short code widget or text widget of your page builder of choice.

Gallery Settings and Directions

You can now make playlist embeds (and channel-playlist embeds) have a gallery layout ». First, you must obtain your YouTube API key. Don't worry, it's an easy process. Just click this link » and follow the video on that page to get your server API key. Since Google updates their API Key generation directions frequently, follow the general steps shown in the video. Then paste your API key in the "API Key" tab, and click the "Save Changes" button.

Below are the global settings for galleries. If you want each of your galleries to have custom settings, go PRO for more options:

Enter how many thumbnails per page should be shown at once (YouTube allows a maximum of 50 per page).

Enter how many thumbnails can fit per row.

type="checkbox" class="checkbox"> $bpts) { ?> On screens up to px wide, stack thumbnails to 1 column.
Note: a common mobile screen width is 767 pixels.

type="checkbox" class="checkbox">

type="checkbox" class="checkbox"> Previous Page:   Next Page:

type="checkbox" class="checkbox"> Paste Channel URL:   Button text:

After you click on a thumbnail, the gallery will automatically smooth scroll up to the actual player. If you need it to scroll a few pixels further, increase this number.

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

Ready to get started with an actual gallery? Just click the plugin wizard button and pick your desired gallery embedding choice.

'; self::vi_print_toggle_button(); echo '
'; } ?> '; include_once(EPYTVI_INCLUDES_PATH . 'vi_registration_form.php'); include_once(EPYTVI_INCLUDES_PATH . 'vi_login_success.php'); echo ''; } else { include_once(EPYTVI_INCLUDES_PATH . 'vi_login_complete.php'); } ?>

Compatibility Settings

With tens of thousands of active users, our plugin may not work with every plugin out there. Below are some settings you may wish to try out.

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

  • type="checkbox" class="checkbox">
  • type="checkbox" class="checkbox">
  • This feature is beta. More shortcodes coming.

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

type="checkbox" class="checkbox">

Manual Embedding

We strongly recommend using the wizard in your editor to embed. However, if you choose to manually embed code, follow some legacy instructions below.

Manually Embed a YouTube Video or Playlist   (For gallery directions, go here »)

For videos: Method 1 - Do you already have a URL to the video you want to embed in a post, page, or even a widget? All you have to do is paste it on its own line, as shown below (including the https:// part). Easy, eh?
Method 2 - If you want to do some formatting (e.g. add HTML to center a video) or have two or more videos next to each other on the same line, wrap each link with the [embedyt]...[/embedyt] shortcode. Tip for embedding videos on the same line: As shown in the example image below, decrease the size of each video so that they fit together on the same line (See the "How To Override Defaults" section for height and width instructions).

For galleries: Click here to scroll down to gallery settings and directions.

For self-contained playlists: Go to the page for the playlist that lists all of its videos (Example »). Click on the video that you want the playlist to start with. Copy and paste that browser URL into your blog on its own line. If you want the first video to always be the latest video in your playlist, check the option "Playlist Ordering" in the settings down below (you will also see this option available if you use the Pro Wizard). If you want to have two or more playlists next to each other on the same line, wrap each link with the [embedyt]...[/embedyt] shortcode.

For self-contained channel playlists: At your editor, click on the wizard button and choose the option Search for a video or channel to insert in my editor. Then, click on the channel playlist option there (instead of single video). Search for the channel username and follow the rest of the directions there.

For directly embedding in your theme with PHP: If you need to use PHP directly, we still recommend using the wizard to create the shortcode--but instead of pressing the "Insert" button, just copy the shortcode the wizard gives you. Then use the do_shortcode() function in your theme, like this:
<?php echo do_shortcode('[embedyt]....[/embedyt]'); ?>

Examples:

Always follow these rules for any URL:

  • Make sure the URL is really on its own line by itself. Or, if you need multiple videos on the same line, make sure each URL is wrapped properly with the shortcode (Example: [embedyt]http://www.youtube.com/watch?v=ABCDEFGHIJK&width=400&height=250[/embedyt])
  • Make sure the URL is not an active hyperlink (i.e., it should just be plain text). Otherwise, highlight the URL and click the "unlink" button in your editor:
  • Make sure you did not format or align the URL in any way. If your URL still appears in your actual post instead of a video, highlight it and click the "remove formatting" button (formatting can be invisible sometimes):
  • If you really want to align the video, try wrapping the link with the shortcode first. For example: [embedyt]http://www.youtube.com/watch?v=ABCDEFGHIJK[/embedyt] Using the shortcode also allows you to have two or more videos next to each other on the same line. Just put the shortcoded links together on the same line. For example:
    [embedyt]http://www.youtube.com/watch?v=ABCDEF[/embedyt] [embedyt]http://www.youtube.com/watch?v=GHIJK[/embedyt]

Suppose you have a few videos that need to be different from the above defaults. You can add options to the end of a link as displayed below to override the above defaults. Each option should begin with '&'.
PRO users: You can use the customize buttons that you will see inside the wizard, instead of memorizing the following codes.

'); _e("
  • width - Sets the width of your player. If omitted, the default width will be the width of your theme's content. Example: http://www.youtube.com/watch?v=quwebVjAEJA&width=500&height=350
  • "); _e("
  • height - Sets the height of your player. Example: http://www.youtube.com/watch?v=quwebVjAEJA&width=500&height=350
  • "); _e("
  • autoplay - Set this to 1 to autoplay the video (or 0 to play the video once). Example: http://www.youtube.com/watch?v=quwebVjAEJA&autoplay=1 (Note: Desktop browsers like Chrome and Safari are moving towards preventing autoplay for any video. But, your chances are improved if you set your videos to initially start muted.)
  • "); _e("
  • cc_load_policy - Set this to 1 to turn on closed captioning (or 0 to leave them off). Example: http://www.youtube.com/watch?v=quwebVjAEJA&cc_load_policy=1
  • "); _e("
  • iv_load_policy - Set this to 3 to turn off annotations (or 1 to show them). Example: http://www.youtube.com/watch?v=quwebVjAEJA&iv_load_policy=3
  • "); _e("
  • loop - Set this to 1 to loop the video (or 0 to not loop). Example: http://www.youtube.com/watch?v=quwebVjAEJA&loop=1
  • "); _e("
  • modestbranding - Set this to 1 to remove the YouTube logo while playing (or 0 to show the logo). Example: http://www.youtube.com/watch?v=quwebVjAEJA&modestbranding=1
  • "); _e("
  • rel - Set this to 0 to not show related videos at the end of playing (or 1 to show them). Example: http://www.youtube.com/watch?v=quwebVjAEJA&rel=0
  • "); _e("
  • fs - Set this to 0 to hide the fullscreen button (or 1 to show it). Example: http://www.youtube.com/watch?v=quwebVjAEJA&fs=0
  • "); _e("
  • color - Set this to 'white' to make the player have a white progress bar (or 'red' for a red progress bar). Note: Using white will disable the modestbranding option. Example: http://www.youtube.com/watch?v=quwebVjAEJA&color=white
  • "); _e("
  • controls - Set this to 0 to completely hide the video controls (or 1 to show it). Example: http://www.youtube.com/watch?v=quwebVjAEJA&controls=0
  • "); _e("
  • playsinline - Set this to 1 to allow videos play inline with the page on iOS browsers. (Set to 0 to have iOS launch videos in fullscreen instead). Example: http://www.youtube.com/watch?v=quwebVjAEJA&playsinline=1
  • "); _e("
  • origin - Set this to 1 to add the 'origin' parameter for extra JavaScript security. Example: http://www.youtube.com/watch?v=quwebVjAEJA&origin=1
  • "); _e(''); _e("

    You can also start and end each individual video at particular times. Like the above, each option should begin with '&'

    "); _e('
      '); _e("
    • start - Sets the time (in seconds) to start the video. Example: http://www.youtube.com/watch?v=quwebVjAEJA&width=500&height=350&start=20
    • "); _e("
    • end - Sets the time (in seconds) to stop the video. Example: http://www.youtube.com/watch?v=quwebVjAEJA&width=500&height=350&end=100
    • "); _e('
    '); ?>

    type="checkbox" class="checkbox">
    >

    • >
    • >
    • >
    type="checkbox" class="checkbox">
    >

    described here » to further improve your page speeds or try out facade mode.', 'youtube-embed-plus'); ?>

    Want the PRO Features?

    Below are descriptions for some of our PRO features for more gallery customization options, faster page loading, enhanced SEO, and more. Simply purchase and install our separate PRO plugin (the PRO plugin automatically works for all your past embed links).




    Default   Popup lightbox

    Purchase and download the PRO plugin to get the above and several other features »

    Plugin Support

    Here is a short video explaining a few of the plugin's features:

    We've also found that a common support request has been from users that are pasting video links on single lines, as required, but are not seeing the video embed show up. One of these suggestions is usually the fix:

    • Make sure the URL is really on its own line by itself. Or, if you need multiple videos on the same line, make sure each URL is wrapped properly with the shortcode (Example: [embedyt]http://www.youtube.com/watch?v=ABCDEFGHIJK&width=400&height=250[/embedyt])
    • Make sure the URL is not an active hyperlink (i.e., it should just be plain text). Otherwise, highlight the URL and click the "unlink" button in your editor: .
    • Make sure you did not format or align the URL in any way. If your URL still appears in your actual post instead of a video, highlight it and click the "remove formatting" button (formatting can be invisible sometimes):
    • Try wrapping the URL with the [embedyt]...[/embedyt] shortcode. For example: [embedyt]http://www.youtube.com/watch?v=ABCDEFGHIJK[/embedyt] Using the shortcode also allows you to have two or more videos next to each other on the same line. Just put the shortcoded links together on the same line. For example:
      [embedyt]http://www.youtube.com/watch?v=ABCDEF&width=400&height=250[/embedyt] [embedyt]http://www.youtube.com/watch?v=GHIJK&width=400&height=250[/embedyt]
      TIP: As shown above, decrease the size of each video so that they fit together on the same line (See the "How To Override Defaults" section for height and width instructions)
    • If you upload a new video to a playlist or channel and that video is not yet showing up on a gallery you embedded, you should clear/reset any caching plugins you have. This will force your site to retrieve the freshest version of your playlist and/or channel video listing. If you don't reset you cache, then you'll have to wait until cache lifetime expires.
    • Finally, there's a slight chance your custom theme is the issue, if you have one. To know for sure, we suggest temporarily switching to one of the default WordPress themes (e.g., "Twenty Fourteen") just to see if your video does appear. If it suddenly works, then your custom theme is the issue. You can switch back when done testing.
    • If your videos always appear full size, try turning off "Responsive video sizing."
    • If none of the above work, you can contact us here if you still have issues: ext@embedplus.com. We'll try to respond within a week.

    Deactivating the No Cookies option has also been proven to solve player errors.

    We also have a YouTube channel. We use it to provide users with some helper videos and a way to keep updated on new features as they are introduced. Subscribe for tips and updates here »


    'success', 'message' => 'Changes were saved. If you are using a separate caching plugin and you do not see your changes after saving, you need to reset your cache.' ); } public static function settings_save_ajax() { $result = array(); if (check_ajax_referer('_epyt_save', '_epyt_nonce', false) && current_user_can('manage_options')) { $all = get_option(self::$opt_alloptions); $result = self::settings_save($all); } else { $result['type'] = 'error'; $result['message'] = 'Sorry, there was a problem saving your settings.'; } echo json_encode($result); die(); } public static function onboarding_save_valid(&$input) { $messages = array(); try { $input[self::$opt_modestbranding] = intval($input[self::$opt_modestbranding]); $input[self::$opt_responsive] = intval($input[self::$opt_responsive]); $input[self::$opt_responsive_all] = intval($input[self::$opt_responsive_all]); $input[self::$opt_defer_js] = intval($input[self::$opt_defer_js]); $input[self::$opt_gallery_pagesize] = intval($input[self::$opt_gallery_pagesize]); $input[self::$opt_gallery_columns] = intval($input[self::$opt_gallery_columns]); $input[self::$opt_not_live_content] = wp_kses_post(stripslashes($input[self::$opt_not_live_content])); $input[self::$opt_not_live_on] = intval($input[self::$opt_not_live_on]); $input[self::$opt_not_live_on_channel] = intval($input[self::$opt_not_live_on_channel]); if (!in_array($input[self::$opt_ytapi_load], array('always', 'light', 'never'))) { $input[self::$opt_ytapi_load] = 'light'; } $input[self::$opt_facade_mode] = intval($input[self::$opt_facade_mode]); $input[self::$opt_facade_autoplay] = intval($input[self::$opt_facade_autoplay]); $input[self::$opt_gdpr_consent] = intval($input[self::$opt_gdpr_consent]); $input[self::$opt_gdpr_consent_message] = wp_kses_post(stripslashes($input[self::$opt_gdpr_consent_message])); $input[self::$opt_gdpr_consent_button] = wp_kses_post(stripslashes($input[self::$opt_gdpr_consent_button])); $input[self::$opt_nocookie] = intval($input[self::$opt_nocookie]); } catch (Exception $ex) { $messages[] = 'Please enter valid data.'; } if (empty($messages)) { return true; } return $messages; } public static function onboarding_save() { $result = array(); $default = array( self::$opt_rel => 1, self::$opt_modestbranding => 0, self::$opt_responsive => 0, self::$opt_responsive_all => 0, self::$opt_defer_js => 0, self::$opt_gallery_pagesize => 15, self::$opt_gallery_columns => 3, self::$opt_not_live_content => '', self::$opt_not_live_on => 0, self::$opt_not_live_on_channel => 0, self::$opt_ytapi_load => 'light', self::$opt_facade_mode => 0, self::$opt_facade_autoplay => 1, self::$opt_gdpr_consent => 0, self::$opt_gdpr_consent_message => self::$dft_gdpr_consent_message, self::$opt_gdpr_consent_button => 'Accept YouTube Content', self::$opt_nocookie => 0 ); $input = shortcode_atts($default, stripslashes_deep($_POST)); $valid = self::onboarding_save_valid($input); if ($valid === true) { self::update_option_set($input); $result['type'] = 'success'; } else { $result['type'] = 'error'; $result['message'] = implode('
    ', $valid); } return $result; } public static function onboarding_save_ajax() { $result = array(); if (self::is_ajax() && self::ajax_referer() && current_user_can('manage_options')) { $result = self::onboarding_save(); } else { $result['type'] = 'error'; $result['message'] = 'Sorry, there was a problem saving the data.'; } echo json_encode($result); die(); } public static function onboarding_save_apikey_valid(&$input) { $messages = array(); try { $input[self::$opt_apikey] = trim(str_replace(array(' ', "'", '"'), array('', '', ''), strip_tags($input[self::$opt_apikey]))); } catch (Exception $ex) { $messages[] = 'Please enter a valid API key.'; } if (empty($messages)) { return true; } return $messages; } public static function onboarding_save_apikey() { $result = array(); $default = array( self::$opt_apikey => '', ); $input = shortcode_atts($default, stripslashes_deep($_POST)); $valid = self::onboarding_save_apikey_valid($input); if ($valid === true) { self::update_option_set($input); $result['type'] = 'success'; } else { $result['type'] = 'error'; $result['message'] = implode('
    ', $valid); } return $result; } public static function onboarding_save_apikey_ajax() { $result = array(); if (self::is_ajax() && self::ajax_referer() && current_user_can('manage_options')) { $result = self::onboarding_save_apikey(); } else { $result['type'] = 'error'; $result['message'] = 'Sorry, there was a problem saving the data.'; } echo json_encode($result); die(); } public static function ytprefs_show_onboarding() { if (!current_user_can('manage_options')) { wp_die(__('You do not have sufficient permissions to access this page.')); } if (self::$double_plugin) { self::double_plugin_warning(); } $all = get_option(self::$opt_alloptions); $do_once = array( self::$opt_onboarded => 1 ); self::update_option_set($do_once); ?>
    YouTube Setup Guide

    With so many options available in this plugin, we created this easy setup guide to help you quickly learn about its most common settings and newest features. We hope it will get you embedding videos, galleries, and/or live streams sooner.

    You'll have an opportunity to see and set many other options after completing this setup guide.

    Below, check all that apply:
    I'm interested in embedding...

    Intro Video

    Want a quick visual overview? Here's a preview of some of the free features of the plugin.

    You're interested in:

    Use "Not Live" Fallback Content For Live Streams: (More info here) This feature lets you display alternate content if your live stream is not currently active. This feature works for direct link live streams (more info about channel-based live streams below).

    type="checkbox" class="checkbox">

    "Not Live" Fallback Content:

    7)); ?>
    YouTube API Loading: Choose when to load the YouTube API. The "Restricted" or "Never" options will help with GDPR compliance:
    type="checkbox" class="checkbox">
    22, 'media_buttons' => false, 'teeny' => true )); ?>

    Example of message and button:

    GDPR Consent Message Example

    type="checkbox" class="checkbox">

    YouTube API Key

    Some features (such as galleries, and some wizard features) now require you to create a free YouTube API key from Google.

    0) { ?>

    Great! You already have an API key.

    The instructions for this are very specific, so we created a video for you that's hopefully easy to follow: Click this link and follow the steps on the page. Then save your API key here.

    '; include_once(EPYTVI_INCLUDES_PATH . 'vi_registration_form.php'); include_once(EPYTVI_INCLUDES_PATH . 'vi_login_success.php'); echo '
    '; } else { ?>

    Monetization

    Hooray! You have already signed up for the video ad monetization feature.

    If you're using a separate caching plugin and you do not see your changes after saving, you need to reset your cache.

    $bpts) { $custom_css .= " @media (min-width:" . $bpts['bp']['min'] . "px) and (max-width: " . $bpts['bp']['max'] . "px) { .epyt-gallery-rowbreak { display: none; } .epyt-gallery-allthumbs[class*=\"epyt-cols\"] .epyt-gallery-thumb { width: " . round(100.0 / intval($bpts['cols']), 3) . "% !important; } }"; } } wp_add_inline_style('__EPYT__style', $custom_css); wp_enqueue_script('__ytprefs__', plugins_url('scripts/ytprefs' . self::$min . '.js', __FILE__), array('jquery'), self::$version); if (self::$alloptions[self::$opt_old_script_method] != 1) { $my_script_vars = array( 'ajaxurl' => admin_url('admin-ajax.php'), 'security' => wp_create_nonce('embedplus-nonce'), 'gallery_scrolloffset' => intval(self::$alloptions[self::$opt_gallery_scrolloffset]), 'eppathtoscripts' => plugins_url('scripts/', __FILE__), 'eppath' => plugins_url('/', __FILE__), 'epresponsiveselector' => self::get_responsiveselector(), 'epdovol' => true, 'version' => self::$alloptions[self::$opt_version], 'evselector' => self::get_evselector(), 'ajax_compat' => self::$alloptions[self::$opt_ajax_compat] == '1' ? true : false, 'maxres_facade' => esc_attr(self::$alloptions[self::$opt_maxres_facade]), 'ytapi_load' => self::$alloptions[self::$opt_ytapi_load], 'pause_others' => self::$alloptions[self::$opt_pause_others] == '1' ? true : false, 'stopMobileBuffer' => self::$alloptions[self::$opt_stop_mobile_buffer] == '1' ? true : false, 'facade_mode' => self::$alloptions[self::$opt_facade_mode] == '1' ? true : false, 'not_live_on_channel' => self::$alloptions[self::$opt_not_live_on_channel] == '1' ? true : false, 'vi_active' => false, // self::$alloptions[self::$opt_vi_active] == '1' ? true : false, 'vi_js_posttypes' => array() // self::$alloptions[self::$opt_vi_js_posttypes] ); wp_localize_script('__ytprefs__', '_EPYT_', $my_script_vars); } if ((bool) self::$alloptions[self::$opt_gdpr_consent]) { wp_enqueue_script('__jquery_cookie__', plugins_url('scripts/jquery.cookie' . self::$min . '.js', __FILE__), array('jquery'), self::$version); } ////////////////////// cloudflare accomodation //add_filter('script_loader_tag', array(self::class, 'set_cfasync'), 10, 3); } } public static function set_cfasync($tag, $handle, $src) { if ('__ytprefs__' !== $handle) { return $tag; } return str_replace(' admin_url('admin-ajax.php'), 'wizhref' => admin_url('admin.php?page=youtube-ep-wizard') . '&random=' . rand(1, 1000) . '&TB_iframe=true&width=950&height=800', 'manage_options' => current_user_can('manage_options'), 'security' => wp_create_nonce('embedplus-nonce'), 'onboarded' => self::$alloptions[self::$opt_onboarded], 'vi_logged_in' => self::vi_logged_in(), 'epbase' => self::$epbase, 'admin_url' => admin_url(), 'vi_js_settings' => self::$alloptions[self::$opt_vi_js_settings], 'admin_url_ytprefs' => admin_url('admin.php?page=youtube-my-preferences'), 'admin_url_vi' => admin_url('admin.php?page=youtube-ep-vi') //'epblogwidth' => self::get_blogwidth(), //'epprokey' => self::$alloptions[self::$opt_pro], //'epbasesite' => self::$epbase, //'epversion' => self::$version, //'myytdefaults' => http_build_query(self::$alloptions), //'eppluginadminurl' => admin_url('admin.php?page=youtube-my-preferences') ); wp_localize_script('__ytprefs_admin__', '_EPYTA_', $admin_script_vars); if (function_exists('add_thickbox')) { add_thickbox(); } if ((get_bloginfo('version') >= '3.3') && self::custom_admin_pointers_check()) { add_action('admin_print_footer_scripts', array(self::class, 'custom_admin_pointers_footer')); wp_enqueue_script('wp-pointer'); wp_enqueue_style('wp-pointer'); } if (self::$alloptions['glance'] == 1) { add_action('admin_print_footer_scripts', array(self::class, 'glance_script')); } if ($hook == self::$wizard_hook) { wp_enqueue_style('__ytprefs_admin__wizard_ui', plugins_url('styles/jquery-ui' . self::$min . '.css', __FILE__), array(), self::$version); wp_enqueue_style('__ytprefs_admin__wizard', plugins_url('styles/ytprefs-wizard' . self::$min . '.css', __FILE__), array(), self::$version); wp_enqueue_script('__ytprefs_admin__wizard_script', plugins_url('scripts/ytprefs-wizard' . self::$min . '.js', __FILE__), array('jquery', 'jquery-ui-accordion', 'jquery-ui-tabs'), self::$version); } if ($hook == self::$onboarding_hook) { wp_enqueue_style('__ytprefs_admin__onboarding_animate', plugins_url('scripts/embdyn' . self::$min . '.css', __FILE__), array(), self::$version); wp_enqueue_style('__ytprefs_admin__onboarding_ui', plugins_url('styles/jquery-ui' . self::$min . '.css', __FILE__), array(), self::$version); wp_enqueue_style('__ytprefs_admin__onboarding', plugins_url('styles/ytprefs-onboarding' . self::$min . '.css', __FILE__), array(), self::$version); } } public static function get_blogwidth() { $blogwidth = null; try { $embed_size_w = intval(get_option('embed_size_w')); global $content_width; if (empty($content_width)) { $content_width = $GLOBALS['content_width']; } $blogwidth = $embed_size_w ? $embed_size_w : ($content_width ? $content_width : 450); } catch (Exception $ex) { } $blogwidth = preg_replace('/\D/', '', $blogwidth); //may have px return $blogwidth; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private static function ajax_referer() { return check_ajax_referer('embedplus-nonce', 'security', false); } public static function base_url() { $parsed = parse_url(site_url()); return $parsed['scheme'] . '://' . $parsed['host']; } public static function on_deactivation() { self::vi_cron_stop(); } private static function update_option_set($new_options) { $all = get_option(self::$opt_alloptions); $all = $new_options + $all; update_option(self::$opt_alloptions, $all); self::$alloptions = get_option(self::$opt_alloptions); } private static function vi_remote_get($endpoint, $options = array()) { $params = $options + array( 'headers' => array('Authorization' => self::$alloptions[self::$opt_vi_token]), 'timeout' => self::$curltimeout ); return wp_remote_get($endpoint, $params); } private static function vi_remote_post($endpoint, $options = array()) { $params = $options + array( 'headers' => array('Content-Type' => 'application/json', 'Authorization' => self::$alloptions[self::$opt_vi_token]), 'timeout' => self::$curltimeout ); // if (self::$alloptions[self::$opt_debugmode]) // { // echo $endpoint . '
    ' . self::vi_debug_json($params); // } return wp_remote_post($endpoint, $params); } private static function vi_remote_post_anon($endpoint, $options = array()) { $params = $options + array( 'headers' => array('Content-Type' => 'application/json'), 'timeout' => self::$curltimeout ); return wp_remote_post($endpoint, $params); } private static function vi_cache_endpoints_valid(&$apiResult) { $messages = array(); if (is_wp_error($apiResult)) { $messages[] = $apiResult->get_error_message(); } else { $jsonResult = json_decode($apiResult['body']); if (!empty($jsonResult->error)) { $messages[] = $jsonResult->error; } if (!filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL)) { $messages[] = "Please enter a valid email address."; } if (isset($jsonResult->status) && strcasecmp($jsonResult->status, 'ok') == 0 && isset($jsonResult->data) && is_object($jsonResult->data)) { $apiResult = $jsonResult; } } if (empty($messages)) { return true; } return $messages; } public static function vi_cache_endpoints() { $result = array(); $apiResult = wp_remote_get(EPYTVI_ENDPOINTS_URL, array('timeout' => self::$curltimeout)); $valid = self::vi_cache_endpoints_valid($apiResult); if ($valid === true) { $new_options = array( self::$opt_vi_endpoints => $apiResult->data ); self::update_option_set($new_options); $post_email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); if (!empty($post_email)) { $result['type'] = 'success'; $result['data'] = $apiResult->data; $result['signupURLParams'] = $apiResult->data->signupURL . '?aid=WP_embedplus&email=' . filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL) . '&domain=' . site_url(); } } else { $result['type'] = 'error'; $result['message'] = implode('
    ', $valid); } return $result; } public static function vi_cache_endpoints_ajax() { $result = array(); if (self::is_ajax() && self::ajax_referer() && current_user_can('manage_options')) { $result = self::vi_cache_endpoints(); } else { $result['type'] = 'error'; $result['message'] = 'Sorry, there was a problem submitting the data.'; } $result['message'] = wp_kses_post($result['message']); echo json_encode($result); die(); } public static function vi_notice_login_reminder() { if (filter_has_var(INPUT_COOKIE, 'vi_signup_attempt')) { $screen = get_current_screen(); $date_string = filter_input(INPUT_COOKIE, 'vi_signup_attempt', FILTER_SANITIZE_STRING); $date_attempt = strtotime($date_string); $date_wait = strtotime($date_string . ' + 7 days'); if (time() > $date_wait && !self::vi_logged_in() && in_array($screen->id, array('toplevel_page_youtube-my-preferences')) ) { ?> get_error_message(); } else { $jsonResult = json_decode($apiResult['body']); if (!empty($jsonResult->error)) { $messages[] = $jsonResult->error->message . ": " . (is_string($jsonResult->error->description) ? $jsonResult->error->description : json_encode($jsonResult->error->description)); } if (isset($jsonResult->status) && strcasecmp($jsonResult->status, 'ok') == 0 && isset($jsonResult->data) && strlen($jsonResult->data) > 0) { $apiResult = $jsonResult; } } if (empty($messages)) { return true; } return $messages; } private static function vi_adstxt_api_valid(&$apiResult) { $messages = array(); if (is_wp_error($apiResult)) { $messages[] = $apiResult->get_error_message(); } else { $jsonResult = json_decode($apiResult['body']); if (!empty($jsonResult->error)) { $messages[] = implode(': ', array($jsonResult->error->message, $jsonResult->error->description)); } if (isset($jsonResult->status) && strcasecmp($jsonResult->status, 'ok') == 0 && isset($jsonResult->data) && strlen($jsonResult->data) > 0) { $apiResult = $jsonResult; } } if (empty($messages)) { return true; } return $messages; } public static function vi_login() { $result = array(); $default = array( 'email' => '', 'password' => '' ); $input = shortcode_atts($default, stripslashes_deep($_POST)); $valid = self::vi_login_valid($input); if ($valid === true) { self::vi_cache_endpoints(); $loginAPI = self::$alloptions[self::$opt_vi_endpoints]->loginAPI . '?affiliateId=WP_embedplus'; $inputAuth = array( 'email' => $input['email'], 'password' => $input['password'] ); $apiResult = self::vi_remote_post_anon($loginAPI, array( 'body' => json_encode($inputAuth) )); $valid = self::vi_login_api_valid($apiResult); if ($valid === true) { $result['type'] = 'success'; $new_options = array( self::$opt_vi_token => $apiResult->data, self::$opt_vi_last_login => date('Y-m-d H:i:s') ); self::update_option_set($new_options); } else { $result['type'] = 'error'; $result['message'] = implode('
    ', $valid); } } else { $result['type'] = 'error'; $result['message'] = implode('
    ', $valid); } if ($result['type'] === 'success') { self::vi_db_init_schema(); } return $result; } public static function vi_login_ajax() { $result = array(); if (self::is_ajax() && self::ajax_referer() && current_user_can('manage_options')) { $result = self::vi_login(); } else { $result['type'] = 'error'; $result['message'] = 'Sorry, there was a problem submitting the data.'; } $result['message'] = wp_kses_post($result['message']); echo json_encode($result); die(); } public static function vi_logout_ajax() { $result = array(); if (self::is_ajax() && self::ajax_referer() && current_user_can('manage_options')) { self::vi_cron_stop(); $new_options = array( self::$opt_vi_token => '' ); self::update_option_set($new_options); $result['type'] = 'success'; $result['url'] = admin_url('admin.php?page=youtube-my-preferences'); } else { $result['type'] = 'error'; $result['message'] = 'Sorry, there was a problem submitting the data.'; } echo json_encode($result); die(); } public static function vi_toggle_ajax() { $result = array(); if (self::is_ajax() && self::ajax_referer() && current_user_can('manage_options')) { $new_options = array( self::$opt_vi_active => self::$alloptions[self::$opt_vi_active] ? 0 : 1 ); self::update_option_set($new_options); $result['type'] = 'success'; $result['button_text'] = self::$alloptions[self::$opt_vi_active] ? 'On' : 'Off'; } else { $result['type'] = 'error'; $result['message'] = 'Sorry, there was a problem submitting the data.'; } echo json_encode($result); die(); } public static function vi_hide_feature_ajax() { $result = array(); if (self::is_ajax() && self::ajax_referer() && current_user_can('manage_options')) { $new_options = array( self::$opt_vi_hide_monetize_tab => 1 ); self::update_option_set($new_options); $result['type'] = 'success'; $result['url'] = admin_url('admin.php?page=youtube-my-preferences'); } else { $result['type'] = 'error'; $result['message'] = 'Sorry, there was a network error. Please try again, or turn off this feature using the "Hide Monetize Feature" checkbox on the "Defaults" tab of the YouTube settings. If the issue persists, please contact ext@embedplus.com'; } echo json_encode($result); die(); } public static function vi_cover_prompt_yes() { return filter_input(INPUT_COOKIE, 'vi_cover_prompt_yes', FILTER_SANITIZE_NUMBER_INT) == 1; } public static function vi_cron_stop() { $timestamp = wp_next_scheduled('ytvi_cron_cache_js_hook'); if ($timestamp !== false) { wp_unschedule_event($timestamp, 'ytvi_cron_cache_js_hook'); } } private static function vi_reports_valid(&$apiResult) { $messages = array(); if (is_wp_error($apiResult)) { $messages[] = $apiResult->get_error_message(); } else { $jsonResult = json_decode($apiResult['body']); //$messages[] = $apiResult['body']; // COMMENT if (!empty($jsonResult->error)) { $messages[] = $jsonResult->error->message . ": " . $jsonResult->error->description; } if (isset($jsonResult->status) && strcasecmp($jsonResult->status, 'ok') == 0 && isset($jsonResult->data)) { $apiResult = $jsonResult; } } if (empty($messages)) { return true; } return $messages; } public static function vi_reports_ajax() { $result = array(); if (self::is_ajax() && self::ajax_referer() && current_user_can('manage_options')) { $revenueResult = self::vi_remote_get(self::$alloptions[self::$opt_vi_endpoints]->revenueAPI); $revenue_valid = self::vi_reports_valid($revenueResult); if ($revenue_valid === true) { $result['data'] = $revenueResult->data; $result['type'] = 'success'; } else { $result['type'] = 'error'; $result['message'] = wp_kses_post(implode('
    ', $revenue_valid)); } } else { $result['type'] = 'error'; $result['message'] = 'Sorry, there was a problem retrieving the data.'; } echo json_encode($result); die(); } private static function vi_cache_user_adstxt() { $adsTxtAPI = self::$alloptions[self::$opt_vi_endpoints]->adsTxtAPI; $iabResult = self::vi_remote_get($adsTxtAPI); $iab_valid = self::vi_adstxt_api_valid($iabResult); if ($iab_valid === true) { $new_options = array( self::$opt_vi_adstxt => $iabResult->data ); self::update_option_set($new_options); return $iabResult->data; } return false; } private static function vi_adstxt_status() { $user_adstxt = self::vi_cache_user_adstxt(); $current_adstxt = false; if ($user_adstxt === false) { return array( 'code' => -1, 'message' => 'Sorry, your publisher ads.txt info could not be retrieved. Please wait a few minutes and try again. Your ads.txt verification file will enable you to make money through vi. FAQ »' ); } else { $user_adstxt = preg_replace('~\R~u', PHP_EOL, $user_adstxt); } $adstxt_file = self::vi_get_home_path() . 'ads.txt'; $adstxt_url = self::base_url() . '/ads.txt'; $adstxt_http = wp_remote_get($adstxt_url, array('timeout' => self::$curltimeout)); if (!is_wp_error($adstxt_http) && in_array(wp_remote_retrieve_response_code($adstxt_http), array(200, 301, 302, 304))) { $current_adstxt = wp_remote_retrieve_body($adstxt_http); } if (empty($current_adstxt)) { $current_adstxt = file_get_contents($adstxt_file); } if (!empty($current_adstxt)) { $current_adstxt = preg_replace('~\R~u', PHP_EOL, $current_adstxt); // append if (is_writable($adstxt_file)) { if (stripos($current_adstxt, '# 41b5eef6') === false) { $to_write = PHP_EOL . $user_adstxt; file_put_contents($adstxt_file, $to_write, FILE_APPEND); return array( 'code' => 1, 'before_adstxt' => $current_adstxt, 'after_adstxt' => $current_adstxt . $to_write, 'message' => 'You successfully validated your account. Your ads.txt file has been updated, which enables you to make money through vi. FAQ »' ); } else if ($current_adstxt !== $user_adstxt) { $current_adstxt_lines = preg_split('/\r\n|\r|\n/', $current_adstxt); $current_adstxt_lines = array_filter($current_adstxt_lines, array(self::class, 'vi_not_vi_adstxt_line')); $former_adstxt = implode(PHP_EOL, $current_adstxt_lines); $new_adstxt = $former_adstxt . (strlen($former_adstxt) > 0 ? PHP_EOL : '') . $user_adstxt; if ($current_adstxt === $new_adstxt) { return array( 'code' => 2, 'message' => 'You successfully validated your account.' ); } else { file_put_contents($adstxt_file, $new_adstxt); return array( 'code' => 1, 'before_adstxt' => $current_adstxt, 'after_adstxt' => $new_adstxt, 'message' => 'You successfully validated your account. Your ads.txt file has been updated, which enables you to make money through vi. FAQ »' ); } } else { return array( 'code' => 2, 'message' => 'You successfully validated your account.' ); } } else { if (stripos($current_adstxt, $user_adstxt) === false) // $user_adstxt { return array( 'code' => 0, 'message' => 'Sorry, your current ads.txt file could not be automatically be updated. Please first download this updated ads.txt file and upload it to your site root, then try logging in again. Your ads.txt verification file will enable you to make money through vi. FAQ »' ); } else { return array( 'code' => 2, 'message' => 'You successfully validated your account.' ); } } } else { // create if ((!file_exists($adstxt_file) && is_writable(self::vi_get_home_path())) || (file_exists($adstxt_file) && is_writable($adstxt_file))) { file_put_contents($adstxt_file, self::$alloptions[self::$opt_vi_adstxt], FILE_APPEND); return array( 'code' => 1, 'before_adstxt' => $current_adstxt, 'after_adstxt' => self::$alloptions[self::$opt_vi_adstxt], 'message' => 'You successfully validated your account. Your ads.txt file has been created, which enables you to make money through vi. FAQ »' ); } else { return array( 'code' => 0, 'message' => 'Sorry, your ads.txt verification file could not automatically be created. Please first download this ads.txt file and upload it to your site root, then try logging in again. Your ads.txt verification file will enable you to make money through vi. FAQ »' ); } } } public static function vi_adstxt_status_soft_ajax() { $result = array(); if (self::is_ajax() && self::ajax_referer() && current_user_can('manage_options')) { $default = array( 'current_adstxt' => '' ); $input = shortcode_atts($default, stripslashes_deep($_POST)); $result = self::vi_adstxt_status_soft($input['current_adstxt']); if (isset($result['code']) && intval($result['code']) < 0) { $result['token'] = self::$alloptions[self::$opt_vi_token]; } } else { $result['type'] = 'error'; $result['message'] = 'Sorry, there was a problem verifying your ads.txt file. Please try again.'; } $result['message'] = wp_kses_post($result['message']); echo json_encode($result); die(); } private static function vi_adstxt_status_soft($current_adstxt) { $adstxt_url = self::base_url() . '/ads.txt'; $adstxt_note = ' Note: If you already have an ads.txt file at ' . $adstxt_url . ', you will just need to add in the additional lines found in the download.'; $user_adstxt = self::vi_cache_user_adstxt(); $current_adstxt = empty($current_adstxt) ? false : $current_adstxt; if ($user_adstxt === false) { return array( 'code' => -1, 'message' => 'For your security, a quick reauthentication is needed to begin setting up your ads.txt file. First, log out of this Ads Settings page with the "Logout" button right above and then log back in with your vi login and password. Then come back to this tab for next steps. Your ads.txt verification file will enable you to make money through vi. FAQ »' ); } else { $user_adstxt = preg_replace('~\R~u', PHP_EOL, $user_adstxt); } if (!empty($current_adstxt)) { $current_adstxt = preg_replace('~\R~u', PHP_EOL, $current_adstxt); // append / update manually if (stripos($current_adstxt, $user_adstxt) === false) { if (stripos($current_adstxt, '# 41b5eef6') !== false) // update { return array( 'code' => 0, 'message' => 'Looks like video intelligence has just updated its ad delivery partners. To get the most revenue out of your ads, open up your ' . ' ads.txt file and replace the vi lines (ending in # 41b5eef6) with the new lines you see below. Then, refresh this page. ' . ' Please do not reorder or double space the below lines. ' . ' If we helped you with your ads.txt in the past, feel free to contact us to help out again with this update. ' . '# video intelligence (vi.ai) ads.txt lines begin here:' . PHP_EOL . $user_adstxt . PHP_EOL . '# video intelligence (vi.ai) ads.txt lines end' ); } else // add { return array( 'code' => 0, 'message' => 'In your current ads.txt file, just add in the additional lines you see below. Then, refresh this page.' . ' Please do not reorder or double space the below lines. ' . '# video intelligence (vi.ai) ads.txt lines begin here:' . PHP_EOL . $user_adstxt . PHP_EOL . '# video intelligence (vi.ai) ads.txt lines end' ); } } else { return array( 'code' => 2, 'message' => '

    You successfully validated your ads.txt file.

    ' ); } } else { // create manually return array( 'code' => 0, 'message' => 'You can download this ads.txt file and upload it to your site root (or copy the same text below). Then, refresh this page to verify.' . ' Please do not reorder or double space the below lines. ' . '# video intelligence (vi.ai) ads.txt lines begin here:' . PHP_EOL . $user_adstxt . PHP_EOL . '# video intelligence (vi.ai) ads.txt lines end' ); } } private static function vi_not_vi_adstxt_line($line) { return stripos($line, '# 41b5eef6') === false; } public static function vi_get_home_path() { $abs_root = get_home_path(); if (strlen($abs_root) <= 1) { $abs_root = trailingslashit(str_replace('\\', '/', ABSPATH)); $url_path = parse_url(site_url()); if (isset($url_path['path'])) { $relpath = trailingslashit($url_path['path']); $relpath_length = strlen($relpath); $path_intersect = substr($abs_root, -$relpath_length); if ($path_intersect === $relpath) { $abs_root = trailingslashit(substr($abs_root, 0, strlen($abs_root) - $relpath_length)); } } } return $abs_root; } public static function vi_adstxt_lookup() { $request = esc_url_raw(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)); if ('/ads.txt' === $request) { if (function_exists('tenup_display_ads_txt')) { $post_id = get_option('adstxt_post'); if (!empty($post_id)) { $post = get_post($post_id); header('Content-Type: text/plain'); echo esc_html($post->post_content); die(); } } } } public static function vi_adstxt_download() { $inp_key = filter_input(INPUT_GET, 'key'); if (filter_input(INPUT_GET, 'ytvi_adstxt_download') == 1 && !empty($inp_key)) { $key = urldecode(filter_input(INPUT_GET, 'key', FILTER_DEFAULT)); self::$alloptions[self::$opt_vi_token] = $key; $user_adstxt = self::vi_cache_user_adstxt(); $adstxt_file = self::vi_get_home_path() . 'ads.txt'; $current_adstxt = file_exists($adstxt_file) ? file_get_contents($adstxt_file) : ''; $current_adstxt_lines = preg_split('/\r\n|\r|\n/', $current_adstxt); $current_adstxt_lines = array_filter($current_adstxt_lines, array(self::class, 'vi_not_vi_adstxt_line')); $former_adstxt = implode(PHP_EOL, $current_adstxt_lines); $new_adstxt = $former_adstxt . (strlen($former_adstxt) > 0 ? PHP_EOL : '') . ($user_adstxt === false ? '' : $user_adstxt); $new_adstxt = '# video intelligence (vi.ai) ads.txt lines begin here:' . PHP_EOL . $new_adstxt . PHP_EOL . '# video intelligence (vi.ai) ads.txt lines end'; header("Expires: 0"); header("Cache-Control: no-cache, no-store, must-revalidate"); header('Cache-Control: pre-check=0, post-check=0, max-age=0', false); header("Pragma: no-cache"); header("Content-Disposition:attachment; filename=ads.txt"); header("Content-Type: application/force-download"); echo $new_adstxt; exit(); } } public static function vi_logged_in() { return !empty(self::$alloptions[self::$opt_vi_token]); } public static function vi_settings_nav() { ?> get_error_message(); } else { $jsonResult = json_decode($apiResult['body']); if (!empty($jsonResult->error)) { //$messages[] = implode(': ', array('vi API - ' . self::vi_debug_json($apiResult))); $messages[] = 'If the issue is not resolved, please contact support at ext@embedplus.com and we will get you going. (Error code ' . wp_remote_retrieve_response_code($apiResult) . ', v' . self::$version . ' - ' . implode(': ', array($jsonResult->error->message, is_string($jsonResult->error->description) ? $jsonResult->error->description : json_encode($jsonResult->error->description))) . ')'; } if (isset($jsonResult->status) && strcasecmp($jsonResult->status, 'ok') == 0 && isset($jsonResult->data) && strlen($jsonResult->data) > 0) { $apiResult = $jsonResult; } } if (empty($messages)) { return true; } return $messages; } private static function vi_cache_js($options) { $readonly = array( 'domain' => parse_url(site_url(), PHP_URL_HOST), 'adUnitType' => 'NATIVE_VIDEO_UNIT', 'logoUrl' => 'https://example.com/logo.jpg' ); $options = $readonly + $options; $jsTagAPI = self::$alloptions[self::$opt_vi_endpoints]->jsTagAPI; $iabCategoryList = explode(',', $options['iabCategory']); $matches = array(); if (isset(self::$alloptions[self::$opt_vi_js_script]) && preg_match('/IAB_Category[ ]*:([^,]+),/i', self::$alloptions[self::$opt_vi_js_script], $matches)) { $currCategory = array(trim($matches[1])); $iabCategoryList = array_diff($iabCategoryList, $currCategory); } $options['iabCategory'] = $iabCategoryList[array_rand($iabCategoryList)]; $apiResult = self::vi_remote_post($jsTagAPI, array( 'body' => json_encode($options) )); //$js_valid = array(self::vi_debug_json($options)); $js_valid = self::vi_cache_js_valid($apiResult); if ($js_valid === true) { $mod_data = $apiResult->data; $new_options = array( self::$opt_vi_js_script => $mod_data, self::$opt_vi_last_category_update => date('Y-m-d H:i:s') ); self::update_option_set($new_options); } return $js_valid; } public static function vi_debug_json($json) { return '
    ' . json_encode($json, JSON_PRETTY_PRINT) . '
    '; } public static function vi_script_setup_done() { if (empty(self::$alloptions[self::$opt_vi_js_script])) { return false; } return true; } public static function vi_admin_dashboard_valid(&$item) { $messages = array(); $all_post_types = get_post_types(array('public' => true), 'names'); foreach ($item[self::$opt_vi_js_posttypes] as $pt) { if (!in_array($pt, $all_post_types)) { $messages[] = 'Please choose only valid post types for your ad to appear in.'; } } if (!in_array($item[self::$opt_vi_js_position], array('top', 'bottom'))) { $messages[] = 'Please choose a valid placement position.'; } $item[self::$opt_vi_js_settings]['keywords'] = substr(sanitize_text_field(str_replace(array('\'', '"'), '', $item[self::$opt_vi_js_settings]['keywords'])), 0, 200); $item[self::$opt_vi_js_settings]['iabCategory'] = sanitize_text_field($item[self::$opt_vi_js_settings]['iabCategory']); if (empty($item[self::$opt_vi_js_settings]['iabCategory'])) { $messages[] = 'Please choose at least one IAB category under Video Categories.'; } $item[self::$opt_vi_js_settings]['language'] = sanitize_text_field($item[self::$opt_vi_js_settings]['language']); if (empty($item[self::$opt_vi_js_settings]['language'])) { $item[self::$opt_vi_js_settings]['language'] = 'en-us'; } $item[self::$opt_vi_js_settings]['backgroundColor'] = sanitize_hex_color($item[self::$opt_vi_js_settings]['backgroundColor']); if (empty($item[self::$opt_vi_js_settings]['backgroundColor'])) { $item[self::$opt_vi_js_settings]['backgroundColor'] = '#ffffff'; } $item[self::$opt_vi_js_settings]['textColor'] = sanitize_hex_color($item[self::$opt_vi_js_settings]['textColor']); if (empty($item[self::$opt_vi_js_settings]['textColor'])) { $item[self::$opt_vi_js_settings]['textColor'] = '#000000'; } $item[self::$opt_vi_js_settings]['font'] = sanitize_text_field($item[self::$opt_vi_js_settings]['font']); if (empty($item[self::$opt_vi_js_settings]['font'])) { $item[self::$opt_vi_js_settings]['font'] = 'Arial'; } if (!is_numeric($item[self::$opt_vi_js_settings]['fontSize']) || intval($item[self::$opt_vi_js_settings]['fontSize']) < 0) { $item[self::$opt_vi_js_settings]['fontSize'] = 12; } if (empty($messages)) { $js = self::vi_cache_js($item[self::$opt_vi_js_settings]); if ($js === true) { $item[self::$opt_vi_js_script] = self::$alloptions[self::$opt_vi_js_script]; } else { $messages[] = 'For your security, a quick re-authentication is required to save your most recent customizations. Simply log out of this Ads Settings page with the "Logout" button right above and then log back in with your vi login and password. '; $messages = array_merge($messages, $js); } } if (empty($messages)) { return true; } return $messages; } public static function vi_print_toggle_button() { ?> self::$alloptions[self::$opt_vi_js_settings], self::$opt_vi_js_script => self::$alloptions[self::$opt_vi_js_script], self::$opt_vi_js_posttypes => self::$alloptions[self::$opt_vi_js_posttypes], self::$opt_vi_js_position => self::$alloptions[self::$opt_vi_js_position], self::$opt_vi_show_gdpr_authorization => self::$alloptions[self::$opt_vi_show_gdpr_authorization], self::$opt_vi_show_privacy_button => self::$alloptions[self::$opt_vi_show_privacy_button] ); if (wp_verify_nonce(filter_input(INPUT_POST, 'nonce'), basename(__FILE__))) { $post_vars = stripslashes_deep($_POST); if (!array_key_exists(self::$opt_vi_js_posttypes, $post_vars)) { $post_vars[self::$opt_vi_js_posttypes] = array(); } $post_vars = shortcode_atts($item, $post_vars); $item[self::$opt_vi_js_settings] = $post_vars[self::$opt_vi_js_settings] + $item[self::$opt_vi_js_settings]; $item[self::$opt_vi_js_posttypes] = $post_vars[self::$opt_vi_js_posttypes]; $item[self::$opt_vi_js_position] = $post_vars[self::$opt_vi_js_position]; $item[self::$opt_vi_show_gdpr_authorization] = self::postchecked(self::$opt_vi_show_gdpr_authorization) ? 1 : 0; $item[self::$opt_vi_show_privacy_button] = self::postchecked(self::$opt_vi_show_privacy_button) ? 1 : 0; $item_valid = self::vi_admin_dashboard_valid($item); //$item_valid = array('
    _post: ' . print_r(stripslashes_deep($_POST), true) . '
    ', '
    item: ' . print_r($item, true) . '
    '); if ($item_valid === true) { self::update_option_set($item); $message = 'Settings were successfully saved. Now you can turn on vi ads above. Note: changes may take a few minutes to appear on your website. If you are using a separate caching plugin, you need to reset your cache to see any changes.'; } else { $notice = wp_kses_post(implode('
    ', $item_valid)); } } ?>

    Video Ad Settings Logout of vi settings

    This feature is being deprecated in the next version. Please contact ext@embedplus.com for questions.


    Congrats! Ads are now on. Here are some tips to maximize your fill rate and therefore revenue:

    • Visibility - The higher the player is placed, the greater the demand and fill rate. Inserting it near the top or middle of your pages are best.
    • Ad Unit Size - The recommended minimum width for the player is 336px
    • Give vi.ai about 2-3 weeks to optimize their inventory for your site
    • Contact us for help if you have any questions: ext@embedplus.com

    '; // print_r(_get_cron_array()); // echo ''; ?>

    How It Works

    Before you begin, please turn off any ad blocker extensions you may have, so that you will see how your ads look. Then follow the steps below:


    1

    Video Categories

    Categorize your site to help match with the right ads.

    2

    Appearance

    Customize how the ad player should look.

    3

    Placement

    Decide where the ad player should be placed.

    4

    Turn It On

    Click the colored button at the top right of this page to make the ad player visible.

    5

    Ads.txt Verification

    Verify your ads.txt file to start earning revenue.

    6

    Revenue Reporting

    View reports on your CPM, revenue, and more.

    7

    Profile Settings

    Collect your earnings in a few days via PayPal or bank transfer.

    Trouble getting content that fits your site, even with the proper settings above/below? Contact support at ext@embedplus.com

    1 Video Categories (Multiple Allowed)

    Your video ad will be optimized to relate to your site's content and the one or more categories you select below. Note that the quality of the matches improves over time.

    Tip: select more than one category to add variety to your video ads. If you select more than one, you must stay logged in to this settings page for your categories to automatically add variety to your ads.

    Select the categories that most fit your website. You can select up to 4. Filter by:

    Your Selected Categories:

    2 Appearance

    Customize your ad unit's visual appearance below.

    Appearance Demo

    AD + CONTENT
    Example vi Story Title Text
    featured by
    languages)) { ?>
    Select a background color that will enable the ad to blend in with your site's theme.
    Select a text color that will enable the ad to blend in with your site's theme.
    Select the font that matches your site's theme the most.
    Select the font size for your ad.
    Select from the available list of languages.

    Sizing Tips

    The video ad's player will be as large as the container it’s in. If you’d like to change the default size to something smaller, you’ll just need to add some CSS to your website's theme as follows:

    1. You'll be using your site's theme customizer. In the WordPress admin menu on the left, go to Appearance > Customize.
    2. On the customizer page, scroll down in the left menu to "Additional CSS" and click on it.
    3. You'll have a textbox to paste in the following CSS (change 480 to your desired max width in pixels):

    4. When done, click on the "Publish" button at the top to save your change, and then the X to close the theme customizer.

    3 Placement

    You can choose to place your ad automatically, or manually using a shortcode, or in a specific spot in your theme code. Each method is explained below.

    After you finish choosing your placement preferences below, 1) Click on "Save Changes", and 2) turn on the ads using the button at the top of this screen.

    Note: The ad player will auto-fit to its container when loaded.

    Automatic: Top or Bottom

    You can have your ad automatically placed at the top or bottom of your post content--right above your first paragraph (top), or right under your last paragraph (bottom). For optimal revenue, we recommend using the "Top" option:

    Next, just check which types of posts you desire to have the ad appear, and the plugin will take care of the rest. You'll start seeing the ads on your pages after pressing the "Save Changes" button on the bottom right, and turning "ON" vi ads with the top right button.

      true), 'objects'); foreach ($all_post_types as $pt) { ?>

    Note that only one ad can appear on a page, but if you'd like more control of exactly where it's placed, see the "Manual" or "Theme Code" directions in the next sections.

    Manual: Shortcode or Gutenberg Block

    If you didn't select any of the automatic options above, you can manually insert your ad in text widgets, and in specific posts or pages. See the below screenshot to find the button you can use to manually embed the ad code. (or, use this shortcode directly: [embed-vi-ad]). We're quite happy to help you if you aren't sure what to do, especially due the newness of the new Gutenberg editor. Just email us at ext@embedplus.com

    By the way, if you did make an automatic selection above, do not make any manual insertions. Skip the remaining options on this page, since only one ad code/script is allowed per page and the above has got you covered.

    Theme Code (advanced)

    You can also position the ad directly in your theme code. Copy the PHP code below and paste it where you would like it to appear in your theme.

    echo do_shortcode("[embed-vi-ad]");

    Trouble with your ads.txt verification? Contact support at ext@embedplus.com

    5 Ads.txt Verification

    In order for your ads to start generating revenue, verify your ads.txt file.

    Are you also running Google Adsense ads on your site? If so, also add the following line which is recommended by Google for ads.txt files (replace the 0000000000000000 with your actual publisher ID as provided by Google).

    google.com, pub-0000000000000000, DIRECT, f08c47fec0942fa0

    6 Revenue Reporting

    Total Earnings

    To view more detailed reports on your ad's performance and stats, click here to automatically login to your vi account. Then click on the "Reports" tab as shown below.

    Total Earnings

    No Data

    Monthly Earnings Graph



    No Data

    Trouble showing the reports? Please try again later, or contact support at ext@embedplus.com

    7 Profile Settings

    To enter where you would like to receive your payments, click here to automatically login to your dashboard on vi.ai. Your deposit options, which include bank transfer or PayPal, are found in the "Settings" tab:

    Trouble automatically logging in? Manually login here using the email you signed up with.

    Privacy

    FAQs

    • What kind of video ad unit am I embedding?

      It's a unique type of ad unit called a "vi story," which is essentially a video ad wrapped with engaging content related to your website. View a demo here (be sure to turn off ad-blocker to preview the demo).

      Your ad unit will display content from quality sources like:

    • Why embed an ad unit that also includes a story, rather than just an ad?

      Simply put, advertisers pay more for video advertising when it's matched with video content. With both, you'll increase your visitors' time-on-site and even command up to 10x higher CPM than regular display advertising.

    • What is my ads.txt file for?

      This is an industry standard (IAB-approved) text file that aims to prevent unauthorized inventory sales. Basically, it helps increase your revenue by verifying to ad buyers that you have a valid site that they are buying ad space for.

    • What is the best place to put my ad?

      To optimize your revenue, we strongly recommend embedding the ad "above the fold" when possible (lower placements tend to yield much less revenue). In general, the higher the placement, the better engagement and revenue. The automatic placement options place the ad at the top of your content area for you, but keep this tip in mind whenever you manually embed the ad.

    • Why are there no ads, even though I added the code (manually or automatically)?

      It's likely that you've added more than one ad script/code to your pages. Perhaps you selected the automatic placement on a post/page but also inserted a separate piece of code/script manually. At this time, only one ad is allowed per page. If you insert more, then no ads might be visible.

    • Is this video intelligence (vi) monetization feature compatible with Google Adsense?

      Yes. Many publishers are in fact running both Adsense and vi at the same time. Like vi, Google Adsense recommends that you have an ads.txt in your root folder. Therefore, you should also include the following line in your ads.txt -- either before or after the lines you inserted for vi (replace the 0000000000000000 with the actual publisher ID provided by Google):

      google.com, pub-0000000000000000, DIRECT, f08c47fec0942fa0

    • How do I resize the ad?

      The video ad's player will be as large as the container it’s in. If you’d like to change the default size to something smaller, you’ll just need to add some CSS to your website's theme as follows:

      1. You'll be using your site's theme customizer. In the WordPress admin menu on the left, go to Appearance > Customize.
      2. On the customizer page, scroll down in the left menu to "Additional CSS" and click on it.
      3. You'll have a textbox to paste in the following CSS (change 480 to your desired max width in pixels):

      4. When done, click on the "Publish" button at the top to save your change, and then the X to close the theme customizer.
    • I don't want my ad to follow me as I scroll.

      This is a feature that greatly increases your rate of revenue. If you would like to turn if off, please contact support.

    • When will I start seeing ads within the vi story?

      It can vary depending on which countries the bulk of your traffic is coming from. For most countries it takes about 1 to 2 days. If you have questions, email us at ext@embedplus.com

    • How do I change the number of ads that are shown for each vi story I embed?

      vi manages the maximum number of ads and time between them based on each publisher. This is to optimize the fill rates and monetization. If you would like some custom settings, please contact support.

    • Why am I seeing ads that do not match my site's topics?

      1. Wait for 24 hours to give the video intelligence service time to learn more about your site.
      2. Check each category and its subcategories to see if there is a better fit for your site’s topics than your initial selections.
      3. If you're still not seeing well-matched ads, it's likely that your site's topics are very specific or they are based on categories in which vi.ai is still building inventory. In the meantime, try and find other categories that you think will be of interest to your audience.
      4. If all else fails, please contact support.

    To see a comprehensive list of FAQs, please visit vi FAQs.

    Earnings & Payment Support

    For issues on the advertising program, your earnings, and vi: video intelligence: please contact ext@embedplus.com.

    Join over 40,000 publishers making money embedding high quality video ads
    '; self::vi_print_toggle_button(); echo ''; } ?>

    If you're using a separate caching plugin and you do not see your changes after saving, you need to reset your cache.

    0 && self::vi_logged_in()) { $last_category_update = strtotime(self::$alloptions[self::$opt_vi_last_category_update]); $last_category_update_plus = strtotime(self::$alloptions[self::$opt_vi_last_category_update] . ' + ' . self::$vi_last_category_update_interval); if ($last_category_update_plus < time()) { $success = self::vi_cache_js(self::$alloptions[self::$opt_vi_js_settings]); if ($success !== true) { self::vi_token_expire(); } } } self::$vi_script_tag_done = true; $scriptTag = '
    '; return $scriptTag; } return ''; } public static function vi_js_placement($content) { //$mainquery = is_main_query(); if (!self::$vi_script_tag_done && self::$alloptions[self::$opt_vi_active] && self::vi_script_setup_done()) { if (!empty(self::$alloptions[self::$opt_vi_js_posttypes])) { $singular = is_singular(self::$alloptions[self::$opt_vi_js_posttypes]); if ($singular && in_the_loop()) { return self::$alloptions[self::$opt_vi_js_position] == 'top' ? self::vi_script_tag() . $content : $content . self::vi_script_tag(); } } } return $content; } public static function vi_js_shortcode($atts, $content = null) { return self::vi_script_tag(); } public static function wp_insert_vi_api_is_eu() { $userIp = $_SERVER["REMOTE_ADDR"]; if (defined('VI_EU_TEST')) { $userIp = '185.216.33.82'; // force EU for testing } $isEU = get_transient('wp_insert_vi_api_is_eu_' . $userIp); if ($isEU === false) { try { $response = wp_remote_get( 'http://gdpr-check.net/gdpr/is-eu?ip=' . $userIp, array('timeout' => 15) ); if (!is_wp_error($response)) { if (200 == wp_remote_retrieve_response_code($response)) { $responseBody = json_decode($response['body']); if ((json_last_error() == JSON_ERROR_NONE)) { if ((isset($responseBody->is_eu)) && ($responseBody->is_eu == '1')) { delete_transient('wp_insert_vi_api_is_eu_' . $userIp); set_transient('wp_insert_vi_api_is_eu_' . $userIp, '1', WEEK_IN_SECONDS); return true; } else { delete_transient('wp_insert_vi_api_is_eu_' . $userIp); set_transient('wp_insert_vi_api_is_eu_' . $userIp, '0', WEEK_IN_SECONDS); return false; } } else { return false; } } else { return false; } } } catch (Exception $ex) { return false; } } else { if ($isEU == '1') { return true; } else { return false; } } } public static function wp_insert_vi_gdpr_popup_init() { if ((bool) self::$alloptions[self::$opt_vi_show_gdpr_authorization] || defined('VI_EU_TEST')) { add_action('init', array(self::class, 'wp_insert_vi_gdpr_data_init')); add_action('wp_enqueue_scripts', array(self::class, 'wp_insert_vi_gdpr_popup_wp_enqueue')); add_action('wp_footer', array(self::class, 'wp_insert_vi_gdpr_popup_wp_footer')); } } public static function wp_insert_vi_gdpr_popup_wp_enqueue() { wp_enqueue_style('wp_insert_vi_gdpr_css', plugins_url('styles/ytvi-gdpr' . self::$min . '.css', __FILE__), array(), self::$version); wp_enqueue_script('wp_insert_vi_gdpr_js', plugins_url('scripts/ytvi-gdpr' . self::$min . '.js', __FILE__), array('jquery'), self::$version, true); } public static function wp_insert_vi_gdpr_popup_wp_footer() { $showViConsent = true; $isEU = self::wp_insert_vi_api_is_eu(); if (isset($_COOKIE['Viconsent'])) { $showViConsent = false; } $labels = array(); $viConsentPopupContent = isset(self::$alloptions[self::$opt_vi_endpoints]->consentPopupContent) ? self::$alloptions[self::$opt_vi_endpoints]->consentPopupContent : false; if ($viConsentPopupContent != false) { $lang = isset(self::$alloptions[self::$opt_vi_js_settings]['language']) ? self::$alloptions[self::$opt_vi_js_settings]['language'] : 'en-us'; switch ($lang) { case 'de-de': $labels['popupContent'] = $viConsentPopupContent->es; $labels['accept'] = 'acepto'; $labels['donotaccept'] = 'no acepto'; $labels['showPurposes'] = 'Mostrar propósitos'; $labels['showVendors'] = 'Mostrar vendedores'; break; case 'fr-fr': $labels['popupContent'] = $viConsentPopupContent->fr; $labels['accept'] = 'J’accepte'; $labels['donotaccept'] = 'Je n’accepte pas'; $labels['showPurposes'] = 'Plus de details'; $labels['showVendors'] = 'Montrez les vendeurs'; break; case 'en-us': default: $labels['popupContent'] = $viConsentPopupContent->en; $labels['accept'] = 'I accept'; $labels['donotaccept'] = 'I do not accept'; $labels['showPurposes'] = 'View purposes'; $labels['showVendors'] = 'View vendors'; break; } } ?> prefix . 'vi_consent_logs'; $query = $wpdb->prepare("SHOW TABLES LIKE %s", $wpdb->esc_like($table_name)); if ($wpdb->get_var($query) != $table_name) { self::vi_db_init_schema(); } $viconsent = array( 'id' => 0, 'viconsent' => (isset($_COOKIE['Viconsent']) ? $_COOKIE['Viconsent'] : ''), 'date_created' => date('Y-m-d H:i:s') ); $result = $wpdb->insert($table_name, $viconsent); die(); } } public static function vi_db_init_schema() { try { global $wpdb; $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE " . $wpdb->prefix . 'vi_consent_logs' . " ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, viconsent varchar(1000) NOT NULL DEFAULT '', date_created datetime NOT NULL, PRIMARY KEY (id) ) $charset_collate;"; require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); dbDelta($sql); } catch (Exception $ex) { } } public static function vi_cron_interval($schedules) { $schedules['ytvi_fifteen_days'] = array( 'interval' => 1296000, 'display' => esc_html__('Every 15 Days'), ); $schedules['ytvi_two_minutes'] = array( 'interval' => 120, 'display' => esc_html__('Every 2 Minutes'), ); return $schedules; } public static function vi_cron_cache_js() { } public static function vi_ever_logged_in() { return self::$alloptions[self::$opt_vi_last_login] != self::$vi_default_date; } public static function vi_last_login_valid() { $last_login = strtotime(self::$alloptions[self::$opt_vi_last_login]); $last_login_plus = strtotime(self::$alloptions[self::$opt_vi_last_login] . ' + 29 days'); //$last_login_plus = strtotime(self::$alloptions[self::$opt_vi_last_login] . ' + 2 minutes'); if ($last_login_plus < time()) { return false; } return true; } public static function vi_token_expire() { try { self::vi_cron_stop(); if (self::vi_logged_in() && !self::vi_last_login_valid()) { self::update_option_set(array( self::$opt_vi_token => '' )); } else if (self::vi_logged_in() && filter_input(INPUT_SERVER, 'REQUEST_METHOD') != 'POST' && ((is_admin() && filter_input(INPUT_GET, 'page') == 'youtube-ep-vi') || !is_admin()) ) // (&& not $_POSTing anything, && on monetize page) || NOT admin page...e.g. category randomization { $adsTxtAPI = self::$alloptions[self::$opt_vi_endpoints]->adsTxtAPI; $tokenCheck = self::vi_remote_get($adsTxtAPI); $tokenCheck_valid = self::vi_adstxt_api_valid($tokenCheck); if ($tokenCheck_valid !== true) // do a token check. if invalid, then: { self::update_option_set(array( self::$opt_vi_token => false )); if (is_admin()) { wp_safe_redirect(admin_url('admin.php?page=youtube-ep-vi')); exit; } } } } catch (Exception $ex) { } } ///////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// public static function gb_block_assets() { // frontend+backend styles. wp_enqueue_style('epytgb-style-css', plugins_url('dist/blocks.style.build.css', __FILE__), array('wp-blocks'), self::$version); } public static function gb_editor_assets() { // backend styels self::ytprefsscript(); self::fitvids(); if (!empty(self::$alloptions[self::$opt_not_live_on_channel])) { add_action("admin_print_footer_scripts", array(self::class, 'live_fallback_template')); } if (!self::is_restrict_wizard() && current_user_can('edit_posts')) { // Scripts. wp_enqueue_script( 'epytgb-block-js', // Handle. plugins_url('/dist/blocks.build.js', __FILE__), // Block.build.js: We register the block here. Built with Webpack. array('wp-blocks', 'wp-i18n', 'wp-element'), // Dependencies, defined above. self::$version, true // Enqueue the script in the footer. ); // Styles. wp_enqueue_style( 'epytgb-block-editor-css', // Handle. plugins_url('dist/blocks.editor.build.css', __FILE__), // Block editor CSS. array('wp-edit-blocks'), // Dependency to include the CSS after it. self::$version ); //wp_enqueue_style('__ytprefs_admin__vi_css', plugins_url('styles/ytvi-admin' . self::$min . '.css', __FILE__), array(), self::$version); // Tiny MCE wp_enqueue_style('__ytprefs_admin__tinymce_css', plugins_url('styles/epyt_mce_wizard_button' . self::$min . '.css', __FILE__), array(), self::$version); } } public static function gb_classic_block_setup() { if (!self::is_restrict_wizard() && current_user_can('edit_posts')) { add_thickbox(); add_filter("mce_external_plugins", array(self::class, "gb_add_tinymce_plugin")); add_filter('mce_buttons_2', array(self::class, 'gb_register_tinymce_button')); } } public static function gb_add_tinymce_plugin($plugin_array) { $plugin_array['epyt_mce_wizard_button'] = plugins_url('scripts/epyt_mce_wizard_button' . self::$min . '.js', __FILE__) . '?ver=' . self::$version; return $plugin_array; } public static function gb_register_tinymce_button($buttons) { array_push($buttons, "epyt_mce_wizard_button"); return $buttons; } public static function gb_svg_defs() { ?> array( 'shortcode' => array( 'type' => 'string' ) ), 'render_callback' => array(self::class, 'gb_render_callback_youtube'), ) ); } } public static function gb_render_callback_youtube($attributes, $content) { if ($attributes && $attributes['shortcode'] && strpos($attributes['shortcode'], '[') === 0) { $render = do_shortcode($attributes['shortcode']); if (empty($render) && stripos($attributes['shortcode'], 'live=1') !== false) { $render = 'This is a live embed that is not currently streaming. You can optionally fill out the Not Live Content field in the YouTube plugin\'s Default Settings.'; } return $render; } return isset($attributes['shortcode']) ? $attributes['shortcode'] : ''; } } // constants define('EPYT_BASE_URL', rtrim(plugins_url('', __FILE__), "\\/") . '/'); define('EPYTVI_INCLUDES_PATH', rtrim(dirname(__FILE__), "\\/") . '/includes/vi/'); define('EPYTGB_INCLUDES_PATH', rtrim(dirname(__FILE__), "\\/") . '/includes/gutenberg/'); if (!defined('EPYTVI_ENDPOINTS_URL')) define('EPYTVI_ENDPOINTS_URL', 'https://dashboard-api.vidint.net/v1/api/widget/settings'); $youtubeplgplus = new YouTubePrefs(); PKL\C)qbTbT#youtube-embed-plus/screenshot-3.jpgnu[6ExifII* (12i ' 'Adobe Photoshop CS5 Windows2013:11:21 22:37:430221djr(zHH Adobe_CMAdobed            n" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$2jǯ}v8>eu1X4K2<~nI*O:&=5[w?zͮ^f,;ZKk/?H]cdm1D4g]?%C?:?pgb_nN;j*GqQ-ͿUPu@$~ÒѐIJ Y$.1$x y5+:e~Di ƥgo*]3=i '{w~"0,s4HBBqd%]G?eC? ;;?KCtFݰ'oP&{M\`gi!}p-Wc>Yi  skf,/;]Xӻ))μiiu@CslhyeWsUϦԷaga5gC#$"=zg#4:+t~PaK]Y9L8dXWlK6pOǎy%%GF?Ƨՙ)֨lr\z7Tevb:] sZݥOm~튈ؗ sV&VRQ^apޓ7}5Srٱ uEd9Y B\GwTGe^-pfkOFEoKH c۷))FPW!k$^gޝJ8c|z.! ~Kph VՕYcv4uNuc1sͿ8-ih#w}WoOz"PH3ۂ_,CYTev]FMAVEeWk=t,~e׹ I$l63mNorfsseg;qpkk}lM"P6j&]c`ׂ+-fHey.QbTT,ݿf'YJZ\OPcpEturHF_v.E=ulk,ui;,-h4$]z_w:]Zzv->̦i{Q8zuE׷h>> n,.B-wVٹdk[p[qɍsk6ߢRY;wo#ct]l쟲}7-p7mZ*a%KW[~3Zګm{^֛=ٿԔ5}VmՏ{Eid56ߋwOҭ~_eaťGFˆuq}bzv={+iszvjVcm~U.~聥Bu_zWݮ=71@Oky Z]f;vk m_r>tÅ0mvs;`uB\`)kC쮳e̫pis׼[ԔbETF3Mnd=q*f h}ms1 ]}6Ƶ n?7))eg[FU4km0}?5ott6uP]:Ktvz侲}Jcmyp,x_I宽F:kCϘ"۱'\^,g'ec:֒{N=ѠI#RzhE}97C}q}Z"?_4?.~܌C蠳eVjD,XyijLH5,|e8A;lnj5-MoؒtJNe'*{fXQګ~[Wedǰףu[ ㊝k-==_CMu6Swo^fmd<TCRֆ^5 C1/Ho# 3@٧0SϽֶvYnݿn JPR-5us_;kXpkljms{8V}6>ٻj̮k\:ʚ'Ƭ^6(bQ߆@ˋqk[\O =m?]Mwj?K?g^U;*ʺp$c a.7sZP> 7i`in{z{Q=6cՃ$ .k񅅮p}VSw]cJZ}6dx[?Esb\>!gO廥2+iX, .cM{_Vx=U-}7RZM=$5}n8'?v%=CvS"gSSm6o!Nͻ9[ϭcN9Y?QoKI^f0ivrA'b]2]NDj<xLqp  G%52NdNV{]V(ӝӟUnWk63yeջ_nF]Sse߽ީӃ^m:.h_[zv bGoW$3VϠthۗ}dmcq}\&=ֽ5;jEnoӺkR-ÿ-ځs7wYlwMKY1mMƸH<[J@3\ ^gw16f}N};h)Zszw`Sa䈾k243U-cZMnwm{j?9^owSg]oʭVߐYA%>=FojgرYNK}Xl *Pʽj+ɰxaߣ^IwONMג\8OI7GO<7BQCxUsg;_n A݅`2RVz7DoG8$7fOku6oz#)j An{Y226ek\8+?GSv~V+zV}2 89*fCIdékv:y{X=TCHwsMS{>'I,cZb$4UedY9q%)Wzr{A}nF֢?aA-]w~PgD )zn*e>;wEm?h+Z{ۯT]n5{[<"[DH"$<,ozo 6{ ұڭ}nqvGU,ppPդ^ DbݴI$IJI$RƵ5kyEkPkNcgk?{VYkMh>ukn6c=;cWTSգ]~$7*3pw -nҲM1AqF۽hsm~߲XѮ7u_K31 }dooSYXgm4ai E߿K⪟VjckoڇT+YlNk\Km.snEKꫭ{-;ZӢq>kI&I$JRI$ZC Ð 8f;vl}~O=~wZgԃ޽Y-u˦\ ?fb"oAnĴ5.uwuo3۠-PTݏg9 ;qtM_7ץdq 0}:^{Whԗo}inͮ>~P-;ӝq"eޫA2mnCk.uAucP1-X\m#VW<ͬ<{R* MZm,I=ܷ?ꘕX̩$#TT4jъ?~ν%Wm< O FdmzAH%!5y8$I?]uiI % <Y縸`im, mԉe\{Kg_};irWbu+2so릶moXEu{n?IԺ$]GPlH.a q}*۷)\mgR$טjK5̯u7gS/7u?Uėg9 kp{nwQ@;yȓ!S^Fo?XXW"lz\s[/yMoL}cAztxZOWBXXΡEgq6Hݺ~Փ@Ա\o̓vN ?q#X8T*[w>SZR7}oKTϩqQߪ=WI O AvFL_32 }b XȂ Lc&ݝW!7X_RS$Photoshop 3.08BIMZ%G 8BIM% .ͨvYk8BIM: printOutputPstSboolInteenumInteClrmprintSixteenBitbool printerNameTEXTHP Officejet Pro L7500 Series8BIM;printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@Y8BIMHH8BIM&?8BIM 8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMMd screenshot-3dnullboundsObjcRct1Top longLeftlongBtomlongdRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongdRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM8BIM n@ Adobe_CMAdobed            n" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TI%)$2jǯ}v8>eu1X4K2<~nI*O:&=5[w?zͮ^f,;ZKk/?H]cdm1D4g]?%C?:?pgb_nN;j*GqQ-ͿUPu@$~ÒѐIJ Y$.1$x y5+:e~Di ƥgo*]3=i '{w~"0,s4HBBqd%]G?eC? ;;?KCtFݰ'oP&{M\`gi!}p-Wc>Yi  skf,/;]Xӻ))μiiu@CslhyeWsUϦԷaga5gC#$"=zg#4:+t~PaK]Y9L8dXWlK6pOǎy%%GF?Ƨՙ)֨lr\z7Tevb:] sZݥOm~튈ؗ sV&VRQ^apޓ7}5Srٱ uEd9Y B\GwTGe^-pfkOFEoKH c۷))FPW!k$^gޝJ8c|z.! ~Kph VՕYcv4uNuc1sͿ8-ih#w}WoOz"PH3ۂ_,CYTev]FMAVEeWk=t,~e׹ I$l63mNorfsseg;qpkk}lM"P6j&]c`ׂ+-fHey.QbTT,ݿf'YJZ\OPcpEturHF_v.E=ulk,ui;,-h4$]z_w:]Zzv->̦i{Q8zuE׷h>> n,.B-wVٹdk[p[qɍsk6ߢRY;wo#ct]l쟲}7-p7mZ*a%KW[~3Zګm{^֛=ٿԔ5}VmՏ{Eid56ߋwOҭ~_eaťGFˆuq}bzv={+iszvjVcm~U.~聥Bu_zWݮ=71@Oky Z]f;vk m_r>tÅ0mvs;`uB\`)kC쮳e̫pis׼[ԔbETF3Mnd=q*f h}ms1 ]}6Ƶ n?7))eg[FU4km0}?5ott6uP]:Ktvz侲}Jcmyp,x_I宽F:kCϘ"۱'\^,g'ec:֒{N=ѠI#RzhE}97C}q}Z"?_4?.~܌C蠳eVjD,XyijLH5,|e8A;lnj5-MoؒtJNe'*{fXQګ~[Wedǰףu[ ㊝k-==_CMu6Swo^fmd<TCRֆ^5 C1/Ho# 3@٧0SϽֶvYnݿn JPR-5us_;kXpkljms{8V}6>ٻj̮k\:ʚ'Ƭ^6(bQ߆@ˋqk[\O =m?]Mwj?K?g^U;*ʺp$c a.7sZP> 7i`in{z{Q=6cՃ$ .k񅅮p}VSw]cJZ}6dx[?Esb\>!gO廥2+iX, .cM{_Vx=U-}7RZM=$5}n8'?v%=CvS"gSSm6o!Nͻ9[ϭcN9Y?QoKI^f0ivrA'b]2]NDj<xLqp  G%52NdNV{]V(ӝӟUnWk63yeջ_nF]Sse߽ީӃ^m:.h_[zv bGoW$3VϠthۗ}dmcq}\&=ֽ5;jEnoӺkR-ÿ-ځs7wYlwMKY1mMƸH<[J@3\ ^gw16f}N};h)Zszw`Sa䈾k243U-cZMnwm{j?9^owSg]oʭVߐYA%>=FojgرYNK}Xl *Pʽj+ɰxaߣ^IwONMג\8OI7GO<7BQCxUsg;_n A݅`2RVz7DoG8$7fOku6oz#)j An{Y226ek\8+?GSv~V+zV}2 89*fCIdékv:y{X=TCHwsMS{>'I,cZb$4UedY9q%)Wzr{A}nF֢?aA-]w~PgD )zn*e>;wEm?h+Z{ۯT]n5{[<"[DH"$<,ozo 6{ ұڭ}nqvGU,ppPդ^ DbݴI$IJI$RƵ5kyEkPkNcgk?{VYkMh>ukn6c=;cWTSգ]~$7*3pw -nҲM1AqF۽hsm~߲XѮ7u_K31 }dooSYXgm4ai E߿K⪟VjckoڇT+YlNk\Km.snEKꫭ{-;ZӢq>kI&I$JRI$ZC Ð 8f;vl}~O=~wZgԃ޽Y-u˦\ ?fb"oAnĴ5.uwuo3۠-PTݏg9 ;qtM_7ץdq 0}:^{Whԗo}inͮ>~P-;ӝq"eޫA2mnCk.uAucP1-X\m#VW<ͬ<{R* MZm,I=ܷ?ꘕX̩$#TT4jъ?~ν%Wm< O FdmzAH%!5y8$I?]uiI % <Y縸`im, mԉe\{Kg_};irWbu+2so릶moXEu{n?IԺ$]GPlH.a q}*۷)\mgR$טjK5̯u7gS/7u?Uėg9 kp{nwQ@;yȓ!S^Fo?XXW"lz\s[/yMoL}cAztxZOWBXXΡEgq6Hݺ~Փ@Ա\o̓vN ?q#X8T*[w>SZR7}oKTϩqQߪ=WI O AvFL_32 }b XȂ Lc&ݝW!7X_RS8BIM!UAdobe PhotoshopAdobe Photoshop CS58BIM http://ns.adobe.com/xap/1.0/ Adobed@      dA     !1AQ"aq2#3 Br$tRCS4DTUu7Ӕ%5bsEWcd&vVeFf'G8!1AQaq"2BRr3bS$#Cs4Tc ?PPPPPPPP}F֠5ݡ>ԕL;qz2mj+pPq3jEWؕ@+FK<==`ﱈW>hoO4s3ȗ#j@/8@;c7򹊚Ѡbx,:9P|axe~ž`SퟬNJRHK]e>EJ? Cgۺsi;~D3p5~g[U{ 30߻UHg+#[aɿg)Q3̞P`oPP((/@@ PPPPPPP⍒O@G{p'ˊE9;[>ݛ&l7# "3*[!m.-6w,2Mkavr1Dӹ>IDwۙ@vcS`C{ç_$;M[*Mk '+=C~7,kv13So,/'!}vvAGe4"6qeb T~F|sYF4:yweAt5%$Z4iFjiygOJ}%(Ŕu&l֌9Ռ䀣FW$)Otq+WmzʔƵizds}i, nN)hђJky̛]g䵎5+UD|Yrn7_)>B6CfٹVV9 yE,4AcB\lj.?<. o~ƟI\4OܼUk熇mx_[#(Ⱦ&>M]{u&r_G%$*?U[7sFzYC/CWt QVחn1roʘfULK3U,OK%zh @ (PPPPPPP:dh0M%P4}aiTj %)T2bۢK6.rnNm9}՟YkHzFIݩ v6SxCd2yO|G6k?m<ۍ}l|Qwc"5b11 pH|vW7O7˖jmEB d@XZ\(( .agmi (ڕ~q/͈Js==tΓW#](==/ßAgeti:OiTd* \$P r<b_F6/eq4~Oo 2I' +k(Iwxd|ÿ9-t[ë%/w6GG#!hޣHei_1 BBΤx4 gwӓ֞ȴo斒_p͗.v!N<ӐψW[[NG-Jۋ UA"E(Ik|g'ˏc[0Ʋc4%`UUk,9v\ [돖&A睓bN/=EqoRs¢QD񧧓b1~.GRr{Oe1r~3;upDM)ן{9rFf7KacՋ=np-פ= C%S8GAmdtQH+ݓ=[6 :Ćۗ=-i |Z/P 5*MS!C9~4AY'&t-)O 􉀥RdIj9e%*RoTQKON7^].nx>eC\sӝv*)X%eez[cI>{=;XS觌d>z'әupeEecmM8-!Ĭl;m-.>(qnde߉b!T6=imHudjԴ²(U9iwZ\k2)JB]ܾ &30zVw)Xe@gBRR^U/+$?{BwKf=^7SSTZn3uuZ)=-~+[w.KLW*-!_rKdFpH۝'|蓓Btp`O #s1vV}+(o]բÆRW8ic{eW=PD!tBZmi% JE4uy6t(((((((]JV&l|DE<ZΥ%v'ƣh#wuRlNiRJuYb൭{+)*/n\d1ΤrP]B`ERҀĘSOkd \ Mr'pc"JBU%%HP)IU_,l;*6k7^On=—y/݊̓F *IJnH],ҴZkZViq*Zm3616,IYhY";Okm%Q p /ߍzz_v)ZsL~Wdis2RdrPm)[!^u mso9 ݍnm)-nwE HԒL'@*Z8tS >Kkf.:uYZB=Mx|^vؓ=;sDb06tqIߙyDx.+A/)NyG+cՉBp.u~ުƩdg!L>Oɏaoã@lA6q$bzeZb5_|Dޘ2oYŠa HEӼYJTۢJG0D_S^!HbiO*R(y`-\/cm)U˕QYNϗ*׽a/eF1$nm5,%78/17\\c%*-r[^Ib*ADd!ykXPJBOv+v\%8)=dI[EĻu|lrm(I jMJI6wfX8$H.=̈ RR!/&=Kʽ*TC-:/ /2SZB /*~lVW4rp͗Y=X@&IGK]8ۯ P ^z6A}煟._Dyi&H$Cۈ,-Zh^dOJ"3'dI"MsO6|I_G9-+r3Sx{@cbmܴ\ﭫT`yԆJR*:ȺIG$m;zg_Ⱦ!By9YBiEnC8[{H>r6T/i7t_ntCp싻NT 8њ#eͼBioRCt[ChPPPPPP vPzkܜw4鋵5VUڷBIj>]x=-FSߡfH )azOr^2Muq[.=|F ZfXrT8qKA)<՛OVnYy}˷5{?BtsWTGd?W@nUzz)]F^kmm,Qr.nN:eq$@iDOoDs:O􍿔6$)/t{|Fݬm`ĈrzA@z =7 -/*4-qOlVL"l6Ma $z֨%cQϾ>uaqi.0t8%>kPXg-"ds¢%eIKX8 CM@Sun-::KUz|n͏T4>ٸ}эgmt4RB Rҫ`R%@(Ecn7"%T?sFS<ڰ,g0PrsW6B񫤰0UL*++b2a!-%HJx#ԃ &؏ o+p*bCs"Z[Ba& mn--Z<(n1/dby#q}W+{WixM-{'\$L.ZWq*5R.\TT\ ƀ7>j6cG(-Mi2I"x-VdܗĻ,/cͷi-`rK&z. WR?!7@p6VrQv {g+XTYf'ۘvI\!L/R5E579mP*Z{8g_ +p('OMc uKT*בӿr7-2c?^mK גt8oҝFMba~0R~u:t*jqHJ.χVuQ9{ly^t.!/(j’i?w=hz(7r/?b.3E7,[Ͷ iVom۱ 5-Nqiz N㜞)H_[p.|\I).ݴff#ij,\YN]o~nVOqd}Njn?{ W%/weKwvaQuRXX:ʐ]*BIKR//ʌ~5ev}K|({==Y}5g* ̇[[ZMH=MgcN:]Zisa}o^2]'9#ϖ_V5plqyn|#a?PPPPPXڡܽE;5?[ӨbZO:݌o> <7m.'e[XN;9}U_q58_j|/m$Aá ^ܳ/䲳=)3$+ZpJ-\0;tԮQ(B;soVop<4[xOIM;.,=Joc?s7+ ϬAh V=-h@ A'Oڦm$VdEim`n~<.7"!â} (J %7c%u7Ɏyy|5H+nEȼ)re_FG75 j%44Ԟ{Cs?rm\7N1םL*b5v&Ia6R#?X*R\Ԙ)X"ƫ/ۼ, 6o,~SN)]~vwcJw }q:)0.zn.؛TDw iB]X)(!Zrۃn%/sRq4IuloMQ8I5nJNzVhZtdc2fVˈhʯ7Zb:Z{!HqհT›%)EV[%3/uVNN5٦-~n|z+vFմtIƏzb[[pIsϫSXÆ1"bˮ)|쭞ɾNp4Q\p5cDGqKᕻJ1wEXjZ$ӉS%28f+2ە)L,!\ń,_I<ҽb)FtJZkG$J]|՞pU~&M%%XQj`KaYkVCVri!8S YǗ˲rŹ>)D% Y?ŴvxXV#_b7(Ei)i9"KgXnm"F=JuFy!mSpMy+~~Eqcqhr7h*jP)ʘT𿺭[|-ۖ\pI(K7?4Y[sG;&.~n`2Kǖa: (mTaq/ e9:|JW5UJU+\ n'+;P)|88JqgJV>+f8\"f֑&$\E%ݏaԒRGek۷QNv>ROLb+6SN!N:rjJ;gvׁy]S\cuKj:]:YB:kyW {nVm*]LO3wpt‰U \LpU59@@@@@@@@@@@@rw>mt^ڰQ=_dm%N߿#^&!IWo@ܛaӹ)9c(RBݳ0!m]s؏Cq<}N㯅U=9׭4xc5PF+5_>4{cUU-[D#?4ّ*\ڑ%nĊ)}C8!+7@KZtnM k+5,ZqQ5>U(6x%aI\(UIin$Ҋ™pQ7wGȺQHeAHgZP-UoM.۶"p[6}m1qݞcGl곗8_Nu~}/ sU^C˫O{~۷~[7t5tOPPPPe&C1YzLLq;-coto% ^Ecl߫.?nmL|.n>2t$T)D$^W۲robْ;|?niF+b` ~M~]gA+U@A bqW@l[OL峘FKK+̘V$:4A5}4^WW2TLmo}x߁9T1Xcn^qFL?i]ҷ_9& 9F"X&`:o.(]x)kuG׼Zq#4xۈ'e׎O 6@*G"Q>!v:U1^ۑ̈́a'o~fX~vX~Xgzg){ 3}6zHϓBWx oM&va_>:[#2qy}h + UPPPPR(((((\l,Zq JЧ㾵5o5}c!/[I:s42wmN-uG6a\8}'Q4 ʝl26H)7O{H &ص6h^Qh:b{Ot+7RAJ|(_߯wT%k>&ۏ&r>[qXlWwIc\DPPPP Ϻ6{- ƣ3!%ZP{ĩJ<TxMgx[]j\,0q{~ma3;(: 4!JR`.NMIQd^$(( 5uU6 _8/ӹ^67I||2H:㩇)!%]B ԠmA#48;ЙQ[MTW ( SmK!!='ݯ:,夸%&yRJKiZU8Q+ ER5)v@mtnxaMȎ[iXS*.?J$*%I;Kltj~ރ'u'1yI[i_Ze"knOSReқT;a6V ԓџObܓ%0r<)M"0 E|-H`8m 03W)$Gk:5$((iWCTyt{h`Fo:wMdeaĎ-琁ޖIoZ>Ծj f{Ql16e-x7VkjEvMV!üQ̙Z$r64Ƃ~Bj#czhM aO-N%Rn*ZVљTthG;%j4Hn;ՍA++4&RBV(kFS#:dwz(YmE<{.(S5 )ďp_nvI9S$n-?`͋YܛV)P 6#V: :+yJE7Ƞo,_zIޞ#MImk\,K1RH@KCZիAMҞ'Hq=Fxg#e9:6&D9)Hl;5)7}]WwTr{?#z{/(/e!Z{vڀNݨڨR^ ~lYe)UuKBtjڒmM[iETCg!!&XgyiД+J*x@YV;Wl]hHV=b5(U~Uo%qr+.5'xCS}?u)??+yqS~{ p{I{\z%c|C >بG|ʽ O>R[?? ϸolq%?QO1?= ϸ7(!>*gJV7dg-Q=kqPCij-2~rx3}WoyuOcq{[P⋁yGc8?Yyq$|# iDŽ%-Ə\.+Wg|OlOiN t谙*Y l( *>uo fFEqڊ]vR@{ԏB\|$PPa9 UʈD_}^K`ty2 iozTR HZ\;+EA'\]!ckPHIQ;~yw9,\cҍ9n1 $$~7jGG'T=^{+a3YQv9 )VAMR{}=^01Bbu 9JReX\Q˷6|,V.:VF+Qd:C(:I òiVכ$4fb [@Y6HՅBf?Qp?ZMqļjdl:<ա Qm y6Jrx~z+Od^!ЋNH piRSVGnITv YF3K!B(JbPB)2,#Ƕ^D۠)9 U7?nAI~ CFQR߹ ofrOCa/(RʝuWiIRؑs]-nc)R&a~I4}:#/;O O>khCC|~: OOqh|oܿX>a~Iqh|oܿX>a~Iqh|oܿX>a~Iqh|oܿX>a~IqhGn`[_PgnlSQui\ԸjzUێVw,rNRYO4V 8jtΣ//P9mIV;-.E ,/?䌥QFhUw_([$=E{ïՐ;hS0k-<ְW“>t,JHFo%ʌHg}m6gJu> vp5&ق8x /Enx̵VTpZՊ7LƧ׹II]ЯIAgՔh7?qUį 8(!D}tA{;/M̒+J[z7v$E71qqfr2m?)E55&M-`%\ QUγ? k0]ZݝlsҔ Nrx֧3^Ϫ}SN'5Չ}t\${gr񔪾}$x{mU]4%ƅc~@%]- vV_g" [n%A]7 p!?Ԭ̐Tc!9Ca瓵77!bHr;8C yE)Ң@m%-EФ+άۭ4ˊGN21&iVI }46V=*lE= ؠ!`ݢSm˕El\-*N0'8,ZF^Ss0.=Ij~j|~FAX&J~?&7-ȏ(;"$~ܷ"vL<B+-Ek%W*4_e>ׂC$g#䟂yD[渐HsB - xn;0UW-nSk3c3T#ʴdZZ+PsdTbUc$WO_$RI9o.x64I#o.]Uu?8mOEeDN^c- Ԕ&RƔOy/8fϛN> j7.G?r7r&3|5&u'KLNcDye+Tko ,2ce-֒^qi4cI-Tjݧ?Û樃N;z$w$Ŀ rM<@IH_ RUv^e(SQ{i޹(ߥEuLMqOplq9x]ẏ6&kO?-l!e.P)PE%%2ێZ~g d#G"be"CҌRjq_G©f⦮7$M9/[~֛g K X)\NZhi/6\mIֲZ )Nn^eJS< ^-v`֝&o>ߙ߰ydؤP'IRJHE>nNJ(zHF {d_ުgBGd?W@/$I+{M9Kž}amh )>QƱ.[mrpKD\\ixҦ1o= i42椏+Jqu:h4ճ;n 2"hH[֧SqQ _.~GlB<ɈjJѢֹ[6x}4Cf(K19܆JC$+4:֩ Up9wvOLEMpm99W322)-)yTorx՗xkvŖZ Γt' WDMޓz!QT1.~N$X=$6d)F@נ:լoIn`[Bo-¶]\֢54%S&Ym(( E쬸4w+Qoj3 GskSAԩhR}5&VN(A-GɧBSZ)3vm5)Gĉ}͇JT6 h;6D~ ŖIaEGpiZ;BxTqeGPaki7ӌhg&F6㍩QIq _*$|SM! -ÍMW䵖@~6U[Ѷ=͛ݸY{,Oj*岥6㠤8 _@}S0Y Yrv2l I2< = gZwflzrہb㊞ ˉo'^"eA>uY=V ⧢iz_e^ѵR:|Fk*<%mןC-iR[+#RT.nȸ1k7ZI$xnk8uZRkiS}Mrv+mqJgY-:["Q)pCiHIZ@8pj :nҍFseY,HqZrCaXu%-$- mK(]5ĄM"ޕa&ryb9ì!iLjUl}MsUU-}=^ ݷܸfQs1.(*: v}cҔe6^>Und1SnMTk_ыJw+*?GD?'"LmOuo[;?pQL,/9JUtjox"7'g]#Wٹr\ス2^-ٿw/TvPz.eH_o+EFrkRqO |yp7mRS[rC7f܉MDt+yoۨy:T(I{Liى,)5ڨ630nY-zRB ZSS!]:֕i z%$`jN>fB63L~#ra_nM˷cGU5qq1;1Z  Rs.MJO46h_SRR[+u}^+sk'%%qle\a ,́up-&ah^igiXbIrOqLg1(dS`4Xu%NWxiҠtd֔u۵xR5mʹ]iu*eR_bT,Z "L$(2MIBueh0:rO/]_3_hpoU:Gd?W@+}%t l XsZQ (hݬW ̖$IDxƦlDjh ֎>jЍ< q]|{&Ǥ#!8AjZG[;mEybHZxl'S /OSO v-UGO uk19l2$eO#JR]w#߯'iJX~'Rޟfs%{3UTdK@)'VϔFx(s+X.4jO놽UTpz\FmLk(0"rʤDc[ev܁͔ O6|[&7xE^+md %Bq׬/r]hf(N"|٬iS"5ˍf&lB|TWZK} B5$4XT.m;'M̿[LRAj93-ޜzF6=CLFD p %J4FUO/*7_Uqbc')PͺڼZx2͞7˗5{=fI{'f,>iSPۡ@$p/Y.q NPF nHDH9,._y(jKUdmZ%*w{j+wu}2eXgy_Ql.<[#Y>n30OɸFJ;Gd]m}{ Wi~XPy-Ʋؽju5/yw vg8}o'iˆYGsqd i7W߇#ݵG:ם؝ h gd἗REZ =gbNVMuIQ303UUO:G:_F5̂[1"gHnHeLJ͋To](yXrճqi){+tlmO=ftv<.C \Jd ök6z.3ORڶaTW?U:)&tv nU o 6fb) GDe;Rt!E:訦n+J{Wūo"t.3sIXS[I Me m2YGB\vZ:[Ҕt=T@kOÞЙ12qWGb-./ܹIݽIw#SZO|l?&o+_s3ϚM{Mk!Ĺ|l?&o+_%d^G!4SZ.~f4#{9ɧ C=s0׻~M?V"K#FݔRr.|NoNJ+!I]aHRGXv(NܒjUMWp].<7(5j[ ou[m?ӽ,Øy0Y5j8%%_,{u(;5TvzލQǙ[yۗݖΉQx0}# @U2 ;Jjf ; v0}Q]…{jUM]Q֥-Qp<'F-MkFE~m##o=?-s׍e"*u"|2B:&)*{``J&$fԥ*l/Eaӎ>ݏ*C.g2Wm ^J-ٵcy.זּڽ;gq ;rLǑ~[EЀe, ~=vUVF7"fFT3+Vj+BAHlXNkjy3P/W~2Hkݩe ixl/Y8hk'Ѩ[e`E*]Xƨi{:0 >DqRFŜmHP&ް|-(o+Rgseg{I+ǷZgX/a9fV0=?W!Jtl\,,A"Ddܐ9X(MHVӣ7*vޜ -^Gl>pVK<c7H̼ pvgv @yL hʉf%c1R$<4["-4 ,A޸9$`IZԥ~)iꪍS'5'x@1o!ReED{I9RS(uedX L]Tn3 N[98UeZ\7ߧunFƃ'>$MBD( PK-!IL2q$K-/Mޥڊ}ECzo]猟;g%:$,.:%u'(ؒPon֓+TZ\O7`񉸡.;z6w/LTYﶄc'XZe).JR ٺ4+RRX&-5W?E+ηdK$ol͉rI|ddU#s4:iEmJ18EWQvcRj֔tm3!P{q k܁7Cno?ktv!@$MqcCj4Ɇ⬐~?t|3h DO@Z$j3bJ</%L0'IQ Y€kO郛{> ɹTVqZ7,j6н$pi| :|+~ߺ)ӥ/,-^Uz*as-=msP]IC/eH".q]@tS+9]Ä<*q8.0j Ne 4]%Iٍ-(qm}Ӌ+RҺ]M+v`%EI2i+\dwԒWܲF_ì^u{2qw^ej>HR.msµ8?ݎֹWr'vgE>@[7E 5·8Kgm+1@@@% <bWD6=qYg'h#2\e"GB jzJ78!wSLhڼPwWbZ_vtɪ:ռySpҿ[g퍳.g7',z$*tI(-:MgKg~ yx4ש`#͡* ko96fYߛc3bpZ9KP1+CV-zdRUU"oV4xQ/-D$ڏTc/eʻF)I(n^Sw⟦G}oLݕ#-#yx2LC%H):.Ԫ+}p-6J; WftX9h24 K8Fd#̈E#"hey&g|}dv|ޝϚ 6qGėZ)*aI1 )7\:|5}!-RQNU;Ntewg<XiXDn:KiåЇQi:= %t]RiwjZV+#jީ5LiW:KQ}ZN@ 5/D^EبC2(' JVk Vg6m{jђJQ0&AdI7"+RcpjQE&e%aŕ+0CeFHW/k$W)Nq~_7t5t "iN#/:HYmali)Jȶ#O ^evLvYTFIBREo5FČ2%pHDfc BLTM88{z!3Su!nM[ I]D@5:+1ьE̚C"R9R. &y@1ݱ'Su3pYemLSӊ[iY.ο5,פ?V//9\?[v/7/vK\¿ZYqx)IiHK(Dvp6wHyd׎cŦV{SBeXGT pMOusa%]\eҧP9q#4+_x X@koYWؽBVWhl؄(a} Nt\R 7}Q޻)02'Ww'4] $c&&4kS@hnСk :(k?tE)fQ Iֲ?,)L[P&H_l0~Nz1Vdcč^J"an TCaJjEK6s`un}2+VJDhKFBu$i!\+Rhݏ 'MmaԵym:V/ZKkVFi׏,k$28ek!abܢ8j8n 巋}?G4fqYrZ*ōWUˆƒC{=058 HQrzܔ-"'_O]>Y~}vrF&?AHeRzܐ-BxJ=pGJih}1::&V.//mh8oS.j-d)v,rk3ݿO\e^yyeaknȒdacx14t%؅qy1gB#zEn!KٹQ@Bxk6WnK1psn 9jr&@j;؏=h-)7 Xg8؋ hFoQ68Lg2\yԺJ{YH i*=U'0 oUvt*ɒd.k :KX)SB۽BT;|xG鼲#VmDI{ԼT<.ZػÀ'A)T8GX֭ 7Vi.zrbxA,Q[>cZlW+i|^j,I~]B`AX@KiH6,[zڣLy[|ƩrSI*,%دGyqh]M/b89TӲv> 93<=&"̜GءH^뀷+V# fq>%ʎ5oөjPPP4v>QJ;H'lթJM-vĚS6. BeB)Xn   bTr1KQZԃbb Vд%IO` * S1[lbyn3r )/F\R/n8%J*"+]3Sjm]=۪mQb(8Ȥwh.eĥhPqp}k.3Tي̱K3\s;mrIب㍩N`~T%LKUЮ(X8NaN/01L(eqN.z-%>IBV0+w^nX$ٟFaig(99  i q=)QhQIpV^{ymǶ2؂>"zBԅǴVσ-߇nJKۑlԲkjOsM}9zܻiOaNKy>P 88[]8n2JΓܹ]u~M ~+ }x_ncn۹ՌޓXwLmM)}_$e%e7qN/8liRH "P|5!k<8kh.C;{M$̘;&BJ⸕(8Ã&W7e\y҄Lot)H^٘$I8­{S}h`X7,@M%FkO׬ۃ$nf㱎irZvLeR۪H%+fVlTg+tq)M-iveR*)>Yq_ !l=IpvTojՔOM5]$]IkYS&d9RPa& OYn.Uqгv ^;B#9 TnWq/S-LZlP,Uon<+Y~ڎ4N+|uBN2fGρ!>.&PJAjGuW?J-jMV]ku~7 );uqMCy BfiOJIf|ϊҽ2,r"KL)B-)r*-G86kxG۩-̯Ƈ]C#=j>4̟O{&0}4Gz*bL~4UޣHkF5g!F5yW9OBY5LZ?v)FHjO}z@jzTy@\Pǿ@q@(h(ovЏjp9uzݷ~[7t5tOwc,7"BqVɿPX2>K,a]a%] )*{TЊ{/~%' TAcQΐ/c=&k,Zï%{L)qJ'9O^90iho0} zp)ߎq.k<g=82mWC-QXMgtshoV6F>\2eИ!Im}IR;n & hf"nukqm!=B limi ++sM5+%.%@&tP{U@G^?9@S)ҖR7߸R<_BEsZl2Zgػui*HK**P6s{NDHwÇW:(upd8HƋU(0 -%S6ᕆ;h)[5YAIQ5#}grii&*!A)l8!#Y!>ciJ_/'!I3kaq][cɍ&*ku% q*q7=@o½7 8-MF2JAUVaj a@մ{T Z8zW39 tg2( %=aG~1v苛3 ɝ%rvSD$d>a^;FUbt7f𙱶;qdc*v-يJpB%p XqZE9;ifZX\;,2MIC)qݳ[9C21BVljYv$̣̂ q;n& PRVsۼګYUSǜj3L|:rqOu-W!ãېn6xZs22Yw ' ,hjRJ[!E3n5ٳ5\kr֊-ӽקS#]Ncƅ%RGb2QT6+Od7DJx]GMcEe5ӰI$S;tI'd⸇!Ǜ%%cJkeQ:&aAC>kP‚r;~((UcjTiD^8=iC _nVu=쫽JQ RO{ܿoyiDoƯJ܆o}\qBVueۇևv:+9n/ƮW/>Pۿ/:Ol:'s\n1yTz%n]Jl$j]o)PJ4AgD\܊f* RVc&;zn!:^:8Oĸ\FPuVQq$ }ixezʘtv p-c !mnEVrzp)L#X^J]:ylt{w>/:[g)+K=1Yu%\tE>zR2O{oM*nzeLVna܅ vJI qڽYC6:_>eq^+2SkԕzqVo=Ucq;F9+bGe1FIUrܭJ6Jv{sTWCȕ55B/rԘ-&R IXPD[\q w:o@lW3csc!%*9t6MA.A|KjV8Fv' n:\bnVL%f֕ /YZ](uU0=ᲶN߆l͏iK#<12LȲ$e*8qJh>)HV?\u'Y^INGzC!lU~.p;4:#|lE'tK&D@gi6s}GX];]ꕸi7B0jNS(&{ΨV ֦TF|*h-$q{0:0)1@*/ʰ#]7u 嚗o^/R%>'ť9=e)j&!)P$[[W]z2[ N.tVRc_8Y;cszz",!hmҰT>"/g%eMe%s3N\cKm,H)l+E8HƏfUp2[}&3,Twz KHTm@iMk%.Qr@J% v [!==K/T>B{9?qM>in!=،j>in#'w{j~j;?!==I47b__y\޻=ɧǜ| 477c234󏒹yf`}sk?j3qScscکsyv`O9%s||nI[w?>I}U~-Bw P 2SEiJB X3HYU RjG]%e$Ac+utcb4TXmc^%ե!N0IRTE1vd=" }n/̫q|NݹǦ\:Qל;Y[7 &Kqֵ)H$tpn:oc<. #L)@q {3n,d.nr) ¤a* ) RAhCc(~ڛsg@lbÖxEj wHNVZz`*@Z]xGW?@*6PT Epe6*P; 'nUoP.F[uy[`Iw,*ReXDV֮Uv[GGgwh0 wm2C翹U8W 7zPMP}8^0z/Sa{YU/`޼̌Fu=l^acdvAmռRp$ e(Uu_ѩiaս< 'Uڊ/!;QXE搐i$B)V]IKj Mj^X,Cv4Dʜ_Rԅ!&RzʔBx+4DG,K/dRq(o\W4sPѤ落 x-+X{{Kyc12Һ188"+qR\eENjd#IWEu}P-Li]}ؓ10\AyLODR}-'R`.Bk^.h.OSx)DέA,^%AI!e Pgm)_QZ>]>{L9oa2-"$ELXA)nt @Me|2w[R]m:[CwSQ%_u w#K[r$eCԒ -o-8 #K!E )z+j$W')rRSrTS<]>{pDg#Z㗨~6[Zm4uL-(KgJlN=.ۈ֗GX}=|I@^>_|[E(IWz>t\Ǟ}u}ƞأ(O+ O/ I%U[ sػJ6T๳w3b(85Wvְ,~k8\O_0w__yx5D1kgt=@O٬*=@O٬*͵Яz{?vʠ5_ B #W/{|f#u'Aca߉=Be@ |z3Q0s?£@s_£sZ?\PZ?\P1B!@gCȂe>e* @ u+{cbtJA/ ֲDpxVcqyIn~t?B})'*"rN^DR$!B@Bxj iz}ع $cT'CHҖBl ګT̫VK$R Wh_emPwff` [9h RKLKfGf{1o1jNE bEVJO`vqHEG:v7\([YnQΫU+͆2AdZ'MVVabַJRpʕY*IU&˟,EYER)8c7 qD-F[faJ iWƓt$vUm>.%U}ʾD޽Nmyv^VxƹyeJ\AKn2(-}ZK^9aXu4l忤'̤i"v2af{XHu}.9ݗ[M),jN-]R4yc9EuQ'R%7&jٲSpqN565 Zt<]N=b T˫qUI <@@@@CU]n.[9WwIc\DJI 8lT0ru*[/la@r _= LzTۋ: uA T(7@x" JVRx K'R ;`f.[Lo8̍֐nTgI7 :!J=:<' ~䟆Ug/xW}ߏ>;jX ܘ&8S$sZ7v AVpRป%$Nֱ6x.c+~M~eGj&>c+~M|nO\O k9_@y!1'z">dw7'~ĔȠ<XNGtX?_:X)_8=_wm8.1~+ʑIJot qFTi2N|-Oww@ r{mSjRrQ8~ǝlNICdn*$S9#J֕GIp L᥮d!=IΝId&x2X Y~`Z4SiOi|ƩϿ25LJ\E>RT$"B•!mKmC@:"M޺Yu+[ܛf;qYEz(u)c6*JCI6dº3 Gi ۳")JQ:jN.aH;i6[ ܄MkRҞ.MըZ NTndlVHDD8qNLl:EP!j>j[Q j$@*@@@@@9>[qXr{~۷~[7t5tOy|}S͒_"4,%qJJֲ-YCӌ)AISȁԖe}D]M%ˏ)ZRݘF;5$ ϖ69ͻ[q9 K̇Y )Jj;@P,@".:MZUY:#3R⽸f>>Jo6VG!}/GaSaqC6IJH'UOe`bfw]u'Ҍ>D=v#lf`d= 1|fZSh#AR5RY8+Mlխ *YݥkU[EےS6ۮl׈[͌zs-Fٕ"(Vxr O56RBN~%--n1p;I<^` Fs{v壻)g`:, CW@QO Uf}&wkwj j;>GM3Sݗ'!VJB†)H[G.[cJIv!%Ź ?JE@-iĦ4p|uCHc@2pʧ 7Tti'ˤbn q7~MߎۯBDӒH[ [)V^R4CNR:r3v'+\E B\wCB+Py+Pmm)]T NV^5sZnTfоb]u^HT(l(ێ66{^LjEXP8~cnr3H2ṫ+Z6 Qm)1_Nf20FQͰna9v!]lȍ"Du5Brp plL'7;8G'cՔ$yܾemIqPN F-;T$0 4m!1ʐIIUl/@Y;!n Y^! 9Jҵ)5yH)pQ9\t s =0E@ 6@L{Cndd!cN9A8`KOi€m0;r6O' = iPsO= 5 Ȃ8&m:%-#GIPW@wCyKB7r5KNL#\Ǿ`(Jq}*; xe:TSByDLg␰n$Bўw)8j3F_sMg7)^fSL#0Rm&3I@ Us$0^5p)xz)XfȄ^[yLîɘ]xQ}պ~h4k/ZR@VUK?Urn >;v 6e'K d0"cxݔtlU)I ޼w6gY9={Fˁ o9>VJ1@WxuOSm߉f;Ů%:HRj.)ɪ?th^j[<'nӼqіrAO-n2eN!4e:P{j+F徽T*%޾[]Ev&# &E } R O(_ oFBb%HJDZ: /kdv1YhYs%?̂TP<&Dž#ux['Rx :tpUw=3@Un+A#@z>n:[ðZ{xP:& M+  LR>N7:QD,?x:4+C?0G'z~=W Я/Q7_}Gac6}~p7V#@jRR+=ؓh F;g$Š+so7zoh qok%/`*sAVJy?J@xv? zoPX!=FQ\m(XF#j#Jb@^{%!2Qe!&CX\D4>GGbܣ/)εj_-&\Mxn<1 v^qfn9mKp*KeZeuļNsnBw!"6iNʈ oR)WxSw)I]k5mNjʵ^|o-&붴Ȓ*z~x9+&'qNyX_BF Qh aG(RRjU2pJOiMƛ&zĀe2Y&0m`"廓}嗊1Qliq HSP:UUu}16gGkÄ~?Nw:ܸy=o#4aTPi}&BM',qԖ_K(i5гf.\7'mtiKHGTdJRmN8RTHL%H,^JU7tZίk^{rwƺښsc.}NBPrPI2dZ/O<:1M\m5#T,zηG|XTc7#ip8c6i\ _!T56Ny7 V{i*#b=5%%β퍏Y nbr!t6P%-6y+K ^J^Tu_jb*uHQ%Rn^npċ(6m8ra\۬*/"AK'%Kut05cӳXuUZq6m$󧺛b$IFܙ7c2YHn7ǎu,6ԆRB]|2qlG4qڲ~fy;xGצҜTgasRC.jK`pM҅qʗOjLU?PHPPPPXL =.;#CH<.>ux)$g?UvPG75PPPPP hnm\l{y:e6)'@ۿ $6uԲk} y l ӧum=w&8bH'W( @k{s']uK ?~>}x_nd\c@Pɯޠ5K%}7ԏPPPPPPPPPPPfضwPXi*e1$SZ)G)6^Խf;j*ՌU|3;B[)s+3|Cg9":Ta]mIFI'U駦m:S[Rސэu%%cz)Uϣ"*G߁p0kwzGvD-.\$-ԧJI 9n*=Qs7 =Dͺ T'MA+:/~흥dwn{L*k-r?Ƅ`l)=j"t/G*gX6Qwd B̌:,Y)z$@) ("@豨qb׵+ ڌ<]Wsu3*F R[Dےeإ$8T#U-׮le2/gҼh1Z -)Hx+QJH)&Ӄ[UM -Ɲǽ.:W=ʎĂ˪K8mvJIFzT ^צUźv*1.*նy3n<./?|梵7 MТ$\UGĝEMUx{Ƥj V @(G 쭪FF!r~ɭS`PPPPP@k{ umrp=c#uaS!9PD4E5xRR]ԇP mŧ rzLs_`C;:V03 L1ǤadNkR*>D&[՟F1^- ژRzuaRJ-!EDܞ5]M̮rnT]tNckcSTw;xsgKbگaEeMpfȭ'8`\i8z:  P--:1\Gu Q4WqԭWU֤S Qyc]Fژ1Dm%=ᰄԐ.!-) ! Ej6\;#ѾG7["0a&1/uLSPd^;(5=ETtӧ+ QrdAi iM!̐e+v5"_/`ն٘SmЁJJZn%@nZ0)àZ˷0Pxcppك>wŒY''VaJT g`V$k6no?d֡O!1NP˛_G2 ¸ARˏ= # #RLqƔ/mm(̠EEU*6йllV&}2bI@r;7J{5 ˽PP!KKİs}1B92rk~ڸ~\,!ER]`fRcYT-B;صr~mMNZRuXӺ*tz]zl92#;$rSA-25%Qcǣn|>`@cL|IPf4LelJab[n$i#A" IJ.:qy2*F+mdS~f_.J|ߍ"素עr8{DT']RU8E7 sYu^lC&z. WR?!T@@@@@@@@@@@{3\B\T /?T rBW˺5 Hd%'Jz1\J7h0 -n71rD9q"eCie-6R+8X)Smz{5I~U}=S 1rNK~J1mɘ[^mO8HaqLp[B TjgyVusa_OnXx5(G@zjPhRBm娠<)6 (e{͗9X.c׳N^\C<[i:/ sʮ\<$w#qu=286 G'bC *;Pc|Z(GI qrm5fޢWJnkr>r薸*%+gKEZĂЛ *#/_\IRnT֊[H0pTI'< Um-rۄd=]Χb=6lyYslSSMZ\֞)sQW6l巧>l9ȥ9f^xhdzy21<n1H$qdx+x)L!<#YHM.֛:͛ٹ={wYo 'V,\FjBe1!)[@-舸Ċ܌iak~ޯ|1aF7$%Omod[ 6ʘq,ҐJ*J(Vm2O%No^qk=ݙv8y9nBNJ IP&ƪcq ?r;!*3-PeE}(8"8ݢ#KJa&*Ӛù8.ɶ$ҝڂǯ61qS",++ߠ !Bmmmk[~SWN{^qkOȏ K ^ĺޅ7 !էSJWZΪxO{yW7 uR2qqY,A%^\+SH p8& t%!Z\5'.-yw[]Ize:x/1`#|Wu4Jnb4!H_7bM%&QM4[WMS {S۹3}xs1CMFo⋆ 8p6bZV'"pJy*WJeR9*3"7kHnǚlyjM@EzO;5pnm? =ʿ߽O\~Tl`6w]5uU6" "nv,I×#'u% }[I/KMڲrPNI`5[^T'rNi\݄9]im3e8^6K#OaKTNOjCE:*V]>ݕ:陛j?{geq7/VU~ :LH}<(]K.d1d Pp%:֐JͿjYJҎVWٷ:cfrp8^W/n.28G/&Chl(!+ VzRb5^{r#T#sө Lj2JUywo32 F|'zu~ z@|E~6϶˝츸T'یBGxXZxīɛi]^j|)1ƚk\h,Oxy ml,'1&aLҤ78) lXª^d´X>ҧ򌩍-,[/ '!d@[d]eOG!!ROܦ0Un[ҿZؙk;D͟kz01~k&sJ*EfJ~>)^%+ą2r} :kY* ҄Yֵhvʬ5}ЫJ 5nW,Gn`enordpp4V&Ԩ cPLԈ\t"Dڰvƀi6_5I*Cc`e-NA0ܘ%MGjQЄ31$J{ը`nngWO.&&vt\R:ya}ky#?~4_zo{"O\WʌحZGxyk[ɛaV,{Y)Lס︶*r.6&eBƴYSOnT={^̍oBV Kp~ϯR3T )%'Րc~C@t(((((((((((jno;3'7? 1ÅEJT:));ij3ha&n6yP:K }曊YW /o' ţmpOw[$kU ]3/ی:^v3SJB~!rI n;{<ٟZ)ɤ^M]@Ir>3tY=5bCR__ $lÕI{! 7u@QOƸ̩kSZF^%I_q/],NOa\ϗ &r ECr[q(@u)Բ=2fThzTQ;`f23cd!oIgEK͆LG ZRz7@kF˻.jO~\1pazӝÕ&7--Y19F>>A*Z\Ra HAZRN'pRo(ּԥ}(\^BAldjCpz+TٺqiKiqkj}yWVӎx,ZT__v46R22p1a?ױcsr*r:m%štJz•5)_'rt].гȒꁼqw5KqnO(8u$) T:HJ9 PPPP [?#]s& !nlVN.;e?PvqrRPӊ I6$p_u-eSKnZMǶo6'̵$6JOVF]Ųo{d̅q{ɕzȖ]JPPtUV1JB[z.7z{򰹼Lc~wG+P~LfSȠS QMMx.gĪMb526vCxEm kJ 'ېG$9j)`$\U;թjBz6\d?4~CRBdf[ZoVFWh{OfC}l9[huk_ ӽ҅ƭ1\D)lFtmye)*W\>&˪KQOd]8Q\"_jO7ym}/,Kh+>.Z^Le/nkqKzI.o&s{o3=H͹q|QV(m_X}t }6t5W "qVt Ȏ%tbn$X VuF9J҃'-"ċ9 he][: ($ab D*/g_̼Y)2p&b2Zr$JW}y pBBF :JJsR~TOʵOkXl6Fߊ0{ S RJ1![JC*HOpSўJ[ җKiE/%,֗ HGVmrwz{̳nYX90XDv7NV:|Yu֐^:8%jR5TךQƵN?~ WJzo6IRO8+[ΥJ !Ņ+@?%{b-<|UeeyIxfeDbBKO0$(k5KKƼ6%:ק7,15ppF*Z!<j<ӳ\LI5uXS?=9L,)y*JQRZ$1}*>7g⣷@D'fT PYZJEW7Ƭ{rT(idng{2QHCւ*˟Q(LUEEc*z+m]xx Sf6פv$odeyIZX;!%@^K%WC)Lk!ȏ>JIuHq9vNViC,C8ay >QqBcÅDUM9[k#Q]HJ#вzMfc.d6bq 4i8j Q x =8P [?#]s& ﻬ2n4IuAKjJQDv토Mm%( GjP(ui\Ԕ,%E&6RH#P!㢳  8M&7$I$rI~eN2t5wd;zPs:hX3FDv@1_$0\ aJ:9d&ڇ)S>X*ΘV1 wV2mޘ86"Gh%J ruI%7T+ZF()!Z%zR)>̗%Y.e/h.r֬,LGW/s_Ry$jGT,f?Wx' [kN=oi;j2V]8'0 7j<8'VvԵ-+RUy5(jK 6Q$xx#%2>Sls_uA+L"ғJ#}IY.MV:kʬ1 .cLG3|nՏYɢ6wr+&$wrlaZ!S[,z9sSt½ yk~n_w}ff\42p9VYJW;Gd?W@t(((((((((((kgw"G9,MyfiNP8iJ{r⓺i>r?jḇ][;:Q4GSs߬ɩG\Lg{iO .}[9ʻroO>=ϴg-=)b4Q܊i}܌W~w!gidOnBOtVٽ̚{f>} q]rI;h-ҧpjQ$ۇևg[uX QmFAovKMj<,$e!27mcb)(PіuZ9.B|L})trQHMl%ܘɰ9O "TNuLU&N=+w,/6$% LJ;h,^c,!FgmQ,+]D,m<2]ܘVGVN1^Y%ŴJ[g¥;Xcr;1Ws'tN⤡nrˤEU[֜ܶ)*eU˫q6\]ktͽr)a8Ϊ3!s90Q]8LDtEmuo86KlRΖpHUPËx_?XҨJ=,4ԅu1e+t}Ky*2{XOd 'ijOÖUܟt\봟? +(l+GĎeS̫MɧņKofH*O]'?\$~U><7}cmgO}HCy?-wSsG~GCy?)ur v4FCUu 5zzTtknFP [?#]s& "gO%3`2W_h%*}YKHò⣿BueB"oYac^F>s;~kqրJ!*e ) ^|ҍ>zviGlW+!vDAQn8u5$$:MMY3\.rfD{zX2gY!,ĐDbx*Bq+RT-m#QKt{,$w!'ڸ9-> JCm0A vYsobu=8j {g]e[("H\v0hy]jh4| I'ư1FOUc\{0ޙ?'Ee$%͢17=Coj jCĠEm>צU(SP[8LJ^MQ%m|R/8қlj#O±5ϧ$$fћn^bN1T<6)HLHS%^kX@knI+-|R{l1+䩐%2b+qƔ/ôX曋HnToxsiJjZߓ+/uf=K !]KHJjުmD]2vR, <9آ䆐\Y)O-IuCT֙7-x)].G Nbb&{,ҶYiM8yBtA֖RXnT|dG WFګ"ژ4)2c"Jn !e )U4_^ =徵Ĭܙp{{~Bm%HmJH*MUWKRKhcC3x7zmyٜN,c#)]m`#+{ r|;j4<ݿ}%(STvy|T(N}:50Rt=.܊NʒMD5[G칙a m1N،Zn!DiiD!*BRGr{r\5B7yt$ӐZuL1d5ԭiRtRW-YN)$Krt}!YK^C}6DZ4>6=̍}Ĉq\/:":N$T;YՑٶ)f#mv $%lJZ^mwM$EUO"VT[McQ}RC!:n+Q#9\ElYaNt)j)I8Iǭ$^KYMU* [6cpaalX?b a qTp+Rqԡf RIWg~'+Rm`m&6xfR]1՚ZtrT->ߏDeaF$uJLvwaN5(Hlp^vۓQӥ=֒Xe/6:%j_{,cG+{)0px-RLTe.Fjjͩ@m.bSbyo fŸJrn^+jXfmp]()$XqŠ,`Ď`3vl_yK:e4-qSZP{l rsK ZLFUaO(c@Gș8Su> G-RbHyTghxݟeWMJكʩ~leaS5/3;/iMyY&qw -}{4ǐ}2GJHSGT׿y3I4YU1~n_skH5 BRirP-R'QۍeGSQ_ m)`{_td~=bp2VspxHkKj.2_HzY P  JJ8Z_*%nҥ]ͬm˔rOm.7i~SJqCw Qr8p؝!WH7Ԛ/7,v^5;i> zԴ'Gj$D< B.Y-\#J%'N^\cfZT~.5ǭ_,8ʈ8e2!LLyZ tkCaRٺroMy6Ǚ$$v ԫ& ]( VjCێr2Rp#BKWz@j\R.;/J =jq Pҫ/@sn[^溯҅\,>E[e2F\ u)CR% %% @BB@>@ec(tRE_O۳XK }FX()ʆ9[qmrcB O w8 c_N#;x0Zii (S|:TGnڇR(љbѢl iJRżB2(((((}[kPDݹZ_92tZӉܢT- 6p@JJSbǍQ kS*K8xM&C/O9YJdBЮzKUo$[IF/c{ 'kNȇ=)%M)*%\TTT^7#%" P*R.hēW \zY̗5+-#:7'>7Zа8oJjfIzhj]q &6C\A)RiIĤKn@IH E5 Ur/53p{*3CBv3}Nb*]*yIj:u*[ve6 z.E 0^$)jChSĩHSyʎIl]7j7؄{syHf[Gs, Ƶ-AbצҮ-MGVM`M,;F.rPJۍJ IBm۝=$%UֻuQw_)&Dbpʕ!r3  /~6CVӓGE%ˢ_MWmWx2*6ӱ1:ñœǹO%z$9e^mT* kQԶ|:?a>!2ټfgug%?{%mZ YCєn)d*,X*]*5_v?~ګރ}'7`f8>vu 1EM`έB_i-ptT:x:D(((((((((((eo_W㲍L .T[Q!SZJ"ZaܽmFۣrorM7܎qx{uF1ŨR2;k91g/4Kci/pm*J򏠕M^[\.B麬Zi4U<+DW,N͋IV4ԒmSD3iίήՊnlV&v1rIY@JDS2TRn8>.8[&IjyOcM).rwmPQI-+edsϩ^l{m3[`cFf^bZYjc(*{MD9a#XCʄR`-HQU ZlEJTnʚ\vc'W<6>Aq;Z=BJZT.b{l¯1IE28iJMCgFEe%o ܬUcS![ AnV4ƞSujZSJ<_K =M%M>w\75NK~.]P2R#t.^a,^!BCL*&ujPa#q1H4٣c]|J=ԉۈ̖z֨[8EZ-|˒mZ\=lNQ)O~R,Dd$M,AГlGsP-!1@QnjN†Cn7uHNgr9̬>>\mݒX\Hvf%„)#IQdڗ8JZi)$*cS *BiۊxݤZ&PPPPPPPn޹=F>>ݑw30FF= +ujZHRuj MIRz,;XWnm߇|^ȽsPPPPPPPC&z 5"F+]qylVo2Sε$ G߭0_Z5_gֵiT}{N6Oh(((((((5$}<‧y!@xd0?G Ǒԟxހ;_ڠ)T !@}{P gv_֞!oPOP:{ZUv A@[w;i:;})_ZC-@7ף/Y۫#*wTPW6TU8Me<pFHq?fA \0vrq5U}!# !;gwň-3ÿHoKBnݮȕÆ+ȿrzWyg(cF Lȣ`~u4U?trWw,b@ CwAO{AѴ'=T$ۥ~K͙a@ZWMoEW~'?_b6+cIz] UG6S1KIp-R!tZ|ORT(+WsYk a&!RVKr3t.OgoPPPPPPPC&zN$\>Txwfn߹Mg|@[Z6!*7 76Onu,P nLd|dv2S(#M_H0ٳx;}'s[Gm}P>xII|0aãAg@'IC='J?s2Ƞ$} NYӦX4 ~\h auy\>m6.O㻮Ov܅~F['EoO6QV?@c_w=St&mŏO|[)7En:*?V`cT?'' ([8|wT3E̕jw[+g͸@x77\+RUړG-!drKo7'-w'(W6^钽r299 ?v~UZ:˞A*z]{o-_^性yGQs@e5ї'叵@(щ\-k#Eε5@f5iʷjEN ~f)tjt.ihRoC4Rz 7!9=O MAkoh x~h |?o?@e'gSGO4J<>7c4>chҮP>8RYSo%qk"=eh$6 | W hd[ߠ.z \mJ"JBҴ%BP7y*<PRoz^ ̄Y J H9Ӿ:I2tVxZCZ\8GY-t6bTIPTp|xfB&G( tahG( 0wC4=E_ؠ3o; ??RPG@ i uBu.Qxq<(|W9m{7Okχ|G~lO߇ƿ?h23ZF<)()o9A~`-~qm2SG@"( ZG֠41ùѨ3SИ"׈R[} 8Dym@()톑n2E "SnۦM^ l{mbPopS "OLDxPH㆚5@6( Ҹ6$^( tOt** xGpR ӈ 펟0@_OOq2S ~E?ZǸ?yO֠. ~( pS~/ ~@\n4C ~>PP ~@]ȃ > /53ayWr+_|ehj֪mpϜVo]ǼOvo}{~婍6o٤rO}}utV'x]ۑfntim?UZsZh1Lw|] zy#O \]AW=ݷ'w=sGn?!}UV}%*Q~Gsycٍ:> |-~%K0νUW*cӴOoc7ӯg~]*fU:1G%\u=exlXNZh>[\CN_T;Əhۗ퇴7s2~}ߑ'zWZxcM_ ~ަ8Osz˻Z_h6sh5TN]~a_Y+w* >{g#Wvgv=By:9_Os8\wvݴ =lKɗOt#ѫ}վF\XLO_w~\SKwmZ~?URjvuoKgԓm}qޢr5sy٫n?V+=3#Aߜkk6U߯mFJï~YaVt_~گrg߹R5h]Ogըu]{<$e3qy?oSֶF]V{UZ*LzjUgJe\>}t5y{MO}=ڨ}ߺz^xZW~S//]̷wG*~_v_?w3r} vkru.a]iWoU;?Ltkf7G#G;{q1=]{x]`Z?:kO{n6%MJ߷W^TES?m^ٷq^羣_Ɲ>2y|,BkN:\4:`_Mï=rqun/w/iW+ܯQ{{y|'t|?J:~2&GJs\HU_ ֿkovTۙ'|~pר-y=Ǔzy Zoo:ǎ߲S~=ګ!>wҝcKÇ]ݻڹ^7F}<*ӡ|:WB=_Z۫~5’k[lf[H ̗W^7Zkw]<^.tִmҔ=>Z'e6rOŧOG^~*B^z`1229}WzMޏ'Uuw'>$i>xi^Pҵveakq;Ta=q#?Ԯ_oVwmFrѶ κ!Z\>Zz5ozo:=Y^+hMZoSvW15VZQeyО`=m_{q~ܾjvùѣoĵZҮ:y{kpaO+^*MG,s{zp9ڹ_ξik*]r-><3mײw#Py3:y/5h~Nzdi]kGiuuog?h=qͿwu=U_쯫F<;3޴p]Vk6Қt6uOGHSV2xӿ{Ԝ>3ߓZinZ*իiXלԖw./u֛ }E>wd}M}>OX[y}=[gWוyL~#MU5 _z?_2B޽M߹}#ѫjV4Ɯ4S1_\+M+qgr{O>niNֽپ޾^mZjkWziOקOqz4*.WQ_P{W:?:ۣ޻{Z}9^p)Z=5N~8|KOdkJlӫ=di87޵הTÛy\{z>i_>?_/oWǏSWfr+_{;+؏Uzטϝoe{SM}rڭNܫTzr\*a_iYJ_`/`=CҾO/Ϲ~wq}{ow>OMMω}UTӍ)L M1-{ּessϝ?ͫ77i9y>op{y_GNG]wtg#Ngkb/݉&=W^_Plf}}a939Ǔ3[o/|K>t!6eWRw7+֞w{k7rzV:Ezt\4wOƱ/4٧:73}U;_vQo]?}.V|]g<:?OWU49㞝U鞺UV4™~w{E#ӟͷy jKw'ɢ} 5Xjk_寃*WM4)i^{+Rrp ?PKL\>t ߝߝ#youtube-embed-plus/screenshot-9.jpgnu[6ExifMM*bj(1r2i ' 'Adobe Photoshop CS5 Windows2016:05:22 19:13:17h&(.HHPhotoshop 3.08BIM%8BIM: printOutputClrSenumClrSRGBCNm TEXTAdobe RGB (1998)InteenumInteClrmMpBlboolprintSixteenBitbool printerNameTEXT Adobe PDF8BIM;printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@Y8BIMHH8BIM&?8BIM 8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM08BIM-8BIM@@8BIM8BIMMh screenshot-9hnullboundsObjcRct1Top longLeftlongBtomlongRghtlonghslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlonghurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM!UAdobe PhotoshopAdobe Photoshop CS58BIM#http://ns.adobe.com/xap/1.0/ XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@      hm    !1AQa"q2B#RbWg r3$%v7C4EU&FV'Gw8ScDTd5euf(t6s  !1AQa"q2ⁱB#cdRbr3Ss$4CDt%5 ?=01% tZ/ٗZ~=)F8Bw|blj1e6\7/pF}C!hY.]uMj8zJT|[<'fń&;`'@E-{-y&`1l*va}>pbөTjkc/EZ miprdxd؄.&yiJmW?fr$t7ﷇ[b?nټ~6Do/m@ֹyҼIxAuƛdGU=MR+nasZe}.jjduqЭhCtX>E\;u1J[UĽkZqObou+^|LXfRfԖNުƏsu$Adg^O'G s}اu.I)a*%>S9%vN]@V.ě3C/'dmqcZ%yҚlZćOKEJPc9F-ǹ[ Ôp,uB hv;U*14,s=uYoYנ>ۅJ[` XZ cuoMwU$ziv_LϢ,pq$p9Fıh%_sF>e|Mz"X9"؃D6 ܐairyX}tq#SY9U5N$lܖ&u `n-=V[\vg|Vc #Țs.qvtdٍwn5MoW5Œ3fDP1\2\sbHmpt7kyح笧%L$L.K} )Dv֑o5^#)mD5șHJ .6VJv>9`n"̻+S2YF~ |~}mx,jC㆜.8O@M4kjȒ78|gso' IJ[kYiim$HJR6Esxnbr.6fለ]'WT%Ű*Gv?kC-}`D{8͑)y(eN!@ t"w||LuQ&\/qL8-90HC^ثCڙRlvzOk]eqxSy{R"%t3'n\Il {Wr|8\^26Y?WC[̔YQCꕃI[i壁þɴl1EcFbCe'(K i\Cu1$o+Qqq~[[HZ6Sl~j61dV9_f[!^QyOuv+6Oo,ЍV9Qy)H؂@;IՅr{aǗm1Xؒ-Kg }A[l]ǵWIR+85Ҵ ξUGϹ5o %ڞ2K2|-q R#2[EoW7 y3:Ysu%AV*A6Eu8Օ rs{pJq>R7r{r[FWdۮ%:Qm%K [nŎjrhѶ8,6l)zF֭q{}vF,ֲvny/)pS#C\ZTyqkRx*liYy~J6s>wNH,%bd-{7t:Cv]W{.<w4Q\A q ~>%S5.IcKҀ^, 9 c㾬͏&:ՐMܾn-Xkw=zݏq1s%[uJ5JMxɓFc2JŔ8 YMAjmpHq[8S\&Ada4DH dR)K),YRzɎM"g4W䕆 :8<>BEs5ic̕[O7!`).}2[mv.%1w$i̶Jh6|d2ų ^u`:@:\WIKgcDD¼Zڵ]$;%-'?6|yhܵPɌ!i̲RCwJ`+ʹ\rBT&J֯WWя|3td7>Tu0:ڱQ:^xWm͊e Ҥ.<-O6Ak.N.rU.s'.I%>[k\-fĵvK% EjTؒX Mkf[Q|5o _0xuc.d60IM4 rOG+9~Lx 6z:#Sf'Y]3sv'+*>(Ju.mJa϶")yu'n8p^rL'")UaEleDOe+u5/*>(yR71:B筺dihj3"ĩ5 yli ]']N˪Ňތ_xgi%\b vС%$; KBFIZU=̬'sG#z#@Y;p:Wkʮ]J.Gj4]{{cj6 '@tp`TRsò'k R R TL٩Q%,jZfNiûSd+gf.ov5ȓ؜fAE.86چ[a{ kW-nRś?!?^rlM幋;c!* /$55W612|Jte /KBYu2Ǒ2yoN,hho1Wꐠ ŵ>^LZKH}<\4nY`e_)T؍ 1!q! EMSl ދ:F>ppedFem 6vsVe F:/ps49i 6'K[p#BHBTٶK/,ۭ]Kb2f&A-LJv@}ֺ֥]E% ZZf]RIJw_2^008="Oi'[׫hywd%tڅ%jDkieu\XUw^>.#'0ICMm~ˉHԂl}5ѵ+et\7Oc`Mq W,I-XWIV˼e9&[-3SU?3̔ \7& V*l8|%W3Y¼Erz*I/CqwzzɭɆH8Fbe j~mMuxq9ujXpoz`OMj9I4z߇yiŒJ$ԍS 8ѐ ,6JV J쏗[V†59ܫ`IDs9nƺ(/ko_|eCx3110jJJҵBM ]n-HC;JI)ܐm9>V DeCQ# lԠnHkQe,rRo y3-/!.Ҽ To4hyggŦT7ʭ 3h-`ri-<2|o~vmkz&.dpE^T-$CWUԓ'}ԧQ $z]Պ?>\%OT"3;(#ʌ֛"oqAVIL o.Yu?QC5m|M|F>.RZUpXYn?#=/,Im Rc4]#^5 CqM6a 8qa5a3-\HJMZ 屫)ycS|#-˟;('=mZ;B9ܼ{ǶA%Dd$œ{ˬ;g4(#Gfw"dFIj 7 89s"~Q؈a*S>@aY11=^kiqA-vɐpaS1~[ˇ}(JJۯ٭lsrnҷjTğhXj,Y]1EUVFw%vOB}{JeƎ3Ch +zZ:++_̓@Bʰ)B\)$ ςrhG/P޼w+8{ Ylژu6 L+|+:gMG+p>K%=K?DZLid_mkF3 sv~yfYor]X)FfၯUܚۢ)$_s>$s:o*䝐<pdge$N)}Ļoe›Md{YRkBixgَ!Koo/2vGſ->1eB2ITI>5ĦK&> >v|GHģs\x#㰹\e%h[d4R5IxS[c{r6SMen5n)wJH޿iD5¨S̜ԦLij*Q'pJOvް+{N,΄N$Ze 78gTXƋ>CD!ֆA&~~k6{w7aeO[Z9Wr*Bc`*P " k^UM+v^J؋:_M-'|=fC %jx+ \Q qc+5Q902,xqW7&:Y+'< G3`#/)ʙJLյr˻ 耟 ȝO'h6?l9TWŞ—+&^QWPv.cjgz'U -Dx[&0hˉXYMR|ޚd˸^3Kqm@[`ێ^w8S=E}eH(qQ!7n@j#3ը7̹2N[̼Tu=>Ah%D!CRZfur: ܲ|3R# Sq{Tv $'JQIO˳5;OjuY.mIi,\_Ln-ԩVZ3;J$b}=-Z۵2hE9ѭ,hd8zƸ" mW<|.چq-aq֞Xn<_# h|ۗE^M$Y{eϟ!&=>@mz:!BV\hHԚip99¦I8Ϩ- U`ԟ]u6UTo}ι Xܞ{Xn?- oZBok\~jgQxw,ޙojS) ɐ2R }%D0|y]7Lљg"28Xh//bWiJ}UZF{YKhY܃Z[i+2I4㼧KqHZu*וT2p<߲_ōYfX+,*!Eʉ"FM)p*<Ҝ[mjd8d}Q7#-X (IZJwۮԤV<*]L#y -=*OO]j2+ dcjs-fBVˇpț5e;&P3>رkP[IJ1_ E&Ky`WVf `V@V6&V z^AB (p5ВFn%D*L;<lyMxv#RUq}s~ơoQqJWSk=R&"\sRzR(6FjJ@'WiB̐%/Ț#S5ՏeTdHjt TnIRڧO^%(<|>sIJ?7&^r#JiK}Ͷ. OTJV'U`%W*'Ul6_SPaEԲ;)kKR$X޺Tevu yW&rFY\&+qN@$~Ja&GS[ M8J >U.6|v$JП N´d:dD+S%!foyF>._<+/v?ym'IUE&W `shAbf3-ʎtRnAҺ6c[hO :w)yJ^GAqdDq@44 FL8y)gٳ]h?_p!-xpo܅k֭l'<џ6K3d}Q+a.5 [UqFE8Eg܇||./rڒ ]xʴL678?}6'ON1mlZ)rkO/1;hlٙVv3s1~*L L*I:VL.ߕlorYLo* :.K kR7ԛ{EI[e#|QH*n@+jk¾\bS\8m 袻ku=/~q$uΥIqR**q=m xWu,}n37KKmgMn< h6A\(:ya&W;>_A~uU{$#Z'jPGhf}_=6y^z^sΕʄۮlUm=k=wedE[*6-gA/wͯK2f3=; M_qlxcq)TB֐W ,Ɏڛ>yf<&4Q]gE~u]vz=_dla ,N;)(uA*IML\^Ef2K }-)_W#iVf)3:Jqco\5P?!K_@VU )62QdL״_[5NsoxGe8yLRW8P+4;vQ&YI2a*c HyB#JIQ 'DY:=ђ8X8Plrlk$׋"0mKb=-1 ڦPJm~)/M T6quD7>+jrG2Ɔb&L K* lhk<_qjDlv9$gRfR:$e5m6V?,rJDf`ca;Rj4gM=94dg3+^@5ialL!jViަY4 Ye7,0Ͽ aݎ.-Kma%ej?I@(Qlr>~Mn:#rܞj0ERaI|+t)D@k,ϏsX scjOnw*lGvoMƨe %dsdAγ2lV-rśY*KifpVͧμ7 p TdWB]ƭR-d+QY3fV%5M|)\IJKSƈ=W/[#YukRYܢ ss=[T\|KJ6)@ִ$bƞ"=/U66 PMJfPb>Ȩ)&xKj&f 9XK2u0~\`F:XXڤ[kgz>iW:8{.sAu :ACv%>53 h*N[mdy*01h Wpxً2r.AkQۻ;tS9]P8MVb- sRǔ WR'款CLϽ*}2zRRJǍl%'ɚ̗\5f'// 3>Җd4$}>4dUz9Dss!WЭ;ѨM`9iG 3W+D(C۫&'^S%z|*ևJ8d!E3JmCH.X*x)Ơ%ve+) -YI Zk6!DE},/T-p `rRRcAAKQ)6tW4w$ el&dc2R~ zχ{zTuHm$3od sr^Oq -P\w$ Ÿݯi%R*kc%vH9DYR$C(-imRfHGp݈Sͨ8}ѽcɚ=8M8/#,4xw6nVn>Y0dg Ǯ6Kj?8<0$僱#@N۩ jlvƥ(= ,^ll?kO'M7UJ\g!I)JIEaK= \_vMDE-ffZKKFgʜ͘$=r\;$m?0LGP̨}g-Cd{VB;qt)>y OIh IeM(O:N_#JY脜ౘhsǕ%-CZrmĬWWv*,0x75Z0S}yD%'oڬcnj I",F-b6~QCǙLdaoI`4ҍ6kd1ؗu^)OSMĺD&:~<=WL\2d1Y7R82K7 oՕ͇t^x'nZa;6k'ahO tB^f\Z\Z=lʑWSlq-#h=7g+&g`ɂw- :Wogtߎfӱ &UoMfU=#5*fmĐyUq$x ܥ߻^Y^QqĐS( }F)NCv:0>kNǢwtKtn 28n]J o<įb2cZ,b.;KpJqd\ut穭l$9`_ȱ]OJN9*ӡ!tNee$D湞OE͐>R ̢YK'OG%>|dtQR7 r~UfBqNa2.||"^Z@mWzRGRQ0C~~Khs6B"Ϛ no멽v5#St%^ʁjWF:Z=:UjȰq\NIs^H-ɉ`XsFgR1![VDseymƌߖ>֮*͸^͋ 6GkukED|nULRaɖIsblDM[xxrY =|<]jq6Œ4"JO,.ơ켄2S%a#Z||dn%sh<qBTRjLUeS7|km0sPm jXNg{ l1FE[ǰ+TR0;nED>KZdwHȔ "!)5j_ccg+"ᜎ~HLtROP",BfGÕdLrE';sXL,O1#qyj:ܽGW#?<2 .Yܞv*b1I>|l%qInW*e/_iCFy&_ 'ș$-3 Y!†RIt;ї|7%Hs!Ku=(yuuG/5$I*:VuӔ*A iX]WK-㙌3}%$Y , |`10Yg9&Ϟ<à˒}%ed,XgS% $yzD][H) KuHzב^/ םi jO&*vkd=yX.kxdSd K"R]Rl5Y3D&:.'v+UfyڭtjqO'nrW5-FՏJ~JaG }]൒OoEDe47d>݊/[\O?ܸ)D&:G>JF(vj8$-n/rVz70K >v%E`)]4n/jr:>NIR5;y:rz˳\Q;V[;d2ETͰu8R-6^Ǝ$us|#1!}s6p*$*[3e97Omv*R nK[ԕi):QXdAb+3T)r҇}&[MC FBc!!=z*]pXdz*;1vg ɺ|tw6>'%m6J@tj"Kn!De;d$/dISjS!T.nVZ*D Zۦ E^QU[ o$[̥f-bzUc8q<*Y<[kBYU@xx=7E swWqkUY F~YܑE{E9I\ܗ}vV]iW#Yp $ V'vvqWUM3 oPf4,@& d.zZץ *%-rzY-к)U"^ޚÄufԽJ<ű5$>fV.59 fXu:%N4VnZ6o%ĬkiO|ʪ6oEY@kҹV _FR;V'2$hB ik%O=rbiueOv1y.VNRHCqSpu`}t݁YnfόxSF@ږXHBl=6UcĽ`(Y]U uo(miZɇ-aώrIP;ȲX^MC)N$0:%R]n/g܃5X>u|Z1]|+#rgs!,ݦ=B@,ac2}Y8 ')̛ÝT1 E!kS vȲUu;Zku#ܻQTcfco0)N_5rySf7S<0Hn3nP &oNKh8ԋ@|1U/J80!cu*(jFǜ㋎)io[4< :$~T[0%ˍafS mZ@E`Y2Vnŭ<@H$J>&e ܳ#وC-5 l u4l} Op[n rؒdtNVccԡH*#IF)WTߪ-<'QMe;zϹym+iB I遥]dEV&0fH\aoCaZY3{P  )vJ|Q)1fPVx'& fzLlZ[T[ARZBGAY,A%T) C[CwQ@X ko!JK#JԹuޤhhz֫>[} P6K?  kQ@)=]-%$Zysd @>k-j9;j$Y;ͥ$C彬kaa8ʸޥI D=x^g#,ZU+974(7VQ8Z,72jr5twOtx\[}Nmم!GqAygи Z^7IJ$fY_}- @6=:Զc`v?#cc!N BR}+c w^_ܢaϫPnh Akc`G2OQ<>\3o0)eˍ)jlI#Ռ9n<[>à'iVzEs̮!, j$6ߗHYdmr"!ٱxGHi9c=-P!UtyPyo>fpeq;Xp$ kg(¤kmRά4/+R KLD˙:mEWhq)%n]/f^ J~5=keˏ3SLX-'ikSd̹V[I+ p| ʁ| ЖO'$⼂ӾhzՕb⋊7Q%cljMdE-X< =l| SdM7+yWz+2z9# t7IhX_J+"N%X!X(jI:nBʂJ^s.YHU%e-%bhk/d*בa>UoF}DlwD([%)i֍lԐ@ WFx#{= lZVR)O%)#BS  ?w ]On']q9뤊d>tuXHUI!p*K(Z.zȪ(R]TQ-E [QBꢩGUY0fM@=QU--<# U"CYuċ训l|R&̶q9sq*_RT@|@Jcsmҙ|x}|{Y٦(TZC֎JAϾw,]Zd(єL2ۼGT tSz .LuũE{f K:jLB>u?b&K(6Ϯw˯P\ś"w۸KsjM,{ {-/Y/|z=͛ JD \fwT2Iu$xkQwrzS08,;/!Ȣ^m 1`r%׍ЂY nҺ]jy.wkh`{=mLƌ~`zkG۸-eux)Yne.N_ :w;&[s_o U;VچKhNJ^ ꪢd oJ-"e+w[_åL duҢw[7Z+n >4zF; D@x6"IIU6bk~TZFXP+Z%!]@2^i{6aZZMWkCr8 ,XZ0V9tRX Uc&o ԩs iĔ=Oe9(J 1 nwbɒHqd[Zڠv'"JfjjaSm}&HdGJZfC@AVUj9CEU$8 R2x&srxP[oP$Tƫi6pylW7 _%&+1t2rZ4˙:̭}7$["9nͣq̯觗r<͐=J_s1쬚,‹mKkH+; :U* h "slڭYv'"%їBRʵ o}e2 h ݜm$|AmBI*QIc|', 7]c0ߖ(39i]pp6BRz V|5߸6 1*k7+VK8҅֋6k \67g;2\wFR*#% |4ZBA%_S#?IbWy<gDy4:Ħ[SS֝ !̐_ IU{+A,JKM!2h;MQX92&NȲɝ)R\a XOuNԅR½b MK崑JN584}Vk W@kr6d ?ܕGS<{طޙN5(¾wiթm3ZMc.4|"eLٲ4Tɇb& pҵZfk^DQ81;![+Ej>B';4D4㔭E=5/IvB:Nꍦ⸖C'BM=5;QL0ˀY*MgJ qE=/Rbv&U` hM3w/wⵎH|sj@3U$ t6ҷtFVK:T%ztMouwu85s}WVTHi),/OHg}` P7%$zhCcEnSaB|t dT*5{vmJz/Ҥ`aBap ƮTLQ`.*;[kʚmmhϡ\\5")*yGP?L??d.ylgaN}0Q_.8e??f;6ClƁ+g(598}_n֦c&o6:z\OJ0JНҝ&zgU[$CfaYنtÇU6O7ƬZ7K(GS*Xj+K&-le>[inMbfLd_ii)J>d IF[70JMN~R:v*ɡr<~C7teŎmEΛk{ `KδTXV7wr!r @t} nd4/rT$Ѫ"Rj膛Cd6yrEbSND4umEyhPl㾃iDCWb z):ZfC=@zԛ^Z*qD$jql.!(J)#JYAH$xիY<)_m z*XT:iZEV6%FO2Un7пÉ8J!=O=yǮE"9>Ovgc?F]*Q1T*DкbaUhb` .BS}t&ArHaB*!&<܃Ы ^} +"LvˡyYt7VZ{cyX)=BNdyu؛d;r H ^Cn "~m6Vv7y;o^35Y;xu¡ al8u~Tgu12]GV  "0q$v2*a h>FX5P,=e$\-ks Z"qlu1^Q%%m5?MHN5B/D (n|-uR4h[qIB7 6nML/D:Њ2+͸dW%Du :d8 ڛm#يJY89m$iVCP IQ\-x"^.ҼRR~C.FAƒtAP5ݡ6@>ns)*e+^Փ-Wh hWҵ>GW]jDU7񢩫C.I$ڳ҇+7"rAeӷ6W' ܋%ÉmJQu$mEZ| W2q2qTj\?H[@*2(;K]'jVeckC'Yw½ҳ:W(v;Q6[kưd'd"TcEM^154AIk0p)Z  jb'hV2+5.K76;\/Ҳ쭊hVޤh|k$d~j/Zn$4Ҋ*k QHQd'f.Cy(T D"lGJշmca O[ گL#PC}j_ȹ,ngРEb)l͏#hkiAK ml5pZbBUR{"K;kr/S Rtc "[ƪtbH f +ٰ>4R7x)Pt"eJ==WT]b, Q[PC¶'AB)ݔlE:zhUZqJM Z’dHY/-diJn&Eb~;(2bRP<**=FqEGBQfzбklX>.5nRļri#.-Z  \ZMԐz%;l(ThJw 1^D$o (7,*?_魬ww\ɺJ~Wy DօGlW$/4isP㘰[й\dCxT7Ju(mC'긺=C4$ ]haܡ:XUBQpR^(kdZjg餶/ngS"diqwUNI4Ѵݳc@1`+.Tl`)Asu[eFYX$t7y@ 7,cq( +6PJ +K{Pu5+;g"~[POy^y"eC¢Ix>zLHs}C)SaBH5EiɵVqFK#+ǿ2R-+H*@rk]6*:z&MG->*[ȜYg#䏽yAC-Zk6f\WxܣC#MB6)(tPKI=P!'0$ 5gGBUDdNȈvcu+/.f$p!QGjz"Iepkjm\05qݐUm0@M~ebȍH*VV$APJٹj$1zB-$+ӥI0!GM{ F@#nR|59{^:ڲ+/b"eA>vvg#Ʊ2c1'Ձj!Şx/Yki*%aKi_Hly`LV#mUHP%gv4T#@ I ~*={ ůz+6>*L-j|( H7R=U)(1jC*^Zu\!+dK͠0i$EcLI #綠6څµQtWnDRRH5jjDd\:5)AV[%!8| *$ZTntad+Z:]ݷv&YzGiKBc:Z3k(m kW![պBOkq_&\ulQ,Mjb=zxkI$a8clm@tܛ Ԯg1I.-x*[ewbjm>֒jl1>Nv.IJqH$ֺtȲUYtg/|7FGURJ%] 2BxTc$ .*ZzP $<hU5muGZ<Ũ&cE "Le mqCn,aa EA'ܣXT7rEezJ/k(bhhЧR=eMY)Pbh6ǠHP\cG NV]RFTt 6>J"UIV2*U#] hD=oQA'ED\jiZhj k6ND+& M HmKjH3z@@MImJwv-͑Cf )= @JAϮZ0cb-aUwILHӟWVZ^){r\r,-cY[5K~_,4a֎MfH#u ^CTL*镓lAqkA$mՆLđykV/,K:ZuU 6 #H £`*Ƨ,MH%^'SeIIK\P7 \Y>:0I##Қ6:{`O)RS\]Ò<®U$r $!VSe{iS uT|FO-0T96;f!A#t +”H[/U<-Gr2qǒRn unRvp]Sܢ:qM#et~CimJ2KN"žnڕGñq*I< ?eW`[@%! 'bq[4ѧ%%γ[wt|E{d! EʑHVvoO'|puaA(I |AMmV4"9MZ֮V|q1a* RzW:6pc؆:@\XO>7ZuYmƚdhzgB⇲A5dtdVꋐ%+-BԴmUdjlyܙ,{XLb-qJ $(m*FVi1K>Jm:8mMk$ ,lǒ'u*[4t5vnRI0;,JfƋ*6YjdMH=* vS1vҕ+jV\uԑgcoz|iDX:*ЙRu[fJTt*=*h|#AZEv &JZ-Ȫ/Re6K(Ecyf_'Z-QV%`ޢ @7$GJZG,! ;z& T dt@#8|Sl^.+%R.wj"N*ݡ;+.o] &L6Ӝ7Txį--q 6k/٘''lvQw'1FLc8<H2.=2%mmd]Gtmt~g_Iaѽg7ܱ6B$\Ѳc82jI UxWFT%_29e^C2E\CާC|+N|8҇zY?NEs2}gp/:N-aT:7U2@J]!@֡3HH[`Qd -̬{%EHUS6"jU$Xn:ȴ3!G2GGB-꧁jL֐I 2[*=hF)jа" *R?fIQ#[@c( u] zhe>С̔T_D H ބZ ؚ| -EI$n4D6auxՊQID%q\QYAE95K HEf|ESF8 c i?~@\O孪Y)f))P#Z&GviAGY63IlM2ɁAR4I6bo+Ժ$ّ֬2 wohV,J\6ܦKͨ.?-CLe+.Ӎk0-,ƣ?k$X^ԚeE[8xʮPMHԛ^znd895+ҟ!)@>*>[8&rL5L̺c)'Vj|=Bų&W}/Qi ^>ڶ)+j3$eyGP9.-Ln >K\g!**^IkJu"F [cq\g)3l}Ѵ\vR>qŲZCWT*doT@v}tRłֶ1%ƌ>K ɥ:8MRvxԫ bK.&WQLmՠ 6 :Ue0j7е'PmY+ha#A^m;TYUZ# "a`$e,rwzYOr^RͮdЦq)dY>nrč6>xpTNHxy$oC/kPUXoԽNO 'x,%7e(- \ eIaIHVNR'w '%J(na"kλqC|~kSc32b^op"7Yg8 B!qRڸ 4܌9B|*9H=U!JT>Es2}go?xj`zUC |!p3Jj0)֨ԤOC?%H2[_`7bͪ TD4Q)%@B@*8oWJ&eZElVd=+@ IK3&asA]j :}MIVIelЮMl줁Bc$6PV: d\/օInARSTA(m{=&"GR SCBOHJI# @dͨ>$)@"=LӯAS%OJ~J{OQP mAj -R"kFԢbIQ6I rTбiqiH`aI?%lc?[gdke{.kcGP,GYZls%1cO.G\ -@"?`Ր.t"OIZ'v K"HyJZn-րsoT }g.ntRK&K˦` uV#ސIUq|iNFdKq)iKp(/p*XceZtٍ,%7,OVZaZ2MR%MGBucYL;(3w"kFOʤ7wg[R&0yݜ!T̊q]+ AvuXHp ~cUVlI'ĭ!ڔ5![|}I9ۈr4\V"t|_K'pn;gEtn{$QUG_Em-=ݘ*,MmWfE1"ij s$i`'.hVW$ۉMxg?]$W3')FIV6tPMA{ -րȟK>4"xPq4(5'M$n/ї$תЪU I3 ‹=M J|(Ԁv&T@/r~hUqDn~ Q нQ"6E|nh] YdhX̄F„/z:вdg@EzeVA5VJ=BmҪL+q:[@T u&>3WA4AQJz^TEM,#u4 =}z m)N1ZDu3)Jzk@$U@ [6=<*'#M_ |?VZhyYIWu!ĐS Okncx ڛp["*9kq6MQGQp(A(Td1QS~ڔvzՐ"NXt>@'DAK2MhN4֦ʊlM=5V$fTjVIi䩰MQ,`AZ.4qCS訉!"VkcFuI 97O&Zg5LLPڍ8rR謕đu2FFpQSʺ5+ĚUk>EpHF͆TF$$pu%mKMfA,hl 5CG Q] Q[e`r52czBv5]7 yRؙGuV&b1KU uZVwR{* Fcy$OЏ* >1bOd} HQp]HJ70dDHKI=Zk7 v# #CּwW>~#t{pY7圧1âv{0̡|פ2iC  Pֵǖܞ񗑆UYO(5(eoT|I6AM1G=A+}ͳGG=A?ǿt& l{Y#?ɵIvG=A?ߠt&!lY#~#Nȳ{>1m?S,r<k?dY=}`;⌤^kYO;L$}iQfk>&E}͟G׵oQ~ _im;Y"=?gkGGCgkt?_PwpE_ɱHlYkt/_O Wg7[z'c6~)Lk?dy='o?k?dy=s&6ObEܽA/1Gi|Q[O~M?G~'owj_IL3i/+wA6${ZNZ\pxo9r.쫶}siD3nQIR,X ~w|N{UOlG3b3j|oY!l.a _õCS=*GϊE.o G1?`GoC {YESO?b^~T(O(^k|*l+aSi?|*͎:'?GϵU{W=_Hfݬl** VK$Î~fV()lx5R6osGٿUU\Yoq?_[VwMt=W7ݤ_ﵟuV ?W7D#?"k?UseXH?k?Ud2fߊOl*>fߊ?l*Ao{}!ͿߵٿTmV"y6Q~~fUQ6Rǎ~fP{Ǩ#_)=l*o#?!=U#Va̿tD3/zgo7̿뵟tvLO2|Qu\:h77|RG?clWc#z]X!>0>UG=Yi8N p\1W0"2 Ky !+HS k j{꣯kNO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'&orqX5%p Ē.6XeXkۥSojm||q-E=&UOYe.#unCN9ZTX~Z/:b_t >bBC _ʏ}O?8.jC _~}?!/e?Eڇ_2ߢ_tA~OCO}?~? w߿SPrkS_k?ߩ95q)]/G?8.jC _~}?!/e?Eڇ_2ߢ_tA~OCO}?~? w߿SPrkS_k?ߩ95q)]/G?8.jC _~}?!/e?Eڇ_2ߢ_tA~OCO}?~? w߿SPrkS_k?ߩ95q)]/Gԑ(2VRlj^b}a)İ,mj-V Ӻ~FW+-1ZعKJ{S~eϥPPPPPPPPPPPPPPPPPPPP@@@@@@@@@@@@@@@@@@@@wn~._-~S_&?t_oNw?c9#L>2;s/-֝ym!$m$kk]'`qIL}iv~ʿ/|*O6u )G"vBom ON"wv_Yjq29f02CրRV6ilEt5(y"=vV7[- p%Gq4Abqݗ% )Rյ)*6MieWfM”DŽVM`ys޸V\)vrNkѣr)&NCc1D)MBTБTˎدМ=9IN <ۍRp-[kpF _Gnc1w6DHJj S ^i%z#?+*gKpKS̾*~-cS -9(п.DwӨRUI"$Tj r1qS.74V*SOIPg N617̗–SʲÎFdIC~bF㠬My^ى'='kǒzvմmjO,| 0>bB|59<07C:(|9--V^{or=y{ny L6IO+ 8 !ŹLآПi/i#-N=}5>lwQjˏxq50zY'>#x(( {Top{,0g',{ϓo ۶ 5=O֒oitݞfRv߭L#t>ُPPPPPPPPPPPPPPPPPPPP@@@@@@@@@@@@@@@@@@@@wn~._-~S_&?távG (J_hl? b|A? ɼc{;vf~@+Ȑ"ec ݾcB_C[+l#r}nJ˥^OKn?&N/=#])]94AeFKwڄqהW8؛Uy޷L_&u/pw+a}{yncwJw~+ʱ|".p|W#ɟW7%-q"|L _)}jetTk*9W[7ZvzVvkEJ<#]bҼWYU+;]kWx37";|SV֮w s+c8X\q{c LSP9=q/̤{_. Ճ\6*X]^-e֔|q+u[mmشzEpɑޜ~^LYfj_t؜=fG/bxN^/yȘSť d BQpN4ǏzbJE%9j(v}nJ!=_œGpۗ\.VمY)vK|m,,]qNod|a򲫞윫FCmKm(PG_%EJ&{1`dcKY-Yvܒ֒omJ4y3r2rnZثJԶWk(k%~#{ٌ\ǹܗ E#?0䓐vTvH }f HSo&2MA XfeD6:/U.Jm*"/۾q|H,*[ܑA0Cq&YZ&GE~Z[p|Ν?M!yu7[[Vc'r}ϕίWڹR°6γoytڔc՗Gsx~ָ,OSZmF S )JMF/ ReKTe<& ݞwO]¾b7ί]4]Pas_f?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@wn~._-~S_&?toGn.GqEvקWx݃qkzbeZV}khKr=9p0f,~[9(&29SP˄XTFە+쾫Z◡^CڔDg9"#>$DžKo%*J]Co/b}5ksݧlnTC+}g~7+5 ҕk7Tw[9Gr}98[^\e<ڙqLo[j(QMA2r岽dMW_n^1Ý m\|\5WcVn5*z=J|V$ *&N\\^`r֞Z#1V}<(i:V=nѹ SKߤ_+Ni;WwЦ:|s{ {y 8Zdۛ ^uh| N^Dyw+sv JmOhpnxlXRuOQ( .<%rQ]g'-z|NbKJ*lno֯nf{SeY"%.:B-~r=|O4Ү=T(sxLsdxfwD rĒqy%iܕA"o[P*SR6|<ozW%Z+UÕ*Ҵzܮa9|LV_-.g5hR.VɵϦ'.jr/W.:mϭM.Ga܌tŗƢ+jiSQ^tEBT3ɛ6K&Luo˖㮺⊖D)DI7&t:xUjP$$&W=YNiaBW{şJSc{R­z:-:$~gesUk"Ҷڴһ2 E~w!6aȔ=q%+< n o%vf<%ĿuzcmZ&TZ'UxWG=((((((((((((((((((((@@@@@@@@@@@@@@@@@@@@'&A|oqlq8K)mp11l66XbYij[Omm\|qu=&YOQ}hx%GBZ|PȤ밯"e?x5Wl_w'Q#_~o N??x^?qw_w'O?A/~׏] m Gg?6n#_~?{e7t/dͽ2:x߲?K~~o N??x^?qw_w'O?A/~׏] m Gg?6n#_~?{e7t/dͽ2:x߲?K~~o N??x^?qw_w'O?A/~׏] m Gg?6n#_~?{e7t/dͽ2:x߲?K~~8E@\Ss+u69/_%_UVNez6,z+W RigrOӷˬ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@wA-oF3nN˰]1p[:#wU%U6}#{mޞt.iom}X۽ mZJ;9Xs31S\Xٔq2ZlaV+~4O,OCdJU9(_VקXZ &[31]W(ü[\C\)yRNl WAVWkWjlKҲ?hծvvSZЫh%VԤ~5 XOɝBa-knT^BRbnMj]I+OȪ;5UMͺBZo8zgq,lH8^JsD"t&r'^KM amoT'%:%Uhڿ)zFmgC{4r^iYWVm#ɸJ/ r3-<Ųm+V{[-[^elvo)'ⓕ:OX] RW5YmܡDŽbe'9>FG~y:Q{vXY0h$=EHLi7aO̭~幸J%'kYQuvVflژ&NWm6,җcž 'KsI8!JZġ"mI`MYY}y^hultV {5ꎆN.q(Nwe[gag"-F- i ׵>pR1ƗgJͷ֝']ж*ٷW!7tsTe;DzsS73NLw'׆ Pw3"F+"P h/rkX%wwgҪM|~2Kfפ&n!8`bӏD1Vrl82LdS+m$n7MYKQ/C ,JoOO|ɲr"'/HOdbBpȳqpDmFVn'Q6i֕VQxuvx:ǹtr_kztR OBd\O°O|8,yț׼{Ȏbݻ kuؾ)_g~ouaz^Cm|Ͷ HsBϿߘ/A ) }]d%Uѵ ZgU -O Gٵn!.YȺ0RR]CVT{jK++_PzmW^Er'ɱqlSU :{C nlyQm͈%+hHJb/DT?ZTŬMv*S?3k]50w';p8)3i:y~H*J½+L$82FWVqS$)\υ[U7Zzu5M!!i B m"UI.ʠM|s9 Wb,(1rVA ^+2Bx.HJmu7*zgLkUv ?'|W19 =q2oi}ZHHu@()P>5\km+)d?l `lM[Gj^df=d' ̈11Y  #JEgˑ廽`ÍbPk,ܦv!]0x#56> oxI$e''b^BK`iommTn]_յOV&_jt~/ln:L$jwvc<_2TrJdqI)S;7@\e~Xұ{ѣί]cI餻*KU7(q+ڬ6a>p)tTczTCJS{;ʂzV\YrVKjijV즫+Yu񒘭lj?mU-Z2e7vZKmk9on^j>N Y Rv ^=+Ӫoi7i?ok>\z%I ?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ӈ7ux + \+DHya1 q[[@RRI>+R~)]ܲ/>$ yk%LRp46-P+=9Y2.g ߩz%w.RZH({R__U`vgK?/:NF<+ 8@ltnƺ':櫅9-;5Gw8}K$O{e'ff|ƵoŻn읉 )Q`|:mt[#I/د{}>-b0{*M NJq{. Wrl;\YvW?< c (yRmᨺ++\mYt߀q[^d4[qZ!WN'lvϿ[ "[&Z1dM>Q&=-UvNv=_vGQ ~Tf(u#CW #Z]hwJ6O.{\e;YsxGy/S⁨u NsO7eW+N.Iƣ wLU_Ԙ.\:iVlr;ǏQg*T-M,}b pۭ*ޗ2.keUя2_1=Z>mGԸmGJn |\- q[+.YH{mOmz9Kgo#^m #n?.}p;W6 ;+”v h>_5$?K;+xw|WWuB|C>qTuWΟ~e_*={P_s\KuOf7˸/*~.?6;YoOIIWtܹip_j保ѷv̞|ŸGsp?w+%<|)uN{ zeN5,IdDNe,gU¼=vނT[wM-^-7C4K?;۽yj}SI7̷uʙ9ψ&En?t1ʔKzq׺e~7wy{^7w.d\vַceGh${I·\3[Ʀ*5Gė~xs'q^1WOp6>ӑ̽-.%,eτ۽{-n ^R1d):\[J_gN4Mt6#}SlVpäc=κ_] yVs) e5 bM ;_m);.o\?qHzGoû 4uɁ fNN`wkBRpqk뒻wv$>ϼy< QvES/yZ-Nىqͻp'H>ƴ>(eHm>>6'>}zIQ)Kg߹1K++w\6_sBOոas{tJn?{f}$̎bɖeo"5OB>Ub8IGzAä;>م1\?>q{n^S?_2]^YkdCAI{ _|5<1*Oqf2Z%k)O_OWO^"k)>{J'Y+8v"qL+'oWWwᕩfpqT|[B.7pou=>VUWܱ3#tSIU>W̅}e|NA2A h)_ڬ)ԋ$=9з;or18Kiϫ.} zbW|A:'v5. &WjW;$cH֘ό߉ђ⻢;{}MY*^%GƗ^YsSepV6U̻a(/єD(Zi07kcδIȤ3?_m)~gtV .E/Tlc|Cv{x^Iʰؼ40yK.5'rSt(AW5"z*>knS ~|?;wɗ9底@6RJOB+?j?XfаB./a,n'BQ׻&ޏ?yhx|Xk+ ǔōB.aq~Qk|ͷBĈ!^zwe_/X՟s'G?XO|X$p?-//,nZ<>@_X?X,}]MH|zY I,6<(>=>, pX=;o?)" H.<{|>,}]MHY~' b u]Ei!Bw|W#av, cmX?cŁ]VOE7o?9qlZbF}6K_} S֐ebeo%'߈/#\}dצ3O~#]Yq\WI\OtM.?8GQO~}yo>'(~[KH)^ֲ쾨m]s;%m8yWԽ>_^=-HOS&Ek;'qObZ_"׵&>s .ZSR%![] xYi䆼Ofdus1}y/|dɛ2cJj8(Ҫϋl 1> b3e-/2/x_7DCdͭe0SB/nj>-Ҿ_}Z=BOkWj\|cM/ " xϋ*¿ziؒ7Ey7W~SjvyٷWB>nMzQeYJ*$!>ϏZe'z|Ꮕϼ$^"7]ޢ3*rszrs7voU+끴Tz}OqWn' 0Œ~=:l<;]hcTPtvS<2Q!R^l6]rfQ~L:u/HܫSr-&Nݎ1&rKM!ݪ;kj>j'EtZl'˸ç")rBr_QHƋNQ(iᗁ|9r mKKEҼ绹0 {_ܗ*ʝ`^vWs* qUBƃYZtw􈊒v%@{hMj$'V[}aw CuT$Vnl_K1<b$ f%wСAˉ5eCߣ4ϘRb4MvD&2EExVJj87byW#,E[.C(IZOCkIlNqC"Lp*h,:pu׭eMKf!Ðւ}5o1ٿlT>Cv/Zj[m囁6$VX ?8Y+%GK]?h- %[[64zۺVg/ m (Ս!b5F k:n k(QNN:G4&6ae1Ms>꾄d>CYqY_*1eF~q= {GM T~WTڀjmҪIo؞WL\w4i,arx\g%`UnTUtk V"d4#yQ- ڠ>q]%>%wjWAX:҄Ƃ'淦E{4@< Bs@'|,( * HȊHjDT,l('@4OB3ed:,4uA-u( ɍqXw:*$u#qM ǾzvH? n7x!B{s/%)!HI$l;"a>&t >z(f|>bMn.)@;fn ǾeS5;?ЌӉ $U9TP3U`WI2!7RW) -*Rk{\j7ɡ]vS$DG0ps$hmǘO, gƼԵV,}GجO!ѵxI+pCب|Z.celݣPQ\xGTBcufbzܿ ҼJ,v:fǣm PoW{U,dwǙfŝ#6<ԀĝuY31Vɼlrw*yA0~-̴Glp[+Y-fQTqzh_8qOWcVH=4}7%mZ*Ȯo]\2CRw[Q޹x*Ī]MɮVl<{+o!MBZC^^㇑DZ3ohȣR~OA~}XU}(PUWv;/SOWE}Űvap7|Wyܸ_hK=Fe}8s~]>6HJb%iK*iPX}Y5}k)l|7M\D[V=qad8;Ub܊ݨ»}'92 :%i=_dyn_Jnk[U.>Is^N*oxQG;-SQ$dw^;{p8c+{w7ֻe F(]J}[{J6< kG550ִ2#=Y@\UW{+3AvG\z>[z=}kL˜[(6h_\Ӹ8y [ /~ӎ/BWĥ,ItlMmȲ1Z^i.sr7;&R*YK U_ ife}G{J<[rZGqFlkl9zf3^G%%vIyv;2Ga˴cqLrbq!-סX$b{y U`e"Si*i*oПU+ɟ:>1 5T;m뭌n \k@KIGSNr0HF-O@fOoZ #+[Ta;?^?~3FK8MI_Iʗ2aVInY4<<"2BB6K_BkigI0gqOfJK;BTo[%-BPmnN2ψ)j\6c-l_H'vVz¶V۲gV}'iƋD @ #KXUYU4gsekC}[ԟ-lcJا!ij"Vέ!ūtYWA\[fKqJ7bL| _bH*SV^;ʛ&Ε%{l4U" he=p[mNAre;7_sz(4j.| 04\F+JNeo%.&攮Hcb3(_SkLb@X(*|OJ[cEoj3;.%e(%@(\zV;cZ^) I^M3+˰Jm!lV_?ɿZЕcc 1T2Z%ӅW')s⥔) 7OJkZtjF2mvwinj7wmQrw%Z=)A'B@vz`ol~:!:;d< y$mGs%x8#o|b1р퐽$m:Z ]T4n3g_zuRS 'JKXƺ39U7$k&y0܇61t2!v Jj<= 8g9iHbJ^#u\+2Բ'8*8`Dg {:m슲 \QcwsQeD:U*q90Y݁]gLTvVt!=+f(9B:U6 YK~Eо<0"mւdTɕPŶ뾴mZDcOCZ6nZ tLeEqjO]^ܯ4_g[qU5eSd7qވVUdI:>j{>Ħz>_|Y^2qr/?JIXp23kVydf0XYq<-GHKIWҚm*O-6'ƾS[53 E[x03Qnas8-LV[jI!6M|dvOZz1w)|UN6/ĺ7Ja­e_ʕNFHN 5#Dg B8>(Hss?a8/5K|CE$t5{ձQ[A-|_;zCWofUK$v̏]^eĭy^htǃ棛/d 5,ZVe^⽗k}Wƶ6z=5츮Qoi7Mi橉]\ՃbFHܡ^wU3ԍ}tC=7VW.gZҐеŇ^-JN"KIHTTN+blb~"{;B-ZhfNJ.;FZѨ:Ö1qW!ccyc2HRZtk]Jωv[o׸Qc6r/i4:ܟƷ99Px᝘5害7377_JЦ|edm\\3m!':=e$<=v`Zg)''!)*T`Aj0anlQ4eVsNR JJ| 5jZ oM8=zVJb6coϭV㵸i3y<g2LGV ZMm؜,pcoS JToMTKbJ^)ݿ6]6C,ͥ'|'o3qZ+%[A5T䩫.E*J34"K)%+p<8{}5y4Vn7eJuGvC0lD7ҫLTkoId]I:C혼>46.NEOgu-U 6W9%ݵ^tvdXTS]@ˮ? ߕ`D+x5-Jzi,t^[%Lpl/ !mI>ڒ GWȓާ"ȹCw]"Jڰ 蜸+]1 eC> IuK)Yq@ . X,I&qq2DLkPPT\ͻ;.VjPIԎRDn %)mH $)*!)'oBF㢮T GuGP׉ ?ws܏LU6`ZQ{/Rja02٦3aC}2K?B 6㣪rj又LzUߎoϹ*$S#٪~/J6cs1x}Զ>6Vz8<*ɻrmlt0eqͩ\H=]oگ]Iɓڭ4,8K"Ď?hVoÃE}˩r2QQwr~as$5#:RBmJGɨrZNj\ 8uYMk3Ƕ>QOܶW˹? -|":}̾hda$ik~m|۾kͶ /uR>2ː+pk8~k+fZ>{q["RY?bjxC+vS^S{G亠m++=_uH:i5GMՃ- 6-Nn/J =5. f,ѽ[V2AAtXeJdPr*r|<+ھ(|irrjqNm,AqyxVd=Z4;Bj٪$1EpS7XߨYkW\Gq"-6sSc:>02x\ UH>5#=_Ivؾm) %ԧbIB M{}ԥTE5Kݗ56z]Rm,'dx)YLOARB:+W} sXT9pFq{)(Uo ~_^k1 7)䣽:2<bVT`X,.{aeO*S} QeK'j9*D,;r!k)m!n\ݤ*ۜD~O 5ɶJon—]ٕW]NjddrR2Zzz~[^s%Z_إv5(rRtV[ T@aE641q$h`lȑvrwdfg%- *ioW*Cd*j^2Ot@WZzvqեNCj j5Q-b㥂^OԘh*,;9O5;d C(6>^.2Yx p=+󓂎Ǵ~ %O8Rc1۾H7?VtEo082#yqs^S(qn%;z]C7PAad<8jrN^qHm,ʁ+-L R~JyM,3z)dȍwu WVдLykr/*xt1“9lfYyBO zi*I㦧Z0gq2zMhnMzͣ:e'qK92&0o)I ^-oHAVc;!Rڄe 6d--tlNJ`d;Ss*qJz+ ܌TNuLVd$sL" GOuGBޫ[jϥo-}i_?߭RhMz M2MPQ҄t8@맦u}2c]KJR$VjRGҡ՚ɱwNκ7W[zU zƶxrݠg9/XǓk/u>tvpo2asĿwS،cr3.,o%e$^/B9~[Yfqc_gKq%d]CCKVt0OsҸ ʼn²(-VtOLXtCmwƽ>>,K7?19y3o59 rd>jG*Y"­̎=ܓ=MFř 4ՐMG_ ӺlѾwٷEe&oNw_y&>47? #ßrOfHYh%d'+ܻ=^|i 34܎I#}%(qς~ZrpZ|dSg9_!Z47 C#em(HR,-zke=Yt<yT5)ø#ʘkk\Jz\__ WGV|BV3HLYk[Nh6O _=&.z |/q?%\қ&kT) X>Z;_-&rfcVuX܌F*(*ׯݳ'ƥ5OGmX׬"ƹ V}gk|Z:8~ZLJD VUj:m$Vz Y,ebK~,]XfGnի(fsCW$G+|3ܗbͥ#*%jB|:\ҷg!m^i/MIFsսe=Q i_9Z=7Nr !#7l>ZJ˵)Q#b=ӅHVr2gbӡR$fԏOet9W}Yzቲq۔zZh2y n>C,2K`)Z\׵gViV-G.Nr ZΩ)61>”IҴprKIoX>Oqs(hXy] "5t*n5G;x|x\E!: Ө 'ڭ^%壉cqxD!ٻ_֧y>z#gc/ģ7bEc%H[–Jv[ux(Gju: PWB@+"@ݘ]KoyI,1eRnC7OO_ZC3ȫ"#pEc,Ӝ[8RflLiߥ丧VM^W&Lm VB<ꬻ$E7B^LU-$|׫n7R|O,93Bgr.r^sm!C²Y͹4'8)ݸqHR$d<Ԣ-u l>W'aȯW]V'Z^::a27Ḓ6U %ġG>jءSyM引i 1}UL-[>ڂ7kkv$A: ]m/ ۩ l^M5`yl Ш<ȉboPY˴㥡_)iVڽ>ꜭMЦ EtQisȥq_Thlĝ:x -g9~Z.MB.$ c]EjѶ1m%֔ߞGu*\ g~9q|wzu?d nJ1寰u)!|~IenL[KаVaҤf.z|N IڡT< iϖc1Y`n;-M:'i=a*ZjU\TxICYSMps'"9Kj*^H&_˫RbobDq 0ZJ4Bor>N,!UbY +<| ,[ɜxىj㌼_g/r' %nJzX&7a;{3jP=J ֔'BM$>#vnLgxH-jV/D)V1Ycfu&n9Go0'9*1*@fVRП >RMy.|Kༀ@̇22Y% GSRSzeVI\of}y8Z\MaUѳ*[*jl'l3(җ,(dJabo=Uk99~[m2;4d9"2LȖ_m|L]Kzb/Wzl9fH]oW,>BE1ݾdxVO(cK+iKj>6Ra:SNHZzkkg\GuDZ:igriak= +SH՗?7+*ñ.ۺ\|ն${ ,ZfG/֊cm~;շK&GXi/DIpݢ$fB1ԊǏ#wA-䟈){ߧpy0ɕ[CVipT_JE i5I؋qTMBцU}jQT,X~ZztѱDnv<{-*5u+Qw%}e#oA@+sG׹UY}A;.q~BM<9\WSg_U~b6Omr|&Dj+ǧ~JmעQx?6L7J&ٸWӫ~-H TbIJXQA5k`&Q'&m-u5x>wq m'"ÊYXPqڄR+w~W!On6;-Nvx-a,6 _@XWwqkĨ|>oȿEFSJ:Jam )%:Zcўg*a2<\g "|X/b,O>iqaPUԪJW6[ B0p0q)v>a[7ĭ gT7iqc=Nkŕ}mUs5D5rk%9B'G< z]Pw遯շMH׫Y->9Vo`Em*yw^mSZ0}5r׭d|EG] &Э-ƦU Z15}ܜo54-[;WmzZhmhDwۥAƼ:W?iMMHvEƫȹ Kj#Vz+n[x-7tܟTh?zj{ T =T:KP$6h5?%dH {,a(RJHN,{-dő–];#Q]}>A%K[ͅ+b:zkAʵSa^tgwS;?^7&R^T-BTwZ<>VL9t2ً3 '4rx?9qR䜢CC70RcגYcNG/Pn|{/{ob}-q{כnحNTr1>s:|Ym8cJ1QVwxܥպ֦9kn/n<)+aTMAOu^>Y3B:k 9+9 ]B\&scR\kCI#.#Ԗ*m] hm:bpVzzum5_#jl#7.H7wƴ0NKB5(R FDlD )N+Y[h |Vڑ *%VY`>,G%ABwdcr{Tn˦tP A]i/8`4&3bYK@GHWCA"$pp6`RnB[[Thn^LuK|uFJ>fEg  #?߭RhɯT~WɗU$PARJEZHɞlzTi ORuXAWЖadIkX]\"3$dmjdMJ!M9mdAz依:!ԭk(ĞV-8OS ຓ1~Կ* !bض{޴XۋrcIqo|GJ3lޤy>n)ree )%!S)BE'ƺB9eAB犸2ЂAȄ93L; ,ԡД RoMCR _!b"d&UQq>ZZ]zuL6.z>`7 "si Oq}+q$ʗadxO:v[~{x//dfy|ܬjM}Eֶ*[2d㿈so8Kn1^?5>UϾ?wrg ] .`"Sq45"[{T?| ?C [HuO~"^nS6fznAz6A^\KP7#c.E~ov J7_q{jaɕcVpp\rfjp9X\}&@PM]WýUƿ[-g&mZ~xDڞ: cʯagO?wvv}+8yhd -*:ɷgrzov|}R{\&;9Tܔ쐑 |TMҏWÒ(qNwO"0*洽x2JZb¸ΞfFg-ԓ!eܵD\);TpV5&:VZi%oa8K|TT ?[6Emѭ:lA&a@nu a֟-[FiGʸȂaϡ%)RGmhu2OKIͰF\?+ !/ZuԷG'߈\*xR$6dW`&B|ݿ5~+\ ]k8 x/pI9xS(i^csm[kI]2lXM! łm5Znێԩ!_nCy (p[mץ4ȞFfķWNo܁7l`͆ic4ihn*$/Ahn}riSoK[I9QLNvsbZH @ϒr3TkBvK ~aZ[&h'ʊS$$#cl bO)X[2!)\m!*ޡcMalwZ15ݝRYJ-[5DFbl%@j@HMl>݆q$l >Qm>X;1L-7)"3g*UXXz}K#"yt{*~輶FAsևq59 aCЫ$ n:HwW[Iyi9relT ԨjN^FtzMfvld9w۞T*Xk%-kڱܒ\ᜅ~%j*,ġ2܅P?r-<ڭ|Mjb8s u|uLZlJngm%9/Q57{3Ĵ/K iakCJl_} 9|aFggc{3{͘k/}•a݈-Zc2TΔ_wY` Zĕz~CZCC J@juWw)ݖ @׹? icې'ݵ-AVxnom]2CY,plPr^rr .qXcR伂8מIvF Vr/![l5p7ʹ T~\mQ[tCzYszn%†Y,{`(6VgJȂRBV~SR@iM)hJ1A{ v;5RҎYub#?F8f@]O~I&Q`:V96  W?8F7B`]'_*Z  :@VE'7jHdr VZ~MҺU0J\Mt%Z#)cǦZ+ya6dj+6{n*=-eֲ9C|=fJD9 Jd&VN>EzfuR)EDhm51  +@lH_@֥;8ɹ)VomC`I[ 驙rW؎abΏ`̩a:M}W2"LV"x-)@!,6Sm*PA]| <-8#fzB%9!2)ũz-UvI76]2Cȶ{{ɀ8&2o)QO_,Z|J6Ҕof}>jДx~TI:k_Jz ZKPO=( r}]=zO4;!?AR~SRZh<>JM5IauGl/QT\t!ĝW9/,37M昄pC9 '"+͊eQV㯈s|]߮k+13NԺK +oLv^i2 -XqegmԦ{@?~R>Η*|+c˫/~qjYRs<҅qe{;US:%>?|7=E|*rc>t_F~N{<\4l?ί }go:ȳNMBu?%t1wNV%d~^mVߥ!ELRN*RJAVy>m+U銟P!)t$an֕["8SԖ^{kd(ߟSΙ*feF2rG raFmIH/Zykٴzv\\*otA`O)Dўr%C "%κ^;7{}7?ƈU<֗T !CP}>>w![SY?]WDC8&Cu7z ZÓ^-w߯bqN3mK]A*KͫEY{w%V7xJN+kn^)kaqXͫ* zis312앥D%EiVA?2kS7Nlo 6M]^Q8BaK* ~aZ6AF\Ñw'`fЅcRbT\*P o{G:!%:g=qrW8|⛍ zt'Kךqw;_|>X:0ٜT=`n+;tRJ>#|,r>xk:GTY t[RRH긜6y|"[p$&ڮFנ6HHcV;!wҢ AJ=Žwu2Tm>SnsX;sHiymV%%>]5pzQٯUD-$WהJPaCܻj7GB+.{=oZNw5ٖq،m(oeVq:AzWr<ݹzJ[M\'&BjVҼ(Ao}jvlhU(PMp6̴Ҁ " F} y Ty1Y̖XWa DHw:V )QB Z2&˪6Nq.k\ھKqǂ<w)Iǀ4%yjQ>ɹ$+VEimk'4Y^3$$Xǚʴ75xZ'!zKe(Zώ-k uvדy#vq5)p7>V3vUci:8 aUz^.Jۍjj:d܎\ylNEdz@{CenCe^ەSgq~z c6Wԍq,0 V,PNM#\;U3G;INW;Y`"zPt*qwUZn/ͳM&@Y3x_":.KM'RmR.u6aJ<*8\Us2V)}1*2-0,mJ}ķI;],|?VCwo#rm&rQp$qUd.[(^ME\I[ YjRAGZ<@IWKRB}ĸWO\mmbDX'P>4 ;)Ƽ Y) iR<ũVCl(/w׳I8U'Y}u_ozCOC&jPɯT~WAX͸2 ZDN@!{kPHUkz(LFbɐA@ycBd䤒{odxX1w9."C~K |oPH=f9Yө%)qnУdeˤ_btGEYcv7x/'QG۰ig'gɖXFn^XauΩ9Cw9迅m9-7d6ou{ڞc{}8 {#ˀ;TZ5I]M6Ó4Mz4./EM1nڝ#&{k $.)6G&}h D2s(G"x)Q_K 誶vn+r|MoVa.llnC ͠mV57laԼE31{Y ܭRQ(4=G @N-;%deJkFJ"GS895q&$:Ԅ}k>\.O-;^UsWRJoDm2N!2exГ!@BJյ(*z8%#z[a8B$ZXm"Fvtʗ)[xIPT+2 bBȖVF֢S-rRэʱ՟a+o990Ҙ{2n{zVwk\[^FW5?}? ɭvi[?0 γU.ˆG"vܦ}jAۑWüoˇQQk+o[W+{ς$yk%=F!7RMJڣjEړW`KOJA{諸 M3&6XpMOUmu'e}7pa)/-EW6+ZvzIB(Xɮ_QtƱd= Bе>(JYz751ʊ,*X(}WR[П%I 'K*[KQ%Z=kI^cm[*d7rd!QXUhe]LX6*%m ~JlT\y4' BC V"ڇi["rt4t ?{p#__m5*UӦƢvWn8G.%QP݋h۳_!x_[^AΈafS-U`}Uiդ>,WŇzkEK2: J`(Kii}qym:8A#+c[P]${%V%mkvW8'9S2w]uT*X:mB鵼i+mX̒sZjM ?-%$twoyCo d݋&’tmm^yqfO9 ?`4pt'~?3cdž- JB< Llln¤$ [R^fX6ؔFFeMGaAJNz:.-ZDYC P%0߈+_U[45kU/-g !DuYvAD(I4?/_MHv6gmvWJj}6CP+ &Z(cYlHƘM\znS"NEqD ",R^JV}|\v߉_^Ƴ}2wU|Xfl--G+ZMR֣`&8g$l*u>*GK\{j84nWH?rٷz._v-)?W:2rg?GzsS<&ݾ\taѶMRIּ~E[uܳqf+]m[ }a:Fw~F?5-L`.+\NEV;ջ!rQcdat]-m &՛ocfsxw>n1yo^=7CڷnQIy507is+.!/v- ;J7|5jQvKr+[VsrRE{.VF/.=ճ-Ph\=Ek[eYe TkXJ>^ԟfեjGSj+V=JL$[Vu"6A2~ B\I5,L6eiJVaJXzkVL8Z@z|Ks!^ZJ֌4cqJ[\UeBYaƠ(__MCԔd%4㔕%aD␐zX,=6$WfZA%e_rHIAڥL qy>}\p~_k*˒Ӎ<@>bNӍd5|_a AH:t:j٨l (hJzTc܅`:)DvIH:WB#dTc%eBX}8mmi>:]cM7i۴Mric%q!ns( ڢ:}ˎM'-G9AW$jma蹯92onЙ`0spܮDXؖt^AN8[MUMŵZЅti?+HYBODZĬ†3w=.S(t}@ֲWj#:ǘsz~z&g"Z$PEӡkj+$#oZJa0&1pv̒B7a5\UvK8-J~,{Ksv퍠7Wc㪪Q'#v}as:/u[MXD ĩC~٬v2#6X>QAˑmϠ"a$+f]td\A$ Gج)}zʯRq%ac|uL7ڍp|5ַGܿ =˅pP'p-ORڹߏ"kv-#kEsu:5B<*d 6hGL\hXg3&nRfQ /ElnNw{<1=ʋ5Y+y8x\ֆ~MU-6Fvϣq~ok 2&(:)&XVG㻁./랖*}|j"PQQV)6Q#AyoÈH柒ynW$ǍB[XKjO?}? ɭ0ifKPzY f ^DZu+ ŒDTn[LXC1poFsd͡'>d~ekzV9-[@>\}Hr^Z 3n3F OYj|Y64BxbY[׭Z1xKC*<BTBHzn&LVi;o%2VZ֭dS]IʬP|6̭}e&wPd5>5[@2ڕV[-+եH +gWW@~a[82$]l2WEM;7H 9פ~BDijԏ^T͞.K]or,ԗ^-A#S~DkL_ij${;I_J^AOGSkt+Sjw鷔>{⯷+4D.8'^g)\"*r֝{n,UK/4yG7fa==5a16{Tג| xq;~Pݹ5 yVoqd5r-No7fJ< K oy;ǰ1r#J)ҥ-RD( WOm!іn-'繫 6R"1~DW1ߡqR$*tu[O,]4ܲԯR2P]V+3: J!'K I qlUF_~$`~\ݠq:T`~kr? GMC-^P=],j FjH҄t W H( ._;o(F[Cq;@cWwYccq%e-O=MMLq. !v&((۶.hj~a-2ZNHOJPRiqn$\*=}rf]*ULD u.fvz =bΌkS~Z$6NQUKma?`Qpթ%Ou$ӡSśeh}Nut5C*DLob V`ZI_u 'ڷp+]bH겂IUKTd:CqFTv>=(VV\Vcls_Y$^l50!;u 푼|R+gE.ߓfhe *)#ޚhtPk+lឃ%[q1M˙0ݦ܋TԘ3L)1[BJlf"`78̏O+KGP+MUg gU2f9)[׭h`ӳJy^Qg#ǚlig>N P-YV ;Ιǻmq6v,_.44׸8. ٭VZUdO-q_r؎e2dv*M8"uw?묚VICYҲGVD*:u:0LDk.7ȑ8 hF@U,!URM0BE_譜"Ed8U5[G:܋e8DUo+,wz΂CCQV$)( qHPD e@c\(2t%Iq>~aY6ͺ]OL]ħh>[Zv ܥ4z Ï]u<\\M}3%w>NFۛz78}q+ISEOͭw~6G[8kp5*>QjkfChZ=U_ q\|M2?i pxulE8&c^ҤܰfڮM=tT!T7,{J?K:H&\di)uk`N7 ȭjM9k'TWp2?Ezct"R6JX6 r_rUx_S -TkMjsj-1U[ړNoˢK0"98 dI&AtdU 0?8Ftf:JeqYe[O5-KS)D,z VF/ȗZ 1珥Jc}(URXʺckVnArI BѷNЬIƖJJܨ7G}dv,ǟV1 H7Ho\Y6.I. }ɷkF3&EN1=#(/8먳Ю1ĝ跖 ܟI$ܪ6 5{9:w ͇]Gю,_).Qۓ 4Xf[Už.ehk8ܗ?"H^.>BkL'}:PuJДԨWq= $5ı9Hs"d&BVQ$7${F*9zNE*fAm8_vK=MLiykqv[Zu2,_ AWd𫋅+bJA5۰hedow=9-Ȋüڗ$Mp(8kz+wɎJ)Lz 3Fk1)MKT$<ғ=+?#}ǣ6C(+CҼ3X:h騒aK)pPJtI ;mgnG\K@cvΖ -r)m]WSDAH,}#Wڊ>BU $:c;EUQSp?&$̡uz2⒁pHp_=/Zhgv!n *Ɩs]?2-D0!.RGר=jemqV#qݨΟSװF~krM? GMC-^  l.EK%u'J_Af,k乖+O9\>5ٲFO䑽-TM,) &c22Q:ڶ̖>SFVMlG>Ȣp&\E؇*vk&6G>ٕ[M=%B1(7jkzzIHE꠽p.jSxgUF%.]7R_+y8[O'"9L%FͶ ր?Zxd]iMen_ęv6#[w)HڶUUg^ ̿uF[ 8a-RJ6*T|mzhHEv-+\+ e8=!KT,kpƫ΍TVOEw'aYnxliPtYVjY3o;߮k-i$ɦ+-jhI'lَցPUl, ;. J\%Њ3]j3-j`D֫mK!%!qY,&u?VOin׵oznV_/ʎv:rmu>i:IUNq"Q=hOz*Yԩmwjw K6|kk\|JW6M}&av*ֵ@-it~Uvަ[N/㯐Q~~~E9HRl@]Zҭ)$er(xX}WFn>3I!%@[,jB%CN7+v^ꢞw$Xt(a6q[|+c]_M#H nI5TҞ #ݱ̀;@k/[n|m΄)(e'Ex\2^FWVguJGKEN(K[߉#ii&w4-Ex^uO6ZYEZjh@jg"@~m'M"ɯ)j2͋aOZt5zeVOu~YFEڤ C[ؑR[pۖd~iZ[4[tf'=2% 1A%Wuw BkL\eچDRSzBRgwBJU&v,") V}̻mi!r0msqϡTAOB@l}U) vT ܃e3eH-䨖qM6PWq2spvMGB{h|2S;+*BgKȲݛ:'Г{W˗uٵl;i0Ujt7kHs s؍5m'RBVGɹDo&t8 vӥɒÄt}[^1Lmm>Z zLgI&Ih>?7M[YZ>ȪN}M8&Ɍ :e Jt#ٱJ4"!)i 8ڰZoLnRJR=nRWajQ|A í%޹5[h|jlS"Yi6WTldqh٥_iFm͹Es6I~>-ޛY>`{mdy[zma3D+AҡՓLd2GOA7REgJ4Z|?񘼃Ӳc bUkdy\wG* o"$BWQzVtl>QPX>Peh6;$EN[zhtn0K$f <T;vooYm:>qkŲ9ng1A 0!zss{vb(<}UgCyjl8 qq1ϸ Ӽܤ χWgvVΕxsdZqSYid4JIU-W+ro{;WÏǶt֝UN:=*Py|^QrP i{+䮏٭8ǣ3QH%#ȌC:bJ8_GԄ[{+NHd)BVZQY8Д ?pdkBPKM5z1:6y7gjս[ViJ6<7eJ8w!ұz5c~l=**60rp$ӱ֤qOo˯Wd~CGiŒ$$ðFڼǭceRHiSc=Ul_/+״)MeږK3m8MoᬤEFC[FS5mt·qхajlS_QuXp7g|"Є GxKB|\6.27\WҮbN*d|şpjeg<]|T#(xǥnp-Ծն~R O]ExmĥkdڱūMef[|F|iAmBZT:$+CskէK3qHqD-CrS`Sm:_3԰h*ڤZZ֬ϡAlrRCa-R>{Wg>w?č~SlK>k:J(멋 %G|NE?YA̤CiZJ}bqV,{]ߵ23DZ k>*4^ݙSЎ1=罶˚Tjw|˙bo%jM„0GUb(ټ'[??2{ Q{ htcA+ V;+$&-:(]b5€\Z%A@י=e.Bu)?5R k>6Bm|HeQkFDT+7iܒYOk.2 3Hb.$}BkfVAXh2Ciʝ}%&Q$>:;{=OhB[<*q͈yZ_ݑQx^iۄnĭe -=<:EesÒy!B([gZJ|%V%J6#G]z>f?.ۑRl-ZeU쟳)sXCֳj[DO]m*'sG{QfL]E`ju[K~uoq-wyu%o1 kjP:_5z.݅. z8(VOX5{Oa-nbr**'ݝ"kUVk)m7,'=$,ӈɺHX(umXYF__f5j(zWfwpw/qqkKs~ƧB!sl{8Ćwa޺EwE-aF},AUDLxN 9㩹qnuurk|{uQ?+]8јmml6 %D5U [&j̎iԜqF?r*> ~~T~S2I)~ɛ+"f32qLG ֤z}XM@eWة*֧ (֢eiWՌ,QԂ=xPY@J%`SY汌e'GIQB]5Kx)OW^eVjwjv^CiiU J>kίe ='V3dF]f&9_$cJ[Q{i%ie7)>аÒeEKJ63dr:ct P"mu.023i P7OVV]Hϑ֍I9lnvNHrLO,@z6%Zx,w2[+unoY$%eA@@2TUi8i C-,f $RƶvOvS)5T y&q~mGU[tz,Nq[\kh58ի=mVSyi)lrTf:_k [\u*TnuYdU ,$htÉfKkEd eZ׵Wж~E#}ϼ$,.Xx㨡oz{#Y9ۿM&0䁒 >],Y[b I fA>˓2D,FMH}8pÑe#v\ m T>Zׂ,ݿ V%U$EoUF[e^|,Uyun%{A7"fœ;1ot2׶gJq2]jHcXIvId(n(f#pV.BmU%,q֮\"/ڋŜVZiK}_`zj+g[ji;wJ19ôrNq57~H m Aj6#mjk:Oeŝz҈ܳǣ|}ˇ%*2Blp'xZm\ UBt7s=ɭw5(YNs8YlW!Hi>ʔq!!d,IzŹW[8L}cVuXEkKއJI'SRV_ǎn,,F֔Jq9 V N_Mepɓ߲织g eT%,-LIs:S1ZU'&)Kj#ql?XE`rlLf:*ȔRRغ4fnavK\M %(eHhKL$([`[d,A:j-\U;{]s2 9 a"0Q؄'K\mrN?fj~ssy2 .|\{2IKЧ %-|k7۫ ǖO[}t xOJZp4JI7lLے!p%Ē\DT N\K#؅a>b$tWجIh]=M1K>맢2{~q,JLߘkl)C/LwWN3) EMmclW6j禬l󉃍XR]HOOjxw+ ty-$]I:qֶmFYd=q_:5ӧ[o0bO88F91Ar5•%AKUEUVls>~$#."C])l {GSk6BM n;ެ "*m]}6p傤q{@S$ 6Xԇ}\5OC'f2"ҩ+#Z~_lj}Tv(R]B x̹mfܟQv>:9O`rƌ[%jYHj1b'ߩҪ6dˑa?D2@I³ЄZ4AuzF9aP-h5Y1#JMj^3B niY}Z&Ru(۬BEWa8T%8W!k;JuUUl?6;%I'G)Ƚ*蜣SwD*> ~~T~T{x~aMeFWj,F3$i&JՉ({UdbcAReq*-RϨ=~Jԕq\HE(VC0:ވ<Q$x T$O17]k>sǔťrpq ^RA*X'{Gb)~ևZ%D8O ĺ@)[HZ,*J N ^,dRGQ9BB+rT'd-moYh)mTB'd&MEIykG^ڵrre2ޓUE_n~miDN:dYbZʵ%8s4_ѧha*.od#2.aIk; #qn2@ɽhޫndDulo뿂ɫK:G0szw*r߈<{OMt1nxIVA:OOJ>K! kzSP>F+ދbʫmz|D'M +t=n-Qxv>]뉛aPLFmk# R]F)-+f8qѷk Ufpb"Q[OjٳZQx!mFJ@*53UQn!TK2TkY}u sLXĀR!@t+3n8)^W6Zhd XMC/8%cJVSm2FBi,RiӹAAŤJI6K(mɣEjUG!<+fa(3 G\iSgO?["ae 6!\ Z_^_: Rv*#BzLǝ}Ytx\W9&sNB"BnA}<˥R;ƽ0q MHu{Qձ8rky-J^&aU5!YqajIBF==lLT i\\VDHHnJMҗM4ܛV;;KlPgd>9=DwYݣ,J_UNjvlo7Ґ׆_V<#\mU'Gw Hi9&d(mƞjk%{èP [,[l,-m+>O9Vl7{ŚiS*3oX{O6v}+%99_|9Ns!dv$;ɭ6N<;2SVfz*(6]WZTIJ;Rh*]:@XպAg)į`t kZ+5:9[IW?M[އfpGnU9t?8}wVzԋQlRk?kyuzvJ[)_{A6 @!)ݻK:|%#_Pl2[zryW[hrLLS)Dt |lJ4E͛LV3#~9#=sy/6[A)sTHmÈV[I_ڳ^+[{(nVR6U`Jsz1WBt[OnBG|]A*7qbMX;*`sˍ =iUa^djO6պz6pc|l4iynGEoUwUE.gf属oKa9@$M-޽jA6%1B|JuPf^Ke1[S~KMNX]ʖGQQZ6JRH. HϏڕ,-`Rt6'zJbJQZ%J7h+2!BfCF(XBsgpH2BJ_-hhnH"µڜ#g!GFE)ml}5Zwwm>oaT-f V=+L{hߠ9ܶk#)gF(oӹD>aj%_I.|K#x[7h$\VQKJWFAۊj,vD|vQ{D[DiH)[Ff\H IQ)=(Y _嬎ݨsMKJAR~J:k97éʤاmY:jm+w!jnv+$ dOC?iUe4\/6+WETwv͌Նo ȳ FXo),EK̙-A0H#Zy.t7\BiaVQ 6Z Xkkzko3%) + /eEQz3.ɑ%$,nIߧP*LE㒚.$'~J^c9|YBJU$^YlLR?5/G/$+֫Y#ǟxtQ++xpcSCBOy >6'^𭒉/ΣY-*l,\uӑ6Y+Mzop6խSz|wxp2^vOn8%rCG)"5jWI6s-iRh"䜎S3V⋊CVs)f4H/VD7[{nc<71HHVNbj۴!6Sfe-:Ҫ6)u YDSEZ3AKh(@MK%#zݐie7!~X4U,c_!Dž,.Il/{o{Vԑ饳n3SKǼ8Q>-RGBj%q⚖G"bB]*6ÑoA㔘x8¶D?1۫:w⏶3)h6xˇlU~'|7þeֱ//n|<6﬚z'"5if)cߥb|)/Q1ôWc #3-֍в+bimje:2 ?I YG:nzhˬVҝ궂Լ>Ar޳\>GLaVZY8nyt"JԶ6\[6R/ |]Z^'r,2qrdIQzV z#6̎s>~i_J[X\uE٥9 ߋi)H-”d(|:ZFt3wKuixnS:T_RR[O[PARwh}xkeKjJ;B&Y{'kGL`#;KeW#\IB:/Ȯ_B#598(lOǣGqu-AIvY^- z|GU+_w[Y0$grmOuT|~]si^G"L7ؘNJ~nOy]_qvB=t$ )!(\ x? nȐII%PRPؾkS\VjR2e#qN%* 䭥SV/ɲ6bc`)?n6p ,9ϲg/~zSJT| @Ǫ1(F75r c3~nd75TA]ǝ)§ hiNǪ91a-܁/A5Qs'u_W&+%hn^_*slt5Jξ^bLw_KWSTLdnHmֹܛ+ZKD~P?&dKŽNll+EjQԍFXvfV5}ƾI6dDxK&<)֠He>ELk-khu>|gƇ3;ibX L`Bi讵lzjWYn1UiW}>sx{ hL$N^w$ÁTF uV%SRM`x>U~+1`Opm6R| `Ggۺ ? +IS8:8Տ+IYr/,m'2pɮBm_WSJGQ u%q,Ԕ0{{I&[ZJl5" H)(]Kas=k5\R6OB Fk1F>{eH+Wrv¡9ߕE[VHܓw-. &:kn%”ڭ.Nzn||^ɘ%vJO{nޫ\QG 0H$R~ J#TrnK<͍"XCHIJ~O+.ĕ!*u"`UȋA8}⸥zlթq_HBUkj޵MDIJ+Yp ZhE1@q񸬉EXZץQk3m|<ǡJ$q XeXf+ZjCC[;/OC"꿐yX~|}bl}i0d75d,PmI|I N#G% M O'p؉h|Γ~rmU&+ |alz8xRǨUwKES{47A@u=FHj7v0TS5;>8\Jeđ|`c;zF a`/,.mҔk'o^ Y>lMS$Z2@Blzc%QVE.mdž oƣ`" 6D'j2w*X6N!jbjV6 Opݹ)^ }*-dTnJc5p <ί1-3g/M&'n"F7[U=VUd"L«*EZ2 ֮aue" ռҰfT,(RTֲ/d/J\ѓ.Zfze\H'g`Sp%T5ε9Ji~5֫L\M,EF*FB2HX@<|jkV3&g͋z}n}HDz+η 8f4tJ֘ߤZNm[UX0ON$},U(4y<;O@*⊝R*{:ͫn䆑XT%JG`U',?`Y|MlסKQ GdLf'䤐(P ! C44[{0UԤP(5 4$I@MTo")WQ T€|W/%NY~:ХP@Gb*)Y&VkToQ>~ Mz[ ;HAdIbTLTwwЧD<\- +}-M]Gb{j@HD9!#"4i*tZQWڭlhz؂⽥REC i y $m wjF-[1ۘb23ydԈEUI TBAV7} IoQ/"lFԥR頪:ʿgA + qV{lodBC䄧]=5ZSBZcym[h #]kU3j5emN)ɣ6ĥ]S,k\[\*,%P9%"3~N^Ƿ?T~̼'eZ׵^]o[8܄8KVoqV!k^()(UƠQX ~'7*;-_i˛XOM*".uL3QuRc:ᛡ:@!$xbk:VmYyye$<[o(kMͪAlcoࠡc`-CֱZN=S%o1z>~kr.Ow#荎+B-q\fn1y,+؍>-Fq" HJF(0ⲊnVZZZ+ENe⋉Eȴ9zJR^ ؀+$ZQIQGZu>ֱDb~q˩\3_Y d=<lǗ?ҧGM=k}8ݺ \N2}3G&/1"g;621=WH*͍V[SYhҹ-}_%dZQ ${ GMmW6nO0xxg6>Y¢J> $uc3>dޚGEz=-ՊIŋm `đ.K1"\Km[_mU^%oeU/S[xW9o2K.*JFRs\յ3Z_Nַ+]O ڬ[> ұ6tqcjj.3*%uQPɴ6Pl:~$;p}?[ͭU6v|O|3.[ٮse9"7ȎNC<˭RAIRIQ&ɪ/[jx(a^{w 1D3w1G2VEDmgc+5O#c2];~Fe^2T"631e?CfAe/<;gmX~#Y X)[J5^p@~ \e,W#߰,;qE:j+ԏ-c,5bU8v'$o墟`{7 |[j>qݑ;Tjk[*Pv#[d;WjAY$'vC7['6WBG}7cGW` 5.[^5^|&rj)~HrOe)Jeo $v'HsopKd\g+SƨQz܅s FgpO3OQe"ws!erc]~ ?x~2R@){x~Leo%L 3?Ԑc] F_pc_̓NqGv=^Z8񌶖:] ?xc-5D};?[j'څBE~.~"rjҾ+3}d5!=jk+5bo2y}9) _e8g+b4ͫ#hQ3_×z盁GWjKB|zEdf ^z8V51ⲴVk2ӱ}6ጷպv>|DDZgmI"qP^# HrB92 O^9J*"7ƒpݺg-?`xܙVzF?w63 A9_ҍZa{ ޅbjofw*! yP?o]s|ґ-X7b{uNvw#zUe~M465k_ArqI!.s-$9jy[O~!z7]hU],j8NG%ڎQd r/7jnig,Ai8h_31]eE|A]e%1CؾỌe9kC/_c F{<񌦟m\>7õ~d喟g;q |Ձ`InwlaڿA@>wS"#.*\S*9[pa_ڏgC]-uW$i_=&D齓W!Ʋomln+!d{uؾhOctCrRç1LeeQs|?wd4{%R.5Ԟ w`Lk0avvcWk.=l{=&ڎ)] uSC^Սr?듍xMJ;OT~ Q=qJSs=CqΡ(s(I%?5ɴS'#L縿=KR$xXzjZm.=v7*H:JѢ*1o*Wc{ [uaeB vG$[OIf7b;fns^+8켞NgɱF> Y+g<{UVcȰ \KƭW1-W&$ 3b:Ns)5r t>7=(kg'2U='L]Iw'5WݲzѧĝC_i9ܟͪQFJwNsoOj{_C,*?ٞ|;5.oOve{W|c_7?e3gΏf{/$\?= ъ1/sSj{_C*(3~Ghǫ?lcv[v?󵔦O5w;e|)Y]$jS?w %=mr[_5t^J?ҖK]{J;(^c-c}jKٌZv; Wj^;mo&c-5FMh|A*ۻ/}\c+5WzHa{#r!Ϟv"oMdßʺX1²%}o%sv/ Țϗǎ1NT)Ͻ2dWzҽ }ik\wK9Q45r9Tsidx%mg9_OA]k;+ހ5:Sjts)5Gd4d_cḩn>:3;sSj{OC-O|3@;1Oދ~r{OC}>t y|{EcO}')~::7C}|nyV_{䰳EkLmc2'r.u$p^kO<Žyqb[Y턚/W@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N[3 qFR{8m!Im¼ȲTqiIYWq0A:_<e0n4F3j<"8 {Vx2rq# >sn4~s¦H'0JXYF[ż֚B\%kF \\^r 7Aqsr2ZҝP* yIIQ $ C@ U' \w `;-A-:7AH7m99ʰORQȔ"Q+R."fp83R0Wq"O)l%S5!ily,k H7 n"lvf:<ێ%*C6SUN I2nR=%y[tJblt'A@Wwcc/%;5=3uB n4l"!Gb4*vG#Ű$Si91ywilE%`F.[(FCyI)%6TX Z.19,|;'a<#ǝ캢q,*%i&M%b3Z8ʃ/!(A.4$؂ gqrr,d j[+zVwC ̦-S%EhuP#L\{Ʋt6#{Jq,}J,*Ҁ=;mNimEKi(-`(`gԬSWq-g'G& Ym(7蕂mt@f_BF!,r7\y5(EVUաi.'Z]S#Ž+FDT6*J!!wl$UkX θB! 84-,㐌kشGs⒯dAҀ[8W9XAg dA*-qH ('v!p3y0ZpKt:H:;!,Ҁ'3R ib$YX&[w&Q@@o3rxx\zy&T&4ƚ)Q0q X V΄3ro~Trf$y Z\H@eDm}?re.)98/"K Ɗlz=ø r0Ih"2PcM}$w"í7:^_y\LC- 8q֤$$(5pCpi[8Y!31ױh癵%^ $?ƗX)jeqǓ#N*ϔw8w!rL ZT6t;3 mﮟq"mf3)?q܉%jE @%, ,$丧`719 (I@Y-ܬ P !fcYB+i%[^JK'INs.GSnz \,n:KR$PVʔH 2\Ə8;?O/5ɓgqMI)#O8(^c52eʆWABri!i$%iJ\Aq2:`],g&0 [*Yd j^ n$I-8Df--!-a)F7MOf;ȓ+-*clqlyIޟhj=4i|yYM/%2fo1y6 m@5cq Rܫ"~ z;]TҲ*ǭ߆5yvb LOx ȧb$C+8ib!N-I-u} Fc`qsaF.B}6[VAڠAB:T@{.+Ǟiw)Ji~#[6==˩ApBHW?#_LddJV@صx@?³3qlDZv k8fݷKiHW@0M3NK"Vl,K^Kp'f@)5Wri,&ùdz|n^Fi##P=F[n[l' HGIXʐ(M.B]HX6P3lY-98&1ipƙKw#v˧Of&G.giq% Wa=FDm pnW_5ǫIJg&C͏$-Mo]Fl G̛7;$*FO!f *KO:U(")#GD,5&W9%K$->Fo Sk'N"e;TC2YK[Rm)[*X\ viF˹\V>6+OTȞZ!Im8q⥔n=O@ax09qOZf6jcr7|崖MOM̸E' 7e-)>Va\'|eЄS♍.BZyפ20<ۃ NAyq 7吝noKξ)ڄ l"JW㼯2o&*tk$GΝ.J^DWu5^ ;s\HN7Z'ɋ8;D"%!.j$Ҹ+sȌy<\h5"$fYHUWLESBVn1)^;#c>.^҄ܫn 2g928|k\x }J^Խ` P׊b8g9<0:FV^G6<}ΐ䅡ihV \sw_gYWMP9;%&YVCǚЌ< O~n^'{峌As3cd=#)Ŭ5J-&ju۹@UWƹ/09Jgɋoysn#|J7HN!86[3 2 Ji`7e旔e%H! %k,*xWsǥcd`˕˧ßh4n;l%Amnu8cq.o3E7&$ m@e@@sb$㫎1vg i$WXa+~!T#0Z61V8e1 Cqr.l{pNUNCerXd qMPġd hy{VRP-aGrm#!Y,U1\&\w.!}f[[7,@{xpyXbxWqSU=C[\Vٱ䅩-wd66\8qr[JwIRT7!j唃eI@X6(2*: ^ ʸKV8aTwQ[Di .D.FnepX1\5hd^vD 2u1W[D}P !sH'1,/0DV{AK@(Y:]G1$Ɖ5IQ%y5B)AySh)nMJO pW-b19fA2rRe~ЖU1P╅+YրycB?CCF:1ystKk)]q wRrWani--EL)7<(طY-= ;8,Kr|(98JVc%>k%% [omB.s y6o=ds"|1S;/-mm~m ʱ<Cd#ojmRaw-\pMZ N_s q[OÌ)OLڢۼ8 hwI!N)&\! $VnluΦlʧ!do˓ %6<nر[\-@@@@@@h r3!ŶJ~Du$.v|y"g|uŜ;܂GMŎzWICN>[J (ZeW RNYh̏8ʮ 9cVPTSO>k{+BwMip{q2PWzD$ *IP F2,~:V*3e[eQ$^lw^ 'ؽQT>A+N6dJۊZ'BJ@K D?o2\RbUǹ= 7d x_;k);-.4kqT4eSՖʖQk@[&ĿY0%OZo엃 %-M[QZ(q"`GSPv 2nH (nQHľ7;T'+1yZy@@@@@@@@@@@@@<+cGes ."ːA*HטԠ҅O<6!Xl#Ǚ-GBҩA{i C*G k@Cdr/'IM?:!RHR-e6YIX?rIw >D@2ϔ6] >cJ`ۭO9B48Sɰ[dhsה]yЫMܝ(9ai˖;ֆ>28Yqm|I)mJMÌs|m5b[`]a7mZJ KA[y |9vco.#)6vC[qܖP,MhlKdy# 4G) u-,˅!,)ej К/1\W-'NKŵ4JK^Rv!N!:u =sg Y仑Ci`7=- $:Ko$9RWӲҰ-6ss. lĖYSOD l\W|>|a\#A#L.|v46\m-G2 8c= .=%99b g\y4>cP6F2&΅RXOx͎B]ܵ91TCc6PK`B\)ī%qr2Ғ[)P'4&AɢQ敍mg$!f( )?q8=6JT9ȠdL?/!V͢ZIZ]IJ_mA,1d">ԕHǽ嶄!yGnw[} v;ܙ8kS%*_J)]Bzz1Ac2O;J1#{a5S! حV3k8r5&ˈ̷a>YRR< IB´굮PPPPP@@@@@@k{mc;s| yeƷW!m'ʷLn$[AdnnSھ3y?,,2jj;uaKSVRu0Aԝ1$&M"}'[i}| P[CFuaXZu6[8 ScӨ7"pHr Xd%Ɵ *1*LO/qeq!?[ܖBIܽ0X٬{'f30N3eQMPRmЙyѰ>u=I$ | Ivdؒ1}:XOL!֜O*;’lg{ YTg/7rJf"2b!IeXmm#i7$A@6v91R7N8R6*Ka6@[7:,̓=*d+́)mT l/k؃S=r@"w-J BbdxIf|e"+϶4/f?̫cV'r92I;5_{s#nRJwG"K88HǾ[C11!䕲)@_v@@@@@@@@@@@@@3>%g>9 4&"ǐVi-EumAX)W|&2W?-ʒ..N-m5rj$\Xpf(2Ӧd`q=PY9!%^D!M H㈒5N21ﲖ⣺jk-{h,y%l,Pݼ,ܟ<4bp|<+lǽEwC硹)KOK^.YdcO2O:ړ2N8o) *R6h;G9-V)|e{&NSKl \>S4b@`09n,Z"BmAvk'n{)s*rXuQ)mScJe[`Zw(mQ fpy,~rK'>sW - L!yY6FΖ@I\33q),s˭*@[~dq%'L^M 8n#ONN+ [8b; 36(I2 Jq`(8+dxA6*2 \7&0TxM )*%%,/hXyPcDfaHQ>bܵ}-/097ca0Si-2,l@ IVP%pƸBKw=81JoTR-\z \&ZVT8! MӲJ C>FnZ|L?fP3"<HD% !,U-etu;eX̖;?\-O fɷRN1տcLiqeD<ہEaIH|_XN&SV\GFgd\|&NEκD䘨 )@^?{ȳ%^O,f8fOF~ryn,rB]yh۳`J@. pfaL=Ay< CaNHq6yP#Edh PPPPP@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'g9:\;IMKQi rR$ RAU3!K4J%?HWImvӈJ-,$Hڇi2g&_I\Uɏ+Uڇ V[\{+U$pM?%^B6!inH_¨[b%^I*6!t<>G*lB4ב?T6!QgO>G*N(s"_¨6# ga_¨6 ) Nʙ3m#]IceOD)"]RʞR __¨C<\Y KW A('ܯTPmSyCrUD"]RNyRE*X، ?"]Icb2IoWWwW#j _"]Icj\)W׹_©,lCuD:r.F?_©,IQ>E 6!^T$TRoUZF{Oy'$^I% )iTK!Q~e v!gW#b̡rK_©#j;nk]$߾=:|5BP|Awϗpd_jPr |5K&.߄mee`:˸?|4Z(ya;wO& N= ~] XGpdohV Gq |4f;߫Ǹ?|4z;Ǹ?|4 wp/3 +~ S{~ɲ߄@Se wp?doi [scu'R\W}yИQ1`Ni .߄CKXn/z򉵓ɲ{z{A3c/r/W2L%erTh%*JhiJ5g|=W:F3)^7%ձ"Wɡ][øl5F6!ύS 2u >] ll_}\'~D?'>߄ԕxW7>[uPca O& B='~H߿pdoiw-M =0'~H-M B1?'~HLO?{/>[@׾} Gp3 11pdoi ?N~߄ w O& 꿂w|Pv{̹.^b?agߘﭵq P@ևS%c $ xpkT6kЯIyrq^mOR:^8)"4qm(I2[qġmz9nB@ЯM(Bc$ \-뷍 WrBZ4۹'B&RٵƭxƔ@YJ>leŸ@}4 VB@Iꢞ2$ymM)IZ@:K\0>9.zPCR4TeE*ud),:wieZI-AR̫ ނEIY4y Kb6U[)qFLvB <(%F@yI JoB~;BRBHU7iD># 'j+Jة&DyƚȺᬠ6H)!$2χz KF% RDǰ(!Dc'tW '!Q݌&<% 􂮆I zRIN)m< ?Ъ{ˮ,mMJ*(f*= R$N2d-O![b[ri(ZT.ZRJG@Ҽ׺ zP{X 8U ?ЪwVCX()FtQԃo]%B5ucfU;d7%-5 kU0 i@{i@eQX$ڃ 'pfAS$@ewPi$( q)Y5'fG151u(>jKFuCjqxmG/-RWX\tTa*%haMP8S9<V(:B/jH/>X(q?MPM%dy'鮩@mJFQ>PDP Y J$Z,`b3sTn$-Xz Z"D ffNEޭ!|7##q 6khO)G5od&xv2eWm G:V=ո!'~ōI5Y}zRJIj䞷ƨ@5Z2O˫GV\M ȵ6:A(zڎޡ"=z@wZA}v% 6US".xّh%?{P֣j?95v[# V jv nS0QztDdjO@5$8ʳgո(.:[iGj@*$ZMXDӛu杌uRA}tZhh,SUHĂ-RFVkDRJcQ@{@$PPP+ :moFt?]VCK92Cb Q#81iAm/IjI-PTJ@##LwY?v> ӏ}LspP./mPn8steIQ!~mnI 'Q4eĄ"g)=Ԃ=+OOͨǘ*椫rB`zM>":B^eՕ6uN$|͊HSlIq^7W(IMHCNha6]P!d)*J"hèCu+rtЈ;l6)?LzJ&'| 0%@u"3""2ZY6#}͏٣$;㩲,z=2|ܛՄ KEg"vpT` TR[ (| {[RYxLDBmkIEIA)N=v8\5LDiIqDkuDcXpD%!@!%*OjHCo)K!^⤫C7q솶&*v_HVy [&d4YI5>DRR%%*OF+@幸#5Xvd5B^i/65WS&j`$f٨ddFF< v45EGqk zjt ԃ4ǭA) @ZAT4T>ZUIJaqR3YH8u-):G&sS' }$+͙!H 7,}ZT%ICƹNs*c0x8FH_]dԡK䵧۪[%ݪ%[d]RՕY gv.JcVME"ŽLNxRPѰl=ڭIPNJ(kqK+*Rª&Prw(ɑøf˹0F]xf2ܣ(CNL,)(I)6)G\՘XkC%>[ v ԮԴ5{ʐ/iUV٨kBS6Ga#woKiS#I*ɓPA~ '{K&eF*Q"EVLը 2Y!itzM<6JէZ+rMUv.Lj`:V7c"-S֞]N$1̪jcVj]_n1,ҪCZfD 6'€ag %@iGt^X&[̴=c{q'5oI6ltf{,I[-ٲPNҦ7z 7s>QnSƔ.*u#lȝv>C򢘮6*$; FЬY' Fr//' KH$(A&p+*0] ֫[JPN$3x4=J6h\M 6{ڀzAlXT9CzZT ]-X"PJ Z@d"<4'R} E؈u$- BZF1(nށ{ڄm ք >z5PPI61 $%" qI$lR llj$F?%Hcuz(D ߪlAXT3q|4 * Z@6"}64hmX1z ! V 2(TJ4tV 3 'I 0֍d. HRH 7eq0k)eKwbR{c~'h>hQ!cp|қ22˝e{ʑxn:+GIF]TRwgb;ӁrD\U2Sֿ޾ǞNm!Vi#h S!!ME$ʪ(*ŝicV]M`ϒŽYzq6[gϔJw(.R.}uɖCV6`~'!YiبyRm$ǚ7CeǸNva RJ ARNqFoSm=2YHYI.R  \YkyG>s5ϰ|r!:p\XkVH[!Lm#{#n%yJuAD)J>_dy0CSh5Zj(AА#Jco4<7*э _/vÑd3 9w%iKg-2=OBTODV>J[~])+$˳ez^RRQ/7^ޯOڠ$)ZP PYЁԓ ,!@Ms^F¹f-8wݍU'} t8¹4ŪGqӉ1) m]-;IV+#^s0rER_H 2(xҤBf2@ZnUnI'ƒJEA|HYԩj*:$ zP2 d2˯8i uCm\ΰcc1и ffv)0*{Ϝx]@[j|k!BZKͧ%η%qeX‚X\D44MKz$#71 /`bmnXm-X]@ @EqAsx)%)y[YAg1\*͜fJ ZmE&ioĽwAIگ?K0klqbR0XQ%8e!ERO|:MMZ?? vư1,$Z4 gCYfd:=~A]P,Q ʌI.};eE.'EIa 6~w qX$ WA~w #F5?_IiҸIgΐ2+(΢HHilD*@ f]hUͪR0M Xʐm<-*l ʙdEKAiv[J ;WbC^XjCg f3R=?=dOm ,%! cg!;U3:fͻI#hl~w%%!vi* \Mj,c:lwOp|̿iuQIWR+fg#{~f& irKZNeZ T݌ؒküx8ǒ\j̄Hڮ" 9IiKck@P)$S"ciCN9HL֣\jT$K:ng7*>>'(j&0"7 (I却 -1[P-@v/mMaёnRsq\(XS*DATҔkbn/WzђnKᾖCIөn.9my1 2 >օiiБDS%%J WmYxBe'H"|Ls>H$*۩1Pe*T7BAqUPچD0kyXjPK&$Z BmdwH7q[P SHTsBꍼP D)PeHn@<9Ҁ4멻îH(x'}% ID,MDփ X-C~[$}(!>bƓ]&1;ZS10-E9Ө ML}Rk@)Du5%FBХFSjBI7Jc^J#.d[qД>{Z$0mJ6i B!eі1.4@@ tBNw)m.UҀJ&2Ĕ::N mlWb;БYRM\@t^o-dЉ El-RbLhѣyiR6i$qaU)xЙ h& JJJF"NPjsvYZYMUY)$~jrH_5 iry1g}>)=R~JX,CϧxrpOkPԖW^֑I9,wbyf3Vd)i/IHq=).ˇ'ٔBJB~ Sl%8 )LIt%NiBMj,]N=ddQС#did46+Mp͹n&[¾d/L) @*I:\㫶r׶S|6b6S:-[6lB:^2Zϫ1+ey+ʃM}#!۲V)y(ISC]n&gj7/Vlҵ}$hPzUYf,cTe:`n GmEVG99L֍b:`%$Drn7'f%Lx`cto~Vk3k}[\Z줨а $Cd2Ӛ&"v;qӥ(e)7JPZ3Sr&#S)9􂟾(D5QGcM>G H a#'xXq-ai7[UlAAt j $6o P@E@fkiB&9lSy4gcȏtij~j+*GH6طWUPTUwNw7"mX)Ff8_~3JUsc\zlQqM\$ZMȣ3TVB>MSiCYgɵ2e8XiWi_3f$ME$0NQP >|UoSivwOU(ԙrZYG^[[r v; mͅMpWpnZ7Jn閾'R.̃ķ reJiZT޷\M59\ uRZ ;^Ki [S! H)v]ܘYKy=4vfIfTol2-J _@%ZnMZӭi嬓{?oOnLcc.XXYm qM5;TY3v0 rN-Āw*j*JN>>Ӕ9n-3^mjNhTˮWyb=/5gMrkZtȞ74ȡΓyXRB9[NʣȐʭmpm] Ql'15Iu?HBzW@j;IͧZuj ;vyiiB|vUI=/oBFCŽlM-BS%PлnHP*[U7ԗAHP@A ZePPTu Z , ۡ#HcN "E|*OBE*P$(B,m T!$ A'9|cq8@W(Dҝ|BDMTЭe_ernb`s $l#3,-Ũ-D3gڍ6 dضˡcI|7vX[Zկ&Yi(vkW2BZekaVśSލ10Ӄskܭ#5EǠՉBRJύ %#[|IEUI&BJS&)l BROUeBJu GhIj.tP:F'D_J" Qd*)OC~-Kiiq֍R>EVD7,i939 N3L2\t#s#94fq۝7=Hh-\_RSs2xn$DKJ5X7AToe1ct'av9O*cNMYʣ睊>d7S{N(d¿&t=5z -q4{j ЕBqq{]MvMAZ'W#'9|CHAR)WV4u𬸨ᑓ%q4Gt#n&>~w% (mmAZGpi'T*8]RHԋ HE'T0o|fb{"C\ U -d2񼏙aKJ[ J'1 <*S'#r^E9iYʓ%dY@V$WPHU$j̾;rs[GKJ LeYt>Q%"tۥT1hHR<*< h ?!rM#JK@쐳"2duē"#qM92@ nU4OkԖ?SuBﹷc}~Hd2_~3EqZt=d+2Mă  UlIE3Վ4 7]L}JRZDrPWI {j?% :֦}{v.1 5̭㷗T5sSrPtJ9m$ ` kG?oGj- 6;O*ZJsrz$t1wK#dGZTtq{mkdhOt95O8lDע%-㺔:-*'tAN"2&8^7.~/JB7|R"vܶ%^%/pو*IqxN`[{7Un]86C_ϓ&CKVBI7Zfs iN,ItԛoE̒Zhc`\%>Uv-WSw CW1+[CI>uYM6L>:W&pܞxZ泚$z Pڀ¤xG@b [A@*;ݧ~h}/Wr^F6/=I%uc}Lͭj 6B)<|ߥ Im7ۢFE %~_}(U(Jc戰,,jZ\PMB3Lb*5}*Z==hD\qk^QBkN "װMI)CX"_PLMAaT:e~j93~m%)TLL+"Ii߾BLY-e9pQ.jLաo8m4Vuhs-vj.MV1rc5<@yRU$VRRQ@Z5ZB|)|sBT.^/X1PW帢PAhJͅOɬ?n*F$jB2m@M͐lFc5enJm:[p=MmlE/AZM$3ϻ""i@aAJVO_ѻAuC &*U¶UЂ:$4ڕ!A ^䈬: e%!P_ZE6+)VUB ޕXjna9 2g(p [V|kVOVT{=)fiˣ*:N9jJ )9(r 5ГwI$Q"Q$D^U)&0I1c]$ ꣩ xr}U!5_Sk(5cj*3d$qŠj7(I]4u,99#8%8c2U囸 :j)$m:,b JZbG0`̏  %:lu%U("*Rcp2JIk.#oܕD*@7c>ti=;TA3,۠MBAzd68"cM TDSZB}~ZQ>e sN $~u5n6!T$k}=A{ys%)'ċ,⧘mJ?:RʢGnGp8jOTSw۱}> EE3&_t,4nG-zwLAdK:TAm#m)_&҉6OC4I^Q`I֕N˲Şva4@7ӥhurP&UjtUjp̆q(A}H5އvd< )J!V)CroJE{dFNˉ71 7)R1㼅4$z뭃nF=[^.UjrnHlSEFRmR:Q5ǦNܔpع {ݞSo:l,zJtVkg8g%洔,Y$ׯ5yJW a1W -ֵ8v*Qů(#(&*Z#'z*{N/&s%&gS`ӄf-삼* != I'^>\k(rGn9yRJff)/K7qWSw'/tߠ͍mvT+O}5 hGC@cք6"@bMi߬92-[|1{o's]UXtDP@,akZ~ʝQkݒT4VX$ܕQtXU5EtTerKܣҒ/bjdR>j–ݍm{B'o*L([CPY2a U!k?CMyOe=ȝiqQa^ TLZQ:7%0/saJfF퉵 Z=ɍH#̎uO^]ԘC+}^[7;/ҡ^Ვ#r^T8[=JUϲwjA6E,2i2bIbS A;T.'Po.ғ;=< >ELJ]eXAvCϞx-`c[.[ JR{^P$[VUHMd_YDy@(:cV~--O+  (/q{fd!VUaijo TF#ϱ{bN6:ۡYi%yE2Z@ "!xܳJ e+hkEI0NFp;7RI'EA"re;Jʜdan\Ua꩒\[sF\涓Шei c2 C`8mP 14JL:ob_YM`?!RJtvm'橒nK3)#hb>4-BR-Q=0-Ss>{2k {l')6PYJk'tormXBP 6Bms[xʱ#ɒۜ2Qq8d1-ˇ!IJ'?ըMK|ahs>˰y /LWmRF}/|_,<}%'~+GȎ:I6)RM Z4`ju?&6RA < ]hGJ|=ڀA; ~h}1O$Rk39RU!fn7tA/<_ptzLjXDLra@HAwk԰*z$%T ;zRDyIu)$ƦHdt%  ,s(m vժnIF#g[TwRog-БtC/e;J٤i(i=Mζ_@uR~CI!B)KSVh,< F\6eoTғO&aLww Q"ێ0┢ڲo Jk Ξ鞏ͩ&bK=5)V3JBFޅ` &Gf3qc|堰6NiJs-jdN}62+.CY\x",anShiД$yw֭-YNOr/-m9&CXCFQз%%;V ğGkwK~Wc[$4]ρp0Oɭ6 lMձGK:ޡT]彵k#{,7e廑G!9R%;R\N]-kJvxYkkb9w*Rϼ3b kS^dȬerI1 s*9!-=!0ҽ!)R6׭52qSj{ۙr/;SԂ,)I Cɺow8 ߨT5,>qRLTn ]JPMZ쌮;vLfL6m>8$˕/ﮅNYJIʲ\O$1B@[,[XP$;G $qT,Wq3Ń;ߘen$~mMzcdO=X(}IfBDz>S>SDE[%S<4)F\*RX& I|t07DUP6 ħO~bCYT* JY$).GT6Le,\ }鼌UFԬ<|j" w+SDL|`Ԓߜ[­v&a#r(sX?/ߘBk㥪ATRwwB䟭r(__)T# j, %KPT"~[܁ ?26KhT _IGs6'g|?-ΫH;ozVe׷ƾUf[r01*IA/PU%IMtҵh.`J.3yH}5.WzjdJҏ<ˎ=ƳR'q,*S>jl%o>+h}薏UmP>pyԚjNKBŸn#q7SNrѥqgD_RjάŊUxJrpm<*:f:+ى: lu_ƹYgc[Em{ƳNr\4yK!Ii&"QY0g}] |\s;ó0\&RHT7 +yGZ'8aI(={zx~S:xْ*#(۲-d7q`n=#G#{tI/[6gYvr_ O"0oxGl J!&..|+|M5xx0YK^3s)ǃv9 v}5nw-еI|Xta{\r~Z{brD\an+pC% 336!CWs)d0:.~;phnTR8?ך:&pHIs,_P? k/?F|'})F'ƤF5$ @xH@'@z~M(i߬92-7ɿg]`}LˠEA(r^m!=.ihҀz֠1ϘP\qA HQCnH#„EBEʟ1ǘ탭T GJadzA|) P+H2% r+)†e$寨P=]w"{*gOpI/zq%@ VS(!a&rB0TOEV4$Xp\jόJw"vI:B_TV9kÇ112h%AJn.U]H~greȲWٲ֧=mE1&@I%J7|( oCey r81GkTdX3 J!gmMuB҃x?ql! ;0= Xk4R_iJsT<)zWdJ{;x2@KOyeqa4Vm ފ"`{ʬA.țaY\6',9FF?-PZ|emmB`OUTAZ_qhoZ%-IT-qG9),vRSYFB7w..RK%G_OOZlZ:|֛[l\*iJ Iu0U= Xi%C%Zh/Eoy.Qtͩ#ڽ@~qVȶ6`t,`1&*AƙRO$+Ԥ+/^Z0?:w/.(>*rtOZwz_;?>-3/,fZ ufPċP$kzI`4WZ>ooF}'$NHХ+Z VLzT -CIڣDd\a{ʻ.yg"u3̸TݐIml/oRH]H 'kR+6Trݎ5+f< E:iWhQKu&ri{ A#OJ[Nf$>7* N:3k$%B =V`ڜQP Q*dGwdAT}*b/aQfM1:ޝi=AԨ riaL2҅ ~$+!Hqr6@n)G@EDI)䧣HxrLrcKi6}JcXmX6F b0'_U,Xk2. U=2Oa6[EĬ-r3⡖p$))$UB!÷-D)agëfiDlIRHaV?CZj l w6*񿪡֭ T])G%&A5tІuf5 ;JR,I5L4/|%l#̨:?3>r (*!"q\ugk:.],r_..d=Z@ǘg[Զ ]+'2!O\Yt$zIXH;ُpf3KB+PETkSRK9/6gHH(>ȺTHC&HvЩRV50:O^;Ұ kB7ƩSe[oKUROtWD9m͉#*aRZR%X` ѧCt{m:6=A\?GG j{LdpnWs)}UJl+YvVi_qwÌ%Vv+,MQ6: ?'uQQIa{m#siFP=Z՚eQyr|չmU%fn3"뻭HlqmD{o 9„=ie>WZTՎQ!\[DA-T% U'}`9r}5/ hfm YYGKaWfKж' N!\9Ji@Xj#0VzMƘg$+?CiP K@PNh7K0>e#!%ܩo!ƍ-*,(eΆf nqyWab|+`UJR IN4~#$kBOcDɖuY6"S-Ivl{.\+ m^dZd_ľEB+Cn.{/lWSD6y=7Y]sQW4(Rn u;wp%wp0<_F;)rom-#u7Ȕ7ףxk,|_}˫GM{Eyм5ڇ9 )ūٿگ}YTSqR/e-Ƅ"( /xOIֺ<|lq=F٭/r, Wc8i=祵)Q(5n ʛ j;:QL]g.C?KkI*6۱[=5Նa<2<r<Ԑ-p*!#Wy۴|WmS/4s򤩉60Q4$=*<=jH0V@+JWd[~wXr5R=r|̜% v=v??ck^d-urMa)edMQw!TqH>i+!  ;['r'g9JѬ $h|*67"bHqU5WW*UBjJjJԑEG'z0wzš 4>5}[=Rqp!iu$DYXSnm?Í77Alr$k$~TRp{nyد&K@:&Ɨv?Y;aM3 ղ2<ؤz~sơLӬW,nZj|"^'aX-[|bmpv Mo.B\u6IJHSFY?/Nxc[d,-iƠyա:*ʭu1$0[]WWpa|m'ǡI%/XLb>^.JҴ,ԡI"ƥ8"QcS&M@ J܆@$ǂV\ irrg`rpLP$/[2eIQg\.o{>hZ0#pn̒C9#%܂eI.<>u89;mO~*- PCO Vv IKVHϢ=F?7{q@>r}nu}M2&ɋ"]O3X4Ф%(>E֫j[f*01/57#Jo@޽#w38ngм2[#n*S?@N&k\^ZL|Yi:7e}'Y1$GNbVjJIy٨Xo^11RxG@zj[6jwg<mMͯeXG9zoDݰz֞UzqpsQ*JG&>9s!-p.G]zՕ,wGrU@~CV@Idj 7}l*ƺ=ҝ7^ ޑ,l/z+|^>jƋr*E)F9dx ӕNp&&;)Utռ+r̔#;jFCbWr9.e>t %]Jƫlߓ}%|92Pd%JJ\`)CU ba|J u~|=Ud ZtN@ɹ,8Ba-nqĭŪ&~}Q1LxCeUqA5d)8SjU#t[xUIy5F,e"ߦqw?P]L W ~Ȓؕ M?=Y$> sy 1=Qڵjp[A@l^)Hm#z28&]>ө-)5$8$q9y9<3;y+i$X>ZDkwyV{_a𠅴tET^Q_=COhsy|H 8B I$_J ;j~+cRwwB䟭r(ZY|Z&2t҂iXٴFH6LJt6hZEX,ln1VǙU#ajc̷"zoq[ ;$Gu?M^wgס^?ͪXs!yR,}cz_Anûx4-:8o/HS7[^b4vU[ūR^UU|̏++^6ͿuRi!Pk FEdOK#JI+BNJT4"j(fZdxW`7sIהÁE8]2ƜJ}t}Җ'|'W씉rdL$ip~rZ,n`DfduZ^3ukp 㬈Tz4mMln+ ^  {{ ۢO)a$3k,ٛ}=_un*K)WA-JGU[kTͿq ?쫵ٰQIj9g?ޑ嵓hAMPjg+h"uNT H<[bVDk APjJ0߬9]'8޾‰2D܁!HJUՊ5ͿvK}T631ܮ}uTGcjnMB窛@GK9y~\u?Sor'Hs5a;@.Tz,?b g*e3"Ha6ʤ8 Knq6Jk) t;ӯmT@U H?:d-󚖙EwR)P$xVMh93w?iuFȁك+/ շHcZ_ѦLg.?9eFWeYJ/5;R0*)GM섆yEddGѨveꈏz[#$ WeHY|NFiԉUp?W? KiWbGR2|Mب`zoQ&EҖ@erU+"s9#3a5mfJ”O5[t$s,'CKY8M޶5bEVa)[ڛw}mR >JqH)YO| vD^!^`@<%RA35&di`my..O ɺlR~]IA۬kpXsh9,I0R֭%ĒZUp;&eq< rQo2A[qK #TdchY ;![JJJ}&kzDZk<43!8ʐj4P\xtO|#I!EDH6 V1k# ? 88v)-25*^Sx\/mh_BJ@OMQMJ@)J_Qj: !pHҕxiIXF,7x"\91b>RKjРEJl<<\I 4 t-AI$FJ .!BRA$*$HP8K`@yNɌ ؘ0QlJ.ɖ"FkrLH-4RȽڮGL½ﱲq1\i(jXYS=]P jzk^S#LQy\yZ^Sc$ѹ>vFN膱j~ ݌:}<dtfL?^*?3I@lqZNC.ֲ(I6V%z֡5n8qg zz$zV7ՂMX5я,*ދ׶: .Vg{mEj^J]6HZkXS/&8U965p/`MjNv޺D,,WQT ͩoÐ̨4풕$EMC3+mu;׵nbL,ZRqψ•쒐FA '^;w/=k{F~Cv{Xg<0!o 9rN$m&;'. ߜ) hd$A"W_/%{LKbݹe>oSY[&?&ܫymkWybswTҽֱs2]!N9<->5rcm1^2#w_S^C8KR h z  nI LSzM@<; ~h;ޯH"MP}:3JVO n6A~z#$ASqaۨyzzŒN@g+3Mݧ$S‡tPWWZ oW e^d.miZPI7HHXV!4 `IXTyjBEeJ^6'.! u{U ݇-*aִq4op ,Kery/1a;-8Jym_uT"YAAБѯ[LK<9ig>Ebz3Hh"C )?=UzJl~)i/<$Mʹ*(kLip>M^ `\PGP]TBȎ:g*U1[euFv @'T5mwǺ2|䴦=H=O:X}A=E Jg z /Q2ScF @~C]:G.$Ez&DzMMQ;FYNj6fHN:duRB{U p`LwCJ)wتd K*rۅ Pq#@>]j+eڈhۂ+$Uƙw!e |eFB[rAT,ؤx,VV┽cORU$X;@Hh1$ HcӯO3S^b-z۩(_+ V:*;ƈQD ,2ʤ R %>^F<ͰyI86aĶtہ+7T"sT%A/1T/8ĦQBǠa?JLFVN=H[.qH;mVVd:ѼO⟸W&at*ڣd ID%nLnuL)xY&FRS&ӪBWR*w \61CO 24Pn7 ΢$nUre0\xǒlw*iۋ垺*aE$;+LHfGT]6$E*٣>+ȵd7[-m4:iVљj) RC)!;G([CNBZMjƢIмaCɏ5斠K-֭Vى *PYܙWlJWVħgиχNMSY $$V<Ȳ):- IZt3Ki)P#{Z\)cbJG`FzFToBQ.6/ny_nҭ̢`C]}ġaXx9O}c$;{ޅ~r31*R GQO`\l7,::ޅbazj*ؠa3 wXlI4d_Gխ`S7]ڶk?cW=5,1v2klt3%*|xXtXet#ĚNCll #Oco^<zH&;E~nӓ7u͹|OULzIzf[1.Q\45_-aoe\6MA܃#+Ao{&- kN¼ܘ2KGrTGJɟ\YJ0:ʃqlI̫h: |otU|8nCuq0ĄHx/Jk8̚ecv^LV^#=%;h.'ǨzxHгjqHꏷ^nn:vYA[(9*[c0̪ҎC(WIAc{%#ĆJZr xopҥZf}LF֕L9ђTCJqFR~Z2rשcoj襺[>C-,5V÷rh]>TX*,tȺc֓vkn;q$ Uze0$j$ mT€k ̭HV<*+ XҦŗ#h6I}Q\2Kl`yҲ$,+oQN@-DHQ6QLWS*JJSJF+uY7K+KRDemh 2YJz:tK4xԝŒnIS|i#`TFr~S/bL:j,5U/=Q8~+;+“D*r,U\>;8xRi2Y\T/: Ǖ\loSF@c3rֵҶ#C/# ;1푷%sQq $62AAsS3RqY.6AFSH):GidE(cI04^iJVh='0qJNȐJU#lSd&kH8TO6[i7yұ2nߒ佨uL?bv"boFŨ$I(w_c2yS.cKBw$}*Pv^B 輮ԅ- 0{-Q+B)TLZTyכZM- n@-)T$m*<)xtmx#^u roֲUAqFՈՒ,lDK0iTv6hDfl_+j&JO͊"A$?%kD(#Z&O ץ_ÝR)g]n*yC&1!iJ͒60㻂itmMiۓJy)W5in+h5#saZܟ8O|XP܂kSm؝s.Un(k:jt:5xY ܷY:*O]z^x3=3zNdc>bAxJMꊣH?%t+CZ ֟a!L-561Y"#L$ISRE+FIF=ڝJhc̒^̀}|1MS'ww.ێ 76YE7WQďK7ROD蟱\\9^Zѷ(:菜_:y9XRRz_9U^48<9$Mw /Q$IdlL$Q"gI@aBi߬9|wM@%dO)%ӣ+0>Df[鏱S$x2ӏ #'2TQ%ϗ؟UDZӖsޞ3k1 Ut6J&_-{ GT2dT~% QY~Q6CQdlF>aI+PIEx䲠 *$1ֽ~]Czkvr8J!ƊEH5 jzkmԱt(u70ʽZapYhG>UYij*^&& *x"ZS[&MUf Y${Z+&NAR&aڟM2sW} \ض, kwCd6 XBFUF|Ƶe!u˫KjPۯPG]_#kS%x>WY-D0#H;m61Uv֨Ce}K.2]{Ԣ5}dMBQ_5_dЙ12ص a@~?7GBz4UR "A͠ L9F)WZ5S,\~ra Zp\Z4Jd6rHe'cj7ZTY(WְF7} Bno `9=Qb6Iy窶f҆xajXzMQO6T BTԨZn5IӘnQ%s|sN"3qГI )Jj>[Hӵ&FLXN %ey\zʔw G5G,ıFJ*! lLD%{Y򕼓*]cg?p|L$]5)%)![o IƂ;?,&dmumh#k߮zt-S(m5s&AfXTe ɕM8o 1\\18|Ccl.PꔖˠzPS-%rRۖJMΤ|MWt7+&E忣A',Ρ "åQ X_wԛ0⑯EYY6'zf̌2-IpB;]r;^q<\r@4OṂsrFVNJ=܏y[we$sLq;~Uʺ{<&ck J 3p~SpTJ$N$:M@kҮ% j r=;ГV5hOTj/ ɢ-^"DͦH5ȑ ړZj"UMkfPn$ZՊ ubAOZc5l>Da^\٭ M+ wRBpˋ=M|Ҍ}kGMˁ-"l+sv=-QiNboҹON^lmҫ Ezֺ-th ΟNQ(m!ҳ+Ž1m'}l9\h6W_*:;n(ҷWyUgPtߵ52S4Vw3O::EyUȍ6)/-I$JJE$M\r`o*pgK MmI֯?oܖ\'p.K$ʐ I=/ܞՆS)g7wjt2K7a6}֜ZV ٬[|+alw@52@k@xM$(A?7{#B$} ɨ2Ɔ*CR@OCF**ECN5FnmUՙj[}_RĽâSUMU%5Tа(:TYe= *:BO:UUS2ϓѰ2fO)]'j|Mȿ[j0yXskqrH:U]K#z2 @ym:Ըhr4>z) CzHkf*c 6ZQ$nGJz aD<8رՐǶ2yz )EWn^sWrv'D$6,*DvI}O {(\eY;A|:p,6V[ 4jC~R+a>>?$u<=M ROP SoMIn߇EA%<_55!`}I5~ZPl!dQՇHoE̵:A¦_ƨ_LhTu-\Q3OVAf,k eYu |jy\$˽Z2)RV|O],}.k{BH졷BI')luzVlE?b9)◵TtנqӢrJGce8ffRWomQҰ)doMLyۊ muzNv)A&5НD'ϟ57 ׏"]/N&{=~kW¸\Y I .vޤ;/!IBWg#̏!ujQuO[ZD)ϤҎWOY+'ϑҦY^ADd)* dR=u,ՙ#GURN?bDE>Z)~J0T12Go>nlp%}!JIe)*UԵ oUVUՌ)m *Uub M44"DKqᯢu7:{&ffO}G >V^%ڇ䬩(&ŻSy'.9Nn-mIV7%b#CjS}E%%Bd-u6=zkzˏ-^Z n\}:Ԋ9(s4A#?2a"WTr)Qa҆T$hcS\PBZJ)exPPLU(>|kӵ2QO-RWI𻒫XiWNcYd xЬ7EB}N$Jbb!qⶠxj(WC%/KC{TBdg>>PhIYm} (EJ :u%Ht}S1E+wpBo먕K׫@XK ez6J PL@^#Q~zˠIbmvI[ -% $-RD(XxX$% Vl48ojJIZder3n h{)JGX %|wt뫕3*o@mjHE'!%S;PE& ({r[*Ȯʙ&cɔ}KFe ꥏ B AMyBo~_䏈XjYU@M&W ]>ɋ%OJ]Xֱ-E*Ԯ^BI6*umUB4n̉>X0HAWU*Z¢ւ鸱`ݨ)w7  a3[C" \ Zu@;@zVP&#e-tr-\dCgqV- !zZXQPJ;1^SRuXFH$nw!ݜz[_B7e=Jx-!>ZW܆y}ے g=JA*O^MRֻ P @v7mMaѯ⃖ %9ܮXF2Þ[wlPeܢ fq4AG#N?h>-*k_ƍIeN||[,-lG?Ų[ _O_#&J"1 =`Дm.O]fRq3!`Z¬$GV7Y.2},ysv_c29@)U dͼӭN.rNE^G{~ XT(7ߗb*ո )Hag+?Xa @ u5*>E_98.WW}zD .SNTl T=:Zw'X*N|Y8GNn,SjJ{Y/sc?j2["g/Ɛї鿿5I*`~~-ɿM1LſM12boM1t`t/Ʀ ?ſM17#!o?iщ5bCP3 nJLu$FO{&?Gs/ iLôwƐRx_a4{Ƥooޘ`Hos4{ƂC|[~{ƂK$ڥ `(}2:{-y n7jVP}sx!*d| |X:(g{cMpkP*𛔃?m>>-YZSGZ*;XV5D |_Z_joB_hTmH#т& P$VVd9$t֥ =DꊲTT'PfpkRB g|Uc=~AoI?5N[o@k^`2~'Kó$1s1~cCi:??Ǵ2nG?5r31]1etf>-?zscPySYwơ'@>>,zscQ9 ';9]1OŏNWp?j62ːOŅA]1yv-_oŒnӟVG/بofF3zn6m?^--Y&]zŻ2˽!(>ճtlj =G ZХvH>WY*~~,E]F{}K{I=U[)څ* T42>Z%&YUq>Akn+F*~ (=Y_e-r=%X mʽF *W9aRv_PNj_*냙zP+]d(ĩ=>Cʉ|O!!?suaXmB6HcX?-j!~"]wwmSlD+ޱb]u[u Pm{M@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@kY~~-Ge4C;o)!7􃄟 A1Yjl!9t^}Ho#q ~[_-2H^ EZ 2Lf%d&C YO0$ )M-@ހ2<ߎba&IϿ1[&ȌԔ0ԉl0Zʓd)' DFb+=C>CϚcnCJR1{vEH%WθdĊĹ9&g$Ø3'3CV]m s^ҥ O Zw)K\֐6!e+Jwv$lA:hlk\׎=WDGuaLGanЌJTTn)cjaV?sCqSqq/Tјo6QA IA;@VS`"\sR脩L0\_1$J" >sG?R"2 K%$ۮT [-AjQZPIae瘍c ;u-JӢ #B( vI0e'acXUb|%i;S{JzW?␦΃+"K4erKF >K [WY[ګ]cDw&+FRw$",,oySI'#qlG '{a$.wE GϱxXǹK20 ɘؓֆ~/2ʥ j{SV֥Ks<|Ol]e>KRv NB3D6T_6 Eaܐ奩 TBu0fA9+s#l)mF)tz(V\RIKiq*% A-'/.Bmy)ǥ [E RPJ5lqp"cKĜw4n}WK *t]Wa+h9.L^S։mqJeҼBe[T -(%HBUO@e@@+qp5^aqQAڞ)Gb !6 Zgi[\a:n<)2P:q+6TT3 X)ohj=mրK@+2YATeMMYmV ZJ"P)P@X͓Cc"Ӯ4҂IJ&|OFW;.HGe-^Jǹe*!bZdcИAe|SBM4w#-ܚcqKiܒRwTNXmk{@F9L\TFGT2"DWBJ^ZCrPM\PyAJ9\9\2d:t81S!!2셅(]I>/Ԉ yfC}%Rm,iPZnVܯ7;c!Rc*f!q6n ^$r EqFAEog//%du1R}d" e -%Ey+ҰXxOda#䦢8qdÎG BrcDKymk{|6Erm>ȇC~RAMf3PP}3"  MN@W8JH~$c M+#{le;+*;xBF]vẲwnr'b\*顠+w+&"T+mܦ>I&BlV#7vBb#iEo[ '\VpI3d!6W7qdd-Ll԰$MLjg4bc#Cm? R)} M=ʐMQ3#dCNVdLN07[}*Q@T%"1H`H4gcÇ5Rgɰ\O}ƙٰv6'ʖNm> cM%@@@A[s}lYlym/'m^(\}co/\?Ln=۴ۻۨ=70uϬ}u1|o+7y}[w;u^ O#nO7.Zd[z&r<$[qKu%{'2&]Eabγׂ2srˆQss~⽼9 _ s v#b2`z[[,"WNh>7ϛ 7,?%3qJmAP};Xp{bgձKyFT<Ϻ_~e)PJI* z'Lo^jq9qIv.ı0koA}HrHrc,IB+0o'{C)[bqSBޑ@a!fa`Rօ][B}5 ?30r dޏH^Mpv6JTUJKs2q*[ \INðX Oҽ( #~Pb{Ϻys[}rz]( %nGcceDpI`2 q蝚((dp6w GMNy%~pl7 Lkޟ7l'ƭ1-MV{ iލ>G5-$&CO!cb7iå1JnY33 eS+,U2s(-H!(/$IP9.y?29$w 9LL9Xc$̏vӐuT"Cj`چ5ۧpR`OLNy)ys&D:\' hغoX_s9"`96;~H(aՅzXkxi\+b#}gnK;~'y۴6 7`_ζN<^G!#!fDuuKϗKz Z  3<<1Ib逦&Dʐ\!,%Z )jg4>c{gq.K m_G{kҀCNSؐ *zip nvZWJ. (Nq^g'0?L5 f) BW-j /@7vټ/q9lKa.ޤ!IP 6=j\7S[͸˓)n\Q+7Uly7'+9\zfU)lJ 5?Hx3ȠELn:TlN>N2_!d!1,- 2+ȍ.f^n]<7 _|'ͧJw oX$c21p*s21VYJfqH *Nv:R~@A9qyqyd"d>{ PJyn1.#kG7jRs9|*cǏI˙7_svĤ"XΊQEYyqQL"2;mu[ϴLvɦ9KPq* N-ĝzfVA3d\}4u H4'?/NUħW1[&R!%܏soj[Y<_L,OLvs9'|)nw{ *d4xxYI\Cp*;Jk1Lrc!K84 {@Nrg6(379w8܇HBHj,N-PV@ܕ Lr1y+=?%Xo#6E|?-g/  LiY#*:<;\TPHKxC%+11qiHKh{s w-;B|@{iÃ*؄\B. J V[@ `8dY,qϢZBTV\s;2<)\Ԁב^LG 0?R(igq)f#-֗VGdT_ˏ?QJfSo.KjܵJo} T@@@@W9i9yv:\N=L%[A).XUb4"8 s<* ǿAMTq$g.lR:T<{&lL8Әp&1^k-=)R U֟%Bڥ\+YLt,$ّrga^K{ iܕ6-Xn Q.J!\"-43.US{8!ʶ(SkP 6JȒ.ɑm Xv i C*گ<,BlM1,k2ĻL:K_~i6i $@Wx6ÿ8ry/ԸZ)5!B+Hed'_{JEo,>>o%0b-<Ͳ÷uõHl7+܀7l$EB^-MNzic.GnC ֧Nl" r<:r8(ؘܗ-jcj$Qc!ڧ[P'ȐmTVpZTKiq9iM  P\3m1ǧpt,{ǣIdy[(GK EΫBЕ8*P&Odc#7pDB[JuHE*p|( W;)Pq؎-U- pqH%JF ;Hĵ-n{py4FiaM<n6Xk@(OsCWrusqqڄ춵%{rT .\EϘ v.*$86sbf\NmkF< S(ߩ=yV. ,="r丌c4%/)ۂ/ LYlH_QgrQ$`#ABRp|ˤ 1.8ĕFs Ee[AHPPPPPPPPPPPɑ0O&&gr.01Ed2nJq&KWȪJ}X1T{TmJ{rL{Ι3`s mƗajÞɲv+/k1&O%2D$BѼ8uJy 1]%#sq~CueYjJ$D5cm(Jf[tҟXy%0rQr1|lgVq [J]%[B@4 &nUP1qM erdᗛdzm:y`)a"oap'aso|VVy_\uU9>w?Mw&IfL^5ڤe3ILc7減O#jF\!r|9\2;͢Φ˚v8 @VsB㼘z+ǹFN.4/yHFI.ԥ!DmjwS\Cړ>'5T凚c*Xm1KmQ;A}(\>V5-LyXWP Ki *@ wr?5ƛÑwcRq(>ciAuygJy;Lؙ1q1>&MrbZz1R*+mM8>JJ <4W!;~?DQ8ga͞ob{tLȓ^e۔䥲JJMRHJIB}=/T@@@@@@@@@&,eC>6$) B$AƢ[ȻlG =Lj΍e2dRڟe6P^w7d~ _dgO| !omF^ϴ2=m>vu2_eq[V֡{_Z\33cxݰY~Oǜ;hOwA*mY!-96d 9 !0R\Ž޻s[ =y6N<@+-&L'Xx!vjRH%"Cێ$ 6<?4S ܤL)طۖBIYKyRԫj$ ۾,qklbTA-4{tDZҷRIJlDSk`j4e.IaiJw(Mu8LOW1a*{j;#Uէ]MUOg=w]s~-kinl(gdl51;6mk}h Ox2#JaSvd 1JWq$0_ǼŬ|LRy^N;dR_Y}h ljq[l/ff$:[i8|2Oxؙ?8sqˎ9š  m6("\X@Fd}2ʈd1Tyb64G}hnWZ}i*K?prHOo1dV+PQvZJ}W4̓˒ɖX%ǐg[4҇q JXl6HրKƱ"BPWGOə)>A{κTT+P ?Gl>joƣgSș595Jr"J" ZR7Q=I47{iÝV5^-b[hS㰴@sΌ$2Ԅ7#^󒿱@[aL!2V%ǻC[)F )x]/K)RsΙ@}P?@,)P A0xXKdzP:%"BԨp둛+SDO,_'JM|s kyd>m1%gmݷ[o[vqĸ%bv#PLgTcdiIZPqH{t#/;ћ2Zd?C23U|It6ӣz[ rgUw{&Ik=9Gę*$K 3";,>Z JR 18ju:Jt[RTnh j @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@PKL\6(++'youtube-embed-plus/dist/blocks.build.jsnu[!function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=3)}([function(e,t){function n(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}e.exports=n},function(e,t,n){var o=n(9),r="object"==typeof self&&self&&self.Object===Object&&self,i=o||r||Function("return this")();e.exports=i},function(e,t,n){var o=n(1),r=o.Symbol;e.exports=r},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});n(4)},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}function i(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var l=n(5),a=(n.n(l),n(6)),c=(n.n(a),n(7)),s=n.n(c),u=function(){function e(e,t){for(var n=0;n0){var t="";t=e.data.split("|")[1],n.props.setAttributes({shortcode:t.toString()}),n.hideModal(),n.gbPreviewSetup("onMessage")}}catch(e){}},n.gbPreviewSetup=s()(function(e){setTimeout(function(){window._EPYTA_.gbPreviewSetup()},1500)},50),n.props=e,n}return i(t,e),u(t,[{key:"componentDidMount",value:function(){window.addEventListener("message",this.onMessage),this.gbPreviewSetup("componentDidMount")}},{key:"componentDidUpdate",value:function(){this.gbPreviewSetup("componentDidUpdate")}},{key:"componentWillUnmount",value:function(){window.removeEventListener("message",this.onMessage)}},{key:"render",value:function(){if(this.props.attributes.shortcode){return wp.element.createElement(h,{block:"epyt/youtube",attributes:this.props.attributes})}return wp.element.createElement("div",{className:"components-placeholder is-large editor-media-placeholder wp-block-image epytblock"},wp.element.createElement("div",{className:"components-placeholder__label"},wp.element.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 292.89 282.69",width:"20",height:"20",className:"dashicon"},wp.element.createElement("title",null,"YouTube Wizard Icon"),wp.element.createElement("g",{id:"Layer_2","data-name":"Layer 2"},wp.element.createElement("g",{id:"\u0421\u043b\u043e\u0439_1","data-name":"\u0421\u043b\u043e\u0439 1"},wp.element.createElement("g",{id:"g5360"},wp.element.createElement("g",{id:"g4167"},wp.element.createElement("path",{id:"path4156",className:"epytcls-1",d:"M139.27,87.65s-87.11,0-109,5.68A36,36,0,0,0,5.68,118.12C0,140,0,185.26,0,185.26s0,45.44,5.68,67A35.47,35.47,0,0,0,30.3,276.84c22,5.85,109,5.85,109,5.85s87.28,0,109.14-5.68a34.64,34.64,0,0,0,24.44-24.62c5.86-21.69,5.86-67,5.86-67s.17-45.45-5.86-67.31a34.41,34.41,0,0,0-24.44-24.45C226.55,87.65,139.27,87.65,139.27,87.65Zm-27.72,55.77L184,185.26l-72.48,41.65V143.42Z"}))),wp.element.createElement("path",{className:"epytcls-2",d:"M143.39,153.45c10.52-19.27,14.91-39.2,19.18-58.61q.68-3,1.33-6l.12-.54-.25-.48c-13.87-26.66-41.06-52.54-57.1-66.42,21,11.33,60,31.21,84,36.13l.63.13.53-.37c4.14-2.92,8.28-5.7,12.28-8.4,13.41-9,26.27-17.67,38.31-30.64-10.26,20.67-14.18,40.47-18.14,64.42l-.09.58.32.48c18.19,27.91,40.93,50.88,54.81,63.7C261.68,137.5,230,121.76,197,115.29l-.57-.12-3.83,2.35C176,127.67,159,138.08,143.39,153.45Z"}),wp.element.createElement("path",{className:"epytcls-3",d:"M237.47,25.4c-7.73,18.08-11.19,36-14.67,57l-.19,1.15.64,1c15,23,33.15,42.76,46.87,56.19-18.4-9.59-45.13-21.49-72.87-26.93l-1.15-.22-1,.61-3.33,2c-14.47,8.86-29.26,17.93-43.24,30.34,7.94-17,11.77-34.43,15.51-51.43q.66-3,1.33-6l.24-1.06-.51-1c-11.66-22.4-32.12-43.86-48-58.48C139,40,170,54.82,190.37,59l1.27.26,1.06-.74c4.12-2.91,8.25-5.69,12.25-8.38,11.27-7.59,22.16-14.91,32.52-24.74M254.86,0l-.74,1.11L254.86,0Zm-.74,1.11C235.26,28.88,213.71,40,191,56.06c-33.55-6.88-97.91-43.92-97.91-43.92s49,37.13,69.38,76.37c-6,26.61-11,54.9-31.35,80.94,19.83-25.28,42.66-38.61,65.58-52.69,50.06,9.8,96.22,40.55,96.22,40.55s-38.84-31-67.13-74.4c4.89-29.58,9.81-54,28.36-81.8Z"}),wp.element.createElement("polyline",{className:"epytcls-4",points:"102.6 133.11 102.6 133.11 192.98 185.28 102.6 237.22 102.6 133.11"})))),"YouTube Wizard"),wp.element.createElement("div",{className:this.props.isSelected?"":"epytblock__faded--off"},wp.element.createElement("div",{className:"components-placeholder__instructions"},"Click the button below to easily embed a video, playlist, channel, gallery, or live stream."),wp.element.createElement("div",{className:"components-placeholder__fieldset"},wp.element.createElement("div",null,wp.element.createElement(v,{isPrimary:!0,onClick:this.showModal},"Open Wizard"),this.state.show?wp.element.createElement(y,{title:"YouTube Wizard",className:"epytblock epytblock__modal",onRequestClose:this.hideModal,shouldCloseOnClickOutside:!1},wp.element.createElement("iframe",{title:"YouTube Wizard",src:window._EPYTA_.wizhref+"&clientId="+this.props.clientId})):null))))}}]),t}(f),save:function(e){return wp.element.createElement(d,null,e.attributes.shortcode)}})},function(e,t){},function(e,t){},function(e,t,n){function o(e,t,n){function o(t){var n=b,o=h;return b=h=void 0,O=t,E=e.apply(o,n)}function u(e){return O=e,_=setTimeout(f,t),j?o(e):E}function p(e){var n=e-x,o=e-O,r=t-n;return M?s(r,g-o):r}function m(e){var n=e-x,o=e-O;return void 0===x||n>=t||n<0||M&&o>=g}function f(){var e=i();if(m(e))return d(e);_=setTimeout(f,p(e))}function d(e){return _=void 0,T&&b?o(e):(b=h=void 0,E)}function w(){void 0!==_&&clearTimeout(_),O=0,b=x=h=_=void 0}function v(){return void 0===_?E:d(i())}function y(){var e=i(),n=m(e);if(b=arguments,h=this,x=e,n){if(void 0===_)return u(x);if(M)return clearTimeout(_),_=setTimeout(f,t),o(x)}return void 0===_&&(_=setTimeout(f,t)),E}var b,h,g,E,_,x,O=0,j=!1,M=!1,T=!0;if("function"!=typeof e)throw new TypeError(a);return t=l(t)||0,r(n)&&(j=!!n.leading,M="maxWait"in n,g=M?c(l(n.maxWait)||0,t):g,T="trailing"in n?!!n.trailing:T),y.cancel=w,y.flush=v,y}var r=n(0),i=n(8),l=n(11),a="Expected a function",c=Math.max,s=Math.min;e.exports=o},function(e,t,n){var o=n(1),r=function(){return o.Date.now()};e.exports=r},function(e,t,n){(function(t){var n="object"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(t,n(10))},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"===typeof window&&(n=window)}e.exports=n},function(e,t,n){function o(e){if("number"==typeof e)return e;if(i(e))return l;if(r(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=r(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(a,"");var n=s.test(e);return n||u.test(e)?p(e.slice(2),n?2:8):c.test(e)?l:+e}var r=n(0),i=n(12),l=NaN,a=/^\s+|\s+$/g,c=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,u=/^0o[0-7]+$/i,p=parseInt;e.exports=o},function(e,t,n){function o(e){return"symbol"==typeof e||i(e)&&r(e)==l}var r=n(13),i=n(16),l="[object Symbol]";e.exports=o},function(e,t,n){function o(e){return null==e?void 0===e?c:a:s&&s in Object(e)?i(e):l(e)}var r=n(2),i=n(14),l=n(15),a="[object Null]",c="[object Undefined]",s=r?r.toStringTag:void 0;e.exports=o},function(e,t,n){function o(e){var t=l.call(e,c),n=e[c];try{e[c]=void 0;var o=!0}catch(e){}var r=a.call(e);return o&&(t?e[c]=n:delete e[c]),r}var r=n(2),i=Object.prototype,l=i.hasOwnProperty,a=i.toString,c=r?r.toStringTag:void 0;e.exports=o},function(e,t){function n(e){return r.call(e)}var o=Object.prototype,r=o.toString;e.exports=n},function(e,t){function n(e){return null!=e&&"object"==typeof e}e.exports=n}]);PKL\.youtube-embed-plus/dist/blocks.style.build.cssnu[PKL\ǢW;/youtube-embed-plus/dist/blocks.editor.build.cssnu[.components-modal__frame.epytblock__modal{height:calc(100vh - 50px);left:50%!important;max-height:calc(100vh - 50px);max-width:90%;position:absolute;top:25px;transform:translateX(-50%)!important;width:950px}.components-modal__frame.epytblock__modal .components-modal__header{margin:0}.components-modal__frame.epytblock__modal .components-modal__content{padding:0}.components-modal__frame.epytblock__modal .components-modal__content>div:not([class]){display:block;height:100%;width:100%}.components-modal__frame.epytblock__modal iframe{display:block;height:calc(100% - 60px);width:100%}.epytblock .components-placeholder__fieldset{max-width:100%}.wp-block[data-type="epyt/youtube"]>div:after{bottom:0;content:"";cursor:pointer;left:0;opacity:0;position:absolute;right:0;top:0}.wp-block[data-type="epyt/youtube"].is-selected>div:after,.wp-block[data-type="epyt/youtube"]>div.components-placeholder:after{display:none}PKL\8#youtube-embed-plus/screenshot-2.jpgnu[".ExifMM*bj(1r2i ' 'Adobe Photoshop CS5 Windows2013:11:21 22:31:51&(. HH XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km Adobe_CMAdobed            T" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?=8Zu9~l2vگ}Os|=D%{%m H}0Afvgſs?g2ѹl 7S~{-tS@[|\'_N^KZZ}//mzvu mg8$oGlSVYXv88Nǖ=Ip\C 7[хo4e>V_Ћluy.k\E?ٽ*ѳSUG$[#c5|K&Y%̳o ;~?s6k"FllvdYE6: Xƒ kypy؂z.Xڜzͥa&2cWtSs"C/-sJ͎eY?!u28 ws ;{`UIn#~+soOeb+koH'*:=9YpͰz` +ew: 'wr;{o{Ea=X,nn~J|Q]ٲ "/ot4 M"qeͳc@l}0~^̞c }%%ݢZ[>P,!:Z$Ӎo?{mކlme>cK[`84C#iN#?9%>o?/YwO{7Fgn;gnEs^}h~Ӎo?{O?7M ]1k9.k!kN1i)7:=:Z{[ٱŇ{ui}ߴ[ Zqe1e߸kuYRv=(æRs+qki[u{Ip#k _Cߏo.T ؕ8=vKq㾲: 6̯]j`PzYr`#bQ&Z]cXiv3~h-%{V֊, 6m;Bƽzejr:ǯwLֹ@?Z8A?kC,3emq}{XCqy}n=]l<<84Uo}/M^͉Qyu0V睠kcc[duc*/i,{]8fSogSoJlK!ַټz[ХOm*V hfXahh645۽gM_Iƪ[Z4ֹofّKV+eeч9kv>␾רUv y EMkY}\ѡ:\>j]qұ6wrs_Mo7xi{n{CZߧ_j3#`eYeVGgQ Kˋ3kG^_MmtA#lYicv4{]gnCYuAsw'PV0,X^6]vog1[]y# 54GwW N>1jBv.Cۗzo:xX~c<ۏ^@s+&7 %F+my[׶Y{Z>ͤV~=P; 59Tve[v[g2N۲hn i ?rjf{/^ #uO!ϲ;e{?=:vtsg7Il~sqՏf%58\\Zskc^oϧYNi bps[/ᾂv=0t;?꽪}8>[-},в=Ym;[,Maua@Mϒ`־]@p'5p}+77z{Ri"WXUpmxs?J{k]voFtPoky; K5%e>G -˕7ly9ߢl?oqhs=*Jϊvnvn#F{ KDHkw֠>Uo  ,o}_>SsՋEvks?7udP=?I bJF}]ݎ֚w ?oIӢRތr)#c A$6?s55.hxͮpg'38XO8& ٽ5gfP􊩤:g{6f: PO+skI=ِn.%d9Ig;k6V7mްc/%<:d_{cĔz їM;z[EW]]{N̗Ĺww['S+uX4p8kw=.oNkm{q1HA/maݲ4ªI6CqvK( u_.5ޣϴC1% ]g?bc_9mu>z7״5w"7no{JZ: 0]vmov@, SEahg4^vcĭZ^-6ڴyqq;pV?7k}9'lGzJd}o/ٿIfS=l_:${~O1##)Fv}cn?S?ЯN;n?m҇[+ (__*k}ozSA;~ߧ?MWo۷m>mG|ڒJ~qiolYO"v/To|ؒJ~jDD_[O~ЯRIOI/RIOI/RIOI/RIO)Photoshop 3.08BIM%8BIM: printOutputPstSboolInteenumInteClrmprintSixteenBitbool printerNameTEXTHP Officejet Pro L7500 Series8BIM;printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@Y8BIMHH8BIM&?8BIM 8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM8BIM08BIM-8BIM@@8BIM8BIMw! 9 WordPress Test Site  WordPressnullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM !T  XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km Adobe_CMAdobed            T" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?=8Zu9~l2vگ}Os|=D%{%m H}0Afvgſs?g2ѹl 7S~{-tS@[|\'_N^KZZ}//mzvu mg8$oGlSVYXv88Nǖ=Ip\C 7[хo4e>V_Ћluy.k\E?ٽ*ѳSUG$[#c5|K&Y%̳o ;~?s6k"FllvdYE6: Xƒ kypy؂z.Xڜzͥa&2cWtSs"C/-sJ͎eY?!u28 ws ;{`UIn#~+soOeb+koH'*:=9YpͰz` +ew: 'wr;{o{Ea=X,nn~J|Q]ٲ "/ot4 M"qeͳc@l}0~^̞c }%%ݢZ[>P,!:Z$Ӎo?{mކlme>cK[`84C#iN#?9%>o?/YwO{7Fgn;gnEs^}h~Ӎo?{O?7M ]1k9.k!kN1i)7:=:Z{[ٱŇ{ui}ߴ[ Zqe1e߸kuYRv=(æRs+qki[u{Ip#k _Cߏo.T ؕ8=vKq㾲: 6̯]j`PzYr`#bQ&Z]cXiv3~h-%{V֊, 6m;Bƽzejr:ǯwLֹ@?Z8A?kC,3emq}{XCqy}n=]l<<84Uo}/M^͉Qyu0V睠kcc[duc*/i,{]8fSogSoJlK!ַټz[ХOm*V hfXahh645۽gM_Iƪ[Z4ֹofّKV+eeч9kv>␾רUv y EMkY}\ѡ:\>j]qұ6wrs_Mo7xi{n{CZߧ_j3#`eYeVGgQ Kˋ3kG^_MmtA#lYicv4{]gnCYuAsw'PV0,X^6]vog1[]y# 54GwW N>1jBv.Cۗzo:xX~c<ۏ^@s+&7 %F+my[׶Y{Z>ͤV~=P; 59Tve[v[g2N۲hn i ?rjf{/^ #uO!ϲ;e{?=:vtsg7Il~sqՏf%58\\Zskc^oϧYNi bps[/ᾂv=0t;?꽪}8>[-},в=Ym;[,Maua@Mϒ`־]@p'5p}+77z{Ri"WXUpmxs?J{k]voFtPoky; K5%e>G -˕7ly9ߢl?oqhs=*Jϊvnvn#F{ KDHkw֠>Uo  ,o}_>SsՋEvks?7udP=?I bJF}]ݎ֚w ?oIӢRތr)#c A$6?s55.hxͮpg'38XO8& ٽ5gfP􊩤:g{6f: PO+skI=ِn.%d9Ig;k6V7mްc/%<:d_{cĔz їM;z[EW]]{N̗Ĺww['S+uX4p8kw=.oNkm{q1HA/maݲ4ªI6CqvK( u_.5ޣϴC1% ]g?bc_9mu>z7״5w"7no{JZ: 0]vmov@, SEahg4^vcĭZ^-6ڴyqq;pV?7k}9'lGzJd}o/ٿIfS=l_:${~O1##)Fv}cn?S?ЯN;n?m҇[+ (__*k}ozSA;~ߧ?MWo۷m>mG|ڒJ~qiolYO"v/To|ؒJ~jDD_[O~ЯRIOI/RIOI/RIOI/RIO8BIM!UAdobe PhotoshopAdobe Photoshop CS58BIM#http://ns.adobe.com/xap/1.0/ XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@      A   !"S1AQ2#3TVBR4aqr$t6WbC%5vw s78Du&E!1AQ"a2qBRr#b3Ccs4S$t5D ?𾔬&M[]O+i8)+wMb,*l2v:5MgXI iRXEE0a=-)U|Ӊ1َBb$V;aEe]z ې)(6৊&*Vҕ?iJ))})M)M)_M)_RRRR7ORt44~nwJW-Gid4~&+cC>LR7q0kfxmЂ9]#l{蛮㮇vtHҫ8wOnF l/-DkKt'SLVM a ~.6鼁zVra,3ZHeks)"c?=^a;?52'7U@ {tpᨸWm'ɣl%|uʟ⪘2ìn{$ '):f\6vj ڊor~FqV]],m7wgK?q.=M dŴ lyΚwLwsfCwD]%Imٕ0b࠘*ʨn\FFM AR 'FD7 ؍:ZZUkF )[;:a4ilxWT _ )R|ͦɓ#J.n<–@{m N/A|?G9dXT87o;ϖ`/1!d ԩ㾔>2Zh |oZkn=xd#tDq!mA ?(VP8+s* w*bzjy;.ۨNbn~CplkcD##NW6BeQ| uz:ˌnvƨͷ Ŵ-ĞlBc2Jl=oY1+^^̕C=4{vz~>s}={NT|:>ݮJxtm+.L I- ZLS}|om)PK؟qJW-)W=;Q*v9B0\r,JZ:jR) *NƸEGC2n*(QEevl?/ `]ivQoėJ;:RhO*qqFhx>$RlW],q ]]E(]^umuՖsds+{mk['vXp$jU!nU_):bE[>L%̋1"nc\HGuD4D-lDhܹ 1Um0̶+F^[6E<- nF%zxNٲOYZI+2tuzQ: HvMnqWk F]05I#A"@(PZ'ޫN֪fןfk? r0HɸB "Ÿ6fE, $r<վeF>:s&gM)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)_p?JT=~"Sv=kĨԨ&d0j>(٪n"xiJ!UcțZ䭲Mfⶄrq QGs DtҕG, kfs֓y&#*&̸qYCspo qqU'"܈UU|UWJW1Y16$]_iJJbA?k[L1ųRbB"88$;"*"#!لgʀC+qS#۷}1ZalXԖWv^̪(p\StD]t]G$in( v`2?]MYԬ9vװXD2܍ v4wf#)!֚$E<<Zz(qi#e`7#_Yek֎nM4,L(Rvcn+Mm%SYB1՜*"30uem7=pawvc*mxh%i505ؿb֣ٜKa1 p^1>Zt!l0bH&$Y |@7վO/g_\iN|HpI.*0mFKG⪿ X^bFJDa;5Y]dZ« |#Rn;D6]I/>ն71ngmh]3pyx٧y<MW2,*EԨ}]aE4'cDiAzA7UU_--&7$iQq/&} h#]dxό񪸿}j-fCl}G`6kDxqiM]Q>ܦӧ"=!4GyL;u 3xLܴɬ](p֛+웤ʛ4&RmQU:vdK"@aDi2G;IԵi2Hb'Bd9mP#ec4#'Y Y%"QRUw]VޢRcRg@ vl5x||!U=>Q_xHR74$TREOJVڭ0c9k 5I:l@6ĤRKu[Kj$6DDSQ4Y?(v] ʇʎ86#H|"&O xf>j[1 @U#uj& L8$mDx:͐0>P&Q͠3fݶc'Mq+&lƔ=>ŹuS ,ʡh^rD7i$E 㶔y 4~̏1vE(M|k |HЈ"'O_)TNr})_bD$Uq?+O+L6DM*ՐYVWYSd7eYDX8E-A:es`w]Ԫp?JU&fUL Eɫ#3m0,G1[lA^]|ub'㛼nQU* "_$1rɹ}}PĶ`"ܦa(Pܛ^eM.iE/IwA->*BM"4JbԱo;5zʮ)N(iPY9ʄhҩ)*";'JɦA_vC⫰OX@ۥ\~&twթҔJw;Rz})N=>p?JSO)ҔJw;Rz})N=>p?JSO)ҔJw;R?g)OߵzRck?~?UJ ~ҕͿ78=G- P\BYU.R ~Ҕ__W)68;=YJSlpw~{~^g)OߵzRck?~?UJ ~Ҕ__W)68;=YJTu|'oN_*ɍ74,efCBNa+_[O^%KnKQLO4ӯGm׶1W:hHz-a9՞J/{Ac1%HGN Oc("Cip EJlv*V/l2? 4ݚtQt#j:qd(L#mq^IJ(\{JM[fU1 >,{95Zl5 MydًmJ¨/1e-i6 @g0o9T+ ܥ$d &,q3}DeE6,ر8/>.+`xšlY- sw2du`A6)Cq%L_;[D\-=NuW[2d9 DofO nYZ!Yߪr^(r Vl&hV,3U싢}BmuK (4>OTCc mZ#qό?q8J˕\b:`#~xUr; =9XW&'ݾ܃4l7M?i7>wOm,s JQQWGdu1t;pSzUwO`q%tMP%P:[ Ǜls*:vVML61fS". !"x{l$A;HP{!C[Z`ȃL0'U<1W^eX4پ#)Qq{I&۴쟸a g4~!!dI ʓTxVwJSJSJSJT%?ҕyj*ݥ)))))))))))))))))))))))))))))))))))))))))))))+U%3D~w6KԊ@^;o/ҕ,~T)%N$r۷!Љ*)z:Uq3%U*Cm7"k ױE~?Z;qIMV%SuRqi *T0dpx#gWwc]謼"#궳җߧeLyqλm'W\/.!iLr1&~Yr>S#sh5x'nUr?91uxjj,zv͇߯b-m=-?D@k\aXa^y,]bj.TliԩNB fU yy45ԸJ7'02]Ȼ=*$t0Sh4XGKOT|O˘LJ:fV,uR _HP͊q!MY+ gj$,X9֨rKFqļU}w8U2*NkK%])1Ƶ $|>Yc^Ζ{$I23X5ˆpLUdy֚y„LwjFԉ֝?Q]Obdȥ|8H>e=@t Mڧ/eW !{"G:ɋGS,ķc];Zd38RF6+f+sEKbfȗMؑu)΅|"A0Qݳ_NGU͗% 1 N6|z"9=i_u&=6%iZ"Ce(qZ}bH]b0DnDV`mfM :$lT2YӸPdvQm VUՅߖۚN'1 d02 boy3G:GmI?{p]#U"@r&}3v2un?zzq荾87"ff2wpzHI j=^U>ӹľ3(D&]Ză8{3/ZGHIHC-ȯbįKq*IwJUJSJSJSJUNFqC̫p v'+~Ξj\x"MwoQԠ~v>F3G N`{`*rZ,;rk&((b2i7%"%_QHdUTMfI@{dkWrNjk*%\ $aY"Ȳ!?q7iMkLSMjPֱG.]OFJjҕ2.Tkc9kq 9́["9+t+ʊȠ&6گԝ_|7j^?™q@LEa8W/ n*8*H:ciNiǘ۟ ]ڷWSCMuS\q}O6C@-FK*ҷ/@`ҔҔҕIs|1jɍ: \qkcXOqBs$Mmqmԛ%@ I&ߜ[1 `aA"| ֖>24Y&` DrU5Fq?؞ʂJI;\v{Bax 囏jJ!r:F7mFu5&Lxqߗ-Ċ=*SĀm)&)f0* $c=ry7ܱ]AX o$$oГ]mhQa !`q09ΕE!˨g '-%e?A:of))#C=0oTMU]X)oT:z{HfF<;M4444Vo2v#X[eR5tb4+%h ;u껐:b"LC2.AXqV*=˕T]qF#8gPG[I]1eWP2hD识u> a?'b%VǓq油bm1I0B;t&$AQTۊ;u "@7: j U:] r$j@;LkƵNoDp d4Q0"EETT_JU-= N8뤦B2"%UTUUUfa ,Mc3MT(1XpSt_lS>OC-?C-?C-?C-?C-?C-?C-?C-?C-?C-?C-?C-?C-?C-?[1oz~)WQqZE*|.JJ&miqΪkאd̎dӂɶ(b⋷~AH7]-̡cftMxNǓy{J#X2R;L +/q7ֿ^ $jdWX[^d3dV!K ,i@>\ufv5.Upb ĦB5^}w75221$Dׇ,TRARu௎W{e--=6kxUYxe SՐ \KzyD-a 9XJXwv5]f<ȹnOx 49V')# .+,Íh%׆][)=7P8 ]]bC11le@%n$FI2- [&/.ΰK<rj<2*c)V i8I`q[Q6L;N,6!ZaY:Sr7\y)C":]daKF&^ެ*Ԑ{zz~-Oj;KK=Kxųqo]n*Gyգj6OHqODzvDO5X({Olv2Z}&p6?,7™%]ƴC7 yY}HXm:mOu=pcbş{yrҺ̣ȣFUμ''rW1fDQ sy,ZGA:u-Sb$f#yov"tmZl6c^6wET~̊QD)p~"-s.D2KHJ]s› 5 y=Аàn1 iT2b5 (+$q&!G P{,3(־T)O]LcXcz RfJ0LF}b!~!_P8*T]ij@nTVفLhI;NVN;hpo'~ʹ6ee\}Q#1exGjTY:66C$;E-`FNζUI 5I :L0pe``("o,|59kaTM=q$ey!R]ؠ(mE}"Mp͋#\T*IVfh A]rF,Ȇș:huQ͵64a>q.@q'B,Vx 7l: Gz[a RT/S04`v7.Ĭ ut0I2#]91|ʹ)M5'ػ:iӣn:]N6^\ Mlp9;1P7Xo %UDjĝ],UC3,s=,5-30 qg)$ȝY)M 0mPeEe6W@a! 5BTP`eB!;( .F.",%HASqk >|i1Y )a!@U >KwO {Sw'ndHs`2Ҽ蓮X~S6NMz:eO\+_a޾L=pʘ1`kF=6 We&o0o] .a"yZ?gҨe~:Xf䛈M[L1gHě_!Iugc#.œBAcV!,T o~*3M2:7 9ӈ2O-f1TC96=6S5Q#Gq.8 (.la#޷ R4%*,q#OS N/.T@g)qIٮ1f1*2 uM%tlv_ h:B}# o)\<ʡ6|:V p"`Wd]Ah")a%37-V; g1s+ Z b %q&-FA oֈlEӭz< ٱre{Hb[k\DuKXtw^QkJH*I&B8Nk'…YQl奄y5k@.,;SU.5h`- ]hYӝW_.čh$73b~?h[xǬs/]]G#f#WV yaљt h/S}wfiX^1;xMyݠ U伻9+pj L5LC)lHa;SOl(XJ˔h? XT2c? "{jTX$’3VKö᚜:^=YJi*|'eEpB1S>y A O)S-Vȧq ,wbHiВ@ϼC¬⹚a9%niɾn8cO62OjOjR6=}AB bif~Y{q N=9& 7VQM ByxQ((i/h0ig2Ÿm(% ofڤbqq GD[b̸ݕ1V0$0 Sn&LF@ CZq`W2$į*2;ů@'RT7_.vu<5·ƪwμGr_ -o.c[NV7`y?oqWLj#(kű t449Z2Jy*L XPӝg_(b3r1qdӂq4!7EOUyq.U׳wE׺,;Dkᓎl1]qU&vUSe]Or<#+÷5w9MB1OiaSViQIUU|kzn̪IQ몾2 b9&.A_';5~/~Hϣ@ؓoM1tؐ<;?;ÍTX..MBM%St-'xMma`{t2i`Ixc1<չ?AOv_h602fludWpWYv}ʼnc8q 6gֳFIޙ䅋&=t;Ī_p.C*HC v[+C?vې܏j˫ĢOI "Mwq^C%[UЪnmdnXBI@A6 $&W}qS8+?V6]eYBvU^hh iAx*0Jhu宅dJ8҂C2|F($XQccYD9jKxnAYoyC2;;Y5d1$!g&gc, /Ef%ƌHZ\?yXyM`0\v* d*X}EXt"ٯ,֓Șo SH0g܉-*HmgʊzA8?i[l}"2-{'i!LI&nb4E;\;o"<$`!uh.*SɅMsb==|֣ZD9V'E!ף{κY2\Ɂ"k#acpVPc~ =[enS|-9cq1"\Ra9)nӆ튀٧CL,QEPpFI yTNjs1Gh19Q;Ғ,$F ۂ c;,J|10#-+R?3)r0-Oy;qbS377g6mץhj/&:GlVuUEmoHk# XqRXpkH"@e$HYL[&THL1!"c|/,q}8 JgT5HS3퀂߶g,_efL@;~Y\D U:G=D.\)8#q ͳ;,Vn20pj uC$Pä$`N5 g]!6k DA"Ci5e7h&`QFPSnJ.KG|y " 'Fˮ0-A1&wQj 4PtbaװX6IWʮyE:Vf9%%5Ԉ=DUUTBum͏uD[(fIv8n5'LPԔFI twמoLL_wIL鱎q BG`k,~)qx47[ uqyVZ@nsr7eM\P^tw.y Ldyk7̓'WEKtSYC~ ð/hۘRl8ӎC]W}i lcqH"F$iDV ɑi  65Γyc"oKݕU!2]Q]l~YTCWՓ*0>?Un*ka+tհXu$K}QULaEUW4a[d(kl!(ꉠeEVHD7T_ߨIJyc1oktY rʸH <@=J\(r|k)c!Gs"U\f6lFɚ!l*ﶭLQz`Tb'FA9ziJiJiJiJiJiJiJiJiJiJiJR8/-]t[4444444444444444444444Q=ϣU*1XbM[Ʋ_JBQ6i\ Vpab3 @G"!"J2*ۏC.}ăKaQ<Dˌ2mHr,Z5w^'\4RB:f n5PLZĀQRzA;yƶ΂Iu[|vYVqXᲦۮD !6L DUQ!T]^o{;0VJC ӴA<43ZTJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJWa+Aٕky6Ie@zT![HȳqqvqR2U*ooWβ M],x2<e\pT%l1l4V`WY0̩ 4I\u qmURFQzʷcB%卪tၐg\H$ԙLƄ14YETR5G8m/l]~q;!Pr2Y7* -*M{Q2oD:ZR PqQUd.qĆoz˔9Kb]Z>j4FQO;&DhԋW8`O.PJ \J6\|lDi Le69T0$ cwu:9kpk/UK,:Ue݇fo;~9x?vWlKX)@s7)1;3Ief؈\gTAQf@^Dzk^-} 44444444B]~c)WWKRRRRR͞|CÞvl}"63Hˣ2^*lC8^{nVo~CNWџSsGs>ݷK|o>p$fBC0:(a7E]MzڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|ڪS#/=2>H|>Q|\hJ$H&"JoPa9ЬRwEۓ+ Ӛ&%B)Hl(*:S/yHaϩHii[+76JdIgumz פ>%Ց i=Q`뮠ƲG.;eܘ[&tPqNEBEEQ~V Uv.B)"cOf3p5ܝ-f>*?}lW`İؒd{ aĥU 2ia%Q]}'&0RWc7hIr/{\D&HO/ v-XκөU&'c'9sܳ!;'+a( l¿wUɟ&@6U|},lΪ6 {O?jiJiJiJiJiJiJiJiJR8/-]t[4y˙鸋~6Cx9@&ag*n`"_}o;K}ѩֿ7o+t?̊/}}dQUqxfˮD"˴Gd|`D_7囼 E=/_bMeAwHR⯔~ܻ8CSaNBʡ8̞ {.,BU!^ 5D_Y.׵~cﯔ{ǿ}pnt?hD@hKo^}AUaOI>澶] ~D5c$7{`Ҟ+]Mp&<9+ >'my = %Ǽ^{;^guw;]~_ON5'vS 9TRRRR).`-ÝKj)))**w\`{) Dcy$|UQ5Vu_1aA'S <9a7NϘ ka!DSmR aA*@:Sy$n_V2Zºɫnq!EME]PPAG0x0*N#<#RښTZ,`;jUf2ԄvzZfmͺS]frHFyVms>ZϬoMcުš~";n.4j@b*.˭H#u@A gj*kLp-!<ආb"'ə1s:m[`$cRLaFaU C%1eEp(nB?n "#z~i nAPA hHfVRWa׬)NdJt5$JSY':R z?-ҔkIm}C^Okt:~[_C)׬)NdJt5$JSY':R z?-ҔkIm}C^Okt:~[_C)׬)P@a)#{_E*옵v۪uWm숟Q9sN rVp:i'U:# ߎoվ꽿d'+kj}?[%_չvs{{Jĸb 7 ̶$㪏cg>$'>?nqQ9{?<+w2B+?jϮdBV?r+Ῥׯ@K"i8,8=}%|X`Ef(Qam@QQ_R@~ 3r1IO2N֯';uc`'k^w?Qg}?Vuy1-o[oᾲ|zq3;]8WGcŷ>{Vg*#s>Yx[Va} %::* ( 㾳\m8߈~@.~M?ARՐae0m{BzIyOo%5| CC(26럸SshTh޼Ɂ|ٸXhmcr5ȝu>Cg80^D> ATd(Gˎդ}ҹOYyubUd4I7YhMUR$=~\{at4ӜҌyS"C`m/eX&krDo|.1͝}t;-¾ѰjJlS/^7+r5o^`Nb%pYy$ N9Vs`Γ"_v7bg`1blPHtZK/IFISwNN56*%ѼҨP%TCr%ٜxKjYvA:Os+9d +Ε|qf!Fm[WWpj; MSwewے-r+ qNxQ\ @)r)65pg%ofe.;:HPߊr!wv-qQ%Mm{Pi{Ⱦl-epIQ3tV/6}7xFS GHc׺8(jM*" 7Ⱥ8ɐyjtZ߾vaMxUWK/vksr2Bq)Ne[rf6LDE6K/nI29eQ 'B*R0u`2)ֵLpyMveͫfIݔ1Vߜ@, $Eչ<}vvhM.Nd%[@xF~-kbxiVYY#T'&;5Qos ^Kۋ.Z8hݮar#/()2p1_*XS7̻c*>P>tY|19 mV=qz?SG9/1L'KI3g'f+Iv+j_l35 +p-ͣ6;9yl~F¬+}1"vܚ9tt}$"3wcQU2:kTGL7rp68;oɞ XdKؖ6W S!Y'A7!A Vw$D-'כ1ŔC i`e[.c :yP5{[γzǹq0?L&iѸ2" ۜqdL]J7"ol}C \`g!@tױ:{{?͌A;l*-@?/1Eo4t\:Lz5xv@d#d7`iwM}nڡ]ฮEb9u_pC+a}*SFdm:Q?(%Ų,rr-oR8ϔxy'k?'Eco8VOyQaQ\R|[᪌j4OH]D-rAeͱet#~Aw--i˯s:iO evfbueO{[bD?[&8=K2b@Wm9td$0 S %JhV#6>\ 8).f!T\jq6O1)%!mU71m[O6ax= lv 37Rm8D[&dDbĀ8~du& '2|OAUGx;_w$SM4'xH5T?N=0B]$fN[/Qb_n0ϝص>Of HzAmZB=ݘ6E}ev-Yd./F3Dm6&TϕJMx뮻pC߅Lo%q<1O AȜSAzc;*"$BJ˅2Xtr^r5piEUr{>!XxoO`UN%U5v%%:C!<G$:@hK4c5lG$ ;Ô2\ǖ߫^5f5ɸc#?bz",tt Q7n*^dA킼< \.fL߷Zͼ&Yx-phb0: HBtWS Z욙 CLpy4ЏqXCqNVklvFLfm6d^Ax|)QcbWO#P2뽃 w[8uf ,xP-6( `("""k$&U hWp[ʮڮͦQ12)r[hY$2$~DMKn%\\x5nf}XKV6tַm;2[`묤[9fKp} =5Rs~ Dn51 W}'r8:xw9dy!<`}3υ!ayFae^Mΐy'"ؠH:~-]i fEG3#ULΌ\J>*6gn꛵ 7ůWz#|De(*"(dƹ1zL:9x:kva*ɓrcc&w5ˌ+ql0tޓ2K;*7ߘnH; b&}<)1[^u1v!|[|1-1VIW}q60Gˊ J;.ۢkFqv3-3o='aR-/1/. Aތxi&  x_,NC+o` 8se 2I:NS&3gf5\cXw:X4b'jԭHaFƴŕS0 V@DE6Dj[gb6=xڻ㸳Yh.qߜIHRyNi&.5Ν$m_ `ނOw"MUlo\?3j+ OM_8+[d~t,^ ᵡQΰa栵>Ė|CǧFmQoc FD @ ȶc'cnUn*l0g(C~L ij#6` xo0Io?|Lx;΀c1fG\-^W! eX${t*˶}1wq\ōƣcFluEvu ݌GNT= MXQK8r\EymҞ 'ĉϱ٧mRKDu'rIT{Ok$@!ʺ1jq Eq,RHt[1Q>&J}/{ jg[vA J~aolrq u;, Sc6\VV%2}"#K-רOw!1)2uU2L~v-Lx]D_|_?˺zԖ4mU_܉Eᄗ^G[Y%}ǛȑbRΤhR"fR,`1 "H 2AAv[tt'7\itT+(N80qN.&rWR҆UԨ/"%I uHlzLG7ECdVˑ0An0.[6Qv_6'Y F26zoLyItV Lz/ھ}[ ͥink"/5Ҁ?dLt dsO:7ەpBHۦ#]nyuJSJSJSJWSx#ƎnDD"""n@v*XjI;9ְ^m ޶6!!؋l=c8M,pT%Ovޏ\Y /OWsPYłxw8ypow >lԁDd4<"zM2 𫏩"'k廯\]Na@~dќk5p} پr./zV8ģ}_@?Wg?ڿg.[<'>]nM2 (My}:+e۳>r+ej))*֙4C]D>&ŜV9piqYTH]t5W粶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4V𧲶??ͧ#Oo {+a|r4Va*-d!0RKI{*v`FCO4HM<`` lHUvh-!M1Iҭ*DDkew]~))))))))))+WIb7Q\FNH 0`\]mPA6REOMpn Ï)?ԿgVN8_3 3$tK'!w!C}Rqd^jbP}-_w9lOJ*U qIwJUJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJSJWֵ~ی9_I)Ͽn2}&>>ӕRl NWiJ~ی9_I)Ͽn2}&>>ӕRl NWiJ~ی9_I)Ͽn2}&>>ӕRl NWiJ~ی9_I+y=TT\Q|WiJyrd2Ox1amEQD8lX̪|wYﻵ+>LL $V6}q}+5yg߷rJWK9k|m支<D;ȬE196..}dL8[)ڮliJiJiJiJsVV3O&q\ CvmbJuyYzd=P 'Ikf.Ƙ+qn;Dٍ 444EOK_:Ob^E(Se}0EPvi-Q<6uDYQq nop!IY~mxL}+4Es[ Ozn?!]y:HH*XZ@;w}i>R<+s>@E6$;lT\Fc ?:x RRRR}T]CǬ"f"tG}M]uӈI5hО b5T/ ⵖ9JYa jP@ HmϨSaN 8:M]qẒ4 wKaQV]cB5JV ?{bAQ]%M-*nbp$&7ODia;\ʳ,Cq n%ϻ9_xzuD%3 'Hs_9=r}<`ƻ_G4_ґ''J͋]&AJDCEUm@WoW>3 y$\^KNv@~^0q^ E6wܛ:k$KE(|퓋XÎ/X8ڦ˺k貂13&,hoc4=EVXt`73q /ǒS qwTj?mׂ(iwu2TUTzTVէ&b dKhtcjo>H$2) \d۸TƝu5&c=-&%2W}n$MJ:Zm31HO:28ݛ̌Lv *nlr[Pzuk\ǜՌzS}u*n2N: +ylaV~J@`߸H 7^z`Ӫ$밓}֍F6!LhO!A=$qyWRHVZ1&^aCidEqbˆ;; "AH4<:ЃY+6:AzLWx5Gμqz+ /5h@Tջq @{Ej8W+hO, gڢ$q(DIW1 Xӿ*xHE&]n#3@4B*DM *m5̑Գp =DYc\c2!n$ q '0.CfƊ&r Cz vM:0QUuUFG{qp2K@,Dղ&&ȗE yqbxȑBLy>y> JaenvRLd%$< :I[t@7TJWܜ1 >1 EŒIEU%TMէDUeT<4[t44yz}y2?F27"2*YShg >OnSфDžX31ѝ(X2\VlJr5Vv݆a0#q&˾^ɋ-O3 ʚ5JwGmڏ#zj`ueX45#!uV:{-kKMƝ-^-%4e9xDyM4t벗"H Xp;Ebc۹C}UG\NkSKfe9P0 n"3 gnL;"MW=aRy Uuۄ[\nRnIi}|Z@Y̫E# 831J0\$GIVM "U|<5YC/,JmTdXyS[3iCAOI0ˍ}B!;"oQNWRqx\vV٣2,j*'-r#{WP/̤S2}R`o̗E,x,?h^I&#皍oeD5y\US܇be o:-APT 4t.;+Iu\~57-p^oivRjj8 QEL=14:cahuÕ"ei.6Fk`Rm[zcr̲a)pRSB xa+7FѐK9c$f9`&EmW=Uu|dUbѐb Gpݹ!qd'9Zg n`kXggd{cs. ~Udxڽ$kkQqI7;ؕ%Y8Ibi H[ T"TNo[W]F}kNf01m.]qg*lMr@0pݦu#<Ĕ8̒tG0vU} xW>HkX$kw]n*%Kl o[վ3=dX|BC96s-g2FT"+HHAm*):> `=;_KmG( ulmQh,m jg#TW|}&Ʀ,xZLZxb<)9.*rIаG` k*8%]L CH!Џ!X-?+vQY#ǫHE"1+tס:`OӎtcACf]FtӁ|g6;Pǵ3s=KvVmȥ G$^2 HPkМɽ6qF3eziz=U.7[ r Us@Si|YU| !y*rꆅ$~Yp*d78 XtgȠqbKC g;:o5u>\`0dHqAS$ӎv ߻elR@ ;OWMygA ,WE;Lhwq< , -]󕱤z-5ʼn[@-FC%߸D};"ZGCj[Sg@ kr(f˶UGbW`B'Rqvb2</m%e 0VgEau>DaB.e0K]FY ~kǸVeXX IvʻXM _\P[Ǭ{L/ƶ>$L2DB!!j;54d\ (%jK*eWnN)5pDE'ku=3Ù{3paHUx8weeR5Y,qB 6qQ+bn#}PIég1e,ga^\Fm+*w,QݎI^A;;cVNʻ(ppodˁ(ϩvoy%&G9 J6j@+ᮼ)ɖ90uthp$ͬb B\c;dqQ2<mçȵT)LNfc'PuEELdp_f-GkNFG參jc\ wpn:)9%LprC ۉ9lL>m]tz0E6-GWK3ةԊ\dV=12,5XqĪlL{]+ ˩9&Dy~p)\DyPEa\-]Ms"BpX"ovn{WY{f q8m.QFEI[8>X1Aꉚ{aQtFDa&+ЄJjs\ز(ɮH3au@$n*Ue SMm;}; k8l&`i=SSzEp$JwY wV0)3P(*=) ߒn+i"kH!g4Fv/ꌍ"ʘJuY@qCm ٳp@q쇦նӹdȌAr5[&Bw]-*k/%mD3̓1sd0H0%Y_E(ƆMiGXabʲwUsSۅL4ฃD`jI[WQ f60Ȯqxôˈ˕! 3NTvbɚ*Jk@%ڀՅXr댛}k(  gd6>ZTtd?9S#576,ޗǪI1xDAM=њ"ԳkcDnj$ OTF"Nb,wR޲N1bq>cA_*41ǟ~CL9*Kq&ڕDޯ.A7\8Cq+v7chb(P #;Tm>5&U i9yr׺OeESFR `fC+ ;16d?2}^lhr3s9n=Ч3$( 'dKԯ1;Y[쮎5>^;lV+U1Ǽ pDN(.۳P "5}oc$;}P"c^wnB6k&Ts̞IpM6DAD> el&M~/e:I$d2hqdAB>hEWt[B ERTDRD_u]U6Rk͏Byc< +irKI &No N`*|cB;c`A):Nxb\hT+FE;b.0=r5c q3Y2B`J[$Sfh8ǛUAZ "Vn !`^XGVۦHtmE tMW(B~g–=K֎MR~,%NMkpw9t܉R<9T&X$vԑ:kjk?/>kŔ|{+kLf32&[URn >;GLKojpH;t76FëI ZDѵ:AʶՇiMPWR0IWG9OP[e1ԧttϨ+ouy}1p?<2M< rgJ:2_usdXHE|MU6ZeTrV͟LShq5T8Φ[tDzG*`VɌz,)uxDzfS bu1+飴hjF#[MHHUr Pp$05:$8y-r &2::ZL>?\r6b;"x(^~.O@<jL1E:2+s f2l^^Dl߬V9I1p\j?3)\܋nOOfͦw(JyB]Ñ\gKGg*86k`O8ٵ*dӋӨ,mXZ$͔~Ta$N燙>%z"Y,dd%^%k*ʻ'^ wf6eK_3 8|bF'oTc YIm <UUP^TKL d,#I׉/ [Nű%7LI.FѠimoۢeFiPAjb޹qYp#oڂTDRY0F]`XJ ڐͲCª8Ѻj<|r%ضE&jl9C"(rz5ϐbW: Rޛ5lҘLY#\``.U,[sSrլ޻c֮z*B*Ί#"*=;]5YiP1>8&@l7]wA#H,]9e"f-ƶVvOW`덄xURNJgeE zL%{6̈́ 2jZbsMq*'pD5VbqT`J^^Ϊ8m]Hmif Pdqȫh}_?D@oOQQMBZTAi_{/U|UWy jD眝vKx#cVx]kWW_>ʾšͶ˳o8uݹU $:20!X"Ai+Ȍ*Lu0B nHk"jeO?On\/.lT%p:'eLH5 oi\9(ۨNH$uQ :ƵM&YS,<)'x<eX9rDNע:8FbR /5ݨLCzBSҏeխ7L4$*l`Al› U"էSr-eQiEZ[SSWS9qJlZvM֬ UcI ,J&`g.Kg]mNt0 0`.4g$L+/+f4 56) ! `)hfxpF`e.`S2j7Z1krÝqLr}d &X02Ij5ڲ$ڐ}܎tw|QUѓ#"K.RI1lvHoHb BR|5} qGZW[S`ЕdI{ \'گD>gwbEpíI ّ *=6I&U* wg8 z J&n|f5LdfUDYlU6%ňH).wu|HCD`Hq=@@4w*#ЖA|\GUT0] (f HzE밥69ŦhH tɱ&L>}GQ.Sĭ bڎ6aG7ʉ:騋=p:-,d>Q-&cR, yr^lƎB`+@CY-slGFWNˌ9 Ir]bmt"9^7,Afn&Y$aK# 9dsEveΙ:O"#@d@ \ot=BN~Oẏ)o(~miUU2հ qSEPΨŚ*NL 0Uq\AEPYIY8ŭ uՕb,U݆)[slQYib;"ښ+'cξm֐m>Sr0cMӔQ-XbڥmMuvu+ B Zm İ@\0ÂI3$lo]ŭ#*;eP['7{:UnI.:&0}B(L"9l\ r2QbhNύx<"F 䌻Dnme2* bLPcҽ^;ed BaWR#1v'62) N\ktX,d!A,1βjQqPNuO%qj݊:d6% UFxu$TT=F#cyBWV4ue:@ZWM4/? ٝ)⡛:k,OUǡY"\nAGWz䊬 }}}lͫ AshBڥBjZ *$#R˘E=q;ȍMumUkFdR~3Gț>"B&;s.1b0Aܢr]$ s=7yz:lH `)UcHG-Gְ l[Wֱ2KC̶]mOIi0 9T[Ft6Y JtF;Vt$A+uKhKs2ǠC;f.reftx zIwAe_a1'\l#c]L@D,YYD/1&/F=[hyfD,/j##d0^:\Fc?&yΙ13̘Fɑ߾N2))))))))))))))))*:kJV& ,"&Ȓf'6uUɅ{#ILً֢dH?`aDO UVTN?ic3w?VF9ce5[I63tE)2(c5S?QHJ8"T9QieTfA>751gq dXL7ZSL[4F&`M MgN?^bE Q DM\.Gٌp%"wb-L_N"ճ²BTUC7pZJZjՎa8&6)F2N]$mǞhP]}MDK#jN,F擭>&Iw4 tX8.b݄b+.m*2Vqkbp Lq:CnT\5!uR` *zI %UZB,Lkhрa W^,V r3ViIֈh\!GIIy_GUK23Dn"Z"I$hD@ )7 uPdqϳ"mtJαc>"+P%n4-H+ImMP %[q+@uѤU:xrX$\~>ģa{HZD9R$g_nx#7tTu.ob#H-'N:Q5S0tm<`cē4ms1q0Y՚L.rs>q,bYV)\1yb3d0 ͓ UmBSqȢѺ@./N5A"яY38,0(09 w,ڂNDu)~VXSHiOMLn=Oy/#R(Si`Ep&zMubbk7t@ :FQ2Im񛍵!"Dwа( `tXui(U*2.\̗c5nq2Z:f`WFZvUiL~S*\S1Fv; DOv_1ؑS}DT*T =yΣs@\@nAQF9b6F&$ZuȢҸ6h( *|U G7\ zҼ*ki#S&2'|^iq1tKbQSLr9rMn$hg^QA)6$_FF]|[@kJXvEv )N/VN["mSNL+1lAc$嘹&Xńɝd1SHaHK.2fOamg6t[>L%$G^ؠzk\t-4#dz]kP9ЀVzBu7DY:p&0;gB.Zr:9cζn-̰'|+#.∎=Ηʲ `z?X떒.bDC2Ln7#OGH/9'yt,|,JG4͢nv*&տPF"L$2qc +" @" FLAЃJ +I2fT5{~As>f2Ñ>\d4a B-]]\@ЍE}ҺbA,T3?#>X4f-8,ƽ͚115~G6d*ղ**z2}N2G)C7uU?P0}dy{Eg&ljqk%5|?b̡-}.۽@*AYOVf*e$E\-w`NV? *(u / W*l7O%w@oŌ0a獦Ylɱ>SRTEղjmT'̷&@vۥ(.̎fL@p8f q~#hBˏ2dUTzzl]62Knx!XB6#Fy[̳m"J:} qݣdmlNv.GW*'TaFHSh$I3,w2o!K[ZAr`k n;aX!K8%pۇa6ƝHe#>Աy5u"HH9lWhiH`tn$2u\zCMjڝ1A, ʗdH32rlf^_TR$[#t: yV γ3$*݌$k3²L+vMrF 1R""NgxX"?,:'ߥ!ڵp?$-ڬEOF~ ~3 cEv:PV{ȉTE֎IX nk< FÇ)nZJMUKc<(+q 9Xq髑QLj'LȕIIIw3Ch"44ضOA]z̒fn$fgWxFKJZbdÈFx<^u!`:Bhػ3 I;]ԁ UPp9L7Lɓpn֡pWHZ{jݰu.wgEr1Z!8Hbm""+'I2*:Ii0DH3&U0i0]$xK<#d(LFJUw|HHw>GC6 `&bD\I&KH -E2HUm x7\}6VvvZ+KFRVSLt>k&d'Vb&.c&.& 1ݚsd"4U$*y@Tl+[ꮠAʙvԩ8#ˁkzd_WI Zȩ$A k 6Ű*Y0qZ7"`+-A ,Lh*Wv8(E긖Xɲq8&*j"HIqR7%HڲϘaPͱ`֦ˤI,rnq\tm$U@ iG2m\l@f٠ut tvUE(7a0d 7rycjZXDiC1Ԥ MM?<TD 7b_D;mh2|Y'aӧۨ}G::#Q>~ז:)gkY2d74e6O2b(R5|n=R"Dt&Ӵ~ 7Hm<@VnъM\wJ~  z\n~;{eΰO-]r<:u{5]&5crUs?]D'ʱ.9H43eTOU|>:qqwXE"&VE LoqENeWEYCE.[3mA"h̓4D$U]Ty08H"DHWǟBB0%L y9z,$LlS3w겁BqV5`7B.ܓdnU7ηb[6J=6*ial @A,t+0rhf·mYr|Z,ihzc) }pj@tŢBhH޲3c"` `p '` #G__eSGnVI6sN5*9ⶊj0J'[hyc vө&Dh'rC*FX]  e Ki$Dkl`W@HK!!TTrlNQ0G0Lȹʰ`ni)))*:kJV.#Q3s7-)V])M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)M)_+_r?;)Ά*̸TQ.Cm F!>$E62'`?wdHUu Ao 껒1A쪯FXqabCK=61NK҄H3z2r1ܒ i:q6X`qHw x-0@į1z\y?WbA2d6bA @N$}LA_qɕ&[^xn𣀹)6kq0\<> ~U1\.AӻI [;ȲYYKnձV%%LJhm˺iM^npoUr20rKE1@$6A.Gy{ T:5B׋NaYy,lN+ sֲ_2!$H=ͻB  B"h, ՈlYy޳)!(8#1fA3ܭ?\e0)3[6VzAb-*4>]G#yq:=rI\-$Ť@&AfтȷY-oY0uYe+jBXYiM]p_~HLEYMCn:h.EK~S\Y`'xOoZ1qѵK4xI1VsWE4444B]G_iJ&f*˥)))))))))))))))))))))))))))))))))))))))))))))+))))))))))))))))*:kJV& ,*.f/6%r72#r:eNqf5F?{:k?A~%|'|; t8sfN.b=[UPZmtZu(W2_}md,y?"in+-2iTrqu[Ts#qdud*+.$A4?0HU`nw-:*"*6Z\|QM:UEZDP 9sWA= ~2 0%ͭߦ`ݮ# tX4cM2UĦC68d ő2KʙCq5ʱ aM8R)lے4fL^$j :# +5TC. ~bٓ2-ʫzfJFF,ŭu˜g bykTĆʒC̻̗,Tq# [N/65k:ml2 YD N@NquPm&%T)Z֩-1gș I?3?r9Mܒ: :0A)eӻÓn훎5[,Q[cu_ٌ;81*%&XW󍡒"P̺g3kc#&5L7cutVIES$AjsΜ[EVbujLնF}=yz| ?ۨdPɎCvE`\]0e Y $Wbqem65 Q}e y)qO281a4S::Fbyp=4rʴ`έe^ƀB+^J!Ƨ֝>lIښ?H(Rcl$nL$ת9Y'!TfdNQi7 *duOD2Ypf9.gqYISuJUoK2fff2њu8fI%R}ڥ܁*cGq0*] *``:V[`D>Y"ZFƩz*fҹ}6Ѻ0n^n1HU3IrOG>:` vbeI|uZ_'L9{ Pmҷ)c8ȲnO_Kp9a"=Ttd-{(F&9ǧfŢ9$W_24O%Qy}LA|Y?ϭF^OϤmFƒM脝3iTE7N]d=/2lekw:/xt'AYMrnHllv:o)z6\é)?[*Hy!ul]GLH]4U|IZ[Y}H*kN6m ,[p"V--pkgB׮oնVB&.<ɸB(غ<'QK{κ뮦jA+M9 쭤Jxx&jc]JiJiJiJiJiJiJiJiJiJiJiJiJiJiJiJiJsYRmX?K)YRmX?K)YRmX?K)YRmX?K)YRmX?K)YRmX?K)YRmX?K)YRmX?K)YR.:TT]d_˥*vɲu7U.k)V)M)M)M)XDŽxylAdB*2ma""8G/eX1 t림t}=#1,,bTYCL A*4W:QŲDQ5;3$ 3Zn35iCl!b Fca%KgA} ^Qˁsd=&;n8(jFH𦳱`,hRIӖi'jŁt'n6v.Q`qsl,lOuj\/u\`\۠=kbd q2@ OtWŃ2Ȇ0$Mh:f#PاKzBͽ54 YXep vC2Zjvծ/N{t|~]v=*۴n[u$ueJB.F0H CJn VR$6p1;Hb Urq]$\fǫG!xZȌdH&Hث鉪H.3P ;P&OeHV5IOUdYopbllߚ t'jҥW@L _n_Ό.!OfOʻbbv;Y ڒuN11O>eD[Wzۭ|KuiB_-XtB3Ů-zSkQk'dR!1Uʏ_&aͣRhP\D1-Rp鯰cÑRL3'a#cVQʯ%)2*˗o]g_[ O6b6- * "| $ldx li<f=m:6 ,z~NZeRETGd5wd!:D]'Oά:ډ;N ˛cPh+gq&+.5Kf*. @;*"it!r!kO?4ZUM6m/A۰QsxK=n#d!*VqBt6b}9 IesS i +c" ""l&M4444444444444444a+\VAuMWU&]Odu ݐN㭃-( HgZ'rΜr49Lee%#S|b> ̐2F[BU+mǰZ{WWcw>͹95`fNlW*YLԆ_#ѽ[R˱Z71΂ux!鸾Wю(>'a;"!Fs|NS\;Ѻ1̨NBj,cyҢ8Wtv>4{l$D]}v?wu LA"gM#R9a|SVS_XPMlvHV Q]keǍƷQ$pޱ+ʍ 'mV]Ib1kj+BɺٌK(JH"2d[!m/90d2Ă'κ13",A+6;)))))))*_Jwr]ҕnҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҕ˪Ŭ&CDfU ‹"SLʘHf SMymR92Y!dP-8B7EW,p["6R1ฦc4֤ Jlx74 rҦ¾;YybBW me/DE4W]Mʘ:󾫅Clw l9W @yX59 ֒jG>H6!Euhq.(@ە}^tZR$Ͱck_Ԫr٠a$"KR#l"[tv5=VBC]+rwaW\P"<734Iu%!;C&\0n%Uem#*FyU--_Tޅ,RbjO(f7tr@dTV'fRLR7[x7q eE"E$$ιz@^JA$REVw63s@e ^=7Β_c%_SLmx4ҔҔҔҔҔҔҔҕ u/^p_Z9_.JiJiJiJiJiJiJiJ@nbe숛dqK6IT08ֿl EeKo|a;F%32oi 6]] `uA]6 i`itVz !ޒ#Sfue f&[IM^ÝT,pٱ%N\SduTMUQsp,¤ *WQJiJiJiJ~-"U7dgH3ܶO DZ Nʥ~mHR~=j즷**$yάmcqpDǨIbDTZأhAUV $WrO)}mEMlHaE]~jR(EX 9Uk%C b)nN̓Z ;O< BDzH5+JئƊ'_ iٽbcܫe.0୒;gxpHvU7c$5-X! FFB3#mhED z1-3R;$7TY$RE#T܉PQU(5 sO{k+JSJSJUZ5ruV~ze6Y3y_I _EWwRY61\pEF*Ө4Ad9%F-\D˚ie9!uXmؠ4[)l[d" 70{Ia §QQ>MET+JiJiJ襼Zr`L&Z3٠9)%DU5eā'CA?O)QwwU=̟'SMٶR ؑŠ *jBb{XHNU&/iUDĝ9DyZ'ZgvvA!ƻ~Uȍ׹%_1ql-MuRJ]N- ,Xb _{(,C!^TH,W\%de&ޕjk!Q5IRln ʹԆ@?_zd6ۀTz.R'@?. OLF YQ|%8E/*庲cd-h5ƙy'5 JJ QOKHRJS`HlԈ;sb XwĿ:hlPe$$E00-ɋ-N>We>פodq#9^Š]-g "eY!@!ih uU1j̸&BëSҷYX!ĵppi#N;7㔹ik9̞,4KE%Nɻqfm JT4ReK0.bA'X ]cCP MpXgS[+ qʉQVzț; qU2&L̀ eU [ʐ"IPʬ.6ɪS$u֘&`D$.:Nw",Tqa,uTM殧Kvc& 0h*rę}ZqߤwlX(V['i2O,2E Uy8fynX( 89=l@SRY$eo1U$%nxAD(>diVqpؗVџ}\LEYuw?GTˏA'P&$,`$kQ2#ه 40tKWZf#eYG[(XHxkp*JzIf*w;}ǣn]*Mf zj&D+6N} nצ F? U>7cH2861VPhI;;2keo4ۀ̒j.\F% e.g#zQkC:Dm&Q r[V\>N )& rV/-#dC2PGyf4c"믶-vmGmb$OH!k9B Pc]2%dETWC ROǖ2gYBS38k0jMDZĭ<{e۲p3>D=T6N4. >עDNxU7 3_2K%673Wq&bcYat`8idQab;6q[NtbB]F+[Cehձuֺ03P13mE{He q!]̃JjHx9M#F!yqym17jޕj{>Kk0` sjGCH~ޥŠZ筹+^ &cX9m'}J%/%J7Xco>EJdup78슆*.I.?75Ehv7 F hjڿ( :k# aA%cKp֎FqC`1 ^bf"bc&DB- Qy41G?ܭ1$&9NUYQUU-46wkN_E?_Qxʘ'Y jHDa*E[Jq_İϪV%]K.%H&KG,  :F]۫`52U|J 6s\qE22p[qk+Jzm.2 {gX }EK;۶1bU+# I1+!ی%U2ލֲY6,ʪ͗h7v$ @0mLkfURRގiKBil̈5{qi_IAcR502,@X,`/#ykQXU$ٚTlg՞ wO.q= Are{Mmc˳!.WvuUTU Wet!T6LJ,S3c&ub9uIK3/&R+x}U ) 15V*ҔҔҔҔҔҕmd~_å)d~_å)d~_å)d~_å)d~_å)d~_å)d~_å)d~_å)d~_å)d~_å)d~_å)d~_å)d~_å)d~_å)d~_å)d~_å)d~_å*Lkt\eUUUUJKRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRa+[k.DK,둍u KtO8cW$䪥[U&>=[W7O,aFq[*;uq .;e؅."&F=_WS{} {Q0]SyAB!oa\ʰX ueݠÍyW;b֛NuV:؝CyM#_"!\'VuLǍ%G`=CDM|ݰ NV m$DUg`lk!L Q A5?_ͥn_Ip?w݄S5)hc[.\w EmM6>Y?2/WawSFk405!a +QY7^{9 3; ]lbf5 NTuIQI6.Ow`'p.>` $H\iw GJa85^M2_O8jH0ZEW:B _O{lk PDV@"jjcj*+ie2;hֶ>1~-KvGk:<Q4 U7zHU\zd IVB 0NPH *H5`U4444444B]~c)WWKRRRRRRR+^* wY=2y:Qƺz7M>eNoқϗh'VEkAc0kݵalA1\R2#@(^= ՓǑԑǓL[rN=PFa`T."W_ xs6X뒭 )΅><@cZQg c:ϏT -Ҥ$T3ܦ "| FѨmB°ѢDLJϙfab~,,[JR[xtbEAilNJ&E RK5MzX@8J` "euk-q<RY&aE teeBXTGe($HEήYecRdO!PT=\x`JC peIP#_>F8>yN"KNvUE9Vٸr1,0;!u6Z88b2bH+1M$M[̳rXMǒ㬓~.=_6c3U-8qǘH웋"*Nʛv1;*#NtnJ`aL 'cAb0A0Y(c/i1V ks4{7@]yr͑aYRRnuVx v_cIAvlpUa㼱{.K)ī@ ޳!dٲڊR)J%IX2, f \# l~`5 D}, :ٹNGfscr_무zSQeGPUvC6s("ς9u4$›$F8vlv\X$òxJWLe1êѠ<dH$.c[tFgB  N0ycy؍U i0 MNfI%)$;QkZ6O}3uX 1ȁѐ%@mf # lT!acbxN#qQq9Td6նvAS6m@>܇護bIL@|ޞjFXUO`q5Q8ʇ,KOu]o@sE}T7MmWlIw0cx0 ?é5`u@ i^/cԏ۱ [2*w=}m=]컛 l͌(]y O%ѵuMUq38A9~o.'bӄEX uY]jt]t{;fS_"VWͶ%s<*$uD^"QWX0|O L nD\o=۰kZֱ߾L|u3#_TD[MK8'Nk"Vc*DSbVX+[6ąt<,jԉ;D)ɼJZfah=]m+R0S1&;) s]wqdѿ^r䥎rT6Yp$]*.;pb&`Y'LlD A E@X pߴkO~%ݜm:!@3.]y2CA@rM_<)̟TA0[% ϞԴ(6J\mC2]sUCiFnD7t'm6 6B:|t83!ѕHȨZ3fm\ *9nMV!q}#*K5 /B'ZG-0z HkH18\g` pjd'tє] ɧX̭r/p_=_G,Zwz;j4iCyHPSU]nNJcPMD IaTu7܊GĶŒػKDۍ! .IVFX0cZ$g?_"t̞TH?=ؼ.F `U_ 6c ehOKFƚt֧oy? XńsN+]l$@{1bw!'[ &Uw@'Bhꂺu 8df߼@.z[^7θ=,Ys}"fG|=`p%fE{d4]h'TXQ$BEUGAү鷫II@1՛<#&H)Yc-VnS3WeYaY9+fD9}(  **C+oxboVAO}si j:qUܔT{ ru|)3,FڭH5^Nt* .軍xZ;"`R `*AJ 4H@&.lF-\m' ѻb$ubcl`M eM8nPqF@@v ĝIMN;Y:UquQUEsCyxv1i.v2оa %d^Z+**4+Cm ;W6b AI1a+ĕS&wAM{ovj룴d/(\k8V`LǑLH gg[M}^j"d*Rxo3,M`Џt`ջ|n+zčTfMrYM+**fH*>NAt"=Ad,5zF}9[![ Gu$xB_\կ,ȚuJ{42if֛SUdN:M4DYh$t.Fh<:B@wN3(U ^i'U]+f3Aư*R >5HLj^^DUdԦISz_2$9$"-8@dvziζcU ]m+ z|oб12mZ:ÆuO*aMC_㶰;PcYI$vG[ TLU`m;Fձu^4444444B]~c)WWKRRRRRRRiƜȜύ>jTvrHLZFćbegӶ+~yVԛoϋ1p#VFkBb3&@e%}FKM1B[K.a;ČlCRo72GIrF2u%e=ZksbH C=fǠ!RQagf /mql,8W6R8͒927 ɇ3uY%TV^_˽+jn9o888K8$WvɋD|( Tt.|bH" ܌ L%q$z fV@aq?=;f50`66x܈WIr85MJܝTQ';df1NCLNfK  F @ȁl; Nu{A'WWc4pڙdcR <K8X߸W;f%K&܆ӥAa 40z0c5 :N6{) G =Vobt1,jҔ*{^q%OL<2)KuChmGNjcr$DɒVVX9|'?,cr*|"%LPJq9e]*t"|t]3xbDe%zdg 1ha7$e1 @k,Ur,{1\rV6sa@v| Pc C#i$'PWvө7T$+'3+2H\  DLquG5u"eybTYE obY^UVXΝmSPY&\o@q}%BOCQU Á2uN;c,>Ѥ;$;ڨ5’8vC)okt=UHDue:rAf(/ON'y66kT$4X'%91ՐUf@ h:qb-V3Q++Y9 $mZY-%J}n,mDž Nk[|κ ZYHpM\p=2wQAUyȩ@ F4oN KW%2j<&;qĖ0쵑(hEZ- m7ҝ=""L>C/eyI>Hə'xĸo!.$0ŋ5g ɳد4dE2C!Fu'܅gxjYUЙ2FI'dwײn:b8&[WVr.A(e.cǣV#3ڻ eMrd1i. x>)"ĢGH7*=R7 B :/,DLKnW1JmXʤĪUޕĨXf'|]kmvyM<8N:HhLa 63 @CybI% 11=:Ƥ-Ǩ2kT8;<[Gvl]^a܁s?^Ok c6b,1z'kaƲW,2,^KyUpYMԑ~d PI;nۋD&poDEcz]E{r?ο]˞S(Īŋ3 fwMJDmĬzL(6tg x(D10v\x)rHDH3byH}:O(RxV<:6♋\g!5dh抳1lG&T(yzky;^1Mڡ 󶌮<6UL]T [eAVP- 'kŮȩǨ"Lj+$j+M 0Q[dFOw]2z]2Nrdo'm >k?TwNcmqFU}_J~C e_&{)ǑM#PTD36`Kvk[ NU,Zalr &-nΪ*Y1ɱ{FX2vb")6B &H^Y c@IrTV`El C" |`aiJt??ƱR}&CkI)iJt??ƱR}&CkI)iJt??ƱR}&CkI)iJt??ƱR}&CkI)iJ ֱR8.Wn/\t_2ƛҕnҔҔҔҔҔҕ_b7^IWech(a{ך5֞#)ť*i{,tc\Ʋ*+/"λ[tUOEƯ9]9U}]="W:M]Cit lt@`.E 0btIfT  V“Dzͤ{/7Ɯ#fa"࢒)+!C(,G Tϰ C%U$ =7H,K8&׎Y2خzc*[b9.cq<@!n9pOȩ[0n_Pv8* /* X`6ڧv&`M[+\f\5^bUڄ/YRHssD*_u'kC D}M'[PZ>o =LfY3U"'ӿCCIc9nB0ֺlq4IH u3p8YmiO20sngwHu(mJ2Gǽ1նwY<)`][WQU?5 3,: vyTkt_zƥ.mk% Ui+!H]5,IU 7ytxț3qT;bbLVNX*Kb)oVW qD-5r62Jpv#iNyn D.^9lN s@2lmy".HܒțӍ55;k>,FUX%@V-hN}"LAe!!{)ȲKk5ŋWjWif5 D68&/d =N.2Kr]vNN5IXAd 2 3^X3B.ysO!5`*|أ %ydy~{t~ >ъIlT ?YAaI5"{qJrlVfqUe q8L/g\ÑXY02*:*(]BHʧٻL'"ZAY &\ 9GůOEaxTH,܅;J^JˮY&@uUV鈳a ?csQpNGA2'q$H#u"sDF9]+NKrHVÆh'%7Dk;s.0cxfu v}JV"X2`i'VC 8܏Pr&1Rҝ^uUM ^f;rJFˠ` V.paHia$9*DG*4/؆v'!d1,j1Jt[ȓȀqm+`.ÔE3bY:L~`=& fo*,cZ^ds1j1MߺcN z-JX8fE\b12'ڬujc n!!lBn+qz Gdoz.ݖnnkuUe N4[ze>8Uw{>m{Mkls6'X\&Ls6qljU @ vED?98`6U&14=WAq ć-Py @'~l| ʍ>`p]܉TXA6oXtiAfMF% qPZ Өtc&Aw$ c -,0c`T0OՏcEG 6Q#rqu 5oDMA[23QJBN𰎫" d>TVcX BRc"9uEI0Ktvbq|E\j[ݺk!XfV>B,SAuKBT"غQz m[+r-t{fvq9^:w4#m+z0uC->%@Yds-/;"LlzDʶ^'Ba y<Hyhͣiѣ `X{mWYewG+yn^{Ҙ~0l1^s$^VQ-wufr'}5 yY:\RaDtI_)OHHMOg؍Q7[p2߰S|]7jL۞.6M3m[> !B88t`Qtk a=Qo)A7,fYkJ>5ɑPuu,ڌN "t `J+F9? "v1tZܰ]txcy?bJ"MvQ]>[Es: D.D鲩=AzJr uc;**/I*.ʋ+*6D?L e*N3v[MǙbG+=IsQO*)ߗ:.: )7![16m`.$DK e]]d,r:P *GK+!ͥ:/S/p{|L,r薄!-ɓog@1]ly@Xہ֊9!/+dAȻdfm 0`F<)B@͌4Mm9 Ñv=Nk" RC.YOE|w ]ԥuݲ L8s>A#q!Χ&ۄn^44%5_ISQꜪld7<=L* 42sh.'&4qaJov ,3(1e&HA*EC\jeW#+Q,(jR `U^u[^K%R!>>G69LekUGʥd2Ps!×dMͬv\m]1>+3┈滢Vûe `szrI$ #RT 1ٜe#*ʂmD*/|ū6؂3H" GY@Qq G`_KZ%LY'YZ'T0tVLg@KH7܎&4ssALLj\ h'#zxKG}-uwy=|$ \40o+ %I\ c3`L @0v2J@(i#rPdi"93<|ۏg;UWWKbaq4V%N|m/&I$8ĒA"H<%Ǚq 7oe_7y8B춀oA}So.ɕGc|N!p*K\X2CMxȯ >RW DͬrdyJ7бъzz׾ɶlnal_xZY᾵B¿f/a)FE8XY>͐O^H=3^Ƨ/}9 I1I dA2\+v :pwlU%HU`⻙uy|v0̪*;1gŶA`f7leP0k=G+lRN7Μ~ n?]cMSR]]Ϳ˛g[V_zD iqH;fG}%N!a@ 9sa*ztYk);i…4E\ &,{'WH^=.`@sbۻx4ߥ'Vgatی#]=۳2IG׫wۧeL񵉍~)ُ?tstpP><5ō^Y ]ujTZɮ+~Z- S>mB.GR栫xBN,aV| 1!jDtLK&M9ENG3qP;QRdPoѷ\0YI>;F45:sn/H/M5͸O yUdIj"=&9_VN@u,ΘfHo:@& A +1p.Bo":K;[W_!E@d6Y\gA5 m'#< y/^5bP+tnNBpG ۤpD?#{.w]ǿ=:Z"VNUsnMlAf Ffկ,NC(RHv,n-#u؅`|5ۮV w.<`s*D\bf:K:XXJex]^"VǁWi2G3&INwz@wuRVy VR{gϓFHD*+5:8f7ѫrVD^ 7I6ݹ6 c?(9Jcw_ıd¼02eƍC9]WnZ1n[ᘼZ|$W %axۊ˥ cc6H}%]h{;M7'_4@0V̝Ӱ yfL\D]jb8SSFD{9bD'#ޒ*Bl]cɆ˂C$A:}Gf-gL> bH-&nYadü./9&J:+V1DLX 6 wW1{^eMߚ7Zb/*qwX2?GI5ݚN}E#&TʣP.49q+l ROI(|zg0]3&@v3'6w_Ţ7 X&1eЏW# ܻ g]tYqc@D 0C+蠊aq `N3W~[ H9LкOO qwRh7J̆m}s^hX>.G]QxPvMbɛar AEPO:b&eլ|k B J S5RI|tm1fquT'%r2 /KyE6tI7M-o\ݹCe( x:5 qp$0z@2EJL4:¯IG&2*)Ī~рrD"q]ے6ޒtX0]$9D\R鮎 % EFF{+X, ~i)))*_Jwr]ҕnҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҔҕZ׏Rҕ[7Rpnd"v-0!vWza_"U}~Pƭ_k`˔̈́Y.4}q I :PPTҕ)))))))))))))))))))))+a+Py kcg>=d2֮6E%^9M2闷mKbQN4_lkG3 ȌTwhotҕېcM[ƺB$ ۭ8ډ!! 672+<ؓ267 p@"[4X9 yҕYcHG&\9rF%y=w!DUU֯{uL@;(|wqvX@$ieu2:VV7fȝ,'J$tyarkJ= Α7̘ 3#_pGI%]mif$n2/=[JO5Pd =GО}gɌ S]c>>+LN5uuM]\][cE|#dҟ[qyqiM.Fo16~W:H uL9­ʤXе5,XY?yLd c"KdZh$oԈE2(P,b813gkFq3eΠ6j4r!L9Ys#~msf,E.~AQk:>;'[CBJw6x5 }7GH$8]j`"I͸L"ܕzD_$ D t:=lt&KuL}\vbָx4D#j/g,޳(qgG]kq( +XHmm0[= zB6{5dg H1XÐI1fzIi#HF%wSJSJSJSJT%?ҕyj*ݥ)))+tҔ47M)]2]G*fIȾ*OO%'n`9>9FBX^Ű #v?XmlU²hhɺC;e26c-$d)`zu($ Bs ^nljN˸^9qD[ PA le E#Gq)֚W-ˡ.E*вEkqxQ i:Sh}(orx.}ecv5Tf$B/Ri/yjhD20ެ u,7a\cm*JqD'C) 'p)yms43awc}CV eWgc-"0_mp\i$$Û%2(ᴓ8G&Ы{VEii"nU#]i25aǶ5՝%7gI[}jjRF%-Ԩ"%Tݣ)lfSuȱ)b/X3AJ0Z UH"QNOgu Gh kW%E{r 2:l㭪V={2(YٲPK bPc=혦0ZʬCzRkqvG1qVJtd.FLRR̪mha lk[_M\(q9Ltmkua(KG.x]uT~+Lxoh$yʫh RRYɎI 0f4V+DAїLrϬ M~H.aFK\`۲Ҧ7:^69,$UHqVL_(_cP. N#jiIZjیּBC HyR\.0{:d SImLxm.-.;&.7kad)Q cxwnCD -nJ 8 lc_c'^\B@Aq6 }yF8t-7| Q"İZܤX~,;:ظW=:z @z½pZtQFaSv49"1RT5!,;1 𤪇bY7 O;CoYW=xFq#m^d1 `"ȩcYP,Ii~[6 U-!0eU!d%iWѿ<7S,>MXN$MxN~ci13|ݹ)Ź}t3lW%dȉl]#uEtvj+` pLbַQWp?]55CҔҕ+?M)YRRRRRRRRRRRRRRRRRRRRRRPKL\t
    WP Fastest Cache Premium has been updated. Please push finish button
    PKL\U I^^&wp-fastest-cache/templates/timeout.phpnu[ PKL\/wp-fastest-cache/templates/toolbar_settings.phpnu[

    " />

    get_names(); foreach ($wpfc_role_names as $key => $value){ if($key == "administrator"){ continue; } $wpfc_toolbar_element_id = "wpfc_toolbar_".$key; ?>
    PKL\I 'wp-fastest-cache/templates/buttons.htmlnu[
    PKL\;.>)wp-fastest-cache/templates/updatepost.phpnu[

    options->wpFastestCacheUpdatePost_type)){ if($this->options->wpFastestCacheUpdatePost_type == "post"){ $wpFastestCacheUpdatePost_type_post = 'checked="checked"'; }else if($this->options->wpFastestCacheUpdatePost_type == "all"){ $wpFastestCacheUpdatePost_type_all = 'checked="checked"'; } }else{ $wpFastestCacheUpdatePost_type_post = 'checked="checked"'; } ?>



    PKL\N\G\G)wp-fastest-cache/templates/update_now.phpnu[
    • First, you need to click on the Premium tab
    • Click Update button
    PKL\z[ )wp-fastest-cache/templates/nginx_gzip.phpnu[

    How to Enable Gzip?

    Nginx is used in the server so you need to enable the Gzip manually. Please take a look at the following tutorial.

    PKL\&J&(wp-fastest-cache/templates/lazy_load.phpnu[
    options->wpFastestCacheLazyLoad_type)){ if($this->options->wpFastestCacheLazyLoad_type == "exceptcontent"){ $wpFastestCacheLazyLoad_type_exceptcontent = 'checked="checked"'; }else if($this->options->wpFastestCacheLazyLoad_type == "all"){ $wpFastestCacheLazyLoad_type_all = 'checked="checked"'; } }else{ $wpFastestCacheLazyLoad_type_exceptcontent = 'checked="checked"'; } ?>

    Choose Images

    Please choose which images are loaded via Lazy Load.

    PKL\UcH}YY&wp-fastest-cache/templates/preload.phpnu[

    "/>
    PKL\t
    WP Fastest Cache Premium has been updated. Please push finish button
    PKL\Wp` ` (wp-fastest-cache/templates/download.htmlnu[

    Manually Activation

    If you have already paid, you can download the premium version via following button. You need to activate the premium plugin manually. Please don't forget read the following article.

    Note: Please read How to Activate the Premium Version Manually

    PKL\G)wp-fastest-cache/templates/cache_path.phpnu[
    Cache Path Customization
    "cache", "optimizedpath" => "wpfc-minified" ); } ?>

    Cache Folder

    Hi!, You can specify a custom location for the cache path via this part. Please choose a folder and continue...

    Note: Please read How to Integrate StackPath into WP Fastest Cache

    PKL\m d d .wp-fastest-cache/templates/disable_wp_cron.phpnu[

    Disabled Cron

    The Cron has been disabled entirely by setting DISABLE_WP_CRON to true.

    PKL\,4WW&wp-fastest-cache/templates/exclude.phpnu[ PKL\mkk(wp-fastest-cache/templates/cdn/other.phpnu[
    CDN Settings

    Let's Get Started

    Hi! If you don't have a MaxCDN account, you can create one. If you already have, please continue...

    Note: Please read How to Integrate MaxCDN into WP Fastest Cache

    PKL\B 2wp-fastest-cache/templates/cdn/exclude_sources.phpnu[

    Exclude Sources

    If you want some of the sources NOT to be served via CDN, you can specify the sources. If a source url contains any keyword below, it is NOT served via CDN.

    PKL\AA-wp-fastest-cache/templates/cdn/file_types.phpnu[
    $value) { ?>
    PKL\l((-wp-fastest-cache/templates/cdn/cloudflare.phpnu[
    Cloudflare Settings

    Let's Get Started

    Hi! If you don't have a MaxCDN account, you can create one. If you already have, please continue...

    Note: Please read How to Integrate MaxCDN into WP Fastest Cache

    PKL\t#?M M 2wp-fastest-cache/templates/cdn/specify_sources.phpnu[

    Specify Sources

    If you want some of the sources instead of all the sources to be served via CDN, you can specify the sources. If a source url contains any keyword below, it is served via CDN.

    PKL\%\ee)wp-fastest-cache/templates/cdn/maxcdn.phpnu[
    BunnyCDN Settings

    Let's Get Started

    Hi! If you don't have a BunnyCDN account, you can create one. If you already have, please continue...

    "/>
    PKL\G^`0wp-fastest-cache/templates/permission_error.htmlnu[
    The cache has NOT been deleted because of permissions problem please Read More
    PKL\, 2wp-fastest-cache/templates/cloudflare_warning.htmlnu[

    You are using Cloudflare so you need to enable Cloudflare Integration via CDN tab. Please take a look at the following tutorial.

    PKL\;&wp-fastest-cache/templates/newpost.phpnu[

    options->wpFastestCacheNewPost_type)){ if($this->options->wpFastestCacheNewPost_type == "all"){ $wpFastestCacheNewPost_type_all = 'checked="checked"'; }else if($this->options->wpFastestCacheNewPost_type == "homepage"){ $wpFastestCacheNewPost_type_homepage = 'checked="checked"'; }else{ $wpFastestCacheNewPost_type_all = 'checked="checked"'; } }else{ $wpFastestCacheNewPost_type_all = 'checked="checked"'; } ?>




    PKL\=w!!6wp-fastest-cache/templates/clearing_specific_pages.phpnu[
    Clearing Specific Pages Settings

    Enter a Url

    Please enter a url which you want cleared from cache whenever a post is created or updated.

    Note: Please read this article to learn about this feature.

    PKL\*22/wp-fastest-cache/templates/sample_img_list.htmlnu[

    Show Images

    Succeed

    30.45

    %

    • All
      7196
    • Pending
      5002
    • Errors
      3
    • Optimized Images
      2191
    • Total Reduction
      78400.897
    • Credit: 9910

      More
    PKL\ G G ,wp-fastest-cache/templates/update_error.htmlnu[

    Manually Update

    You need to download the file and update the plugin manually.

    Note: Please read How to Update the Premium Version Manually

    PKL\CNINI&wp-fastest-cache/templates/varnish.phpnu[
    Varnish Cache Settings

    Varnish Server

    Specify the IP address of your varnish instance. If you do not know the ip address, you can ask your hosting provider on what to set here.

    Note: Please read this article to learn about this feature.

    PKL\AQ(wp-fastest-cache/templates/htaccess.htmlnu[

    .htaccess is not writeable

    1. Copy the rules from the textarea below

    2. Remove everything from .htaccess

    3. Paste the rules

    PKL\|ppwp-fastest-cache/readme.txtnu[=== WP Fastest Cache === Contributors: emrevona Donate link: https://profiles.wordpress.org/emrevona/ Tags: cache, Optimize, performance, PageSpeed, core web vitals Requires at least: 5.3 Tested up to: 6.9 Stable tag: 1.4.6 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html The simplest and fastest WP Cache system == Description ==

    Official Website

    You can find more information on our website (wpfastestcache.com) Welcome to the page of the WP Fastest Cache plugin, a WordPress cache plugin developed to speed up WordPress sites.

    In today's world where every second counts, optimizing your website's performance is very important. Meet WP Fastest Cache, your caching plugin that you can use to speed up WordPress websites.

    Optimize the performance of your website with WP Fastest Cache. Improve Google PageSpeed, Core Web Vitals, GTmetrix and Pingdom score with our wp cache plugin.

    In addition, page speed is a ranking factor in Google's search algorithm. Therefore, using cache plugins helps improve your SEO ranking. Our WordPress optimization plugin not only accelerates your site but also boosts SEO rankings.

    Features

    1. Mod_Rewrite which is the fastest method is used in this plugin 2. All cache files are deleted when a post or page is published 3. Admin can delete all cached files from the options page 4. Admin can delete minified css and js files from the options page 5. Block cache for specific page or post with Short Code 6. Cache Timeout - All cached files are deleted at the determinated time 7. Cache Timeout for specific pages 8. Enable/Disable cache option for mobile devices 9. Enable/Disable cache option for logged-in users 10. SSL support 11. CDN support - Effortlessly enhance website speed and performance with seamless CDN integration, supporting Bunny CDN, Cloudflare, and various other leading CDN providers. CDN integration modifies the URLs of static resources, enabling these assets to be served from your CDN service provider 12. Cloudflare support - Cloudflare integration triggers the clearing of the cache on Cloudflare through API when a cache purge is initiated. As a result, WP Fastest Cache and Cloudflare operate seamlessly in tandem 13. Preload Cache - Create the cache of all the site automatically 14. Exclude pages and user-agents 15. WP-CLI cache clearing 16. Proxy Cache - Varnish Cache Integration to clear proxy cached content automatically when the cache created by WP Fastest Cache is cleared

    Performance Optimization

    WP Fastest Cache is not only a wp cache plugin but also a speed optimization wordpress cache plugin. There are many features such as Minify Html, Minify Css, Enable Gzip Compression, Leverage Browser Caching, Add Expires Headers, Combine CSS, Combine JS, Disable Emoji. 1. Page Caching - Page caching feature generates and store static HTML files from your dynamic WordPress blog to reduce initial server response time, and improving page load time. Page cache and caching play a critical role in improving website speed and overall web performance. By storing frequently accessed data, effective caching reduces server workload and significantly improves cache performance, allowing pages to be delivered faster to users. This optimization directly lowers load time and enhances page speed, resulting in a smoother user experience and better SEO. 2. Minify Html - Using an HTML minifier is an effective way to reduce HTML size and optimize HTML by removing unnecessary spaces, comments, and line breaks. A smaller HTML file helps reduce page size, which directly improves page speed and leads to a faster website experience for users. By focusing on web performance optimization, optimized HTML allows browsers to load and render pages more efficiently, helping to improve website speed, lower bandwidth usage, and deliver better overall performance across all devices 3. Minify Css - CSS minify techniques play a crucial role in modern web development by reducing unnecessary characters through a reliable css minifier. With effective css compression, developers can compress CSS files and apply proper css minification to optimize CSS for production environments. This approach helps reduce CSS file size, which directly contributes to improve website speed and overall css performance optimization. As part of a broader page speed optimization strategy, these practices significantly enhance website performance optimization and lead to better website loading performance, especially on mobile and low-bandwidth connections 4. Enable Gzip Compression - Reduce the size of files sent from your server to increase the speed to which they are transferred to the browser 5. Leverage browser caching - Browser cache plays a critical role in how efficiently a web browser cache stores static resources like images, stylesheets, and scripts, directly impacting page load speed. By allowing returning visitors to load files from their local browser cache instead of downloading them again, websites can significantly reduce server requests and improve website speed. Properly configured browser caching not only creates a faster and smoother user experience but also helps lower bandwidth usage and enhance overall site performance 6. Combine CSS - Reduce number of HTTP round-trips by combining multiple CSS resources into one 7. Combine JS - Combining JavaScript files is a core technique in javascript optimization and js optimization, especially when the goal is to reduce requests and improve page load speed. By combine js assets or combine javascript files into a single bundle, developers can streamline how scripts are delivered to the browser. Whether you call it js combine or javascript combine, the idea is the same: fewer HTTP requests mean faster performance. Similarly, approaches that merge js or merge javascript—also known as js merge or javascript merge—help eliminate overhead caused by loading multiple separate files. When done correctly, combining and merging scripts leads to cleaner delivery, better caching, and noticeably faster websites 8. Disable Emoji - You can remove the emoji inline css and wp-emoji-release.min.js

    Premium Performance Optimization

    The free version is enough to speed up your site but in the premium version there are extra features such as Mobile Cache, Widget Cache, Minify HTML Plus, Minify CSS Plus, Minify JS, Combine JS Plus, Defer Javascript, Optimize Images, Convert WebP, Database Cleanup, Google Fonts Async, Lazy Load and Delay JS for super fast load times. 1. Mobile Cache 2. Widget Cache 3. Minify HTML Plus 4. Minify CSS Plus 5. Minify Javascript - Minify JS is a core step in web performance optimization because js minify techniques remove unnecessary characters, comments, and whitespace, making files smaller and faster to load. Through proper javascript minification, developers can compress JavaScript assets and significantly reduce transfer size, which directly supports effective js optimization and overall javascript optimization strategies. When combined with caching and code splitting, minified scripts help improve website speed, lower bandwidth usage, and enhance user experience. As a result, page speed optimization becomes easier to achieve, leading to faster render times and better search engine rankings. 6. Combine JS Plus 7. Defer Javascript - Eliminate render-blocking JavaScript resources. Consider delivering critical JS inline and deferring all non-critical JS 8. Optimize Images - Optimized images load faster and consume less cellular data. Looking for an easy image compressor? Our tool lets you compress images instantly, including Compress JPEG and Compress PNG options. Enjoy fast image compression to reduce image size without losing quality. Perfect for quick image optimization with a smart image optimizer designed for all your needs. 9. Convert WebP - Serve images in next-gen formats. Image formats like JPEG 2000, JPEG XR, and WebP often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. A fast and reliable WebP converter helps you convert to WebP in seconds. Whether you need a WebP convert tool, a JPG to WEBP Converter, PNG to WEBP Converter, or a simple image to WebP option, you can easily optimize your images. Quickly handle JPG to WEBP, PNG to WEBP, jpg convert to webp, and png convert to webp tasks to reduce file size and improve web performance. 10. Database Cleanup - To keep your system running smoothly, it’s important to clean database structures regularly and ensure you clean DB records that are no longer needed. A database cleaner is essential for effective database cleaning and long-term database optimization. By removing unused entries and organizing data efficiently, you can significantly improve database performance and speed up database operations. Modern db cleaner tools automate the entire db cleaning process, helping developers maintain fast, reliable, and scalable systems. The Database Cleanup feature clears out all of the garbage datas such as post revisions, trashed posts & pages, comments from trash & spam, trackbacks and pingbacks, transient options, orphaned post meta, comment meta, user meta, term meta, and term relationship etc. 11. Google Fonts Async 12. Lazy Load - Lazy loading technique improve page speed and overall website loading time by loading content only when it is needed. Using lazy load images, lazy loading images, lazy load videos, and lazy load iframe helps reduce initial load size, enhances web performance, and delivers a smoother user experience. When implemented correctly, these methods make it easier to optimize website performance, lower bandwidth usage, and ensure faster, more efficient page delivery for both users and search engines. 12. Delay JS - The Delay JavaScript feature helps reduce the 'Reduce unused JavaScript' warning in the Google PageSpeed Insights tool

    Information

    It is very inconvenient to use multiple caching plugins at the same time. That's why you need to disable plugins such as LiteSpeed Cache, WP-Optimize, W3 Total Cache, WP Super Cache, SiteGround Optimizer, Breeze while using WP Fastest Cache. WP Fastest Cache is compatible with most popular plugins such as Contact Form 7, Yoast SEO, Elementor Website Builder, Classic Editor, Akismet Spam Protection, WooCommerce, Contact Form by WPForms, Really Simple SSL, All-in-One WP Migration, Yoast Duplicate Post, Wordfence Security – Firewall & Malware Scan, WordPress Importer, UpdraftPlus WordPress Backup Plugin, MonsterInsights, All in One SEO, WP Mail SMTP by WPForms.

    Supported Languages

    Although there are over 7000 languages spoken in the world today, we feel very lucky to support 30 languages for now. However, localizing or adapting a plugin to another language or culture is time consuming and a demanding task. That's where the amazing Translation Contributors team of WordPress comes into play. These selfless people spent their precious time without expecting anything in return so that other people can use the add-ons more easily. We sincerely thank all of them. Chinese Simplified (China), Chinese Traditional (Taiwan), Czech, Dutch (Belgium), Dutch (Netherlands), English (South Africa), English (UK), Finnish, French (France), Galician, German (Germany), Hungarian, Indonesian, Italian, Japanese, Korean (Korea), Persian, Russian, Slovak (Slovakia), Slovenian, Spanish (Argentina), Spanish (Chile), Spanish (Colombia), Spanish (Ecuador), Spanish (Mexico), Spanish (Spain), Spanish (Venezuela), Swedish, Turkish, Ukrainian == Installation == 1. Upload `wp-fastest-cache` to the `/wp-content/plugins/` directory 2. Activate the plugin through the 'Plugins' menu in WordPress 3. Permission of .htacces must 644 4. Enable this plugin on option page == Screenshots == 1. Performance Comparison 2. Other Performance Comparison 3. Without Cache 4. With Cache 5. Main Settings Page 6. Preload 7. New Post 8. Update Cache 9. Delete Cache 10. All cached files are deleted at the determinated time 11. Block caching for post and pages (TinyMCE) 12. Clean cached files via admin toolbar easily 13. Exclude Page 14. CDN 15. Enter CDN Information 16. File Types 17. Specify Sources 18. Database Cleanup == Changelog == = 1.4.6 = * [Improvement] Elementor element cache and CSS Print Method detection logic [Details] = 1.4.5 = * Sanitized the cache file path by trimming whitespace * [Improvement] Elementor element cache and CSS Print Method detection logic [Details] = 1.4.4 = * Updated caching behavior to serve URLs with Google Ads Click & Conversion Parameters query strings (e.g., /?gbraid) from the cache, improving performance = 1.4.3 = * Tested and confirmed full compatibility with WordPress 6.9 to ensure smooth and reliable plugin performance = 1.4.2 = * [Improvement] Updated the function modifying for url() paths in CSS * [Improvement] Enhanced the <pre> tag replacement logic for more accurate matching and reliable content updates = 1.4.1 = * Added display of orphaned post meta, comment meta, user meta, term meta, and term relationship counts * Added nonce verification and capability checks to the wpfc_db_fix AJAX action to prevent unauthorized database cleanup requests * Added a validation to ensure Elementor’s CSS Print Method is set to “Internal Embedding,” displaying an error with a help link if misconfigured [Details] = 1.4.0 = * Fixed: support both old (elementor_experiment-e_element_cache) and new (elementor_element_cache_ttl) Elementor cache options for compatibility = 1.3.9 = * [Improvement] Replaced manual <script> output in print_my_inline_script() with wp_print_inline_script_tag() for better compatibility and cleaner code * Fixed: RewriteCond syntax to correctly detect HTTPS connections = 1.3.8 = * Added a condition to exclude <script type="module"> tags from js combining * Fixed: Issue where the cache was not being cleared when a page was deleted * Fixed: PHP fatal error caused by an undefined function current_datetime() in cache.php on line 1130 * Added support for fetching and processing multiple pages of Cloudflare zones to ensure all potential matches are considered = 1.3.7 = * [Improvement] Serve cached content via .htaccess rules instead of PHP when URLs include the fbclid query string * [FEATURE] Added support for Spanish (Chile) and Ukrainian languages * to update translation files * to fix PHP Fatal error: Uncaught TypeError: method_exists(): Argument #1 ($object_or_class) must be of type object|string, array given in cdn.php:383 * [Improvement] Added specific handling for BunnyCDN 403 errors = 1.3.6 = * Prevented unnecessary cache deletion for pending comments marked as spam or moved to trash * Updated caching behavior to serve URLs with Google Merchant Center query strings (e.g., /?srsltid) from the cache, improving performance = 1.3.5 = * Updated cache creation time display to follow WordPress date and time format settings * Removed the 'Static CSS File Generation' warning when using the Divi theme. = 1.3.4 = * to fix PHP Fatal error: Class "VarnishWPFC" not found in preload.php * to fix Undefined property: stdClass::$total in preload.php on line 753 = 1.3.3 = * [Improvement] Toolbar style adjusted to align with WordPress standard for better consistency and user experience * to change the cache path for the Polylang-Pro plugin * [Improvement] Modified the toolbar menu of WP Fastest Cache plugin to improve usability and navigation * [FEATURE] Added a filter that allows users to easily remove the WP Fastest Cache menu from the admin toolbar [Details] = 1.3.2 = * [Improvement] Added a new action to handle the addition of keyword items in the Preload Wizard * Corrected typos in the Cloudflare CDN integration wizard and in the DB tab * [FEATURE] Added a filter to define the token for preload functionality [Details] = 1.3.1 = * [FEATURE] Added a filter that allows users to easily remove the cache creation comment from the footer [Details] * [Improvement] Added a warning notification to alert users if the "Element Caching" option in the Elementor plugin is not inactive [Details] * Refactored `remove_url_parameters()` for improved efficiency * Fix issue: Logic to determine the $number variable based on the WPFC_PRELOAD_NUMBER constant for preload when a sitemap is used = 1.3.0 = * Prevent caching of 403 Forbidden error pages * Fix issue: Exclude JS files with the "data-no-minify" attribute from the combining process * Fixed PHP Notice: Undefined index: HTTP_HOST in wpFastestCache.php on line 489 = 1.2.9 = * Refactored 'Clear Cache via URL' feature * Added feature to clear post cache triggered via URL [Details] = 1.2.8 = * refactoring for CSS minification feature * refactoring for Cloudflare Integration * to update translation files = 1.2.7 = * to fix the issue of backslashes being removed in the <pre> tag after minifying HTML = 1.2.6 = * refactoring for getABSPATH() * to prevent clearing cache after deleting coupon which was created by YITH WooCommerce Coupon Email System Premium * to check the REDIRECT_QUERY_STRING for the gtranslate plugin = 1.2.5 = * to fix the creation of cache for URLs that end with .xml * to use the native WordPress function current_time() instead of the date() function * refactoring the purge_cache() function of Varnish Cache = 1.2.4 = * refactoring for getABSPATH() * to fix PHP Deprecated: Creation of dynamic property CssUtilities::$url is deprecated in css-utilities.php on line 348 * to fix PHP Deprecated: Creation of dynamic property CssUtilities::$url_for_fix is deprecated in css-utilities.php on line 412 * to remove duplicate extensions in the <FilesMatch> directive for the browser caching feature = 1.2.3 = * Farewell, StackPath, and a warm welcome to BunnyCDN * to update translation files * to exclude script element from minification when data-no-minify attribute is set * [FEATURE] to add Slovenian language * refactroning of specificDeleteCache() = 1.2.2 = * Security Enhancements * to update translation files = 1.2.1 = * refactroning of the condition that was added for Divi theme * [FEATURE] Add a hook system for creating a post cache by id [Details] * to fix the issue of obtaining the latest version of the sitemap after a restart * to check if the intl extension is available for Cloudflare integration * to fix Warning: Undefined property: stdClass::$zone_id in cdn.php on line 227 = 1.2.0 = * to make the Preload feature to be compatible with Sitemap Index * to hide the premium tab for the premium users * to show warning if the Static CSS File Generation option of Divi theme is enabled * to update translation files * to fix PHP Warning: Undefined array key "sitemaps" in preload.php on line 62 * to change the cache path for the Polylang-Pro plugin * to check if the buffer has only one line (no line breaks) * refactoring of checkHtml() * to check that Cookie Notice & Compliance for GDPR / CCPA is active or not = 1.1.9 = * to add gear button for the preload feature * to remove image urls for sitemap preload * to fix PHP Deprecated: Required parameter in preload.php on line 576 * [FEATURE] Moving the menu item under the settings menu [Details] * to fix Warning: Undefined array key "action" in wpFastestCache.php on line 378 and 395 = 1.1.8 = * [FEATURE] to add Sitemap option for the preload feature [Details] * to update translation files * to fix PHP Warning: Attempt to read property "term_taxonomy_id" on bool in wpFastestCache.php on line 1638 = 1.1.7 = * to change the cache path for the Polylang plugin * [FEATURE] to add Korean (Korea) language * to update translation files * refactoring of is_amp() * to replace empty char which exist in the admin cookie with %20 for RewriteCond = 1.1.6 = * to update translation files * to fix problem that the first js source is not able to be excluded * refactoring of set_cache_file_path() * refactoring of Buffer Callback Filter [Details] = 1.1.5 = * to replace wp_remote_get() with wp_safe_remote_get() in the check_url() function * to update translation files * to fix PHP Warning: Undefined array key "roles" in wpFastestCache.php on line 962 * to remove multiple slashes from url * to fix PHP Warning: Attempt to read property “wpFastestCacheLanguage” on array in admin.php on line 23 = 1.1.4 = * to check trailing slash for query string cache * refactoring process of clearing homepage cache by cache timeout = 1.1.3 = * to change translation system [Details] * refactoring of delete_author_page_cache() * to add Czech, Dutch (Belgium), Galician, Hungarian, Indonesian, Japanese, Persian, Spanish (Colombia), Spanish (Ecuador), Spanish (Ecuador), Spanish (Venezuela), Spanish (Argentina), Spanish (Mexico) translations * to enable the toolbar settings wizard for the Multisite installation [Details] * to fix low level vulnerability = 1.1.2 = * to clear cache of next/prev posts after updating or publishing a post * to fix E_WARNING: file_get_contents(): No such file or directory in admin.php on line 377 * [FEATURE] Added ability to disable hook system [Details] * to fix PHP Deprecated: trim(): Passing null to parameter #1 ($string) of type string is deprecated in preload.php on line 546 * to fix Notice: Constant WPFC_CACHE_QUERYSTRING already defined = 1.1.1 = * [FEATURE] Varnish Cache Integration [Details] * to fix E_WARNING: unlink(): No such file or directory in wpFastestCache.php on line 1530 = 1.1.0 = * to show cache if the url contains a parameter of Yandex Click Identifier * [FEATURE] Excluding Yandex Click Identifier [Details] * [FEATURE] Adding "Regular Expression" option for the Exclude Pages feature [Details] = 1.0.9 = * to improve the style of exclude feature wizard * to fix hiding the toolbar when logged in * to fix PHP Notice: Undefined offset: -1 in js-utilities.php on line 67 * to fix PHP Fatal error: Uncaught Error: Non-static method cannot be called statically in clearing-specific-pages.php on line 58 = 1.0.8 = * to stop showing the "DONOTCACHEPAGE is defined as TRUE" comment in the footer for the ajax requests * [FEATURE] Clearing Specific Pages [Details] * to fix the site url on the exclude page * to fix PHP Notice: Function WP_User_Query::query was called incorrectly. User queries should not be run before the plugins_loaded hook = 1.0.7 = * [FEATURE] Clearing Specific Pages (BETA) [Details] * to add last-modified header when cache is served via php = 1.0.6 = * to serve sources via cdn for excluded pages if cdn is enabled * to fix PHP Notice: Undefined offset: -1 in js-utilities.php on line 48 = 1.0.5 = * to fix E_NOTICE: Undefined variable: path in wpFastestCache.php on line 2142 * to add excluding feature for Buffer Callback Filter [Details] = 1.0.4 = * to add avif extensions for cdn * to add WPFC_SERVE_ONLY_VIA_CACHE [Details] = 1.0.3 = * Photon will no longer be supported [Details] * to exclude category url for preload if any error occurs = 1.0.2 = * to add WP-CLI command for clearing cache of a post [Details] * to fix Warning scandir() at wpFastestCache.php:302 * to fix Warning file_put_contents(/cache/wpfc-minified/index.html) at cache.php:1090 * to fix Warning unlink(wp-cache-config.php) admin.php:885 = 1.0.1 = * to clear only cache of post/page even if the "update post" option is disabled = 1.0.0 = * to define the save_settings() function of single preload feature as static function EARLIER VERSIONS For the changelog of earlier versions, please refer to [the changelog on wpfastestcache.com] == Frequently Asked Questions == = How do I know my blog is being cached? = You need to refresh a page twice. If a page is cached, at the bottom of the page there is a text like "<!-- WP Fastest Cache file was created in 0.330816984177 seconds, on 08-01-14 9:01:35 -->". = Does it work with Nginx? = Yes, it works with Nginx properly. Since Nginx doesn’t use an .htaccess file, you need to enable the Gzip compression and Browser Caching features manually. You can follow these tutorials: How to Enable Leverage Browser Caching on Nginx and How to Enable Gzip on Nginx = Does it work with IIS (Windows Server) ? = Yes, it works with IIS properly. = Is this plugin compatible with Multisite? = Yes, it is compatible with Multisite. = Is this plugin compatible with Subdirectory Installation? = Yes, it is compatible with Subdirectory Installation. = Is this plugin compatible with Http Secure (https) ? = Yes, it is compatible with Http Secure (https). = Is this plugin compatible with Adsense? = Yes, it is compatible with Adsense 100%. = Is this plugin compatible with CloudFlare? = Yes, it is but you need to read the details. Click = Is this plugin compatible with qTranslate? = Yes, it is compatible with qTranslate 100%. = Is this plugin compatible with WP Hide & Security Enhancer? = Yes, it is compatible with WP Hide & Security Enhancer. = Is this plugin compatible with WP-PostViews? = Yes, it is compatible with WP-PostViews. The current post views appear on the admin panel. The visitors cannot see the current post views. The developer of WP-PostViews needs to fix this issue. = Is this plugin compatible with WooCommerce Themes? = Yes, it is compatible with WooCommerce Themes 100%. == Upgrade notice == ....PKL\xu wp-fastest-cache/index.htmlnu[Silence is golden.PKL\xu wp-fastest-cache/css/index.htmlnu[Silence is golden.PKL\ SF_ _ !wp-fastest-cache/css/flaticon.cssnu[@font-face { font-family: "Flaticon"; src: url("fonts/statics/flaticon.eot"); src: url("fonts/statics/flaticon.eot#iefix") format("embedded-opentype"), url("fonts/statics/flaticon.woff") format("woff"), url("fonts/statics/flaticon.ttf") format("truetype"), url("fonts/statics/flaticon.svg") format("svg"); font-weight: normal !important; font-style: normal !important; } [class^="flaticon-"]:before, [class*=" flaticon-"]:before, [class^="flaticon-"]:after, [class*=" flaticon-"]:after { font-family: Flaticon; font-size: 40px !important; font-style: normal !important; color: #ff8900 !important; }.flaticon-css4:before { content: "\e000"; } .flaticon-desktop1:before { content: "\e001"; } .flaticon-js:before { content: "\e002"; } .flaticon-smart:before { content: "\e003"; } @font-face { font-family: "Flaticon"; src: url("fonts/db/flaticon.eot"); src: url("fonts/db/Flaticon.eot?#iefix") format("embedded-opentype"), url("fonts/db/Flaticon.woff") format("woff"), url("fonts/db/Flaticon.ttf") format("truetype"), url("fonts/db/Flaticon.svg#Flaticon") format("svg"); font-weight: normal; font-style: normal; } @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: "Flaticon"; src: url("fonts/db/Flaticon.svg#Flaticon") format("svg"); } } [class^="flaticon-"]:before, [class*=" flaticon-"]:before, [class^="flaticon-"]:after, [class*=" flaticon-"]:after { font-family: Flaticon; line-height: 44px !important; font-style: normal !important; } .flaticon-check:before { content: "\f100"; color:#5cab40 !important; font-size: 25px !important;} .flaticon-counterclockwise:before { content: "\f101"; font-weight: bold; font-size: 35px !important;} .flaticon-draft:before { content: "\f102"; font-size: 35px !important;} .flaticon-file:before { content: "\f103"; font-weight: bold; font-size: 35px !important;} .flaticon-interface:before { content: "\f104"; font-weight: bold; font-size: 35px !important;} .flaticon-pingback:before { content: "\f105"; font-weight: bold; font-size: 35px !important;} .flaticon-recycling:before { content: "\f106"; font-weight: bold; font-size: 35px !important;} .flaticon-start-settings:before { content: "\f107"; color:#3498db !important; font-size: 30px !important;} .flaticon-technology:before { content: "\f108"; font-weight: bold; font-size: 35px !important;}PKL\uB:LLwp-fastest-cache/css/style.cssnu[/* Set the size and font of the tab widget */ .tabGroup { background: none repeat scroll 0 0 #F3F1EB; border: 1px solid #DEDBD1; padding: 10px; width: 750px; height: auto; float: left; box-sizing: unset; } .tabGroup div.questionCon{ width: 100%; float: left; padding-top: 5px; line-height: 18px; } .tabGroup select, .tabGroup label, .tabGroup div { font-size: 12px; box-sizing: unset; } .tabGroup > label{ font-weight: normal !important; margin-bottom: 0 !important; } div.inputCon label{ font-weight: normal !important; margin-bottom: 0 !important; } div.questionCon.qsubmit{ text-align: center; } .tabGroup div.questionCon.disabled{ color: #888; } .tabGroup div.question{ padding-right: 5px; float: left; text-align: right; width: 130px; font-weight: normal !important; background: none !important; } .tabGroup div.inputCon{ float:left; } /* Configure the radio buttons to hide off screen */ .tabGroup > input[type="radio"] { position: absolute; left:-100px; top:-100px; } /* Configure labels to look like tabs */ .tabGroup > input[type="radio"] + label { /* inline-block such that the label can be given dimensions */ display: inline-block; /* A nice curved border around the tab */ border: 1px solid #DEDBD1; border-radius: 5px 5px 0 0; -moz-border-radius: 5px 5px 0 0; -webkit-border-radius: 5px 5px 0 0; /* the bottom border is handled by the tab content div */ border-bottom: 0; /* Padding around tab text */ padding: 5px 10px; /* Set the background color to default gray (non-selected tab) */ background-color:#ddd; color: black; box-shadow: none !important; } /* Focused tabs need to be highlighted as such */ .tabGroup > input[type="radio"]:focus + label { border:1px dashed #DEDBD1; } /* Checked tabs must be white with the bottom border removed */ .tabGroup > input[type="radio"]:checked + label { background-color:white; font-weight: bold; border-bottom: 1px solid white; margin-bottom: -1px; } /* The tab content must fill the widgets size and have a nice border */ .tabGroup > div { display: none; border: 1px solid #DEDBD1; background-color: white; padding: 10px 0px; height: auto; overflow: auto; margin-top: -1px; border-radius: 0 5px 5px 5px; -moz-border-radius: 0 5px 5px 5px; -webkit-border-radius: 0 5px 5px 5px; } /* This matchs tabs displaying to thier associated radio inputs */ #wpfc-options:checked ~ .tab1, #wpfc-deleteCache:checked ~ .tab2, #wpfc-cacheTimeout:checked ~ .tab3, #wpfc-imageOptimisation:checked ~ .tab4, #wpfc-premium:checked ~ .tab5, #wpfc-exclude:checked ~ .tab6 , #wpfc-cdn:checked ~.tab7, #wpfc-db:checked ~.tab8{ display: block; } /* for lef panel */ #toplevel_page_wpfastestcacheoptions img{ margin-top: -7px !important; width: 30px !important; /* padding: 0 !important; margin-left: 5px !important;*/ } #toplevel_page_wpfastestcacheoptions div.wp-menu-name{ margin-left: 0 !important; } .question:after { content: ":"; padding-left: 5px; } .inputCon input[type="checkbox"]{ margin-right: 5px; } .get-info { float: left; padding-left: 10px; cursor: pointer; } #rule-help-tip { width: 500px; background: none repeat scroll 0 0 #FFFFFF; border: 1px solid #CCCCCC; border-radius: 8px 8px 8px 8px; box-shadow: 4px 4px 10px #CCCCCC; display: block; padding: 10px 10px 0; position: absolute; } #rule-help-tip h4 { color: #6397CB; margin-top: 0; font-size: 14px; letter-spacing: -1px; } h1.summary-rec { border-bottom: 0 none; color: #777777; font-size: 14px; font-weight: normal; letter-spacing: normal; margin: 0 0 0.5em; } .close-window { background: url("../images/close-wiz-sprite.png") no-repeat scroll 0 -19px rgba(0, 0, 0, 0); height: 19px; width: 22px; float: right; } .omni_admin_sidebar { float: right; font-family: "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif; font-size: 12px; margin-right: 30px; width: 400px; } .omni_admin_sidebar_section { background-color: #F6F6F6; float: right; width: 195px; padding: 0; border: none; margin-bottom: 15px; } .wpfc-sticky-notification main { overflow-x: hidden } .wpfc-sticky-notification { font-family: "Open Sans", -apple-system, blinkmacsystemfont, "Segoe UI", roboto, oxygen-sans, ubuntu, cantarell, "Helvetica Neue", sans-serif } .wpfc-sticky-notification, .wpfc-sticky-notification a { color: #0A1551 } .wpfc-sticky-notification { font-size: 16px; line-height: 1.4; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } .wpfc-sticky-notification img { max-width: 100%; vertical-align: bottom } .wpfc-sticky-notification a { text-decoration: none } .wpfc-sticky-notification main { width: 100%; position: relative; transition: all .3s } .wpfc-sticky-notification h5 { margin: 1rem 0 } .wpfc-sticky-notification h5 { font-size: 22px } .wpfc-sticky-notification .sticky-common-banner { transition: all .2s; background-color: #0A1551; box-shadow: 0 3px 10pc rgba(0, 0, 0, .1); border-radius: 0; z-index: 7020; left: 0; right: 0; bottom: 0; display: flex; flex-direction: column; align-items: center; overflow: hidden; width: 100% } .wpfc-sticky-notification .sticky-common-banner { background-color:#fff; left: initial; right: 8px; bottom: 16px; } .wpfc-sticky-notification .section-widget-footer.fixed+.sticky-common-banner { bottom: 88px } .wpfc-sticky-notification .sticky-common-banner .header { background-color: #0A1551; display: flex; flex-direction: column; align-items: center; width: 100%; padding: 16px 0 0 } .wpfc-sticky-notification .sticky-common-banner .header-logo { height: 42px; margin: 0 0 8px; } .wpfc-sticky-notification .sticky-common-banner .title { margin: 0 8px 16px; color: #fff; text-align: center; font-weight: 400; font-size: 14px; line-height: 16px } .wpfc-sticky-notification .sticky-common-banner .header-logo { display:block } .wpfc-sticky-notification .sticky-common-banner .visual { margin: 0; width: 100%; height: auto; display: none } .wpfc-sticky-notification .sticky-common-banner .main-cta { transition: all .2s; background-color: #78BB07; font-weight: 500; font-size: 14px; line-height: 16px; text-align: center; color: #FFF; border: none; box-sizing: border-box; padding: 16px 8px; margin: 16px; width: calc(100% - 48px); max-width: 240px } .wpfc-sticky-notification .sticky-common-banner .main-cta:hover { background: #88d408; border-color: #88d408; } .wpfc-sticky-notification .sticky-common-banner .visual { display:block } .wpfc-sticky-notification .sticky-common-banner .main-cta { padding: 16px; margin: 24px; width: calc(100% - 32px); max-width: initial } #wpfc-beta{ padding-right: 5px; font-weight: bold; color: red; } #deleteCron{ float:right; margin-right:5px; padding: 3px; } #deleteCron:hover{ background-color:#FAEBD7; } form.delete-line{ height: 100px; width: 100%; float: left; } form.delete-line .left{ width: 20%; float: left; } form.delete-line .right{ width: 80%; float: left; } form.delete-line .left .submit{ padding-top: 0; float: left; padding-left: 20px; } form.delete-line .left .submit input{ height: 65px; width: 130px; white-space: pre-line !important; } td div.revert:before{ font-family: "dashicons"; content: "\f531"; } td div.revert{ width:16px; height:16px; vertical-align: middle; margin: auto; position:relative; cursor:pointer; -moz-border-radius: 3px 3px; -webkit-border-radius: 3px 3px; border-radius: 3px 3px; border:1px solid #aaa; background:#ddd; padding:3px; background-color: white; } td div.revert:hover{ border-color:#000; background-color: white; } td div.revert:active{ background-color: #F5F5F5; } #revert-loader{ display: none; background: rgba(255, 255, 255, .7) url(../images/loader.gif) no-repeat center; position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 9998; } .wpfc-loading-statics{ background-repeat: no-repeat; background-image: url(../images/loader-statics.gif); background-position: 0 0; } div.wpfc-loading-statics{ height: 16px; } p.wpfc-loading-statics{ background-position: 44px 6px; height: 27px; } #wpfc-optimized-statics-reduction:not(.wpfc-loading-statics):after{ content: " KB"; } #wpfc-statics-right ul li{ height:35px; padding:0; margin-bottom:15px; width:150px; } #wpfc-statics-right ul:last-child{ padding-left: 10px; } #wpfc-statics-right ul:last-child li{ width: 220px; height: auto; } span.deleteicon { position: relative; } span.deleteicon input { padding-right: 16px; } span.deleteicon span { position: absolute; display: block; top: 0px; right: 5px; width: 16px; height: 16px; background: url("../images/search_reset.jpg") no-repeat scroll; cursor: pointer; } span.deleteicon span.cleared { background: none; } #wpfc-image-list-filter:-moz-focusring, #wpfc-image-per-page:-moz-focusring { color: transparent; text-shadow: 0 0 0 #000; } #buy-image-credit{ border: 1px solid; color: white; border-radius: 26px; background-color: rgb(61, 207, 60); cursor: pointer; padding: 5px 15px; margin-left: 5px; } .wpfc-exclude-rule-line{ float: left; width: 100%; height: 40px; } .wpfc-exclude-rule-line-left{ width: 100px; float: left; } .wpfc-exclude-rule-line-middle{ /*width: 400px;*/ float: left; } .wpfc-exclude-rule-line-add, .wpfc-exclude-rule-line-delete{ float: left; padding-top: 7px; cursor: pointer; width: 20px; } .wpfc-exclude-rule-line-delete{ display: none; } #integrationDiv { display: block; font-family: "Lucida Grande","Lucida Sans","Lucida Sans Unicode",Verdana,Tahoma,sans-serif; font-size: 13px; height: auto; line-height: 18px; max-height: 395px; overflow-x: hidden; overflow-y: auto; padding: 0; } .wpfc-csp-item, .wpfc-timeout-item, .wpfc-exclude-item, .int-item{ background: url(data:image/gif;base64,R0lGODlhAQAkANUAAAAAAP/////+//38/fb19vX09fDv8Pr6+/n5+vb29/Hx8u/v8Pv8/Pn6+vLz8vv7+vj49/T08/Pz8vLy8f/+/v38/Pn4+PHw8P7+/v39/fv7+/j4+Pf39/b29vPz8/Hx8fDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACEALAAAAAABACQAAAYiwICAgsFkMpUBQ/M4IBqWDYST6BAKhYjHIZkoPp8LaGEIAgA7) repeat-x scroll center bottom transparent !important; border: 1px solid #CCCCCC !important; } .wpfc-csp-item:hover, .wpfc-timeout-item:hover, .wpfc-exclude-item:hover, .int-item:hover{ border:1px solid #ccc; background:#f5f5f5 none repeat scroll 0 0 !important; } .int-item, .wpfc-timeout-item, .wpfc-exclude-item, .wpfc-csp-item { border-radius: 6px; cursor: pointer; margin-bottom: 7px; overflow: hidden; padding: 12px; float: left; width: 328.5px; } .int-item{ padding: 12px 8px 12px 12px !important; } .int-item-left{ margin-right: 7px; } .int-item:hover { background: none repeat scroll 0 0 rgba(135, 135, 135, 0.1); } .int-item h2 { font-size: 14px; margin: 0 0 3px; } .int-item p { color: #666; font-size: 11px; margin: 0; position: relative; padding-top: 3px; } .int-item img { float: left; margin-right: 12px; height: 45px; width: 45px; } .int-item .meta.isConnected{ background-image: url("../images/success.svg"); background-repeat: no-repeat; background-size: 24px; background-position: right; height: 24px; width: 100%; max-width: 100%; position: relative; top: -10px; } .int-item .meta.isConnected.pause{ background-image: url("../images/pause.svg"); } .int-item .meta.success{ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAADb0lEQVQ4Ea2VS0iUURTH7+v7dAwnLMhWjURRm4IeOtEmS4VQ6GFNUYFG+UCooDYlBAktCqIXRVEUvaggqVQoNzallGiboKIWvSha5MLSMZ2Z7746Z9JptLEHdQbmu9+95/+7595z7v0oSWOFDUTkFqwKTPQ7Qa7oIkN4kFIzw1r2mhHdrYXt6o/I7p7HTe8fNBA1FkHHdmxoXpHrnzhhCyV2D+PUT+xYD3gHldYmYik5MNAXvXB9ZUtPqlcqlFa1rZgjfFlHBeXLrDbEpgMOqykoKWdEWR1W0aGd54pbnsFQQpGEbutcOcdY3yXhOPNU7KcVpQYyqi0yBVFSPmE0WnlycTOCCcO/iraiyVq5J/4WiNuAAaAO9chBHi9sKBRT8qbucFyxVXsa+/7YDCGSc8q1hFQKkUeJ+yU770UXCxQEApzZPVb9YgPTTGOs7pADg8VK6lbmMIJ6anl9oKAywLL8Q0EmqN+mTfMYGiYHNsxa0zlg1KbzZS0dWulTylNR3EgOnAQPZggSWEfSQMgEeCRTODyC/ZBto02n9syGq0tvfaxuK893MsRexxE+a2ClwEEes8RZlArEtpbqHQaOZZMweHKYSEr5SA9GKs6WNH6oC4cWOBnuKeGKoFY/okIeA+pMFFL4WQNxKHLwq+eVgeMRjBb7OUQoY/FL8Z6va8+Wtr6pvR9aDrPcgOQsVPHRyUUeM5S8QqilFjNIldFPr5Tcfhnvj++HU3NG+DiRnursj3i7L667+6nmQflSSukx7rLpWo4GIgd5jBLZhS+4XAuHG4I6VNu+rvTi6qY+1RfdFx2M74qrWDUexar20DLGxEnhOrMMlFE6Qx6texjaSIm4OpIsyikxnuqF81d5uqTxDgmFOGls1FXhNaWCu4eFw2ablD0cBcbKIGoTG4pkdRtlI7h3aFZDvTl8MnHFlZpwqAz7ajrWz3eFOO644wNRr4GDPJ4zM2cgZ1q2FS4rSpRFggwJYsQH1Vy8IJ9FBaX13BFz8eSMZ1iGkOWGt4+utSbCwzM7wZ1008nMXJJ6meDszMWqgASMt2SYBS8VGYu1D3qf11wuvtcLu0AINrjwtuNtgw4jhqcMCv23QNShHjmoTUCxAdfWcy86tNmTMoxLSRY+DqYxHEc/9Ecd6kfcvmdn5A2e//vmT6L/9Rv1DasAwJ2jW2dLAAAAAElFTkSuQmCC') no-repeat scroll 0 0; height: 21px; width: 21px; position: relative; top: -8px; left: 312px; } .int-item .meta.warning{ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAlpJREFUOBGtlb9vE1EMx+333p3aQg8BAhYoUtOOHahEErEASf+ADjCDkGBjYGPsxsjABgNiAgmGDpVYmkIWlDCEASYKrfixAAKhS9JWee+esSNdiAJpSYKnnJ+/n/Pz2Q7CX+zZOTAZdeakUZM5giSPSuUQcIaA3pH3VQRdcb5efe9ffDj/HFwvAnsdG8XcsQl98AoDbiqFEcEfIewh8J5iDcmtRlK/P12qfunmdCtwo1ic2xeEtw1iISEWdkf2/Fb8rBHBEa01bevGdKn0ml0kYR3op4WFuXFjHiDqU5Z2w4nstwWogCh5te3cpROrqwIGeSF8LmYPBwrvDAoUrSQgOtELR3xqCcAYfehaYMKzg2Qo4tREJ3qD0VX5yPixUMgEQVjTSkWe6zisKa5v4n1sbWveGBXkuOCRTxLm/Xste1/uuZKSGDHPgPI5cWAUAR49wgXRHD9IxvytfQL09Rv4RoP1nqGEeRwbg+DiBQgXFwGDcGAo2Ra0lpfBPnwE0GzmuSVpFib3g56fb9+Itrd6b7b3szFtvV1ZAdxqzBoiXId6I5vUaqCnpgDHJ4bKVPTM4Z7FdQNIFdrZydrHT8CVyyPVlDk8TlQx4FVV8Qj4OAaKf+591b4RChSDPPOM87aKFMZaa+7T9oD1le12kPap8PSBzc366cwMGa2KozS/kSydXXqblJ7KmDqX/LhrXassy2EYE53oHcX3ZL+2KcdLL79bT9dl2wwKTreU6IUjSXVS47X1hgf3siO/FvAcdw76pC7nEifxohN9GtrZp6njf2/+lAuj/kf9ArVlQDDNYNOoAAAAAElFTkSuQmCC') no-repeat scroll 0 0; height: 21px; width: 21px; position: relative; top: -8px; left: 312px; } .int-item .app { float: left; /*padding-right: 10px;*/ width: 75%; } .int-item .app .more-info { cursor: auto; float: none; height: auto; margin-left: 10px; width: auto; } .int-item .meta { font-size: 11px; font-weight: bold; max-width: 100px; text-align: right; } .int-item .meta .developer { color: #333333; display: block; } #wpfc-premium-container{ overflow: hidden; } .wpfc-premium-step{ width: 246px; float: left; margin-left: 3px; } .wpfc-premium-step div{ float: left !important; } .wpfc-premium-step-header{ width: 100%; background-color: rgb(58, 158, 235); padding-top: 12px; padding-bottom: 11px; text-align: center; } .wpfc-premium-step-header label{ font-size: 17pt !important; color: white !important; font-weight: normal !important; margin-bottom: 0 !important; } .wpfc-premium-step-content{ font-size: 16px !important; line-height: 20px !important; padding-top: 25px !important; padding-left: 25px !important; height: 100px; } .wpfc-premium-step-footer p{ font-size: 15px !important; } .wpfc-premium-step-footer ul li{ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAUCAYAAACXtf2DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNDgwMTE3NDA3MjA2ODExOEMxNEJENkJCQTMxQTY0OSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowNDA0MUQ4RTAxMjUxMUUzQUNBOEExQjA5MUZCRkI2OCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowNDA0MUQ4RDAxMjUxMUUzQUNBOEExQjA5MUZCRkI2OCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjYzNDYwOTkyMEYyMDY4MTE4NzFGQ0NDRDhCOTMyRDhEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjA0ODAxMTc0MDcyMDY4MTE4QzE0QkQ2QkJBMzFBNjQ5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+U7CKjQAAAX1JREFUeNpiZFj/gYES8D+AH85m3PBREEj1AbEHEO8E4kIWBioBoOEaQGoBEJtDheKB+AcLlQx3AVKrgVgATSqCiQqGRwOpTVgMB4HjlFqQAcRLgJgTi9wXIC6hxIIqIJ6OR74AmACukmtBJRC34pGfDTR8LohBjgVlQNyGR/44EGfCODALhIHYFYj5CBheDMSdeOTvA3EI0PV/kS0wAOKTQLwLShvj0AxyVQ8ew0GRGg40/BmyIMiCSUCsDOWDMstmIFZH0xwHxNMI+C4KaPhpdEGQBWpoYpJAvAWIZaD8UCBeSMDwOKDhm7FJgCyYh0VcBYg3AHENEK8gYHgR0PDFODMisLADZZJj0LggFYDS+kR8CkA++A7ECVCaFJAPxBMJKYIl04tAnEiC4enQxMFArAUgsBKImwmo/woqIYF4FrEuQc/JdUC8DIfat0DsA3UIA7kWwCqKPWhiR4HYBIgPkJoKsFnwB4jDgHg5EL8A4jlA7A3ED8gpFQECDADtslAckBdkiwAAAABJRU5ErkJggg==") no-repeat scroll 0 2px transparent; padding: 3px 30px; font-size: 15px; } .wpfc-premium-step-footer{ padding-left: 25px; } .wpfc-premium-step-image{ width: 100%; height: 180px; text-align: center; } .wpfc-form-spinner, .wpfc-form-spinner-input-td, .wpfc-form-spinner-number, .wpfc-form-spinner-up, .wpfc-form-spinner-down{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;} .exclude_section_clear { background: none; border-bottom: 1px solid #e6e6e6; clear: both; float: left; marig-left: 1px; margin-bottom: 0px; margin-top: 16px; overflow: auto; position: relative; width: 97%; } .error-wpfc{ border-color: #D8000C !important; color: #D8000C !important; background: #FFBABA url("") no-repeat 10px !important; } .success-wpfc, .error-wpfc{ background-position: 10px center !important; padding-bottom: 5px !important; padding-top: 5px !important; } .success-wpfc{ border-color: #4F8A10 !important; color: #4F8A10 !important; background: #DFF2BF url("") no-repeat 10px !important; } .success-wpfc p, .error-wpfc p{ padding: 2px 2px 2px 0px !important; } /* input[type=checkbox]:checked:before { color: #e14d43;} */PKL\ wp-fastest-cache/css/toolbar.cssnu[#revert-loader-toolbar{ display: none; background: rgba(255, 255, 255, .7) url('data:image/gif;base64,R0lGODlhSwBLANUAAP////7+/v39/fz8/Pr6+vn5+ff39/b29vX19fT09PPz8/Ly8vHx8fDw8O/v7+7u7u3t7ezs7Ovr6+rq6unp6ejo6Ofn5+bm5uTk5OPj4+Li4uDg4N3d3dra2tjY2NfX19TU1NHR0c/Pz87Ozs3NzcfHx8XFxcTExMHBwbu7u7q6urW1tbS0tLGxsa+vr6ioqKenp6Kiop6enp2dnZycnJSUlJOTk4qKioCAgHd3d21tbWNjYwAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAAACwAAAAAQwBLAAAG/0CAcEgsGo/FAogVo8VYoAJySq1aj50mbcuNda7g8LXELZdL4rRaCDK7t6C13KrQvssxxXx/JN/daHyCQi9/bi+Dg4ZviVQFCpADSBaLbhZICB6aEnIUICOgoBx6SZVmUkUeNjusrDkqYgcfobSgG0Z2lTFGMq2+rDgaVwchtca3RCimWyhFvb+/OsJVs8bGl0OUy9hCLdDfOFUW1uSoQimmKUQS3+0tVJ/kxhNEBS6LLuYAKe3fOVMF5Fn7Ug/dnRT6ANzo943TEQUCjYU4YsEglxTciOhgCM0DEogRawG0QDIhEY4dP4akFWdPDpS+PB4ZsDIUBz41YLY6MIVDzf8REPiY0LmjBhWQIVvyeQlT5pQNK0nx8QBTxhWoAoMmGsrQKhgLxYyB4NkIgAam0d6JGTChw6cPGxqULSJCBo4dOW6kIDu3r9+/fPgCTjQgQ7wRITZIHSwHQthjkhirwSrvQ2TJYCCsvIn5yoDHEeV2rjLhJ8HRUzr8HHEZtZHVIxa7JgJb9mwhtW8bUf2ztW4ApWue/i3kc03RxIdoDsk5ORHK5Cw7N+KY3Abf04tjOJzYdnYjgr+LH/97AAW3I+Ai72vAgYQLFCIkEJDmAuhQY+cSoHChv/8LFSwQBnTWaDXIAf8l2J8DV0U1SAEKRsjgUTUptQd/ESpoEhE+1WTloBwIZqjgA1PQ9FNzcjwgYoT0PbSahWtguOJ/GwKAVE1TCFDAji0eMaOGKv00kREFqPjfAxtW8CONSARkWhECGBnhAz0KEcGS/mE3xGEh0TOEAO+tKEGVCWAJHxXj1KSPlCuSOMQAZnpHRDURZQQhlvoosKRDVBATETJDOGDmhIHOWAEBw9B5jBFKYlmBEYJmKAGiYUzA5QijGCGAmf1VKUSRCVKQgByPRNIkpxfUGMCOBWg5F6rZyfgjBdkxYCYD2Q3QqKGu3lbmj6OKZ+uKuJJ3wK7/VRCeeAEkEIGSFcgXwCBBAAAh+QQFCgAAACwIAAAAQwBDAAAG/0CAcEgsGouUTmgU6lCO0Kh0SgVAlqOsNgSper/VjHY8zoDPaOGEzM5O0nBqAdsehwrx/BFTb2P0gEMgfWwggYGEbYd6ColsClEXkpCLUI5kRxcpNJycL4aVRXSOIUYonaicLhGhQxuXWRtFp6mpMaytjbCUQiO1vy6tQhyXHEQKv8kjwgAfiR9FIMm/L8wAxHXGRSvTv7y52Foc30Mx3bUW1kMK7FLn6OpfL++o6fFVm/Sc914d+jQp+HmZR8+ewCkW6KE42O/cQoZeIBC0tQwimA0oXNB4sQKUxY8gQ7bSIBKMhxk6dqjMAQNBySgIZKicOVPHiZdGEOCgyVOlDLqcRGr0HHoT6IihQ3W4xHkD6dCALxE4HXoDp4epQ61i7al1K02cB7zOrMpU7A6oL0WI1XEAKAChW024BXBg59Sfc+nKTCo37xAPMlKufNHW7xGShhPfSxCBwgUJDgwoBrCggqTLkp4YdoC5s6TCbjl79owHaIHRozXjfIB6NOiSrUc/wHk6dmfVImvbxkx7N+YKQH1fxvXSsfAEQBUIvzBXgm9yLy3HdmDYOWrqiRMYv/yg9GQABcInDgIAIfkEBQoAAAAsAAAIAEsAOwAABv9AgHBILBqPyKQSoGgWltCodDpUcEZYLIhC7Xqlm6wY+zl8z2hheDwOmdNwqYVN/8TvygJ9b8H7ixN7dCB/hQAdgnRPhnghiWwKjHiPkJJ3IJRikZZwV5lYnHEQnyMcoXGYmZunaAqZG6yij7CxcQepbX21eA0bHyMgHRO7xMXGx2cRUQwUF84VDovIQhcoMTTYLyVIBxXO398O0wAo2ObmMR1FDuDtzhLILufz2ChDB+75D8Yp9P7qALzlc2eA2AZ//mIASDAwn7JdKxD6AxGhYT5iEv2tsJhP2ikLGf1xdOcxFMiQ80a2K8npJEpzFVU6w/gS2wqGMh/WiliTkMCqkQV3HXypEAC+kfuK9UMJEAA7i/COyctoj0i3geKmlUvYtAizb9BYGrNgzZy2caLQql3LVsqIGTh25LihAkHbKBpy7NjLd4eOFneVnOhLeK+MwEc8FF58GDERvYsLe3AsxETkxTUoA6hxebFdx5A7953sWLRkyjpMj6Z8QzVfnYFTuJarOcJswJpbqMaheYgM0To09PZ9GYfw4UM8cO6bIwXyIwc8SIe9JAgAIfkEBQoAAAAsCAAIAEMAQwAABv9AgHAoLBiJyKRyyWw6AQnKZTp9FJ7YrHYooXqnjq14TKx8z2GyGts9nxXr+FLhrsvvRGn9nMDj924RfnIFgGcVg3GFhl+Ja4uMUxSOa5FUD5RqD5YXB5lkkIaTn2QOkVekpYaeqWoKZmejrXEJEVISDgazu7y9vr9arMBjChshI8ggGcNaG8jPzyEQzE4f0NfIG9RLHNje09tEDd7eIeFEHeTeE+dC6t4d7Qrv3vL02Pb30O0A+s/x7dL5Y9dunD5z/AB0uwcuobV32hIOcVauoUQhxY4lw3CxibCOIEOq2YDCBY0XLECIBBDhBY2XMGnEIAGyQ8ybL1FcvICzp864hC574rzAz6ZQnCn4pTjak19QpjEttELgoSoCJlBxSv3kwcaOr19teFASI2vUTAhqgF37tcZVIivMwoTjCAEOtnhxvBUCQu7JTGrx4q1BRIHfEZQ8CF48dsgIsy4yyVgsWAYSFFBjWBykgzJeHUkwC3Wx2Q8Cz4L3DrGwNOYLlVxR422sxIJtuqlks+WXQ/fXHE5973jBL0Jn2ToEKdWdVOIL1MQ7mjjOVocJkQdS3Ois40aKj46CAAAh+QQFCgAAACwIAAAAOwBLAAAG/0CAcEgsGouJSOVSiSSO0Kh0WjwsL9hs5UDteqGMrFjM+Jq9ibEa+zy7ode1uPKuE8Nyddlep+TVFHx1f2uCbgWEagWGZ4ljjGdxiXSQXw6OWA6VX4iYi5teD44PoGYShBKlZ6JypKpnBaxZD5+vbwW4trq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvcxAgqNzk7ODMjtg0bHyMgHYFRLTo78vM7ORqgByAj+/wjIRdHZNAbKO9EJQj9Eu7bUEQgQYIeGClQSJGhEA8PH+ZgpI+iQgVCamR8aEIQQo8KOQBAMPJhDUEcUFIEgLHlwI18Osrsp6CmTcV6UrJI2fnR588dOo5cSEGjadMUAI2EIMozwtF5N4wwdcqVRgojHajyWyTu6lciLrqqdVFkgth1Qlpc3RGByFa1Xc8KKfDWwhAcR1sQuYC3cFQhFqh+IKIhXksZRVAUxouiyIadIbgwBpwRcpEYk9XGMHLZ4wfNWsvOqxHRSGi8RxTE7AdiApUIHnKjLmLhtVq/UBQIr8XId1dhL4w3fSGshHIaJYQpAO07BkhhIIyDKOY8dHRjHah3jdFBGYgVoGOs2M4oCAAh+QQFCgAAACwAAAgAQwBDAAAG/0CAcEgsGo/IpBJQaC6f0Oiy8LhYrZSEdMtNOq5gq6RL7n7D4Up5/VSg32O23PiuK+Z4QKL+puTnEXxvf3IVgmgFhGuHiIplFIxgiY5dVZFWlGQHlxcPmWSQkZOfWwWRDqSah6ipj28Vd61rBg4SFxQRWrK7vJ8avWwIMDk7xTozHsBbJzrFzs4yCMpPMs/WxTjS00gn194120cIzd7XI+FFKeXeN+hEN+ve2u7x3snuAPXX9/T6z/zo4PkrdgAfAHUD2xk8QE6fCINCTPgDB1FItXg4ClaM2NCaDI0bhRx4QcyYDIAhi/xKybJlLxAsXtBwgWKDSwAkYtDYyZPGi8AILFH0HLqzQ0ihRIleqHghadIXFVM4TWrU4NSkKQxauEoUKr6tXIcqUUC2FdiwO2McUcBhhFu3HGJRUoCW5wojbd/qHcHhk8y6IIp82Ev4Q6YRdWnIBZCX8N6+lFygPTdEgePLi/9A0HkVRZENlx3bpARBslPPRUKEJhyCFIi/PFNYOLLacSsFFnInsVx7b+ZtvfdCBBHcbWCDGIqPwACxgOreIUbhmxB8Qsjkq5mnhPB8bwgINyd0UB2ig3U8QQAAIfkEBQoAAAAsAAAIAEsAOwAABv9AgHBILEo8SERxyWw6n9CoKrerVm2eqHbLfWpw1nBV1i2boRqdeE0+u9/g9br1rndb8rzEzodS82spfYNLEoByN4SKQh6HazqLio2OYpGEk5RVOZaDB5lWNZyDNZ87JqJ9mI6bqH0ymVmtro6nsoMtams5GraKByk3VDgyIr3Gx8jJURHKiiUvNNExKBfNRQUOFRfbFAxNHTHR4uIo1kIO2+npFQdFKOPw0S7WEur22w5DHfH8gskP9wK2AxCOX7wNyAwEDFgBAAiD/FYgi7AwYIIVEPkhqxgwQkZ+FowV4BjwY7yQvUaStGcSHkpbKlemw9gy2kaZ2yI8rCnxGEWvnAkI1kR4TKHMhgD2mfSHDODKgQDeZZzXrB7HfETAGSxnDh1DqEWeiZv20hw2bdy8RYFgrq3bt8codAAx4sOGBnC7XAgxoq/fESDA5m2y4a/hvmwHEz7MWIHiJQoYMwbxuAgHyYwTVwaAmTGHzQAidzZMebPo0X9Bn0Y9IgToAqz9dgDtMPaICbQt2C5AG8AH1mU3H+DbmWhvAAd+SzZ+XMgEun85OG6+pICC65uDAAAh+QQJCgAAACwAAAAASwBLAAAG/0CAcEgsGo9FhOqm2+luKgRySq1ar8JTc8ft6k7YsHgMgHXPZxh5zSam0HBuqk0XS7bxs05S71dfeXEvfoRHOYFwOYWLQ4hxjGEKF5NTHo5wHpBVIC80np4pF0YHl2gHmkgRLp+snihGeJc6qEcRMa24r0QypVwytEaruLgjRJa9mcBDI8PNCkQ1pTXKRJ3NuCBEBziOOKfUAArXwytFB9F5Nd/gFuO4MUce6F01yeBC7e6tUwce/uv38OljNSggmYGf5hgckwIhjQ4Lx+TTVzCiGBQDLVgkg3EcxI1kRtzC9QICyDYgVnRygWLDyZcwY9IBKHNMBhAjcobY8KzmFc4IIXIKFerSJ5UNQ5Pm/GAUCQSlUDk0NRIUqtIGU4dMsAr1Y9YOXKFmFRIWas+pZZWebZo26VqjYNvmHAtgq1yvWaumxUr3aVqpdIUgDcs08BCgVosaJoIBp06ei/lFnky5shgDDiRcoBAhgWUAFCaJnlRhweQDo1NPcrC4gOrXrAOHfq26AF3UtFU/oPsg92u6s32Ptp1VeO2xFYwPHxtBuWi6CZxvDiz9bVNJxvkYdiC8wmTutLVPLtB7NAXPnwEUWJ++vfv38OPLn78xCAA7') no-repeat center; position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 9998; } #wp-admin-bar-wpfc-toolbar-parent * { cursor: pointer !important; } /*@supports not (-ms-high-contrast: none) { #wp-admin-bar-wpfc-toolbar-parent > .ab-empty-item::before{ content: url("../images/icon.svg"); } }*/PKL\=11"wp-fastest-cache/css/buycredit.cssnu[ .fakeHeader{/*padding-bottom:5px*/}.fakeHeader h1, .fakeHeader .title-h1{display:none}header .subContent{width:960px;margin:0 auto;padding-top:32px;padding-bottom:18px}#container{width:960px;margin:0 auto;padding-bottom:70px;position:relative}.mainContent{float:left;width:570px;padding:25px 30px 30px 30px;background-color:#fff;margin-bottom:70px}.rtl .mainContent{float:right}.sideContent{width:240px;padding:10px 30px 15px 30px;float:right;background-color:#fff;margin-bottom:70px;z-index:9;position:relative;top:auto;left:auto;margin-left:0;border:1px solid white}.rtl .sideContent{float:left;margin-right:0}#frameContent{width:100%}@media only screen and (min-width: 768px) and (max-width: 959px){body{min-width:768px;height:auto;background-image: -ms-linear-gradient(top, #FFF 0%, #F3F8FA 100%);background-image: -moz-linear-gradient(top, #FFF 0%, #F3F8FA 100%);background-image: -o-linear-gradient(top, #FFF 0%, #F3F8FA 100%);background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #FFFFFF), color-stop(1, #F3F8FA));background-image: -webkit-linear-gradient(top, #FFF 0%, #F3F8FA 100%);background-image:linear-gradient(top, #FFF 0%, #F3F8FA 100%)}header .subContent{width:720px}#container{width:720px}.mainContent{width:390px}.sideContent{width:180px}}@media only screen and (max-width: 767px){html,body{background:#fff;height:auto}body{min-width:0}header{display:none}.fakeHeader{display:block;width:auto;height:100%;margin-bottom:10px;padding-top:0}.rtl .fakeHeader{float:right}.fakeHeader h1, .fakeHeader .title-h1{display:block}.fakeHeader h1, .fakeHeader h2, .fakeHeader h3, .fakeHeader h4, .fakeHeader h5, .fakeHeader h6, .fakeHeader .title-h1, .fakeHeader .title-h2, .fakeHeader .title-h3, .fakeHeader .title-h4, .fakeHeader .title-h5, .fakeHeader .title-h6{margin-bottom:0}header .subContent{width:auto}#container{width:320px;padding-bottom:30px}.mainContent{width:280px;padding:19px 20px 20px 20px;margin-top:1px;margin-bottom:20px}.rtl .mainContent{float:none}.sideContent{float:none;width:100%;padding:0;padding-bottom:20px;margin:0}.rtl .sideContent{float:none}}.fixme{_position:absolute;top:0;_top:expression(eval(document.body.scrollTop))}footer{z-index:10}#orderDetails{position:relative;opacity:0;filter:alpha(opacity=0)}#orderDetails table{width:100%}#orderDetails table tfoot tr.totalRow{background-color:#fff}#orderDetails table.highlight tfoot tr.totalRow{background-color:#8cdbf8}#orderDetails table th, #orderDetails table td{height:18px;padding-top:15px;padding-bottom:15px;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:#e7f1f5;border-collapse:separate;color:#333534;font-size:16px;line-height:20px;font-weight:400;vertical-align:top}#orderDetails table th{padding-right:10px;text-align:left}.rtl #orderDetails table th{padding-left:10px;padding-right:0;text-align:right}#orderDetails table td{text-align:right}.rtl #orderDetails table td{text-align:left}#orderDetails table thead tr th{padding-top:14px;padding-right:0;padding-bottom:5px;line-height:24px;border-bottom:none}.rtl #orderDetails table thead tr th{padding-left:0}#orderDetails table thead tr.totalRow .yourOrder{font-size:24px;font-weight:400}* html #orderDetails table thead tr th .yourOrder{float:left}*:first-child+html #orderDetails table thead tr th .yourOrder{float:left}#orderDetails table thead tr th .orderNumber{display:block;clear:left;padding-top:4px;padding-bottom:4px;font-size:16px;line-height:16px;font-weight:400}#orderDetails table thead tr th .changeOrder{float:right;padding:10px 0 0 0;font-size:16px;line-height:16px;font-weight:400}.rtl #orderDetails table thead tr th .changeOrder{float:left}#orderDetails table thead tr th .changeOrder a{font-weight:400}#orderDetails table thead tr th span.totalPrice{display:none;opacity:0;filter:alpha(opacity=0)}#orderDetails .toggleOrder{display:none}.vatRowHidden{display:none}#orderDetails table tfoot tr th, #orderDetails table tfoot tr td{border-bottom:none;font-weight:600}#orderDetails table tr.totalRow th .title-h3 .icon{display:none}#orderDetails table tr.discountRow th, #orderDetails table tr.discountRow td, #orderDetails table tr.extraProductRow th, #orderDetails table tr.extraProductRow td{color:#EC008C}#orderDetails table tfoot tr.vatMessageRow{display:none}#orderDetails .sideMessage{display:none;position:absolute;top:auto;right:0;left:0;width:180px;margin:14px 0 0 -1px;padding:13px 30px;background-color:#D9F3FD;font-size:14px;line-height:18px;font-weight:400;text-align:left;z-index:100;border:1px solid white}.rtl #orderDetails .sideMessage{text-align:right}#orderDetails .sideMessage .arrow{position:absolute;top: -11px;left:0;width:18px;height:12px;z-index: -190;background:url("../images/icons/icons-sprite.png") no-repeat;background-position: -90px 0}.sideMessage .arrow::before, .contextNotification .arrow::before{content:"";display:block;width:14px;height:14px;background-color:#d9f3fd;border-color:#d9f3fd;border-style:solid;border-left-width:1px;border-top-width:1px;border-right-width:0px;border-bottom-width:0px;top:22px;position:relative;-webkit-transform:translate(2px, -16px) rotate(45deg) skew(10deg, 10deg);-moz-transform:translate(2px, -16px) rotate(45deg) skew(10deg, 10deg);-ms-transform:translate(2px, -16px) rotate(45deg) skew(10deg, 10deg);-o-transform:translate(2px, -16px) rotate(45deg) skew(10deg, 10deg);transform:translate(2px, -16px) rotate(45deg) skew(10deg, 10deg);border-right-width:0px;border-bottom-width:0px;z-index: -100}.vatTooltip{width:18px;height:18px;display:inline-block;margin:1px 8px 3px 8px;vertical-align:middle;overflow:hidden;border:1px solid white;border-radius:15px;cursor:pointer}.vatTooltip:hover{border-width:2px;margin:0px 7px 2px 7px}button.vatTooltip{background-color:transparent;padding:0;width:20px;height:20px}button.vatTooltip:hover{width:22px;height:22px}button.vatTooltip::-moz-focus-inner{border:0;padding:0}.vatTooltip:before{content:url("../images/icons/icons-sprite.png")}.vatTooltip{*background:url("../images/icons/icons-sprite.png") no-repeat}.rtl .vatTooltip{margin:0 7px 2px 7px}.vatTooltip:hover:before{left: -18px;position:relative}.vatTooltip:hover{*background-position: -18px 0}.vatTooltip:active:before,.vatTooltip.visible:before{left: -36px}.vatTooltip:active,.vatTooltip.visible{*background-position: -36px 0}@media only screen and (min-width: 768px) and (max-width: 959px){#orderDetails table th, #orderDetails table td{font-size:14px}#orderDetails table thead tr th{padding-bottom:9px}#orderDetails table thead tr th .changeOrder{clear:left;float:left;padding:3px 0 0 0}.rtl #orderDetails table thead tr th .changeOrder{clear:right;float:right}#orderDetails table tfoot tr.changeOrder{display:none}#orderDetails .sideMessage{width:120px}}@media only screen and (max-width: 767px){#orderDetails{}#orderDetails table{border-bottom:1px solid #c5d9e1;border-collapse:separate;background-color:#e7f1f5}#orderDetails table thead tr.totalRow{background-color:#e7f1f5}#orderDetails.css3 table thead tr.totalRow{-webkit-transition:background-color 0.5s ease-in-out;-moz-transition:background-color 0.5s ease-in-out;-ms-transition:background-color 0.5s ease-in-out;-o-transition:background-color 0.5s ease-in-out;transition:background-color 0.5s ease-in-out;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}#orderDetails table.highlight thead tr.totalRow{background-color:#8cdbf8}#orderDetails.css3 table.highlight thead tr.totalRow{-webkit-transition:background-color 0.2s ease-in-out;-moz-transition:background-color 0.2s ease-in-out;-ms-transition:background-color 0.2s ease-in-out;-o-transition:background-color 0.2s ease-in-out;transition:background-color 0.2s ease-in-out;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}#orderDetails table.open.highlight thead tr.totalRow{background-color:#e7f1f5}#orderDetails table tfoot tr.totalRow, #orderDetails table.highlight tfoot tr.totalRow{background-color:#e7f1f5}#orderDetails table.highlight tfoot tr.totalRow{background-color:#8cdbf8}#orderDetails table tr th, #orderDetails table tr td{height:24px;padding-top:6px;padding-bottom:6px;font-size:18px;line-height:24px;border:none}#orderDetails table th{padding-right:5px;padding-left:20px}.rtl #orderDetails table th{padding-left:5px;padding-right:20px}#orderDetails table thead th{padding-right:20px}.rtl #orderDetails table thead th{padding-left:20px}#orderDetails table td{padding-right:20px}.rtl #orderDetails table td{padding-left:20px}#orderDetails table thead tr th, #orderDetails table thead tr td{padding-top:10px;padding-right:20px;padding-bottom:9px;font-size:18px;font-weight:600;line-height:24px}.rtl #orderDetails table thead tr th, .rtl #orderDetails table thead tr td{padding-left:20px}#orderDetails table thead tr.totalRow .yourOrder{font-size:18px;font-weight:600}#orderDetails table thead tr.totalRow th .yourOrder .icon:before{content:url("../images/icons/icons-sprite.png");left: -91px;top: -129px;position:relative}#orderDetails table thead tr.totalRow th .yourOrder .icon{overflow:hidden;display:inline-block;width:14px;height:7px;margin:10px 0 0 6px;vertical-align:top;*background:url("../images/icons/icons-sprite.png") no-repeat -92px -129px}.rtl #orderDetails table thead tr.totalRow th .yourOrder .icon{margin:10px 6px 0 0}#orderDetails table.open tr.totalRow th .yourOrder .icon:before{content:url("../images/icons/icons-sprite.png");left: -210px;top: -129px;position:relative}#orderDetails table.open tr.totalRow th .yourOrder .icon{background-position: -211px -129px}#orderDetails table thead tr th .orderNumber{float:right}.rtl #orderDetails table thead tr th .orderNumber{float:left}#orderDetails table thead tr th .changeOrder{display:none}#orderDetails table thead tr th span.totalPrice{display:inline-block;float:right}.rtl #orderDetails table thead tr th span.totalPrice{float:left}#orderDetails table thead tr th span.totalPrice{opacity:1}#orderDetails.css3 table thead tr th span.totalPrice{filter:alpha(opacity=100);-webkit-transition:opacity 0.4s ease-in-out;-moz-transition:opacity 0.4s ease-in-out;-ms-transition:opacity 0.4s ease-in-out;-o-transition:opacity 0.4s ease-in-out;transition:opacity 0.4s ease-in-out;-webkit-transition-delay:0.2s;-moz-transition-delay:0.2s;-ms-transition-delay:0.2s;-o-transition-delay:0.2s;transition-delay:0.2s}#orderDetails table.open thead tr th span.totalPrice{opacity:0;filter:alpha(opacity=0)}#orderDetails.css3 table.open thead tr th span.totalPrice{-webkit-transition:opacity 0.4s ease-in-out;-moz-transition:opacity 0.4s ease-in-out;-ms-transition:opacity 0.4s ease-in-out;-o-transition:opacity 0.4s ease-in-out;transition:opacity 0.4s ease-in-out;-webkit-transition-delay:0.1s;-moz-transition-delay:0.1s;-ms-transition-delay:0.1s;-o-transition-delay:0.1s;transition-delay:0.1s}#orderDetails table tbody, #orderDetails table tfoot{opacity:0;filter:alpha(opacity=0)}#orderDetails.css3 table tbody, #orderDetails.css3 table tfoot{-webkit-transition:opacity 0.3s ease-in-out;-moz-transition:opacity 0.3s ease-in-out;-ms-transition:opacity 0.3s ease-in-out;-o-transition:opacity 0.3s ease-in-out;transition:opacity 0.3s ease-in-out;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}#orderDetails table tbody tr th, #orderDetails table tbody tr td, #orderDetails table tfoot tr th, #orderDetails table tfoot tr td{height:0px;line-height:0px;padding-top:0px;padding-bottom:0px;overflow:hidden}#orderDetails.css3 table tbody tr th, #orderDetails.css3 table tbody tr td, #orderDetails.css3 table tfoot tr th, #orderDetails.css3 table tfoot tr td{-webkit-transition:height 0.3s, line-height 0.3s, padding-top 0.3s, padding-bottom 0.3s ease-in-out;-moz-transition:height 0.3s, line-height 0.3s, padding-top 0.3s, padding-bottom 0.3s ease-in-out;-ms-transition:height 0.3s, line-height 0.3s, padding-top 0.3s, padding-bottom 0.3s ease-in-out;-o-transition:height 0.3s, line-height 0.3s, padding-top 0.3s, padding-bottom 0.3s ease-in-out;transition:height 0.3s, line-height 0.3s, padding-top 0.3s, padding-bottom 0.3s ease-in-out;-webkit-transition-delay:0.2s;-moz-transition-delay:0.2s;-ms-transition-delay:0.2s;-o-transition-delay:0.2s;transition-delay:0.2s;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}#orderDetails table tbody.android2 tr th, #orderDetails table tbody.android2 tr td, #orderDetails table tfoot.android2 tr th, #orderDetails table tfoot.android2 tr td{display:none}#orderDetails table.open tbody, #orderDetails table.open tfoot{opacity:1;filter:alpha(opacity=100)}#orderDetails.css3 table.open tbody, #orderDetails.css3 table.open tfoot{-webkit-transition:opacity 0.2s ease-in-out;-moz-transition:opacity 0.2s ease-in-out;-ms-transition:opacity 0.2s ease-in-out;-o-transition:opacity 0.2s ease-in-out;transition:opacity 0.2s ease-in-out;-webkit-transition-delay:0.3s;-moz-transition-delay:0.3s;-ms-transition-delay:0.3s;-o-transition-delay:0.3s;transition-delay:0.3s;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}#orderDetails table.open tbody tr th, #orderDetails table.open tbody tr td, #orderDetails table.open tfoot tr th, #orderDetails table.open tfoot tr td{height:24px;line-height:24px;padding-top:6px}#orderDetails.css3 table.open tbody tr th, #orderDetails.css3 table.open tbody tr td, #orderDetails.css3 table.open tfoot tr th, #orderDetails.css3 table.open tfoot tr td{-webkit-transition:height 0.3s, line-height 0.3s ease-in-out;-moz-transition:height 0.3s, line-height 0.3s ease-in-out;-ms-transition:height 0.3s, line-height 0.3s ease-in-out;-o-transition:height 0.3s, line-height 0.3s ease-in-out;transition:height 0.3s, line-height 0.3s ease-in-out;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}#orderDetails table.open tbody.android2 tr th, #orderDetails table.open tbody.android2 tr td, #orderDetails table.open tfoot.android2 tr th, #orderDetails table.open tfoot.android2 tr td{display:table-cell}#orderDetails table.open tbody tr th, #orderDetails table.open tbody tr td{padding-bottom:6px}#orderDetails table.open tfoot tr th, #orderDetails table.open tfoot tr td{padding-bottom:10px}#orderDetails table tfoot tr.vatMessageRow{display:table-row}#orderDetails table tfoot tr.vatMessageRow td{padding-left:20px;font-size:12px;font-weight:normal;text-align:left}.rtl #orderDetails table tfoot tr.vatMessageRow td{text-align:right}#orderDetails table.open tfoot tr.vatMessageRow td{line-height:18px}#orderDetails table tfoot tr.changeOrder td{padding:0 20px;font-size:14px;text-align:left}#orderDetails table.open tfoot tr.orderDetails td{line-height:14px}.toggleOrder{display:block !important;position:absolute;background:transparent;border:0;top:0;left:0;width:100%;height:45px;outline-width:0;outline:none;z-index:998}button.toggleOrder::-moz-focus-inner{border:0;padding:0}button.toggleOrder:focus{border:2px solid #c5d9e1}#orderDetails .sideMessage{position:relative;width:auto;height:100%;margin: -15px 20px 25px}#orderDetails .sideMessage .arrow{position:absolute;z-index:999}#orderDetails .currencySelector{display:none}.vatTooltip{display:none}}body{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%}footer p{margin:0}p.dummyContent{font-size:14px;line-height:35px;color:#8BACDA}strong,b{font-weight:bold}small{font-size:0.79em}iframe{width:100%;overflow-y:hidden}.floatl{float:left}.floatr{float:right}.hidden{display:none}.noTablet{display:block}.noMobile{display:block}.mobile .noMobile{display:none !important}.noDesktop{display:none}.pageView{display:none}#loader{height:280px;background-repeat:no-repeat;background-position:50% 50%}#overlayBg{display:none;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background-color:#e7f1f5;opacity:0.9;filter:alpha(opacity=90);z-index:997}.overlayHiddenContent{display:none !important}.overlayMessage{display:none;position:absolute;top:200px;left:50%;width:296px;padding:28px 34px;margin:0 0 0 -180px;background-color:#fff;z-index:998;border:1px solid white}p.notification{position:relative;margin-bottom:35px;padding:14px 22px 16px 60px;overflow:hidden;border:1px solid white}.rtl p.notification{padding:14px 60px 16px 22px}.notification.alert{background-color:#fcdcde}.notification.warning{background-color:#ffeed9}.notification.success{background-color:#ecf5d9}.notification.info{background-color:#d9f3fd}.notification strong, .notification b{display:block}.notification .icon{display:block;height:25px;width:27px;position:absolute;left:16px;overflow:hidden}.notification .icon{*background:url("../images/backgrounds/misc-elements-sprite.png") no-repeat}.notification .icon:before{content:url("../images/backgrounds/misc-elements-sprite.png");position:relative;left: -34px}.rtl .notification .icon{right:16px}.notification.alert .icon:before{top: -191px}.notification.warning .icon:before{top: -220px}.notification.info .icon:before{top: -248px}.notification.success .icon:before{left:0px;top: -248px}.notification.alert .icon{*background-position: -34px -191px}.notification.warning .icon{*background-position: -34px -220px}.notification.info .icon{*background-position: -34px -248px}.notification.success .icon{*background-position: -64px -248px}.messageContainer p{position:relative;margin-bottom:19px;padding-left:60px;padding-top:4px;font-weight:200;font-size:24px;line-height:30px;min-height:37px}.rtl .messageContainer p{padding-left:0;padding-right:60px}.messageContainer p strong{font-weight:600}.messageContainer .last{margin-bottom:43px}.messageContainer .icon{display:block;position:absolute;left:0;top:0;width:41px;height:41px;overflow:hidden}.messageContainer .icon{*background:url("../images/backgrounds/misc-elements-sprite.png") no-repeat}.messageContainer .icon:before{content:url("../images/backgrounds/misc-elements-sprite.png");position:relative;left: -19px}.rtl .messageContainer .icon{left:auto;right:0}* html .messageContainer .icon{margin-left: -60px}.messageContainer .successful .icon:before{top: -444px}.messageContainer .email .icon:before{top: -485px}.messageContainer .pending .icon:before{top: -526px}.messageContainer .error .icon:before{top: -567px}.messageContainer .successful .icon{*background-position: -19px -444px}.messageContainer .email .icon{*background-position: -19px -485px}.messageContainer .pending .icon{*background-position: -19px -526px}.messageContainer .error .icon{*background-position: -19px -567px}.messageContainer .button{float:right}.pagination{height:100%;overflow:hidden}.pagination .next{float:left;text-align:left;margin-right:30px}.rtl .pagination .next{float:left;text-align:left}.pagination .prev{float:left;text-align:left}.rtl .pagination .prev{float:right;text-align:right}.confirmationChild .extraMargin{margin-bottom:27px}.confirmationParent .messageContainer{margin-bottom:41px}.confirmationParent iframe{width:100%}.confirmationParent .pagination{padding-top:26px}.confirmationChild body{background-color:#e7f1f5;padding:30px;padding-top:22px;color:#333534}.confirmationChild p.highlight{font-size:16px;font-weight:600;margin-bottom:23px}.confirmationChild table{line-height:24px;margin-bottom:22px}.confirmationChild table tr td{font-weight:600}.confirmationChild table tr td:first-child{width:240px;font-weight:400}.currencySelectMobile{display:none}.currencySelect .fieldRow.inline select{padding-right:0px;margin-bottom:20px}.currencySelect select, .currencySelect .fieldRow.inline select{width:240px}.currencySelect .inline{width:202px}@media only screen and (max-width: 959px){.messageContainer .icon{width:35px;height:35px}.messageContainer .icon:before{left: -25px}.messageContainer .successful .icon:before{top: -608px}.messageContainer .email .icon:before{top: -643px}.messageContainer .pending .icon:before{top: -678px}.messageContainer .error .icon:before{top: -713px}.messageContainer .successful .icon{*background-position: -25px -608px}.messageContainer .email .icon{*background-position: -25px -643px}.messageContainer .pending .icon{*background-position: -25px -678px}.messageContainer .error .icon{*background-position: -25px -713px}}@media only screen and (min-width: 768px) and (max-width: 959px){.noDesktop{display:block}.noMobile{display:block}.noTablet{display:none}.messageContainer p{padding-left:48px;font-size:18px;line-height:24px}.rtl .messageContainer p{padding-left:0px;padding-right:48px}.currencySelect .customSelectElement, .currencySelect .styledSelect{width:180px}.currencySelect select, .currencySelect .fieldRow.inline select{width:180px}.currencySelect .inline{width:142px}}@media only screen and (max-width: 767px){.noDesktop{display:block}.noTablet{display:block}.noMobile{display:none}header{display:none}#loader{height:200px;width:280px;background-size:60px}.overlayMessage{left:20px;right:20px;width:auto;padding:20px 12px;margin:0}.currencySelect{display:none}.currencySelectMobile{display:block}.currencySelectMobile select, .currencySelectMobile .fieldRow.inline select{width:75px}.currencySelectMobile .fieldRow{float:right;margin-bottom:20px}.rtl .currencySelectMobile .fieldRow{float:left;margin-bottom:20px}.currencySelectMobile .styledSelect{width:75px !important;margin-right:4px}.rtl .currencySelectMobile .styledSelect{margin-left:4px}.rtl .currencySelectMobile span.styledSelect.inline{padding-left:0}p.notification{padding:13px 22px 13px 45px}.notification .icon{left:11px}.messageContainer p{min-height:31px;margin-bottom:13px;padding-left:47px;font-size:14px;font-weight:400;line-height:16px}.rtl .messageContainer p{padding-left:0;padding-right:47px}.messageContainer{margin-bottom:20px;clear:both}.messageContainer p strong, .messageContainer p b{font-weight:400}.messageContainer .last{margin-bottom:21px}.messageContainer a.button{float:none}.pagination{padding:0;display:table;width:100%}.pagination .next, .rtl .pagination .next{display:table-header-group;text-align:auto;float:none !important;width:100%}.pagination .prev, .rtl .pagination .prev{display:table-row-group;text-align:auto;width:100%;margin-top:13px;margin-bottom:18px}.pagination .prev:first-child{margin-top:13px;margin-bottom:18px}.confirmationParent .messageContainer{margin-bottom:28px}.confirmationParent .messageContainer p{font-weight:400}.confirmationParent iframe{width:100%}.confirmationParent .orderDetails table{width:100%;color:#333534;margin-bottom:21px}.confirmationParent .orderDetails thead{font-size:18px}.confirmationParent .orderDetails .total{font-weight:600}.confirmationParent .orderDetails td, .confirmationParent .orderDetails th{border-top:1px solid #e7f1f5;padding:11px 0}.confirmationParent .orderDetails thead td, .confirmationParent .orderDetails thead th{border-top:none}.confirmationParent .orderDetails th{text-align:left}.confirmationParent .orderDetails td{text-align:right}.confirmationParent .orderDetails .discountRow{color:#EC008C}.confirmationParent .pagination{padding-top:26px}.confirmationParent .sideContent{display:none}.mobile.confirmationChild body{background-color:#e7f1f5;padding:12px;padding-top:22px;padding-bottom:24px;color:#333534}.mobile.confirmationChild p.highlight{font-size:14px}.mobile.confirmationChild .extraMargin{margin-bottom:0}.mobile.confirmationChild table{line-height:24px;margin-bottom:22px}.mobile.confirmationChild table tr td{font-weight:600;display:block}.confirmationChild table tr td:first-child{width:240px;font-weight:400}}.fieldRow.correctInput .icon, .fieldRow.error .icon{overflow:hidden}.fieldRow.correctInput .icon:before{content:url("../images/backgrounds/misc-elements-sprite.png");left: -33px;top: -2px;position:relative;float:left}.fieldRow.error .icon:before{content:url("../images/backgrounds/misc-elements-sprite.png");left: -33px;top: -61px;position:relative}.fieldRow.error .inlineError .icon{position:absolute;display:block;left: -1px;top: -2px;float:left}.fieldRow.error .inlineError .icon:before{content:url("../images/backgrounds/misc-elements-sprite.png");left: -33px;top: -61px;position:relative}.radioList label .icon{overflow:hidden}.radioList label .icon:before{left:16px;top: -68px;content:url("../images//label-bg.png");position:relative}.fieldRow.radioList.correctInput label .icon:before{left:16px;top: -68px;content:url("../images//label-bg.png");position:relative}.fieldRow.radioList.correctInput label.checked .icon:before{left:16px;top:0;content:url("../images//label-bg.png");position:relative}.radioList label.checked .icon:before{left:16px;top:0;content:url("../images//label-bg.png");position:relative}.checkbox label .icon{overflow:hidden}.checkbox label .icon:before{top: -265px;content:url("../images//label-bg.png");position:relative}.checkbox.hover .icon:before, .checkbox.focus .icon:before{top: -300px;content:url("../images//label-bg.png")}.checkbox label.checked .icon:before{top: -265px;left: -30px;content:url("../images//label-bg.png")}.checkbox.hover label.checked .icon:before, .checkbox.focus label.checked .icon:before{top: -300px;left: -30px;content:url("../images//label-bg.png")}.checkbox.error label .icon:before{top: -395px;left:0;content:url("../images//label-bg.png")}.checkbox.error.hover label .icon:before, .checkbox.error.focus label .icon:before{top: -427px;left:0;content:url("../images//label-bg.png")}.dropdownArrow{position:absolute;display:block;width:100%;text-align:right}.dropdownArrow:before{content:url("../images/backgrounds/misc-elements-sprite.png");right:4px;top: -61px;position:relative;width:100%}span.hasLogo .dropdownArrow:before, span.hasFlag .dropdownArrow:before{content:url("../images/backgrounds/misc-elements-sprite.png")}.currencySelect .styledSelect.inline .dropdownArrow:before{content:url("../images/backgrounds/misc-elements-sprite.png")}.currencySelectMobile .styledSelect.inline .dropdownArrow:before{top: -61px;content:url("../images/backgrounds/misc-elements-sprite.png")} @media only screen and (max-width: 767px){.radioList label .icon:before{left:16px;top: -202px}.radioList label.checked .icon:before{left:16px;top: -142px;position:relative}}button{font-family:inherit}.fieldRow label{padding-bottom:8px}.shortInputsWrapper{padding-bottom:20px;overflow:hidden}.shortInputsWrapper label{margin-bottom:0}.fieldRow{position:relative;padding:0 0 20px 0;clear:both;z-index:5}.fieldRow.genericMessageContainer{position:absolute;display:none;z-index:11}.fieldRow.genericMessageContainer.error .arrow{display:block;left:9px;top:0}.fieldRow.genericMessageContainer.error .message.error{display:block;left:29px;top:0}.fieldRow.genericMessageContainer.tip .arrow{display:block;left:10px;top:0}.fieldRow.genericMessageContainer.tip .message.tip{display:block;left:29px;top:0}.shortInputsWrapper.error .fieldRow{padding:0}.fieldRow.select{min-height:61px}.fieldRow.active{z-index:10}.fieldRow:last-child{}.fieldRow label{display:block;float:none}.fieldRow input{position:relative;width:253px;height:33px;line-height:33px;padding:1px 10px;border:1px solid #00AFF0;margin:1px;font-size:14px;background:transparent;outline:none}.fieldRow input:focus, .fieldRow input:hover{border:2px solid #00AFF0;margin:0}.error input:focus, .error input:hover{margin:0;border:2px solid #E81123}.correctInput input:focus, .correctInput input:hover, .shortInput.correctInput input:focus, .shortInput.correctInput input:hover{margin:0;border:2px solid #00AFF0}.sideContent .fieldRow:last-child{}.shortInput input{width:70px}.error input, .correctInput input{width:228px;padding:1px 35px 1px 10px}.rtl .error input, .rtl .correctInput input{width:228px;padding:1px 10px 1px 35px}.shortInput.error input, .shortInput.correctInput input{width:46px}.fieldRow .icon{position:absolute;width:30px;height:30px;top:32px;*background-image:url("../images/backgrounds/misc-elements-sprite.png")}.fieldRow .icon{left:242px}.rtl .fieldRow .icon{right:242px}.fieldRow.shortInput .icon{left:61px}.fieldRow.shortInput .icon{right:61px}.fieldRow.error .icon, .fieldRow.correctInput .icon{display:inline}form .correctInput .icon{background-position: -33px -2px}form .shortInput.correctInput .icon{background-position: -32px -2px}form .error .icon{background-position: -34px -62px}form .error input{border:1px solid #E81123}form .disabled input{cursor:not-allowed;color:#BDD1DC;border:1px solid #e4eef2 !important;margin:0}.fieldRow .message, .shortInputsWrapper .message{display:none;position:absolute;min-width:270px;padding:7px 19px 10px;line-height:18px;zoom:1;z-index:2;overflow:hidden}.fieldRow .message{left:300px;top:26px}.rtl .fieldRow .message{right:300px}.fieldRow .message strong, .shortInputsWrapper .message strong{font-weight:600}.fieldRow .message strong, .fieldRow .message span, .shortInputsWrapper .message strong{display:block;padding-bottom:6px}.fieldRow .message span:last-child{padding-bottom:0}.fieldRow.shortInput .message{left:120px}.fieldRow.select.shortInput .message{left:140px}.rtl .fieldRow.shortInput .message{right:120px}.rtl .fieldRow.select.shortInput .message{right:140px}.fieldRow.inlineSelect{float:left;margin-right:29px}.mobile .fieldRow.inlineSelect{padding-bottom:0}.shortInputsWrapper .fieldRow{padding-bottom:0}.shortInputsWrapper.shortInputerror{padding-bottom:20px}.mobile .shortInputsWrapper.shortInputerror{padding-bottom:0}.fieldRow.noClear{clear:none}.fieldRow.noRightMargin{margin-right:0}.fieldRow .arrow{position:absolute;width:30px;height:30px;top:25px;background-image:url("../images/backgrounds/misc-elements-sprite.png");background-position:0 0;display:none}.fieldRow .arrow::before{content:"";display:block;width:14px;height:14px;background-color:#d9f3fD;border-color:#d9f3fd;border-style:solid;border-left-width:1px;border-top-width:1px;border-right-width:0px;border-bottom-width:0px;left:25px;top:13px;position:relative;-webkit-transform:translate(-12px, 0px) rotate(-45deg) skew(10deg, 10deg);-moz-transform:translate(-12px, 0px) rotate(-45deg) skew(10deg, 10deg);-ms-transform:translate(-12px, 0px) rotate(-45deg) skew(10deg, 10deg);-o-transform:translate(-12px, 0px) rotate(-45deg) skew(10deg, 10deg);transform:translate(-12px, 0px) rotate(-45deg) skew(10deg, 10deg);z-index:3}.rtl .fieldRow.shortInput.error .arrow{right:96px}.rtl .fieldRow.shortInput.tip .arrow{right:97px}.fieldRow.select.shortInput.error .arrow{background-position: -32px -85px;left:120px}.rtl .fieldRow.select.shortInput.error .arrow{background-position: -2px -85px}.fieldRow.shortInput.tip .arrow{background-position: -32px -115px}.fieldRow.error .message.error{display:none;background-color:#F6D8DC;min-width:230px;padding:10px 20px 11px 20px}.fieldRow.error .arrow::before{background-color:#F6D8DC;border-color:#F6D8DC}.select.error .message.error{padding:9px 20px 10px 20px}.fieldRow.combinedError{display:none}.fieldRow.active.combinedError{display:block}.fieldRow.error .arrow{display:none;background-position: -32px -85px;left:280px}.fieldRow.short.error .arrow, .fieldRow.shortInput.error .arrow{left:100px}.fieldRow.dualInput.error .arrow{left:280px}.rtl .fieldRow.short.error .arrow{right:99px}.rtl .fieldRow.dualInput.error .arrow{right:280px}.rtl .fieldRow.select.short.error .arrow{right:116px}.rtl .fieldRow.select.dualInput.error .arrow{right:277px}.rtl .fieldRow.error .arrow{display:none;background-position: -2px -85px;right:277px}.fieldRow.error.active .message.error, .fieldRow.error.active .arrow{display:block}.fieldRow.tip .message.tip{background-color:#D9F3FD;min-width:230px;padding:9px 20px 10px 20px;display:none}.fieldRow.tip .arrow{background-position: -32px -115px;left:280px;display:none}.rtl .fieldRow.tip .arrow{background-position: -2px -115px;right:277px;display:none}.fieldRow.tip.active .arrow{display:block}.fieldRow.tip.active .message.tip{display:block}.radioList{font-weight:600;font-size:36px !important;padding-bottom:0px}.radioList li.radioLink{height:23px;padding-top:6px;line-height:23px}.radioList .radioLink a{padding:0;font-size:16px;line-height:23px;font-weight:400;vertical-align:top}.radioList label{position:relative;display:block;min-height:71px;line-height:71px;padding:0 10px 0 60px;border-bottom:solid 1px #e7f1f5;cursor:pointer;cursor:hand;background-color:#fff;font-weight:400;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rtl .radioList label{padding:0 60px 0 10px}.radioList ul{padding-left:2px;padding-right:2px;padding-top:1px;padding-bottom:1px}.radioList ul.focus{padding:0px}.radioList ul.focus li label{border-color:#e4eef2;border-style:solid}.radioList ul.focus li label{border-width:0px 2px 1px 2px}.radioList ul.focus li.first label{border-width:2px 2px 1px 2px;border-bottom-color:#E7F1F5}.radioList ul.focus li.last label{border-width:0px 2px 2px 2px;border-bottom-color:#E7F1F5}.radioList ul.focus li.one label{border-width:2px 2px 2px 2px;border-bottom-color:#E7F1F5}.radioList ul.focus li.radioLink a{border:none;padding-left:2px}.rtl .radioList ul.focus li.radioLink a{padding-right:2px}.radioList ul.focus li.radioLink{padding-top:5px;padding-bottom:1px}.radioList label.hover{background-color:#e4eef2}.radioList label.disabled:hover{background-color:white}.radioList label.disabled .logo{border-color:#e4eef2}.radioList label.disabled .logo{cursor:not-allowed;filter:alpha(opacity=40);opacity:0.4}.radioList label.disabled span.discount{cursor:not-allowed;filter:alpha(opacity=40);opacity:0.4}.radioList label.disabled .text, .radioList label.disabled .description{color:#BDD1DC}*html .radioList label{height:10px}.radioList label.disabled .radioUnavailable{float:right;margin-top: -30px;font-size:12px;line-height:19px;color:#E82E46;padding-bottom:5px}.paymentMethods label{padding-left:166px}.rtl .paymentMethods label{padding-right:166px}.radioList label input{position:absolute;border:none;top:50%;left: -2000px;margin-top: -15px}.rtl .radioList label input{right: -2000px;display:none;display:block\0/}*:first-child+html.rtl .radioList label input{display:none !important}.radioList label .icon{position:absolute;top:50%;left:0;width:60px;height:70px;margin: -36px 0 0 0;*background:url("../images//label-bg.png") no-repeat 16px -68px}.rtl .radioList label .icon{right:0}.radioList label.special .discount{padding-right:140px;background-image:url("../images/backgrounds/radio-special.png");background-repeat:no-repeat;background-position:140px 50%}.rtl .radioList label.special .discount{padding-right:140px;background-position: -130px 50%}.radioList label.special span.discount{position:absolute;display:table-cell;top:0;right:0;width:130px;height:100%;color:#fff}.rtl .radioList label.special span.discount{left:0;right:auto}.radioList label.special span.discount span{position:absolute;top:50%;*top:35px;right:0;display:block;width:95px;height:36px;margin: -18px 0 0 0;padding:0 10px 0 0;font-size:36px;line-height:36px;font-weight:400;text-align:right}.rtl .radioList label.special span.discount span{right:auto;left:0;padding:0 0 0 10px;text-align:left}.radioList label.checked{background-color:#00aff0;color:#fff}.radioList label.checked .icon{*background-position:16px 0}.radioList label.disabled{cursor:not-allowed}.radioList label.disabled .icon{cursor:not-allowed;background-position: -28px -68px}.radioList ul li:first-child label{border-top:solid 1px #e7f1f5}.paymentMethods .logo{position:absolute;display:block;top:50%;left:60px;width:83px;max-width:83px;max-height:47px;height:47px;line-height:47px;margin: -24px 0 0 0;border:1px solid #00aff0;background-color:#fff;overflow:hidden;background-position:50% 50%;background-repeat:no-repeat}.rtl .paymentMethods .logo{right:61px}.paymentMethods label.hover .logo{margin: -25px 0 0 -1px;border-width:2px}.rtl .paymentMethods label.hover .logo{margin: -25px -1px 0 0}.paymentMethods label.disabled:hover .logo{margin: -24px 0 0 0;border-width:1px}.paymentMethods .logo img{display:inline-block;width:100%;vertical-align:text-bottom;-ms-interpolation-mode:bicubic}.withDescription span.text, .withDescription span.description{display:block;line-height:20px;font-size:16px;font-weight:600;color:#666;overflow:hidden;text-overflow:ellipsis}.withDescription span.text{padding-top:12px;color:#333534}.withDescription span.description{padding-bottom:12px}.withDescription .checked span.text, .withDescription .checked span.description{color:#fff}#termsOfService{display:none}.checkbox{position:relative}.checkbox input, .error .checkbox input{position:absolute;top:0;left: -2000px;vertical-align:top}.rtl .checkbox input, .rtl .error .checkbox input{right: -2000px;display:none;display:block\0/}*:first-child+html.rtl .checkbox input{display:none !important}.checkbox label{width:auto;font-size:16px;padding-left:35px;overflow:hidden}.rtl .checkbox label{padding-right:35px}.checkbox label.disabled{cursor:not-allowed;color:#BDD1DC}.checkbox label .icon{position:absolute;top:0;left:0;float:left;width:25px;height:25px;margin:0 0 0 0;*background:url("../images//label-bg.png") no-repeat 0 -265px}.rtl .checkbox label .icon{right:0;float:right}.checkbox label.checked .icon{*background-position: -30px -265px}.checkbox.error label .icon{*background-position:0 -395px}.checkbox.error.hover label .icon, .checkbox.error.focus label .icon{*background-position:0 -427px}.checkbox label.disabled .icon{*background-position:0 -265px}.checkbox.hover label .icon, .checkbox.focus label .icon{*background-position: -0 -300px}.checkbox.hover label.checked .icon, .checkbox.focus label.checked .icon{*background-position: -30px -300px}.checkbox label.disabled .icon, .checkbox.hover label.disabled .icon{*background-position: -60px -265px}.checkbox.checked label.disabled .icon{*background-position: -90px -265px}.checkbox label strong{display:block;padding:2px 0 5px;font-weight:600;font-size:16px}.checkbox label .text{font-weight:400;font-size:16px;line-height:20px}.checkbox .inlineError{display:none}.checkbox.error .inlineError{padding-left:35px;color:#e81123;display:block;padding-top:3px;position:relative}.rtl .checkbox.error .inlineError{padding-left:0px;padding-right:35px}select.customSelectElement{position:relative;float:left;z-index:10;width:269px;height:35px;line-height:35px;margin:1px;z-index:10;opacity:0;-moz-opacity:0;filter:alpha(opacity=0);-khtml-appearance:none}.rtl select.customSelectElement{float:right}*html .error select{color:#f00}select.short{width:119px}.fieldRow.inline select{width:auto}select[disabled=disabled]{cursor:not-allowed}span.styledSelect{position:absolute;top:auto;float:left;left:0;width:242px;padding-right:25px;height:33px;line-height:33px;text-indent:11px;*background:#fff url("../images/backgrounds/misc-elements-sprite.png") no-repeat right -273px;cursor:default;z-index:1;border:solid 1px #00aff0;font-size:16px;font-weight:400;overflow:hidden;margin:1px;white-space:nowrap;text-overflow:ellipsis}.rtl span.styledSelect{float:right;right:0;background-position: -31px -273px}span.styledSelect.short{width:92px}.short .customSelectElement{width:92px}span.styledSelect.inline{display:inline-block;font-size:16px;padding-right:35px;border:2px solid #fff;color:#00aff0}.rtl span.styledSelect.inline{padding-right:0;padding-left:35px}.fieldRow.inline.hover span.styledSelect{text-decoration:underline;border:1px solid #fff;margin:2px}.fieldRow.inline.active span.styledSelect{margin:1px;border:solid 2px #00aff0}span.hasLogo,span.hasFlag{text-indent:60px}.hasLogo .logo, .hasFlag .flag{display:block;position:absolute;top:4px;height:23px;border:1px solid #A2C5D3}.hasFlag .flag:before{content:url("../images/flags/country-flags-37x23.png");left: -60px}.hasFlag .flag{*background-image:url("../images/flags/country-flags-37x23.png");left:9px;width:37px;overflow:hidden}.hasLogo .logo{background-size:100% 100%;background-repeat:no-repeat;left:7px;width:41px}.rtl .hasLogo .logo{right:12px}.fieldRow .styledSelect.active, .fieldRow .styledSelect.hover{margin:0;border:solid 2px #00aff0}.fieldRow .styledSelect.inline.active, .fieldRow .styledSelect.inline.hover{margin:1px}.fieldRow.error .styledSelect.active, .fieldRow.error .styledSelect.hover{margin:0;border:solid 2px #e81123}.error span.styledSelect{border:1px solid #e81123;background-position:right -371px;margin:1px}.rtl .error span.styledSelect{background-position: -8px -401px}.disabled span.styledSelect{border:1px solid #e4eef2;background-position:right -340px;color:#BDD1DC}.rtl .disabled span.styledSelect{background-position: -31px -340px}.short.disabled span.styledSelect{border:1px solid #e4eef2;color:#BDD1DC}.dualInput.short span.styledSelect, .dualInput.short select{width:130px;top:0}.dualInput .second, .dualInput .first{position:absolute}.dualInput .second{left:143px}.rtl .dualInput select{float:none}.rtl .dualInput .second{right:138px}@media only screen and (min-width: 768px){.fieldRow .message{border:1px solid #d9f3fD}.fieldRow.error .message{border:1px solid #F6D8DC}}@media only screen and (max-width: 767px){.fieldRow.inline.hover span.styledSelect{text-decoration:underline;border:1px solid #fff;margin:1px}.radioList li.radioLink{height:24px;padding-top:19px;line-height:24px}.radioList ul.focus li.radioLink{padding-top:18px}.radioList{padding-bottom:18px;font-size:24px;color:#333534}.radioList label{min-height:57px;line-height:57px;padding-left:61px}.rtl .radioList label{padding-right:61px}.radioList label .icon{width:52px;height:56px;margin-top: -28px;*background-position:16px -202px}.radioList label.checked .icon{*background-position:16px -142px}.radioList label.disabled .icon{background-position: -27px -202px}.radioList label.special{padding-right:80px}.rtl .radioList label.special{padding-left:80px;padding-right:61px}.radioList label.special span.discount{width:80px;background-image:url("../images/backgrounds/radio-special-mobile.png")}.rtl .radioList label.special span.discount{background-position: -80px 50%}.radioList label.special span.discount span{width:65px;height:24px;margin: -12px 0 0 0;padding:0 5px 0 0;font-size:22px;line-height:24px;font-weight:600}.rtl .radioList label.special span.discount span{padding:0 0 0 5px}.paymentMethods label{min-height:61px;padding-left:117px}.rtl .paymentMethods label{padding-right:117px}.paymentMethods label .logo{left:52px;width:54px;height:37px;line-height:37px;margin-top: -19px}.rtl .paymentMethods label .logo{right:52px;left:auto}.paymentMethods label.hover .logo, .rtl .paymentMethods label.hover .logo{margin-top: -20px}.paymentMethods label.disabled.hover .logo, .rtl .paymentMethods label.disabled.hover .logo{margin-top: -19px}.paymentMethods label .logo img{display:inline-block;vertical-align:text-bottom}.withDescription span.text, .withDescription span.description{font-size:14px}.fieldRow .tip, .tip .arrow, .error .arrow{display:none !important}.fieldRow .message, .shortInputsWrapper .message{width:auto;position:relative;left:0;top:10px;clear:both;margin-top:1px;margin-bottom:10px;padding:0;background:none !important;color:#e81123}.rtl .fieldRow .message, .rtl .shortInputsWrapper .message{right:0}.fieldRow .message strong{padding-bottom:0}.fieldRow.shortInput .message, .fieldRow.shortInput.error .arrow{left:0}.rtl .fieldRow.shortInput .message, .rtl .fieldRow.shortInput.error .arrow{right:0}.fieldRow.error .message.error{padding-left:0;padding-top:0;width:auto;display:block;padding:0;width:100%;visibility:visible;opacity:1}.fieldRow.select span.error.message{display:none}.fieldRow.select.error span.error.message{display:block}.fieldRow.shortInput.error .arrow{background-position: -177px -147px}.fieldRow.shortInput.tip .arrow{background-position: -177px -166px}.fieldRow.select.shortInput .message{left:auto}.checkbox{}form .checkbox input{position:absolute;left: -2000px;margin:0;padding:0}.rtl form .checkbox input{right: -2000px}.checkbox label{font-size:18px;line-height:21px}.checkbox label .icon{background-position:0px -336px}.checkbox label.checked .icon{background-position: -30px -336px}.checkbox.error label .icon{background-position:0 -460px}.checkbox.error.hover label .icon, .checkbox.error.focus label .icon{background-position:0px -488px}.checkbox label.disabled .icon{background-position:0 -265px}.checkbox.hover label .icon, .checkbox.focus label .icon{background-position: -0px -367px}.checkbox.hover label.checked .icon, .checkbox.focus label.checked .icon{background-position: -30px -367px}.checkbox label.disabled .icon, .checkbox.hover label.disabled .icon{background-position: -60px -336px}.checkbox.checked label.disabled .icon{background-position: -90px -336px}.checkbox label strong{padding:2px 0 5px 0;font-size:14px;line-height:16px}.checkbox label .text{font-size:14px;line-height:16px}.fieldRow .customSelectElement, .fieldRow .styledSelect{width:242px;padding-right:0;margin:1px}.fieldRow.error .styledSelect{margin:1px}.fieldRow.short .customSelectElement, .fieldRow.short .styledSelect,{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;-ms-box-sizing:inherit;box-sizing:inherit;height:33px;width:100%}.fieldRow.inline .customSelectElement, .fieldRow.inline .styledSelect{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;box-sizing:content-box;height:33px;margin:0px;padding-right:0px;width:100%}.fieldRow.inline.active span.styledSelect{margin:0px}.fieldRow.short.active .styledSelect,{margin:0px}.fieldRow.short.error .styledSelect:active{margin:1px}.mobile .genericMessageContainer{display:none}.shortInputsWrapper{padding-bottom:20px}.shortInputerror{padding-bottom:0}.fieldRow .combinedError{margin-top:35px}}.rtl .radioList label .icon:before{top: -68px;left:77px}.rtl .radioList label.checked .icon:before{top:0px;left:77px}.rtl h2.yourOrder{float:right}.rtl .dropdownArrow{text-align:left}.rtl .dropdownArrow:before{right:auto;left: -32px}.rtl .checkbox .icon:before{direction:rtl;top: -265px}.rtl .checkbox label .icon:before{right:auto;left:95px}.rtl .checkbox label.checked .icon:before{right:auto;left:65px}.rtl .checkbox.hover .icon:before, .checkbox.focus .icon:before{top: -300px}.rtl .messageContainer .icon:before{left:0}.rtl button.tooltip:before{left:282px}.rtl button.tooltip:hover:before, .rtl button.tooltip:focus:before{left:264px}.rtl button.tooltip:active:before{left:246px}.rtl .tooltip-message .arrow::before{transform:translate(20px, -16px) rotate(45deg) skew(10deg, 10deg);-o-transform:translate(20px, -16px) rotate(45deg) skew(10deg, 10deg);-ms-transform:translate(20px, -16px) rotate(45deg) skew(10deg, 10deg);-moz-transform:translate(20px, -16px) rotate(45deg) skew(10deg, 10deg);-webkit-transform:translate(20px, -16px) rotate(45deg) skew(10deg, 10deg)}.rtl .messageContainer p{padding-left:0;padding-right:60px}.rtl .errorIcon{left:auto;right:0}.rtl .vatTooltip:before{position:relative;left:282px;top:0px}.rtl .vatTooltip:hover, .rtl .vatTooltip:focus{margin: -1px 6px 1px 6px}.rtl .vatTooltip:hover:before, .rtl .vatTooltip:focus:before{left:264px;top:0}@media only screen and (max-width: 959px){.rtl .messageContainer .icon:before{left:0}}@media only screen and (max-width: 767px){.rtl .radioList label .icon{margin: -36px 0 0 0}.rtl #orderDetails table.open tr.totalRow th .yourOrder .icon:before{left:auto;right: -75px}.rtl #orderDetails table thead tr.totalRow th .yourOrder .icon:before{left:auto;right: -165px}}.logo,.GLOBAL-COLLECT-OFFLINE{background-image:url("../images/methods/GLOBAL-COLLECT-OFFLINE.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-OFFLINE.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-OFFLINE.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.AMEX-SKYPE{background-image:url("../images/methods/AMEX-SKYPE.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/AMEX-SKYPE.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/AMEX-SKYPE.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BANK-BPH-MONEYBOOKERS{background-image:url("../images/methods/BANK-BPH-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-BPH-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-BPH-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BANK-FORTIS-MONEYBOOKERS{background-image:url("../images/methods/BANK-FORTIS-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-FORTIS-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-FORTIS-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BANK-ING-MONEYBOOKERS{background-image:url("../images/methods/BANK-ING-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-ING-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-ING-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BANK-INVEST-MONEYBOOKERS{background-image:url("../images/methods/BANK-INVEST-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-INVEST-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-INVEST-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BANK-KREDYT-MONEYBOOKERS{background-image:url("../images/methods/BANK-KREDYT-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-KREDYT-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-KREDYT-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BANK-LUKAS-MONEYBOOKERS{background-image:url("../images/methods/BANK-LUKAS-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-LUKAS-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-LUKAS-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BANK-MILLENIUM-MONEYBOOKERS{background-image:url("../images/methods/BANK-MILLENIUM-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-MILLENIUM-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-MILLENIUM-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BANK-NORDEA-MONEYBOOKERS{background-image:url("../images/methods/BANK-NORDEA-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-NORDEA-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-NORDEA-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BANK-OCHRONY-MONEYBOOKERS{background-image:url("../images/methods/BANK-OCHRONY-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-OCHRONY-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-OCHRONY-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BANK-PEKAO-MONEYBOOKERS{background-image:url("../images/methods/BANK-PEKAO-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-PEKAO-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-PEKAO-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BANK-PKO-BP-MONEYBOOKERS{background-image:url("../images/methods/BANK-PKO-BP-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-PKO-BP-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-PKO-BP-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BANK-ZACHODNI-WBK-MONEYBOOKERS{background-image:url("../images/methods/BANK-ZACHODNI-WBK-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-ZACHODNI-WBK-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BANK-ZACHODNI-WBK-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.BGZ-INTEGRUM-MONEYBOOKERS{background-image:url("../images/methods/BGZ-INTEGRUM-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BGZ-INTEGRUM-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/BGZ-INTEGRUM-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.CARTEBLEUE-SKYPE{background-image:url("../images/methods/CARTEBLEUE-SKYPE.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/CARTEBLEUE-SKYPE.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/CARTEBLEUE-SKYPE.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.CASHU{background-image:url("../images/methods/CASHU.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/CASHU.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/CASHU.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.CB-SKYPE{background-image:url("../images/methods/CB-SKYPE.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/CB-SKYPE.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/CB-SKYPE.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.CITYBANK-MONEYBOOKERS{background-image:url("../images/methods/CITYBANK-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/CITYBANK-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/CITYBANK-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.DEUTCHEBANK-MONEYBOOKERS{background-image:url("../images/methods/DEUTCHEBANK-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/DEUTCHEBANK-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/DEUTCHEBANK-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.DINERS-SKYPE{background-image:url("../images/methods/DINERS-SKYPE.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/DINERS-SKYPE.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/DINERS-SKYPE.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.EBETALNING-SSL{background-image:url("../images/methods/EBETALNING-SSL.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/EBETALNING-SSL.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/EBETALNING-SSL.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.ECMC-SKYPE{background-image:url("../images/methods/ECMC-SKYPE.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/ECMC-SKYPE.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/ECMC-SKYPE.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.ELV-MONEYBOOKERS{background-image:url("../images/methods/ELV-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/ELV-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/ELV-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.ENETS-SSL{background-image:url("../images/methods/ENETS-SSL.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/ENETS-SSL.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/ENETS-SSL.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.GLOBAL-COLLECT-EPS-AT{background-image:url("../images/methods/GLOBAL-COLLECT-EPS-AT.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-EPS-AT.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-EPS-AT.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.GLOBAL-COLLECT-GIRO{background-image:url("../images/methods/GLOBAL-COLLECT-GIRO.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-GIRO.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-GIRO.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.GLOBAL-COLLECT-BOLETO{background-image:url("../images/methods/GLOBAL-COLLECT-BOLETO.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-BOLETO.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-BOLETO.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.GLOBAL-COLLECT-IDEAL{background-image:url("../images/methods/GLOBAL-COLLECT-IDEAL.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-IDEAL.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-IDEAL.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.GLOBAL-COLLECT-ING-BE{background-image:url("../images/methods/GLOBAL-COLLECT-ING-BE.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-ING-BE.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-ING-BE.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.GLOBAL-COLLECT-PAYSAFE{background-image:url("../images/methods/GLOBAL-COLLECT-PAYSAFE.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-PAYSAFE.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-PAYSAFE.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.GLOBAL-COLLECT-SOFORT{background-image:url("../images/methods/GLOBAL-COLLECT-SOFORT.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-SOFORT.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-SOFORT.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.GLOBAL-COLLECT-WEBMONEY{background-image:url("../images/methods/GLOBAL-COLLECT-WEBMONEY.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-WEBMONEY.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/GLOBAL-COLLECT-WEBMONEY.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.HANSABANK-SSL{background-image:url("../images/methods/HANSABANK-SSL.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/HANSABANK-SSL.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/HANSABANK-SSL.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.INTELIGO-MONEYBOOKERS{background-image:url("../images/methods/INTELIGO-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/INTELIGO-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/INTELIGO-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.JCB-SKYPE{background-image:url("../images/methods/JCB-SKYPE.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/JCB-SKYPE.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/JCB-SKYPE.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.MACH-PAYBYMOBILE,.MACH-PAYBYMOBILE-US{background-image:url("../images/methods/MCB.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/MCB.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/MCB.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.MAESTRO-MONEYBOOKERS{background-image:url("../images/methods/MAESTRO-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/MAESTRO-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/MAESTRO-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.MBANK-MONEYBOOKERS{background-image:url("../images/methods/MBANK-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/MBANK-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/MBANK-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.MONEYBOOKERS{background-image:url("../images/methods/MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.MULTIBANK-MONEYBOOKERS{background-image:url("../images/methods/MULTIBANK-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/MULTIBANK-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/MULTIBANK-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.PAYBYCASH{background-image:url("../images/methods/PAYBYCASH.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/PAYBYCASH.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/PAYBYCASH.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.PAYPAL{background-image:url("../images/methods/PAYPAL.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/PAYPAL.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/PAYPAL.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.PAYPALBA{background-image:url("../images/methods/PAYPAL.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/PAYPAL.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/PAYPAL.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.PAYPALPAP{background-image:url("../images/methods/PAYPAL.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/PAYPAL.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/PAYPAL.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.POLI-MONEYBOOKERS{background-image:url("../images/methods/POLI-MONEYBOOKERS.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/POLI-MONEYBOOKERS.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/POLI-MONEYBOOKERS.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.QIWI-SSL{background-image:url("../images/methods/QIWI-SSL.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/QIWI-SSL.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/QIWI-SSL.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.SMODE{background-image:url("../images/methods/SMODE.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/SMODE.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/SMODE.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.UHISBANK-SSL{background-image:url("../images/methods/UHISBANK-SSL.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/UHISBANK-SSL.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/UHISBANK-SSL.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.UKASH{background-image:url("../images/methods/UKASH.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/UKASH.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/UKASH.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.VISA-SKYPE{background-image:url("../images/methods/VISA-SKYPE.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/VISA-SKYPE.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/VISA-SKYPE.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.VISA-SSL{background-image:url("../images/methods/VISA-SSL.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/VISA-SSL.png',sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/VISA-SSL.png',sizingMethod='scale')";-ms-interpolation-mode:bicubic}.YANDEX-MONEY{background-image:url("../images/methods/YANDEX-MONEY.png");background-size:contain;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/YANDEX-MONEY.png', sizingMethod='scale');-ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/payment-flow/images/methods/YANDEX-MONEY.png', sizingMethod='scale')";-ms-interpolation-mode:bicubic}.contextNotification{text-align:left;background:#E7F1F5;padding:20px}.contextNotification .arrow{margin-top: -27px;width:18px;height:12px;display:inline-block;position:absolute;background:url("../common/images/icons-sprite.png") no-repeat -128px 0;right:40px;z-index:10}.sideContent tr.alertRow{position:absolute;margin-top: -15px;z-index:11}.sideContent tr.alertRow .contextNotification .arrow{right:15px;margin-top: -32px;background:url("../common/images/icons-sprite.png") no-repeat -90px 0}.sideContent .contextNotification{background:#D9F3FD}.sideContent .contextNotification p{font-size:14px}.contextNotification.tablet,.contextNotification.mobile{display:none}.contextNotification.desktop{display:block}.contextNotification.desktop.hidden{display:none}@media only screen and (min-width: 768px) and (max-width: 959px){.contextNotification.desktop,.contextNotification.mobile{display:none}.contextNotification.tablet{display:block}.contextNotification.tablet.hidden{display:none}}@media only screen and (max-width: 767px){.contextNotification.desktop,.contextNotification.tablet{display:none}.contextNotification.mobile{margin: -25px 0 20px 0;display:block}.contextNotification.mobile.hidden{display:none}}@-moz-keyframes spin{from{top:0;left:0}to{top: -5040px;left:0}}@-webkit-keyframes spin{from{top:0;left:0}to{top: -5040px;left:0}}@-o-keyframes spin{from{top:0;left:0}to{top: -5040px;left:0}}@-ms-keyframes spin{from{top:0;left:0}to{top: -5040px;left:0}}@keyframes spin{from{top:0;left:0}to{top: -5040px;left:0}}@-moz-keyframes spinMobile{from{top:0;left:0}to{top: -4032px;left:0}}@-webkit-keyframes spinMobile{from{top:0;left:0}to{top: -4032px;left:0}}@-o-keyframes spinMobile{from{top:0;left:0}to{top: -4032px;left:0}}@-ms-keyframes spinMobile{from{top:0;left:0}to{top: -4032px;left:0}}@keyframes spinMobile{from{top:0;left:0}to{top: -4032px;left:0}}.spinner{height:280px !important;margin:auto;overflow:hidden;position:relative;width:280px !important}.spinnerText{position:relative;text-align:center;top:210px}.spinner.white .spinnerText{color:#FFF}.spinner.blue .spinnerText{color:#333534;outline:none}.spinner.pngSequence{overflow:visible}.spinnerPosition{position:absolute;margin:60px 80px;width:120px;height:120px}.spinnerMask{overflow:hidden}.spinnerMask.spin .spinnerSprite:before{-moz-animation:spin 1.6s steps(42) infinite;-webkit-animation:spin 1.6s steps(42) infinite;-o-animation:spin 1.6s steps(42) infinite;-ms-animation:spin 1.6s steps(42) infinite;animation:spin 1.6s steps(42) infinite;width:120px;height:120px}.spinnerSprite{position:relative;vertical-align:top;width:120px;height:120px}.white .spinnerSprite{*background:url("../images/spinner/spinner-large-white.png") no-repeat}.white .spinnerSprite:before{display:inline-block;content:url("../images/spinner/spinner-large-white.png");position:relative}.blue .spinnerSprite{*background:url("../images/spinner/spinner-large-blue.png") no-repeat}.blue .spinnerSprite:before{display:inline-block;content:url("../images/spinner/spinner-large-blue.png");position:relative}@media only screen and (max-width: 767px){.spinner{-moz-box-sizing:border-box;box-sizing:border-box;height:240px !important;width:240px !important}.spinnerAnimation{height:440px;left: -130px;top: -130px;-webkit-transform:scale(0.4);-moz-transform:scale(0.4);-o-transform:scale(0.4);transform:scale(0.4)}.spinnerPosition{margin:50px 70px;width:96px;height:96px}.spinnerMask.spin .spinnerSprite:before{-moz-animation:spinMobile 1.6s steps(42) infinite;-webkit-animation:spinMobile 1.6s steps(42) infinite;-o-animation:spinMobile 1.6s steps(42) infinite;-ms-animation:spinMobile 1.6s steps(42) infinite;animation:spinMobile 1.6s steps(42) infinite;width:96px;height:96px}.spinnerSprite{width:96px;height:96px}.white .spinnerSprite{*background:url("../images/spinner/spinner-small-white.png") no-repeat}.white .spinnerSprite:before{content:url("../images/spinner/spinner-small-white.png")}.blue .spinnerSprite{*background:url("../images/spinner/spinner-small-blue.png") no-repeat}.blue .spinnerSprite:before{content:url("../images/spinner/spinner-small-blue.png")}.spinnerText{top:180px}}#Overlay-bg{display:none;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background-color:#e7f1f5;opacity:0.9;filter:alpha(opacity=90);z-index:997}.Overlay-hidden-content{display:none !important}.Overlay-message{display:none;position:absolute;top:200px;left:50%;width:296px;padding:28px 34px;margin:0 0 0 -180px;background-color:#fff;z-index:998;border:2px solid white}@media only screen and (max-width: 767px){.Overlay-message{left:20px;right:20px;width:auto;padding:20px 12px;margin:0}}.invisible, body.errorPage .sideContent{opacity:0;height:0;padding:0}h3.title-h3{margin-bottom:25px}.mainContent{padding-top:18px}.checkbox label strong{font-weight:400}@media only screen and (max-width: 767px){#container,.mainContent{width:100%}header#skypeCredit{display:none}.mainContent{padding:0}.pageView{margin:1px 20px 20px 20px}#loader{width:100%;margin:0 auto}.currencySelectMobile .fieldRow.select{min-height:41px;margin-bottom:0px}.wpfc-btn.primaryCta.disabled{margin-left:0}.wpfc-btn,.wpfc-btn.small,.wpfc-btn.disabled{display:block !important;max-width:100% !important}h2.yourOrder{float:left;margin-bottom:0px !important}h3.title-h3{margin-top:20px}.fakeHeader h3, .fakeHeader .title-h3{margin-bottom:5px}}button.tooltip{background:transparent;padding:0;width:20px;height:20px;vertical-align:middle;border:solid 1px #FFF;border-radius:15px;cursor:pointer;overflow:hidden;margin:0px 5px}button.tooltip:before{position:relative;content:url("../images/icons/icons-sprite.png");left:0}button.tooltip:hover:before,button.tooltip:focus:before{left: -18px}button.tooltip:active:before{left: -36px}button.tooltip::-moz-focus-inner{border:0;padding:0}#label-checkbox-autoRecharge strong{display:block;position:relative}.tooltip-message{display:none;position:relative;top:auto;right:0;left:0;margin:8px 0 0 0;padding:0;background-color:#D9F3FD;font-size:14px;line-height:18px;font-weight:400;text-align:left;z-index:100}.tooltip-message>span{display:block;padding:13px 30px}.tooltip-message.visible{display:block}.tooltip-message .arrow{display:block;position:absolute;top: -12px;width:18px;height:12px;z-index: -190;background:url("../images/icons/icons-sprite.png") no-repeat;background-position: -90px 0}.tooltip-message .arrow::before{content:"";display:block;width:14px;height:14px;background-color:#D9F3FD;border-color:#D9F3FD;border-style:solid;border-left-width:1px;border-top-width:1px;border-right-width:0px;border-bottom-width:0px;top:22px;right:20px;position:relative;-webkit-transform:translate(-23px, -16px) rotate(45deg) skew(10deg, 10deg);-moz-transform:translate(-23px, -16px) rotate(45deg) skew(10deg, 10deg);-ms-transform:translate(-23px, -16px) rotate(45deg) skew(10deg, 10deg);-o-transform:translate(-23px, -16px) rotate(45deg) skew(10deg, 10deg);transform:translate(-23px, -16px) rotate(45deg) skew(10deg, 10deg);border-right-width:0px;border-bottom-width:0px;z-index: -100} #wpfc-shop-modal{ position: absolute; display: block; background: url("../images/loader.gif") no-repeat scroll center center #ffffff; color: #333534; } .wpfc-btn.primaryCta { background-color: #7fba00; border-color: #7fba00; } .wpfc-btn { color: white; font-weight: 400; font-size: 20px; display: inline-block; height: 100%; cursor: pointer; overflow: visible; text-decoration: none; line-height: 24px; letter-spacing: -0.01em; -webkit-border-radius: 50px; -webkit-font-smoothing: subpixel-antialiased; -webkit-tap-highlight-color: rgba(0,0,0,0); -moz-border-radius: 50px; border-radius: 50px; border: 0; position: relative; border-width: 2px; border-style: solid; padding: 8px 0 11px 0; background-color: #FFF; cursor: hand; word-wrap: break-word; word-break: break-word; -ms-word-break: break-word; text-align: center; margin: 2px; } .wpfc-btn > span{ padding-left: 25px; padding-right: 25px; } .wpfc-btn.primaryNegativeCta { background-color: #FFF; color: #333534; border-color: #c0dce6 } .wpfc-btn.primaryDisableCta { background-color: #e4eef2; color: #333534; border-color: #c0dce6 } PKL\|#0wp-fastest-cache/css/fonts/statics/flaticon.woffnu[wOFF FFTMjUfGDEFx 4OS/2FV/KcmapDJ#gasppglyfLP{head0.6&hhea`$hmtxPloca<Jmaxp| PnameTYpost<3G8)xc`d``#r\m2p31L +\4= Kxc`d``\:IFTPfxc`d```g Č 10v xc`db`Ø2H20001r23W2hAr xcb&`fx݊ 0^}A $񥥐"0F xw!Ǧ'_gȿ e b{f"(x};D3x׻Y^{K\|V MR4))@Z RD )W3Ѐ8wGe33s&yߐ@^'<&OsBNwЇ9M݋ ¬,嬬۱[wVWj=.m߭temq]Uߍ.^Je%uV*` m[F5,/%x.l?@…Hq?$)˃"S\}57iؼZ agƅ>ŘeÉQ!GT-6o>WbQ,gPpೣ̥NDH=%AiAK̿#fؼCxs 9gFe(!WSBm qyBA;̖68t/+lgZ4YweVtV; ȊDȻ!+{j9Q{a!eOX0vpR5l9ۯAuT >P QZ:kIt<6Q VuT(X"QC*4YƴzJ>9/O{VZ# &R,Xp.]X&\@O2`5Hp`jj8L` #ay ȩ<_Gy,(gN<397Sy>#x;X/Z*ztlaV}D8jt`Cr82,BˋjPhWlQfoscs[ٮ,xN_Q&,]>(w=xxc`b@ ,ʒ\\l‘Z]_`ȔUZXT\|xc`d``b `b`d`f`,`;xc```d R0H9PKL\@ @ /wp-fastest-cache/css/fonts/statics/flaticon.eotnu[@  LPDflaticonRegularVersion 1.0flaticon PFFTMjUf |GDEF4 \ OS/2/KXVcmap#Jgasp Tglyf{$Phead&6hhea$hmtxPlocaJmaxpP8 nameYtpost8) GD_< бб.@LfGLf PfEd@.)((D( "((4Pl%2132654&+0#52132+0#'27#.54672&#""'73254'&54672&#""'73254'&54636&"7;5#"547654'654'&54;5#"#24&5435"54654+32+32/    M    6    G f   7 &##            *     !%!";#";264&+&532654&!!@      @ 4   4  (:a#0#552132654&#"'732=7&'73254'&54672&#"+0#57674=+#"'&02132'&'&060327656'&'&'&54676200&'&#"  )              y%#$' 7 =e     k& $##$ '      }#";2654&3#"&4627#3e  FF)  ^ ^   %q  *A +%    J3   flaticonflaticonRegularRegularFontForge 2.0 : flaticon : 13-12-2014FontForge 2.0 : flaticon : 13-12-2014flaticonflaticonVersion 1.0Version 1.0flaticonflaticoncss4desktop1jssmartɉo1ббPKL\rx>>>>/wp-fastest-cache/css/fonts/statics/flaticon.svgnu[ PKL\9a6 /wp-fastest-cache/css/fonts/statics/flaticon.ttfnu[ PFFTMjUf |GDEF4 \ OS/2/KXVcmap#Jgasp Tglyf{$Phead&6hhea$hmtxPlocaJmaxpP8 nameYtpost8) GD_< бб.@LfGLf PfEd@.)((D( "((4Pl%2132654&+0#52132+0#'27#.54672&#""'73254'&54672&#""'73254'&54636&"7;5#"547654'654'&54;5#"#24&5435"54654+32+32/    M    6    G f   7 &##            *     !%!";#";264&+&532654&!!@      @ 4   4  (:a#0#552132654&#"'732=7&'73254'&54672&#"+0#57674=+#"'&02132'&'&060327656'&'&'&54676200&'&#"  )              y%#$' 7 =e     k& $##$ '      }#";2654&3#"&4627#3e  FF)  ^ ^   %q  *A +%    J3   flaticonflaticonRegularRegularFontForge 2.0 : flaticon : 13-12-2014FontForge 2.0 : flaticon : 13-12-2014flaticonflaticonVersion 1.0Version 1.0flaticonflaticoncss4desktop1jssmartɉo1ббPKL\@^77*wp-fastest-cache/css/fonts/db/Flaticon.svgnu[ Created by FontForge 20120731 at Wed Dec 28 12:36:45 2016 By Apache Created by Apache with FontForge 2.0 (http://fontforge.sf.net) PKL\} +wp-fastest-cache/css/fonts/db/Flaticon.woffnu[wOFF FFTM uPKjOS/2J`PZ^HcmapJJcvt TDgasp glyftrKrhead0.6 1hhea`$hmtx$WQlocaX ^maxp| \nameUv2post @JƘxc`d``9jm2p31_ , 1\ xc`d``<IFT Pxc`d``e Č 1=+xc`a|ч1Jedha``b`cfFHsMa8 z@j(00k Fxc ΠBVxc```f`Fp| >r+|dc~z `dcs*`X1ND****XhVZxuUolG{;w{{w볝{Ν}{l]IPƤ*Jl D4jd>!CRU $GJABTU U*!_(|Q .;$4f͛ A,0RRb0{KpIĐ-[?foA5}iso6}Ԩ,!WIkϡaQ)Aݾ {7onC~Ѿ; |xu C!9B :~ BݮCY`C<~Ο_?/,nl ;ǽG՝ Y3Olڈv>x~1R%ӤIUr@^A 6`~m՚P3jV q{ %`#uW5BՐT-3Âu"ªo ̎G cԪa0kX& gT Da/3%$+o Leq%Ę,jI9[40+zW*xQN'm;YT泠Q^LZ&8}Y ( е ,d⠋^"ƞ ->%%*q,<,: hQbA#fk'7i b*M "T5[mE0~݆TDa3+#dN{`AW5w]WQƌm_UW ]TV8&H?$ˡdol݁ج<::5zu*hZӎP0&a?fI@fOED14NUjD%)(Z R>s0T; W6[6(XszkuKӿ^Zֿe,djRxGkKKSKՇ#ˎx Qx0v臎?D Ecd\ װ/=4w-leer:^wbXGDc5PRl&Ib'XǨ"j(.TJ$#g(Sg?[ a3~B}?)Ř5_%2\Θ͹|Թo^ Z=yB1 YR.'Yh*hp>211.S01x,㳭+L= <~hibbbtvQgW^7Vt:&rZa1&ꦴĪ%WT!HAup}/JB"--kpWv:=틔ՒT $}e4i *8yJRO+ky?| >XϧSTe]PI;߁6$NF9"URǏz:h6| >vACѣ3=µpΎbdPlod#ƿlx}OJ@ƿ?*"Iv!Bn%m'Mmb:TēxxwK: 4C7{3.wgm|:ou\k Ń&:q3E㌫T;_ŏ}7!ţWQ <{#fHJr?!Ȱ& ̰9q.7UpW05s9Q#wMdm #e76z1ոT&Vkcy>IJj=ee1ȦtW'+.<ݮpauc`>_:q(*^',_ERWJW֪eCbQk_i)_MYk{xc`b$^ fd`b`fdbdfdadedcdg`db/t340҆PJCi(m ͠9΀xc```d3΃+!0IxPKL\U*wp-fastest-cache/css/fonts/db/Flaticon.ttfnu[ PFFTMuPKjOS/2PZ^HX`cmapJcvt D(gaspglyfKrHhead 16hhea$hmtxWQ$loca ^,maxp\8 name2 vpostƘt|N_< ԉTMԉTM. @.LfGLfPfEd .@ *9D(  D****XhVZU./<2<2/<2<233'3#wffU32"&4264&"%'"/7ԖԖqqq). `-IԖqqq,  `.J2#"'73264&#"3'3>3'!]]L=',6FaaFCaMddCG&FQ/) bb^CppZgpGR  '+59?C}+"&46;2'7#&"6?672?'&?7'7>/&?7'#"&546;546;45462323254&++"&=#"33654&"0+"&46;246;#"  dVV bb  V;V444Ue & &O L/  $  ."  l  S   _  i   MMyl m. ,MB"M"///M) N(K#  K&`   [  @ "*Vb$#!"&546;2';>5#53.##57#"/7>325#"&=#"3!26=#"'73537''7'73ff ($19& .);#B,<  " 2# + 0   }# D x9&$1."<**8  V   #  3   3;CK2#"/&+"&=46354&+";2=42>%"4;2#2+"432+"43f@ZT= A\@ZZ@UP99PP9cF 6Jxn  Z@w=YH AZ@w@Zw9PP9w8PG I ""O3E !)@PX`i2+"&=463"264&#"264&*264'4&+"+";262+"&=463"264&"264'"264&'4&+"+";26'7'7'7   @   D  D    D $  D  D  HOHO       $   ¦   HMHM  &15ALP7/7''737'?/##/?3'7+5537'!3#'7'?'?/5#x%?>$8\V{}3$F 5JH ,CW>v++++98i%E83p>;%??$%G , f%O== 2a6Y@y\| k*/000*`@"!Uy Ykkg ==2@|* @@ CK5/57'#/#2#"'.5476'#'&''7&/5767'76?37264&"9'6  #   $##   #4&&4&m&: 0  $##   $##  P&4&&49 '12"&545"'26="'26&"26426="'qqqt77dd77ddddddd773''33'6';--;));--;(((1))1p(;--;>~%9q |    J _  z Created by Apache with FontForge 2.0 (http://fontforge.sf.net)Created by Apache with FontForge 2.0 (http://fontforge.sf.net)FlaticonFlaticonMediumMediumFontForge 2.0 : Flaticon : 28-12-2016FontForge 2.0 : Flaticon : 28-12-2016FlaticonFlaticonVersion 001.000 Version 001.000 FlaticonFlaticon   uniF100uniF101uniF102uniF103uniF104uniF105uniF106uniF107uniF108=ԉTMԉTMPKL\wcj*wp-fastest-cache/css/fonts/db/Flaticon.eotnu[LPN|Flaticon Medium Version 001.000 Flaticon PFFTMuPKjOS/2PZ^HX`cmapJcvt D(gaspglyfKrHhead 16hhea$hmtxWQ$loca ^,maxp\8 name2 vpostƘt|N_< ԉTMԉTM. @.LfGLfPfEd .@ *9D(  D****XhVZU./<2<2/<2<233'3#wffU32"&4264&"%'"/7ԖԖqqq). `-IԖqqq,  `.J2#"'73264&#"3'3>3'!]]L=',6FaaFCaMddCG&FQ/) bb^CppZgpGR  '+59?C}+"&46;2'7#&"6?672?'&?7'7>/&?7'#"&546;546;45462323254&++"&=#"33654&"0+"&46;246;#"  dVV bb  V;V444Ue & &O L/  $  ."  l  S   _  i   MMyl m. ,MB"M"///M) N(K#  K&`   [  @ "*Vb$#!"&546;2';>5#53.##57#"/7>325#"&=#"3!26=#"'73537''7'73ff ($19& .);#B,<  " 2# + 0   }# D x9&$1."<**8  V   #  3   3;CK2#"/&+"&=46354&+";2=42>%"4;2#2+"432+"43f@ZT= A\@ZZ@UP99PP9cF 6Jxn  Z@w=YH AZ@w@Zw9PP9w8PG I ""O3E !)@PX`i2+"&=463"264&#"264&*264'4&+"+";262+"&=463"264&"264'"264&'4&+"+";26'7'7'7   @   D  D    D $  D  D  HOHO       $   ¦   HMHM  &15ALP7/7''737'?/##/?3'7+5537'!3#'7'?'?/5#x%?>$8\V{}3$F 5JH ,CW>v++++98i%E83p>;%??$%G , f%O== 2a6Y@y\| k*/000*`@"!Uy Ykkg ==2@|* @@ CK5/57'#/#2#"'.5476'#'&''7&/5767'76?37264&"9'6  #   $##   #4&&4&m&: 0  $##   $##  P&4&&49 '12"&545"'26="'26&"26426="'qqqt77dd77ddddddd773''33'6';--;));--;(((1))1p(;--;>~%9q |    J _  z Created by Apache with FontForge 2.0 (http://fontforge.sf.net)Created by Apache with FontForge 2.0 (http://fontforge.sf.net)FlaticonFlaticonMediumMediumFontForge 2.0 : Flaticon : 28-12-2016FontForge 2.0 : Flaticon : 28-12-2016FlaticonFlaticonVersion 001.000 Version 001.000 FlaticonFlaticon   uniF100uniF101uniF102uniF103uniF104uniF105uniF106uniF107uniF108=ԉTMԉTMPKL\RJL..wp-fastest-cache/css/dialog.cssnu[button:focus {outline:0;} .window-content-wrapper{ background-image:-webkit-gradient(linear, left top, left bottom, color-stop(50%, rgb(238,238,238)), color-stop(100%, rgb(219,219,219))); background:-webkit-linear-gradient(center bottom, rgb(219,219,219) 50%, rgb(238,238,238) 100%); background:-moz-linear-gradient(center bottom, rgb(219,219,219) 50%, rgb(238,238,238) 100%); background:-o-linear-gradient(center bottom, rgb(219,219,219) 50%, rgb(238,238,238) 100%); background:-ms-linear-gradient(center bottom, rgb(219,219,219) 50%, rgb(238,238,238) 100%); background:linear-gradient(center bottom, rgb(219,219,219) 50%, rgb(238,238,238) 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#dbdbdb',GradientType=0 ); text-shadow:0 0 5px #fff; border-bottom:1px solid #ABABAB; border-top:1px solid #EEE6E6; } .wiz-inp-cont { background: none repeat scroll 0 0 rgba(100, 100, 100, 0.1); border-radius: 6px; display: block; margin-top: 24px; padding: 12px; position: relative; } .wiz-cont { font-family: "Lucida Grande","Lucida Sans","Lucida Sans Unicode",Verdana,Tahoma,sans-serif; font-size: 13px; line-height: 18px; min-height: 80px; padding: 22px 28px; } .wiz-cont h1 { font-size: 21px; margin: 0 0 12px; } .wiz-cont p { color: #666; margin: 0; } .wiz-input-cont { background: none repeat scroll 0 0 rgba(100, 100, 100, 0.1); border-radius: 6px; margin-top: 24px; padding: 12px; position: relative; } .wiz-input-cont label { font-weight: bold; margin-right: 12px; } .api-key { border: 1px solid #999; border-radius: 3px; box-shadow: 0 1px 2px #eee inset, 0 1px 0 #ddd; font-size: 13px; padding: 4px 6px 3px; width: 355px; } .window-buttons-wrapper button { margin: 0 4px; } .wpfc-add-new-csp-button, .wpfc-add-new-timeout-button, .wpfc-add-new-exclude-button, .window-buttons-wrapper button[action="next"], .window-buttons-wrapper button[action="back"], .window-buttons-wrapper button[action="close"] { background-color: gray !important; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAABaCAIAAAAU4rCTAAACGUlEQVQ4EQXBQbIkRxEFQH+V0V974Bjo/neaBTJhs6Ir4+GeX79+AQDmr7/+UxChmBawGsq0qxGqoabVVolUa7ZNW8IWpnsraAGzWwogMdsl2khTm9lb2dCqSKddVZRUze6CUIXZriJJW2T2lgLA7F4AQs3uAgBm9xIAmN1SoIrZ3ZY0oqRz74XQUMy9t1ASVfN9X5pGoDr3+5UAwLz3AgDmfS8gtGTufQEAc+9VAmjN3lsIJXTuXgIA8zwHAJDfv38DAObvv/9LRWgTnqRJVJtEdXYrTVOtaqZtahWKTtuCtonW7C6AFmZ3SdKWUNNuxQqFzr2l0UWipr0lJbFbZu8WJFqYuwsAmL1LIUqYuxfChorZvQSoYvZuCQ2VmHtX2iY0jczdCwCYe5eSKCqze0u0TRDz/X5Dk7RNtPP9vtIUoZV53y9QQpnv90XSVqQ67/s/AgDzvhdKAPO+L4FUkbn3AgBm96oKEtX8+e8/AQDzj3/9M0BJMed5QgkV6cxMCS2EOeeEhkrSdj6fIUpUMTMfACDz+flJS0rSMj8zElBSnc/PH9FCQnV+fj6gGkHn8/mAEmDOOQCAOedAIFXmnAMAmHNOKJBo55wDAJhzDkqgZJ5zoJCgc55HklbSNsmccwAAc55HtIRGzHMORKpgnnOiLY8UmfNE0yeBqnmeU6IqCSZPHtp4aBLz5EECgkyeJ4CCzHkeAMD/AViclsCJwxhXAAAAAElFTkSuQmCC') !important; background-repeat: repeat-x !important; border: 1px solid #777 !important; color: #000 !important; text-shadow: 0 1px 0 #eee !important; } .window-buttons-wrapper button[action="finish"]{ background-repeat:repeat-x !important; background-color:green !important; background-image:url("../images/button-back-green.png") !important; color:#FFF;text-shadow:0 1px 0 rgba(0,0,0,0.4) !important; border:1px solid green !important; font-weight: bold; } .icon-right { margin: -4px -2px 0 3px; position: relative; right: -3px; top: 1px; } .big-button { -moz-border-bottom-colors: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; background: none repeat scroll 0 0 rgba(0, 0, 0, 0); border-color: -moz-use-text-color transparent; border-image: none; border-style: none solid; border-width: medium 1px; font-size: 11px; margin: 0; outline: medium none !important; overflow: visible; padding: 3px 6px; text-shadow: 0 1px 0 #e5e5e5, 0 0 5px rgba(255, 255, 255, 0.6); width: auto; } .window-buttons:hover,.wpfc-dialog-buttons:hover{ border-color:#999; background-position:0 -30px; } .wpfc-dialog-buttons { background: url("/images/button-back.png") repeat-x scroll 0 0 rgba(0, 0, 0, 0); border: 1px solid #aaa; padding: 4px 10px; display: none; } .window-buttons:active,.wpfc-dialog-buttons:active{ border-color:#666; background-position:0 -60px; } .close-wiz { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAmCAYAAAAm56DSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODNEQTU1N0QyNTZBMTFFMDg0MjhBMzkwREEyOUQ5ODQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODNEQTU1N0UyNTZBMTFFMDg0MjhBMzkwREEyOUQ5ODQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4M0RBNTU3QjI1NkExMUUwODQyOEEzOTBEQTI5RDk4NCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4M0RBNTU3QzI1NkExMUUwODQyOEEzOTBEQTI5RDk4NCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pg4s3CYAAAMbSURBVHjanJbLb0xxFMfvvVOjDaP1aM0U9aqohhARG41IbBoRKwsJCyspO7Eg8QewsGAhsbAikYiVjQVWXinxqCBdmFapR0v1kWI6HZ3re5LvT47jN5OZnuTTzvzu/X3vuef1mzDw2zKwA2wCa9V6H3gF7oMvshDH8d+LoRGpBYfAVvABDIHv6vpikAYt4Am4BrFpn9gicAKM0IM4KG2ybx3Fz0FwVIslwWmQBeNB5dYA1oAz4qETOwxmqhRytpCxuxLhfyOoN0Ii/Bb0q7WY32W9qNbHJERhGDYm8GEn+GFiNAB6wTeQA03gJWMpMZ3rPKJNyD01+NPMTdpWgjf8PEiBnLq+2twvnqblNac8cZBMdarvWmgvH2atUEpMYrMdLPUU8xbw3rNnKsECTJgLEr9brsqVTYJ3LFxrOfEs77kgT/5kYhioGA569uQjptZao4nRSRPDjGfPmBRtCnSAGpOAAlgA5IE97FeJ7y+GQcfttzS/64ANoNX0Xgs3DxuPkp4EZNEBvU4swewtmUU7SQ12QyyOVPs854Vq7Ct4FnOohZ7R0kpqyogU2FrZWE3HsMTNSbZZEwdmijWWZ+t9BNN20pZ6ugjtBtuYHGfS/E/BbV+tWc/qwDGwi/EbpUfOUpzIUod3wCV4lveJSSbPMhlDFYztZv4/BcERLSbz6QK9+FlFNueR4+KhK42uWQgFvF864kjAVpGqXm+EJPX3pBjNAOzm+oxalyndjrGdkcrfQ1e1PQZ31WklvXoTPOQIkkStUPeLd3VSGu2eYC9Xn3soMKHWVnnmX5u85hxPLKRP95sDw9kBsNmzpzYy7+9MSmMfx3RgPOpkT1orJljlSc9pc5n9p22c46fNIzYZlTjFpWVeq+961r1gHP+btBGDa63exOi8iaFv7g2EPJmPmlfN8EBp4MZ+eveZdZU2cZMJctEdKN2eBKRZ1O73RpbjKO1JgEzaiVCNooOeY78SkzBdhVgxUqfLjRLxK2fi7XUR8s2ziMdeh6dc/vkpAB6BB06o3NiW3tvInpzP3xzD7ME+lkbOju0/AgwAGgf5ial8jHIAAAAASUVORK5CYII=') no-repeat scroll 0 0 transparent; height: 19px; width: 22px; cursor: pointer; } .mm-input-label{ font-weight: bold; vertical-align: middle; margin-right: 12px; color: black; } .wiz-inp-readonly-textarea{ -moz-appearance: textfield; -moz-border-bottom-colors: none; -moz-border-left-colors: none; -moz-border-right-colors: none; -moz-border-top-colors: none; border-color: #aaaaaa #b0b0b0 #cbcbcb; border-image: none; border-radius: 3px; border-style: solid; border-width: 1px; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2) inset, 0 1px 0 rgba(255, 255, 255, 0.5); font-family: "Lucida Grande",monospace; font-size: inherit !important; line-height: 14px; padding: 4px 6px 3px; resize: none; white-space: pre; background-color: white !important; } .wiz-bg-img { bottom: -40px; clip: rect(0pt, 150px, 118px, 0pt); height: 150px; position: absolute; right: 40px; width: 150px; z-index: -1; opacity: 0.25; } .buttons-blood, .buttons-orange, .buttons-start{ background-repeat: repeat-x; border: 1px solid #333 !important; color: #fff; text-shadow: 0 1px 0 #000 !important; float: left; font-weight: bold; } .buttons-blood { background-image:url("../images/button-back-blood.png") !important; } .buttons-orange { background-image:url("../images/button-back-fire.png") !important; } .buttons-start { background-image:url("../images/button-back-green.png") !important; } .wpfc-green-button { font-weight: bold; padding:6px 18px; color:#fff; font-size:13px; border:1px solid #309E1F; text-shadow:0 -1px #309E1F; cursor:pointer; -moz-border-radius: 3px 3px; -webkit-border-radius: 3px 3px; border-radius: 3px 3px; -moz-box-shadow: 0 1px #71EF61 inset, 0 1px #dadada; -webkit-box-shadow: 0 1px #71EF61 inset, 0 1px #dadada; box-shadow: 0 1px #71EF61 inset, 0 1px #dadada; background: #39cc28; background: -moz-linear-gradient(top, #39cc28 0%, #38bf26 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#39cc28), color-stop(100%,#38bf26)); background: -webkit-linear-gradient(top, #39cc28 0%,#38bf26 100%); background: -o-linear-gradient(top, #39cc28 0%,#38bf26 100%); background: -ms-linear-gradient(top, #39cc28 0%,#38bf26 100%); background: linear-gradient(top, #39cc28 0%,#38bf26 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#39cc28', endColorstr='#38bf26',GradientType=0 ); } .wpfc-green-button:hover { background: #40db2b; background: -moz-linear-gradient(top, #40db2b 0%, #3ecc28 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#40db2b), color-stop(100%,#3ecc28)); background: -webkit-linear-gradient(top, #40db2b 0%,#3ecc28 100%); background: -o-linear-gradient(top, #40db2b 0%,#3ecc28 100%); background: -ms-linear-gradient(top, #40db2b 0%,#3ecc28 100%); background: linear-gradient(top, #40db2b 0%,#3ecc28 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#40db2b', endColorstr='#3ecc28',GradientType=0 ); } .wpfc-green-button:active { -moz-box-shadow: 0 1px #71EF61 inset; -webkit-box-shadow: 0 1px #71EF61 inset; box-shadow: 0 1px #71EF61 inset; background: #38bf26; background: -moz-linear-gradient(top, #38bf26 0%, #39cc28 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#38bf26), color-stop(100%,#39cc28)); background: -webkit-linear-gradient(top, #38bf26 0%,#39cc28 100%); background: -o-linear-gradient(top, #38bf26 0%,#39cc28 100%); background: -ms-linear-gradient(top, #38bf26 0%,#39cc28 100%); background: linear-gradient(top, #38bf26 0%,#39cc28 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#38bf26', endColorstr='#39cc28',GradientType=0 ); } .wiz-error-msg, .wiz-error-msg a{ color: red; font-weight: bold; text-align: center; padding-left: 22px; display: block; } #cdn-url-loading{ background: url("../images/loading-circle.gif") no-repeat; width: 20px; height: 18px; margin-top: 5px; float: right; display: none; } .wpfc-checkbox-list { margin-top: 24px; padding:15px; background:rgba(150,150,150,0.2); -moz-border-radius:5px 5px; -webkit-border-radius:5px 5px; border-radius:5px 5px; background:rgba(150,150,150,0.2); background: -ms-linear-gradient(top, rgba(150,150,150,0.2) 0%,rgba(150,150,150,0.2) 100%); /* IE10+ */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#33969696', endColorstr='#33969696',GradientType=0 ); /* IE6-9 */ } .wpfc-checkbox-list label{ width:110px; display:inline-block; margin-top:3px; color:#333333; } .wpfc-checkbox-list label input { margin-right:5px; vertical-align:bottom; } .wpfc-bottom-note{ margin-top: 20px !important } .wpfc-bottom-note a{ font-weight: bold; } PKL\ʷbbbb#wp-fastest-cache/wpFastestCache.phpnu[modifyHtaccess($post); } } function wpfastestcache_deactivate(){ $wpfc = new WpFastestCache(); $path = ABSPATH; if($wpfc->is_subdirectory_install()){ $path = $wpfc->getABSPATH(); } if(is_file($path.".htaccess") && is_writable($path.".htaccess")){ $htaccess = file_get_contents($path.".htaccess"); $htaccess = preg_replace("/#\s?BEGIN\s?WpFastestCache.*?#\s?END\s?WpFastestCache/s", "", $htaccess); $htaccess = preg_replace("/#\s?BEGIN\s?GzipWpFastestCache.*?#\s?END\s?GzipWpFastestCache/s", "", $htaccess); $htaccess = preg_replace("/#\s?BEGIN\s?LBCWpFastestCache.*?#\s?END\s?LBCWpFastestCache/s", "", $htaccess); $htaccess = preg_replace("/#\s?BEGIN\s?WEBPWpFastestCache.*?#\s?END\s?WEBPWpFastestCache/s", "", $htaccess); @file_put_contents($path.".htaccess", $htaccess); } $wpfc->deleteCache(); } register_activation_hook( __FILE__, "wpfastestcache_activate"); register_deactivation_hook( __FILE__, "wpfastestcache_deactivate"); class WpFastestCache{ private $systemMessage = ""; private $options = array(); public $noscript = ""; public $content_url = ""; public $deleted_before = false; public function __construct(){ $this->set_content_url(); $optimize_image_ajax_requests = array("wpfc_revert_image_ajax_request", "wpfc_statics_ajax_request", "wpfc_optimize_image_ajax_request", "wpfc_update_image_list_ajax_request" ); add_action('wp_ajax_wpfc_delete_cache', array($this, "deleteCacheToolbar")); add_action('wp_ajax_wpfc_delete_cache_and_minified', array($this, "deleteCssAndJsCacheToolbar")); add_action('wp_ajax_wpfc_delete_current_page_cache', array($this, "delete_current_page_cache")); add_action('wp_ajax_wpfc_clear_cache_of_allsites', array($this, "wpfc_clear_cache_of_allsites_callback")); add_action('wp_ajax_wpfc_toolbar_save_settings', array($this, "wpfc_toolbar_save_settings_callback")); add_action('wp_ajax_wpfc_toolbar_get_settings', array($this, "wpfc_toolbar_get_settings_callback")); //add_action('wp_ajax_wpfc_cache_path_save_settings', array($this, "wpfc_cache_path_save_settings_callback")); add_action( 'wp_ajax_wpfc_save_timeout_pages', array($this, 'wpfc_save_timeout_pages_callback')); add_action( 'wp_ajax_wpfc_save_exclude_pages', array($this, 'wpfc_save_exclude_pages_callback')); add_action( 'wp_ajax_wpfc_cdn_options', array($this, 'wpfc_cdn_options_ajax_request_callback')); add_action( 'wp_ajax_wpfc_remove_cdn_integration', array($this, 'wpfc_remove_cdn_integration_ajax_request_callback')); add_action( 'wp_ajax_wpfc_pause_cdn_integration', array($this, 'wpfc_pause_cdn_integration_ajax_request_callback')); add_action( 'wp_ajax_wpfc_start_cdn_integration', array($this, 'wpfc_start_cdn_integration_ajax_request_callback')); add_action( 'wp_ajax_wpfc_save_cdn_integration', array($this, 'wpfc_save_cdn_integration_ajax_request_callback')); add_action( 'wp_ajax_wpfc_cdn_template', array($this, 'wpfc_cdn_template_ajax_request_callback')); add_action( 'wp_ajax_wpfc_check_url', array($this, 'wpfc_check_url_ajax_request_callback')); add_action( 'wp_ajax_wpfc_cache_statics_get', array($this, 'wpfc_cache_statics_get_callback')); add_action( 'wp_ajax_wpfc_db_statics', array($this, 'wpfc_db_statics_callback')); add_action( 'wp_ajax_wpfc_db_fix', array($this, 'wpfc_db_fix_callback')); add_action( 'rate_post', array($this, 'wp_postratings_clear_fastest_cache'), 10, 2); add_action( 'user_register', array($this, 'modify_htaccess_for_new_user'), 10, 1); add_action( 'profile_update', array($this, 'modify_htaccess_for_new_user'), 10, 1); add_action( 'edit_terms', array($this, 'delete_cache_of_term'), 10, 1); add_action( 'wp_ajax_wpfc_save_csp', array($this, 'wpfc_save_csp_callback')); add_action( 'wp_ajax_wpfc_remove_csp', array($this, 'wpfc_remove_csp_callback')); add_action( 'wp_ajax_wpfc_get_list_csp', array($this, 'wpfc_get_list_csp_callback')); add_action( 'wp_ajax_wpfc_save_varnish', array($this, 'wpfc_save_varnish_callback')); add_action( 'wp_ajax_wpfc_remove_varnish', array($this, 'wpfc_remove_varnish_callback')); add_action( 'wp_ajax_wpfc_pause_varnish', array($this, 'wpfc_pause_varnish_callback')); add_action( 'wp_ajax_wpfc_start_varnish', array($this, 'wpfc_start_varnish_callback')); add_action( 'wp_ajax_wpfc_purgecache_varnish', array($this, 'wpfc_purgecache_varnish_callback')); if(defined("WPFC_CLEAR_CACHE_AFTER_SWITCH_THEME") && WPFC_CLEAR_CACHE_AFTER_SWITCH_THEME){ add_action('after_switch_theme', array($this, 'clear_cache_after_switch_theme')); } if(defined("WPFC_CLEAR_CACHE_AFTER_ACTIVATE_DEACTIVATE_PLUGIN") && WPFC_CLEAR_CACHE_AFTER_ACTIVATE_DEACTIVATE_PLUGIN){ add_action('activate_plugin', array($this, 'clear_cache_after_activate_plugin')); add_action('deactivate_plugin', array($this, 'clear_cache_after_deactivate_plugin')); } add_action('upgrader_process_complete', array($this, 'clear_cache_after_update_plugin'), 10, 2); add_action('upgrader_process_complete', array($this, 'clear_cache_after_update_theme'), 10, 2); if(defined("WPFC_DISABLE_CLEARING_CACHE_AFTER_WOOCOMMERCE_CHECKOUT_ORDER_PROCESSED") && WPFC_DISABLE_CLEARING_CACHE_AFTER_WOOCOMMERCE_CHECKOUT_ORDER_PROCESSED){ }else if(defined("WPFC_DISABLE_CLEARING_CACHE_AFTER_WOOCOMMERCE_ORDER_STATUS_CHANGED") && WPFC_DISABLE_CLEARING_CACHE_AFTER_WOOCOMMERCE_ORDER_STATUS_CHANGED){ }else{ // to clear cache after new Woocommerce orders add_action('woocommerce_order_status_changed', array($this, 'clear_cache_after_woocommerce_order_status_changed'), 1, 1); } // kk Star Ratings: to clear the cache of the post after voting add_action('kksr_rate', array($this, 'clear_cache_on_kksr_rate')); // Elementor: to clear cache after Maintenance Mode activation/deactivation add_action('elementor/maintenance_mode/mode_changed', array($this, 'deleteCache')); // clearing cache hooks add_action("wpfc_clear_all_cache", array($this, 'deleteCache'), 10, 1); add_action("wpfc_clear_all_site_cache", array($this, 'wpfc_clear_cache_of_allsites_callback')); add_action("wpfc_clear_post_cache_by_id", array($this, 'singleDeleteCache'), 10, 2); // create cache by id hook add_action("wpfc_create_post_cache_by_id", array($this, 'create_post_cache_by_id'), 10, 1); // to enable Auto Cache Panel for the classic editor add_action( 'admin_init', array($this, 'enable_auto_cache_settings_panel')); // to add settings link add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array($this, 'action_links')); // to clear cache after ajax request by other plugins if(isset($_POST["action"])){ // All In One Schema.org Rich Snippets if(preg_match("/bsf_(update|submit)_rating/i", $_POST["action"])){ if(isset($_POST["post_id"])){ $this->singleDeleteCache(false, $_POST["post_id"]); } } // Yet Another Stars Rating if($_POST["action"] == "yasr_send_visitor_rating"){ if(isset($_POST["post_id"])){ // to need call like that because get_permalink() does not work if we call singleDeleteCache() directly add_action('init', array($this, "singleDeleteCache")); } } } // to clear /tmpWpfc folder if(is_dir($this->getWpContentDir("/cache/tmpWpfc"))){ $this->rm_folder_recursively($this->getWpContentDir("/cache/tmpWpfc")); } if($this->isPluginActive('wp-polls/wp-polls.php')){ //for WP-Polls require_once "inc/wp-polls.php"; $wp_polls = new WpPollsForWpFc(); $wp_polls->hook(); } if(isset($_GET) && isset($_GET["action"]) && in_array($_GET["action"], $optimize_image_ajax_requests)){ if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){ include_once $this->get_premium_path("image.php"); $img = new WpFastestCacheImageOptimisation(); $img->hook(); } }else if(isset($_GET) && isset($_GET["action"]) && $_GET["action"] == "wpfastestcache"){ if(isset($_GET) && isset($_GET["type"]) && $_GET["type"] == "preload"){ // /?action=wpfastestcache&type=preload add_action('init', array($this, "create_preload_cache"), 11); } if(isset($_GET) && isset($_GET["type"]) && preg_match("/^clearcache(andminified|allsites)*$/i", $_GET["type"])){ // /?action=wpfastestcache&type=clearcache&token=123 // /?action=wpfastestcache&type=clearcacheandminified&token=123 add_action('wp_loaded', array($this, "handle_custom_delete_cache_request")); } }else{ $this->setCustomInterval(); $this->options = $this->getOptions(); add_action('transition_post_status', array($this, 'on_all_status_transitions'), 10, 3 ); // when the regular price is updated, the "transition_post_status" action cannot catch it add_action('woocommerce_update_product', array($this, 'clear_cache_after_woocommerce_update_product'), 10, 1); $this->commentHooks(); $this->checkCronTime(); if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){ include_once $this->get_premium_path("mobile-cache.php"); if(file_exists(WPFC_WP_PLUGIN_DIR."/wp-fastest-cache-premium/pro/library/statics.php")){ include_once $this->get_premium_path("statics.php"); } if(!defined('DOING_AJAX')){ include_once $this->get_premium_path("powerful-html.php"); } } if(is_admin()){ add_action('wp_loaded', array($this, "load_column")); if(defined('DOING_AJAX') && DOING_AJAX){ //do nothing }else{ // to avoid loading menu and optionPage() twice if(!class_exists("WpFastestCacheAdmin")){ //for wp-panel if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){ include_once $this->get_premium_path("image.php"); } if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){ include_once $this->get_premium_path("logs.php"); } add_action('plugins_loaded', array($this, 'wpfc_load_plugin_textdomain')); add_action('wp_loaded', array($this, "load_admin_toolbar")); $this->admin(); } } }else{ if(preg_match("/\/([^\/]+)\/([^\/]+(\.css|\.js))(\?.+)?$/", $this->current_url(), $path)){ // for security if(preg_match("/\.{2,}/", $this->current_url())){ die("May be Directory Traversal Attack"); } if(is_dir($this->getWpContentDir("/cache/wpfc-minified/").$path[1])){ if($sources = @scandir($this->getWpContentDir("/cache/wpfc-minified/").$path[1], 1)){ if(isset($sources[0])){ // $exist_url = str_replace($path[2], $sources[0], $this->current_url()); // header('Location: ' . $exist_url, true, 301); // exit; if(preg_match("/\.css/", $this->current_url())){ header('Content-type: text/css'); }else if(preg_match("/\.js/", $this->current_url())){ header('Content-type: text/js'); } echo file_get_contents($this->getWpContentDir("/cache/wpfc-minified/").$path[1]."/".$sources[0]); exit; } } } if(preg_match("/".basename($this->getWpContentDir("/cache/wpfc-minified/"))."/i", $this->current_url())){ //for non-exists minified files if(preg_match("/\.css/", $this->current_url())){ header('Content-type: text/css'); die("/* File not found */"); }else if(preg_match("/\.js/", $this->current_url())){ header('Content-type: text/js'); die("//File not found"); } } }else{ // to show if the user is logged-in add_action('wp_loaded', array($this, "load_admin_toolbar")); //for cache $this->cache(); } } } } public function handle_custom_delete_cache_request(){ $action = false; $wpfc_token = false; if(defined("WPFC_CLEAR_CACHE_URL_TOKEN") && WPFC_CLEAR_CACHE_URL_TOKEN){ $wpfc_token = WPFC_CLEAR_CACHE_URL_TOKEN; }else{ $wpfc_token = apply_filters( 'wpfc_clear_cache_url_token', false ); } if(isset($_GET["token"]) && $_GET["token"]){ if($wpfc_token){ if($wpfc_token == $_GET["token"]){ $action = true; }else{ die("Wrong token"); } }else{ die("WPFC_CLEAR_CACHE_URL_TOKEN must be defined"); } }else{ die("Security token must be set."); } if($action){ if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){ include_once $this->get_premium_path("mobile-cache.php"); } if($_GET["type"] == "clearcache"){ if(isset($_GET["post_id"])){ $this->singleDeleteCache(false, $_GET["post_id"]); }else{ $this->deleteCache(); } } if($_GET["type"] == "clearcacheandminified"){ $this->deleteCache(true); } if($_GET["type"] == "clearcacheallsites"){ $this->wpfc_clear_cache_of_allsites_callback(); } die("Done"); } exit; } public function enable_auto_cache_settings_panel(){ if($this->isPluginActive('classic-editor/classic-editor.php') || $this->isPluginActive('disable-gutenberg/disable-gutenberg.php') || has_filter("use_block_editor_for_post", "__return_false")){ add_action("add_meta_boxes", array($this, "add_meta_box"), 10, 2); add_action('admin_notices', array($this, 'single_preload_inline_js')); add_action('wp_ajax_wpfc_preload_single_save_settings', array($this, "wpfc_preload_single_save_settings_callback")); add_action('wp_ajax_wpfc_preload_single', array($this, "wpfc_preload_single_callback")); } } public function clear_cache_after_activate_plugin(){ $this->deleteCache(true); } public function clear_cache_after_deactivate_plugin(){ $this->deleteCache(true); } public function clear_cache_after_switch_theme(){ $this->deleteCache(true); } public function clear_cache_after_update_plugin($upgrader_object, $options){ if(isset($options['action']) && isset($options['type'])){ if($options['action'] == 'update'){ if($options['type'] == 'plugin' && (isset($options['plugins']) || isset($options['plugin']))){ $options_json = json_encode($options); if(preg_match("/elementor\\\\\/elementor\.php/i", $options_json)){ $this->deleteCache(true); } if(defined("WPFC_CLEAR_CACHE_AFTER_PLUGIN_UPDATE") && WPFC_CLEAR_CACHE_AFTER_PLUGIN_UPDATE){ $this->deleteCache(true); } } } } } public function clear_cache_after_update_theme($upgrader_object, $options){ if(isset($options['action']) && isset($options['type'])){ if($options['action'] == 'update'){ if($options['type'] == 'theme' && isset($options['themes'])){ if(defined("WPFC_CLEAR_CACHE_AFTER_THEME_UPDATE") && WPFC_CLEAR_CACHE_AFTER_THEME_UPDATE){ $this->deleteCache(true); } } } } } public function action_links($actions){ $actions['powered_settings'] = sprintf(__( 'Settings', 'wp-fastest-cache'), esc_url( admin_url( 'admin.php?page=wpfastestcacheoptions'))); return array_reverse($actions); } public function wpfc_preload_single_callback(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){ die( 'Security check' ); } include_once('inc/single-preload.php'); SinglePreloadWPFC::create_cache(); } public function create_post_cache_by_id($id){ include_once('inc/single-preload.php'); SinglePreloadWPFC::init($id); $res = SinglePreloadWPFC::create_cache_for_all_urls(); return $res; } public function single_preload_inline_js(){ include_once('inc/single-preload.php'); SinglePreloadWPFC::init(); SinglePreloadWPFC::put_inline_js(); } public function add_meta_box(){ include_once('inc/single-preload.php'); SinglePreloadWPFC::add_meta_box(); } public function wpfc_preload_single_save_settings_callback(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){ die( 'Security check' ); } include_once('inc/single-preload.php'); SinglePreloadWPFC::save_settings(); } public function notify($message = array()){ if(isset($message[0]) && $message[0]){ if(function_exists("add_settings_error")){ add_settings_error('wpfc-notice', esc_attr( 'settings_updated' ), $message[0], $message[1]); } } } public function set_content_url(){ $content_url = content_url(); // Hide My WP if($this->isPluginActive('hide_my_wp/hide-my-wp.php')){ $hide_my_wp = get_option("hide_my_wp"); if(isset($hide_my_wp["new_content_path"]) && $hide_my_wp["new_content_path"]){ $hide_my_wp["new_content_path"] = trim($hide_my_wp["new_content_path"], "/"); $content_url = str_replace(basename(WPFC_WP_CONTENT_DIR), $hide_my_wp["new_content_path"], $content_url); } } // to change content url if a different url is used for other langs if($this->isPluginActive('polylang/polylang.php') || $this->isPluginActive('polylang-pro/polylang.php')){ $url = parse_url($content_url); if(isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST']){ if($url["host"] != $_SERVER['HTTP_HOST']){ $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; $content_url = $protocol.$_SERVER['HTTP_HOST'].$url['path']; } } } if (!defined('WPFC_WP_CONTENT_URL')) { define("WPFC_WP_CONTENT_URL", $content_url); } $this->content_url = $content_url; } public function clear_cache_on_kksr_rate($id){ $this->singleDeleteCache(false, $id); } public function clear_cache_after_woocommerce_order_status_changed($order_id = false){ if(function_exists("wc_get_order")){ if($order_id){ $order = wc_get_order($order_id); if($order){ foreach($order->get_items() as $item_key => $item_values ){ if(method_exists($item_values, 'get_product_id')){ $this->singleDeleteCache(false, $item_values->get_product_id()); } } } } } } public function wpfc_db_fix_callback(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){ die( 'Security check' ); } if(current_user_can('manage_options')){ if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){ include_once $this->get_premium_path("db.php"); if(class_exists("WpFastestCacheDatabaseCleanup")){ WpFastestCacheDatabaseCleanup::clean($_GET["type"]); }else{ die(json_encode(array("success" => false, "showupdatewarning" => true, "message" => "Only available in Premium version"))); } }else{ die(json_encode(array("success" => false, "message" => "Only available in Premium version"))); } }else{ wp_die("Must be admin"); } } public function wpfc_db_statics_callback(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){ die( 'Security check' ); } global $wpdb; $statics = array("all_warnings" => 0, "post_revisions" => 0, "trashed_contents" => 0, "trashed_spam_comments" => 0, "trackback_pingback" => 0, "transient_options" => 0, "orphaned_post_meta" => 0, "orphaned_comment_meta" => 0, "orphaned_user_meta" => 0, "orphaned_term_meta" => 0, "orphaned_term_relationships" => 0 ); $statics["post_revisions"] = $wpdb->get_var("SELECT COUNT(*) FROM `$wpdb->posts` WHERE post_type = 'revision';"); $statics["all_warnings"] = $statics["all_warnings"] + $statics["post_revisions"]; $statics["trashed_contents"] = $wpdb->get_var("SELECT COUNT(*) FROM `$wpdb->posts` WHERE post_status = 'trash';"); $statics["all_warnings"] = $statics["all_warnings"] + $statics["trashed_contents"]; $statics["trashed_spam_comments"] = $wpdb->get_var("SELECT COUNT(*) FROM `$wpdb->comments` WHERE comment_approved = 'spam' OR comment_approved = 'trash' ;"); $statics["all_warnings"] = $statics["all_warnings"] + $statics["trashed_spam_comments"]; $statics["trackback_pingback"] = $wpdb->get_var("SELECT COUNT(*) FROM `$wpdb->comments` WHERE comment_type = 'trackback' OR comment_type = 'pingback' ;"); $statics["all_warnings"] = $statics["all_warnings"] + $statics["trackback_pingback"]; $element = "SELECT COUNT(*) FROM `$wpdb->options` WHERE option_name LIKE '%\_transient\_%' ;"; $statics["transient_options"] = $wpdb->get_var( $element ) > 100 ? $wpdb->get_var( $element ) : 0; $statics["all_warnings"] = $statics["all_warnings"] + $statics["transient_options"]; $statics["orphaned_post_meta"] = $wpdb->get_var("SELECT COUNT(pm.meta_id) FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE p.ID IS NULL"); $statics["all_warnings"] += $statics["orphaned_post_meta"]; $statics["orphaned_comment_meta"] = $wpdb->get_var("SELECT COUNT(cm.meta_id) FROM {$wpdb->commentmeta} cm LEFT JOIN {$wpdb->comments} c ON c.comment_ID = cm.comment_id WHERE c.comment_ID IS NULL"); $statics["all_warnings"] += $statics["orphaned_comment_meta"]; $statics["orphaned_user_meta"] = $wpdb->get_var("SELECT COUNT(um.umeta_id) FROM {$wpdb->usermeta} um LEFT JOIN {$wpdb->users} u ON u.ID = um.user_id WHERE u.ID IS NULL"); $statics["all_warnings"] += $statics["orphaned_user_meta"]; $statics["orphaned_term_meta"] = $wpdb->get_var("SELECT COUNT(tm.meta_id) FROM {$wpdb->termmeta} tm LEFT JOIN {$wpdb->terms} t ON t.term_id = tm.term_id WHERE t.term_id IS NULL"); $statics["all_warnings"] += $statics["orphaned_term_meta"]; $statics["orphaned_term_relationships"] = $wpdb->get_var("SELECT COUNT(tr.object_id) FROM {$wpdb->term_relationships} tr LEFT JOIN {$wpdb->posts} p ON p.ID = tr.object_id WHERE p.ID IS NULL"); $statics["all_warnings"] += $statics["orphaned_term_relationships"]; die(json_encode($statics)); } public function is_trailing_slash(){ // no need to check if Custom Permalinks plugin is active (https://tr.wordpress.org/plugins/custom-permalinks/) if($this->isPluginActive("custom-permalinks/custom-permalinks.php")){ return false; } if($permalink_structure = get_option('permalink_structure')){ if(preg_match("/\/$/", $permalink_structure)){ return true; } } return false; } public function wpfc_cache_statics_get_callback(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){ die( 'Security check' ); } if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){ if(file_exists(WPFC_WP_PLUGIN_DIR."/wp-fastest-cache-premium/pro/library/statics.php")){ include_once $this->get_premium_path("statics.php"); $cache_statics = new WpFastestCacheStatics(); $res = $cache_statics->get(); echo json_encode($res); exit; } } } public function wpfc_check_url_ajax_request_callback(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'cdn-nonce')){ die( 'Security check' ); } include_once('inc/cdn.php'); CdnWPFC::check_url(); } public function wpfc_cdn_template_ajax_request_callback(){ include_once('inc/cdn.php'); CdnWPFC::cdn_template(); } public function wpfc_save_cdn_integration_ajax_request_callback(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'cdn-nonce')){ die( 'Security check' ); } include_once('inc/cdn.php'); CdnWPFC::save_cdn_integration(); } public function wpfc_start_cdn_integration_ajax_request_callback(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'cdn-nonce')){ die( 'Security check' ); } include_once('inc/cdn.php'); CdnWPFC::start_cdn_integration(); } public function wpfc_pause_cdn_integration_ajax_request_callback(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'cdn-nonce')){ die( 'Security check' ); } include_once('inc/cdn.php'); CdnWPFC::pause_cdn_integration(); } public function wpfc_remove_cdn_integration_ajax_request_callback(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'cdn-nonce')){ die( 'Security check' ); } include_once('inc/cdn.php'); CdnWPFC::remove_cdn_integration(); } public function wpfc_cdn_options_ajax_request_callback(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'cdn-nonce')){ die( 'Security check' ); } include_once('inc/cdn.php'); CdnWPFC::cdn_options(); } public function wpfc_save_exclude_pages_callback(){ if(!wp_verify_nonce($_POST["security"], 'wpfc-save-exclude-ajax-nonce')){ die( 'Security check' ); } if(current_user_can('manage_options')){ if(isset($_POST["rules"])){ foreach ($_POST["rules"] as $key => &$value) { $value["prefix"] = strip_tags($value["prefix"]); $value["content"] = strip_tags($value["content"]); $value["prefix"] = preg_replace("/\'|\"/", "", $value["prefix"]); if($value["prefix"] == "regex"){ $value["content"] = stripslashes($value["content"]); $value["content"] = esc_attr($value["content"]); }else{ $value["content"] = preg_replace("/\'|\"/", "", $value["content"]); $value["content"] = preg_replace("/(\#|\s|\(|\)|\*)/", "", $value["content"]); } if($value["prefix"] == "homepage"){ $this->deleteHomePageCache(false); } } $data = json_encode($_POST["rules"]); if(get_option("WpFastestCacheExclude")){ update_option("WpFastestCacheExclude", $data); }else{ add_option("WpFastestCacheExclude", $data, null, "yes"); } }else{ delete_option("WpFastestCacheExclude"); } $this->modify_htaccess_for_exclude(); echo json_encode(array("success" => true)); exit; }else{ wp_die("Must be admin"); } } public function modify_htaccess_for_exclude(){ $path = ABSPATH; if($this->is_subdirectory_install()){ $path = $this->getABSPATH(); } $htaccess = @file_get_contents($path.".htaccess"); if(preg_match("/\#\s?Start\sWPFC\sExclude/", $htaccess)){ $exclude_rules = $this->excludeRules(); $htaccess = preg_replace("/\#\s?Start\sWPFC\sExclude[^\#]*\#\s?End\sWPFC\sExclude\s+/", $exclude_rules, $htaccess); } @file_put_contents($path.".htaccess", $htaccess); } public function wpfc_purgecache_varnish_callback(){ if(!wp_verify_nonce($_REQUEST["security"], 'wpfc-varnish-ajax-nonce')){ die( 'Security check' ); } if($varnish_datas = get_option("WpFastestCacheVarnish")){ include_once('inc/varnish.php'); $res_arr = VarnishWPFC::purge_cache($varnish_datas["server"]); wp_send_json($res_arr); } } public function wpfc_save_varnish_callback(){ include_once('inc/varnish.php'); VarnishWPFC::save(); } public function wpfc_remove_varnish_callback(){ include_once('inc/varnish.php'); VarnishWPFC::remove(); } public function wpfc_start_varnish_callback(){ include_once('inc/varnish.php'); VarnishWPFC::start(); } public function wpfc_pause_varnish_callback(){ include_once('inc/varnish.php'); VarnishWPFC::pause(); } public function wpfc_status_varnish(){ include_once('inc/varnish.php'); VarnishWPFC::status(); } public function wpfc_get_list_csp_callback(){ include_once('inc/clearing-specific-pages.php'); ClearingSpecificPagesWPFC::get_list(); } public function wpfc_save_csp_callback(){ include_once('inc/clearing-specific-pages.php'); ClearingSpecificPagesWPFC::save(); } public function wpfc_remove_csp_callback(){ include_once('inc/clearing-specific-pages.php'); ClearingSpecificPagesWPFC::remove(); } public function wpfc_save_timeout_pages_callback(){ if(!wp_verify_nonce($_POST["security"], 'wpfc-save-timeout-ajax-nonce')){ die( 'Security check' ); } if(current_user_can('manage_options')){ $this->setCustomInterval(); $crons = _get_cron_array(); foreach ($crons as $cron_key => $cron_value) { foreach ( (array) $cron_value as $hook => $events ) { if(preg_match("/^wp\_fastest\_cache(.*)/", $hook, $id)){ if(!$id[1] || preg_match("/^\_(\d+)$/", $id[1])){ foreach ( (array) $events as $event_key => $event ) { if($id[1]){ wp_clear_scheduled_hook("wp_fastest_cache".$id[1], $event["args"]); }else{ wp_clear_scheduled_hook("wp_fastest_cache", $event["args"]); } } } } } } if(isset($_POST["rules"]) && count($_POST["rules"]) > 0){ $i = 0; foreach ($_POST["rules"] as $key => $value) { if(preg_match("/^(daily|onceaday)$/i", $value["schedule"]) && isset($value["hour"]) && isset($value["minute"]) && strlen($value["hour"]) > 0 && strlen($value["minute"]) > 0){ $args = array("prefix" => $value["prefix"], "content" => $value["content"], "hour" => $value["hour"], "minute" => $value["minute"]); $timestamp = mktime($value["hour"],$value["minute"],0,date("m"),date("d"),date("Y")); $timestamp = $timestamp > time() ? $timestamp : $timestamp + 60*60*24; }else{ $args = array("prefix" => $value["prefix"], "content" => $value["content"]); $timestamp = time(); } wp_schedule_event($timestamp, $value["schedule"], "wp_fastest_cache_".$i, array(json_encode($args))); $i = $i + 1; } } echo json_encode(array("success" => true)); exit; }else{ wp_die("Must be admin"); } } public function wp_postratings_clear_fastest_cache($rate_userid, $post_id){ // to remove cache if vote is from homepage or category page or tag if(isset($_SERVER["HTTP_REFERER"]) && $_SERVER["HTTP_REFERER"]){ $url = parse_url($_SERVER["HTTP_REFERER"]); $url["path"] = isset($url["path"]) ? $url["path"] : "/index.html"; if(isset($url["path"])){ if($url["path"] == "/"){ $this->rm_folder_recursively($this->getWpContentDir("/cache/all/index.html")); }else{ // to prevent changing path with ../ or with another method if($url["path"] == realpath(".".$url["path"])){ $this->rm_folder_recursively($this->getWpContentDir("/cache/all").$url["path"]); } } } } if($post_id){ $this->singleDeleteCache(false, $post_id); } } private function admin(){ if(isset($_GET["page"]) && $_GET["page"] == "wpfastestcacheoptions"){ include_once('inc/admin.php'); $wpfc = new WpFastestCacheAdmin(); $wpfc->addMenuPage(); }else{ add_action('admin_menu', array($this, 'register_my_custom_menu_page')); } } public function load_column(){ if(!defined('WPFC_HIDE_CLEAR_CACHE_BUTTON') || (defined('WPFC_HIDE_CLEAR_CACHE_BUTTON') && !WPFC_HIDE_CLEAR_CACHE_BUTTON)){ include_once plugin_dir_path(__FILE__)."inc/column.php"; $column = new WpFastestCacheColumn(); $column->add(); } } public function load_admin_toolbar(){ $display = true; if(apply_filters('wpfc_hide_toolbar', false )){ $display = ""; } if(defined('WPFC_HIDE_TOOLBAR') && WPFC_HIDE_TOOLBAR){ $display = ""; } if($display){ $user = wp_get_current_user(); $allowed_roles = array('administrator'); $wpfc_role_status = get_option("WpFastestCacheToolbarSettings"); if(is_array($wpfc_role_status) && !empty($wpfc_role_status)){ foreach ($wpfc_role_status as $key => $value){ $key = str_replace("wpfc_toolbar_", "", $key); array_push($allowed_roles, strtolower($key)); } } if(array_intersect($allowed_roles, $user->roles)){ include_once plugin_dir_path(__FILE__)."inc/admin-toolbar.php"; if(preg_match("/\/cache\/all/", $this->getWpContentDir("/cache/all"))){ $is_multi = false; }else{ $is_multi = true; } $toolbar = new WpFastestCacheAdminToolbar($is_multi); $toolbar->add(); } } } public function tmp_saveOption(){ if(!empty($_POST)){ if(isset($_POST["wpFastestCachePage"])){ include_once('inc/admin.php'); $wpfc = new WpFastestCacheAdmin(); $wpfc->optionsPageRequest(); } } } public function register_mysettings(){ register_setting('wpfc-group', 'wpfc-group', array($this, 'tmp_saveOption')); } public function register_my_custom_menu_page(){ if(function_exists('add_menu_page')){ if(defined("WPFC_MOVE_MENU_ITEM_UNDER_SETTINGS") && WPFC_MOVE_MENU_ITEM_UNDER_SETTINGS){ add_options_page("WP Fastest Cache Settings", "WP Fastest Cache", 'manage_options', 'wpfastestcacheoptions', array($this, 'optionsPage')); }else{ add_menu_page("WP Fastest Cache Settings", "WP Fastest Cache", 'manage_options', "wpfastestcacheoptions", array($this, 'optionsPage'), plugins_url("wp-fastest-cache/images/icon.svg")); } add_action('admin_init', array($this, 'register_mysettings')); wp_enqueue_style("wp-fastest-cache", plugins_url("wp-fastest-cache/css/style.css"), array(), time(), "all"); } if(isset($_GET["page"]) && $_GET["page"] == "wpfastestcacheoptions"){ wp_enqueue_style("wp-fastest-cache-buycredit", plugins_url("wp-fastest-cache/css/buycredit.css"), array(), time(), "all"); wp_enqueue_style("wp-fastest-cache-flaticon", plugins_url("wp-fastest-cache/css/flaticon.css"), array(), time(), "all"); wp_enqueue_style("wp-fastest-cache-dialog", plugins_url("wp-fastest-cache/css/dialog.css"), array(), time(), "all"); } } public function deleteCacheToolbar(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){ die( 'Security check' ); } $this->deleteCache(); } public function deleteCssAndJsCacheToolbar(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){ die( 'Security check' ); } $this->deleteCache(true); } public function wpfc_toolbar_get_settings_callback(){ if(current_user_can('manage_options')){ $result = array("success" => true, "roles" => false); $wpfc_role_status = get_option("WpFastestCacheToolbarSettings"); if(is_array($wpfc_role_status) && !empty($wpfc_role_status)){ $result["roles"] = $wpfc_role_status; } die(json_encode($result)); }else{ wp_die("Must be admin"); } } public function wpfc_cache_path_save_settings_callback(){ if(current_user_can('manage_options')){ foreach($_POST as $key => &$value){ $value = esc_html(esc_sql($value)); } $path_arr = array( "cachepath" => sanitize_text_field($_POST["cachepath"]), "optimizedpath" => sanitize_text_field($_POST["optimizedpath"]) ); if(get_option("WpFastestCachePathSettings") === false){ add_option("WpFastestCachePathSettings", $path_arr, 1, "no"); }else{ update_option("WpFastestCachePathSettings", $path_arr); } die(json_encode(array("success" => true))); }else{ wp_die("Must be admin"); } } public function wpfc_toolbar_save_settings_callback(){ if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){ die( 'Security check' ); } if(current_user_can('manage_options')){ if(isset($_GET["roles"]) && is_array($_GET["roles"]) && !empty($_GET["roles"])){ $roles_arr = array(); foreach($_GET["roles"] as $key => $value){ $value = esc_html(esc_sql($value)); $key = esc_html(esc_sql($key)); $roles_arr[$key] = $value; } if(get_option("WpFastestCacheToolbarSettings") === false){ add_option("WpFastestCacheToolbarSettings", $roles_arr, 1, "no"); }else{ update_option("WpFastestCacheToolbarSettings", $roles_arr); } }else{ delete_option("WpFastestCacheToolbarSettings"); } die(json_encode(array("Saved","success"))); }else{ wp_die("Must be admin"); } } public function wpfc_clear_cache_of_allsites_callback(){ if(defined('DOING_AJAX') && DOING_AJAX){ if(!wp_verify_nonce($_REQUEST["nonce"], 'wpfc')){ die( 'Security check' ); } } include_once('inc/cdn.php'); CdnWPFC::cloudflare_clear_cache(); $path = $this->getWpContentDir("/cache/*"); $files = glob($this->getWpContentDir("/cache/*")); if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){ if(@mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true)){ //tmpWpfc has been created } } foreach ((array)$files as $file){ @rename($file, $this->getWpContentDir("/cache/tmpWpfc/").basename($file)."-".time()); } if (is_admin() && defined('DOING_AJAX') && DOING_AJAX){ die(json_encode(array("The cache of page has been cleared","success"))); } } public function delete_current_page_cache(){ if(!wp_verify_nonce($_GET["nonce"], "wpfc")){ die(json_encode(array("Security Error!", "error", "alert"))); } if($varnish_datas = get_option("WpFastestCacheVarnish")){ include_once('inc/varnish.php'); VarnishWPFC::purge_cache($varnish_datas); } include_once('inc/cdn.php'); CdnWPFC::cloudflare_clear_cache(); if(isset($_GET["path"])){ if($_GET["path"]){ if($_GET["path"] == "/"){ $_GET["path"] = $_GET["path"]."index.html"; } }else{ $_GET["path"] = "/index.html"; } $_GET["path"] = urldecode(esc_url_raw($_GET["path"])); // for security if(preg_match("/\.{2,}/", $_GET["path"])){ die("May be Directory Traversal Attack"); } $paths = array(); array_push($paths, $this->getWpContentDir("/cache/all").$_GET["path"]); if(class_exists("WpFcMobileCache")){ $wpfc_mobile = new WpFcMobileCache(); array_push($paths, $this->getWpContentDir("/cache/wpfc-mobile-cache").$_GET["path"]); } foreach ($paths as $key => $value){ if(file_exists($value)){ if(preg_match("/\/(all|wpfc-mobile-cache)\/index\.html$/i", $value)){ @unlink($value); }else{ $this->rm_folder_recursively($value); } } } $this->delete_multiple_domain_mapping_cache(); die(json_encode(array("The cache of page has been cleared","success"))); }else{ die(json_encode(array("Path has NOT been defined", "error", "alert"))); } exit; } private function cache(){ if(isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST']){ include_once('inc/cache.php'); $wpfc = new WpFastestCacheCreateCache(); $wpfc->createCache(); } } protected function slug(){ return "wp_fastest_cache"; } public function getWpContentDir($path = false){ /* Sample Paths; /cache/ /cache/all/ /cache/all /cache/all/page /cache/all/index.html /cache/wpfc-minified /cache/wpfc-widget-cache /cache/wpfc-mobile-cache/ /cache/wpfc-mobile-cache/page /cache/wpfc-mobile-cache/index.html /cache/tmpWpfc /cache/tmpWpfc/ /cache/tmpWpfc/mobile_ /cache/tmpWpfc/m /cache/tmpWpfc/w /cache/testWpFc/ /cache/all/testWpFc/ /cache/wpfc-widget-cache/ /cache/wpfc-widget-cache /cache/wpfc-widget-cache/".$args["widget_id"].".html */ if($path){ if(preg_match("/\/cache\/(all|wpfc-minified|wpfc-widget-cache|wpfc-mobile-cache)/", $path)){ //WPML language switch //https://wpml.org/forums/topic/wpml-language-switch-wp-fastest-cache-issue/ $language_negotiation_type = apply_filters('wpml_setting', false, 'language_negotiation_type'); if(($language_negotiation_type == 2) && $this->isPluginActive('sitepress-multilingual-cms/sitepress.php')){ $my_home_url = apply_filters('wpml_home_url', get_option('home')); $my_home_url = preg_replace("/https?\:\/\//i", "", $my_home_url); $my_home_url = trim($my_home_url, "/"); $path = preg_replace("/\/cache\/(all|wpfc-minified|wpfc-widget-cache|wpfc-mobile-cache)/", "/cache/".$my_home_url."/$1", $path); }else if(($language_negotiation_type == 1) && $this->isPluginActive('sitepress-multilingual-cms/sitepress.php')){ $my_current_lang = apply_filters('wpml_current_language', NULL); if($my_current_lang){ $path = preg_replace("/\/cache\/wpfc-widget-cache\/(.+)/", "/cache/wpfc-widget-cache/".$my_current_lang."-"."$1", $path); } } if($this->isPluginActive('multiple-domain-mapping-on-single-site/multidomainmapping.php')){ $path = preg_replace("/\/cache\/(all|wpfc-minified|wpfc-widget-cache|wpfc-mobile-cache)/", "/cache/".$_SERVER['HTTP_HOST']."/$1", $path); } if($this->isPluginActive('polylang/polylang.php') || $this->isPluginActive('polylang-pro/polylang.php')){ $polylang_settings = get_option("polylang"); if(isset($polylang_settings["force_lang"])){ if($polylang_settings["force_lang"] == 2 || $polylang_settings["force_lang"] == 3){ // The language is set from the subdomain name in pretty permalinks // The language is set from different domains $path = preg_replace("/\/cache\/(all|wpfc-minified|wpfc-widget-cache|wpfc-mobile-cache)/", "/cache/".$_SERVER['HTTP_HOST']."/$1", $path); } } } if($this->isPluginActive('multiple-domain/multiple-domain.php')){ $path = preg_replace("/\/cache\/(all|wpfc-minified|wpfc-widget-cache|wpfc-mobile-cache)/", "/cache/".$_SERVER['HTTP_HOST']."/$1", $path); } if(is_multisite()){ $path = preg_replace("/\/cache\/(all|wpfc-minified|wpfc-widget-cache|wpfc-mobile-cache)/", "/cache/".$_SERVER['HTTP_HOST']."/$1", $path); } } return WPFC_WP_CONTENT_DIR.$path; }else{ return WPFC_WP_CONTENT_DIR; } } protected function getOptions(){ return $GLOBALS["wp_fastest_cache_options"]; } protected function getSystemMessage(){ return $this->systemMessage; } protected function get_excluded_useragent(){ return "facebookexternalhit|WP_FASTEST_CACHE_CSS_VALIDATOR|Twitterbot|LinkedInBot|WhatsApp|Mediatoolkitbot"; } // protected function detectNewPost(){ // if(isset($this->options->wpFastestCacheNewPost) && isset($this->options->wpFastestCacheStatus)){ // add_filter ('save_post', array($this, 'deleteCache')); // } // } public function deleteWidgetCache(){ $widget_cache_path = $this->getWpContentDir("/cache/wpfc-widget-cache"); if(is_dir($widget_cache_path)){ if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){ if(@mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true)){ //tmpWpfc has been created } } if(@rename($widget_cache_path, $this->getWpContentDir("/cache/tmpWpfc/w").time())){ //DONE } } } public function clear_cache_after_woocommerce_update_product($product_id){ if(!$this->deleted_before){ $this->singleDeleteCache(false, $product_id); } } public function on_all_status_transitions($new_status, $old_status, $post){ $this->deleted_before = true; if(!wp_is_post_revision($post->ID)){ if(isset($post->post_type)){ if($post->post_type == "nf_sub"){ return 0; } } if($new_status == "publish" && $old_status != "publish"){ $this->specificDeleteCache(); if(isset($this->options->wpFastestCacheNewPost) && isset($this->options->wpFastestCacheStatus)){ if(isset($this->options->wpFastestCacheNewPost_type) && $this->options->wpFastestCacheNewPost_type){ if($this->options->wpFastestCacheNewPost_type == "all"){ $this->deleteCache(); }else if($this->options->wpFastestCacheNewPost_type == "homepage"){ $this->deleteHomePageCache(); //to clear category cache and tag cache $this->singleDeleteCache(false, $post->ID); //to clear widget cache $this->deleteWidgetCache(); } }else{ $this->deleteCache(); } } } if(isset($this->options->wpFastestCacheStatus) && $new_status == "publish" && $old_status == "publish"){ // if(isset($this->options->wpFastestCacheUpdatePost) && isset($this->options->wpFastestCacheStatus)){ // if($this->options->wpFastestCacheUpdatePost_type == "post"){ // $this->singleDeleteCache(false, $post->ID); // }else if($this->options->wpFastestCacheUpdatePost_type == "all"){ // $this->deleteCache(); // } // } $this->specificDeleteCache(); if(isset($this->options->wpFastestCacheUpdatePost)){ if($this->options->wpFastestCacheUpdatePost_type == "post"){ $this->singleDeleteCache(false, $post->ID); }else if($this->options->wpFastestCacheUpdatePost_type == "all"){ $this->deleteCache(); } }else{ // to clear only cache of content even though the "update post" option is disabled $this->singleDeleteCache(false, $post->ID, false); } } if($new_status == "trash" && $old_status == "publish"){ if($post->post_type == "shop_coupon"){ // YITH WooCommerce Coupon Email System Premium return; } $this->singleDeleteCache(false, $post->ID); }else if(($new_status == "draft" || $new_status == "pending" || $new_status == "private") && $old_status == "publish"){ $this->deleteCache(); } } } protected function commentHooks(){ //it works when the status of a comment changes add_action('wp_set_comment_status', array($this, 'detect_comment_status_change'), 10, 2); //it works when a comment is saved in the database add_action('comment_post', array($this, 'detectNewComment'), 10, 2); // it work when a commens is updated add_action('edit_comment', array($this, 'detectEditComment'), 10, 2); } public function detect_comment_status_change($comment_id, $new_status) { $comment = get_comment($comment_id); if (!$comment) { return; // Exit if the comment doesn't exist } // Check if the comment was pending and is now marked as spam if($comment->comment_status == 'open' && $new_status === 'spam'){ return; } // Check if the comment was pending and is now marked as trash if($comment->comment_status == 'open' && $new_status === 'trash'){ return; } $this->singleDeleteCache($comment_id); } public function detectEditComment($comment_id, $comment_data){ if($comment_data["comment_approved"] == 1){ $this->singleDeleteCache($comment_id); } } public function detectNewComment($comment_id, $comment_approved){ // if(current_user_can( 'manage_options') || !get_option('comment_moderation')){ if($comment_approved === 1){ $this->singleDeleteCache($comment_id); } } public function specificDeleteCache(){ $urls = get_option("WpFastestCacheCSP"); $files = array(); if(!empty($urls)){ foreach ($urls as $key => $value) { if(preg_match("/https?:\/\/[^\/]+\/(.+)/", $value->url, $out)){ if(preg_match("/\.{2,}/", $out[1])){ // to prevent Directory Traversal Attack continue; } if(preg_match("/\/\(\.\*\)/", $out[1])){ $out[1] = str_replace("(.*)", "", $out[1]); $path = $this->getWpContentDir("/cache/all/").$out[1]; $mobile_path = $this->getWpContentDir("/cache/wpfc-mobile-cache/").$out[1]; }else{ $out[1] = $out[1]."index.html"; $path = $this->getWpContentDir("/cache/all/").$out[1]; $mobile_path = $this->getWpContentDir("/cache/wpfc-mobile-cache/").$out[1]; } if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){ @mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true); } if(is_dir($path)){ rename($path, $this->getWpContentDir("/cache/tmpWpfc/").time()); }else if(is_file($path)){ @unlink($path); } if(is_dir($mobile_path)){ rename($mobile_path, $this->getWpContentDir("/cache/tmpWpfc/mobile_").time()); }else if(is_file($mobile_path)){ @unlink($mobile_path); } } } } } public function singleDeleteCache($comment_id = false, $post_id = false, $to_clear_parents = true){ if($varnish_datas = get_option("WpFastestCacheVarnish")){ include_once('inc/varnish.php'); VarnishWPFC::purge_cache($varnish_datas); } include_once('inc/cdn.php'); CdnWPFC::cloudflare_clear_cache(); $to_clear_feed = true; // not to clear cache of homepage/cats/tags after ajax request by other plugins if(isset($_POST) && isset($_POST["action"])){ // kk Star Rating if($_POST["action"] == "kksr_ajax"){ $to_clear_parents = false; } // All In One Schema.org Rich Snippets if(preg_match("/bsf_(update|submit)_rating/i", $_POST["action"])){ $to_clear_parents = false; } // Yet Another Stars Rating if($_POST["action"] == "yasr_send_visitor_rating"){ $to_clear_parents = false; $post_id = sanitize_text_field($_POST["post_id"]); } // All In One Schema.org Rich Snippets if(preg_match("/bsf_(update|submit)_rating/i", $_POST["action"])){ $to_clear_feed = false; } } if($comment_id){ $comment_id = intval($comment_id); $comment = get_comment($comment_id); if($comment && $comment->comment_post_ID){ $post_id = $comment->comment_post_ID; } } if($post_id){ $post_id = intval($post_id); $permalink = get_permalink($post_id); $permalink = urldecode(get_permalink($post_id)); //for trash contents if(preg_match("/\/\?(p|page_id)\=\d+/i", $permalink)){ $post = get_post($post_id); $clone_post = clone $post; $clone_post->post_status = 'publish'; $permalink = get_permalink($clone_post); $permalink = rtrim($permalink, "/"); $permalink = preg_replace("/__trashed$/", "", $permalink); //for /%postname%/%post_id% : sample-url__trashed/57595 $permalink = preg_replace("/__trashed\/(\d+)$/", "/$1", $permalink); } if(preg_match("/https?:\/\/[^\/]+\/(.+)/", $permalink, $out)){ $path = $this->getWpContentDir("/cache/all/").$out[1]; $mobile_path = $this->getWpContentDir("/cache/wpfc-mobile-cache/").$out[1]; if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){ include_once $this->get_premium_path("logs.php"); $log = new WpFastestCacheLogs("delete"); $log->action(); } $files = array(); if(is_dir($path)){ array_push($files, $path); } if(is_dir($mobile_path)){ array_push($files, $mobile_path); } if(defined('WPFC_CACHE_QUERYSTRING') && WPFC_CACHE_QUERYSTRING){ $files_with_query_string = glob($path."\?*"); $mobile_files_with_query_string = glob($mobile_path."\?*"); if(is_array($files_with_query_string) && (count($files_with_query_string) > 0)){ $files = array_merge($files, $files_with_query_string); } if(is_array($mobile_files_with_query_string) && (count($mobile_files_with_query_string) > 0)){ $files = array_merge($files, $mobile_files_with_query_string); } } if($to_clear_feed){ // to clear cache of /feed if(preg_match("/https?:\/\/[^\/]+\/(.+)/", get_feed_link(), $feed_out)){ array_push($files, $this->getWpContentDir("/cache/all/").$feed_out[1]); } // to clear cache of /comments/feed/ if(preg_match("/https?:\/\/[^\/]+\/(.+)/", get_feed_link("comments_"), $comment_feed_out)){ array_push($files, $this->getWpContentDir("/cache/all/").$comment_feed_out[1]); } } foreach((array)$files as $file){ $this->rm_folder_recursively($file); } } if($to_clear_parents){ // to clear cache of homepage $this->deleteHomePageCache(); // to clear cache of author page $this->delete_author_page_cache($post_id); // to clear sitemap cache $this->delete_sitemap_cache(); // to clear cache of next post and cache of prev post $this->delete_next_prev_cache($post_id); // to clear cache of cats and tags which contains the post (only first page) global $wpdb; $terms = $wpdb->get_results("SELECT * FROM `".$wpdb->prefix."term_relationships` WHERE `object_id`=".$post_id, ARRAY_A); foreach ($terms as $term_key => $term_val){ $this->delete_cache_of_term($term_val["term_taxonomy_id"]); } } $this->delete_multiple_domain_mapping_cache(); } } public function delete_next_prev_cache($post_id){ global $wpdb; $post = get_post($post_id); $next_post_query = "SELECT * FROM `".$wpdb->prefix."posts` WHERE ID = (SELECT min(ID) FROM `".$wpdb->prefix."posts` where ID > ".$post_id." AND `post_type` = '".$post->post_type."' AND `post_status` = 'publish')"; $prev_post_query = "SELECT * FROM `".$wpdb->prefix."posts` WHERE ID = (SELECT max(ID) FROM `".$wpdb->prefix."posts` where ID < ".$post_id." AND `post_type` = '".$post->post_type."' AND `post_status` = 'publish')"; $res = $wpdb->get_results($next_post_query." UNION ".$prev_post_query); if(isset($res[0])){ foreach ($res as $key => $value) { $permalink = urldecode(get_permalink($value->ID)); if(preg_match("/https?:\/\/[^\/]+\/(.+)/", $permalink, $out)){ $path = $this->getWpContentDir("/cache/all/").$out[1]; $mobile_path = $this->getWpContentDir("/cache/wpfc-mobile-cache/").$out[1]; if(is_dir($path)){ $this->rm_folder_recursively($path); } if(is_dir($mobile_path)){ $this->rm_folder_recursively($mobile_path); } } } } } public function delete_sitemap_cache(){ //to clear sitemap.xml and sitemap-(.+).xml $files = array_merge(glob($this->getWpContentDir("/cache/all/")."sitemap*.xml"), glob($this->getWpContentDir("/cache/wpfc-mobile-cache/")."sitemap*.xml")); foreach((array)$files as $file){ $this->rm_folder_recursively($file); } } public function delete_multiple_domain_mapping_cache($minified = false){ //https://wordpress.org/plugins/multiple-domain-mapping-on-single-site/ if($this->isPluginActive("multiple-domain-mapping-on-single-site/multidomainmapping.php")){ $multiple_arr = get_option('falke_mdm_mappings'); if(isset($multiple_arr) && isset($multiple_arr["mappings"]) && isset($multiple_arr["mappings"][0])){ foreach($multiple_arr["mappings"] as $mapping_key => $mapping_value){ if($minified){ $mapping_domain_path = preg_replace("/(\/cache\/[^\/]+\/all\/)/", "/cache/".$mapping_value["domain"]."/", $this->getWpContentDir("/cache/all/")); if(is_dir($mapping_domain_path)){ if(@rename($mapping_domain_path, $this->getWpContentDir("/cache/tmpWpfc/").$mapping_value["domain"]."_".time())){ } } }else{ $mapping_domain_path = preg_replace("/(\/cache\/[^\/]+\/all)/", "/cache/".$mapping_value["domain"]."/all", $this->getWpContentDir("/cache/all/index.html")); @unlink($mapping_domain_path); } } } } } public function delete_author_page_cache($post_id){ $author_id = get_post_field ('post_author', $post_id); $permalink = get_author_posts_url($author_id); if(preg_match("/https?:\/\/[^\/]+\/(.+)/", $permalink, $out)){ $path = $this->getWpContentDir("/cache/all/").$out[1]; $mobile_path = $this->getWpContentDir("/cache/wpfc-mobile-cache/").$out[1]; $this->move_folder_to_tmpWpfc($path); $this->move_folder_to_tmpWpfc($mobile_path); } } public function move_folder_to_tmpWpfc($path = false){ if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){ @mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true); } if(!$path){ return false; } if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){ return false; } if(is_dir($path)){ preg_match("/\/([^\/]+)\/?$/", $path, $type); if(isset($type[1])){ if(preg_match("/\/cache\/wpfc-mobile-cache\//", $path)){ $type[1] = "m_".$type[1]; } $move_to = $this->getWpContentDir("/cache/tmpWpfc/").$type[1]."_".time(); rename($path, $move_to); } } } public function delete_cache_of_term($term_taxonomy_id){ $term = get_term_by("term_taxonomy_id", $term_taxonomy_id); if(!$term || is_wp_error($term)){ return false; } //if(preg_match("/cat|tag|store|listing/", $term->taxonomy)){} $url = get_term_link($term->term_id, $term->taxonomy); if(preg_match("/^http/", $url)){ $path = preg_replace("/https?\:\/\/[^\/]+/i", "", $url); $path = trim($path, "/"); $path = urldecode($path); // to remove the cache of tag/cat if(file_exists($this->getWpContentDir("/cache/all/").$path."/index.html")){ @unlink($this->getWpContentDir("/cache/all/").$path."/index.html"); } if(file_exists($this->getWpContentDir("/cache/wpfc-mobile-cache/").$path."/index.html")){ @unlink($this->getWpContentDir("/cache/wpfc-mobile-cache/").$path."/index.html"); } // to remove the cache of the pages $this->rm_folder_recursively($this->getWpContentDir("/cache/all/").$path."/page"); $this->rm_folder_recursively($this->getWpContentDir("/cache/wpfc-mobile-cache/").$path."/page"); // to remove the cache of the feeds $this->rm_folder_recursively($this->getWpContentDir("/cache/all/").$path."/feed"); $this->rm_folder_recursively($this->getWpContentDir("/cache/wpfc-mobile-cache/").$path."/feed"); } if($term->parent > 0){ $parent = get_term_by("id", $term->parent, $term->taxonomy); if(isset($parent->term_taxonomy_id)){ $this->delete_cache_of_term($parent->term_taxonomy_id); } } } public function unlink($path){ if(file_exists($path)){ unlink($path); } } public function deleteHomePageCache($log = true){ if($varnish_datas = get_option("WpFastestCacheVarnish")){ include_once('inc/varnish.php'); VarnishWPFC::purge_cache($varnish_datas); } include_once('inc/cdn.php'); CdnWPFC::cloudflare_clear_cache(); $site_url_path = preg_replace("/https?\:\/\/[^\/]+/i", "", site_url()); $home_url_path = preg_replace("/https?\:\/\/[^\/]+/i", "", home_url()); if($site_url_path){ $site_url_path = trim($site_url_path, "/"); if($site_url_path){ $this->unlink($this->getWpContentDir("/cache/all/").$site_url_path."/index.html"); $this->unlink($this->getWpContentDir("/cache/wpfc-mobile-cache/").$site_url_path."/index.html"); //to clear pagination of homepage cache $this->rm_folder_recursively($this->getWpContentDir("/cache/all/").$site_url_path."/page"); $this->rm_folder_recursively($this->getWpContentDir("/cache/wpfc-mobile-cache/").$site_url_path."/page"); } } if($home_url_path){ $home_url_path = trim($home_url_path, "/"); if($home_url_path){ $this->unlink($this->getWpContentDir("/cache/all/").$home_url_path."/index.html"); $this->unlink($this->getWpContentDir("/cache/wpfc-mobile-cache/").$home_url_path."/index.html"); //to clear pagination of homepage cache $this->rm_folder_recursively($this->getWpContentDir("/cache/all/").$home_url_path."/page"); $this->rm_folder_recursively($this->getWpContentDir("/cache/wpfc-mobile-cache/").$home_url_path."/page"); } } if(function_exists("wc_get_page_id")){ if($shop_id = wc_get_page_id('shop')){ $store_url_path = preg_replace("/https?\:\/\/[^\/]+/i", "", get_permalink($shop_id)); if($store_url_path){ $store_url_path = trim($store_url_path, "/"); if($store_url_path){ if(file_exists($this->getWpContentDir("/cache/all/").$store_url_path."/index.html")){ @unlink($this->getWpContentDir("/cache/all/").$store_url_path."/index.html"); } if(file_exists($this->getWpContentDir("/cache/wpfc-mobile-cache/").$store_url_path."/index.html")){ @unlink($this->getWpContentDir("/cache/wpfc-mobile-cache/").$store_url_path."/index.html"); } //to clear pagination of store homepage cache $this->rm_folder_recursively($this->getWpContentDir("/cache/all/").$store_url_path."/page"); $this->rm_folder_recursively($this->getWpContentDir("/cache/wpfc-mobile-cache/").$store_url_path."/page"); } } } } $this->unlink($this->getWpContentDir("/cache/all/index.html")); $this->unlink($this->getWpContentDir("/cache/wpfc-mobile-cache/index.html")); //to clear pagination of homepage cache $this->rm_folder_recursively($this->getWpContentDir("/cache/all/page")); $this->rm_folder_recursively($this->getWpContentDir("/cache/wpfc-mobile-cache/page")); // options-reading.php - static posts page if($page_for_posts_id = get_option('page_for_posts')){ $page_for_posts_permalink = urldecode(get_permalink($page_for_posts_id)); $page_for_posts_permalink = rtrim($page_for_posts_permalink, "/"); $page_for_posts_permalink = preg_replace("/__trashed$/", "", $page_for_posts_permalink); //for /%postname%/%post_id% : sample-url__trashed/57595 $page_for_posts_permalink = preg_replace("/__trashed\/(\d+)$/", "/$1", $page_for_posts_permalink); if(preg_match("/https?:\/\/[^\/]+\/(.+)/", $page_for_posts_permalink, $out)){ $page_for_posts_path = $this->getWpContentDir("/cache/all/").$out[1]; $page_for_posts_mobile_path = $this->getWpContentDir("/cache/wpfc-mobile-cache/").$out[1]; $this->rm_folder_recursively($page_for_posts_path); $this->rm_folder_recursively($page_for_posts_mobile_path); } } if($log){ if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){ include_once $this->get_premium_path("logs.php"); $log = new WpFastestCacheLogs("delete"); $log->action(); } } } public function deleteCache($minified = false){ if($varnish_datas = get_option("WpFastestCacheVarnish")){ include_once('inc/varnish.php'); VarnishWPFC::purge_cache($varnish_datas); } include_once('inc/cdn.php'); CdnWPFC::cloudflare_clear_cache(); $this->set_preload(); $created_tmpWpfc = false; $cache_deleted = false; $minifed_deleted = false; $cache_path = $this->getWpContentDir("/cache/all"); $minified_cache_path = $this->getWpContentDir("/cache/wpfc-minified"); if(class_exists("WpFcMobileCache")){ if(is_dir($this->getWpContentDir("/cache/wpfc-mobile-cache"))){ if(is_dir($this->getWpContentDir("/cache/tmpWpfc"))){ rename($this->getWpContentDir("/cache/wpfc-mobile-cache"), $this->getWpContentDir("/cache/tmpWpfc/mobile_").time()); }else if(@mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true)){ rename($this->getWpContentDir("/cache/wpfc-mobile-cache"), $this->getWpContentDir("/cache/tmpWpfc/mobile_").time()); } } } if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){ if(@mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true)){ $created_tmpWpfc = true; }else{ $created_tmpWpfc = false; //$this->systemMessage = array("Permission of /wp-content/cache must be 755", "error"); } }else{ $created_tmpWpfc = true; } //to clear widget cache path $this->deleteWidgetCache(); $this->delete_multiple_domain_mapping_cache($minified); if(is_dir($cache_path)){ if(@rename($cache_path, $this->getWpContentDir("/cache/tmpWpfc/").time())){ delete_option("WpFastestCacheHTML"); delete_option("WpFastestCacheHTMLSIZE"); delete_option("WpFastestCacheMOBILE"); delete_option("WpFastestCacheMOBILESIZE"); $cache_deleted = true; } }else{ $cache_deleted = true; } if($minified){ if(is_dir($minified_cache_path)){ if(@rename($minified_cache_path, $this->getWpContentDir("/cache/tmpWpfc/m").time())){ delete_option("WpFastestCacheCSS"); delete_option("WpFastestCacheCSSSIZE"); delete_option("WpFastestCacheJS"); delete_option("WpFastestCacheJSSIZE"); $minifed_deleted = true; } }else{ $minifed_deleted = true; } }else{ $minifed_deleted = true; } if($created_tmpWpfc && $cache_deleted && $minifed_deleted){ do_action('wpfc_delete_cache'); $this->notify(array("All cache files have been deleted", "updated")); if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){ include_once $this->get_premium_path("logs.php"); $log = new WpFastestCacheLogs("delete"); $log->action(); } }else{ $this->notify(array("Permissions Problem: Read More", "error")); } // for ajax request if(isset($_GET["action"]) && in_array($_GET["action"], array("wpfc_delete_cache", "wpfc_delete_cache_and_minified"))){ die(json_encode($this->systemMessage)); } } public function checkCronTime(){ $crons = _get_cron_array(); foreach ((array)$crons as $cron_key => $cron_value) { foreach ( (array) $cron_value as $hook => $events ) { if(preg_match("/^wp\_fastest\_cache(.*)/", $hook, $id)){ if(!$id[1] || preg_match("/^\_(\d+)$/", $id[1])){ foreach ( (array) $events as $event_key => $event ) { add_action("wp_fastest_cache".$id[1], array($this, 'setSchedule')); } } } } } add_action($this->slug()."_Preload", array($this, 'create_preload_cache'), 11); } public function set_preload(){ include_once('inc/preload.php'); PreloadWPFC::set_preload($this->slug()); } public function create_preload_cache(){ $this->options = $this->getOptions(); include_once('inc/preload.php'); PreloadWPFC::create_preload_cache($this->options); } public function wpfc_remote_get($url, $user_agent, $return_content = false){ //$response = wp_remote_get($url, array('timeout' => 10, 'sslverify' => false, 'headers' => array("cache-control" => array("no-store, no-cache, must-revalidate", "post-check=0, pre-check=0"),'user-agent' => $user_agent))); $response = wp_remote_get($url, array('user-agent' => $user_agent, 'timeout' => 10, 'sslverify' => false, 'headers' => array("cache-control" => "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"))); if (!$response || is_wp_error($response)){ echo $response->get_error_message()." - "; return false; }else{ if(wp_remote_retrieve_response_code($response) != 200){ return false; } if($return_content){ if(wp_remote_retrieve_response_code($response) == 200){ $data = wp_remote_retrieve_body($response); return $data; } } } return true; } public function setSchedule($args = ""){ if($args){ $rule = json_decode($args); if($rule->prefix == "all"){ $this->deleteCache(); }else if($rule->prefix == "homepage"){ $this->deleteHomePageCache(); if(isset($this->options->wpFastestCachePreload_homepage) && $this->options->wpFastestCachePreload_homepage){ $this->wpfc_remote_get(get_option("home"), "WP Fastest Cache Preload Bot - After Cache Timeout"); $this->wpfc_remote_get(get_option("home"), "WP Fastest Cache Preload iPhone Mobile Bot - After Cache Timeout"); } }else if($rule->prefix == "startwith"){ if(!is_dir($this->getWpContentDir("/cache/tmpWpfc"))){ if(@mkdir($this->getWpContentDir("/cache/tmpWpfc"), 0755, true)){} } $rule->content = trim($rule->content, "/"); $files = glob($this->getWpContentDir("/cache/all/").$rule->content."*"); foreach ((array)$files as $file) { $mobile_file = str_replace("/cache/all/", "/cache/wpfc-mobile-cache/", $file); @rename($file, $this->getWpContentDir("/cache/tmpWpfc/").time()); @rename($mobile_file, $this->getWpContentDir("/cache/tmpWpfc/mobile_").time()); } }else if($rule->prefix == "exact"){ $rule->content = trim($rule->content, "/"); @unlink($this->getWpContentDir("/cache/all/").$rule->content."/index.html"); @unlink($this->getWpContentDir("/cache/wpfc-mobile-cache/").$rule->content."/index.html"); } if($rule->prefix != "all"){ if($this->isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){ include_once $this->get_premium_path("logs.php"); $log = new WpFastestCacheLogs("delete"); $log->action($rule); } } }else{ //for old cron job $this->deleteCache(); } } public function modify_htaccess_for_new_user($user_id){ $path = ABSPATH; if($this->is_subdirectory_install()){ $path = $this->getABSPATH(); } $htaccess = @file_get_contents($path.".htaccess"); if(preg_match("/\#\s?Start_WPFC_Exclude_Admin_Cookie/", $htaccess)){ $rules = $this->excludeAdminCookie(); $htaccess = preg_replace("/\#\s?Start_WPFC_Exclude_Admin_Cookie[^\#]*\#\s?End_WPFC_Exclude_Admin_Cookie\s+/", $rules, $htaccess); } @file_put_contents($path.".htaccess", $htaccess); } public function excludeAdminCookie(){ $usernames = array(); $users_groups = array_chunk(get_users(array("role" => "administrator", "fields" => array("user_login"))), 5); foreach ($users_groups as $group_key => $group) { $tmp_user = ""; $tmp_rule = ""; foreach ($group as $key => $value) { $tmp_user = sanitize_user(wp_unslash($value->user_login), true); /* to replace spaces with %20 1. Empty space character causes 500 internal server error 2. "\s" is not detected by htaccess so we added "%20" */ $tmp_user = preg_replace("/\s/", "%20", $tmp_user); array_push($usernames, $tmp_user); } } $rule = "# Start_WPFC_Exclude_Admin_Cookie\n"; $rule = $rule."RewriteCond %{HTTP:Cookie} !wordpress_logged_in_[^\=]+\=".implode("|", $usernames); $rule = $rule."\n# End_WPFC_Exclude_Admin_Cookie\n"; return $rule; } public function excludeRules(){ $htaccess_page_rules = ""; $htaccess_page_useragent = ""; $htaccess_page_cookie = ""; if($rules_json = get_option("WpFastestCacheExclude")){ if($rules_json != "null"){ $rules_std = json_decode($rules_json); foreach ($rules_std as $key => $value) { $value->type = isset($value->type) ? $value->type : "page"; // escape the chars $value->content = str_replace("?", "\?", $value->content); if($value->type == "page"){ if($value->prefix == "startwith"){ $value->content = ltrim($value->content, "/"); $htaccess_page_rules = $htaccess_page_rules."RewriteCond %{REQUEST_URI} !^/".$value->content." [NC]\n"; } if($value->prefix == "contain"){ $htaccess_page_rules = $htaccess_page_rules."RewriteCond %{REQUEST_URI} !".$value->content." [NC]\n"; } if($value->prefix == "exact"){ $value->content = trim($value->content, "/"); $htaccess_page_rules = $htaccess_page_rules."RewriteCond %{REQUEST_URI} !\/".$value->content." [NC]\n"; } }else if($value->type == "useragent"){ $htaccess_page_useragent = $htaccess_page_useragent."RewriteCond %{HTTP_USER_AGENT} !".$value->content." [NC]\n"; }else if($value->type == "cookie"){ $htaccess_page_cookie = $htaccess_page_cookie."RewriteCond %{HTTP:Cookie} !".$value->content." [NC]\n"; } } } } return "# Start WPFC Exclude\n".$htaccess_page_rules.$htaccess_page_useragent.$htaccess_page_cookie."# End WPFC Exclude\n"; } public function getABSPATH(){ if(function_exists("get_home_path")){ return get_home_path(); }else{ $path = ABSPATH; $siteUrl = site_url(); $homeUrl = home_url(); $diff = str_replace($homeUrl, "", $siteUrl); $diff = trim($diff,"/"); $pos = strrpos($path, $diff); if($pos !== false){ $path = substr_replace($path, "", $pos, strlen($diff)); $path = trim($path,"/"); $path = "/".$path."/"; } return $path; } } public function rm_folder_recursively($dir, $i = 1) { if(is_dir($dir)){ $files = @scandir($dir); foreach((array)$files as $file) { if($i > 50 && !preg_match("/wp-fastest-cache-premium/i", $dir)){ return true; }else{ $i++; } if ('.' === $file || '..' === $file) continue; if (is_dir("$dir/$file")){ $this->rm_folder_recursively("$dir/$file", $i); }else{ if(file_exists("$dir/$file")){ @unlink("$dir/$file"); } } } } if(is_dir($dir)){ $files_tmp = @scandir($dir); if(!isset($files_tmp[2])){ @rmdir($dir); } } return true; } public function is_subdirectory_install(){ if(strlen(site_url()) > strlen(home_url())){ return true; } return false; } protected function getMobileUserAgents(){ return implode("|", $this->get_mobile_browsers())."|".implode("|", $this->get_operating_systems()); } public function get_premium_path($name){ return WPFC_WP_PLUGIN_DIR."/wp-fastest-cache-premium/pro/library/".$name; } public function cron_add_minute( $schedules ) { $schedules['everyminute'] = array( 'interval' => 60*1, 'display' => __( 'Once Every 1 Minute' ), 'wpfc' => true ); $schedules['everyfiveminute'] = array( 'interval' => 60*5, 'display' => __( 'Once Every 5 Minutes' ), 'wpfc' => true ); $schedules['everyfifteenminute'] = array( 'interval' => 60*15, 'display' => __( 'Once Every 15 Minutes' ), 'wpfc' => true ); $schedules['twiceanhour'] = array( 'interval' => 60*30, 'display' => __( 'Twice an Hour' ), 'wpfc' => true ); $schedules['onceanhour'] = array( 'interval' => 60*60, 'display' => __( 'Once an Hour' ), 'wpfc' => true ); $schedules['everytwohours'] = array( 'interval' => 60*60*2, 'display' => __( 'Once Every 2 Hours' ), 'wpfc' => true ); $schedules['everythreehours'] = array( 'interval' => 60*60*3, 'display' => __( 'Once Every 3 Hours' ), 'wpfc' => true ); $schedules['everyfourhours'] = array( 'interval' => 60*60*4, 'display' => __( 'Once Every 4 Hours' ), 'wpfc' => true ); $schedules['everyfivehours'] = array( 'interval' => 60*60*5, 'display' => __( 'Once Every 5 Hours' ), 'wpfc' => true ); $schedules['everysixhours'] = array( 'interval' => 60*60*6, 'display' => __( 'Once Every 6 Hours' ), 'wpfc' => true ); $schedules['everysevenhours'] = array( 'interval' => 60*60*7, 'display' => __( 'Once Every 7 Hours' ), 'wpfc' => true ); $schedules['everyeighthours'] = array( 'interval' => 60*60*8, 'display' => __( 'Once Every 8 Hours' ), 'wpfc' => true ); $schedules['everyninehours'] = array( 'interval' => 60*60*9, 'display' => __( 'Once Every 9 Hours' ), 'wpfc' => true ); $schedules['everytenhours'] = array( 'interval' => 60*60*10, 'display' => __( 'Once Every 10 Hours' ), 'wpfc' => true ); $schedules['onceaday'] = array( 'interval' => 60*60*24, 'display' => __( 'Once a Day' ), 'wpfc' => true ); $schedules['everythreedays'] = array( 'interval' => 60*60*24*3, 'display' => __( 'Once Every 3 Days' ), 'wpfc' => true ); $schedules['everysevendays'] = array( 'interval' => 60*60*24*7, 'display' => __( 'Once Every 7 Days' ), 'wpfc' => true ); $schedules['everytendays'] = array( 'interval' => 60*60*24*10, 'display' => __( 'Once Every 10 Days' ), 'wpfc' => true ); $schedules['everyfifteendays'] = array( 'interval' => 60*60*24*15, 'display' => __( 'Once Every 15 Days' ), 'wpfc' => true ); $schedules['montly'] = array( 'interval' => 60*60*24*30, 'display' => __( 'Once a Month' ), 'wpfc' => true ); $schedules['yearly'] = array( 'interval' => 60*60*24*30*12, 'display' => __( 'Once a Year' ), 'wpfc' => true ); return $schedules; } public function setCustomInterval(){ add_filter( 'cron_schedules', array($this, 'cron_add_minute')); } public function isPluginActive( $plugin ) { return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || $this->isPluginActiveForNetwork( $plugin ); } public function isPluginActiveForNetwork( $plugin ) { if ( !is_multisite() ) return false; $plugins = get_site_option( 'active_sitewide_plugins'); if ( isset($plugins[$plugin]) ) return true; return false; } public function current_url(){ global $wp; $current_url = home_url($_SERVER['REQUEST_URI']); return $current_url; // if(defined('WP_CLI')){ // $_SERVER["SERVER_NAME"] = isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : ""; // $_SERVER["SERVER_PORT"] = isset($_SERVER["SERVER_PORT"]) ? $_SERVER["SERVER_PORT"] : 80; // } // $pageURL = 'http'; // if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'){ // $pageURL .= 's'; // } // $pageURL .= '://'; // if($_SERVER['SERVER_PORT'] != '80'){ // $pageURL .= $_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['REQUEST_URI']; // }else{ // $pageURL .= $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; // } // return $pageURL; } public function wpfc_load_plugin_textdomain(){ load_plugin_textdomain('wp-fastest-cache', FALSE, basename( dirname( __FILE__ ) ) . '/languages/' ); } public function cdn_replace_urls($matches){ if(count($this->cdn) > 0){ foreach ($this->cdn as $key => $cdn) { if($cdn->id == "cloudflare"){ continue; } if(isset($cdn->status) && $cdn->status == "pause"){ continue; } if(preg_match("/manifest\.json\.php/i", $matches[0])){ return $matches[0]; } //https://site.com?brizy_media=AttachmentName.jpg&brizy_crop=CropSizes&brizy_post=TheCurrentPost if(preg_match("/brizy_media\=/i", $matches[0])){ return $matches[0]; } //https://cdn.shortpixel.ai/client/q_glossy,ret_img,w_736/http://wpfc.com/stories.png if(preg_match("/cdn\.shortpixel\.ai\/client/i", $matches[0])){ return $matches[0]; } if(preg_match("/^\/\/random/", $cdn->cdnurl) || preg_match("/\/\/i\d\.wp\.com/", $cdn->cdnurl)){ // Photon will no longer be supported continue; } $cdnurl = $cdn->cdnurl; $cdn->file_types = str_replace(",", "|", $cdn->file_types); if(preg_match("/\.(".$cdn->file_types.")(\"|\'|\?|\)|\s|\"\;)/i", $matches[0])){ //nothing }else{ if(preg_match("/js/", $cdn->file_types)){ if(!preg_match("/\/revslider\/public\/assets\/js/", $matches[0])){ continue; } }else{ continue; } } if($cdn->keywords){ $cdn->keywords = str_replace(",", "|", $cdn->keywords); if(!preg_match("/".preg_quote($cdn->keywords, "/")."/i", $matches[0])){ continue; } } if(isset($cdn->excludekeywords) && $cdn->excludekeywords){ $cdn->excludekeywords = str_replace(",", "|", $cdn->excludekeywords); if(preg_match("/".preg_quote($cdn->excludekeywords, "/")."/i", $matches[0])){ continue; } } if(preg_match("/(data-product_variations|data-siteorigin-parallax)\=[\"\'][^\"\']+[\"\']/i", $matches[0])){ $cdnurl = preg_replace("/(https?\:)?(\/\/)(www\.)?/", "", $cdnurl); // if(preg_match("/i\d\.wp\.com/i", $cdnurl)){ // $matches[0] = preg_replace("/(quot\;|\s)(https?\:)?(\\\\\/\\\\\/|\/\/)(www\.)?".$cdn->originurl."/i", "$1$2$3".$cdnurl, $matches[0]); // }else{ // $matches[0] = preg_replace("/(quot\;|\s)(https?\:)?(\\\\\/\\\\\/|\/\/)(www\.)?".$cdn->originurl."/i", "$1$2$3$4".$cdnurl, $matches[0]); // } $matches[0] = preg_replace("/(quot\;|\s)(https?\:)?(\\\\\/\\\\\/|\/\/)(www\.)?".$cdn->originurl."/i", '${1}${2}${3}'.$cdnurl, $matches[0]); }else if(preg_match("/\{\"concatemoji\"\:\"[^\"]+\"\}/i", $matches[0])){ $matches[0] = preg_replace("/(http(s?)\:)?".preg_quote("\/\/", "/")."(www\.)?/i", "", $matches[0]); $matches[0] = preg_replace("/".preg_quote($cdn->originurl, "/")."/i", $cdnurl, $matches[0]); }else if(isset($matches[2]) && preg_match("/".preg_quote($cdn->originurl, "/")."/", $matches[2])){ $matches[0] = preg_replace("/(http(s?)\:)?\/\/(www\.)?".preg_quote($cdn->originurl, "/")."/i", $cdnurl, $matches[0]); }else if(isset($matches[2]) && preg_match("/^(\/?)(wp-includes|wp-content)/", $matches[2])){ $matches[0] = preg_replace("/(\/?)(wp-includes|wp-content)/i", $cdnurl."/"."$2", $matches[0]); }else if(preg_match("/[\"\']https?\:\\\\\/\\\\\/[^\"\']+[\"\']/i", $matches[0])){ if(preg_match("/^(logo|url|image)$/i", $matches[1])){ //If the url is called with "//", it causes an error on https://search.google.com/structured-data/testing-tool/u/0/ // // // }else{ // $matches[0] = preg_replace("/\\\\\//", "/", $matches[0]); if(preg_match("/".preg_quote($cdn->originurl, "/")."/", $matches[0])){ $matches[0] = preg_replace("/(http(s?)\:)?\/\/(www\.)?".preg_quote($cdn->originurl, "/")."/i", $cdnurl, $matches[0]); $matches[0] = preg_replace("/\//", "\/", $matches[0]); } } } } } return $matches[0]; } public function read_file($url){ if(!preg_match("/\.php/", $url)){ $url = preg_replace("/\?.*/", "", $url); if(preg_match("/wp-content/", $url)){ $path = preg_replace("/.+\/wp-content\/(.+)/", WPFC_WP_CONTENT_DIR."/"."$1", $url); }else if(preg_match("/wp-includes/", $url)){ $path = preg_replace("/.+\/wp-includes\/(.+)/", ABSPATH."wp-includes/"."$1", $url); } if(isset($path)){ if(@file_exists($path)){ $filesize = filesize($path); if($filesize > 0){ $myfile = fopen($path, "r") or die("Unable to open file!"); $data = fread($myfile, $filesize); fclose($myfile); return $data; }else{ return false; } } } } return false; } public function get_operating_systems(){ $operating_systems = array( 'Android', 'blackberry|\bBB10\b|rim\stablet\sos', 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino', 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', 'Windows\sCE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window\sMobile|Windows\sPhone\s[0-9.]+|WCE;', 'Windows\sPhone\s10.0|Windows\sPhone\s8.1|Windows\sPhone\s8.0|Windows\sPhone\sOS|XBLWP7|ZuneWP7|Windows\sNT\s6\.[23]\;\sARM\;', '\biPhone.*Mobile|\biPod|\biPad', 'Apple-iPhone7C2', 'MeeGo', 'Maemo', 'J2ME\/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135 'webOS|hpwOS', '\bBada\b', 'BREW' ); return $operating_systems; } public function get_mobile_browsers(){ $mobile_browsers = array( '\bCrMo\b|CriOS|Android.*Chrome\/[.0-9]*\s(Mobile)?', '\bDolfin\b', 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\/[0-9.]+|Coast\/[0-9.]+', 'Skyfire', 'Mobile\sSafari\/[.0-9]*\sEdge', 'IEMobile|MSIEMobile', // |Trident/[.0-9]+ 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS', 'bolt', 'teashark', 'Blazer', 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari', 'Tizen', 'UC.*Browser|UCWEB', 'baiduboxapp', 'baidubrowser', 'DiigoBrowser', 'Puffin', '\bMercury\b', 'Obigo', 'NF-Browser', 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger', 'Android.*PaleMoon|Mobile.*PaleMoon' ); return $mobile_browsers; } } // Load WP CLI command(s) on demand. if ( defined( 'WP_CLI' ) && WP_CLI ) { require_once "inc/cli.php"; } function wpfc_clear_all_site_cache(){ if(defined('WPFC_DISABLE_HOOK_CLEAR_ALL_CACHE') && WPFC_DISABLE_HOOK_CLEAR_ALL_CACHE){ return array("success" => false, "message" => "Clearing Cache Hook system has been disabled"); } do_action("wpfc_clear_all_cache"); } function wpfc_clear_all_cache($minified = false){ if(defined('WPFC_DISABLE_HOOK_CLEAR_ALL_CACHE') && WPFC_DISABLE_HOOK_CLEAR_ALL_CACHE){ return array("success" => false, "message" => "Clearing Cache Hook system has been disabled"); } do_action("wpfc_clear_all_cache", $minified); } function wpfc_exclude_current_page(){ do_action("wpfc_exclude_current_page"); } function wpfc_clear_post_cache_by_id($post_id = false){ if($post_id){ do_action("wpfc_clear_post_cache_by_id", false, $post_id); } } function wpfc_create_post_cache_by_id($post_id = false){ if($post_id){ do_action("wpfc_create_post_cache_by_id", $post_id); } } $GLOBALS["wp_fastest_cache"] = new WpFastestCache(); ?>PKL\. *??4wp-fastest-cache/languages/wp-fastest-cache-es_EC.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Spanish (Ecuador) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2021-01-02 11:47:06+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: es_EC\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "" #: templates/preload.php:150 msgid "Sitemaps" msgstr "" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "" #: templates/preload.php:86 msgid "Content Types" msgstr "" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "" #: templates/preload.php:72 msgid "Choose a Method" msgstr "" #: templates/preload.php:56 msgid "Preload Settings" msgstr "" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Guardar" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Cancelar" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Ajustes de la barra de herramientas" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Vaciar la caché de todos los sitios" #: wpFastestCache.php:439 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Vaciar la caché" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Eliminar los recursos JavaScript que bloquean los procesos" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Las opciones han sido guardadas" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "tiene artículos de WooCommerce en el carrito" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "tiene parámetros de Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archivos" #: templates/timeout.php:189 msgid "Server Time" msgstr "Hora del servidor" #: templates/timeout.php:169 msgid "delete the files" msgstr "borrar los archivos" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Contiene" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Es igual a" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Comienza con" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Página de inicio" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Todo" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Asistente para excluir páginas" #: templates/timeout.php:124 msgid "Then" msgstr "Entonces" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Si REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Asistente del tiempo límite de la caché" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Asistente de carga diferida" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Activar Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Por favor, actualiza" #: templates/update_success.php:9 msgid "Success" msgstr "Correcto" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Advertencia" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Añadir una nueva regla" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Solo disponible en la versión premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Elige uno" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "También se eliminarán todos los archivos de la caché" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Si modificas cualquier archivo CSS, tienes que borrar los archivos CSS minimizados" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Carpeta de destino" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Puedes borrar todos los archivos de la caché" #: inc/admin.php:1090 msgid "Exclude" msgstr "Excluir" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimización de imágenes" #: inc/admin.php:1082 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Limpieza de la base de datos" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Ajustes de la CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Excluir JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Excluir CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Excluir cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Excluir agentes de usuario" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Excluir páginas" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Herramienta de optimización de imágenes" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Reglas de límite" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Estadísticas de la caché" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Vaciar la caché de entradas / páginas" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "¿Qué quieres que ocurra después de actualizar una entrada o una página?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Vaciar la caché de paginación" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Vaciar la caché de etiquetas de entradas" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Vaciar la caché de categorías de entradas" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Vaciar toda la caché" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "¿Qué quieres que ocurra después de publicar la nueva entrada?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "Aceptar" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Reiniciar después de completado" #: templates/preload.php:210 msgid "pages per minute" msgstr "páginas por minuto" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Taxonomías personalizadas" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Tipos de contenido personalizado" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Adjuntos" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Etiquetas" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Páginas" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categorías" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Entradas" #: templates/preload.php:102 msgid "Homepage" msgstr "Página de inicio" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Cargar las imágenes e iframes cuando entren en la visualización de los navegadores" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Cargar las fuentes de Google de forma asíncrona" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Fuentes de Google" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Bloqueo de procesado de JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Puedes eliminar los emojis CSS integrados y el archivo «wp-emoji-release.min.js»" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Desactivar los emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Reducir el tiempo de carga de la página para los visitantes repetitivos" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Caché del navegador" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Reducir el tamaño de los archivos enviados por tu servidor" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combine Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combinar JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Puedes reducir el tamaño de los archivos JS" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minimizar JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combinar CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Más potente minimización CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minify Css Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Puedes reducir el tamaño de los archivos CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minimizar CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Más potente minimización HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minify HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Puedes reducir el tamaño de la página" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minimizar HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Vaciar los archivos de la caché cuando se actualiza una entrada o página" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Actualizar la entrada" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Vaciar los archivos de la caché cuando se publica una entrada o página" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nueva entrada" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Crear la caché para el tema para móviles" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Tema para móviles" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "No mostrar la versión de escritorio de la caché en los dispositivos móviles" #: inc/admin.php:1195 msgid "Mobile" msgstr "Móvil" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "No mostrar la versión de la caché para usuarios conectados" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Usuarios conectados" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Crear automáticamente la caché de todo el sitio" #: inc/admin.php:1157 msgid "Preload" msgstr "Precargar" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Reducir el número de consultas SQL" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget de caché" #: inc/admin.php:1119 msgid "Enable" msgstr "Activar" #: inc/admin.php:1118 msgid "Cache System" msgstr "Sistema de caché" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Una vez cada 15 días" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Una vez cada 7 días" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Una vez cada 3 días" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Una vez cada 10 horas" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Una vez cada 9 horas" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Una vez cada 8 horas" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Una vez cada 7 horas" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Una vez cada 5 horas" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Una vez cada 4 horas" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Una vez cada 3 horas" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Una vez cada 2 horas" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Una vez cada 10 días" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "El sistema WP Cache más simple y rápido" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "https://es-ec.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Una vez al año" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Una vez al mes" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Una vez al día" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Una vez cada 6 horas" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Una vez por hora" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Dos veces por hora" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Una vez cada 15 minutos" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Una vez cada 5 minutos" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Una vez cada 1 minuto"PKL\'LiDiD1wp-fastest-cache/languages/wp-fastest-cache-ja.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Japanese # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-12-13 14:12:14+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: GlotPress/4.0.1\n" "Language: ja_JP\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "管理ツールバーの WP Fastest Cache メニューは、以下の選択されたユーザー権限グループに表示されます。" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "ユーザー権限グループ" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "少なくとも1つのサイトマップを追加する必要があります" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "このセクションでは、高度な設定をカスタマイズできます。" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "高度な設定" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "先読みに使用するサイトマップを指定できます。" #: templates/preload.php:150 msgid "Sitemaps" msgstr "サイトマップ" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "先読みに使用するコンテンツを指定でき、さらに並べ替えることもできます。" #: templates/preload.php:86 msgid "Content Types" msgstr "コンテンツタイプ" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "このセクションでは、先読み機能に使用する方式を指定できます。" #: templates/preload.php:72 msgid "Choose a Method" msgstr "方式を選択" #: templates/preload.php:56 msgid "Preload Settings" msgstr "先読み設定" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "一部の JS ソースは、スクロールやマウスの移動が行われるまで読み込まれなくなります" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Delay JS" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "WP Fastest Cache の設定" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "特定のページを削除" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "保存" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "キャンセル" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "ツールバー設定" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "すべてのサイトのキャッシュを削除" #: wpFastestCache.php:439 msgid "Settings" msgstr "設定" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "キャッシュを削除" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "レンダリングブロックする JS ソースを除外する" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "設定を保存しました" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "カートに Woocommerce アイテムあり" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "Google Analytics パラメーターあり" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "アーカイブ" #: templates/timeout.php:189 msgid "Server Time" msgstr "サーバー時刻" #: templates/timeout.php:169 msgid "delete the files" msgstr "このファイルを削除する" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "含む" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "次と同等" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "次で始まる" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "ホームページ" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "すべて" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "ページウィザードを除外する" #: templates/timeout.php:124 msgid "Then" msgstr "次を適用" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "REQUEST_URI が" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "キャッシュ タイムアウト ウィザード" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "遅延読み込みの設定" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Gzip を有効" #: templates/update_now.php:9 msgid "Please Update" msgstr "アップデートしてください" #: templates/update_success.php:9 msgid "Success" msgstr "成功" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "警告" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "新規ルールを追加" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "キャッシュと縮小した CSS / JS をクリアする" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "プレミアム版でのみ利用可能" #: templates/timeout.php:141 msgid "Choose One" msgstr "1つ選ぶ" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "すべてのキャッシュファイルが同様に削除されます" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "もし CSS ファイルを編集した場合、縮小した CSS ファイルを削除しなければなりません" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "対象のフォルダ" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "すべてのキャッシュ ファイルを削除できます" #: inc/admin.php:1090 msgid "Exclude" msgstr "除外する" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "画像の最適化" #: inc/admin.php:1082 msgid "Settings" msgstr "設定" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "データベース クリーンアップ" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN 設定" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "JS を除外" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "CSS を除外" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "クッキーを除外" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "User-Agents を除外" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "固定ページを除外" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "イメージツールを最適化" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "タイムアウト ルール" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "キャッシュ 統計" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "投稿/固定ページのキャッシュを削除" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "投稿や固定ページの更新後にどのようにしますか?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "ページ送りのキャッシュを削除" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "投稿タグのキャッシュを削除" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "投稿カテゴリーのキャッシュを削除" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "ホームページのキャッシュを削除" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "すべてのキャッシュを削除" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "新しい投稿を公開後にどのようにしますか?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "完了後に先読みを再スタート" #: templates/preload.php:210 msgid "pages per minute" msgstr "1分あたりページ数" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "カスタムタクソノミー" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "カスタム投稿タイプ" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "添付ファイル" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "タグ" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "固定ページ" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "カテゴリー" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "投稿" #: templates/preload.php:102 msgid "Homepage" msgstr "ホームページ" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "JS ファイルを統合して HTTP リクエストを減らす" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "ブラウザのビューポイントに入った時、画像や iframe を読み込む" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Google フォントを非同期で読み込む" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google フォント" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "レンダリングブロック JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "絵文字のインライン CSS や wp-emoji-release.min.js を削除できます" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "絵文字を無効にする" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "リピート訪問者のページ読み込み時間を減らす" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "ブラウザ キャッシュ" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "サーバーから送信されるファイルのサイズを減らす" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "JS をさらに統合" #: inc/admin.php:1316 msgid "Combine Js" msgstr "JS を統合" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "JS ファイルのサイズを減らす" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "JS を縮小" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "CSSファイルを統合してHTTPリクエストを減らす" #: inc/admin.php:1291 msgid "Combine Css" msgstr "CSS を統合" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "さらに強力な CSS の縮小" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "CSS を縮小 Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "CSS ファイルのサイズを減らす" #: inc/admin.php:1270 msgid "Minify Css" msgstr "CSS を縮小" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "さらに強力な HTML の縮小" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "HTML を縮小 Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "HTMLのサイズを減らす" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "HTML を縮小" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "投稿や固定ページを更新した時、キャッシュファイルを削除" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "投稿更新" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "投稿や固定ページを公開した時、キャッシュファイルを削除" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "新規投稿" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "モバイル用テーマのキャッシュを作成" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "モバイル用テーマ" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "デスクトップ用のキャッシュをモバイルデバイスに表示しない" #: inc/admin.php:1195 msgid "Mobile" msgstr "モバイル" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "ログインユーザーにキャッシュを表示しない" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "ログインユーザー" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "自動的にサイトすべてのキャッシュを作成する" #: inc/admin.php:1157 msgid "Preload" msgstr "先読み" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "SQL クエリー数を減らす" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "ウィジェット キャッシュ" #: inc/admin.php:1119 msgid "Enable" msgstr "有効化" #: inc/admin.php:1118 msgid "Cache System" msgstr "システム キャッシュ" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "15日毎に1度" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "7日毎に1度" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "3日毎に1度" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "10時間毎に1度" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "9時間毎に1度" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "8時間毎に1度" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "7時間毎に1度" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "5時間毎に1度" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "4時間毎に1度" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "3時間毎に1度" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "2時間毎に1度" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "10日に1度" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "最もシンプルで速い WP キャッシュシステム" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "https://ja.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "1年毎に1度" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "1ヶ月に1度" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "1日毎に1度" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "6時間毎に1度" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "1時間毎に1度" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "1時間に2度" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "15分毎に1度" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "5分毎に1度" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "1分毎に1度"PKL\l >>4wp-fastest-cache/languages/wp-fastest-cache-en_GB.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in English (UK) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-06-13 12:11:20+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: en_GB\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "At least one sitemap must be added" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "You can customise the advanced settings through this section." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Advanced settings" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "You can specify sitemaps to be used for preloading." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Sitemaps" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "You can specify the contents to be used for preloading and you can sort them as well." #: templates/preload.php:86 msgid "Content Types" msgstr "Content types" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "You can specify the method you want the preload feature to use through this section." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Choose a method" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Preload settings" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Some JS sources will not be loaded until scrolling or moving the mouse" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Delay JS" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "WP Fastest Cache options" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "has Yandex Click ID parameters" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Clearing specific pages" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Save" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Cancel" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Toolbar Settings" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Clear Cache of All Sites" #: wpFastestCache.php:439 msgid "Settings" msgstr "Settings" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Clear cache" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Eliminate render-blocking JavaScript resources" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Options have been saved" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "has WooCommerce Items in basket" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "has Google Analytics Parameters" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archives" #: templates/timeout.php:189 msgid "Server Time" msgstr "Server Time" #: templates/timeout.php:169 msgid "delete the files" msgstr "delete the files" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Contains" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Is Equal To" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Starts With" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Homepage" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "All" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Exclude Page Wizard" #: templates/timeout.php:124 msgid "Then" msgstr "Then" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "If REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Cache Timeout Wizard" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Lazy Load Settings" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Enable Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Please update" #: templates/update_success.php:9 msgid "Success" msgstr "Success" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Warning" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Add New Rule" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Only available in Premium version" #: templates/timeout.php:141 msgid "Choose One" msgstr "Choose one" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "All cache files will be removed as well" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "If you modify any CSS file, you have to delete minified CSS files" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Target folder" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "You can delete all cache files" #: inc/admin.php:1090 msgid "Exclude" msgstr "Exclude" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Image Optimisation" #: inc/admin.php:1082 msgid "Settings" msgstr "Settings" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Database cleanup" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN settings" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Exclude JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Exclude CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Exclude cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Exclude User-Agents" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Exclude Pages" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Optimise Image Tool" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Timeout Rules" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Cache Statistics" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Clear Cache of Post / Page" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "What do you want to happen after an update of post or page?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Clear Cache of Pagination" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Clear Cache of Post Tags" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Clear Cache of Post Categories" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Clear homepage cache" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Clear All Cache" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "What do you want to happen after publishing the new post?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Restart After Completed" #: templates/preload.php:210 msgid "pages per minute" msgstr "pages per minute" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Custom Taxonomies" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Custom Post Types" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Attachments" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Tags" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Pages" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categories" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Posts" #: templates/preload.php:102 msgid "Homepage" msgstr "Homepage" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Reduce HTTP requests through combined js files" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Load images and iframes when they enter the browsers viewport" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Load Google Fonts asynchronously" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google Fonts" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Render Blocking Js" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "You can remove the emoji inline CSS and wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Disable Emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Reduce page load times for repeat visitors" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Browser Caching" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Reduce the size of files sent from your server" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combine Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combine Js" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "You can decrease the size of js files" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minify Js" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Reduce http requests through combined CSS files" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combine CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "More powerful minify CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minify CSS Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "You can decrease the size of CSS files" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minify CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "More powerful minify HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minify HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "You can decrease the size of the page" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minify HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Clear cache files when a post or page is updated" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Update Post" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Clear cache files when a post or page is published" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "New Post" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Create cache for mobile theme" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Mobile Theme" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Don't show the cached version for desktop to mobile devices" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobile" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Don't show the cached version for logged-in users" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Logged-in Users" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Create the cache of all the site automatically" #: inc/admin.php:1157 msgid "Preload" msgstr "Preload" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Reduce the number of SQL queries" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget Cache" #: inc/admin.php:1119 msgid "Enable" msgstr "Enable" #: inc/admin.php:1118 msgid "Cache System" msgstr "Cache System" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Once Every 15 Days" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Once Every 7 Days" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Once Every 3 Days" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Once Every 10 Hours" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Once Every 9 Hours" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Once Every 8 Hours" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Once Every 7 Hours" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Once Every 5 Hours" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Once Every 4 Hours" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Once Every 3 Hours" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Once Every 2 Hours" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Once Every 10 Days" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "The simplest and fastest WP Cache system" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Once a Year" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Once a Month" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Once a Day" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Once Every 6 Hours" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Once an Hour" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Twice an Hour" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Once Every 15 Minutes" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Once Every 5 Minutes" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Once Every 1 Minute"PKL\vuAuA4wp-fastest-cache/languages/wp-fastest-cache-tr_TR.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Turkish # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-06-16 07:39:05+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: tr\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "En az bir site haritası eklenmelidir" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "Gelişmiş ayarları bu bölümden özelleştirebilirsiniz." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Gelişmiş Ayarlar" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Ön yükleme için kullanılacak olan site haritalarını belirleyebilirsiniz." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Site haritaları" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Ön yükleme için kullanılacak içerikleri belirleyebilir ve bunları sıralayabilirsiniz." #: templates/preload.php:86 msgid "Content Types" msgstr "İçerik Türleri" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "Ön yükleme özelliğinin kullanmasını istediğiniz yöntemi bu bölüm üzerinden belirtebilirsiniz." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Bir Yöntem Seçin" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Ön Yükleme Ayarları" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Bazı js kaynakları fareyi kaydırana veya hareket ettirene kadar yüklenmeyecektir" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "JS'leri Geciktir" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "WP Fastest Cache Seçenekleri" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "parametre olarak Yandex Click ID var" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Belirli Sayfaları Temizle" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Kaydet" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "İptal Et" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Araç Çubuğu Ayarları" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Tüm Sitelerin Önbelleğini Temizle" #: wpFastestCache.php:439 msgid "Settings" msgstr "Ayarlar" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Önbelleği Temizle" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Oluşturmayı engelleyen JavaScript kaynaklarını kaldır" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Ayarlar Kaydedildi" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "sepette WooCommerce ögeleri var" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "parametre olarak Google Analytics parametreleri varsa" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Arşivler" #: templates/timeout.php:189 msgid "Server Time" msgstr "Sunucu Zamanı" #: templates/timeout.php:169 msgid "delete the files" msgstr "dosyaları sil" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "İçeren" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Eşit ise" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "İle Başlayan" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Ana Sayfa" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Tümü" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Sayfa Hariç Tutma Sihirbazı" #: templates/timeout.php:124 msgid "Then" msgstr "Öyleyse" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Eğer REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Önbellek Zaman Aşımı Sihirbazı" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Lazy Load Ayarları" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Gzip Aktivasyonu" #: templates/update_now.php:9 msgid "Please Update" msgstr "Lütfen Güncelleyin" #: templates/update_success.php:9 msgid "Success" msgstr "Başarılı" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Uyarı" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Yeni Kural Ekle" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Sadece Premium versiyonda mevcut" #: templates/timeout.php:141 msgid "Choose One" msgstr "Birini Seç" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Tüm önbellek dosyaları da silinecek" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Eğer bir css dosyası değiştirdiyseniz, küçültülmüş olan css/js dosyalarını da temizlemelisiniz" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Hedef klasör" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Tüm önbelleği temizleyebilirsiniz" #: inc/admin.php:1090 msgid "Exclude" msgstr "Hariç" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Resim Optimizasyonu" #: inc/admin.php:1082 msgid "Settings" msgstr "Ayarlar" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Veritabanı Temizleme" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN Ayarları" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Hariç Tutulan JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Hariç Tutulan CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Hariç Tutulan Çerezler" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Hariç Tutulan User-Agent" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Hariç Tutulan Sayfalar" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Resim Optimizasyon Aracı" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Zaman Aşımı Kuralları" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Önbellek İstatistikleri" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Yazı ya da sayfanın önbelleğini temizle" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Yazı veya sayfa güncellendikten sonra ne olmasını istiyorsun?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Sayfalandırma Önbelleğini Temizle" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Gönderi Etiketlerinin Önbelleğini Temizle" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Gönderi Kategorilerinin Önbelleğini Temizle" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Ana Sayfanın Önbelleğini Temizle" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Tüm Önbelleği Temizle" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Yeni yazı yayımlandıktan sonra ne olmasını istiyorsun?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "Tamam" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Tamamlandıktan Sonra Yeniden Başlat" #: templates/preload.php:210 msgid "pages per minute" msgstr "dakika başına sayfa" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Özel Sınıflandırmalar" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Özel Yazı Türleri" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Ekler" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Etiketler" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Sayfalar" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Kategoriler" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Yazılar" #: templates/preload.php:102 msgid "Homepage" msgstr "Ana Sayfa" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "JS dosyalarını birleştirerek HTTP isteklerini azaltın" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Resimleri ve iframleri tarayıcının görünen alanına gelince yükle" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Google Fontlarını eş zamansız (asenkron) olarak yükle" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google Fonts" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Oluşturma Engelleyici Js" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Emoji inline CSS ve wp-emoji-release.min.js kaynağını kaldırabilirsiniz" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Emojileri Kapat" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Tekrar gelen ziyaretçiler için sayfa yükleme sürelerini azaltın" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Tarayıcı Önbelleği" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Sunucudan gönderilen dosyaların boyutunu küçült" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Js Birleştir Ekstra" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Js Birleştir" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "JS dosyalarının boyununu küçültebilirsiniz" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "JS Küçült" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "CSS dosyalarını birleştirerek HTTP isteklerini azaltın" #: inc/admin.php:1291 msgid "Combine Css" msgstr "CSS Birleştirme" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Daha güçlü CSS küçültme" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "CSS Küçült Ekstra" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "CSS dosyalarının boyununu küçültebilirsiniz" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Css Küçült" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Daha güçlü HTML küçültme" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "HTML Küçült Ekstra" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Sayfanın boyutunu küçültebilirsiniz" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "HTML Küçült" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Bir yazı ya da sayfa düzenlendiğinde önbelleği temizle" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Yazı Güncelleme" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Yeni bir yazı veya sayfa yayımlandığında önbelleği temizle" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Yeni yazı" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Mobil tema için önbellek oluştur" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Mobil Tema" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Masaüstünden mobil cihazlara önbelleğe alınmış sürümü gösterme" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobil" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Giriş yapan kullanıcılara önbelleği gösterme" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Giriş Yapan Kullanıcılar" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Tüm sitenin önbelleğini otomatik oluştur" #: inc/admin.php:1157 msgid "Preload" msgstr "Önyükleme" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "SQL sorgu sayısını azalt" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Bileşen Önbelleği" #: inc/admin.php:1119 msgid "Enable" msgstr "Etkin" #: inc/admin.php:1118 msgid "Cache System" msgstr "Önbellek" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "15 Günde Bir Kez" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "7 Günde Bir Kez" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "3 Günde Bir Kez" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "10 Saatte Bir Kez" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "9 Saatte Bir Kez" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "8 Saatte Bir Kez" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "7 Saatte Bir Kez" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "5 Saatte Bir Kez" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "4 Saatte Bir Kez" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "3 Saatte Bir Kez" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "2 Saatte Bir Kez" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "10 Günde Bir Kez" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "En basit ve en hızlı WP Cache sistemi" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Yılda Bir kez" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Ayda Bir Kez" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Günde Bir Kez" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "6 Saatte Bir Kez" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Saatte Bir Kez" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Saatte 2 Kez" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "15 Dakikada Bir Kez" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "5 Dakikada Bir Kez" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "1 Dakikada Bir Kez"PKL\%wp-fastest-cache/languages/index.htmlnu[PKL\@x-D-D4wp-fastest-cache/languages/wp-fastest-cache-fa_IR.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Persian # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2022-09-10 05:23:27+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: GlotPress/4.0.1\n" "Language: fa\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "" #: templates/preload.php:150 msgid "Sitemaps" msgstr "" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "" #: templates/preload.php:86 msgid "Content Types" msgstr "" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "" #: templates/preload.php:72 msgid "Choose a Method" msgstr "" #: templates/preload.php:56 msgid "Preload Settings" msgstr "" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "ذخيره" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "لغو" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "تنظیمات نوار ابزار" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "حذف کش از تمامی سایت‌ها" #: wpFastestCache.php:439 msgid "Settings" msgstr "تنظیمات" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "پاکسازی کش" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "برطرف کردن مشکل Eliminate render-blocking JavaScript resources" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "تنظیمات ذخیره شدند" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "دارای محصول در سبد خرید" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "دارای پارامتر های گوگل آنالیتیک" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "بایگانی ها" #: templates/timeout.php:189 msgid "Server Time" msgstr "زمان سرور" #: templates/timeout.php:169 msgid "delete the files" msgstr "حذف فایل‌ها" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "شامل" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "برابر با" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "شروع می شود با" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "صفحه اصلی" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "همه" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "عدم فعال سازی در برگه های" #: templates/timeout.php:124 msgid "Then" msgstr "سپس" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "اگر لینک درخواستی برابر" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "تایم بندی کش" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "تنظیمات Lazy Load" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "فعال کردن Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "لطفا بروزرسانی کنید" #: templates/update_success.php:9 msgid "Success" msgstr "موفقیت آمیز" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "هشدار" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "افزودن قانون جدید" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "فقط در نسخه پریمیوم در دسترس است." #: templates/timeout.php:141 msgid "Choose One" msgstr "یکی را انتخاب کن" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "تمامی فایل های کش حذف خواهد شد" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "در صورت تغییر در فایل های سی اس اس، باید کش و فایل‌های فشرده را حذف کنید" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "پوشه هدف" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "حذف تمامی فایل‌های کش" #: inc/admin.php:1090 msgid "Exclude" msgstr "عدم تاثیر بر" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "بهینه‌سازی تصاویر" #: inc/admin.php:1082 msgid "Settings" msgstr "تنظیمات" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "پاکسازی پایگاه‌داده" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "تنظیمات CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "عدم اعمال بر فایل های جاوااسکریپت" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "عدم اعمال بر فایل‌های سی اس اس" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "عدم اعمال بر کوکی های" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "عدم اعمال بر User-Agents" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "عدم اعمال در برگه های" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "بهینه سازی تصاویر" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "تایم بندی فایل های کش" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "آمار کش" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "حذف کش پست ها و برگه ها" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "بعد از بروزرسانی برگه ها و پست ها چه عملی مایل هستید انجام شود؟" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "حذف کش Pagination" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "حذف کش تگ های پست ها" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "حذف کش دسته بندی پست ها" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "حذف تمام کش" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "بعد از انتشار پست جدید چه عملی میخواهید انجام شود؟" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "تایید" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "ریستارت بعد از تکمیل" #: templates/preload.php:210 msgid "pages per minute" msgstr "برگه در دقیقه" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "تکسونومی های سفارشی" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "پست تایپ های سفارشی" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "پیوست‌ها" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "برچسب‌ها" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "برگه‌ها" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "دسته‌بندی‌ها" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "نوشته‌ها" #: templates/preload.php:102 msgid "Homepage" msgstr "صفحه نخست" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "با فعال کردن این قسمت تعداد درخواست های HTTP کاهش می یابد" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "لود تصاویر و آی فریم ها با قرار گرفتن در حالت دید کاربر" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "لود فونت های گوگل بصورت asynchronously" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "فونت‌های گوگل" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "فعال کردن Render Blocking Js" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "حذف سی اس اس های مرتبط و wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "غیرفعال کردن اموجی ها" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "کاهش زمان لود برای کاربران تکراری" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "کش مرورگر" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "کاهش حجم فایل های ارسالی از سمت سرور" #: inc/admin.php:1342 msgid "Gzip" msgstr "GZip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "ترکیب کردن قوی تر فایل های JS" #: inc/admin.php:1316 msgid "Combine Js" msgstr "ترکیب کردن فایل های JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "فشرده سازی و کاهش حجم فایل های جاوا اسکریپت" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "فشرده سازی JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "با فعال کردن این قسمت تعداد درخواست های HTTP کاهش می یابد" #: inc/admin.php:1291 msgid "Combine Css" msgstr "ترکیب فایل های CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "فشرده سازی بیشتر و قوی تر فایل های CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "فشرده سازی قویتر CSS" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "فشرده سازی و کاهش حجم فایل های CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "فشرده سازی CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "باعث کاهش بیشتر حجم و فشرده سازی بیشتر می شود" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "فشرده سازی قویتر HTML" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "باعث کاهش حجم برگه ها میشود" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "فشرده سازی HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "حذف کش در صورت بروز رسانی برگه و پست" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "بروزرسانی پست" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "حذف کش در صورت انتشار پست و برگه" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "پست جدید" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "ایجاد کش برای موبایل" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "تم موبایل" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "عدم نمایش کش دسکتاپ برای موبایل" #: inc/admin.php:1195 msgid "Mobile" msgstr "موبایل" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "عدم نمایش حالت کش شده برای کاربران وارد شده" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "کاربران وارد شده" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "ایجاد اتوماتیک کش تمامی قسمت های سایت" #: inc/admin.php:1157 msgid "Preload" msgstr "پیش‌بارگذاری" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "کاهش تعداد کوئری های دیتابیس" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "کش ابزارک ها" #: inc/admin.php:1119 msgid "Enable" msgstr "فعال کردن" #: inc/admin.php:1118 msgid "Cache System" msgstr "فعال کردن کش" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "یکبار هر 15 روز" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "یکبار هر 7 روز" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "یکبار هر 3 روز" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "یکبار هر 10 ساعت" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "یکبار هر 9 ساعت" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "یکبار هر 8 ساعت" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "یکبار هر 7 ساعت" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "یکبار هر 5 ساعت" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "یکبار هر 4 ساعت" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "یکبار هر 3 ساعت" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "یکبار هر 2 ساعت" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "یکبار هر 10 روز" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "ساده ترین و سریعترین پلاگین کش وردپرس" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "سریعترین کش وردپرس" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "یکبار در سال" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "یکبار در ماه" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "یکبار در روز" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "هر 6 ساعت یکبار" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "هرساعت یکبار" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "هرساعت دوبار" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "یکبار در 15 دقیقه" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "یکبار در هر 5 دقیقه" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "یکبار در هر دقیقه"PKL\8u1B1B4wp-fastest-cache/languages/wp-fastest-cache-ko_KR.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Korean # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-12-26 05:50:44+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: GlotPress/4.0.1\n" "Language: ko_KR\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "관리자 도구 모음의 WP 가장 빠른 캐시 메뉴는 아래에서 선택한 사용자 역할에 표시됩니다." #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "사용자 역할" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "사이트맵을 하나 이상 추가해야 합니다." #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "이 섹션을 통해 고급 설정을 사용자 정의할 수 있습니다." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "고급 설정" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "사전 로딩에 사용할 사이트맵을 지정할 수 있습니다." #: templates/preload.php:150 msgid "Sitemaps" msgstr "사이트맵" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "사전 로딩에 사용할 콘텐츠를 지정할 수 있으며 정렬할 수도 있습니다." #: templates/preload.php:86 msgid "Content Types" msgstr "콘텐츠 유형" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "이 섹션을 통해 프리로드 기능에 사용할 방법을 지정할 수 있습니다." #: templates/preload.php:72 msgid "Choose a Method" msgstr "방법 선택" #: templates/preload.php:56 msgid "Preload Settings" msgstr "사전 로드 설정" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "일부 자바스크립트 소스는 마우스를 스크롤하거나 움직일 때까지 로드되지 않습니다." #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "자바스크립트 지연" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "WP Fastest Cache 옵션" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "yandex 클릭 ID 매개변수 있음" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "특정 페이지 지우기" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "저장" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "취소" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "도구 모음 설정" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "모든 사이트의 캐시 지우기" #: wpFastestCache.php:439 msgid "Settings" msgstr "설정" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "캐시 지우기" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "렌더링 차단 JavaScript 리소스 제거" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "옵션이 저장되었습니다" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "장바구니에 우커머스 항목이 있습니다" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "구글 애널리틱스 매개변수가 있음" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "아카이브" #: templates/timeout.php:189 msgid "Server Time" msgstr "서버 시간" #: templates/timeout.php:169 msgid "delete the files" msgstr "파일을 삭제" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "다음을 포함함" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "다음과 동일함" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "다음으로 시작" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "홈페이지" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "모두" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "페이지 제외 마법사" #: templates/timeout.php:124 msgid "Then" msgstr "그 다음에" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "REQUEST_URI인 경우" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "캐시 시간 초과 마법사" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "지연 로드 설정" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Gzip 활성화" #: templates/update_now.php:9 msgid "Please Update" msgstr "업데이트 해주세요" #: templates/update_success.php:9 msgid "Success" msgstr "성공" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "경고" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "새 규칙 추가" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "캐시 지우기 및 축소된 CSS/JS" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Premium 버전에서만 사용 가능" #: templates/timeout.php:141 msgid "Choose One" msgstr "선택" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "모든 캐시 파일도 제거됩니다." #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "CSS 파일을 수정하면 축소된 CSS 파일을 삭제해야 합니다." #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "대상 폴더" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "모든 캐시 파일을 삭제할 수 있습니다." #: inc/admin.php:1090 msgid "Exclude" msgstr "제외" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "이미지 최적화" #: inc/admin.php:1082 msgid "Settings" msgstr "설정" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "데이터베이스 정리" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN 설정" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "JS 제외" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "CSS 제외" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "쿠키 제외" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "사용자 에이전트 제외" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "페이지 제외" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "이미지 최적화 도구" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "시간 초과 규칙" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "캐시 통계" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "게시물/페이지의 캐시 지우기" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "게시물이나 페이지를 업데이트한 후 어떻게 하시겠습니까?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "페이지 매김 캐시 지우기" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "게시물 태그 캐시 지우기" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "게시물 카테고리 캐시 지우기" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "홈 페이지 캐시 지우기" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "모든 캐시 지우기" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "새 게시물을 게시한 후 어떻게 되기를 원하십니까?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "확인" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "완료 후 다시 시작" #: templates/preload.php:210 msgid "pages per minute" msgstr "페이지 (분당)" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "사용자 정의 택소노미" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "사용자 정의 게시물 유형" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "첨부파일" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "태그" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "페이지" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "카테고리" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "게시물" #: templates/preload.php:102 msgid "Homepage" msgstr "홈페이지" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "결합된 JS 파일을 통해 HTTP 요청 감소" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "브라우저 뷰포트에 들어갈 때 이미지 및 iframe 로드" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "구글 폰트를 비동기식으로 로드" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "구글 폰트" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "렌더링 차단 JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "이모티콘 인라인 css 및 wp-emoji-release.min.js를 제거할 수 있습니다." #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "이모티콘 비활성화" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "반복 방문자의 페이지 로드 시간 단축" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "브라우저 캐싱" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "서버에서 보낸 파일 크기 줄이기" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Js 결합 플러스" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Js 결합" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "JS 파일의 크기를 줄일 수 있습니다." #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "JS 축소" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "결합된 CSS 파일을 통해 HTTP 요청 감소" #: inc/admin.php:1291 msgid "Combine Css" msgstr "CSS 결합" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "더 강력한 CSS 축소" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "CSS 축소 플러스" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "CSS 파일의 크기를 줄일 수 있습니다." #: inc/admin.php:1270 msgid "Minify Css" msgstr "CSS 축소" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "더 강력한 HTML 축소" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "HTML 축소 플러스" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "페이지 크기를 줄일 수 있습니다." #: inc/admin.php:1250 msgid "Minify HTML" msgstr "HTML 축소" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "게시물이나 페이지가 업데이트될 때 캐시 파일 지우기" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "게시물 업데이트" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "게시물 또는 페이지가 게시될 때 캐시 파일 지우기" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "새 게시물" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "모바일 테마용 캐시 만들기" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "모바일 테마" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "데스크톱용 캐시 버전을 모바일 기기에 표시하지 않음" #: inc/admin.php:1195 msgid "Mobile" msgstr "모바일" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "로그인한 사용자에게 캐시된 버전을 표시하지 않음" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "로그인한 사용자" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "모든 사이트의 캐시를 자동으로 생성" #: inc/admin.php:1157 msgid "Preload" msgstr "사전 로드" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "SQL 쿼리 수 줄이기" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "위젯 캐시" #: inc/admin.php:1119 msgid "Enable" msgstr "활성화" #: inc/admin.php:1118 msgid "Cache System" msgstr "시스템 캐시" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "15일에 한 번" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "7일에 한 번" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "3일에 한 번" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "10시간에 한 번" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "9시간에 한 번" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "8시간에 한 번" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "7시간에 한 번" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "5시간에 한 번" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "4시간에 한 번" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "3시간에 한 번" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "2시간에 한 번" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "10일에 한 번" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "가장 간단하고 빠른 WP 캐시 시스템" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "일년에 한번" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "한달에 한번" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "하루에 한 번" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "6시간에 한 번" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "한 시간에 한 번" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "한 시간에 두 번" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "15분에 한 번" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "5분에 한 번" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "1분에 한 번"PKL\@Bo3h"h"4wp-fastest-cache/languages/wp-fastest-cache-es_AR.monu[<\\] w'      ' 2 B N g    2 0 8 D O _ h .     ; 15 .g       % * 4 = AL   =  / : J V g q x         (;M`s    !*L`x ~/.* $.Et   (   - ;GX9`9 &%!.P?o.- >_x8 '2Z c oz $'+ )7FaH   *#1N L:<:w     1L^cuS 0,T]  +J jx-BWn&)?i <<H4#}; !3 ;H Q[)n#  > I]  - , '!+;!Rg!!%!-!1""T"SettingsAdd New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CssCombine JsCombine Js PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsdelete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/pages per minutePO-Revision-Date: 2020-08-21 00:34:21+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: es_AR Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) AjustesAgregar una nueva reglaTodoTambién se van a eliminar todos los archivos del cachéArchivosAdjuntosCaché del navegadorAjustes de la CDNEstadísticas del cachéSistema de cachéAsistente del tiempo límite del cachéCancelarCategoríasElegí unoVaciar toda el cachéBorrar cachéVaciar el caché de todos los sitiosVaciar el caché de paginaciónVaciar el caché de entradas / páginasVaciar el caché de categorías de entradasVaciar el caché de etiquetas de entradasVaciar los archivos del caché cuando se publica una entrada o páginaVaciar los archivos del caché cuando se actualiza una entrada o páginaCombinar CSSCombinar JSCombine Js PlusContieneCrear el caché para el tema para móvilesCrear automáticamente el caché de todo el sitioTipos de contenido personalizadoTaxonomías personalizadasLimpieza de la base de datosDesactivar los emojisNo mostrar la versión de escritorio del caché en los dispositivos móvilesNo mostrar la versión del caché para usuarios conectadosEliminar los recursos JavaScript que bloquean los procesosEmre VonaActivarActivar GzipExcluirExcluir CSSExcluir cookiesExcluir JSAsistente para excluir páginasExcluir páginasExcluir agentes de usuarioFuentes de GoogleGzipPágina de inicioPágina de inicioSi REQUEST_URISi modificás cualquier archivo CSS, tenés que borrar los archivos CSS minimizadosOptimización de imágenesEs igual aAsistente de carga diferidaCargar las fuentes de Google de forma asíncronaCargar las imágenes e iframes cuando entren en la visualización de los navegadoresUsuarios conectadosMinimizar CSSMinify Css PlusMinimizar HTMLMinify HTML PlusMinimizar JSMóvilTema para móvilesMás potente minimización CSSMás potente minimización HTMLNueva entradaAceptarUna vez cada minutoUna vez cada 10 díasUna vez cada 10 horasUna vez cada 15 díasUna vez cada 15 minutosUna vez cada 2 horasUna vez cada 3 díasUna vez cada 3 horasUna vez cada 4 horasUna vez cada 5 horasUna vez cada 5 minutosUna vez cada 6 horasUna vez cada 7 díasUna vez cada 7 horasUna vez cada 8 horasUna vez cada 9 horasUna vez al díaUna vez al mesUna vez al añoUna vez a la horaSolo disponible en la versión premiumHerramienta de optimización de imágenesLas opciones han sido guardadasPáginasPor favor, actualizaEntradasPrecargarReducir las solicitudes HTTP mediante archivos JS combinadosReducir las solicitudes HTTP mediante archivos JS combinadosReducir el tiempo de carga de la página para los visitantes repetitivosReducir el número de consultas SQLReducir el tamaño de los archivos enviados por tu servidorBloqueo de procesado de JSReiniciar después de completadoGuardarHora del servidorAjustesComienza conCorrectoEtiquetasCarpeta de destinoEl sistema WP Cache más simple y rápidoEntoncesReglas de límiteAjustes de la barra de herramientasDos veces a la horaActualizar la entradaWP Fastest CacheAdvertencia¿Qué querés que pase después de publicar la nueva entrada?¿Qué querés que pase después de actualizar una entrada o una página?Widget de cachéPodés reducir el tamaño de los archivos CSSPodés reducir el tamaño de los archivos JSPodés reducir el tamaño de la páginaPodés borrar todos los archivos del cachéPodés eliminar los emojis CSS integrados y el archivo «wp-emoji-release.min.js»borrar los archivostiene parámetros de Google Analyticstiene artículos de WooCommerce en el carritohttp://es.wordpress.org/plugins/wp-fastest-cache/páginas por minutoPKL\}~"~"4wp-fastest-cache/languages/wp-fastest-cache-es_EC.monu[<\\] w'      ' 2 B N g    2 0 8 D O _ h .     ; 15 .g       % * 4 = AL   =  / : J V g q x         (;M`s    !*L`x ~/.* $.Et   (   - ;GX9`9 &%!.P?o.- >_x7!)3] f r|$'+)<HfJ  #*,1W N<G:     ->YkpR 08Ti  $7V v&;Pe|&%)Lv <<HA#; &.@ HU ^h){#  @* Kk  - , '#!-K!Ry!!%!-"54"j"SettingsAdd New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CssCombine JsCombine Js PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsdelete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/pages per minutePO-Revision-Date: 2021-01-02 11:47:06+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: es_EC Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) AjustesAñadir una nueva reglaTodoTambién se eliminarán todos los archivos de la cachéArchivosAdjuntosCaché del navegadorAjustes de la CDNEstadísticas de la cachéSistema de cachéAsistente del tiempo límite de la cachéCancelarCategoríasElige unoVaciar toda la cachéVaciar la cachéVaciar la caché de todos los sitiosVaciar la caché de paginaciónVaciar la caché de entradas / páginasVaciar la caché de categorías de entradasVaciar la caché de etiquetas de entradasVaciar los archivos de la caché cuando se publica una entrada o páginaVaciar los archivos de la caché cuando se actualiza una entrada o páginaCombinar CSSCombinar JSCombine Js PlusContieneCrear la caché para el tema para móvilesCrear automáticamente la caché de todo el sitioTipos de contenido personalizadoTaxonomías personalizadasLimpieza de la base de datosDesactivar los emojisNo mostrar la versión de escritorio de la caché en los dispositivos móvilesNo mostrar la versión de la caché para usuarios conectadosEliminar los recursos JavaScript que bloquean los procesosEmre VonaActivarActivar GzipExcluirExcluir CSSExcluir cookiesExcluir JSAsistente para excluir páginasExcluir páginasExcluir agentes de usuarioFuentes de GoogleGzipPágina de inicioPágina de inicioSi REQUEST_URISi modificas cualquier archivo CSS, tienes que borrar los archivos CSS minimizadosOptimización de imágenesEs igual aAsistente de carga diferidaCargar las fuentes de Google de forma asíncronaCargar las imágenes e iframes cuando entren en la visualización de los navegadoresUsuarios conectadosMinimizar CSSMinify Css PlusMinimizar HTMLMinify HTML PlusMinimizar JSMóvilTema para móvilesMás potente minimización CSSMás potente minimización HTMLNueva entradaAceptarUna vez cada 1 minutoUna vez cada 10 díasUna vez cada 10 horasUna vez cada 15 díasUna vez cada 15 minutosUna vez cada 2 horasUna vez cada 3 díasUna vez cada 3 horasUna vez cada 4 horasUna vez cada 5 horasUna vez cada 5 minutosUna vez cada 6 horasUna vez cada 7 díasUna vez cada 7 horasUna vez cada 8 horasUna vez cada 9 horasUna vez al díaUna vez al mesUna vez al añoUna vez por horaSolo disponible en la versión premiumHerramienta de optimización de imágenesLas opciones han sido guardadasPáginasPor favor, actualizaEntradasPrecargarReducir las solicitudes HTTP mediante archivos JS combinadosReducir las solicitudes HTTP mediante archivos JS combinadosReducir el tiempo de carga de la página para los visitantes repetitivosReducir el número de consultas SQLReducir el tamaño de los archivos enviados por tu servidorBloqueo de procesado de JSReiniciar después de completadoGuardarHora del servidorAjustesComienza conCorrectoEtiquetasCarpeta de destinoEl sistema WP Cache más simple y rápidoEntoncesReglas de límiteAjustes de la barra de herramientasDos veces por horaActualizar la entradaWP Fastest CacheAdvertencia¿Qué quieres que ocurra después de publicar la nueva entrada?¿Qué quieres que ocurra después de actualizar una entrada o una página?Widget de cachéPuedes reducir el tamaño de los archivos CSSPuedes reducir el tamaño de los archivos JSPuedes reducir el tamaño de la páginaPuedes borrar todos los archivos de la cachéPuedes eliminar los emojis CSS integrados y el archivo «wp-emoji-release.min.js»borrar los archivostiene parámetros de Google Analyticstiene artículos de WooCommerce en el carritohttps://es-ec.wordpress.org/plugins/wp-fastest-cache/páginas por minutoPKL\ xZ*Z*4wp-fastest-cache/languages/wp-fastest-cache-es_ES.monu[    '  " . : J W h u       % ? Z y 2 0    % 5 > L .j      ; 1" .T       !*A9{  =  ' 7C T^ er(:M`s    !9Me ky/.* ".Cr F  `.(    +939m =&%!?a?3UTJ. <\m7 )>G\n)   #$>(c'+)H*Js   * 1K } N<F:     ,=XjoR 07Th    # 6 U u        !%!:!O!d!{!!!!!!!""&$")K"u"""" ""<"<#HT###;## $9$A$S$[$Uk$ $$ $$$)%%%#%%%&)&:& W&@c&K&&E'-G',u'''-'R'KK(_(i(a)%u)-)))2)&*F*SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below.The simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostUser RolesWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-12-10 17:18:30+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: es Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) AjustesAñadir una nueva reglaAjustes avanzadosTodoTambién se eliminarán todos los archivos de la cachéArchivosDebe añadirse al menos un mapa del sitioAdjuntosCaché del navegadorAjustes de la CDNEstadísticas de la cachéSistema de cachéAsistente del tiempo límite de la cachéCancelarCategoríasElige unoElegir métodoVaciar toda la cachéVaciar la cachéBorrar la caché y minimizar CSS/JSVaciar la caché de todos los sitiosVaciar la caché de la página de inicioVaciar la caché de paginaciónVaciar la caché de entradas / páginasVaciar la caché de categorías de entradasVaciar la caché de etiquetas de entradasVaciar los archivos de la caché cuando se publica una entrada o páginaVaciar los archivos de la caché cuando se actualiza una entrada o páginaVaciar páginas específicasCombinar CSSCombinar JSCombine Js PlusContieneTipos de contenidoCrear la caché para el tema para móvilesCrear automáticamente la caché de todo el sitioTipos de contenido personalizadoTaxonomías personalizadasLimpieza de la base de datosAplazar JsDesactivar los emojisNo mostrar la versión de escritorio de la caché en los dispositivos móvilesNo mostrar la versión de la caché para usuarios conectadosEliminar los recursos JavaScript que bloquean los procesosEmre VonaActivarActivar GzipExcluirExcluir CSSExcluir cookiesExcluir JSAsistente para excluir páginasExcluir páginasExcluir agentes de usuarioFuentes de GoogleGzipPágina de inicioPágina de inicioSi REQUEST_URISi modificas cualquier archivo CSS, tienes que borrar los archivos CSS minimizadosOptimización de imágenesEs igual aAsistente de carga diferidaCargar las fuentes de Google de forma asíncronaCargar las imágenes e iframes cuando entren en la visualización de los navegadoresUsuarios conectadosMinimizar CSSMinify Css PlusMinimizar HTMLMinify HTML PlusMinimizar JSMóvilTema para móvilesMás potente minimización CSSMás potente minimización HTMLNueva entradaAceptarUna vez cada 1 minutoUna vez cada 10 díasUna vez cada 10 horasUna vez cada 15 díasUna vez cada 15 minutosUna vez cada 2 horasUna vez cada 3 díasUna vez cada 3 horasUna vez cada 4 horasUna vez cada 5 horasUna vez cada 5 minutosUna vez cada 6 horasUna vez cada 7 díasUna vez cada 7 horasUna vez cada 8 horasUna vez cada 9 horasUna vez al díaUna vez al mesUna vez al añoUna vez por horaSolo disponible en la versión premiumHerramienta de optimización de imágenesLas opciones han sido guardadasPáginasPor favor, actualizaEntradasPrecargarAjustes de precargaReducir las solicitudes HTTP mediante archivos JS combinadosReducir las solicitudes HTTP mediante archivos JS combinadosReducir el tiempo de carga de la página para los visitantes repetitivosReducir el número de consultas SQLReducir el tamaño de los archivos enviados por tu servidorBloqueo de procesado de JSReiniciar después de completadoGuardarHora del servidorAjustesMapas del sitioAlgunos orígenes de js no se cargarán hasta que se haga scroll o se mueva el ratónComienza conCorrectoEtiquetasCarpeta de destinoEl menú WP Fastest Cache de la barra de herramientas del administrador será visible para los roles de usuario seleccionados a continuación.El sistema WP Cache más simple y rápidoEntoncesReglas de límiteAjustes de la barra de herramientasDos veces por horaActualizar la entradaPerfiles de usuarioWP Fastest CacheOpciones de WP Fastest CacheAdvertencia¿Qué quieres que ocurra después de publicar la nueva entrada?¿Qué quieres que ocurra después de actualizar una entrada o una página?Widget de cachéPuedes personalizar los ajustes avanzados a través de esta sección.Puedes reducir el tamaño de los archivos CSSPuedes reducir el tamaño de los archivos JSPuedes reducir el tamaño de la páginaPuedes borrar todos los archivos de la cachéPuedes eliminar los emojis CSS integrados y el archivo «wp-emoji-release.min.js»Puedes especificar los mapas del sitio que se utilizarán para la precarga.Puedes especificar el contenido que se utilizará para la precarga y también puedes ordenarlo.Puedes especificar el método que quieres que utilice la función de precarga a través de esta sección.borrar los archivostiene parámetros de Google Analyticstiene artículos de WooCommerce en el carritotiene parámetros de ID de clic de Yandexhttps://es.wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/páginas por minutoPKL\BB4wp-fastest-cache/languages/wp-fastest-cache-es_CL.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Spanish (Chile) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2025-02-14 17:49:47+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: es_CL\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "Debe agregarse al menos un mapa del sitio" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "Puedes personalizar los ajustes avanzados a través de esta sección." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Ajustes avanzados" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Puedes especificar los mapas del sitio que se utilizarán para la precarga." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Mapas del sitio" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Puedes especificar el contenido que se utilizará para la precarga y también puedes ordenarlo." #: templates/preload.php:86 msgid "Content Types" msgstr "Tipos de contenido" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "Puedes especificar el método que quieres que utilice la función de precarga a través de esta sección." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Elegir método" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Ajustes de precarga" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Algunos orígenes de js no se cargarán hasta que se haga desplazamiento o se mueva el ratón" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Aplazar Js" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "Opciones de WP Fastest Cache" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "tiene parámetros de ID de clic de Yandex" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Vaciar páginas específicas" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Guardar" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Cancelar" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Ajustes de la barra de herramientas" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Vaciar la caché de todos los sitios" #: wpFastestCache.php:439 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Vaciar la caché" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Eliminar los recursos JavaScript que bloquean los procesos" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Las opciones han sido guardadas" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "tiene artículos de WooCommerce en el carrito" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "tiene parámetros de Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archivos" #: templates/timeout.php:189 msgid "Server Time" msgstr "Hora del servidor" #: templates/timeout.php:169 msgid "delete the files" msgstr "borrar los archivos" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Contiene" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Es igual a" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Comienza con" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Página de inicio" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Todo" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Asistente para excluir páginas" #: templates/timeout.php:124 msgid "Then" msgstr "Entonces" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Si REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Asistente del tiempo límite de la caché" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Asistente de carga diferida" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Activar Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Por favor, actualiza" #: templates/update_success.php:9 msgid "Success" msgstr "Correcto" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Advertencia" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Agregar una nueva regla" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "Borrar la caché y minimizar CSS/JS" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Solo disponible en la versión premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Elige uno" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "También se eliminarán todos los archivos de la caché" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Si modificas cualquier archivo CSS, tienes que borrar los archivos CSS minimizados" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Carpeta de destino" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Puedes borrar todos los archivos de la caché" #: inc/admin.php:1090 msgid "Exclude" msgstr "Excluir" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimización de imágenes" #: inc/admin.php:1082 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Limpieza de la base de datos" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Ajustes de la CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Excluir JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Excluir CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Excluir cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Excluir agentes de usuario" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Excluir páginas" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Herramienta de optimización de imágenes" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Reglas de límite" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Estadísticas de la caché" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Vaciar la caché de entradas / páginas" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "¿Qué quieres que ocurra después de actualizar una entrada o una página?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Vaciar la caché de paginación" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Vaciar la caché de etiquetas de entradas" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Vaciar la caché de categorías de entradas" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Vaciar la caché de la página de inicio" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Vaciar toda la caché" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "¿Qué quieres que ocurra después de publicar la nueva entrada?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "Aceptar" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Reiniciar después de completado" #: templates/preload.php:210 msgid "pages per minute" msgstr "páginas por minuto" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Taxonomías personalizadas" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Tipos de contenido personalizado" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Adjuntos" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Etiquetas" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Páginas" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categorías" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Entradas" #: templates/preload.php:102 msgid "Homepage" msgstr "Página de inicio" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Cargar las imágenes e iframes cuando entren en la visualización de los navegadores" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Cargar las fuentes de Google de forma asíncrona" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Fuentes de Google" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Bloqueo de procesado de JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Puedes eliminar los emojis CSS integrados y el archivo “wp-emoji-release.min.js”" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Desactivar los emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Reducir el tiempo de carga de la página para los visitantes repetitivos" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Caché del navegador" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Reducir el tamaño de los archivos enviados por tu servidor" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combine Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combinar JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Puedes reducir el tamaño de los archivos JS" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minimizar JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combinar CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Más potente minimización CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minify Css Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Puedes reducir el tamaño de los archivos CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minimizar CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Más potente minimización HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minify HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Puedes reducir el tamaño de la página" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minimizar HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Vaciar los archivos de la caché cuando se actualiza una entrada o página" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Actualizar la entrada" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Vaciar los archivos de la caché cuando se publica una entrada o página" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nueva entrada" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Crear la caché para el tema para móviles" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Tema para móviles" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "No mostrar la versión de escritorio de la caché en los dispositivos móviles" #: inc/admin.php:1195 msgid "Mobile" msgstr "Móvil" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "No mostrar la versión de la caché para usuarios conectados" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Usuarios conectados" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Crear automáticamente la caché de todo el sitio" #: inc/admin.php:1157 msgid "Preload" msgstr "Precargar" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Reducir el número de consultas SQL" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget de caché" #: inc/admin.php:1119 msgid "Enable" msgstr "Activar" #: inc/admin.php:1118 msgid "Cache System" msgstr "Sistema de caché" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Una vez cada 15 días" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Una vez cada 7 días" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Una vez cada 3 días" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Una vez cada 10 horas" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Una vez cada 9 horas" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Una vez cada 8 horas" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Una vez cada 7 horas" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Una vez cada 5 horas" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Una vez cada 4 horas" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Una vez cada 3 horas" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Una vez cada 2 horas" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Una vez cada 10 días" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "El sistema WP Cache más simple y rápido" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "https://cl.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Una vez al año" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Una vez al mes" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Una vez al día" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Una vez cada 6 horas" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Una vez por hora" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Dos veces por hora" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Una vez cada 15 minutos" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Una vez cada 5 minutos" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Una vez cada 1 minuto"PKL\.~"~"4wp-fastest-cache/languages/wp-fastest-cache-es_CO.monu[<\\] w'      ' 2 B N g    2 0 8 D O _ h .     ; 15 .g       % * 4 = AL   =  / : J V g q x         (;M`s    !*L`x ~/.* $.Et   (   - ;GX9`9 &%!.P?o.- >_x7!)3] f r|$'+)<HfJ  #*,1W N<G:     ->YkpR 08Ti  $7V v&;Pe|&%)Lv <<HA#; &.@ HU ^h){#  @* Kk  - , '#!-K!Ry!!%!-"54"j"SettingsAdd New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CssCombine JsCombine Js PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsdelete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/pages per minutePO-Revision-Date: 2021-10-07 04:49:27+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: es_CO Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) AjustesAñadir una nueva reglaTodoTambién se eliminarán todos los archivos de la cachéArchivosAdjuntosCaché del navegadorAjustes de la CDNEstadísticas de la cachéSistema de cachéAsistente del tiempo límite de la cachéCancelarCategoríasElige unoVaciar toda la cachéVaciar la cachéVaciar la caché de todos los sitiosVaciar la caché de paginaciónVaciar la caché de entradas / páginasVaciar la caché de categorías de entradasVaciar la caché de etiquetas de entradasVaciar los archivos de la caché cuando se publica una entrada o páginaVaciar los archivos de la caché cuando se actualiza una entrada o páginaCombinar CSSCombinar JSCombine Js PlusContieneCrear la caché para el tema para móvilesCrear automáticamente la caché de todo el sitioTipos de contenido personalizadoTaxonomías personalizadasLimpieza de la base de datosDesactivar los emojisNo mostrar la versión de escritorio de la caché en los dispositivos móvilesNo mostrar la versión de la caché para usuarios conectadosEliminar los recursos JavaScript que bloquean los procesosEmre VonaActivarActivar GzipExcluirExcluir CSSExcluir cookiesExcluir JSAsistente para excluir páginasExcluir páginasExcluir agentes de usuarioFuentes de GoogleGzipPágina de inicioPágina de inicioSi REQUEST_URISi modificas cualquier archivo CSS, tienes que borrar los archivos CSS minimizadosOptimización de imágenesEs igual aAsistente de carga diferidaCargar las fuentes de Google de forma asíncronaCargar las imágenes e iframes cuando entren en la visualización de los navegadoresUsuarios conectadosMinimizar CSSMinify Css PlusMinimizar HTMLMinify HTML PlusMinimizar JSMóvilTema para móvilesMás potente minimización CSSMás potente minimización HTMLNueva entradaAceptarUna vez cada 1 minutoUna vez cada 10 díasUna vez cada 10 horasUna vez cada 15 díasUna vez cada 15 minutosUna vez cada 2 horasUna vez cada 3 díasUna vez cada 3 horasUna vez cada 4 horasUna vez cada 5 horasUna vez cada 5 minutosUna vez cada 6 horasUna vez cada 7 díasUna vez cada 7 horasUna vez cada 8 horasUna vez cada 9 horasUna vez al díaUna vez al mesUna vez al añoUna vez por horaSolo disponible en la versión premiumHerramienta de optimización de imágenesLas opciones han sido guardadasPáginasPor favor, actualizaEntradasPrecargarReducir las solicitudes HTTP mediante archivos JS combinadosReducir las solicitudes HTTP mediante archivos JS combinadosReducir el tiempo de carga de la página para los visitantes repetitivosReducir el número de consultas SQLReducir el tamaño de los archivos enviados por tu servidorBloqueo de procesado de JSReiniciar después de completadoGuardarHora del servidorAjustesComienza conCorrectoEtiquetasCarpeta de destinoEl sistema WP Cache más simple y rápidoEntoncesReglas de límiteAjustes de la barra de herramientasDos veces por horaActualizar la entradaWP Fastest CacheAdvertencia¿Qué quieres que ocurra después de publicar la nueva entrada?¿Qué quieres que ocurra después de actualizar una entrada o una página?Widget de cachéPuedes reducir el tamaño de los archivos CSSPuedes reducir el tamaño de los archivos JSPuedes reducir el tamaño de la páginaPuedes borrar todos los archivos de la cachéPuedes eliminar los emojis CSS integrados y el archivo «wp-emoji-release.min.js»borrar los archivostiene parámetros de Google Analyticstiene artículos de WooCommerce en el carritohttps://es-co.wordpress.org/plugins/wp-fastest-cache/páginas por minutoPKL\UM((4wp-fastest-cache/languages/wp-fastest-cache-nl_BE.monu[    '  " . : J W h u       % ? Z y 2 0    % 5 > L .j      ; 1" .T       !*A9{  =  ' 7C T^ er(:M`s    !9Me ky/.* ".Cr F  `.(    +939m =&%!?a?3UTJ. <\ m) 0HQar     "=W!r%GE f  .(@ T`Bt:. ! +7 HSb u JL drM  *6 GQ Xe{   0 B T f }         !$!A!^!u! ~! ! !!:!9!?.""n"I""&"# # *#7#X@# ####w#,0$]$a$q$$$$$$ $C$I5% %=%/%-%*(&&S&Az&I&`'Ug'!'!'-( /(.P(((SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below.The simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostUser RolesWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-12-11 13:40:40+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: nl_BE Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) InstellingenNieuwe regel toevoegenGeavanceerde instellingenAllesAlle cachebestanden worden ook verwijderdArchievenEr moet minstens één sitemap worden toegevoegdBijlagenBrowser cachingCDN instellingenCache statistiekenCache systeemCache timeout wizardAnnulerenCategorieënKies er eenKies een methodeAlle cache wissenCache wissenCache en minified CSS/JS leegmakenCache van alle websites wissenCache van homepage wissenCache van paginatie wissenCache van bericht / pagina wissenCache van bericht categorieën wissenCache van bericht tags wissenCache bestanden wissen wanneer een bericht of pagina wordt gepubliceerdCache bestanden wissen wanneer een bericht of pagina wordt bijgewerktSpecifieke pagina's wissenCSS samenvoegenCombineer JsCombineer Js PlusBevatInhoud typesCache maken voor mobiel themaDe cache van de hele website automatisch makenAangepaste berichttypesAangepaste taxonomieënDatabase opschoningVertraag JsEmojis uitschakelenDe versie in de cache voor desktop niet tonen op mobiele apparatenDe versie in de cache voor ingelogde gebruikers niet tonenElimineer render blokkering javascript bronnenEmre VonaInschakelenGzip inschakelenUitsluitenCSS uitsluitenCookies uitsluitenJS uitsluitenUitsluiten pagina wizardPagina's uitsluitenUitsluiten gebruikers-agentsGoogle FontsGzipHomepageHomepageAls REQUEST_URIAls je een css bestand wijzigt, moet je minified css bestanden verwijderenAfbeeldingoptimalisatieIs gelijk aanInstellingen voor lazy loadGoogle Fonts asynchroon ladenAfbeeldingen en iframes laden wanneer ze de viewport van de browsers betredenIngelogde gebruikersMinify CSSMinify CSS PlusMinify HTMLMinify HTML PlusMinify JsMobielMobiel themaKrachtiger minify CSSKrachtiger minify htmlNieuw berichtOKEenmaal per minuutEenmaal per 10 dagenEenmaal per 10 uurEenmaal per 15 dagenEenmaal per 15 minutenEenmaal per 2 uurEenmaal per 3 dagenEenmaal per 3 uurEenmaal per 4 uurEenmaal per 5 uurEen keer per 5 minutenEenmaal per 6 uurEenmaal per 7 dagenEenmaal per 7 uurEenmaal per 8 uurEenmaal per 9 uurEenmaal per dagEenmaal per maandEenmaal per jaarEenmaal per uurAlleen beschikbaar in Premium versieOptimaliseer afbeelding toolOpties zijn opgeslagenPagina'sBijwerkenBerichtenVooraf ladenVooraf laden instellingenHTTP aanvragen verminderen via gecombineerde css bestandenHTTP aanvragen verminderen via gecombineerde js-bestandenLaadtijden van pagina's voor terugkerende bezoekers verminderenHet aantal SQL query's verminderenDe grootte van bestanden die vanaf je server worden verzonden, verkleinenRender blokkeren JsOpnieuw starten nadat deze is voltooidOpslaanServer tijdInstellingenSitemapsSommige js-bronnen worden pas geladen wanneer er wordt gescrold of de muis wordt bewogenBegint metGeluktTagsDoelmapHet menu WP Fastest Cache op de beheerder werkbalk zal hieronder zichtbaar zijn voor de geselecteerde gebruikersrollen.Het eenvoudigste en snelste WP cache systeemDanTime-out regelsWerkbalk instellingenTweemaal per uurBericht bijwerkenGebruikersrollenWP Fastest CacheWP Fastest Cache optiesWaarschuwingWat wil je dat er gebeurt na het publiceren van het nieuwe bericht?Wat wil je dat er gebeurt na het bijwerken van een bericht of een pagina?Widget cacheIn deze sectie kan je de geavanceerde instellingen aanpassen.Je kunt de grootte van css-bestanden verkleinenJe kan de grootte van js bestanden verkleinenJe kan de grootte van de pagina verkleinenJe kan alle cachebestanden verwijderenJe kan de emoji inline css en wp-emoji-release.min.js verwijderenJe kan sitemaps opgeven die moeten worden gebruikt voor het vooraf laden.Je kan de inhoud opgeven die moet worden gebruikt voor het voor laden en je kan ze ook sorteren.In deze sectie kan je de methode opgeven die je wil dat de voorlaad functie gebruikt.verwijder geselecteerde bestandenheeft Google Analytics parametersheeft Woocommerce artikelen in winkelwagentjeheeft Yandex Click ID parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pagina's per minuutPKL\u''4wp-fastest-cache/languages/wp-fastest-cache-fa_IR.monu[<\\] w'      ' 2 B N g    2 0 8 D O _ h .     ; 15 .g       % * 4 = AL   =  / : J V g q x         (;M`s    !*L`x ~/.* $.Et   (   - ;GX9`9 &%!.P?o.->W w6 !/F]d+( )2#\9@&2At%}D#$ &1'X9NK  U_q7&=-<&j"+$"9b,"#& =JA\Q  +Ea{!@[t ;" ^ "  $   c!cg!=!4 "A>"$"%" """"#'#9#DI##&#"###"$ 4$[?$q$ %:$%N_%1%(%B &L&:c&*&.&&SettingsAdd New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CssCombine JsCombine Js PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsdelete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/pages per minutePO-Revision-Date: 2022-09-10 05:23:27+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Generator: GlotPress/4.0.1 Language: fa Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) تنظیماتافزودن قانون جدیدهمهتمامی فایل های کش حذف خواهد شدبایگانی هاپیوست‌هاکش مرورگرتنظیمات CDNآمار کشفعال کردن کشتایم بندی کشلغودسته‌بندی‌هایکی را انتخاب کنحذف تمام کشپاکسازی کشحذف کش از تمامی سایت‌هاحذف کش Paginationحذف کش پست ها و برگه هاحذف کش دسته بندی پست هاحذف کش تگ های پست هاحذف کش در صورت انتشار پست و برگهحذف کش در صورت بروز رسانی برگه و پستترکیب فایل های CSSترکیب کردن فایل های JSترکیب کردن قوی تر فایل های JSشاملایجاد کش برای موبایلایجاد اتوماتیک کش تمامی قسمت های سایتپست تایپ های سفارشیتکسونومی های سفارشیپاکسازی پایگاه‌دادهغیرفعال کردن اموجی هاعدم نمایش کش دسکتاپ برای موبایلعدم نمایش حالت کش شده برای کاربران وارد شدهبرطرف کردن مشکل Eliminate render-blocking JavaScript resourcesEmre Vonaفعال کردنفعال کردن Gzipعدم تاثیر برعدم اعمال بر فایل‌های سی اس اسعدم اعمال بر کوکی هایعدم اعمال بر فایل های جاوااسکریپتعدم فعال سازی در برگه هایعدم اعمال در برگه هایعدم اعمال بر User-Agentsفونت‌های گوگلGZipصفحه اصلیصفحه نخستاگر لینک درخواستی برابردر صورت تغییر در فایل های سی اس اس، باید کش و فایل‌های فشرده را حذف کنیدبهینه‌سازی تصاویربرابر باتنظیمات Lazy Loadلود فونت های گوگل بصورت asynchronouslyلود تصاویر و آی فریم ها با قرار گرفتن در حالت دید کاربرکاربران وارد شدهفشرده سازی CSSفشرده سازی قویتر CSSفشرده سازی HTMLفشرده سازی قویتر HTMLفشرده سازی JSموبایلتم موبایلفشرده سازی بیشتر و قوی تر فایل های CSSباعث کاهش بیشتر حجم و فشرده سازی بیشتر می شودپست جدیدتاییدیکبار در هر دقیقهیکبار هر 10 روزیکبار هر 10 ساعتیکبار هر 15 روزیکبار در 15 دقیقهیکبار هر 2 ساعتیکبار هر 3 روزیکبار هر 3 ساعتیکبار هر 4 ساعتیکبار هر 5 ساعتیکبار در هر 5 دقیقههر 6 ساعت یکباریکبار هر 7 روزیکبار هر 7 ساعتیکبار هر 8 ساعتیکبار هر 9 ساعتیکبار در روزیکبار در ماهیکبار در سالهرساعت یکبارفقط در نسخه پریمیوم در دسترس است.بهینه سازی تصاویرتنظیمات ذخیره شدندبرگه‌هالطفا بروزرسانی کنیدنوشته‌هاپیش‌بارگذاریبا فعال کردن این قسمت تعداد درخواست های HTTP کاهش می یابدبا فعال کردن این قسمت تعداد درخواست های HTTP کاهش می یابدکاهش زمان لود برای کاربران تکراریکاهش تعداد کوئری های دیتابیسکاهش حجم فایل های ارسالی از سمت سرورفعال کردن Render Blocking Jsریستارت بعد از تکمیلذخيرهزمان سرورتنظیماتشروع می شود باموفقیت آمیزبرچسب‌هاپوشه هدفساده ترین و سریعترین پلاگین کش وردپرسسپستایم بندی فایل های کشتنظیمات نوار ابزارهرساعت دوباربروزرسانی پستسریعترین کش وردپرسهشداربعد از انتشار پست جدید چه عملی میخواهید انجام شود؟بعد از بروزرسانی برگه ها و پست ها چه عملی مایل هستید انجام شود؟کش ابزارک هافشرده سازی و کاهش حجم فایل های CSSفشرده سازی و کاهش حجم فایل های جاوا اسکریپتباعث کاهش حجم برگه ها میشودحذف تمامی فایل‌های کشحذف سی اس اس های مرتبط و wp-emoji-release.min.jsحذف فایل‌هادارای پارامتر های گوگل آنالیتیکدارای محصول در سبد خریدhttp://wordpress.org/plugins/wp-fastest-cache/برگه در دقیقهPKL\yJAA4wp-fastest-cache/languages/wp-fastest-cache-sk_SK.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Slovak # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2025-01-10 12:15:27+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ((n >= 2 && n <= 4) ? 1 : 2);\n" "X-Generator: GlotPress/4.0.1\n" "Language: sk\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "Musí byť pridaná aspoň jedna mapa stránky (sitemap)" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "V tejto časti môžete prispôsobiť rozšírené nastavenia." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Rozšírené nastavenia" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Môžete zadať mapy stránok (sitemaps), ktoré sa majú použiť na prednačítanie." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Mapy stránok (Sitemap)" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Môžete určiť obsah, ktorý sa má použiť na prednačítanie, a môžete ho aj zoradiť." #: templates/preload.php:86 msgid "Content Types" msgstr "Typy obsahu" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "Prostredníctvom tejto časti môžete určiť metódu, ktorú má funkcia prednačítania používať." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Vybrať metódu" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Nastavenia prednačítania" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Niektoré zdroje js sa načítajú až pri posúvaní alebo pohybe myšou" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Oneskorenie Js" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "Možnosti WP Fastest Cache" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "má Yandex Click ID parametre" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Čistenie konkrétnych stránok" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Uložiť" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Zrušiť" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Nastavenia panela nástrojov" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Vymazať cache všetkých stránok" #: wpFastestCache.php:439 msgid "Settings" msgstr "Nastavenia" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Vyčistiť Cache" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Odstrániť JavaScript zdroje blokujúce vykreslenie" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Nastavenia boli uložené" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "má Woocommerce položky v košíku" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "má Google Analytics Parameters" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archívy" #: templates/timeout.php:189 msgid "Server Time" msgstr "Serverový čas" #: templates/timeout.php:169 msgid "delete the files" msgstr "Vymazať súbory" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Obsahuje" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "sa rovná" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Začína s" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Domovská stránka" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Všetko" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Vylúčiť sprievodcu stránkami" #: templates/timeout.php:124 msgid "Then" msgstr "Následne" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Ak REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Sprievodca Cache Timeout" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Lazy load nastavenia" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Povoliť Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Prosím aktualizujte" #: templates/update_success.php:9 msgid "Success" msgstr "Úspech" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Varovanie" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Pridať nové pravidlo" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "Vymazať Cache a minifikované CSS/JS" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "K dispozícii iba vo verzii Premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Zvoliť jeden" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Všetky cache súbory boli vymazané" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Ak upravíte akýkoľvek súbor css, musíte odstrániť zmenšené súbory css" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Cieľový priečinok" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Môžete odstrániť všetky súbory cache" #: inc/admin.php:1090 msgid "Exclude" msgstr "Vylúčiť" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimalizácia obrázkov" #: inc/admin.php:1082 msgid "Settings" msgstr "Nastavenia" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Vyčistenie databázy" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Nastavenia CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Vylúčiť JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Vylúčiť CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Vylúčiť Cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Vylúčiť User-Agents" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Vylúčiť stránky" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Optimalizovať nástroje obrázkov" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Timeout pravidla" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Štatistika Cache" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Vymazať cache článku/stránky" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Čo chcete, aby sa stalo po aktualizácii článku alebo stránky?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Vyčistiť cache stránkovania." #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Vymazať cache značiek článku" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Vymazať cache pre kategórie článkov" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Vymazať cache domovskej stránky" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Vymazať všetko cache" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Čo chcete, aby sa stalo po publikovaní nového článku?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Reštartovať po dokončení" #: templates/preload.php:210 msgid "pages per minute" msgstr "stránok za minútu" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Vlastné taxonómie" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Vlastné typy obsahu" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Prílohy" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Značky" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Stránky" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Kategórie" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Články" #: templates/preload.php:102 msgid "Homepage" msgstr "Domovská stránka" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Redukovať HTTP žiadosti pomocou kombinácie js súborov" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Načítať obrázky a iframe až pri vyrezávaní prehliadača" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Načítanie písma Google asynchrónne" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google Fonts" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Renderovať blokovanie Js" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Môžete odstrániť vložené súbory emoji css a wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Vypnúť Emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Znížte čas načítania stránky pre návštevníkov, ktorý už boli na stránke." #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Cache prehliadača" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Znížuje veľkosť súborov odoslaných zo servera" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Kombinovať Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Kombinovať Js " #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Môžete zmenšiť veľkosť js súborov" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minifikovať js" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Zredukovanie HTTP žiadosti prostredníctvom kombinovaných súborov CSS" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Kombinovať Css" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Výkonnejšie minifikovať css" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minifikovať Css Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Môžete zmenšiť veľkosť súborov css" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minifikovať Css" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Výkonnejšia minifikácia html" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minimalizovať HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Môžete znížiť veľkosť stránky" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minifikovať HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Aktualizovať cache súbory, keď upravíte článok alebo stránku" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Aktualizovať článok" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Aktualizovať cache súbory, keď publikujete článok alebo stránku " #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nový článok" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Vytvoriť cache pre mobilnú verziu témy" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Mobilná téma" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Nezobrazovať cache verziu pre PC na mobilných zariadeniach" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobil" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Nezobrazovať verziu v cache pre prihlásených používateľov" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Prihlásení používatelia" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Vytvorte cache pre všetky stránky automaticky" #: inc/admin.php:1157 msgid "Preload" msgstr "Prednačítanie" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Znížiť počet dopytov SQL" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget Cache" #: inc/admin.php:1119 msgid "Enable" msgstr "Zapnúť" #: inc/admin.php:1118 msgid "Cache System" msgstr "Cache systému" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Raz za 15 dní " #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Raz za 7 dní " #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Raz za 3 dni" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Každých 10 hodín " #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Každých 9 hodín" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr " Každých 8 hodín " #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Každých 7 hodín" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Každých 5 hodín " #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Každé 4 hodiny" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Každé 3 hodiny" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Každé 2 hodiny" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Raz za 10 dní" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Najjednoduchší a najrýchlejší WP Cache systém" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Raz ročne" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Jedenkrát mesačne" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Jedenkrát denne" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Jedenkrát každých 6 hodín" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Jedenkrát za hodinu" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Dvakrát za hodinu" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Jedenkrát každých 15 minút" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Jedenkrát každých 5 minút" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Jedenkrát za 1 minútu"PKL\.i@@4wp-fastest-cache/languages/wp-fastest-cache-cs_CZ.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Czech # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2025-02-25 22:35:47+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ((n >= 2 && n <= 4) ? 1 : 2);\n" "X-Generator: GlotPress/4.0.1\n" "Language: cs_CZ\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Pokročilá nastavení" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Můžete určit mapy webu, které se mají použít pro předběžné načítání." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Mapy webu" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "" #: templates/preload.php:86 msgid "Content Types" msgstr "Typy obsahu" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "" #: templates/preload.php:72 msgid "Choose a Method" msgstr "Vyberte metodu" #: templates/preload.php:56 msgid "Preload Settings" msgstr "" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Zpoždění Js" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "Nastavení WP Fastest Cache" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Vymazat konkrétní stránky" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Uložit" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Storno" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Nastavení panelu nástrojů" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Vymazat cache paměť všech webů." #: wpFastestCache.php:439 msgid "Settings" msgstr "Nastavení" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Vymazat cache paměť" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Odstranit zdroje JavaScriptu blokující vykreslení" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Nastavení byla uložena." #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "má položky Woocommerce v košíku" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "obsahuje parametry Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archivy" #: templates/timeout.php:189 msgid "Server Time" msgstr "Čas serveru" #: templates/timeout.php:169 msgid "delete the files" msgstr "odstranit soubory" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Obsahuje" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Je rovný" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Začíná na" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Úvodní stránka" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Vše" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Vyloučit průvodce stránkou" #: templates/timeout.php:124 msgid "Then" msgstr "Pak" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Pokud REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Průvodce vypršením časového limitu cache paměti" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Nastavení pomalého načítání (\"lazy load\")" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Povolit Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Prosím aktualizujte" #: templates/update_success.php:9 msgid "Success" msgstr "Hotovo" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Varování" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Přidat nové pravidlo" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "Smazat cache paměť a minifikovat CSS/JS" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Dostupné pouze v Premium verzi" #: templates/timeout.php:141 msgid "Choose One" msgstr "Vyber jeden" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Všechny soubory cache paměti budou také odstraněny" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Pokud upravíte jakýkoli CSS soubor, musíte odstranit minifikované CSS soubory" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Cílová složka" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Můžete smazat všechny soubory cache paměti" #: inc/admin.php:1090 msgid "Exclude" msgstr "Vyloučit" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimalizace obrázku" #: inc/admin.php:1082 msgid "Settings" msgstr "Nastavení" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Vyčištění databáze" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN nastavení " #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Vyloučit JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Vyloučit CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Vyloučit cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Vyloučit uživatelské agenty" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Vyloučit stránky" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Nástroj pro optimalizaci obrázků" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Pravidla časového limitu" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Statistiky cache paměti" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Vymazat cache paměť příspěvku / stránky" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Co se má stát po aktualizaci příspěvku nebo stránky?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Vymazat cache paměť stránkování" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Vymazat cache paměť tagů příspěvků" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Vymazat cache paměť kategorie příspěvků" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Vymazat cache paměť domovské stránky" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Vymazat všechny cache paměti" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Co se má stát po zveřejnění nového příspěvku?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Po dokončení restartujte počítač" #: templates/preload.php:210 msgid "pages per minute" msgstr "stránek za minutu" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Vlastní taxonomie" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Vlastní typy příspěvku" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Přílohy" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Tagy" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Stránky" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Kategorie" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Příspěvky" #: templates/preload.php:102 msgid "Homepage" msgstr "Domovská stránka" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Snížit požadavky HTTP prostřednictvím kombinovaných JS souborů" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Načíst obrázky a prvky iframe při vstupu do výřezu prohlížeče" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Načíst Google fonty asynchronně" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google Fonty" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "JS blokující vykreslování" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Můžete odstranit inline CSS pro emodži a wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Zakázat Emodži" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Snižte dobu načítání stránky pro opakované návštěvníky" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Cache paměť prohlížeče" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Zmenšit velikost souborů odeslaných ze serveru" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Kombinovat JS Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Kombinovat JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Můžete zmenšit velikost JS souborů" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minifikace JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Snížit požadavky HTTP prostřednictvím kombinovaných CSS souborů " #: inc/admin.php:1291 msgid "Combine Css" msgstr "Kombinovat CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Výkonnější minifikace CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minifikace CSS Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Můžete zmenšit velikost souborů CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minifikace CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Výkonnější minifikace HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minifikace HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Můžete zmenšit velikost stránky" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minifikace HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Vymazat soubory cache paměti při aktualizaci příspěvku nebo stránky" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Aktualizace příspěvku" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Vymazat soubory cache paměti při publikování příspěvku nebo stránky" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nový příspěvek" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Vytvořit cache paměť pro mobilní šablonu" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Mobilní šablona" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Nezobrazovat verzi cache paměti na stolních počítačích nebo na mobilních zařízeních" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobilní" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Nezobrazovat verzi cache paměti přihlášeným uživatelům" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Přihlášení uživatelé" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Vytvořit cache paměť všech webů automaticky" #: inc/admin.php:1157 msgid "Preload" msgstr "Předběžně načíst" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Snížit počet dotazů SQL" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Cache paměť widgetu" #: inc/admin.php:1119 msgid "Enable" msgstr "Povolit" #: inc/admin.php:1118 msgid "Cache System" msgstr "Systém cache paměti" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Jednou za 15 dní" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Jednou za 7 dní" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Jednou za 3 dny" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Jednou za 10 hodin" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Jednou za 9 hodin" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Jednou za 8 hodin" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Jednou za 7 hodin" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Jednou za 5 hodin" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Jednou za 4 hodiny" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Jednou za 3 hodiny" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Jednou za 2 hodiny" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Jednou za 10 dní" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Nejjednodušší a nejrychlejší WP Cache systém" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://cs.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Jednou za rok" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Jednou za měsíc" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Jednou za den" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Jednou za 6 hodin" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Jednou za hodinu" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Dvakrát za hodinu" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Jednou za 15 minut" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Jednou za 5 minut" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Jednou za minutu"PKL\.i334wp-fastest-cache/languages/wp-fastest-cache-ru_RU.monu[\ \ ] w   '  "   ( 5 J Q \ g w      2 0L }    .  2 D U ^ ;m 1 .   ' / ; K V j x    A  ! 4=U    ,58L_s"4GZ m x  ! /.O*~ . $ )5>FG  (   -F9N9 =& %4!Z|?3UTe .(Ww# *1)\? R->V+m%E !9 Vw->532/fee6bOSh85$+Pdz~~[x   $/ T 0j # <  !!5!U!j!-! ,"87"=p""=<#z### ## $$?;$3{$$$$$$%8%S%k%~%%%%%%&.&H&b&w&&&5&B&%''M'&^' '/'4'd'c\(t(>5)gt)8):*P*c****>+ V+a+j+8+ +>+8,@,Y,w,#,,p,}:--p-BA.A.B.4 /m>//S0*11.23B2-v21222SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2023-09-11 06:04:10+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : ((n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) ? 1 : 2); X-Generator: GlotPress/4.0.1 Language: ru Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) НастройкиДобавить новое правилоРасширенные настройкиВсеВсе файлы кэша также будут удаленыАрхивыНеобходимо добавить хотя бы одну карту сайтаВложенияКэш браузераНастройки CDNСтатистика кешированияСистема кэшированияМастер тайм-аута (время ожидания) кэшаОтменаРубрикиВыбрать одинВыберите метод.Очистить весь кэшОчистить кэшОчистить кеш всех сайтовОчистить кеш разбивки на страницыОчистить кэш записи/страницыОчистить кэш рубрики записиОчистить кеш тегов записиОчистить файлы кеша при публикации записи или страницыОчистить файлы кэша при обновлении записи или страницыОчистка определённых страницОбъединить CSSОбъединить JSОбъединить JS PlusСодержитТипы содержимогоСоздание кэша для темы мобильных устройствАвтоматическое создание кэша для всего сайтаПользовательские типы записейПользовательские таксономииОчистка базы данныхЗадержка JsОтключить EmojisНе показывать кешированную версию для ПК на мобильных устройствахНе показывать кешированную версию для авторизованных пользователейУстранение ресурсов JavaScript, блокирующих рендерингEmre VonaВключитьВключить GZIPИсключитьИсключить CSSИсключить файлы cookieИсключить JSМастер исключения страницИсключить страницыИсключить агентов-пользователейШрифты GoogleGzipГлавная страницаГлавная страницаЕсли REQUEST_URIПри изменении какого-либо CSS-файла, необходимо удалить минифицированные CSS-файлыОптимизация изображенияРавноНастройки отложенной загрузкиАсинхронная загрузка шрифтов GoogleЗагружать изображения и iframe, когда они попадают в область просмотра браузераЗарегистрированные пользователиМинификация CSSМинификация CSS PlusМинификация HTMLМинификация HTML PlusМинификация JSМобильныйМобильная темаБолее мощная минификация CSS-файловБолее мощная минификация HTMLНовая записьОККаждую минутуРаз в 10 сутокКаждые 10 часовОдин раз в 15 днейКаждые 15 минутКаждые 2 часаРаз в 3 дняКаждые 3 часаКаждые 4 часаКаждые 5 часовКаждые 5 минутКаждые 6 часовКаждые 7 днейКаждые 7 часовКаждые 8 часовКаждые 9 часовРаз в суткиРаз в месяцРаз в годРаз в часДоступно только в версии PremiumИнструмент оптимизации изображенийПараметры сохраненыСтраницыПожалуйста, обновитеЗаписиПредварительная загрузкаНастройки анимации загрузкиСокращение запросов HTTP с помощью объединения CSS-файловСокращение запросов HTTP с помощью объединения JS-файловСокращение времени загрузки страниц для повторных посетителейСокращение количества SQL-запросовСокращение размер файлов, отправляемых с вашего сервераJS-файлы, блокирующие рендерингПерезагрузить после завершенияСохранитьСерверное времяНастройкиКарты сайтаНекоторые исходные файлы js не будут загружены до прокрутки или перемещения мышиНачинается сУспехТегиЦелевая папкаПростой и быстрый кэш для WordPressТогдаПравила тайм-аута (время ожидания)Настройки панели инструментовРаз в полчасаОбновить записьWP Fastest CacheПараметры WP Fastest CacheПредупреждениеЧто вы хотите, чтобы произошло после публикации новой записи?Что вы хотите, чтобы произошло после обновления записи или страницы?Кэш виджетовВы можете настроить расширенные настройки через этот раздел.Вы можете уменьшить размер CSS-файловВы можете уменьшить размер JS-файловВы можете уменьшить размер страницыМожно удалить все файлы кэшаВы можете удалить встроенные CSS смайлики (emoji) и wp-emoji-release.min.jsВы можете указать карты сайта, которые будут использоваться для предварительной загрузки.Вы можете указать содержимое, которое будет использоваться для предварительной загрузки, а также отсортировать его.Вы можете указать метод, который вы хотите использовать для функции предварительной загрузки через этот раздел.удалить файлыимеет параметры Google Analyticsесть товары Woocommerce в корзинеимеет параметры Yandex Click IDhttp://ru.wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/страниц в минутуPKL\===4wp-fastest-cache/languages/wp-fastest-cache-id_ID.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Indonesian # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2021-01-26 07:03:23+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: id\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "" #: templates/preload.php:150 msgid "Sitemaps" msgstr "" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "" #: templates/preload.php:86 msgid "Content Types" msgstr "" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "" #: templates/preload.php:72 msgid "Choose a Method" msgstr "" #: templates/preload.php:56 msgid "Preload Settings" msgstr "" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Simpan" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Batalkan" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Pengaturan toolbar" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Hapus Cache dari Semua Situs" #: wpFastestCache.php:439 msgid "Settings" msgstr "Pengaturan" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Hapus Cache" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Hilangkan sumber daya JavaScript yang memblokir perenderan" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Pilihan telah disimpan" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "memiliki Item Woocommerce di Keranjang" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "memiliki Parameter Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Arsip" #: templates/timeout.php:189 msgid "Server Time" msgstr "Waktu server" #: templates/timeout.php:169 msgid "delete the files" msgstr "hapus berkas" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Mengandung" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Adalah sama dengan" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Dimulai Dengan" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Halaman Beranda" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Semua" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Kecualikan Panduan Halaman" #: templates/timeout.php:124 msgid "Then" msgstr "Kemudian" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Jika REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Panduan Batas waktu Cache" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Pengaturan Lazy Load" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Aktifkan Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Mohon perbarui" #: templates/update_success.php:9 msgid "Success" msgstr "Sukses" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Peringatan" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Tambahkan Aturan Baru" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Hanya tersedia dalam versi Premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Pilih satu" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Semua berkas cache juga akan dihapus" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Jika Anda memodifikasi berkas css apa pun, Anda harus menghapus berkas css yang diperkecil" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Folder target" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Anda dapat menghapus semua berkas cache" #: inc/admin.php:1090 msgid "Exclude" msgstr "Kecualikan" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimasi Gambar" #: inc/admin.php:1082 msgid "Settings" msgstr "Pengaturan" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Pembersihan Basis data" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Pengaturan CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Kecualikan JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Kecualikan CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Kecualikan kuki" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Kecualikan Agen-Pengguna" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Kecualikan Halaman" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Alat Optimasi Gambar" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Aturan Batas waktu" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Statistik Cache" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Hapus Cache Artikel / Halaman" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Apa yang Anda inginkan terjadi setelah memperbarui artikel atau halaman?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Hapus Cache Paginasi" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Hapus Cache dari Tag Artikel" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Hapus Cache dari Kategori Artikel" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Hapus Semua Cache" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Apa yang Anda inginkan terjadi setelah memublikasikan artikel baru?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "baik" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Mulai Ulang Setelah Selesai" #: templates/preload.php:210 msgid "pages per minute" msgstr "halaman per menit" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Taksonomi khusus" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Tipe Artikel Khusus" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Lampiran" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Tag" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Laman" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Kategori" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Artikel" #: templates/preload.php:102 msgid "Homepage" msgstr "Beranda" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Kurangi permintaan HTTP dengan menggabungkan berkas JS" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Muat gambar dan iframe saat mereka memasuki area pandang browser" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Muat Google Fonts secara asinkron" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google Fonts" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Render Blocking Js" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Anda dapat menghapus emoji inline css dan wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Nonaktifkan Emoji" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Kurangi waktu pemuatan halaman untuk pengunjung berulang" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Caching Browser" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Kurangi ukuran berkas yang dikirim dari server Anda" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Gabungkan Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Gabungkan Js" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Anda dapat memperkecil ukuran berkas js" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Perkecil Js" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Kurangi permintaan HTTP dengan menggabungkan berkas CSS" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Gabungkan CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Memperkecil CSS dengan lebih kuat" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Perkecil CSS Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Anda dapat memperkecil ukuran berkas css" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Perkecil CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Memperkecil HTML dengan lebih kuat" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Perkecil HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Anda dapat memperkecil ukuran halaman" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Perkecil HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Hapus berkas cache saat artikel atau halaman diperbarui" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Perbarui Artikel" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Hapus berkas cache ketika artikel atau halaman dipublikasikan" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Artikel Baru" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Buat cache untuk tema ponsel" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Tema Ponsel" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Jangan tampilkan versi cache untuk desktop ke perangkat ponsel" #: inc/admin.php:1195 msgid "Mobile" msgstr "Ponsel" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Jangan tampilkan versi cache untuk pengguna yang login" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Pengguna yang login" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Buat cache dari semua situs secara otomatis" #: inc/admin.php:1157 msgid "Preload" msgstr "Pramuat" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Kurangi jumlah query SQL" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Cache Widget" #: inc/admin.php:1119 msgid "Enable" msgstr "Aktifkan" #: inc/admin.php:1118 msgid "Cache System" msgstr "Sistem Cache" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Setiap 15 Hari Sekali" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Setiap 7 Hari Sekali" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Setiap 3 Hari Sekali" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Setiap 10 Jam Sekali" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Setiap 9 Jam Sekali" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Setiap 8 Jam Sekali" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Setiap 7 Jam Sekali" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Setiap 5 Jam Sekali" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Setiap 4 Jam Sekali" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Setiap 3 Jam Sekali" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Setiap 2 Jam Sekali" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Setiap 10 Hari Sekali" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Sistem WP Cache paling sederhana dan tercepat" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "https://id.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Sekali Setahun" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Sekali Sebulan" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Sekali Sehari" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Setiap 6 Jam Sekali" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Sekali Sejam" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Dua Kali Sejam" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Setiap 15 Menit Sekali" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Setiap 5 Menit Sekali" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Setiap 1 Menit Sekali"PKL\" Ԡ??4wp-fastest-cache/languages/wp-fastest-cache-es_MX.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Spanish (Mexico) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2020-07-16 15:22:30+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: es_MX\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "" #: templates/preload.php:150 msgid "Sitemaps" msgstr "" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "" #: templates/preload.php:86 msgid "Content Types" msgstr "" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "" #: templates/preload.php:72 msgid "Choose a Method" msgstr "" #: templates/preload.php:56 msgid "Preload Settings" msgstr "" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Guardar" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Cancelar" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Ajustes de la barra de herramientas" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Vaciar la caché de todos los sitios" #: wpFastestCache.php:439 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Borrar caché" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Eliminar los recursos JavaScript que bloquean los procesos" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Las opciones han sido guardadas" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "tiene artículos de WooCommerce en el carrito" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "tiene parámetros de Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archivos" #: templates/timeout.php:189 msgid "Server Time" msgstr "Hora del servidor" #: templates/timeout.php:169 msgid "delete the files" msgstr "borrar los archivos" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Contiene" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Es igual a" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Comienza con" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Página de inicio" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Todo" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Asistente para excluir páginas" #: templates/timeout.php:124 msgid "Then" msgstr "Entonces" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Si REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Asistente del tiempo límite de la caché" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Asistente de carga diferida" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Activar Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Por favor, actualiza" #: templates/update_success.php:9 msgid "Success" msgstr "Correcto" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Advertencia" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Añadir una nueva regla" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Solo disponible en la versión premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Elige uno" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "También se eliminarán todos los archivos de la caché" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Si modificas cualquier archivo CSS, tienes que borrar los archivos CSS minimizados" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Carpeta de destino" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Puedes borrar todos los archivos de la caché" #: inc/admin.php:1090 msgid "Exclude" msgstr "Excluir" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimización de imágenes" #: inc/admin.php:1082 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Limpieza de la base de datos" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Ajustes de la CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Excluir JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Excluir CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Excluir cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Excluir agentes de usuario" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Excluir páginas" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Herramienta de optimización de imágenes" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Reglas de límite" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Estadísticas de la caché" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Vaciar la caché de entradas / páginas" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "¿Qué quieres que ocurra después de actualizar una entrada o una página?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Vaciar la caché de paginación" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Vaciar la caché de etiquetas de entradas" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Vaciar la caché de categorías de entradas" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Vaciar toda la caché" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "¿Qué quieres que ocurra después de publicar la nueva entrada?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "Aceptar" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Reiniciar después de completado" #: templates/preload.php:210 msgid "pages per minute" msgstr "páginas por minuto" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Taxonomías personalizadas" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Tipos de contenido personalizado" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Adjuntos" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Etiquetas" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Páginas" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categorías" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Entradas" #: templates/preload.php:102 msgid "Homepage" msgstr "Página de inicio" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Cargar las imágenes e iframes cuando entren en la visualización de los navegadores" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Cargar las fuentes de Google de forma asíncrona" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Fuentes de Google" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Bloqueo de procesado de JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Puedes eliminar los emojis CSS integrados y el archivo «wp-emoji-release.min.js»" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Desactivar los emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Reducir el tiempo de carga de la página para los visitantes repetitivos" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Caché del navegador" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Reducir el tamaño de los archivos enviados por tu servidor" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combine Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combinar JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Puedes reducir el tamaño de los archivos JS" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minimizar JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combinar CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Más potente minimización CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minify Css Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Puedes reducir el tamaño de los archivos CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minimizar CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Más potente minimización HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minify HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Puedes reducir el tamaño de la página" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minimizar HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Vaciar los archivos de la caché cuando se actualiza una entrada o página" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Actualizar la entrada" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Vaciar los archivos de la caché cuando se publica una entrada o página" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nueva entrada" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Crear la caché para el tema para móviles" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Tema para móviles" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "No mostrar la versión de escritorio de la caché en los dispositivos móviles" #: inc/admin.php:1195 msgid "Mobile" msgstr "Móvil" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "No mostrar la versión de la caché para usuarios conectados" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Usuarios conectados" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Crear automáticamente la caché de todo el sitio" #: inc/admin.php:1157 msgid "Preload" msgstr "Precargar" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Reducir el número de consultas SQL" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget de caché" #: inc/admin.php:1119 msgid "Enable" msgstr "Activar" #: inc/admin.php:1118 msgid "Cache System" msgstr "Sistema de caché" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Una vez cada 15 días" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Una vez cada 7 días" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Una vez cada 3 días" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Una vez cada 10 horas" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Una vez cada 9 horas" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Una vez cada 8 horas" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Una vez cada 7 horas" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Una vez cada 5 horas" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Una vez cada 4 horas" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Una vez cada 3 horas" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Una vez cada 2 horas" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Una vez cada 10 días" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "El sistema WP Cache más simple y rápido" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "https://es-mx.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Una vez al año" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Una vez al mes" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Una vez al día" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Una vez cada 6 horas" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Una vez a la hora" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Dos veces a la hora" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Una vez cada 15 minutos" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Una vez cada 5 minutos" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Una vez cada minuto"PKL\xNxN1wp-fastest-cache/languages/wp-fastest-cache-uk.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Ukrainian # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-12-29 17:45:13+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : ((n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) ? 1 : 2);\n" "X-Generator: GlotPress/4.0.1\n" "Language: uk_UA\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "Меню WP Fastest Cache на панелі інструментів адміністратора буде видимим для обраних нижче ролей користувачів." #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "Ролі користувачів" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "Необхідно додати принаймні одну карту сайту" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "Ви можете налаштувати розширені параметри в цьому розділі." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Розширені налаштування" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Ви можете вказати мапи, які будуть використовуватися для попереднього завантаження." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Карти сайту" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Ви можете вказати вміст, який буде використовуватися для попереднього завантаження, а також ви можете його сортувати." #: templates/preload.php:86 msgid "Content Types" msgstr "Типи вмісту" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "Ви можете вказати метод, який ви хочете використовувати для функції попереднього завантаження через цей розділ." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Оберіть метод" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Налаштування попереднього завантаження" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Деякі js джерела не будуть завантажені до тих пір, поки не буде прокручено або переміщено мишею" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Затримка Js" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "Параметри кешування WP Fastest Cache" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "має параметри Yandex Click ID" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Очищення конкретних сторінок" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Зберегти" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Скасувати" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Налаштування панелі інструментів" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Очистити кеш-пам’ять усіх сайтів" #: wpFastestCache.php:439 msgid "Settings" msgstr "Налаштування" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Очистити кеш" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Усунення блокуючих відображення JavaScript ресурсів" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Параметри були збережені" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "має товари Woocommerce у кошику" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "має параметри Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Архіви" #: templates/timeout.php:189 msgid "Server Time" msgstr "Час сервера" #: templates/timeout.php:169 msgid "delete the files" msgstr "видалити файли" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Містить" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Дорівнює" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Починається з" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Головна сторінка" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Все" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Майстер виключення сторінки" #: templates/timeout.php:124 msgid "Then" msgstr "Тоді" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Якщо REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Майстер тайм-ауту (час очікування) кешу" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Налаштування Lazy Load" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Увімкніть Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Будь ласка, оновіть" #: templates/update_success.php:9 msgid "Success" msgstr "Успіх" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Внимание!" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Додати нове правило" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "Очищення кешу та мінімізація CSS/JS" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Доступно лише у версії Premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Виберіть один" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Всі файли кешу також будуть видалені" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Якщо ви змінюєте будь-який файл CSS, вам потрібно видалити мініфіковані файли CSS" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Цільова папка" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Ви можете видалити всі файли кешу" #: inc/admin.php:1090 msgid "Exclude" msgstr "Вилучити" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Оптимізація зображень" #: inc/admin.php:1082 msgid "Settings" msgstr "Налаштування" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Очищення бази даних" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Налаштування CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Виключити JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Виключити CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Виключити файли cookie" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Виключити User-Agents" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Вилучені сторінки" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Інструмент оптимізації зображення" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Правила перерви" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Статистика кешу" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Очистити кеш запису / сторінки" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Що ви хочете, щоб сталося після оновлення запису або сторінки?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Очистити кеш розбивки на сторінки" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Очистити кеш позначок записів" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Очистити кеш категорій записів" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Очистити кеш домашньої сторінки" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Очистити весь кеш" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Що ви хочете, щоб сталося після опублікування нового запису?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Перезапустити після завершення" #: templates/preload.php:210 msgid "pages per minute" msgstr "сторінок на хвилину" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Користувальницька таксономія" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Користувацькі типи записів" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Вкладення" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Позначки" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Сторінки" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Категорії" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Записи" #: templates/preload.php:102 msgid "Homepage" msgstr "Домашня сторінка" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Зменшити кількість HTTP-запитів шляхом об'єднання js-файлів." #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Завантажуйте зображення та фрейми, коли вони потрапляють в область перегляду браузера" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Асинхронне завантаження шрифтів Google" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Шрифти Google" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Блокування відображення Js" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Ви можете видалити emoji inline css та wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Вимкнути Emoji" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Зменшити час завантаження сторінок для повторних відвідувачів" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Кеш браузера" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Зменште розмір файлів, які надсилаються з вашого сервера." #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Об'єднати Js Плюс" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Об'єднати Js" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Ви можете зменшити розмір js файлів" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Мініфікувати Js" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Зменшити кількість HTTP-запитів шляхом об'єднання файлів CSS." #: inc/admin.php:1291 msgid "Combine Css" msgstr "Об'єднати CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Більш потужне зжимання CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Мініфікувати Css Плюс" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Ви можете зменшити розмір файлів CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Мініфікувати Css" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Більш потужний зменшувач html" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Скорочення коду HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Ви можете зменшити розмір сторінки" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Мініфікувати HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Очищайте файли кешу під час оновлення публікації або сторінки" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Оновити запис" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Очистити файли кешу під час публікації запису або сторінки" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Новий запис" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Створити кеш для мобільної теми" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Мобільна тема" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Не показувати кешовану версію для настільних комп'ютерів на мобільних пристроях" #: inc/admin.php:1195 msgid "Mobile" msgstr "Мобільний" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Не показувати кешовану версію для користувачів, які ввійшли в систему" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Зареєстровані користувачі" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Створити кеш всього сайту автоматично" #: inc/admin.php:1157 msgid "Preload" msgstr "Попереднє завантаження" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Зменшіть кількість SQL-запитів" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Кеш віджетів" #: inc/admin.php:1119 msgid "Enable" msgstr "Увімкнути" #: inc/admin.php:1118 msgid "Cache System" msgstr "Система кешу" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Раз на 15 днів" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Раз на 7 днів" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Раз на 3 дні" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Раз в кожні 10 годин" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Раз в кожні 9 годин" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Раз в кожні 8 годин" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Раз в кожні 7 годин" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Раз в кожні 5 годин" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Раз в кожні 4 години" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Раз в кожні 3 години" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Раз в кожні 2 години" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Раз в кожні 10 днів" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Найпростіша і найшвидка система WP Cache" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Раз в рік" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Раз в місяць" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Раз в день" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Раз в кожні 6 годин" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Раз годину" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Двічі в годину" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Раз в кожні 15 хвилин" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Раз в кожні 5 хвилин" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Раз в кожну хвилину"PKL\V2??4wp-fastest-cache/languages/wp-fastest-cache-es_VE.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Spanish (Venezuela) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2020-07-16 10:39:36+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: es_VE\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "" #: templates/preload.php:150 msgid "Sitemaps" msgstr "" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "" #: templates/preload.php:86 msgid "Content Types" msgstr "" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "" #: templates/preload.php:72 msgid "Choose a Method" msgstr "" #: templates/preload.php:56 msgid "Preload Settings" msgstr "" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Guardar" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Cancelar" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Ajustes de la barra de herramientas" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Vaciar la caché de todos los sitios" #: wpFastestCache.php:439 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Borrar caché" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Eliminar los recursos JavaScript que bloquean los procesos" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Las opciones han sido guardadas" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "tiene artículos de WooCommerce en el carrito" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "tiene parámetros de Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archivos" #: templates/timeout.php:189 msgid "Server Time" msgstr "Hora del servidor" #: templates/timeout.php:169 msgid "delete the files" msgstr "borrar los archivos" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Contiene" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Es igual a" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Comienza con" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Página de inicio" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Todo" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Asistente para excluir páginas" #: templates/timeout.php:124 msgid "Then" msgstr "Entonces" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Si REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Asistente del tiempo límite de la caché" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Asistente de carga diferida" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Activar Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Por favor, actualiza" #: templates/update_success.php:9 msgid "Success" msgstr "Correcto" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Advertencia" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Añadir una nueva regla" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Solo disponible en la versión premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Elige uno" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "También se eliminarán todos los archivos de la caché" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Si modificas cualquier archivo CSS, tienes que borrar los archivos CSS minimizados" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Carpeta de destino" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Puedes borrar todos los archivos de la caché" #: inc/admin.php:1090 msgid "Exclude" msgstr "Excluir" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimización de imágenes" #: inc/admin.php:1082 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Limpieza de la base de datos" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Ajustes de la CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Excluir JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Excluir CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Excluir cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Excluir agentes de usuario" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Excluir páginas" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Herramienta de optimización de imágenes" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Reglas de límite" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Estadísticas de la caché" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Vaciar la caché de entradas / páginas" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "¿Qué quieres que ocurra después de actualizar una entrada o una página?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Vaciar la caché de paginación" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Vaciar la caché de etiquetas de entradas" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Vaciar la caché de categorías de entradas" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Vaciar toda la caché" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "¿Qué quieres que ocurra después de publicar la nueva entrada?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "Aceptar" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Reiniciar después de completado" #: templates/preload.php:210 msgid "pages per minute" msgstr "páginas por minuto" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Taxonomías personalizadas" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Tipos de contenido personalizado" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Adjuntos" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Etiquetas" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Páginas" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categorías" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Entradas" #: templates/preload.php:102 msgid "Homepage" msgstr "Página de inicio" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Cargar las imágenes e iframes cuando entren en la visualización de los navegadores" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Cargar las fuentes de Google de forma asíncrona" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Fuentes de Google" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Bloqueo de procesado de JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Puedes eliminar los emojis CSS integrados y el archivo «wp-emoji-release.min.js»" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Desactivar los emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Reducir el tiempo de carga de la página para los visitantes repetitivos" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Caché del navegador" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Reducir el tamaño de los archivos enviados por tu servidor" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combine Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combinar JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Puedes reducir el tamaño de los archivos JS" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minimizar JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combinar CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Más potente minimización CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minify Css Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Puedes reducir el tamaño de los archivos CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minimizar CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Más potente minimización HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minify HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Puedes reducir el tamaño de la página" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minimizar HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Vaciar los archivos de la caché cuando se actualiza una entrada o página" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Actualizar la entrada" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Vaciar los archivos de la caché cuando se publica una entrada o página" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nueva entrada" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Crear la caché para el tema para móviles" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Tema para móviles" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "No mostrar la versión de escritorio de la caché en los dispositivos móviles" #: inc/admin.php:1195 msgid "Mobile" msgstr "Móvil" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "No mostrar la versión de la caché para usuarios conectados" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Usuarios conectados" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Crear automáticamente la caché de todo el sitio" #: inc/admin.php:1157 msgid "Preload" msgstr "Precargar" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Reducir el número de consultas SQL" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget de caché" #: inc/admin.php:1119 msgid "Enable" msgstr "Activar" #: inc/admin.php:1118 msgid "Cache System" msgstr "Sistema de caché" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Una vez cada 15 días" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Una vez cada 7 días" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Una vez cada 3 días" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Una vez cada 10 horas" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Una vez cada 9 horas" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Una vez cada 8 horas" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Una vez cada 7 horas" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Una vez cada 5 horas" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Una vez cada 4 horas" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Una vez cada 3 horas" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Una vez cada 2 horas" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Una vez cada 10 días" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "El sistema WP Cache más simple y rápido" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://es.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Una vez al año" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Una vez al mes" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Una vez al día" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Una vez cada 6 horas" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Una vez a la hora" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Dos veces a la hora" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Una vez cada 15 minutos" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Una vez cada 5 minutos" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Una vez cada minuto"PKL\{n&&4wp-fastest-cache/languages/wp-fastest-cache-zh_TW.monu[    '  " . : J W h u       % ? Z y 2 0    % 5 > L .j      ; 1" .T       !*A9{  =  ' 7C T^ er(:M`s    !9Me ky/.* ".Cr F  `.(    +939m =&%!?a?3UTJ. <\m  0 " 2= P]pw ~  " :S-l-   $09j}60&/ V` gs z   d~2> 0; LX j t  .BUex  ' 4 'D l     / . 6,!c!-~!!9!!"""@" `"m"t"{"W"8"# ##0#@# P#]#m#~##%#%##E#&?$%f$'$$$B$8%cU%]% &$&.C&r&1&&&SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below.The simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostUser RolesWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-12-09 17:26:31+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Generator: GlotPress/4.0.1 Language: zh_TW Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) 設定新增規則進階設定全部這項操作會同時刪除全部快取檔案。彙整必須新增至少一個 Sitemap附件瀏覽器快取CDN 設定快取統計資料快取系統快取逾時精靈取消分類選取一項選取方法清除全部快取清除快取清除快取及已壓縮的 CSS/JS清除全部網站快取清除首頁快取清除內容頁次快取清除文章/頁面快取清除文章分類快取清除文章標籤快取發佈文章或頁面後便清除快取檔案更新文章或頁面後便清除快取檔案清除指定頁面CSS 合併JS 合併JS 進階合併包含內容類型為行動版佈景主題建立快取為這個網站的全部項目自動建立快取自訂內容類型自訂分類法清理資料庫延遲載入 JS停用 Emoji 表情符號在行動裝置上不顯示已快取的桌面版內容不在使用者登入後顯示已快取的內容清除禁止轉譯的 JavaScrpt 資源Emre Vona啟用啟用 Gzip排除排除 CSS排除 Cookie排除 JS排除頁面精靈排除頁面排除使用者代理程式Google Fonts 網頁字型Gzip首頁首頁如果 REQUEST_URI如果對任何 CSS 檔案進行修改,修改完畢後必須刪除之前已壓縮的 CSS 檔案。圖片最佳化等於延遲載入設定以非同步方式載入 Google Fonts 網頁字型當圖片及 iFrame 進入瀏覽器檢視區內才進行載入已登入的使用者CSS 壓縮CSS 進階壓縮HTML 壓縮HTML 進階壓縮JS 壓縮行動裝置行動版佈景主題更多 CSS 進階壓縮功能更多 HTML 進階壓縮功能新增內容確定每分鐘一次每 10 日一次每 10 小時一次每 15 日一次每 15 分鐘一次每 2 小時一次每 3 日一次每 3 小時一次每 4 小時一次每 5 小時一次每 5 分鐘一次每 6 小時一次每 7 日一次每 7 小時一次每 8 小時一次每 9 小時一次每日一次每月一次每年一次每小時一次這項功能僅於 Premium 版中提供圖片最佳化工具設定已儲存。頁面請更新文章預先載入預先載入設定合併 CSS 檔案可以減少 HTTP 要求次數合併 JS 檔案可以減少 HTTP 要求次數這項功能可降低回訪訪客的頁面載入時間減少 SQL 查詢的次數減少從網站伺服器傳送的檔案大小禁止轉譯的 JS快取建立完畢後自動重新啟動預先載入程序儲存伺服器時間設定Sitemap讓某些 JS 程式碼在畫面捲動或移動游標後才載入開頭含有成功標籤目標資料夾在下方選取的使用者角色能看到 WP Fastest Cache 在工具列上的選單。最易於使用、最快速的 WordPress 快取外掛。然後逾時規則工具列設定每小時兩次更新內容使用者角色WP Fastest CacheWP Fastest Cache 設定警告發佈內容後的快取處理方式:更新內容後的快取處理方式:小工具快取在這個對話方塊中,網站管理員可以自訂進階設定。這項功能可減少 CSS 檔案大小這項功能可減少 JS 檔案大小這項功能可減少頁面檔案大小這項操作會刪除全部快取。這項功能可移除 Emoji 內嵌 CSS 及 wp-emoji-release.min.js網站管理員可以指定要預先載入的 Sitemap。網站管理員可以指定要預先載入的內容,同時也可以對這些內容進行排序。在這個對話方塊中,網站管理員可以指定要使用的預先載入功能方法。刪除檔案包含 Google Analytics 參數包含購物車中的 Woocommerce 商品資料包含 Yandex Click ID 參數http://tw.wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/頁處理頁數/分鐘PKL\Ubu>u>4wp-fastest-cache/languages/wp-fastest-cache-it_IT.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Italian # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2023-02-04 10:32:25+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: it\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "" #: templates/preload.php:150 msgid "Sitemaps" msgstr "" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "" #: templates/preload.php:86 msgid "Content Types" msgstr "" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "" #: templates/preload.php:72 msgid "Choose a Method" msgstr "" #: templates/preload.php:56 msgid "Preload Settings" msgstr "" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Salva" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Annulla" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Impostazioni barra degli strumenti" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Svuota cache di tutti i siti" #: wpFastestCache.php:439 msgid "Settings" msgstr "Impostazioni" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Svuota cache" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Elimina le risorse JavaScript che bloccano il rendering" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Le opzioni sono state salvate" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "ha articoli Woocommerce nel carrello" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "ha parametri di Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archivi" #: templates/timeout.php:189 msgid "Server Time" msgstr "Ora del server" #: templates/timeout.php:169 msgid "delete the files" msgstr "elimina i file" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Contiene" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "è uguale a" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Inizia con" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Homepage" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Tutti" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Procedura guidata di esclusione pagina" #: templates/timeout.php:124 msgid "Then" msgstr "Allora" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Se REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Procedura guidata timeout cache" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Impostazioni lazy load" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Abilita Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Aggiorna" #: templates/update_success.php:9 msgid "Success" msgstr "Completato" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Attenzione" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Aggiungi nuova regola" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Disponibile solo nella versione Premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Scegli uno" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Verranno rimossi anche tutti i file di cache" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Se modifichi un file CSS, devi eliminare i file dei CSS minificati" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Cartella di destinazione" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Puoi eliminare tutti i file della cache" #: inc/admin.php:1090 msgid "Exclude" msgstr "Escludi" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Ottimizzazione immagini" #: inc/admin.php:1082 msgid "Settings" msgstr "Impostazioni" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Pulizia del database" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Impostazioni CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Escludi JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Escludi CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Escludi i cookie" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Escludi gli user agent" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Escludi pagine" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Strumento di ottimizzazione immagini" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Regole di timeout" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Statistiche della cache" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Cancella la cache di articoli/pagine" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Cosa vuoi che accada dopo l'aggiornamento di un articolo o di una pagina?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Cancella cache della paginazione" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Cancella cache dei tag" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Cancella cache delle categorie" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Cancella tutta la cache" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Cosa vuoi che accada dopo aver pubblicato il nuovo articolo?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Riavvia al completamento" #: templates/preload.php:210 msgid "pages per minute" msgstr "pagine al minuto" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Tassonomie personalizzate" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Tipi di contenuto personalizzati" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Allegati" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Tag" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Pagine" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categorie" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Articoli" #: templates/preload.php:102 msgid "Homepage" msgstr "Homepage" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Riduci le richieste HTTP attraverso file Js combinati" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Carica immagini e iframe quando vengono visualizzati nel browser" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Carica Google Fonts in modo asincrono" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google Fonts" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Js che bloccano il rendering" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Puoi rimuovere gli inline CSS degli emoji e wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Disabilita emoji" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Riduce i tempi di caricamento della pagina per visitatori abituali" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Memorizzazione nella cache del browser" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Riduce la dimensione dei file inviati dal tuo server" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combina Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combina Js" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Puoi ridurre la dimensione dei file Js" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minifica JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Riduce le richieste HTTP attraverso file CSS combinati" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combina CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Minificazione CSS più potente" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minifica CSS Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Puoi ridurre la dimensione dei file CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minifica CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Minificazione HTML più potente" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minifica HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Puoi ridurre la dimensione della pagina" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minifica HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Svuota la cache quando un articolo o una pagina vengono aggiornati" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Aggiorna articolo" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Svuota la cache quando un articolo o una pagina vengono pubblicati" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nuovo articolo" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Crea la cache per il tema mobile" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Tema mobile" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Non mostrare la versione cache per desktop su dispositivi mobili" #: inc/admin.php:1195 msgid "Mobile" msgstr "Dispositivi mobili" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Non mostrare la versione in cache agli utenti connessi" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Utenti connessi" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Crea la cache di tutto il sito automaticamente" #: inc/admin.php:1157 msgid "Preload" msgstr "Precaricamento" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Riduci il numero di query SQL" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Cache dei widget" #: inc/admin.php:1119 msgid "Enable" msgstr "Attiva" #: inc/admin.php:1118 msgid "Cache System" msgstr "Sistema di cache" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Ogni 15 giorni" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Ogni 7 giorni" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Una volta ogni 3 giorni" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Una volta ogni 10 ore" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Una volta ogni 9 ore" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Una volta ogni 8 ore" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Una volta ogni 7 ore" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Una volta ogni 5 ore" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Una volta ogni 4 ore" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Una volta ogni 3 ore" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Una volta ogni 2 ore" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Una volta ogni 10 giorni" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Il più semplice e veloce sistema Cache WP" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Una volta all'anno" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Una volta al mese" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Una volta al giorno" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Una volta ogni 6 ore" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Una volta all'ora" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Due volte all'ora" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Una volta ogni 15 minuti" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Una volta ogni 5 minuti" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Una volta al minuto"PKL\ڔAA4wp-fastest-cache/languages/wp-fastest-cache-nl_BE.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Dutch (Belgium) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-12-11 13:40:40+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: nl_BE\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "Het menu WP Fastest Cache op de beheerder werkbalk zal hieronder zichtbaar zijn voor de geselecteerde gebruikersrollen." #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "Gebruikersrollen" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "Er moet minstens één sitemap worden toegevoegd" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "In deze sectie kan je de geavanceerde instellingen aanpassen." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Geavanceerde instellingen" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Je kan sitemaps opgeven die moeten worden gebruikt voor het vooraf laden." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Sitemaps" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Je kan de inhoud opgeven die moet worden gebruikt voor het voor laden en je kan ze ook sorteren." #: templates/preload.php:86 msgid "Content Types" msgstr "Inhoud types" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "In deze sectie kan je de methode opgeven die je wil dat de voorlaad functie gebruikt." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Kies een methode" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Vooraf laden instellingen" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Sommige js-bronnen worden pas geladen wanneer er wordt gescrold of de muis wordt bewogen" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Vertraag Js" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "WP Fastest Cache opties" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "heeft Yandex Click ID parameters" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Specifieke pagina's wissen" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Opslaan" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Annuleren" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Werkbalk instellingen" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Cache van alle websites wissen" #: wpFastestCache.php:439 msgid "Settings" msgstr "Instellingen" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Cache wissen" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Elimineer render blokkering javascript bronnen" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Opties zijn opgeslagen" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "heeft Woocommerce artikelen in winkelwagentje" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "heeft Google Analytics parameters" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archieven" #: templates/timeout.php:189 msgid "Server Time" msgstr "Server tijd" #: templates/timeout.php:169 msgid "delete the files" msgstr "verwijder geselecteerde bestanden" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Bevat" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Is gelijk aan" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Begint met" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Homepage" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Alles" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Uitsluiten pagina wizard" #: templates/timeout.php:124 msgid "Then" msgstr "Dan" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Als REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Cache timeout wizard" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Instellingen voor lazy load" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Gzip inschakelen" #: templates/update_now.php:9 msgid "Please Update" msgstr "Bijwerken" #: templates/update_success.php:9 msgid "Success" msgstr "Gelukt" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Waarschuwing" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Nieuwe regel toevoegen" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "Cache en minified CSS/JS leegmaken" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Alleen beschikbaar in Premium versie" #: templates/timeout.php:141 msgid "Choose One" msgstr "Kies er een" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Alle cachebestanden worden ook verwijderd" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Als je een css bestand wijzigt, moet je minified css bestanden verwijderen" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Doelmap" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Je kan alle cachebestanden verwijderen" #: inc/admin.php:1090 msgid "Exclude" msgstr "Uitsluiten" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Afbeeldingoptimalisatie" #: inc/admin.php:1082 msgid "Settings" msgstr "Instellingen" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Database opschoning" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN instellingen" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "JS uitsluiten" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "CSS uitsluiten" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Cookies uitsluiten" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Uitsluiten gebruikers-agents" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Pagina's uitsluiten" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Optimaliseer afbeelding tool" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Time-out regels" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Cache statistieken" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Cache van bericht / pagina wissen" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Wat wil je dat er gebeurt na het bijwerken van een bericht of een pagina?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Cache van paginatie wissen" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Cache van bericht tags wissen" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Cache van bericht categorieën wissen" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Cache van homepage wissen" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Alle cache wissen" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Wat wil je dat er gebeurt na het publiceren van het nieuwe bericht?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Opnieuw starten nadat deze is voltooid" #: templates/preload.php:210 msgid "pages per minute" msgstr "pagina's per minuut" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Aangepaste taxonomieën" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Aangepaste berichttypes" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Bijlagen" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Tags" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Pagina's" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categorieën" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Berichten" #: templates/preload.php:102 msgid "Homepage" msgstr "Homepage" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "HTTP aanvragen verminderen via gecombineerde js-bestanden" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Afbeeldingen en iframes laden wanneer ze de viewport van de browsers betreden" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Google Fonts asynchroon laden" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google Fonts" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Render blokkeren Js" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Je kan de emoji inline css en wp-emoji-release.min.js verwijderen" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Emojis uitschakelen" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Laadtijden van pagina's voor terugkerende bezoekers verminderen" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Browser caching" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "De grootte van bestanden die vanaf je server worden verzonden, verkleinen" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combineer Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combineer Js" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Je kan de grootte van js bestanden verkleinen" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minify Js" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "HTTP aanvragen verminderen via gecombineerde css bestanden" #: inc/admin.php:1291 msgid "Combine Css" msgstr "CSS samenvoegen" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Krachtiger minify CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minify CSS Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Je kunt de grootte van css-bestanden verkleinen" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minify CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Krachtiger minify html" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minify HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Je kan de grootte van de pagina verkleinen" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minify HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Cache bestanden wissen wanneer een bericht of pagina wordt bijgewerkt" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Bericht bijwerken" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Cache bestanden wissen wanneer een bericht of pagina wordt gepubliceerd" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nieuw bericht" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Cache maken voor mobiel thema" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Mobiel thema" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "De versie in de cache voor desktop niet tonen op mobiele apparaten" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobiel" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "De versie in de cache voor ingelogde gebruikers niet tonen" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Ingelogde gebruikers" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "De cache van de hele website automatisch maken" #: inc/admin.php:1157 msgid "Preload" msgstr "Vooraf laden" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Het aantal SQL query's verminderen" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget cache" #: inc/admin.php:1119 msgid "Enable" msgstr "Inschakelen" #: inc/admin.php:1118 msgid "Cache System" msgstr "Cache systeem" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Eenmaal per 15 dagen" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Eenmaal per 7 dagen" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Eenmaal per 3 dagen" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Eenmaal per 10 uur" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Eenmaal per 9 uur" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Eenmaal per 8 uur" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Eenmaal per 7 uur" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Eenmaal per 5 uur" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Eenmaal per 4 uur" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Eenmaal per 3 uur" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Eenmaal per 2 uur" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Eenmaal per 10 dagen" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Het eenvoudigste en snelste WP cache systeem" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Eenmaal per jaar" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Eenmaal per maand" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Eenmaal per dag" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Eenmaal per 6 uur" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Eenmaal per uur" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Tweemaal per uur" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Eenmaal per 15 minuten" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Een keer per 5 minuten" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Eenmaal per minuut"PKL\ҠLL4wp-fastest-cache/languages/wp-fastest-cache-ru_RU.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Russian # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2023-09-11 06:04:10+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : ((n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) ? 1 : 2);\n" "X-Generator: GlotPress/4.0.1\n" "Language: ru\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "Необходимо добавить хотя бы одну карту сайта" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "Вы можете настроить расширенные настройки через этот раздел." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Расширенные настройки" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Вы можете указать карты сайта, которые будут использоваться для предварительной загрузки." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Карты сайта" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Вы можете указать содержимое, которое будет использоваться для предварительной загрузки, а также отсортировать его." #: templates/preload.php:86 msgid "Content Types" msgstr "Типы содержимого" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "Вы можете указать метод, который вы хотите использовать для функции предварительной загрузки через этот раздел." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Выберите метод." #: templates/preload.php:56 msgid "Preload Settings" msgstr "Настройки анимации загрузки" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Некоторые исходные файлы js не будут загружены до прокрутки или перемещения мыши" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Задержка Js" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "Параметры WP Fastest Cache" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "имеет параметры Yandex Click ID" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Очистка определённых страниц" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Сохранить" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Отмена" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Настройки панели инструментов" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Очистить кеш всех сайтов" #: wpFastestCache.php:439 msgid "Settings" msgstr "Настройки" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Очистить кэш" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Устранение ресурсов JavaScript, блокирующих рендеринг" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Параметры сохранены" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "есть товары Woocommerce в корзине" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "имеет параметры Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Архивы" #: templates/timeout.php:189 msgid "Server Time" msgstr "Серверное время" #: templates/timeout.php:169 msgid "delete the files" msgstr "удалить файлы" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Содержит" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Равно" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Начинается с" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Главная страница" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Все" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Мастер исключения страниц" #: templates/timeout.php:124 msgid "Then" msgstr "Тогда" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Если REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Мастер тайм-аута (время ожидания) кэша" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Настройки отложенной загрузки" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Включить GZIP" #: templates/update_now.php:9 msgid "Please Update" msgstr "Пожалуйста, обновите" #: templates/update_success.php:9 msgid "Success" msgstr "Успех" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Предупреждение" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Добавить новое правило" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Доступно только в версии Premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Выбрать один" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Все файлы кэша также будут удалены" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "При изменении какого-либо CSS-файла, необходимо удалить минифицированные CSS-файлы" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Целевая папка" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Можно удалить все файлы кэша" #: inc/admin.php:1090 msgid "Exclude" msgstr "Исключить" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Оптимизация изображения" #: inc/admin.php:1082 msgid "Settings" msgstr "Настройки" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Очистка базы данных" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Настройки CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Исключить JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Исключить CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Исключить файлы cookie" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Исключить агентов-пользователей" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Исключить страницы" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Инструмент оптимизации изображений" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Правила тайм-аута (время ожидания)" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Статистика кеширования" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Очистить кэш записи/страницы" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Что вы хотите, чтобы произошло после обновления записи или страницы?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Очистить кеш разбивки на страницы" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Очистить кеш тегов записи" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Очистить кэш рубрики записи" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Очистить весь кэш" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Что вы хотите, чтобы произошло после публикации новой записи?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "ОК" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Перезагрузить после завершения" #: templates/preload.php:210 msgid "pages per minute" msgstr "страниц в минуту" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Пользовательские таксономии" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Пользовательские типы записей" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Вложения" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Теги" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Страницы" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Рубрики" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Записи" #: templates/preload.php:102 msgid "Homepage" msgstr "Главная страница" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Сокращение запросов HTTP с помощью объединения JS-файлов" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Загружать изображения и iframe, когда они попадают в область просмотра браузера" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Асинхронная загрузка шрифтов Google" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Шрифты Google" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "JS-файлы, блокирующие рендеринг" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Вы можете удалить встроенные CSS смайлики (emoji) и wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Отключить Emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Сокращение времени загрузки страниц для повторных посетителей" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Кэш браузера" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Сокращение размер файлов, отправляемых с вашего сервера" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Объединить JS Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Объединить JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Вы можете уменьшить размер JS-файлов" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Минификация JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Сокращение запросов HTTP с помощью объединения CSS-файлов" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Объединить CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Более мощная минификация CSS-файлов" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Минификация CSS Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Вы можете уменьшить размер CSS-файлов" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Минификация CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Более мощная минификация HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Минификация HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Вы можете уменьшить размер страницы" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Минификация HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Очистить файлы кэша при обновлении записи или страницы" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Обновить запись" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Очистить файлы кеша при публикации записи или страницы" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Новая запись" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Создание кэша для темы мобильных устройств" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Мобильная тема" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Не показывать кешированную версию для ПК на мобильных устройствах" #: inc/admin.php:1195 msgid "Mobile" msgstr "Мобильный" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Не показывать кешированную версию для авторизованных пользователей" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Зарегистрированные пользователи" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Автоматическое создание кэша для всего сайта" #: inc/admin.php:1157 msgid "Preload" msgstr "Предварительная загрузка" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Сокращение количества SQL-запросов" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Кэш виджетов" #: inc/admin.php:1119 msgid "Enable" msgstr "Включить" #: inc/admin.php:1118 msgid "Cache System" msgstr "Система кэширования" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Один раз в 15 дней" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Каждые 7 дней" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Раз в 3 дня" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Каждые 10 часов" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Каждые 9 часов" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Каждые 8 часов" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Каждые 7 часов" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Каждые 5 часов" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Каждые 4 часа" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Каждые 3 часа" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Каждые 2 часа" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Раз в 10 суток" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Простой и быстрый кэш для WordPress" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://ru.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Раз в год" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Раз в месяц" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Раз в сутки" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Каждые 6 часов" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Раз в час" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Раз в полчаса" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Каждые 15 минут" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Каждые 5 минут" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Каждую минуту"PKL\iu{"{"4wp-fastest-cache/languages/wp-fastest-cache-es_MX.monu[<\\] w'      ' 2 B N g    2 0 8 D O _ h .     ; 15 .g       % * 4 = AL   =  / : J V g q x         (;M`s    !*L`x ~/.* $.Et   (   - ;GX9`9 &%!.P?o.- >_x7!)3] f r| $'+ )9HcJ   *)1T N<D:     *;VhmR 05Tf  !4S s !6K`w&!)Hr <<H=#; "*< DQ Zd)w#  @' Kh  - , ' !-H!Rv!!%!-"51"g"SettingsAdd New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CssCombine JsCombine Js PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsdelete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/pages per minutePO-Revision-Date: 2020-07-16 15:22:30+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: es_MX Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) AjustesAñadir una nueva reglaTodoTambién se eliminarán todos los archivos de la cachéArchivosAdjuntosCaché del navegadorAjustes de la CDNEstadísticas de la cachéSistema de cachéAsistente del tiempo límite de la cachéCancelarCategoríasElige unoVaciar toda la cachéBorrar cachéVaciar la caché de todos los sitiosVaciar la caché de paginaciónVaciar la caché de entradas / páginasVaciar la caché de categorías de entradasVaciar la caché de etiquetas de entradasVaciar los archivos de la caché cuando se publica una entrada o páginaVaciar los archivos de la caché cuando se actualiza una entrada o páginaCombinar CSSCombinar JSCombine Js PlusContieneCrear la caché para el tema para móvilesCrear automáticamente la caché de todo el sitioTipos de contenido personalizadoTaxonomías personalizadasLimpieza de la base de datosDesactivar los emojisNo mostrar la versión de escritorio de la caché en los dispositivos móvilesNo mostrar la versión de la caché para usuarios conectadosEliminar los recursos JavaScript que bloquean los procesosEmre VonaActivarActivar GzipExcluirExcluir CSSExcluir cookiesExcluir JSAsistente para excluir páginasExcluir páginasExcluir agentes de usuarioFuentes de GoogleGzipPágina de inicioPágina de inicioSi REQUEST_URISi modificas cualquier archivo CSS, tienes que borrar los archivos CSS minimizadosOptimización de imágenesEs igual aAsistente de carga diferidaCargar las fuentes de Google de forma asíncronaCargar las imágenes e iframes cuando entren en la visualización de los navegadoresUsuarios conectadosMinimizar CSSMinify Css PlusMinimizar HTMLMinify HTML PlusMinimizar JSMóvilTema para móvilesMás potente minimización CSSMás potente minimización HTMLNueva entradaAceptarUna vez cada minutoUna vez cada 10 díasUna vez cada 10 horasUna vez cada 15 díasUna vez cada 15 minutosUna vez cada 2 horasUna vez cada 3 díasUna vez cada 3 horasUna vez cada 4 horasUna vez cada 5 horasUna vez cada 5 minutosUna vez cada 6 horasUna vez cada 7 díasUna vez cada 7 horasUna vez cada 8 horasUna vez cada 9 horasUna vez al díaUna vez al mesUna vez al añoUna vez a la horaSolo disponible en la versión premiumHerramienta de optimización de imágenesLas opciones han sido guardadasPáginasPor favor, actualizaEntradasPrecargarReducir las solicitudes HTTP mediante archivos JS combinadosReducir las solicitudes HTTP mediante archivos JS combinadosReducir el tiempo de carga de la página para los visitantes repetitivosReducir el número de consultas SQLReducir el tamaño de los archivos enviados por tu servidorBloqueo de procesado de JSReiniciar después de completadoGuardarHora del servidorAjustesComienza conCorrectoEtiquetasCarpeta de destinoEl sistema WP Cache más simple y rápidoEntoncesReglas de límiteAjustes de la barra de herramientasDos veces a la horaActualizar la entradaWP Fastest CacheAdvertencia¿Qué quieres que ocurra después de publicar la nueva entrada?¿Qué quieres que ocurra después de actualizar una entrada o una página?Widget de cachéPuedes reducir el tamaño de los archivos CSSPuedes reducir el tamaño de los archivos JSPuedes reducir el tamaño de la páginaPuedes borrar todos los archivos de la cachéPuedes eliminar los emojis CSS integrados y el archivo «wp-emoji-release.min.js»borrar los archivostiene parámetros de Google Analyticstiene artículos de WooCommerce en el carritohttps://es-mx.wordpress.org/plugins/wp-fastest-cache/páginas por minutoPKL\>Aܢ-+-+4wp-fastest-cache/languages/wp-fastest-cache-fr_FR.monu[    '  " . : J W h u       % ? Z y 2 0    % 5 > L .j      ; 1" .T       !*A9{  =  ' 7C T^ er(:M`s    !9Me ky/.* ".Cr F  `.(    +939m =&%!?a?3UTJ. <\m7+FV gu! & F%g--P&Qw!$-.>0m$ M(Iv>   $4HWwPB Z&g8[# = O f y    * * !$!'!:!L!a!s!!!!!!!!"$"8"L"`"r"""-""#"## 3#@#Q#<o#;#G#,0$<]$$$ $$ $ ${% %% % %%FC&& & &&&& '' :'XH'^'(B("U(+x(((:(L)\f)|)@*"W*)z*(*.**+SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below.The simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostUser RolesWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2025-02-07 13:38:45+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Generator: GlotPress/4.0.1 Language: fr Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) RéglagesAjouter une nouvelle règleRéglages avancésTousTous les fichiers de cache seront également supprimésArchivesAu moins un plan de site doit être ajoutéFichiers jointsCache navigateurRéglages CDNStatistiques de cacheSystème de cacheAssistant d’expiration du cacheAnnulerCatégoriesChoisissez-en unChoisir une méthodeNettoyer tout le cacheVider le cacheVider le cache et les CSS/JS minifiésVider le cache de tous les sitesVider le cache de la page d’accueilVider le cache de paginationVider le cache d’article/pageVider le cache des catégories de publicationVider le cache des étiquettes de publicationVide les fichiers de cache lors de la publication d’un article ou d’une pageVide les fichiers de cache lors de la mise à jour d’un article ou d’une pageVider le cache de certaines pagesCombiner le CSS Combiner le JS Combiner le JS Plus ContientTypes de contenuCrée un cache pour le thème mobile (Premium)Crée automatiquement le cache pour tout le siteTypes de publications personnalisésTaxonomies personnaliséesNettoyage de la base de donnéesTemporisation JSDésactiver les émojisN’affiche pas la version mise en cache pour les ordinateurs sur les mobilesN’affiche pas la version mise en cache pour les utilisateurs connectésÉlimine les ressources JavaScript bloquant le rendu (Premium)Emre VonaActifActiver GzipExclureExclure les CSSExclure les cookiesExclure les JSAssistant d’exclusion de pageExclure les pagesExclure les agents utilisateursPolices Google GzipPage d’accueilPage d’accueil si REQUEST_URISi vous modifiez un fichier CSS, vous devez supprimer les fichiers CSS minifiésOptimisation d’imagesEst égal àRéglages pour le chargement différéCharge les polices Google de façon asynchrone (Premium)Charge les images et les iframes quand ils entrent dans la fenêtre du navigateur (Premium)Utilisateurs connectés Minifier le CSS Minifier le CSS Plus Minifier le HTML Minifier le HTML Plus Minifier le JS MobileThème mobile Minification CSS plus puissante (Premium)Minification HTML plus puissante (Premium)Nouvelle publicationOKToutes les minutesTous les 10 joursToutes les 10 heuresTous les 15 joursToutes les 15 minutesToutes les 2 heuresTous les 3 joursToutes les 3 heuresToutes les 4 heuresToutes les 5 heuresToutes les 5 minutesToutes les 6 heuresTous les 7 joursToutes les 7 heuresToutes les 8 heuresToutes les 9 heuresUne fois par jourUne fois par moisUne fois par anToutes les heuresDisponible uniquement avec la version PremiumOutil optimisation d’imageLes options ont été enregistréesPagesVeuillez mettre à jourPublicationsPréchargement Réglages des préchargementsRéduit les requêtes HTTP grâce aux fichiers CSS combinésRéduit les requêtes HTTP grâce aux fichiers JS combinésRéduit les temps de chargement des pages pour les visiteurs réguliersRéduit le nombre de requêtes SQL (Premium)Réduit la taille des fichiers envoyés depuis votre serveurBlocage de rendu JS Redémarrer une fois terminéEnregistrerHeure du serveurRéglagesPlans de siteCertaines sources JS ne seront pas chargées tant que le défilement ou le déplacement de la souris n’aura pas eu lieu.Commence parSuccèsÉtiquettesDossier cibleLe menu WP Fastest Cache de la barre d’outils de l’administrateur sera visible pour les utilisateurs et utilisatrices sélectionnés ci-dessous.Le plus simple et le plus rapide des systèmes de cache pour WordPressAlorsRègles de délai d’expirationRéglages de la barre d’outilsDeux fois par heureMàj de publicationRôles des comptesWP Fastest CacheOptions de WP Fastest CacheAvertissementQue voulez-vous qu’il se passe après la mise en ligne d’une nouvelle publication ?Que voulez-vous qu’il se passe après la mise à jour d’une publication ou d’une page ?Cache de widget Cette section vous permet de personnaliser les réglages avancés.Diminue la taille des fichiers CSSDiminue la taille des fichiers JS (Premium)Diminue la taille de la pageVide tous les fichiers cacheRetire les émojis CSS en ligne et wp-emoji-release.min.jsVous pouvez spécifier les plans de site à utiliser pour le préchargement.Vous pouvez spécifier le contenu à utiliser pour le préchargement et également le trier.Vous pouvez spécifier la méthode que vous souhaitez utiliser pour la fonctionnalité de préchargement dans cette section.supprimer les fichiersa des paramètres Google Analyticsa des articles WooCommerce dans le panierpossède des paramètres Yandex Click IDhttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages par minutePKL\e??4wp-fastest-cache/languages/wp-fastest-cache-es_AR.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Spanish (Argentina) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2020-08-21 00:34:21+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: es_AR\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "" #: templates/preload.php:150 msgid "Sitemaps" msgstr "" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "" #: templates/preload.php:86 msgid "Content Types" msgstr "" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "" #: templates/preload.php:72 msgid "Choose a Method" msgstr "" #: templates/preload.php:56 msgid "Preload Settings" msgstr "" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Guardar" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Cancelar" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Ajustes de la barra de herramientas" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Vaciar el caché de todos los sitios" #: wpFastestCache.php:439 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Borrar caché" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Eliminar los recursos JavaScript que bloquean los procesos" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Las opciones han sido guardadas" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "tiene artículos de WooCommerce en el carrito" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "tiene parámetros de Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archivos" #: templates/timeout.php:189 msgid "Server Time" msgstr "Hora del servidor" #: templates/timeout.php:169 msgid "delete the files" msgstr "borrar los archivos" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Contiene" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Es igual a" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Comienza con" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Página de inicio" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Todo" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Asistente para excluir páginas" #: templates/timeout.php:124 msgid "Then" msgstr "Entonces" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Si REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Asistente del tiempo límite del caché" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Asistente de carga diferida" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Activar Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Por favor, actualiza" #: templates/update_success.php:9 msgid "Success" msgstr "Correcto" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Advertencia" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Agregar una nueva regla" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Solo disponible en la versión premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Elegí uno" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "También se van a eliminar todos los archivos del caché" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Si modificás cualquier archivo CSS, tenés que borrar los archivos CSS minimizados" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Carpeta de destino" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Podés borrar todos los archivos del caché" #: inc/admin.php:1090 msgid "Exclude" msgstr "Excluir" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimización de imágenes" #: inc/admin.php:1082 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Limpieza de la base de datos" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Ajustes de la CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Excluir JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Excluir CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Excluir cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Excluir agentes de usuario" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Excluir páginas" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Herramienta de optimización de imágenes" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Reglas de límite" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Estadísticas del caché" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Vaciar el caché de entradas / páginas" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "¿Qué querés que pase después de actualizar una entrada o una página?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Vaciar el caché de paginación" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Vaciar el caché de etiquetas de entradas" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Vaciar el caché de categorías de entradas" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Vaciar toda el caché" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "¿Qué querés que pase después de publicar la nueva entrada?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "Aceptar" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Reiniciar después de completado" #: templates/preload.php:210 msgid "pages per minute" msgstr "páginas por minuto" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Taxonomías personalizadas" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Tipos de contenido personalizado" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Adjuntos" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Etiquetas" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Páginas" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categorías" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Entradas" #: templates/preload.php:102 msgid "Homepage" msgstr "Página de inicio" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Cargar las imágenes e iframes cuando entren en la visualización de los navegadores" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Cargar las fuentes de Google de forma asíncrona" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Fuentes de Google" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Bloqueo de procesado de JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Podés eliminar los emojis CSS integrados y el archivo «wp-emoji-release.min.js»" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Desactivar los emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Reducir el tiempo de carga de la página para los visitantes repetitivos" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Caché del navegador" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Reducir el tamaño de los archivos enviados por tu servidor" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combine Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combinar JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Podés reducir el tamaño de los archivos JS" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minimizar JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combinar CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Más potente minimización CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minify Css Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Podés reducir el tamaño de los archivos CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minimizar CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Más potente minimización HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minify HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Podés reducir el tamaño de la página" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minimizar HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Vaciar los archivos del caché cuando se actualiza una entrada o página" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Actualizar la entrada" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Vaciar los archivos del caché cuando se publica una entrada o página" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nueva entrada" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Crear el caché para el tema para móviles" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Tema para móviles" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "No mostrar la versión de escritorio del caché en los dispositivos móviles" #: inc/admin.php:1195 msgid "Mobile" msgstr "Móvil" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "No mostrar la versión del caché para usuarios conectados" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Usuarios conectados" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Crear automáticamente el caché de todo el sitio" #: inc/admin.php:1157 msgid "Preload" msgstr "Precargar" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Reducir el número de consultas SQL" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget de caché" #: inc/admin.php:1119 msgid "Enable" msgstr "Activar" #: inc/admin.php:1118 msgid "Cache System" msgstr "Sistema de caché" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Una vez cada 15 días" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Una vez cada 7 días" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Una vez cada 3 días" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Una vez cada 10 horas" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Una vez cada 9 horas" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Una vez cada 8 horas" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Una vez cada 7 horas" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Una vez cada 5 horas" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Una vez cada 4 horas" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Una vez cada 3 horas" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Una vez cada 2 horas" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Una vez cada 10 días" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "El sistema WP Cache más simple y rápido" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://es.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Una vez al año" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Una vez al mes" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Una vez al día" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Una vez cada 6 horas" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Una vez a la hora" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Dos veces a la hora" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Una vez cada 15 minutos" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Una vez cada 5 minutos" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Una vez cada minuto"PKL\ R%R%4wp-fastest-cache/languages/wp-fastest-cache-cs_CZ.monu[  ' 4 F 'J r {         @ Y r    2 0 C [ g r   .     $ ;3 1o .      0 > R _ d n w A   =Y it   %9Lbu   3 > K W!d /.*3 ^.   (#L Q_ p ~99 0&=%d!?3 ?Pp.E4Pg~6 5'] d nz)#( $5-Z-)KI,v  -07Re}]=49 nx     !&8KQ] /"F"i 2EHYk~"3EW iw #  $ 1 GH E A !14!f!%!! ! ! ! !!!!2!1"5"P"m"""" "6":#C#'Y#&###.#C#S?$$#$#$1$%?%SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2025-02-25 22:35:47+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ((n >= 2 && n <= 4) ? 1 : 2); X-Generator: GlotPress/4.0.1 Language: cs_CZ Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) NastaveníPřidat nové pravidloPokročilá nastaveníVšeVšechny soubory cache paměti budou také odstraněnyArchivyPřílohyCache paměť prohlížečeCDN nastavení Statistiky cache pamětiSystém cache pamětiPrůvodce vypršením časového limitu cache pamětiStornoKategorieVyber jedenVyberte metoduVymazat všechny cache pamětiVymazat cache paměťSmazat cache paměť a minifikovat CSS/JSVymazat cache paměť všech webů.Vymazat cache paměť domovské stránkyVymazat cache paměť stránkováníVymazat cache paměť příspěvku / stránkyVymazat cache paměť kategorie příspěvkůVymazat cache paměť tagů příspěvkůVymazat soubory cache paměti při publikování příspěvku nebo stránkyVymazat soubory cache paměti při aktualizaci příspěvku nebo stránkyVymazat konkrétní stránkyKombinovat CSSKombinovat JSKombinovat JS PlusObsahujeTypy obsahuVytvořit cache paměť pro mobilní šablonuVytvořit cache paměť všech webů automatickyVlastní typy příspěvkuVlastní taxonomieVyčištění databázeZpoždění JsZakázat EmodžiNezobrazovat verzi cache paměti na stolních počítačích nebo na mobilních zařízeníchNezobrazovat verzi cache paměti přihlášeným uživatelůmOdstranit zdroje JavaScriptu blokující vykresleníEmre VonaPovolitPovolit GzipVyloučitVyloučit CSSVyloučit cookiesVyloučit JSVyloučit průvodce stránkouVyloučit stránkyVyloučit uživatelské agentyGoogle FontyGzipÚvodní stránkaDomovská stránkaPokud REQUEST_URIPokud upravíte jakýkoli CSS soubor, musíte odstranit minifikované CSS souboryOptimalizace obrázkuJe rovnýNastavení pomalého načítání ("lazy load")Načíst Google fonty asynchronněNačíst obrázky a prvky iframe při vstupu do výřezu prohlížečePřihlášení uživateléMinifikace CSSMinifikace CSS PlusMinifikace HTMLMinifikace HTML PlusMinifikace JSMobilníMobilní šablonaVýkonnější minifikace CSSVýkonnější minifikace HTMLNový příspěvekOKJednou za minutuJednou za 10 dníJednou za 10 hodinJednou za 15 dníJednou za 15 minutJednou za 2 hodinyJednou za 3 dnyJednou za 3 hodinyJednou za 4 hodinyJednou za 5 hodinJednou za 5 minutJednou za 6 hodinJednou za 7 dníJednou za 7 hodinJednou za 8 hodinJednou za 9 hodinJednou za denJednou za měsícJednou za rokJednou za hodinuDostupné pouze v Premium verziNástroj pro optimalizaci obrázkůNastavení byla uložena.StránkyProsím aktualizujtePříspěvkyPředběžně načístSnížit požadavky HTTP prostřednictvím kombinovaných CSS souborů Snížit požadavky HTTP prostřednictvím kombinovaných JS souborůSnižte dobu načítání stránky pro opakované návštěvníkySnížit počet dotazů SQLZmenšit velikost souborů odeslaných ze serveruJS blokující vykreslováníPo dokončení restartujte počítačUložitČas serveruNastaveníMapy webuZačíná naHotovoTagyCílová složkaNejjednodušší a nejrychlejší WP Cache systémPakPravidla časového limituNastavení panelu nástrojůDvakrát za hodinuAktualizace příspěvkuWP Fastest CacheNastavení WP Fastest CacheVarováníCo se má stát po zveřejnění nového příspěvku?Co se má stát po aktualizaci příspěvku nebo stránky?Cache paměť widgetuMůžete zmenšit velikost souborů CSSMůžete zmenšit velikost JS souborůMůžete zmenšit velikost stránkyMůžete smazat všechny soubory cache pamětiMůžete odstranit inline CSS pro emodži a wp-emoji-release.min.jsMůžete určit mapy webu, které se mají použít pro předběžné načítání.odstranit souboryobsahuje parametry Google Analyticsmá položky Woocommerce v košíkuhttp://cs.wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/stránek za minutuPKL\k??4wp-fastest-cache/languages/wp-fastest-cache-zh_TW.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Chinese (Taiwan) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-12-09 17:26:31+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: GlotPress/4.0.1\n" "Language: zh_TW\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "在下方選取的使用者角色能看到 WP Fastest Cache 在工具列上的選單。" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "使用者角色" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "必須新增至少一個 Sitemap" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "在這個對話方塊中,網站管理員可以自訂進階設定。" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "進階設定" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "網站管理員可以指定要預先載入的 Sitemap。" #: templates/preload.php:150 msgid "Sitemaps" msgstr "Sitemap" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "網站管理員可以指定要預先載入的內容,同時也可以對這些內容進行排序。" #: templates/preload.php:86 msgid "Content Types" msgstr "內容類型" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "在這個對話方塊中,網站管理員可以指定要使用的預先載入功能方法。" #: templates/preload.php:72 msgid "Choose a Method" msgstr "選取方法" #: templates/preload.php:56 msgid "Preload Settings" msgstr "預先載入設定" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "讓某些 JS 程式碼在畫面捲動或移動游標後才載入" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "延遲載入 JS" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "WP Fastest Cache 設定" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "包含 Yandex Click ID 參數" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "清除指定頁面" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "儲存" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "取消" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "工具列設定" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "清除全部網站快取" #: wpFastestCache.php:439 msgid "Settings" msgstr "設定" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "清除快取" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "清除禁止轉譯的 JavaScrpt 資源" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "設定已儲存。" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "包含購物車中的 Woocommerce 商品資料" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "包含 Google Analytics 參數" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "彙整" #: templates/timeout.php:189 msgid "Server Time" msgstr "伺服器時間" #: templates/timeout.php:169 msgid "delete the files" msgstr "刪除檔案" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "包含" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "等於" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "開頭含有" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "首頁" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "全部" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "排除頁面精靈" #: templates/timeout.php:124 msgid "Then" msgstr "然後" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "如果 REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "快取逾時精靈" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "延遲載入設定" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "啟用 Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "請更新" #: templates/update_success.php:9 msgid "Success" msgstr "成功" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "警告" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "新增規則" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "清除快取及已壓縮的 CSS/JS" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "這項功能僅於 Premium 版中提供" #: templates/timeout.php:141 msgid "Choose One" msgstr "選取一項" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "這項操作會同時刪除全部快取檔案。" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "如果對任何 CSS 檔案進行修改,修改完畢後必須刪除之前已壓縮的 CSS 檔案。" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "目標資料夾" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "這項操作會刪除全部快取。" #: inc/admin.php:1090 msgid "Exclude" msgstr "排除" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "圖片最佳化" #: inc/admin.php:1082 msgid "Settings" msgstr "設定" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "清理資料庫" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN 設定" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "排除 JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "排除 CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "排除 Cookie" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "排除使用者代理程式" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "排除頁面" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "圖片最佳化工具" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "逾時規則" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "快取統計資料" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "清除文章/頁面快取" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "更新內容後的快取處理方式:" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "清除內容頁次快取" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "清除文章標籤快取" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "清除文章分類快取" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "清除首頁快取" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "清除全部快取" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "發佈內容後的快取處理方式:" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "確定" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "快取建立完畢後自動重新啟動預先載入程序" #: templates/preload.php:210 msgid "pages per minute" msgstr "頁處理頁數/分鐘" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "自訂分類法" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "自訂內容類型" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "附件" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "標籤" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "頁面" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "分類" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "文章" #: templates/preload.php:102 msgid "Homepage" msgstr "首頁" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "合併 JS 檔案可以減少 HTTP 要求次數" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "當圖片及 iFrame 進入瀏覽器檢視區內才進行載入" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "以非同步方式載入 Google Fonts 網頁字型" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google Fonts 網頁字型" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "禁止轉譯的 JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "這項功能可移除 Emoji 內嵌 CSS 及 wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "停用 Emoji 表情符號" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "這項功能可降低回訪訪客的頁面載入時間" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "瀏覽器快取" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "減少從網站伺服器傳送的檔案大小" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "JS 進階合併" #: inc/admin.php:1316 msgid "Combine Js" msgstr "JS 合併" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "這項功能可減少 JS 檔案大小" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "JS 壓縮" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "合併 CSS 檔案可以減少 HTTP 要求次數" #: inc/admin.php:1291 msgid "Combine Css" msgstr "CSS 合併" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "更多 CSS 進階壓縮功能" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "CSS 進階壓縮" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "這項功能可減少 CSS 檔案大小" #: inc/admin.php:1270 msgid "Minify Css" msgstr "CSS 壓縮" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "更多 HTML 進階壓縮功能" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "HTML 進階壓縮" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "這項功能可減少頁面檔案大小" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "HTML 壓縮" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "更新文章或頁面後便清除快取檔案" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "更新內容" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "發佈文章或頁面後便清除快取檔案" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "新增內容" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "為行動版佈景主題建立快取" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "行動版佈景主題" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "在行動裝置上不顯示已快取的桌面版內容" #: inc/admin.php:1195 msgid "Mobile" msgstr "行動裝置" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "不在使用者登入後顯示已快取的內容" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "已登入的使用者" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "為這個網站的全部項目自動建立快取" #: inc/admin.php:1157 msgid "Preload" msgstr "預先載入" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "減少 SQL 查詢的次數" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "小工具快取" #: inc/admin.php:1119 msgid "Enable" msgstr "啟用" #: inc/admin.php:1118 msgid "Cache System" msgstr "快取系統" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "每 15 日一次" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "每 7 日一次" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "每 3 日一次" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "每 10 小時一次" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "每 9 小時一次" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "每 8 小時一次" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "每 7 小時一次" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "每 5 小時一次" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "每 4 小時一次" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "每 3 小時一次" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "每 2 小時一次" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "每 10 日一次" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "最易於使用、最快速的 WordPress 快取外掛。" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://tw.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "每年一次" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "每月一次" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "每日一次" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "每 6 小時一次" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "每小時一次" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "每小時兩次" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "每 15 分鐘一次" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "每 5 分鐘一次" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "每分鐘一次"PKL\VY|Z551wp-fastest-cache/languages/wp-fastest-cache-uk.monu[    '  " . : J W h u       % ? Z y 2 0    % 5 > L .j      ; 1" .T       !*A9{  =  ' 7C T^ er(:M`s    !9Me ky/.* ".Cr F  `.(    +939m =&%!?a?3UTJ. <\m)$+DpCw Q-EbG  :[<s=;>*7i97lr6*@Us:F27M$j X D!N!a!y!!$!!4!!"3"R"f"k"""")P#z#"#C##1$$%$%'%%M%i%|%.%3%%&#& 6&"W&z&$&#&&#&#'!8'#Z'!~''!'!'!'(0(G(X(1l(@(.()#) C)+P)J|)j)i2*t*6+iH+0+:+,/,E,^,t,!- ;-F-W-q-D1.v..>...!/3/6D/{/n/q/n0l0@0?41@t1=1P1D2234*4/4)4.)5X5$x5SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below.The simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostUser RolesWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-12-29 17:45:13+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : ((n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) ? 1 : 2); X-Generator: GlotPress/4.0.1 Language: uk_UA Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) НалаштуванняДодати нове правилоРозширені налаштуванняВсеВсі файли кешу також будуть видаленіАрхівиНеобхідно додати принаймні одну карту сайтуВкладенняКеш браузераНалаштування CDNСтатистика кешуСистема кешуМайстер тайм-ауту (час очікування) кешуСкасуватиКатегоріїВиберіть одинОберіть методОчистити весь кешОчистити кешОчищення кешу та мінімізація CSS/JSОчистити кеш-пам’ять усіх сайтівОчистити кеш домашньої сторінкиОчистити кеш розбивки на сторінкиОчистити кеш запису / сторінкиОчистити кеш категорій записівОчистити кеш позначок записівОчистити файли кешу під час публікації запису або сторінкиОчищайте файли кешу під час оновлення публікації або сторінкиОчищення конкретних сторінокОб'єднати CSSОб'єднати JsОб'єднати Js ПлюсМіститьТипи вмістуСтворити кеш для мобільної темиСтворити кеш всього сайту автоматичноКористувацькі типи записівКористувальницька таксономіяОчищення бази данихЗатримка JsВимкнути EmojiНе показувати кешовану версію для настільних комп'ютерів на мобільних пристрояхНе показувати кешовану версію для користувачів, які ввійшли в системуУсунення блокуючих відображення JavaScript ресурсівEmre VonaУвімкнутиУвімкніть GzipВилучитиВиключити CSSВиключити файли cookieВиключити JSМайстер виключення сторінкиВилучені сторінкиВиключити User-AgentsШрифти GoogleGzipГоловна сторінкаДомашня сторінкаЯкщо REQUEST_URIЯкщо ви змінюєте будь-який файл CSS, вам потрібно видалити мініфіковані файли CSSОптимізація зображеньДорівнюєНалаштування Lazy LoadАсинхронне завантаження шрифтів GoogleЗавантажуйте зображення та фрейми, коли вони потрапляють в область перегляду браузераЗареєстровані користувачіМініфікувати CssМініфікувати Css ПлюсМініфікувати HTMLСкорочення коду HTML PlusМініфікувати JsМобільнийМобільна темаБільш потужне зжимання CSSБільш потужний зменшувач htmlНовий записOKРаз в кожну хвилинуРаз в кожні 10 днівРаз в кожні 10 годинРаз на 15 днівРаз в кожні 15 хвилинРаз в кожні 2 годиниРаз на 3 дніРаз в кожні 3 годиниРаз в кожні 4 годиниРаз в кожні 5 годинРаз в кожні 5 хвилинРаз в кожні 6 годинРаз на 7 днівРаз в кожні 7 годинРаз в кожні 8 годинРаз в кожні 9 годинРаз в деньРаз в місяцьРаз в рікРаз годинуДоступно лише у версії PremiumІнструмент оптимізації зображенняПараметри були збереженіСторінкиБудь ласка, оновітьЗаписиПопереднє завантаженняНалаштування попереднього завантаженняЗменшити кількість HTTP-запитів шляхом об'єднання файлів CSS.Зменшити кількість HTTP-запитів шляхом об'єднання js-файлів.Зменшити час завантаження сторінок для повторних відвідувачівЗменшіть кількість SQL-запитівЗменште розмір файлів, які надсилаються з вашого сервера.Блокування відображення JsПерезапустити після завершенняЗберегтиЧас сервераНалаштуванняКарти сайтуДеякі js джерела не будуть завантажені до тих пір, поки не буде прокручено або переміщено мишеюПочинається зУспіхПозначкиЦільова папкаМеню WP Fastest Cache на панелі інструментів адміністратора буде видимим для обраних нижче ролей користувачів.Найпростіша і найшвидка система WP CacheТодіПравила перервиНалаштування панелі інструментівДвічі в годинуОновити записРолі користувачівWP Fastest CacheПараметри кешування WP Fastest CacheВнимание!Що ви хочете, щоб сталося після опублікування нового запису?Що ви хочете, щоб сталося після оновлення запису або сторінки?Кеш віджетівВи можете налаштувати розширені параметри в цьому розділі.Ви можете зменшити розмір файлів CSSВи можете зменшити розмір js файлівВи можете зменшити розмір сторінкиВи можете видалити всі файли кешуВи можете видалити emoji inline css та wp-emoji-release.min.jsВи можете вказати мапи, які будуть використовуватися для попереднього завантаження.Ви можете вказати вміст, який буде використовуватися для попереднього завантаження, а також ви можете його сортувати.Ви можете вказати метод, який ви хочете використовувати для функції попереднього завантаження через цей розділ.видалити файлимає параметри Google Analyticsмає товари Woocommerce у кошикумає параметри Yandex Click IDhttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/сторінок на хвилинуPKL\i))4wp-fastest-cache/languages/wp-fastest-cache-de_DE.monu[    '  " . : J W h u       % ? Z y 2 0    % 5 > L .j      ; 1" .T       !*A9{  =  ' 7C T^ er(:M`s    !9Me ky/.* ".Cr F  `.(    +939m =&%!?a?3UTJ. <\m.0HQas #    # 1M%g$(C@>  ,8Ic{ RI=O   * DQV_hMz % U&|   * I W Z l       !!-!C!Y!l!!!! !!!%! "&"B"I" ]"g"p"6"5"<"%0#NV### # # ##O# L$X$ _$m$p}$9$(%-%H%f%y%%%%%D%K& c&Ep&0&/&*'%B'Jh'J'G'\F(((%((1)M)m)SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below.The simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostUser RolesWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-12-18 09:17:03+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: de Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) EinstellungenNeue Regel hinzufügenErweiterte EinstellungenAllesAuch alle Cache-Dateien werden dabei gelöschtArchiveMindestens eine Sitemap muss hinzugefügt werdenAnhängeBrowser-CachingCDN-EinstellungenCache-StatistikenCache-SystemCache-ZeitüberschreitungsassistentAbbrechenKategorienWähle einsWähle eine MethodeAlle Caches löschenCache leerenCache und minimiertes CSS/JS leerenCache aller Websites leerenCache der Homepage leerenCache von Seitennummerierungen leerenCache von Beitrag/Seite leerenCache von Beitrags-Kategorien leerenCache von Beitrags-Schlagwörtern leerenCache leeren, wenn ein Beitrag oder eine Seite veröffentlicht wirdCache leeren, wenn ein Beitrag oder eine Seite aktualisiert wirdBestimmte Seiten löschenCSS kombinierenJS kombinierenJS minimieren PlusBeinhaltetInhaltstypenCache für Theme für Mobilgeräte erstellenDen Cache für die gesamte Website automatisch erstellenIndividuelle InhaltstypenIndividuelle TaxonomienDatenbank aufräumenJS verzögernEmojis deaktivierenDie zwischengespeicherte Version für den Desktop nicht auf Mobilgeräten anzeigenDie zwischengespeicherte Version nicht für angemeldete Benutzer anzeigenBeseitigt JavaScript-Ressourcen, die das Rendering blockierenEmre VonaAktivierenGzip aktivierenAusschließenCSS ausschließenCookies ausschließenJS ausschließenSeiten-Ausschluss-AssistentSeiten ausschließenUser Agents ausschließenGoogle FontsGzipHomepageHomepageFalls REQUEST_URIFalls du eine CSS-Datei veränderst, musst du minimierte CSS-Dateien löschenBildoptimierungIst gleichEinstellungen für Verzögertes LadenGoogle Fonts asynchron ladenBilder und iFrames laden, wenn diese in den Darstellungsbereich des Browsers gelangenAngemeldete BenutzerCSS minimierenCSS minimieren PlusHTML minimierenHTML minimieren PlusJS minimierenMobilgeräteTheme für MobilgeräteStärkeres Minimieren von CSSStärkeres Minimieren von HTMLNeuer BeitragOKEinmal pro MinuteEinmal alle 10 TageEinmal alle 10 StundenEinmal alle 15 TageEinmal alle 15 MinutenEinmal alle 2 StundenEinmal alle 3 TageEinmal alle 3 StundenEinmal alle 4 StundenEinmal alle 5 StundenEinmal alle 5 MinutenEinmal alle 6 StundenEinmal alle 7 TageEinmal alle 7 StundenEinmal alle 8 StundenEinmal alle 9 StundenTäglichMonatlichEinmal pro JahrEinmal pro StundeNur verfügbar in der Premium-VersionWerkzeug zur BildoptimierungOptionen wurden gespeichertSeitenBitte aktualisierenBeiträgeVorladenPreload-EinstellungenHTTP-Anfragen durch kombinierte CSS-Dateien reduzierenHTTP-Anfragen durch kombinierte JS-Dateien reduzierenDie Seitenladezeiten für wiederkehrende Besucher reduzierenDie Anzahl an SQL-Anfragen reduzierenDie Größe der Dateien, die von deinem Server ausgeliefert werden, reduzierenRender-Blocking-JSNeustart nach AbschlussSpeichernServerzeitEinstellungenSitemapsEinige JS-Quellen werden erst geladen, wenn gescrollt oder die Maus bewegt wirdBeginnt mitErfolgSchlagwörterZielverzeichnisDas WP-Fastest-Cache-Menü in der Admin-Werkzeugleiste ist für die unten ausgewählten Benutzerrollen sichtbar.Das einfachste und schnellste Cache-System für WordPressDannZeitüberschreitungsregelnWerkzeugleisten-EinstellungenZweimal pro StundeAktualisierter BeitragBenutzerrollenWP Fastest CacheWP-Fastest-Cache-OptionenWarnungWas soll geschehen, nachdem ein neuer Beitrag veröffentlicht wurde?Was soll geschehen, nachdem ein Beitrag oder eine Seite aktualisiert wurde?Widget-CacheIn diesem Abschnitt kannst du die erweiterten Einstellungen anpassen.Du kannst die Größe von CSS-Dateien verringernDu kannst die Größe von JS-Dateien reduzierenDu kannst die Größe der Seite verringernDu kannst alle Cache-Dateien löschenDu kannst das Inline-CSS für Emojis und wp-emoji-release.min.js entfernenDu kannst festlegen, welche Sitemaps für das Preloading verwendet werden.Du kannst die Inhalte für das Preloading festlegen und auch sortieren.In diesem Abschnitt kannst du festlegen, welche Methode die Preload-Funktion verwenden soll.die Dateien löschenhat Google-Analytics-Parameterhat Woocommerce-Elemente im Warenkorbhat Yandex-Click-ID-Parameterhttp://de.wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/Seiten pro MinutePKL\%AG'G'4wp-fastest-cache/languages/wp-fastest-cache-sl_SI.monu[\ \ ] w   '  "   ( 5 J Q \ g w      2 0L }    .  2 D U ^ ;m 1 .   ' / ; K V j x    A  ! 4=U    ,58L_s"4GZ m x  ! /.O*~ . $ )5>FG  (   -F9N9 =& %4!Z|?3UTe .(Wwn&:1>pw+% - 8EUt$+)+#1GUI "5 =%K*q ?<Q0    1@ \j o }S   -IN   4 Tbiy  ( 7 F U d r      ! !&!L?!:!/!!4"L"e""" ""S" ##0# 7#>C######## $,$5@$v$5$%$%$ %,1%P^%R%&Y&u&&"&&.&'6'SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2023-12-18 14:05:59+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=4; plural=(n % 100 == 1) ? 0 : ((n % 100 == 2) ? 1 : ((n % 100 == 3 || n % 100 == 4) ? 2 : 3)); X-Generator: GlotPress/4.0.1 Language: sl_SI Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) NastavitveDodaj novo praviloNapredne NastavitveVseOdstranjene bodo tudi vse datoteke predpomnilnikaArhiviVsaj en sitemap mora biti dodanPriponkePredpomnilnik brskalnikaCDN nastavitveStatistka predpomnilnikaSistemski predpomnilnikČParovnik za časovni potek predpomnilnikaPrekiniKategorijeIzberite enoIzberite metodoPočisti celoten predpomnilnikPočisti medpomnilnikPočisti predpomnilnik za vse straniPočisti predpomnilnik številčenja straniPočisti predpomnilnik prispevka / straniPočisti predpomnilnik kategorij prispevkovPočisti predpomnilnik oznak straniIzbriši datoteke predpomnilnika, ko sta prispevek ali stran objavljenaIzbriši datoteke predpomnilnika, ko sta prispevek ali stran posodobljenaČiščenje določenih straniKombiniraj CssKombiniraj JsKombiniraj Js PlusVsebujeVrste vsebineUstvari predpomnilnik za mobilno temoSamodejno ustvari prepomnilnik vseh straniVrste prispevkov po meriTaksonomije po meriOčiščenje podatkovne bazeZakasnitev JSOnemogoči čustvene simboleNe prikaži prepomnjene namizne različice na mobilnih napravahNe prikaži prepomnjene različice za prijavljene uporabnikeOdpravi Java-Script vire, ki ovirajo izrisovanjeEmre VonaOmogočiOmogoči GzipIzločiIzločii CSSIzloči piškotkeIzloči JSČarovnik za izločanje straniIzloči straniIzloči uporabniške agenteGoogle pisaveGzipDomača stranDomača stranČe REQUEST_URIOb spremembi katerekoli css datoteke je potrebno izbrisati pomanjšane css datotekeOptimizacija slikJe enak kotNastavitve za lenobno nalaganjeAsinhrono nalaganje Google pisavNaloži slike in iframe okvireje, ko se pojavijo v vidnem delu brskalnikaPrijavljeni uporabnikiZmanjšaj CssZmanjšaj Css PlusZmanjšaj HTMLZmanjšaj HTML PlusZmanjšaj JsMobilnoMobilna temaBolj zmogljiva css pomanjšavaBolj zmogljiva pomanjšava htmlNov prispevekV reduNa vsako minutoEnkrat na 10 dniNa vsakh 10 urNa vsake 15 dniNa vsakih 15 minutNa vsaki 2 uriNa vsake 3 dniNa vsake 3 ureNa vsake 4 ureNa vsakih 5 urNa vsakih 5 minutNa vsakih 6 urNa vsake 7 dniNa vsakih 7 urNa vsakih 8 urNa vsakih 9 urEnkrat na danEnkrat na mesecEnkrat na letoNa vsako uroNa voljo le v premium različiciOrodje za optimizacijo slikNastavitve so shranjeneStraniProsimo, posodobitePrispevkiPrednalaganjeNastavitve prednalaganjaLahko zmanjšate število HTTP zahtevkov s pomočjo kombiniranih css datotekZmanjšaj HTTP zahtevke s pomočjo kombiniranih js datotekZmanjšaj čas nalaganja za ponovne obiskovalceZmanjšaj število SQL poizvedbZmanjšaj velikost datotek, ki jih pošlje strežnikJs, ki ovira izrisovanjeKo končasš ponovno zaženiShraniČas strežnikaNastavitveZemljevidi spletnih mestNekateri viri JS se ne bodo naložili, dokler se ne pomaknete ali premaknete miškeSe začne s/zJe bilo uspešnoOznakeCiljna mapaNajenostavnejši in najhitrejši predpomnilniški sistem za WPPotemPravila za potek časaNastavitve orodne vrsticeDvakrat na uroPosodobi prispevekWP Fastest CacheMožnosti za WP Fastet CacheOpozoriloKaj naj se zgodi po objavi novega prispevka?Kaj naj se zgodi po posodobitvi prispevka ali strani?Predpomnilnik gradnikovV tem razdelku lahko prilagodite napredne nastavitve.Lahko zmanjšate velikost css datotekLahko zmanjšate velilkost js datotekLahko zmanjšate velikost straniLahko izbrišete vse datoteke predpomnilnikaLahko izbrišete medvrstični css čustvenih simbolov in wp-emoji-release.min.jsDoločite lahko zemljevide spletnih mest, ki se bodo uporabljali za prednalaganje.Zemljevidi spletnih mestV tem razdelku lahko določite metodo, ki jo želite uporabiti za funkcijo prednalaganja.izbriši datotekeima Google Analytics parametreima Woocommerce artikle na seznamuima Yandex Click ID parametrehttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/strani na minutoPKL\IK` > >1wp-fastest-cache/languages/wp-fastest-cache-fi.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Finnish # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2020-03-19 21:29:25+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: fi\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "" #: templates/preload.php:150 msgid "Sitemaps" msgstr "" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "" #: templates/preload.php:86 msgid "Content Types" msgstr "" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "" #: templates/preload.php:72 msgid "Choose a Method" msgstr "" #: templates/preload.php:56 msgid "Preload Settings" msgstr "" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "" #: wpFastestCache.php:439 msgid "Settings" msgstr "Asetukset" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Tyhjennä välimuisti" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Poista näyttämisen blokkaavat JS resurssit" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Asetukset on tallennettu" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "Woocommerce kohteita on ostoskorissa" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "on Google Analytics -parametrejä" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Arkistot" #: templates/timeout.php:189 msgid "Server Time" msgstr "Palvelimen aika" #: templates/timeout.php:169 msgid "delete the files" msgstr "poistaa tiedostot" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Sisältää" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Yhtäsuuri kuin" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Alkaa" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Kotisivu" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Kaikki" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Rajaa pois sivu -velho" #: templates/timeout.php:124 msgid "Then" msgstr "Sitten" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Jos REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Välimuisti aikaraja -velho" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Vaiheittainen lataus asetukset" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Ota Gzip käyttöön" #: templates/update_now.php:9 msgid "Please Update" msgstr "Päivitä, ole hyvä" #: templates/update_success.php:9 msgid "Success" msgstr "Onnistui" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Varoitus" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Lisää uusi sääntö" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Vain Maksullisessa versiossa" #: templates/timeout.php:141 msgid "Choose One" msgstr "Valitse yksi" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Myös kaikki välimuistin tiedostot poistetaan" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Jos muutat mitä tahansa css-tiedostoa, on poistettava pienennetty css-tiedosto" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Kohde hakemisto" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Voit poistaa kaikki välimuistin tiedostot" #: inc/admin.php:1090 msgid "Exclude" msgstr "Rajaa pois" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Kuvien optimointi" #: inc/admin.php:1082 msgid "Settings" msgstr "Asetukset" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Tietokannan siivous" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN-Asetukset" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Rajaa pois JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Rajaa pois CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Rajaa pois evästeet" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Rajaa pois käyttäjäagentit" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Rajaa pois sivut" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Työkalu kuvien optimointiin" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Aikasäännöt" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Välimuistin tilastot" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Tyhjennä sivun/artikkelin välimuisti" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Mitä haluat tapahtuvaksi artikkelin tai sivun päivityksen jälkeen?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Tyhjennä sivutuksen välimuisti" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Tyhjennä artikkelin avainsanojen välimuisti" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Tyhjennä artikkelin kategorioiden välimuisti" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Tyhjennä koko välimuisti" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Mitä haluat tapahtuvaksi kun uusi artikkeli on julkaistu?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Käynnistä uudelleen kun valmista" #: templates/preload.php:210 msgid "pages per minute" msgstr "sivua minuutissa" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Mukautettu luokittelu" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Mukautetut artikkelityypit" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Liitteet" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Avainsanat" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Sivut" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Osastot" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Artikkelit" #: templates/preload.php:102 msgid "Homepage" msgstr "Etusivu" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Vähennä HTTP-kutsuja yhdistämällä js-tiedostoja" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Lataa kuvat ja iframes kun ne saapuvat selaimen näyttöön" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Lataa Google fontit asynkronisesti" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google fontit" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Näytä blokkaava Js" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Voit poistaa hymiön rivin sisäisen css ja wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Poista hymiöt käytöstä" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Vähennä sivun latausaikoja toistuville vierailijoille" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Selaimen välimuisti" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Pienennä palvelimelta lähetettyjen tiedostojen kokoa" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Yhdistä Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Yhdistä Js" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Voit pienentää js-tiedostojen kokoa" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Pienennä Js" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Vähennä HTTP-kutsuja yhdistämällä css-tiedostoja" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Yhdistä Css" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Tehokkaampi css pienennys" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Pienennä Css Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Voit pienentää css-tiedostojen kokoa" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Pienennä Css" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Tehokkaampi HTML-pienennys" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Pienennä HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Voit pienentää sivun kokoa" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Pienennä HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Tyhjennä välimuistin tiedostot kun sivu tai artikkeli päivitetty" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Päivitä artikkeli" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Tyhjennä välimuistin tiedostot kun sivu tai artikkeli julkaistu" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Uusi artikkeli" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Tee välimuisti mobiili teemalle" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Mobiili teema" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Älä näytä mobiili laitteille pöytäkoneille välimuistitettua versiota" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobiili" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Älä näytä välimuistitettua versiota kirjautuneille käyttäjille" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Kirjautuneet käyttäjät" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Luo välimuisti automaattisesti koko sivustolle" #: inc/admin.php:1157 msgid "Preload" msgstr "Esilataa" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Vähennä SQL-kutsujen määrää" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Vimpain välimuisti" #: inc/admin.php:1119 msgid "Enable" msgstr "Ota käyttöön" #: inc/admin.php:1118 msgid "Cache System" msgstr "Välimuistijärjestelmä" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "15 päivän välein" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "7 päivän välein" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "3 päivän välein" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "10 tunnin välein" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "9 tunnin välein" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "8 tunnin välein" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "7 tunnin välein" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "5 tunnin välein" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "4 tunnin välein" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "3 tunnin välein" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "2 tunnin välein" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "10 päivän välein" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Yksinkertaisin ja nopein WP-välimuistijärjestelmä" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Kerran vuodessa" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Kerran kuukaudessa" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Kerran päivässä" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "6 tunnin välein" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Kerran tunnissa" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Kahdesti tunnissa" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "15 minuutin välein" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "5 minuutin välein" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "1 minuutin välein"PKL\+`''4wp-fastest-cache/languages/wp-fastest-cache-sv_SE.monu[    '  "  * : G X e z       / J i 2 0   % . < .Z      ; 1 .D s }      A)k ~ =  '3 DN Ub{*=Pcx    !)=U [iow/.* .3bu F   (G LZ k y 99 6=C&%!?3OUT.?_}. =Qk+p+ / 6AJY i!u!#"2;U;   --Hv I93V      ,9 > HRGa )J W lz   )?Wm % : Q h     %  !! #!-!5!D!7`!6!3!"7""V"!y"" """I" ### ,#6#7?#w#}#!##### #$= $I^$ $@$%$$%!A%c%;%G%\&Yd&&&"&'.0'_''SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostUser RolesWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-12-09 10:10:54+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: sv_SE Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) InställningarLägg till ny regelAvancerade inställningarAllaAlla cache-filer kommer också att tas bortArkivMinst en webbplatskarta måste läggas tillBilagorWebbläsarcachingCDN-inställningarCachestatistikCachesystemGuide för cache-timeoutAvbrytKategorierVälj enVälj en metodRensa all cacheRensa cacheRensa cache och minifierad CSS/JSRensa cache för alla webbplatserRensa cache för startsidaRensa cache för pagineringRensa cache för inlägg/sidaRensa cache för inläggskategorierRensa cache för inläggsetiketterRensa cache-filer när ett inlägg eller en sida publicerasRensa cache-filer när ett inlägg eller en sida uppdaterasRensar specifika sidorKombinera CSSKombinera JsKombinera Js PlusInnehållerInnehållstyperSkapa cache för mobiltemaSkapa cache för hela webbplatsen automatisktAnpassade inläggstyperAnpassade taxonomierDatabasrensningFördröj JSInaktivera emojisVisa inte den cachade versionen för stationär dator till mobila enheterVisa inte den cachade versionen för inloggade användareEliminera renderingsblockerande JavaScript-resurserEmre VonaAktiveraAktivera GzipExkluderaExkludera CSSExkludera cookiesExkludera JSGuide för exkludering av sidaExkludera sidorExkludera användaragenterGoogle FontsGzipStartsidaStartsidaOm REQUEST_URIOm du modifierar någon CSS-fil måste du ta bort minifierade CSS-filerBildoptimeringÄr lika medInställningar för uppskjuten inläsningLadda Google Fonts asynkrontLadda bilder och iframes när de kommer in i webbläsarens visningsområdeInloggade användareMinifiera CSSMinifiera CSS PlusMinifiera HTMLMinifiera HTML PlusMinifiera JsMobilMobiltemaKraftfullare minifierad CSSKraftfullare minifierad htmlNytt inläggOKEn gång per minutEn gång var 10:e dagEn gång var 10:e timmeEn gång var 15:e dagEn gång var 15:e minutEn gång varannan timmeEn gång var 3:e dagEn gång var 3:e timmeEn gång var 4:e timmeEn gång var 5:e timmeEn gång var 5:e minutEn gång var 6:e timmeEn gång var 7:e dagEn gång var 7:e timmeEn gång var 8:e timmeEn gång var 9:e timmeEn gång om dagenEn gång i månadenEn gång om åretEn gång i timmenEndast tillgängligt i premiumversionBildoptimeringsverktygAlternativ har sparatsSidorUppdateraInläggFörhandsladdaFörladdningsinställningarMinska HTTP-förfrågningar genom kombinerade CSS-filerMinska HTTP-förfrågningar genom kombinerade js-filerMinska sidans laddningstid för upprepade besökareMinska antalet SQL-frågorMinska storleken på filer som skickas från din serverJavascript som blockerar renderingStarta om efter att ha slutförtsSparaServertidInställningarWebbplatskartorVissa js-källor laddas inte förrän du rullar sidan eller flyttar musenStartar medLyckadesEtiketterMålmappDet enklaste och snabbaste cachesystemet för WordPressSedanTimeout-reglerInställningar för verktygsfältTvå gånger i timmenUppdatera inläggAnvändarrollerWP Fastest CacheAlternativ för WP Fastest CacheVarningVad vill du hända efter att du publicerat det nya inlägget?Vad vill du ska hända efter att ha uppdaterat ett inlägg eller en sida?Widget-cacheDu kan anpassa de avancerade inställningarna via denna sektion.Du kan minska storleken på CSS-filerDu kan minska storleken på js-filerDu kan minska storleken på sidanDu kan ta bort alla cache-filerDu kan ta bort emoji inline CSS och wp-emoji-release.min.jsDu kan specificera webbplatskartor som ska användas för förladdning.Du kan välja för vilket innehåll förladdning ska användas, och även ange dess ordning.I denna sektion kan du välja vilken metod du vill använda för förladdningsfunktionen.ta bort filernahar Google Analytics-parametrarhar Woocommerce-varor i varukorgenhar Yandex Click ID-parametrarhttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/sidor per minutPKL\>>4wp-fastest-cache/languages/wp-fastest-cache-zh_CN.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Chinese (China) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-12-10 10:19:38+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: GlotPress/4.0.1\n" "Language: zh_CN\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "请至少添加一个站点地图" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "你可以在这里查看更多设置。" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "高级设置" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "你可以指定用于预加载的站点地图。" #: templates/preload.php:150 msgid "Sitemaps" msgstr "站点地图" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "你可以指定预加载的内容,也可以对它们进行排序。" #: templates/preload.php:86 msgid "Content Types" msgstr "内容类型" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "你可以在这里指定预加载功能的实现方式。" #: templates/preload.php:72 msgid "Choose a Method" msgstr "选择一种方式" #: templates/preload.php:56 msgid "Preload Settings" msgstr "预加载设置" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "只有用户滚动页面或移动鼠标时才会加载部分 js 文件" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "延迟加载 JS" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "WP Fastest Cache 选项" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "具有 Yandex 的 Click ID 参数" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "清除特定页面的缓存" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "保存" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "取消" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "工具栏设置" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "清除所有站点的缓存" #: wpFastestCache.php:439 msgid "Settings" msgstr "设置" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "清除缓存" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "消除阻止渲染的 JavaScript 资源" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "选项已保存" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "购物车中有 Woocommerce 项目" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "具有 Google Analytics(分析)参数" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "存档" #: templates/timeout.php:189 msgid "Server Time" msgstr "服务器时间" #: templates/timeout.php:169 msgid "delete the files" msgstr "删除文件" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "包含" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "等于" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "开始于" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "主页" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "所有" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "排除页面向导" #: templates/timeout.php:124 msgid "Then" msgstr "然后" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "如果 REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "缓存超时向导" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "延迟加载设置" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "启用 Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "请更新" #: templates/update_success.php:9 msgid "Success" msgstr "成功" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "警告" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "添加新规则" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "删除缓存和已压缩的 CSS/JS" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "仅在 Premium 版中可用" #: templates/timeout.php:141 msgid "Choose One" msgstr "选一个" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "所有缓存文件也将被删除" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "如果您修改了 CSS 文件,则必须删除已压缩的 CSS 文件" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "目标文件夹" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "您可以删除所有缓存文件" #: inc/admin.php:1090 msgid "Exclude" msgstr "排除选项" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "图像优化" #: inc/admin.php:1082 msgid "Settings" msgstr "设置" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "数据库清理" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN 设置" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "排除的 JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "排除的 CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "排除的 Cookie" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "排除的 User-Agents" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "排除的页面" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "图像优化工具" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "缓存超时规则" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "缓存统计" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "清除文章/页面的缓存" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "更新文章或页面后您想做什么?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "清除分页缓存" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "清除文章标签缓存" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "清除文章类别缓存" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "清除所有缓存" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "发布新文章后您想做什么?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "好" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "缓存生成完毕后重新启动预加载程序" #: templates/preload.php:210 msgid "pages per minute" msgstr "每分钟几个页面" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "自定义分类" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "自定义文章类型" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "附件" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "标签" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "页面" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "分类" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "文章" #: templates/preload.php:102 msgid "Homepage" msgstr "主页" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "通过合并 js 文件减少 HTTP 请求" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "当图像和 iframe 进入视线时才去加载它们" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "异步加载谷歌字体" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "谷歌字体" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "阻塞渲染的 Js" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "您可以删除 Emoji 的内联 CSS 和 wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "禁用 Emoji" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "减少网站老用户的页面加载时间" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "浏览器缓存" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "减少从服务器发送的文件大小" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Js 增强合并" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Js 合并" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "您可以减小 JS 文件的大小" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Js 压缩" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "通过合并 CSS 文件减少 HTTP 请求" #: inc/admin.php:1291 msgid "Combine Css" msgstr "CSS 合并" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "CSS 增强压缩" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "CSS 增强合并" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "您可以减小 CSS 文件的大小" #: inc/admin.php:1270 msgid "Minify Css" msgstr "CSS 压缩" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "更强大的 HTML 压缩算法" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "HTML 增强压缩" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "您可以缩小页面大小" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "HTML 压缩" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "更新文章或页面时清除缓存文件" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "更新文章" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "发布文章或页面时清除缓存文件" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "新文章发布时" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "为移动端主题创建缓存" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "移动端主题" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "不给移动端用户显示电脑端的缓存页面" #: inc/admin.php:1195 msgid "Mobile" msgstr "移动设备" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "不显示登录用户的缓存版本" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "已登录用户" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "自动创建所有站点的缓存" #: inc/admin.php:1157 msgid "Preload" msgstr "预加载" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "减少 SQL 查询的数量" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "小组件缓存" #: inc/admin.php:1119 msgid "Enable" msgstr "启用" #: inc/admin.php:1118 msgid "Cache System" msgstr "缓存系统" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "每 15 天一次" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "每 7 天一次" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "每 3 天一次" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "每 10 个小时一次" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "每 9 个小时一次" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "每 8 个小时一次" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "每 7 个小时一次" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "每 5 个小时一次" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "每 4 个小时一次" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "每 3 个小时一次" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "每 2 个小时一次" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "每 10 天一次" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "简洁且高效的缓存系统" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "每年一次" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "每月一次" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "每天一次" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "每 6 小时一次" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "每小时一次" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "每小时两次" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "每 15 分钟一次" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "每 5 分钟一次" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "每分钟一次"PKL\NuII4wp-fastest-cache/languages/wp-fastest-cache-en_ZA.monu[<\\] w'      ' 2 B N g    2 0 8 D O _ h .     ; 15 .g       % * 4 = AL   =  / : J V g q x         (;M`s    !*L`x ~/.* $.Et   (   - ;GX9`9 &%!.P?o.- >_ y'     )4 DPi20  : FQaj.;17.i      ' ,6?AN  =! 1< LX is z*=Obu    !,Nbz /.* &.Gv   (   0 >J[9c9 &% !1S?r48SettingsAdd New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CssCombine JsCombine Js PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsdelete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/pages per minutePO-Revision-Date: 2021-02-02 07:22:35+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: en_ZA Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) SettingsAdd New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CSSCombine JSCombine JS PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any CSS file, you have to delete minified CSS filesImage OptimisationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CSSMinify CSS PlusMinify HTMLMinify HTML PlusMinify JSMobileMobile ThemeMore powerful minify CSSMore powerful minify HTMLNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimise Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined CSS filesReduce HTTP requests through combined JS filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JSRestart After CompletedSaveServer TimeSettingsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesTool bar SettingsTwice an HourUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of CSS filesYou can decrease the size of JS filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline CSS and wp-emoji-release.min.jsdelete the fileshas Google Analytics Parametershas WooCommerce Items in Baskethttp://en-za.wordpress.org/plugins/wp-fastest-cache/pages per minutePKL\\ ??4wp-fastest-cache/languages/wp-fastest-cache-es_CO.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Spanish (Colombia) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2021-10-07 04:49:27+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: es_CO\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "" #: templates/preload.php:150 msgid "Sitemaps" msgstr "" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "" #: templates/preload.php:86 msgid "Content Types" msgstr "" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "" #: templates/preload.php:72 msgid "Choose a Method" msgstr "" #: templates/preload.php:56 msgid "Preload Settings" msgstr "" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Guardar" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Cancelar" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Ajustes de la barra de herramientas" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Vaciar la caché de todos los sitios" #: wpFastestCache.php:439 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Vaciar la caché" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Eliminar los recursos JavaScript que bloquean los procesos" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Las opciones han sido guardadas" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "tiene artículos de WooCommerce en el carrito" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "tiene parámetros de Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archivos" #: templates/timeout.php:189 msgid "Server Time" msgstr "Hora del servidor" #: templates/timeout.php:169 msgid "delete the files" msgstr "borrar los archivos" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Contiene" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Es igual a" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Comienza con" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Página de inicio" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Todo" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Asistente para excluir páginas" #: templates/timeout.php:124 msgid "Then" msgstr "Entonces" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Si REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Asistente del tiempo límite de la caché" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Asistente de carga diferida" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Activar Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Por favor, actualiza" #: templates/update_success.php:9 msgid "Success" msgstr "Correcto" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Advertencia" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Añadir una nueva regla" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Solo disponible en la versión premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Elige uno" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "También se eliminarán todos los archivos de la caché" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Si modificas cualquier archivo CSS, tienes que borrar los archivos CSS minimizados" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Carpeta de destino" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Puedes borrar todos los archivos de la caché" #: inc/admin.php:1090 msgid "Exclude" msgstr "Excluir" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimización de imágenes" #: inc/admin.php:1082 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Limpieza de la base de datos" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Ajustes de la CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Excluir JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Excluir CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Excluir cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Excluir agentes de usuario" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Excluir páginas" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Herramienta de optimización de imágenes" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Reglas de límite" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Estadísticas de la caché" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Vaciar la caché de entradas / páginas" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "¿Qué quieres que ocurra después de actualizar una entrada o una página?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Vaciar la caché de paginación" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Vaciar la caché de etiquetas de entradas" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Vaciar la caché de categorías de entradas" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Vaciar toda la caché" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "¿Qué quieres que ocurra después de publicar la nueva entrada?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "Aceptar" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Reiniciar después de completado" #: templates/preload.php:210 msgid "pages per minute" msgstr "páginas por minuto" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Taxonomías personalizadas" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Tipos de contenido personalizado" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Adjuntos" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Etiquetas" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Páginas" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categorías" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Entradas" #: templates/preload.php:102 msgid "Homepage" msgstr "Página de inicio" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Cargar las imágenes e iframes cuando entren en la visualización de los navegadores" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Cargar las fuentes de Google de forma asíncrona" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Fuentes de Google" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Bloqueo de procesado de JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Puedes eliminar los emojis CSS integrados y el archivo «wp-emoji-release.min.js»" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Desactivar los emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Reducir el tiempo de carga de la página para los visitantes repetitivos" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Caché del navegador" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Reducir el tamaño de los archivos enviados por tu servidor" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combine Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combinar JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Puedes reducir el tamaño de los archivos JS" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minimizar JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combinar CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Más potente minimización CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minify Css Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Puedes reducir el tamaño de los archivos CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minimizar CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Más potente minimización HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minify HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Puedes reducir el tamaño de la página" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minimizar HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Vaciar los archivos de la caché cuando se actualiza una entrada o página" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Actualizar la entrada" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Vaciar los archivos de la caché cuando se publica una entrada o página" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nueva entrada" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Crear la caché para el tema para móviles" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Tema para móviles" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "No mostrar la versión de escritorio de la caché en los dispositivos móviles" #: inc/admin.php:1195 msgid "Mobile" msgstr "Móvil" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "No mostrar la versión de la caché para usuarios conectados" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Usuarios conectados" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Crear automáticamente la caché de todo el sitio" #: inc/admin.php:1157 msgid "Preload" msgstr "Precargar" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Reducir el número de consultas SQL" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget de caché" #: inc/admin.php:1119 msgid "Enable" msgstr "Activar" #: inc/admin.php:1118 msgid "Cache System" msgstr "Sistema de caché" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Una vez cada 15 días" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Una vez cada 7 días" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Una vez cada 3 días" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Una vez cada 10 horas" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Una vez cada 9 horas" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Una vez cada 8 horas" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Una vez cada 7 horas" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Una vez cada 5 horas" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Una vez cada 4 horas" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Una vez cada 3 horas" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Una vez cada 2 horas" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Una vez cada 10 días" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "El sistema WP Cache más simple y rápido" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "https://es-co.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Una vez al año" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Una vez al mes" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Una vez al día" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Una vez cada 6 horas" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Una vez por hora" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Dos veces por hora" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Una vez cada 15 minutos" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Una vez cada 5 minutos" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Una vez cada 1 minuto"PKL\u@@4wp-fastest-cache/languages/wp-fastest-cache-sv_SE.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Swedish # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-12-09 10:10:54+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: sv_SE\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "Användarroller" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "Minst en webbplatskarta måste läggas till" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "Du kan anpassa de avancerade inställningarna via denna sektion." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Avancerade inställningar" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Du kan specificera webbplatskartor som ska användas för förladdning." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Webbplatskartor" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Du kan välja för vilket innehåll förladdning ska användas, och även ange dess ordning." #: templates/preload.php:86 msgid "Content Types" msgstr "Innehållstyper" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "I denna sektion kan du välja vilken metod du vill använda för förladdningsfunktionen." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Välj en metod" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Förladdningsinställningar" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Vissa js-källor laddas inte förrän du rullar sidan eller flyttar musen" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Fördröj JS" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "Alternativ för WP Fastest Cache" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "har Yandex Click ID-parametrar" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Rensar specifika sidor" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Spara" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Avbryt" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Inställningar för verktygsfält" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Rensa cache för alla webbplatser" #: wpFastestCache.php:439 msgid "Settings" msgstr "Inställningar" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Rensa cache" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Eliminera renderingsblockerande JavaScript-resurser" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Alternativ har sparats" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "har Woocommerce-varor i varukorgen" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "har Google Analytics-parametrar" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Arkiv" #: templates/timeout.php:189 msgid "Server Time" msgstr "Servertid" #: templates/timeout.php:169 msgid "delete the files" msgstr "ta bort filerna" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Innehåller" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Är lika med" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Startar med" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Startsida" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Alla" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Guide för exkludering av sida" #: templates/timeout.php:124 msgid "Then" msgstr "Sedan" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Om REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Guide för cache-timeout" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Inställningar för uppskjuten inläsning" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Aktivera Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Uppdatera" #: templates/update_success.php:9 msgid "Success" msgstr "Lyckades" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Varning" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Lägg till ny regel" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "Rensa cache och minifierad CSS/JS" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Endast tillgängligt i premiumversion" #: templates/timeout.php:141 msgid "Choose One" msgstr "Välj en" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Alla cache-filer kommer också att tas bort" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Om du modifierar någon CSS-fil måste du ta bort minifierade CSS-filer" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Målmapp" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Du kan ta bort alla cache-filer" #: inc/admin.php:1090 msgid "Exclude" msgstr "Exkludera" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Bildoptimering" #: inc/admin.php:1082 msgid "Settings" msgstr "Inställningar" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Databasrensning" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN-inställningar" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Exkludera JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Exkludera CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Exkludera cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Exkludera användaragenter" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Exkludera sidor" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Bildoptimeringsverktyg" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Timeout-regler" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Cachestatistik" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Rensa cache för inlägg/sida" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Vad vill du ska hända efter att ha uppdaterat ett inlägg eller en sida?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Rensa cache för paginering" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Rensa cache för inläggsetiketter" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Rensa cache för inläggskategorier" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Rensa cache för startsida" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Rensa all cache" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Vad vill du hända efter att du publicerat det nya inlägget?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Starta om efter att ha slutförts" #: templates/preload.php:210 msgid "pages per minute" msgstr "sidor per minut" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Anpassade taxonomier" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Anpassade inläggstyper" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Bilagor" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Etiketter" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Sidor" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Kategorier" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Inlägg" #: templates/preload.php:102 msgid "Homepage" msgstr "Startsida" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Minska HTTP-förfrågningar genom kombinerade js-filer" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Ladda bilder och iframes när de kommer in i webbläsarens visningsområde" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Ladda Google Fonts asynkront" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google Fonts" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Javascript som blockerar rendering" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Du kan ta bort emoji inline CSS och wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Inaktivera emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Minska sidans laddningstid för upprepade besökare" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Webbläsarcaching" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Minska storleken på filer som skickas från din server" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Kombinera Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Kombinera Js" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Du kan minska storleken på js-filer" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minifiera Js" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Minska HTTP-förfrågningar genom kombinerade CSS-filer" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Kombinera CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Kraftfullare minifierad CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minifiera CSS Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Du kan minska storleken på CSS-filer" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minifiera CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Kraftfullare minifierad html" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minifiera HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Du kan minska storleken på sidan" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minifiera HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Rensa cache-filer när ett inlägg eller en sida uppdateras" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Uppdatera inlägg" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Rensa cache-filer när ett inlägg eller en sida publiceras" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nytt inlägg" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Skapa cache för mobiltema" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Mobiltema" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Visa inte den cachade versionen för stationär dator till mobila enheter" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobil" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Visa inte den cachade versionen för inloggade användare" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Inloggade användare" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Skapa cache för hela webbplatsen automatiskt" #: inc/admin.php:1157 msgid "Preload" msgstr "Förhandsladda" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Minska antalet SQL-frågor" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget-cache" #: inc/admin.php:1119 msgid "Enable" msgstr "Aktivera" #: inc/admin.php:1118 msgid "Cache System" msgstr "Cachesystem" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "En gång var 15:e dag" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "En gång var 7:e dag" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "En gång var 3:e dag" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "En gång var 10:e timme" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "En gång var 9:e timme" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "En gång var 8:e timme" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "En gång var 7:e timme" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "En gång var 5:e timme" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "En gång var 4:e timme" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "En gång var 3:e timme" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "En gång varannan timme" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "En gång var 10:e dag" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Det enklaste och snabbaste cachesystemet för WordPress" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "En gång om året" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "En gång i månaden" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "En gång om dagen" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "En gång var 6:e timme" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "En gång i timmen" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Två gånger i timmen" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "En gång var 15:e minut" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "En gång var 5:e minut" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "En gång per minut"PKL\%((4wp-fastest-cache/languages/wp-fastest-cache-gl_ES.monu[| | }   '  "   * 7 H U j q |        : Y 2r 0     , .J y     ; 1 .4 c m t       A[ nz =  # 4> ERk-@Sh{    !-E KY_g/x.* .#Re} F  (7 <J [ iu99 =(&f%!?34UhT$Db. 3E1J|+$, 5AJ[r$"& (,=*jGI' F S_ow(. 3>HS98  !. 7D U aMG _j.I !1@ Q^ex   * C Y o        !!!7!H!X!h!#y!%!!!!! "";#";_"B"""9#;#V#v#}## #M# ## $$*#$N$U$m$$$$$ $9$I*%t%A%(%'%"&(;&Rd&D&^&f[''#'&'' (.H(w((SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-11-25 07:53:04+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: gl_ES Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) AxustesEngadir unha nova regraAxustes avanzadosTodoTamén se eliminarán todos os arquivos da cachéArquivosHai que engadir polo menos un mapa do sitioAdxuntosCaché do navegadorAxustes da CDNEstatísticas da cachéSistema de cachéAsistente do tempo límite da cachéCancelarCategoríasElixe unElixe un métodoBaleirar toda a cachéBaleirar a cachéBaleirar a caché e minimizar CSS/JSVaciar a caché de todos os sitiosBaleirar a caché da páxina de inicioBaleirar a caché de paxinaciónBaleirar a caché de entradas / páxinasBaleirar a caché de categorías de entradasBaleirar a caché de etiquetas de entradasBaleirar os arquivos da caché cando se publica unha entrada ou páxinaBaleirar os arquivos da caché cando se actualiza unha entrada ou páxinaBaleirar páxinas específicasCombinar CSSCombinar JSCombine Js PlusConténTipos de contidoCrear a caché para o tema para móbilesCrear automaticamente a caché de todo o sitioTipos de contido personalizadoTaxonomías personalizadasLimpeza da base de datosAprazar JsDesactivar os emojisNon mostrar a versión de escritorio da caché nos dispositivos móbilesNon mostrar a versión da caché para usuarios conectadosEliminar os recursos JavaScript que bloquean os procesosEmre VonaActivarActivar GzipExcluírExcluír CSSExcluír cookiesExcluír JSAsistente para excluír páxinasExcluír páxinasExcluír axentes de usuarioFontes de GoogleGzipPáxina de inicioPáxina de inicioSe REQUEST_URISe modificas calquera arquivo CSS, tes que borrar os arquivos CSS minimizadosOptimización de imaxesé igual aAsistente de carga diferidaCargar as fontes de Google de forma asíncronaCargar as imaxes e iframes cando entren na visualización dos navegadoresUsuarios conectadosMinimizar CSSMinify Css PlusMinimizar HTMLMinify HTML PlusMinimizar JSMóbilTema para móbilesMinimización CSS máis potenteMinimización HTML máis potenteNova entradaAceptarUnha vez cada 1 minutoUnha vez cada 10 díasUnha vez cada 10 horasUnha vez cada 15 díasUnha vez cada 15 minutosUnha vez cada 2 horasUnha vez cada 3 díasUnha vez cada 3 horasUnha vez cada 4 horasUnha vez cada 5 horasUnha vez cada 5 minutosUnha vez cada 6 horasUnha vez cada 7 díasUnha vez cada 7 horasUnha vez cada 8 horasUnha vez cada 9 horasUnha vez ao díaUnha vez ao mesUnha vez ao anoUnha vez á horaSó dispoñible na versión premiumFerramenta de optimización de imaxesAs opcións foron gardadasPáxinasPor favor, actualizaEntradasPrecargarAxustes de precargaReducir as solicitudes HTTP mediante arquivos JS combinadosReducir as solicitudes HTTP mediante arquivos JS combinadosReducir o tempo de carga da páxina para os visitantes repetitivosReducir o número de consultas SQLReducir o tamaño dos arquivos enviados polo teu servidorBloqueo do procesado de JSReiniciar despois de completadoGardarHora do servidorAxustesMapa do sitioAlgunhas orixes de js non cargarán ata que se faga scroll ou se mova el ratoComeza conCorrectoEtiquetasCarpeta de destinoO sistema WP Caché máis simple e rápidoEntónRegras de tempo límiteAxustes da barra de ferramentasDúas veces á horaActualizar a entradaWP Fastest CacheOpcións de WP Fastest CacheAdvertenciaQue queres que ocorra despois de publicar a nova entrada?Que queres que ocorra despois de actualizar unha entrada ou unha páxina?Widget de cachéPodes personalizar os axustes avanzados a través desta sección.Podes reducir o tamaño dos arquivos CSSPodes reducir o tamaño dos arquivos JSPodes reducir o tamaño da páxinaPodes borrar todos os arquivos da cachéPodes eliminar os emojis integrados en CSS e o arquivo «wp-emoji-release.min.js»Podes especificar mapas do sitio que se usarán para a carga previa.Podes especificar os contidos que se empregarán para a carga previa e tamén podes ordenalos.Podes especificar o método que queres que use a característica de precarga a través desta sección.borrar os arquivosten parámetros de Google Analyticsten artigos de WooCommerce no carriñoten parámetros de ID de clic de Yandexhttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/páxinas por minutoPKL\_m 3''4wp-fastest-cache/languages/wp-fastest-cache-tr_TR.monu[l l m   '  "   ' 8 E Z a l w       ) 2B 0u     . I [ m ~  ; 1 . 3 = D P X d t      A + >J ]=~    ";U^au#8K]p    ! )/7/H.x* ."5M R^gFp  (  + 9EVo9w9 =&6%]!?3U8T2.Q & 8%Bhn  #   )$=#b$+.,A3;u  #,?lI2:O & @M R \fjx :GP    8 Wbh{  - > O ` q       !!(! 1!=!:T!9!D!"4*"_"%y"""""T"## 2# ># H#'V#~### ####$;$AK$$;$0$/%'?%$g%K%N%\'&h&&5& 2'$S'.x'''SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-06-16 07:39:05+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Generator: GlotPress/4.0.1 Language: tr Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) AyarlarYeni Kural EkleGelişmiş AyarlarTümüTüm önbellek dosyaları da silinecekArşivlerEn az bir site haritası eklenmelidirEklerTarayıcı ÖnbelleğiCDN AyarlarıÖnbellek İstatistikleriÖnbellekÖnbellek Zaman Aşımı Sihirbazıİptal EtKategorilerBirini SeçBir Yöntem SeçinTüm Önbelleği TemizleÖnbelleği TemizleTüm Sitelerin Önbelleğini TemizleAna Sayfanın Önbelleğini TemizleSayfalandırma Önbelleğini TemizleYazı ya da sayfanın önbelleğini temizleGönderi Kategorilerinin Önbelleğini TemizleGönderi Etiketlerinin Önbelleğini TemizleYeni bir yazı veya sayfa yayımlandığında önbelleği temizleBir yazı ya da sayfa düzenlendiğinde önbelleği temizleBelirli Sayfaları TemizleCSS BirleştirmeJs BirleştirJs Birleştir Ekstraİçerenİçerik TürleriMobil tema için önbellek oluşturTüm sitenin önbelleğini otomatik oluşturÖzel Yazı TürleriÖzel SınıflandırmalarVeritabanı TemizlemeJS'leri GeciktirEmojileri KapatMasaüstünden mobil cihazlara önbelleğe alınmış sürümü göstermeGiriş yapan kullanıcılara önbelleği göstermeOluşturmayı engelleyen JavaScript kaynaklarını kaldırEmre VonaEtkinGzip AktivasyonuHariçHariç Tutulan CSSHariç Tutulan ÇerezlerHariç Tutulan JSSayfa Hariç Tutma SihirbazıHariç Tutulan SayfalarHariç Tutulan User-AgentGoogle FontsGzipAna SayfaAna SayfaEğer REQUEST_URIEğer bir css dosyası değiştirdiyseniz, küçültülmüş olan css/js dosyalarını da temizlemelisinizResim OptimizasyonuEşit iseLazy Load AyarlarıGoogle Fontlarını eş zamansız (asenkron) olarak yükleResimleri ve iframleri tarayıcının görünen alanına gelince yükleGiriş Yapan KullanıcılarCss KüçültCSS Küçült EkstraHTML KüçültHTML Küçült EkstraJS KüçültMobilMobil TemaDaha güçlü CSS küçültmeDaha güçlü HTML küçültmeYeni yazıTamam1 Dakikada Bir Kez10 Günde Bir Kez10 Saatte Bir Kez15 Günde Bir Kez15 Dakikada Bir Kez2 Saatte Bir Kez3 Günde Bir Kez3 Saatte Bir Kez4 Saatte Bir Kez5 Saatte Bir Kez5 Dakikada Bir Kez6 Saatte Bir Kez7 Günde Bir Kez7 Saatte Bir Kez8 Saatte Bir Kez9 Saatte Bir KezGünde Bir KezAyda Bir KezYılda Bir kezSaatte Bir KezSadece Premium versiyonda mevcutResim Optimizasyon AracıAyarlar KaydedildiSayfalarLütfen GüncelleyinYazılarÖnyüklemeÖn Yükleme AyarlarıCSS dosyalarını birleştirerek HTTP isteklerini azaltınJS dosyalarını birleştirerek HTTP isteklerini azaltınTekrar gelen ziyaretçiler için sayfa yükleme sürelerini azaltınSQL sorgu sayısını azaltSunucudan gönderilen dosyaların boyutunu küçültOluşturma Engelleyici JsTamamlandıktan Sonra Yeniden BaşlatKaydetSunucu ZamanıAyarlarSite haritalarıBazı js kaynakları fareyi kaydırana veya hareket ettirene kadar yüklenmeyecektirİle BaşlayanBaşarılıEtiketlerHedef klasörEn basit ve en hızlı WP Cache sistemiÖyleyseZaman Aşımı KurallarıAraç Çubuğu AyarlarıSaatte 2 KezYazı GüncellemeWP Fastest CacheWP Fastest Cache SeçenekleriUyarıYeni yazı yayımlandıktan sonra ne olmasını istiyorsun?Yazı veya sayfa güncellendikten sonra ne olmasını istiyorsun?Bileşen ÖnbelleğiGelişmiş ayarları bu bölümden özelleştirebilirsiniz.CSS dosyalarının boyununu küçültebilirsinizJS dosyalarının boyununu küçültebilirsinizSayfanın boyutunu küçültebilirsinizTüm önbelleği temizleyebilirsinizEmoji inline CSS ve wp-emoji-release.min.js kaynağını kaldırabilirsinizÖn yükleme için kullanılacak olan site haritalarını belirleyebilirsiniz.Ön yükleme için kullanılacak içerikleri belirleyebilir ve bunları sıralayabilirsiniz.Ön yükleme özelliğinin kullanmasını istediğiniz yöntemi bu bölüm üzerinden belirtebilirsiniz.dosyaları silparametre olarak Google Analytics parametreleri varsasepette WooCommerce ögeleri varparametre olarak Yandex Click ID varhttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/dakika başına sayfaPKL\, 4wp-fastest-cache/languages/wp-fastest-cache-id_ID.monu[<\\] w'      ' 2 B N g    2 0 8 D O _ h .     ; 15 .g       % * 4 = AL   =  / : J V g q x         (;M`s    !*L`x ~/.* $.Et   (   - ;GX9`9 &%!.P?o.->[w$ & /: LXu!=7% ] kx +>,6k:     (6Qd }Z#6!K@m    !!"C fsx#7Kau  ""7NTck7s6834h{   - (;J[ lCwH (':%b'A #&# 2J } SettingsAdd New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CssCombine JsCombine Js PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsdelete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/pages per minutePO-Revision-Date: 2021-01-26 07:03:23+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Generator: GlotPress/4.0.1 Language: id Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) PengaturanTambahkan Aturan BaruSemuaSemua berkas cache juga akan dihapusArsipLampiranCaching BrowserPengaturan CDNStatistik CacheSistem CachePanduan Batas waktu CacheBatalkanKategoriPilih satuHapus Semua CacheHapus CacheHapus Cache dari Semua SitusHapus Cache PaginasiHapus Cache Artikel / HalamanHapus Cache dari Kategori ArtikelHapus Cache dari Tag ArtikelHapus berkas cache ketika artikel atau halaman dipublikasikanHapus berkas cache saat artikel atau halaman diperbaruiGabungkan CSSGabungkan JsGabungkan Js PlusMengandungBuat cache untuk tema ponselBuat cache dari semua situs secara otomatisTipe Artikel KhususTaksonomi khususPembersihan Basis dataNonaktifkan EmojiJangan tampilkan versi cache untuk desktop ke perangkat ponselJangan tampilkan versi cache untuk pengguna yang loginHilangkan sumber daya JavaScript yang memblokir perenderanEmre VonaAktifkanAktifkan GzipKecualikanKecualikan CSSKecualikan kukiKecualikan JSKecualikan Panduan HalamanKecualikan HalamanKecualikan Agen-PenggunaGoogle FontsGzipHalaman BerandaBerandaJika REQUEST_URIJika Anda memodifikasi berkas css apa pun, Anda harus menghapus berkas css yang diperkecilOptimasi GambarAdalah sama denganPengaturan Lazy LoadMuat Google Fonts secara asinkronMuat gambar dan iframe saat mereka memasuki area pandang browserPengguna yang loginPerkecil CSSPerkecil CSS PlusPerkecil HTMLPerkecil HTML PlusPerkecil JsPonselTema PonselMemperkecil CSS dengan lebih kuatMemperkecil HTML dengan lebih kuatArtikel BarubaikSetiap 1 Menit SekaliSetiap 10 Hari SekaliSetiap 10 Jam SekaliSetiap 15 Hari SekaliSetiap 15 Menit SekaliSetiap 2 Jam SekaliSetiap 3 Hari SekaliSetiap 3 Jam SekaliSetiap 4 Jam SekaliSetiap 5 Jam SekaliSetiap 5 Menit SekaliSetiap 6 Jam SekaliSetiap 7 Hari SekaliSetiap 7 Jam SekaliSetiap 8 Jam SekaliSetiap 9 Jam SekaliSekali SehariSekali SebulanSekali SetahunSekali SejamHanya tersedia dalam versi PremiumAlat Optimasi GambarPilihan telah disimpanLamanMohon perbaruiArtikelPramuatKurangi permintaan HTTP dengan menggabungkan berkas CSSKurangi permintaan HTTP dengan menggabungkan berkas JSKurangi waktu pemuatan halaman untuk pengunjung berulangKurangi jumlah query SQLKurangi ukuran berkas yang dikirim dari server AndaRender Blocking JsMulai Ulang Setelah SelesaiSimpanWaktu serverPengaturanDimulai DenganSuksesTagFolder targetSistem WP Cache paling sederhana dan tercepatKemudianAturan Batas waktuPengaturan toolbarDua Kali SejamPerbarui ArtikelWP Fastest CachePeringatanApa yang Anda inginkan terjadi setelah memublikasikan artikel baru?Apa yang Anda inginkan terjadi setelah memperbarui artikel atau halaman?Cache WidgetAnda dapat memperkecil ukuran berkas cssAnda dapat memperkecil ukuran berkas jsAnda dapat memperkecil ukuran halamanAnda dapat menghapus semua berkas cacheAnda dapat menghapus emoji inline css dan wp-emoji-release.min.jshapus berkasmemiliki Parameter Google Analyticsmemiliki Item Woocommerce di Keranjanghttps://id.wordpress.org/plugins/wp-fastest-cache/halaman per menitPKL\C??4wp-fastest-cache/languages/wp-fastest-cache-hu_HU.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Hungarian # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2021-06-26 15:12:34+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: hu\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "" #: templates/preload.php:150 msgid "Sitemaps" msgstr "" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "" #: templates/preload.php:86 msgid "Content Types" msgstr "" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "" #: templates/preload.php:72 msgid "Choose a Method" msgstr "" #: templates/preload.php:56 msgid "Preload Settings" msgstr "" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Mentés" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Mégse" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Eszköztár beállításai" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Az összes webhely gyorsítótárának törlése" #: wpFastestCache.php:439 msgid "Settings" msgstr "Beállítások" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Gyorsítótár törlése" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "A megjelenítést blokkoló JavaScript-erőforrások kiküszöbölése" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Beállítások elmenve" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "Woocommerce tételei vannak a kosárban" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "Google Analytics paraméterei vannak" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archívum" #: templates/timeout.php:189 msgid "Server Time" msgstr "Kiszolgáló ideje" #: templates/timeout.php:169 msgid "delete the files" msgstr "fájlok törlése" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Tartalmazza ezt" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Egyenlő ezzel" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Ezzel kezdődik" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Kezdőlap" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Összes" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Az Oldal varázsló kizárása" #: templates/timeout.php:124 msgid "Then" msgstr "Majd" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Ha REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Gyorsítótár időtúllépési varázslója" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Lazy Load (lusta betöltés) beállítások" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Gzip engedélyezése" #: templates/update_now.php:9 msgid "Please Update" msgstr "Kérjük, frissítsen" #: templates/update_success.php:9 msgid "Success" msgstr "Siker" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Figyelmeztetés" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Új szabály hozzáadása" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Csak Premium verzióban érhető el" #: templates/timeout.php:141 msgid "Choose One" msgstr "Válasszon egyet" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Az összes gyorsítótárfájl is eltávolításra kerül" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Ha egy CSS fájlt módosít, törölnie kell a zsugorított CSS fájlokat" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Célmappa" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Törölheti az összes gyorsítótárfájlt" #: inc/admin.php:1090 msgid "Exclude" msgstr "Kizárás" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Képoptimalizálás" #: inc/admin.php:1082 msgid "Settings" msgstr "Beállítások" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Adatbázis-tisztítás" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN-beállítások" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "JS kizárása" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "CSS kizárása" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Sütik kizárása" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Felhasználói ügynökök kizárása" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Oldalak kizárása" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Képoptimalizáló eszközt" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Időtúllépés szabályai" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Gyorsítótár-statisztika" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Bejegyzés / oldal gyorsítótárának törlése" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Mi történjék egy bejegyzés vagy oldal frissítése után?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Az oldalszámozás gyorsítótárának törlése" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "A bejegyzéscímkék gyorsítótárának törlése" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "A bejegyzéskategóriák gyorsítótárának törlése" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "A teljes gyorsítótár törlése" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Mi történjék az új bejegyzés közzététele után?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Újraindítás a befejezés után" #: templates/preload.php:210 msgid "pages per minute" msgstr "oldal / perc" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Egyéni taxonómiák" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Egyéni bejegyzéstípusok" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Csatolmányok" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Címkék" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Oldalak" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Kategóriák" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Bejegyzések" #: templates/preload.php:102 msgid "Homepage" msgstr "Kezdőoldal" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "HTTP kérések csökkentése kombinált JavaScript fájlokkal" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Képek és iframe-ek betöltése, amikor belépnek a böngésző nézetablakába" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Google betűtípusok aszinkron betöltése" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google betűtípusok" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Megjelenítést blokkolós JavaScript" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Eltávolíthatja az emoji inline CSS-t és a wp-emoji-release.min.js fájlt" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Emojik letiltása" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Az oldal betöltési idejének csökkentése az ismételt látogatóknak" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Böngésző-gyorsítótárazás" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Csökkentse a szerverről küldött fájlok méretét" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Js kombinálása +" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Js kombinálása" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Csökkentheti a JavaScript fájlok méretét" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Js zsugorítása" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "HTTP kérések csökkentése kombinált CSS fájlokkal" #: inc/admin.php:1291 msgid "Combine Css" msgstr "CSS kombinálása" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Erőteljesebb CSS-zsugorítás" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "CSS-zsugorítás +" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Csökkentheti a CSS-fájlok méretét" #: inc/admin.php:1270 msgid "Minify Css" msgstr "CSS-zsugorítás" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Erőteljesebb HTML-zsugorítás" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "HTML-zsugorítás +" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Csökkentheti az oldalak méretét" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "HTML-zsugorítás" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Gyorsítótárfájlok törlése egy bejegyzés vagy oldal frissítésekor" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Bejegyzés frissítése" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Gyorsítótárfájlok törlése egy bejegyzés vagy oldal közzétételekor" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Új bejegyzés" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Gyorsítótár készítése mobil témához" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Mobil téma" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Ne mutassa meg a gyorsítótárazott asztali verziót mobil eszközöknek" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobil" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Ne mutassa a gyorsítótárazott verziót a bejelentkezett felhasználóknak" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Bejelentkezett felhasználók" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "A teljes webhely gyorsítótárának automatikus létrehozása" #: inc/admin.php:1157 msgid "Preload" msgstr "Előtöltés" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "SQL-lekérdezések számának csökkentése" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget gyorsítótár" #: inc/admin.php:1119 msgid "Enable" msgstr "Engedélyezés" #: inc/admin.php:1118 msgid "Cache System" msgstr "Gyorsítótárazó-rendszer" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "15 naponta" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "7 naponta" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "3 naponta" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "10 óránként" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "9 óránként" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "8 óránként" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "7 óránként" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "5 óránként" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "4 óránként" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "3 óránként" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "2 óránknét" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "10 naponta" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "A legegyszerűbb és leggyorsabb WordPress Cache gyorsítótárazó rendszer" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Évente" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Havonta" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Naponta" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "6 óránként" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Óránként" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Óránként kétszer" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "15 percenként" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "5 percenként" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Percenként"PKL\/:WBWB4wp-fastest-cache/languages/wp-fastest-cache-de_DE.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in German # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-12-18 09:17:03+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: de\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "Das WP-Fastest-Cache-Menü in der Admin-Werkzeugleiste ist für die unten ausgewählten Benutzerrollen sichtbar." #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "Benutzerrollen" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "Mindestens eine Sitemap muss hinzugefügt werden" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "In diesem Abschnitt kannst du die erweiterten Einstellungen anpassen." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Erweiterte Einstellungen" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Du kannst festlegen, welche Sitemaps für das Preloading verwendet werden." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Sitemaps" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Du kannst die Inhalte für das Preloading festlegen und auch sortieren." #: templates/preload.php:86 msgid "Content Types" msgstr "Inhaltstypen" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "In diesem Abschnitt kannst du festlegen, welche Methode die Preload-Funktion verwenden soll." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Wähle eine Methode" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Preload-Einstellungen" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Einige JS-Quellen werden erst geladen, wenn gescrollt oder die Maus bewegt wird" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "JS verzögern" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "WP-Fastest-Cache-Optionen" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "hat Yandex-Click-ID-Parameter" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Bestimmte Seiten löschen" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Speichern" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Abbrechen" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Werkzeugleisten-Einstellungen" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Cache aller Websites leeren" #: wpFastestCache.php:439 msgid "Settings" msgstr "Einstellungen" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Cache leeren" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Beseitigt JavaScript-Ressourcen, die das Rendering blockieren" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Optionen wurden gespeichert" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "hat Woocommerce-Elemente im Warenkorb" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "hat Google-Analytics-Parameter" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archive" #: templates/timeout.php:189 msgid "Server Time" msgstr "Serverzeit" #: templates/timeout.php:169 msgid "delete the files" msgstr "die Dateien löschen" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Beinhaltet" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Ist gleich" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Beginnt mit" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Homepage" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Alles" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Seiten-Ausschluss-Assistent" #: templates/timeout.php:124 msgid "Then" msgstr "Dann" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Falls REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Cache-Zeitüberschreitungsassistent" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Einstellungen für Verzögertes Laden" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Gzip aktivieren" #: templates/update_now.php:9 msgid "Please Update" msgstr "Bitte aktualisieren" #: templates/update_success.php:9 msgid "Success" msgstr "Erfolg" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Warnung" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Neue Regel hinzufügen" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "Cache und minimiertes CSS/JS leeren" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Nur verfügbar in der Premium-Version" #: templates/timeout.php:141 msgid "Choose One" msgstr "Wähle eins" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Auch alle Cache-Dateien werden dabei gelöscht" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Falls du eine CSS-Datei veränderst, musst du minimierte CSS-Dateien löschen" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Zielverzeichnis" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Du kannst alle Cache-Dateien löschen" #: inc/admin.php:1090 msgid "Exclude" msgstr "Ausschließen" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Bildoptimierung" #: inc/admin.php:1082 msgid "Settings" msgstr "Einstellungen" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Datenbank aufräumen" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN-Einstellungen" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "JS ausschließen" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "CSS ausschließen" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Cookies ausschließen" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "User Agents ausschließen" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Seiten ausschließen" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Werkzeug zur Bildoptimierung" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Zeitüberschreitungsregeln" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Cache-Statistiken" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Cache von Beitrag/Seite leeren" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Was soll geschehen, nachdem ein Beitrag oder eine Seite aktualisiert wurde?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Cache von Seitennummerierungen leeren" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Cache von Beitrags-Schlagwörtern leeren" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Cache von Beitrags-Kategorien leeren" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Cache der Homepage leeren" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Alle Caches löschen" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Was soll geschehen, nachdem ein neuer Beitrag veröffentlicht wurde?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Neustart nach Abschluss" #: templates/preload.php:210 msgid "pages per minute" msgstr "Seiten pro Minute" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Individuelle Taxonomien" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Individuelle Inhaltstypen" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Anhänge" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Schlagwörter" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Seiten" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Kategorien" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Beiträge" #: templates/preload.php:102 msgid "Homepage" msgstr "Homepage" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "HTTP-Anfragen durch kombinierte JS-Dateien reduzieren" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Bilder und iFrames laden, wenn diese in den Darstellungsbereich des Browsers gelangen" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Google Fonts asynchron laden" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google Fonts" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Render-Blocking-JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Du kannst das Inline-CSS für Emojis und wp-emoji-release.min.js entfernen" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Emojis deaktivieren" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Die Seitenladezeiten für wiederkehrende Besucher reduzieren" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Browser-Caching" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Die Größe der Dateien, die von deinem Server ausgeliefert werden, reduzieren" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "JS minimieren Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "JS kombinieren" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Du kannst die Größe von JS-Dateien reduzieren" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "JS minimieren" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "HTTP-Anfragen durch kombinierte CSS-Dateien reduzieren" #: inc/admin.php:1291 msgid "Combine Css" msgstr "CSS kombinieren" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Stärkeres Minimieren von CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "CSS minimieren Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Du kannst die Größe von CSS-Dateien verringern" #: inc/admin.php:1270 msgid "Minify Css" msgstr "CSS minimieren" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Stärkeres Minimieren von HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "HTML minimieren Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Du kannst die Größe der Seite verringern" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "HTML minimieren" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Cache leeren, wenn ein Beitrag oder eine Seite aktualisiert wird" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Aktualisierter Beitrag" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Cache leeren, wenn ein Beitrag oder eine Seite veröffentlicht wird" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Neuer Beitrag" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Cache für Theme für Mobilgeräte erstellen" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Theme für Mobilgeräte" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Die zwischengespeicherte Version für den Desktop nicht auf Mobilgeräten anzeigen" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobilgeräte" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Die zwischengespeicherte Version nicht für angemeldete Benutzer anzeigen" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Angemeldete Benutzer" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Den Cache für die gesamte Website automatisch erstellen" #: inc/admin.php:1157 msgid "Preload" msgstr "Vorladen" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Die Anzahl an SQL-Anfragen reduzieren" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget-Cache" #: inc/admin.php:1119 msgid "Enable" msgstr "Aktivieren" #: inc/admin.php:1118 msgid "Cache System" msgstr "Cache-System" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Einmal alle 15 Tage" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Einmal alle 7 Tage" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Einmal alle 3 Tage" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Einmal alle 10 Stunden" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Einmal alle 9 Stunden" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Einmal alle 8 Stunden" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Einmal alle 7 Stunden" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Einmal alle 5 Stunden" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Einmal alle 4 Stunden" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Einmal alle 3 Stunden" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Einmal alle 2 Stunden" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Einmal alle 10 Tage" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Das einfachste und schnellste Cache-System für WordPress" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://de.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Einmal pro Jahr" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Monatlich" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Täglich" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Einmal alle 6 Stunden" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Einmal pro Stunde" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Zweimal pro Stunde" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Einmal alle 15 Minuten" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Einmal alle 5 Minuten" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Einmal pro Minute"PKL\6Y)Y)4wp-fastest-cache/languages/wp-fastest-cache-ko_KR.monu[    '  " . : J W h u       % ? Z y 2 0    % 5 > L .j      ; 1" .T       !*A9{  =  ' 7C T^ er(:M`s    !9Me ky/.* ".Cr F  `.(    +939m =&%!?a?3UTJ. <\m ( 5 4A U `n  %$;!Z'|'!CH2{  $1 !;]{HD,W      ) . ;HJ^*CU lw       + < P a r        !!'!:!L!]!n!%!!! !! " "!"16"0h"2""+"#%#># E#S# Z#rg#### #x $.$ $$$$%%(%9%Q%CX%N% %K%0E&/v&,&3&U'F]'^'[(_(-p(3($(.(&)F)SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below.The simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostUser RolesWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-12-26 05:50:44+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Generator: GlotPress/4.0.1 Language: ko_KR Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) 설정새 규칙 추가고급 설정모두모든 캐시 파일도 제거됩니다.아카이브사이트맵을 하나 이상 추가해야 합니다.첨부파일브라우저 캐싱CDN 설정캐시 통계시스템 캐시캐시 시간 초과 마법사취소카테고리선택방법 선택모든 캐시 지우기캐시 지우기캐시 지우기 및 축소된 CSS/JS모든 사이트의 캐시 지우기홈 페이지 캐시 지우기페이지 매김 캐시 지우기게시물/페이지의 캐시 지우기게시물 카테고리 캐시 지우기게시물 태그 캐시 지우기게시물 또는 페이지가 게시될 때 캐시 파일 지우기게시물이나 페이지가 업데이트될 때 캐시 파일 지우기특정 페이지 지우기CSS 결합Js 결합Js 결합 플러스다음을 포함함콘텐츠 유형모바일 테마용 캐시 만들기모든 사이트의 캐시를 자동으로 생성사용자 정의 게시물 유형사용자 정의 택소노미데이터베이스 정리자바스크립트 지연이모티콘 비활성화데스크톱용 캐시 버전을 모바일 기기에 표시하지 않음로그인한 사용자에게 캐시된 버전을 표시하지 않음렌더링 차단 JavaScript 리소스 제거Emre Vona활성화Gzip 활성화제외CSS 제외쿠키 제외JS 제외페이지 제외 마법사페이지 제외사용자 에이전트 제외구글 폰트Gzip홈페이지홈페이지REQUEST_URI인 경우CSS 파일을 수정하면 축소된 CSS 파일을 삭제해야 합니다.이미지 최적화다음과 동일함지연 로드 설정구글 폰트를 비동기식으로 로드브라우저 뷰포트에 들어갈 때 이미지 및 iframe 로드로그인한 사용자CSS 축소CSS 축소 플러스HTML 축소HTML 축소 플러스JS 축소모바일모바일 테마더 강력한 CSS 축소더 강력한 HTML 축소새 게시물확인1분에 한 번10일에 한 번10시간에 한 번15일에 한 번15분에 한 번2시간에 한 번3일에 한 번3시간에 한 번4시간에 한 번5시간에 한 번5분에 한 번6시간에 한 번7일에 한 번7시간에 한 번8시간에 한 번9시간에 한 번하루에 한 번한달에 한번일년에 한번한 시간에 한 번Premium 버전에서만 사용 가능이미지 최적화 도구옵션이 저장되었습니다페이지업데이트 해주세요게시물사전 로드사전 로드 설정결합된 CSS 파일을 통해 HTTP 요청 감소결합된 JS 파일을 통해 HTTP 요청 감소반복 방문자의 페이지 로드 시간 단축SQL 쿼리 수 줄이기서버에서 보낸 파일 크기 줄이기렌더링 차단 JS완료 후 다시 시작저장서버 시간설정사이트맵일부 자바스크립트 소스는 마우스를 스크롤하거나 움직일 때까지 로드되지 않습니다.다음으로 시작성공태그대상 폴더관리자 도구 모음의 WP 가장 빠른 캐시 메뉴는 아래에서 선택한 사용자 역할에 표시됩니다.가장 간단하고 빠른 WP 캐시 시스템그 다음에시간 초과 규칙도구 모음 설정한 시간에 두 번게시물 업데이트사용자 역할WP Fastest CacheWP Fastest Cache 옵션경고새 게시물을 게시한 후 어떻게 되기를 원하십니까?게시물이나 페이지를 업데이트한 후 어떻게 하시겠습니까?위젯 캐시이 섹션을 통해 고급 설정을 사용자 정의할 수 있습니다.CSS 파일의 크기를 줄일 수 있습니다.JS 파일의 크기를 줄일 수 있습니다.페이지 크기를 줄일 수 있습니다.모든 캐시 파일을 삭제할 수 있습니다.이모티콘 인라인 css 및 wp-emoji-release.min.js를 제거할 수 있습니다.사전 로딩에 사용할 사이트맵을 지정할 수 있습니다.사전 로딩에 사용할 콘텐츠를 지정할 수 있으며 정렬할 수도 있습니다.이 섹션을 통해 프리로드 기능에 사용할 방법을 지정할 수 있습니다.파일을 삭제구글 애널리틱스 매개변수가 있음장바구니에 우커머스 항목이 있습니다yandex 클릭 ID 매개변수 있음http://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/페이지 (분당)PKL\|AA4wp-fastest-cache/languages/wp-fastest-cache-nl_NL.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Dutch # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-12-29 11:23:38+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: nl\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "Het menu WP Fastest Cache op de beheer toolbar zal hieronder zichtbaar zijn voor de geselecteerde gebruikersrollen." #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "Gebruikersrollen" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "Er moet minstens één sitemap worden toegevoegd" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "In deze sectie kun je de geavanceerde instellingen aanpassen." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Geavanceerde instellingen" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Je kunt sitemaps opgeven die moeten worden gebruikt voor het vooraf laden." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Sitemaps" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Je kunt de inhoud opgeven die moet worden gebruikt voor het voor laden en je kunt ze ook sorteren." #: templates/preload.php:86 msgid "Content Types" msgstr "Inhoud typen" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "In deze sectie kun je de methode opgeven die je wil dat de voorlaad functie gebruikt." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Kies een methode" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Vooraf laden instellingen" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Sommige js bronnen zullen niet geladen worden, totdat er gescrold wordt of de muis bewogen" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Vertraag JS" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "WP Fastest Cache opties" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "heeft Yandex Click ID parameters" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Specifieke pagina's wissen" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Opslaan" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Annuleren" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Toolbar instellingen" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Cache van alle sites wissen" #: wpFastestCache.php:439 msgid "Settings" msgstr "Instellingen" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Cache wissen" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Elimineer render blokkering JavaScript gegevensbronnen" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Opties zijn opgeslagen" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "heeft WooCommerce items in winkelwagen" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "heeft Google Analytics parameters" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archieven" #: templates/timeout.php:189 msgid "Server Time" msgstr "Server tijd" #: templates/timeout.php:169 msgid "delete the files" msgstr "verwijder de bestanden" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Bevat" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Is gelijk aan" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Begint met" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Homepage" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Alles" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Uitsluiten pagina wizard" #: templates/timeout.php:124 msgid "Then" msgstr "Dan" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Als REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Cache timeout wizard" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Instellingen voor lazy-load" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Gzip inschakelen" #: templates/update_now.php:9 msgid "Please Update" msgstr "Updaten" #: templates/update_success.php:9 msgid "Success" msgstr "Gelukt" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Waarschuwing" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Nieuwe regel toevoegen" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "Cache en verkleinde CSS/JS wissen" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Alleen beschikbaar in Premium versie" #: templates/timeout.php:141 msgid "Choose One" msgstr "Kies er een" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Alle cachebestanden worden ook verwijderd" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Als je een CSS bestand wijzigt, moet je verkleinde CSS bestanden verwijderen" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Doelmap" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Je kunt alle cachebestanden verwijderen" #: inc/admin.php:1090 msgid "Exclude" msgstr "Uitsluiten" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Afbeeldingsoptimalisatie" #: inc/admin.php:1082 msgid "Settings" msgstr "Instellingen" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Database opschoning" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN instellingen" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "JS uitsluiten" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "CSS uitsluiten" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Cookies uitsluiten" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Uitsluiten gebruikers-agents" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Pagina's uitsluiten" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Gereedschap voor optimaliseren afbeeldingen" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Time-out regels" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Cache statistieken" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Cache van bericht / pagina wissen" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Wat wil je dat er gebeurt na het updaten van een bericht of een pagina?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Cache van paginatie wissen" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Cache van bericht tags wissen" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Cache van bericht categorieën wissen" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Cache van homepage wissen" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Alle cache wissen" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Wat wil je dat er gebeurt na het publiceren van het nieuwe bericht?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Opnieuw starten nadat deze is afgerond" #: templates/preload.php:210 msgid "pages per minute" msgstr "pagina's per minuut" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Aangepaste taxonomieën" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Aangepaste berichttypen" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Bijlagen" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Tags" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Pagina's" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categorieën" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Berichten" #: templates/preload.php:102 msgid "Homepage" msgstr "Homepage" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "HTTP aanvragen verminderen via gecombineerde js bestanden" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Afbeeldingen en iframes laden wanneer ze de weergaveport van de browsers betreden" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Google Fonts asynchroon laden" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google Fonts" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Weergave blokkerende js" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Je kunt de emoji inline css en wp-emoji-release.min.js verwijderen" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Emoji's uitschakelen" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Laadtijden van pagina's voor terugkerende bezoekers verminderen" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Browser Caching" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "De grootte van bestanden die vanaf je server worden verzonden, verkleinen" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combineer JS Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combineer JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Je kunt de grootte van je js bestanden verkleinen" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minify Js" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "HTTP aanvragen verminderen via gecombineerde css bestanden" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combineer CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Krachtiger verkleinen van css" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minify Css Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Je kunt de grootte van css bestanden verkleinen" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Verklein css" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Krachtiger verkleinen van HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minify HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Je kunt de grootte van de pagina verkleinen" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minify HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Cache bestanden wissen wanneer een bericht of pagina wordt geüpdatet" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Update bericht" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Cache bestanden wissen wanneer een bericht of pagina wordt gepubliceerd" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nieuw bericht" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Cache maken voor mobiel thema" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Mobiel thema" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "De versie in de cache voor desktop niet weergeven op mobiele apparaten" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobiel" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "De versie in de cache voor ingelogde gebruikers niet weergeven" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Ingelogde gebruikers" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "De cache van de hele site automatisch maken" #: inc/admin.php:1157 msgid "Preload" msgstr "Vooraf laden" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Het aantal SQL-query's verminderen" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget cache" #: inc/admin.php:1119 msgid "Enable" msgstr "Inschakelen" #: inc/admin.php:1118 msgid "Cache System" msgstr "Cache systeem" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Eenmaal per 15 dagen" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Eenmaal per 7 dagen" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Eenmaal per 3 dagen" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Eenmaal per 10 uur" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Eenmaal per 9 uur" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Eenmaal per 8 uur" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Eenmaal per 7 uur" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Eenmaal per 5 uur" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Eenmaal per 4 uur" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Eenmaal per 3 uur" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Eenmaal per 2 uur" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Eenmaal per 10 dagen" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Het eenvoudigste en snelste WP cache systeem" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Eenmaal per jaar" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Eenmaal per maand" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Eenmaal per dag" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Eenmaal per 6 uur" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Eenmaal per uur" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Tweemaal per uur" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Eenmaal per 15 minuten" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Eenmaal per 5 minuten" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Eenmaal per minuut"PKL\8$$4wp-fastest-cache/languages/wp-fastest-cache-zh_CN.monu[l l m   '  "   ' 8 E Z a l w       0 2I 0|     .! P b t   ; 1 . : D K W _ k {      A 2 EQ d=    )B\eh|*?Rdw    ! "06>/O.* .)<T YenFw  ( ! 2 @L]v9~9 =&=%d!?3 U?T9.X  !2!9[b r }   "4Gd}**  - 4A!` 3$ '. V` g s   F _ls5     )6FWv&<Rex   0@ GQ Xb)r(*' 3 0F w ~  F   !!0!7!J!Z! j!w!!!$!*!!'"#/""S"v"!"?"0"E%#9k# #)#"#!#.!$P$p$SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-12-10 10:19:38+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Generator: GlotPress/4.0.1 Language: zh_CN Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) 设置添加新规则高级设置所有所有缓存文件也将被删除存档请至少添加一个站点地图附件浏览器缓存CDN 设置缓存统计缓存系统缓存超时向导取消分类选一个选择一种方式清除所有缓存清除缓存删除缓存和已压缩的 CSS/JS清除所有站点的缓存清除分页缓存清除文章/页面的缓存清除文章类别缓存清除文章标签缓存发布文章或页面时清除缓存文件更新文章或页面时清除缓存文件清除特定页面的缓存CSS 合并Js 合并Js 增强合并包含内容类型为移动端主题创建缓存自动创建所有站点的缓存自定义文章类型自定义分类数据库清理延迟加载 JS禁用 Emoji不给移动端用户显示电脑端的缓存页面不显示登录用户的缓存版本消除阻止渲染的 JavaScript 资源Emre Vona启用启用 Gzip排除选项排除的 CSS排除的 Cookie排除的 JS排除页面向导排除的页面排除的 User-Agents谷歌字体Gzip主页主页如果 REQUEST_URI如果您修改了 CSS 文件,则必须删除已压缩的 CSS 文件图像优化等于延迟加载设置异步加载谷歌字体当图像和 iframe 进入视线时才去加载它们已登录用户CSS 压缩CSS 增强合并HTML 压缩HTML 增强压缩Js 压缩移动设备移动端主题CSS 增强压缩更强大的 HTML 压缩算法新文章发布时好每分钟一次每 10 天一次每 10 个小时一次每 15 天一次每 15 分钟一次每 2 个小时一次每 3 天一次每 3 个小时一次每 4 个小时一次每 5 个小时一次每 5 分钟一次每 6 小时一次每 7 天一次每 7 个小时一次每 8 个小时一次每 9 个小时一次每天一次每月一次每年一次每小时一次仅在 Premium 版中可用图像优化工具选项已保存页面请更新文章预加载预加载设置通过合并 CSS 文件减少 HTTP 请求通过合并 js 文件减少 HTTP 请求减少网站老用户的页面加载时间减少 SQL 查询的数量减少从服务器发送的文件大小阻塞渲染的 Js缓存生成完毕后重新启动预加载程序保存服务器时间设置站点地图只有用户滚动页面或移动鼠标时才会加载部分 js 文件开始于成功标签目标文件夹简洁且高效的缓存系统然后缓存超时规则工具栏设置每小时两次更新文章WP Fastest CacheWP Fastest Cache 选项警告发布新文章后您想做什么?更新文章或页面后您想做什么?小组件缓存你可以在这里查看更多设置。您可以减小 CSS 文件的大小您可以减小 JS 文件的大小您可以缩小页面大小您可以删除所有缓存文件您可以删除 Emoji 的内联 CSS 和 wp-emoji-release.min.js你可以指定用于预加载的站点地图。你可以指定预加载的内容,也可以对它们进行排序。你可以在这里指定预加载功能的实现方式。删除文件具有 Google Analytics(分析)参数购物车中有 Woocommerce 项目具有 Yandex 的 Click ID 参数http://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/每分钟几个页面PKL\d?U**4wp-fastest-cache/languages/wp-fastest-cache-pt_BR.monu[< P Q ^ 'b         " : T o  2 0  "2;.Y  ; 1Hz       #0 5?HAWQ    ,=M      $1:=Qdx'9L_ r }  ! RX^ f/p.* .!Jl   V(*S X ft {99 &!%H!nB?72j{". 3 ,4Kb#s  "-P@mA   "",Er +D#6h    /@ \iz\ L" o z  % . K 5! G!U!h!w! !!!!!! !" "" 0";"R" d"n" " " "" "" " " ""## "#%,#$R#w###c#$$)$>2$=q$U$"%6(%0_%%%%% %%& &g!&@&&&& &''&'?,'>l''.'-'((-A(Uo(?(?)E)#Y)!})").)) s,#UjfCaOF;G~y}ukH 97w/4]V'q`xRg[n>E+AmBhb: e%JloQSIp2{Dr=tX)zT<$c_0 ZK" 3P&8-?LN.M@!5|*6W^viY1(d\Add New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingBuyCDN SettingsCache StatisticsCache SystemCache Timeout WizardCategoriesCheckoutChoose OneClear All CacheClear Cache of HomepageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CssCombine JsCombine Js PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelete CacheDelete Cache and Minified CSS/JSDisable EmojisDiscover FeaturesDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersDownloadDownload & UpdateEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGet It Now!Google FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIn the premium version there are some new features which speed up the sites more.Is Equal ToJustLazy LoadLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew FeaturesNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePlease don't delete the free version. Premium version works with the free version.PostsPreloadPurchasedReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRemove render-blocking JavaScriptRender Blocking JsRestart After CompletedServer TimeSettingsStarts WithSuccessTagsTarget folderThe download button will be available after paid. You can buy the premium version now.The simplest and fastest WP Cache systemThenTimeout RulesTwice an HourUpdateUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can download and update the premium when you want if you paid.You can remove the emoji inline css and wp-emoji-release.min.jsYou need to pay before downloading the premium version.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://tr.linkedin.com/in/emrevonahttp://wordpress.org/plugins/wp-fastest-cache/pages per minuteProject-Id-Version: WP Fastest Cache 0.8.9.7 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-fastest-cache POT-Creation-Date: 2019-09-09 20:43:14+00:00 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PO-Revision-Date: 2019-09-19 17:03-0300 Language-Team: X-Generator: Poedit 2.2.3 Last-Translator: Plural-Forms: nplurals=2; plural=(n > 1); Language: pt_BR Adicionar nova regraTudoTodos os arquivos de cache serão removidos tambémArquivosAnexosCache do navegadorComprarConfigurações de CDNEstatísticas de cacheSistema de cacheAssistente de tempo limite do cacheCategoriasFinalizar compraEscolha umLimpar todo o cacheLimpar cache da página inicialLimpar cache de paginaçãoLimpar cache de post / páginaLimpar cache de categorias do postLimpar cache de tags do postLimpar arquivos de cache quando um post ou página for publicadaLimpar arquivos de cache quando um post ou página for atualizadaCombinar CssCombinar JSCombinar Js PlusContémCriar cache para o tema do celularCriar o cache de todo o site automaticamenteTipos personalizados de postTaxonomias personalizadasLimpeza do banco de dadosExcluir cacheExcluir cache e arquivos minificados CSS/JSDesativar EmojisDescubra os recursosNão mostrar a versão em cache para desktop em dispositivos móveisNão mostrar a versão em cache para usuários logadosDownloadDownload & atualizaçãoEmre VonaAtivarAtivar o gzipExcluirExcluir CSSExcluir cookiesExcluir JSAssistente para excluir páginaExcluir páginasExcluir agentes de usuárioObter agora!Fontes do GoogleGzipPágina inicialPágina inicialSe REQUEST_URISe você modificar qualquer arquivo css, você precisará apagar os arquivos css minificadosOtimização de imagemNa versão premium existem alguns recursos novos que aceleram mais os sites.É igual aApenasCarregamento lentoConfigurações de carregamento lentoCarregar fontes do Google de forma assíncronaCarregar imagens e iframes quando eles entrarem na viewport dos navegadoresUsuários logadosMinificar CssMinificar Css PlusMinificar HTMLMinificar HTML PlusMinificar JsCelularTema do celularMais poderoso minificador cssMais poderoso minificador HTMLNovos recursosNovo postOkA cada 1 minutoUma vez a cada 10 diasA cada 10hUma vez a cada 15 diasA cada 15 minutosA cada 2hUma vez a cada 3 diasA cada 3hA cada 4hA cada 5hA cada 5 minutosA cada 6hUma vez a cada 7 diasA cada 7hA cada 8hA cada 9hUma vez por diaUma vez por mêsUma vez por anoA cada 1hDisponível apenas na versão premiumFerramenta de otimização de imagemAs opções foram salvasPáginasPor favor, atualizePor favor, não exclua a versão gratuita. A versão premium funciona junto com a versão gratuita.PostsPré-carregamentoCompradoReduza solicitações HTTP por meio de arquivos css combinadosReduza solicitações HTTP por meio de arquivos js combinadosReduza os tempos de carregamento de página para os visitantes que retornaram ao siteReduzir o número de consultas SQLReduza o tamanho dos arquivos enviados do seu servidorRemover javaScript de bloqueio de renderizaçãoBloqueio de renderização JsReiniciar depois de concluídoHorário do servidorConfiguraçõesComeça comSucessoTagsDiretório de destinoO botão de download estará disponível após o pagamento. Você pode comprar a versão premium agora.O sistema mais simples e rápido sistema de cache para WordPressEntãoRegras de limite de tempoA cada meia horaAtualizarAtualizar postWP Fastest CacheAvisoO que você quer que aconteça depois de publicar um novo post?O que deseja que aconteça após atualizar um post ou página?Cache de widgetVocê pode diminuir o tamanho dos arquivos cssVocê pode diminuir o tamanho dos arquivos jsVocê pode diminuir o tamanho da páginaVocê pode excluir todos os arquivos de cacheVocê pode fazer download e atualizar para premium quando quiser, se você já pagou.Você pode remover o emoji inline css e wp-emoji-release.min.jsVocê precisa pagar antes de fazer download da versão premium.excluir os arquivostem parâmetros do Google Analyticstem itens WooCommerce no carrinhohttp://tr.linkedin.com/in/emrevonahttp://wordpress.org/plugins/wp-fastest-cache/páginas por minutoPKL\ BB4wp-fastest-cache/languages/wp-fastest-cache-gl_ES.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Galician # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-11-25 07:53:04+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: gl_ES\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "Hai que engadir polo menos un mapa do sitio" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "Podes personalizar os axustes avanzados a través desta sección." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Axustes avanzados" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Podes especificar mapas do sitio que se usarán para a carga previa." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Mapa do sitio" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Podes especificar os contidos que se empregarán para a carga previa e tamén podes ordenalos." #: templates/preload.php:86 msgid "Content Types" msgstr "Tipos de contido" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "Podes especificar o método que queres que use a característica de precarga a través desta sección." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Elixe un método" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Axustes de precarga" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Algunhas orixes de js non cargarán ata que se faga scroll ou se mova el rato" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Aprazar Js" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "Opcións de WP Fastest Cache" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "ten parámetros de ID de clic de Yandex" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Baleirar páxinas específicas" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Gardar" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Cancelar" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Axustes da barra de ferramentas" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Vaciar a caché de todos os sitios" #: wpFastestCache.php:439 msgid "Settings" msgstr "Axustes" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Baleirar a caché" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Eliminar os recursos JavaScript que bloquean os procesos" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "As opcións foron gardadas" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "ten artigos de WooCommerce no carriño" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "ten parámetros de Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Arquivos" #: templates/timeout.php:189 msgid "Server Time" msgstr "Hora do servidor" #: templates/timeout.php:169 msgid "delete the files" msgstr "borrar os arquivos" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Contén" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "é igual a" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Comeza con" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Páxina de inicio" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Todo" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Asistente para excluír páxinas" #: templates/timeout.php:124 msgid "Then" msgstr "Entón" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Se REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Asistente do tempo límite da caché" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Asistente de carga diferida" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Activar Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Por favor, actualiza" #: templates/update_success.php:9 msgid "Success" msgstr "Correcto" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Advertencia" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Engadir unha nova regra" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "Baleirar a caché e minimizar CSS/JS" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Só dispoñible na versión premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Elixe un" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Tamén se eliminarán todos os arquivos da caché" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Se modificas calquera arquivo CSS, tes que borrar os arquivos CSS minimizados" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Carpeta de destino" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Podes borrar todos os arquivos da caché" #: inc/admin.php:1090 msgid "Exclude" msgstr "Excluír" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimización de imaxes" #: inc/admin.php:1082 msgid "Settings" msgstr "Axustes" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Limpeza da base de datos" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Axustes da CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Excluír JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Excluír CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Excluír cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Excluír axentes de usuario" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Excluír páxinas" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Ferramenta de optimización de imaxes" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Regras de tempo límite" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Estatísticas da caché" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Baleirar a caché de entradas / páxinas" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Que queres que ocorra despois de actualizar unha entrada ou unha páxina?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Baleirar a caché de paxinación" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Baleirar a caché de etiquetas de entradas" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Baleirar a caché de categorías de entradas" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Baleirar a caché da páxina de inicio" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Baleirar toda a caché" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Que queres que ocorra despois de publicar a nova entrada?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "Aceptar" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Reiniciar despois de completado" #: templates/preload.php:210 msgid "pages per minute" msgstr "páxinas por minuto" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Taxonomías personalizadas" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Tipos de contido personalizado" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Adxuntos" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Etiquetas" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Páxinas" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categorías" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Entradas" #: templates/preload.php:102 msgid "Homepage" msgstr "Páxina de inicio" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Reducir as solicitudes HTTP mediante arquivos JS combinados" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Cargar as imaxes e iframes cando entren na visualización dos navegadores" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Cargar as fontes de Google de forma asíncrona" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Fontes de Google" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Bloqueo do procesado de JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Podes eliminar os emojis integrados en CSS e o arquivo «wp-emoji-release.min.js»" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Desactivar os emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Reducir o tempo de carga da páxina para os visitantes repetitivos" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Caché do navegador" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Reducir o tamaño dos arquivos enviados polo teu servidor" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combine Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combinar JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Podes reducir o tamaño dos arquivos JS" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minimizar JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Reducir as solicitudes HTTP mediante arquivos JS combinados" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combinar CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Minimización CSS máis potente" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minify Css Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Podes reducir o tamaño dos arquivos CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minimizar CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Minimización HTML máis potente" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minify HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Podes reducir o tamaño da páxina" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minimizar HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Baleirar os arquivos da caché cando se actualiza unha entrada ou páxina" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Actualizar a entrada" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Baleirar os arquivos da caché cando se publica unha entrada ou páxina" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nova entrada" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Crear a caché para o tema para móbiles" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Tema para móbiles" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Non mostrar a versión de escritorio da caché nos dispositivos móbiles" #: inc/admin.php:1195 msgid "Mobile" msgstr "Móbil" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Non mostrar a versión da caché para usuarios conectados" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Usuarios conectados" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Crear automaticamente a caché de todo o sitio" #: inc/admin.php:1157 msgid "Preload" msgstr "Precargar" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Reducir o número de consultas SQL" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget de caché" #: inc/admin.php:1119 msgid "Enable" msgstr "Activar" #: inc/admin.php:1118 msgid "Cache System" msgstr "Sistema de caché" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Unha vez cada 15 días" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Unha vez cada 7 días" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Unha vez cada 3 días" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Unha vez cada 10 horas" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Unha vez cada 9 horas" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Unha vez cada 8 horas" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Unha vez cada 7 horas" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Unha vez cada 5 horas" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Unha vez cada 4 horas" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Unha vez cada 3 horas" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Unha vez cada 2 horas" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Unha vez cada 10 días" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "O sistema WP Caché máis simple e rápido" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Unha vez ao ano" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Unha vez ao mes" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Unha vez ao día" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Unha vez cada 6 horas" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Unha vez á hora" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Dúas veces á hora" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Unha vez cada 15 minutos" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Unha vez cada 5 minutos" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Unha vez cada 1 minuto"PKL\1k|(|(4wp-fastest-cache/languages/wp-fastest-cache-sk_SK.monu[| | }   '  "   * 7 H U j q |        : Y 2r 0     , .J y     ; 1 .4 c m t       A[ nz =  # 4> ERk-@Sh{    !-E KY_g/x.* .#Re} F  (7 <J [ iu99 =(&f%!?34UhT$Db.B$@Wo$w8 *C L Weu%"! ('I qFC=M]q z)/ .<>?{4   + > Lm O/ HR&g>";KQ` - : K \ p       ! !&!#;!"_!!!!!!!H!97"Tq""3"#1#N#W# g#r#I# ####3$ 8$B$S$p$$$$ $:$B % N%>[%)%(%%%*&J>&V&]&g>'''#''.(H(h(SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2025-01-10 12:15:27+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ((n >= 2 && n <= 4) ? 1 : 2); X-Generator: GlotPress/4.0.1 Language: sk Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) NastaveniaPridať nové pravidloRozšírené nastaveniaVšetkoVšetky cache súbory boli vymazanéArchívyMusí byť pridaná aspoň jedna mapa stránky (sitemap)PrílohyCache prehliadačaNastavenia CDNŠtatistika CacheCache systémuSprievodca Cache TimeoutZrušiťKategórieZvoliť jedenVybrať metóduVymazať všetko cacheVyčistiť CacheVymazať Cache a minifikované CSS/JSVymazať cache všetkých stránokVymazať cache domovskej stránkyVyčistiť cache stránkovania.Vymazať cache článku/stránkyVymazať cache pre kategórie článkovVymazať cache značiek článkuAktualizovať cache súbory, keď publikujete článok alebo stránku Aktualizovať cache súbory, keď upravíte článok alebo stránkuČistenie konkrétnych stránokKombinovať CssKombinovať Js Kombinovať Js PlusObsahujeTypy obsahuVytvoriť cache pre mobilnú verziu témyVytvorte cache pre všetky stránky automatickyVlastné typy obsahuVlastné taxonómieVyčistenie databázyOneskorenie JsVypnúť EmojisNezobrazovať cache verziu pre PC na mobilných zariadeniachNezobrazovať verziu v cache pre prihlásených používateľovOdstrániť JavaScript zdroje blokujúce vykreslenieEmre VonaZapnúťPovoliť GzipVylúčiťVylúčiť CSSVylúčiť CookiesVylúčiť JSVylúčiť sprievodcu stránkamiVylúčiť stránkyVylúčiť User-AgentsGoogle FontsGzipDomovská stránkaDomovská stránkaAk REQUEST_URIAk upravíte akýkoľvek súbor css, musíte odstrániť zmenšené súbory cssOptimalizácia obrázkovsa rovnáLazy load nastaveniaNačítanie písma Google asynchrónneNačítať obrázky a iframe až pri vyrezávaní prehliadačaPrihlásení používateliaMinifikovať CssMinifikovať Css PlusMinifikovať HTMLMinimalizovať HTML PlusMinifikovať jsMobilMobilná témaVýkonnejšie minifikovať cssVýkonnejšia minifikácia htmlNový článokOKJedenkrát za 1 minútuRaz za 10 dníKaždých 10 hodín Raz za 15 dní Jedenkrát každých 15 minútKaždé 2 hodinyRaz za 3 dniKaždé 3 hodinyKaždé 4 hodinyKaždých 5 hodín Jedenkrát každých 5 minútJedenkrát každých 6 hodínRaz za 7 dní Každých 7 hodín Každých 8 hodín Každých 9 hodínJedenkrát denneJedenkrát mesačneRaz ročneJedenkrát za hodinuK dispozícii iba vo verzii PremiumOptimalizovať nástroje obrázkovNastavenia boli uloženéStránkyProsím aktualizujteČlánkyPrednačítanieNastavenia prednačítaniaZredukovanie HTTP žiadosti prostredníctvom kombinovaných súborov CSSRedukovať HTTP žiadosti pomocou kombinácie js súborovZnížte čas načítania stránky pre návštevníkov, ktorý už boli na stránke.Znížiť počet dopytov SQLZnížuje veľkosť súborov odoslaných zo serveraRenderovať blokovanie JsReštartovať po dokončeníUložiťServerový časNastaveniaMapy stránok (Sitemap)Niektoré zdroje js sa načítajú až pri posúvaní alebo pohybe myšouZačína sÚspechZnačkyCieľový priečinokNajjednoduchší a najrýchlejší WP Cache systémNásledneTimeout pravidlaNastavenia panela nástrojovDvakrát za hodinuAktualizovať článokWP Fastest CacheMožnosti WP Fastest CacheVarovanieČo chcete, aby sa stalo po publikovaní nového článku?Čo chcete, aby sa stalo po aktualizácii článku alebo stránky?Widget CacheV tejto časti môžete prispôsobiť rozšírené nastavenia.Môžete zmenšiť veľkosť súborov cssMôžete zmenšiť veľkosť js súborovMôžete znížiť veľkosť stránkyMôžete odstrániť všetky súbory cacheMôžete odstrániť vložené súbory emoji css a wp-emoji-release.min.jsMôžete zadať mapy stránok (sitemaps), ktoré sa majú použiť na prednačítanie.Môžete určiť obsah, ktorý sa má použiť na prednačítanie, a môžete ho aj zoradiť.Prostredníctvom tejto časti môžete určiť metódu, ktorú má funkcia prednačítania používať.Vymazať súborymá Google Analytics Parametersmá Woocommerce položky v košíkumá Yandex Click ID parametrehttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/stránok za minútuPKL\Vknw w 1wp-fastest-cache/languages/wp-fastest-cache-fi.monu[ 7D'Hp y      ! < [ 2t 0    .& U g y  ; 1 . 6 @ G S [ g w      A . A M ` =       % > X a d x       &;N`s    ! ,2/:.j* .' ?K T`h m({   99$ ^&k%!?9Jj..NW` u  &5.\-AC ? LX i u/ K&Er,  . CQhy O-="\;  & .<Vq*;N_r%>D Yd5m47!62i"~  4!0BVg:pE&%,R*oC!$ .7 f SettingsAdd New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCategoriesChoose OneClear All CacheClear CacheClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CssCombine JsCombine Js PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedServer TimeSettingsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesTwice an HourUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsdelete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/pages per minutePO-Revision-Date: 2020-03-19 21:29:25+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: fi Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) AsetuksetLisää uusi sääntöKaikkiMyös kaikki välimuistin tiedostot poistetaanArkistotLiitteetSelaimen välimuistiCDN-AsetuksetVälimuistin tilastotVälimuistijärjestelmäVälimuisti aikaraja -velhoOsastotValitse yksiTyhjennä koko välimuistiTyhjennä välimuistiTyhjennä sivutuksen välimuistiTyhjennä sivun/artikkelin välimuistiTyhjennä artikkelin kategorioiden välimuistiTyhjennä artikkelin avainsanojen välimuistiTyhjennä välimuistin tiedostot kun sivu tai artikkeli julkaistuTyhjennä välimuistin tiedostot kun sivu tai artikkeli päivitettyYhdistä CssYhdistä JsYhdistä Js PlusSisältääTee välimuisti mobiili teemalleLuo välimuisti automaattisesti koko sivustolleMukautetut artikkelityypitMukautettu luokitteluTietokannan siivousPoista hymiöt käytöstäÄlä näytä mobiili laitteille pöytäkoneille välimuistitettua versiotaÄlä näytä välimuistitettua versiota kirjautuneille käyttäjillePoista näyttämisen blokkaavat JS resurssitEmre VonaOta käyttöönOta Gzip käyttöönRajaa poisRajaa pois CSSRajaa pois evästeetRajaa pois JSRajaa pois sivu -velhoRajaa pois sivutRajaa pois käyttäjäagentitGoogle fontitGzipKotisivuEtusivuJos REQUEST_URIJos muutat mitä tahansa css-tiedostoa, on poistettava pienennetty css-tiedostoKuvien optimointiYhtäsuuri kuinVaiheittainen lataus asetuksetLataa Google fontit asynkronisestiLataa kuvat ja iframes kun ne saapuvat selaimen näyttöönKirjautuneet käyttäjätPienennä CssPienennä Css PlusPienennä HTMLPienennä HTML PlusPienennä JsMobiiliMobiili teemaTehokkaampi css pienennysTehokkaampi HTML-pienennysUusi artikkeliOK1 minuutin välein10 päivän välein10 tunnin välein15 päivän välein15 minuutin välein2 tunnin välein3 päivän välein3 tunnin välein4 tunnin välein5 tunnin välein5 minuutin välein6 tunnin välein7 päivän välein7 tunnin välein8 tunnin välein9 tunnin väleinKerran päivässäKerran kuukaudessaKerran vuodessaKerran tunnissaVain Maksullisessa versiossaTyökalu kuvien optimointiinAsetukset on tallennettuSivutPäivitä, ole hyväArtikkelitEsilataaVähennä HTTP-kutsuja yhdistämällä css-tiedostojaVähennä HTTP-kutsuja yhdistämällä js-tiedostojaVähennä sivun latausaikoja toistuville vierailijoilleVähennä SQL-kutsujen määrääPienennä palvelimelta lähetettyjen tiedostojen kokoaNäytä blokkaava JsKäynnistä uudelleen kun valmistaPalvelimen aikaAsetuksetAlkaaOnnistuiAvainsanatKohde hakemistoYksinkertaisin ja nopein WP-välimuistijärjestelmäSittenAikasäännötKahdesti tunnissaPäivitä artikkeliWP Fastest CacheVaroitusMitä haluat tapahtuvaksi kun uusi artikkeli on julkaistu?Mitä haluat tapahtuvaksi artikkelin tai sivun päivityksen jälkeen?Vimpain välimuistiVoit pienentää css-tiedostojen kokoaVoit pienentää js-tiedostojen kokoaVoit pienentää sivun kokoaVoit poistaa kaikki välimuistin tiedostotVoit poistaa hymiön rivin sisäisen css ja wp-emoji-release.min.jspoistaa tiedostoton Google Analytics -parametrejäWoocommerce kohteita on ostoskorissahttp://wordpress.org/plugins/wp-fastest-cache/sivua minuutissaPKL\(?((4wp-fastest-cache/languages/wp-fastest-cache-nl_NL.monu[    '  " . : J W h u       % ? Z y 2 0    % 5 > L .j      ; 1" .T       !*A9{  =  ' 7C T^ er(:M`s    !9Me ky/.* ".Cr F  `.(    +939m =&%!?a?3UTJ. <\m) 0EN^o     !6P!k%GE_ z  +4 HTFi>6 & 0< MXg z LS lzQ ( 8D U_ fs  ( : N ` r        !!)!$9!+^!!!! ! !!:!9"?X"""I"#&#D# L# X#e#Zn# ####s#,\$$$$$$$$$ %C%G]% %=%/%1 &+R&'~&B&J&b4'U''!(&&( M(.n(((SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below.The simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostUser RolesWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-12-29 11:23:38+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: nl Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) InstellingenNieuwe regel toevoegenGeavanceerde instellingenAllesAlle cachebestanden worden ook verwijderdArchievenEr moet minstens één sitemap worden toegevoegdBijlagenBrowser CachingCDN instellingenCache statistiekenCache systeemCache timeout wizardAnnulerenCategorieënKies er eenKies een methodeAlle cache wissenCache wissenCache en verkleinde CSS/JS wissenCache van alle sites wissenCache van homepage wissenCache van paginatie wissenCache van bericht / pagina wissenCache van bericht categorieën wissenCache van bericht tags wissenCache bestanden wissen wanneer een bericht of pagina wordt gepubliceerdCache bestanden wissen wanneer een bericht of pagina wordt geüpdatetSpecifieke pagina's wissenCombineer CSSCombineer JSCombineer JS PlusBevatInhoud typenCache maken voor mobiel themaDe cache van de hele site automatisch makenAangepaste berichttypenAangepaste taxonomieënDatabase opschoningVertraag JSEmoji's uitschakelenDe versie in de cache voor desktop niet weergeven op mobiele apparatenDe versie in de cache voor ingelogde gebruikers niet weergevenElimineer render blokkering JavaScript gegevensbronnenEmre VonaInschakelenGzip inschakelenUitsluitenCSS uitsluitenCookies uitsluitenJS uitsluitenUitsluiten pagina wizardPagina's uitsluitenUitsluiten gebruikers-agentsGoogle FontsGzipHomepageHomepageAls REQUEST_URIAls je een CSS bestand wijzigt, moet je verkleinde CSS bestanden verwijderenAfbeeldingsoptimalisatieIs gelijk aanInstellingen voor lazy-loadGoogle Fonts asynchroon ladenAfbeeldingen en iframes laden wanneer ze de weergaveport van de browsers betredenIngelogde gebruikersVerklein cssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobielMobiel themaKrachtiger verkleinen van cssKrachtiger verkleinen van HTMLNieuw berichtOKEenmaal per minuutEenmaal per 10 dagenEenmaal per 10 uurEenmaal per 15 dagenEenmaal per 15 minutenEenmaal per 2 uurEenmaal per 3 dagenEenmaal per 3 uurEenmaal per 4 uurEenmaal per 5 uurEenmaal per 5 minutenEenmaal per 6 uurEenmaal per 7 dagenEenmaal per 7 uurEenmaal per 8 uurEenmaal per 9 uurEenmaal per dagEenmaal per maandEenmaal per jaarEenmaal per uurAlleen beschikbaar in Premium versieGereedschap voor optimaliseren afbeeldingenOpties zijn opgeslagenPagina'sUpdatenBerichtenVooraf ladenVooraf laden instellingenHTTP aanvragen verminderen via gecombineerde css bestandenHTTP aanvragen verminderen via gecombineerde js bestandenLaadtijden van pagina's voor terugkerende bezoekers verminderenHet aantal SQL-query's verminderenDe grootte van bestanden die vanaf je server worden verzonden, verkleinenWeergave blokkerende jsOpnieuw starten nadat deze is afgerondOpslaanServer tijdInstellingenSitemapsSommige js bronnen zullen niet geladen worden, totdat er gescrold wordt of de muis bewogenBegint metGeluktTagsDoelmapHet menu WP Fastest Cache op de beheer toolbar zal hieronder zichtbaar zijn voor de geselecteerde gebruikersrollen.Het eenvoudigste en snelste WP cache systeemDanTime-out regelsToolbar instellingenTweemaal per uurUpdate berichtGebruikersrollenWP Fastest CacheWP Fastest Cache optiesWaarschuwingWat wil je dat er gebeurt na het publiceren van het nieuwe bericht?Wat wil je dat er gebeurt na het updaten van een bericht of een pagina?Widget cacheIn deze sectie kun je de geavanceerde instellingen aanpassen.Je kunt de grootte van css bestanden verkleinenJe kunt de grootte van je js bestanden verkleinenJe kunt de grootte van de pagina verkleinenJe kunt alle cachebestanden verwijderenJe kunt de emoji inline css en wp-emoji-release.min.js verwijderenJe kunt sitemaps opgeven die moeten worden gebruikt voor het vooraf laden.Je kunt de inhoud opgeven die moet worden gebruikt voor het voor laden en je kunt ze ook sorteren.In deze sectie kun je de methode opgeven die je wil dat de voorlaad functie gebruikt.verwijder de bestandenheeft Google Analytics parametersheeft WooCommerce items in winkelwagenheeft Yandex Click ID parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pagina's per minuutPKL\%%4wp-fastest-cache/languages/wp-fastest-cache-en_GB.monu[l l m   '  "   ' 8 E Z a l w       ) 2B 0u     . I [ m ~  ; 1 . 3 = D P X d t      A + >J ]=~    ";U^au#8K]p    ! )/7/H.x* ."5M R^gFp  (  + 9EVo9w9 =&6%]!?3U8T2.Q   '7"@ co     !6Pk20  +6F O].{;13.e      #(1:AI  = ,7 GS dn u%8J]p    !'I]u {/.* 2 .S      F !#!+! 0!(>!g! l!z! ! !!!!9!;" M"=Z"&"%"%" #?*#3j#U#T#I$Z$z$$.$$%SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-06-13 12:11:20+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: en_GB Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) SettingsAdd New RuleAdvanced settingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN settingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose oneChoose a methodClear All CacheClear cacheClear Cache of All SitesClear homepage cacheClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing specific pagesCombine CSSCombine JsCombine Js PlusContainsContent typesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase cleanupDelay JSDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude cookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHomepageHomepageIf REQUEST_URIIf you modify any CSS file, you have to delete minified CSS filesImage OptimisationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CSSMinify CSS PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify CSSMore powerful minify HTMLNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimise Image ToolOptions have been savedPagesPlease updatePostsPreloadPreload settingsReduce http requests through combined CSS filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome JS sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWP Fastest Cache optionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after an update of post or page?Widget CacheYou can customise the advanced settings through this section.You can decrease the size of CSS filesYou can decrease the size of js filesYou can decrease the size of the pageYou can delete all cache filesYou can remove the emoji inline CSS and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas WooCommerce Items in baskethas Yandex Click ID parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePKL\$!!4wp-fastest-cache/languages/wp-fastest-cache-it_IT.monu[Dllm '     % , 7 B R ^ w    2 0 H T _ o x .     ; 1E .w       ( 5 : D M A\   = / ? J Z f w         "8K]p   ! -!:\p /.*  4.U   ( , = KWh9p9 &%!>`?.=]n,&+<Te    $*IB`B    .7 f@67? w   & $-6BE %@* :G Yg z  #9Hav 2G[m'$ 6%5\B4(E^d s  *",> O<ZI'& 'A 'i C  $!.*!Y!y!SettingsAdd New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CssCombine JsCombine Js PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsdelete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2023-02-04 10:32:25+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: it Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) ImpostazioniAggiungi nuova regolaTuttiVerranno rimossi anche tutti i file di cacheArchiviAllegatiMemorizzazione nella cache del browserImpostazioni CDNStatistiche della cacheSistema di cacheProcedura guidata timeout cacheAnnullaCategorieScegli unoCancella tutta la cacheSvuota cacheSvuota cache di tutti i sitiCancella cache della paginazioneCancella la cache di articoli/pagineCancella cache delle categorieCancella cache dei tagSvuota la cache quando un articolo o una pagina vengono pubblicatiSvuota la cache quando un articolo o una pagina vengono aggiornatiCombina CSSCombina JsCombina Js PlusContieneCrea la cache per il tema mobileCrea la cache di tutto il sito automaticamenteTipi di contenuto personalizzatiTassonomie personalizzatePulizia del databaseDisabilita emojiNon mostrare la versione cache per desktop su dispositivi mobiliNon mostrare la versione in cache agli utenti connessiElimina le risorse JavaScript che bloccano il renderingEmre VonaAttivaAbilita GzipEscludiEscludi CSSEscludi i cookieEscludi JSProcedura guidata di esclusione paginaEscludi pagineEscludi gli user agentGoogle FontsGzipHomepageHomepageSe REQUEST_URISe modifichi un file CSS, devi eliminare i file dei CSS minificatiOttimizzazione immaginiè uguale aImpostazioni lazy loadCarica Google Fonts in modo asincronoCarica immagini e iframe quando vengono visualizzati nel browserUtenti connessiMinifica CSSMinifica CSS PlusMinifica HTMLMinifica HTML PlusMinifica JSDispositivi mobiliTema mobileMinificazione CSS più potenteMinificazione HTML più potenteNuovo articoloOKUna volta al minutoUna volta ogni 10 giorniUna volta ogni 10 oreOgni 15 giorniUna volta ogni 15 minutiUna volta ogni 2 oreUna volta ogni 3 giorniUna volta ogni 3 oreUna volta ogni 4 oreUna volta ogni 5 oreUna volta ogni 5 minutiUna volta ogni 6 oreOgni 7 giorniUna volta ogni 7 oreUna volta ogni 8 oreUna volta ogni 9 oreUna volta al giornoUna volta al meseUna volta all'annoUna volta all'oraDisponibile solo nella versione PremiumStrumento di ottimizzazione immaginiLe opzioni sono state salvatePagineAggiornaArticoliPrecaricamentoRiduce le richieste HTTP attraverso file CSS combinatiRiduci le richieste HTTP attraverso file Js combinatiRiduce i tempi di caricamento della pagina per visitatori abitualiRiduci il numero di query SQLRiduce la dimensione dei file inviati dal tuo serverJs che bloccano il renderingRiavvia al completamentoSalvaOra del serverImpostazioniInizia conCompletatoTagCartella di destinazioneIl più semplice e veloce sistema Cache WPAlloraRegole di timeoutImpostazioni barra degli strumentiDue volte all'oraAggiorna articoloWP Fastest CacheAttenzioneCosa vuoi che accada dopo aver pubblicato il nuovo articolo?Cosa vuoi che accada dopo l'aggiornamento di un articolo o di una pagina?Cache dei widgetPuoi ridurre la dimensione dei file CSSPuoi ridurre la dimensione dei file JsPuoi ridurre la dimensione della paginaPuoi eliminare tutti i file della cachePuoi rimuovere gli inline CSS degli emoji e wp-emoji-release.min.jselimina i fileha parametri di Google Analyticsha articoli Woocommerce nel carrellohttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pagine al minutoPKL\|"|"4wp-fastest-cache/languages/wp-fastest-cache-hu_HU.monu[<\\] w'      ' 2 B N g    2 0 8 D O _ h .     ; 15 .g       % * 4 = AL   =  / : J V g q x         (;M`s    !*L`x ~/.* $.Et   (   - ;GX9`9 &%!.P?o.->\|9  #>,Z !000I6z2KI0z+>+F[rILF bl{  %!6 ; EQI`+*P$u ?N Q ]h w           #+3 ;#Gk  6= HK+5%!>FYhx~ L . F W 7g =  % ,!"F!+i!K!!$!'".@" o"SettingsAdd New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CssCombine JsCombine Js PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsdelete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/pages per minutePO-Revision-Date: 2021-06-26 15:12:34+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: hu Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) BeállításokÚj szabály hozzáadásaÖsszesAz összes gyorsítótárfájl is eltávolításra kerülArchívumCsatolmányokBöngésző-gyorsítótárazásCDN-beállításokGyorsítótár-statisztikaGyorsítótárazó-rendszerGyorsítótár időtúllépési varázslójaMégseKategóriákVálasszon egyetA teljes gyorsítótár törléseGyorsítótár törléseAz összes webhely gyorsítótárának törléseAz oldalszámozás gyorsítótárának törléseBejegyzés / oldal gyorsítótárának törléseA bejegyzéskategóriák gyorsítótárának törléseA bejegyzéscímkék gyorsítótárának törléseGyorsítótárfájlok törlése egy bejegyzés vagy oldal közzétételekorGyorsítótárfájlok törlése egy bejegyzés vagy oldal frissítésekorCSS kombinálásaJs kombinálásaJs kombinálása +Tartalmazza eztGyorsítótár készítése mobil témáhozA teljes webhely gyorsítótárának automatikus létrehozásaEgyéni bejegyzéstípusokEgyéni taxonómiákAdatbázis-tisztításEmojik letiltásaNe mutassa meg a gyorsítótárazott asztali verziót mobil eszközöknekNe mutassa a gyorsítótárazott verziót a bejelentkezett felhasználóknakA megjelenítést blokkoló JavaScript-erőforrások kiküszöböléseEmre VonaEngedélyezésGzip engedélyezéseKizárásCSS kizárásaSütik kizárásaJS kizárásaAz Oldal varázsló kizárásaOldalak kizárásaFelhasználói ügynökök kizárásaGoogle betűtípusokGzipKezdőlapKezdőoldalHa REQUEST_URIHa egy CSS fájlt módosít, törölnie kell a zsugorított CSS fájlokatKépoptimalizálásEgyenlő ezzelLazy Load (lusta betöltés) beállításokGoogle betűtípusok aszinkron betöltéseKépek és iframe-ek betöltése, amikor belépnek a böngésző nézetablakábaBejelentkezett felhasználókCSS-zsugorításCSS-zsugorítás +HTML-zsugorításHTML-zsugorítás +Js zsugorításaMobilMobil témaErőteljesebb CSS-zsugorításErőteljesebb HTML-zsugorításÚj bejegyzésOKPercenként10 naponta10 óránként15 naponta15 percenként2 óránknét3 naponta3 óránként4 óránként5 óránként5 percenként6 óránként7 naponta7 óránként8 óránként9 óránkéntNapontaHavontaÉventeÓránkéntCsak Premium verzióban érhető elKépoptimalizáló eszköztBeállítások elmenveOldalakKérjük, frissítsenBejegyzésekElőtöltésHTTP kérések csökkentése kombinált CSS fájlokkalHTTP kérések csökkentése kombinált JavaScript fájlokkalAz oldal betöltési idejének csökkentése az ismételt látogatóknakSQL-lekérdezések számának csökkentéseCsökkentse a szerverről küldött fájlok méretétMegjelenítést blokkolós JavaScriptÚjraindítás a befejezés utánMentésKiszolgáló idejeBeállításokEzzel kezdődikSikerCímkékCélmappaA legegyszerűbb és leggyorsabb WordPress Cache gyorsítótárazó rendszerMajdIdőtúllépés szabályaiEszköztár beállításaiÓránként kétszerBejegyzés frissítéseWP Fastest CacheFigyelmeztetésMi történjék az új bejegyzés közzététele után?Mi történjék egy bejegyzés vagy oldal frissítése után?Widget gyorsítótárCsökkentheti a CSS-fájlok méretétCsökkentheti a JavaScript fájlok méretétCsökkentheti az oldalak méretétTörölheti az összes gyorsítótárfájltEltávolíthatja az emoji inline CSS-t és a wp-emoji-release.min.js fájltfájlok törléseGoogle Analytics paraméterei vannakWoocommerce tételei vannak a kosárbanhttp://wordpress.org/plugins/wp-fastest-cache/oldal / percPKL\%_+_+1wp-fastest-cache/languages/wp-fastest-cache-ja.monu[    '  "  * : G X e z       / J i 2 0   % . < .Z      ; 1 .D s }      A)k ~ =  '3 DN Ub{*=Pcx    !)=U [iow/.* .3bu F   `(    9#9] =&% !/Q?p3UT:. ->Zr ELH[ x2 $%J:c0-*1(0Z'QQW s 3?8T(sT<@S     '6L`exs " / .K Vz    !! .! ;!H! a!!! !!! !!!!""$"6"H"Z"i"{""""""""'"!'#I#e#$u## ##=#?#?9$y$E$!$'%)%0%C%J%v]%%%%%&:& &&&' '*'I'Z'u'<|'E'"'Q"((t('((=(Q )Br)i)Z*!z*)*+*2*%+E+SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below.The simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostUser RolesWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2024-12-13 14:12:14+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Generator: GlotPress/4.0.1 Language: ja_JP Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) 設定新規ルールを追加高度な設定すべてすべてのキャッシュファイルが同様に削除されますアーカイブ少なくとも1つのサイトマップを追加する必要があります添付ファイルブラウザ キャッシュCDN 設定キャッシュ 統計システム キャッシュキャッシュ タイムアウト ウィザードキャンセルカテゴリー1つ選ぶ方式を選択すべてのキャッシュを削除キャッシュを削除キャッシュと縮小した CSS / JS をクリアするすべてのサイトのキャッシュを削除ホームページのキャッシュを削除ページ送りのキャッシュを削除投稿/固定ページのキャッシュを削除投稿カテゴリーのキャッシュを削除投稿タグのキャッシュを削除投稿や固定ページを公開した時、キャッシュファイルを削除投稿や固定ページを更新した時、キャッシュファイルを削除特定のページを削除CSS を統合JS を統合JS をさらに統合含むコンテンツタイプモバイル用テーマのキャッシュを作成自動的にサイトすべてのキャッシュを作成するカスタム投稿タイプカスタムタクソノミーデータベース クリーンアップDelay JS絵文字を無効にするデスクトップ用のキャッシュをモバイルデバイスに表示しないログインユーザーにキャッシュを表示しないレンダリングブロックする JS ソースを除外するEmre Vona有効化Gzip を有効除外するCSS を除外クッキーを除外JS を除外ページウィザードを除外する固定ページを除外User-Agents を除外Google フォントGzipホームページホームページREQUEST_URI がもし CSS ファイルを編集した場合、縮小した CSS ファイルを削除しなければなりません画像の最適化次と同等遅延読み込みの設定Google フォントを非同期で読み込むブラウザのビューポイントに入った時、画像や iframe を読み込むログインユーザーCSS を縮小CSS を縮小 PlusHTML を縮小HTML を縮小 PlusJS を縮小モバイルモバイル用テーマさらに強力な CSS の縮小さらに強力な HTML の縮小新規投稿OK1分毎に1度10日に1度10時間毎に1度15日毎に1度15分毎に1度2時間毎に1度3日毎に1度3時間毎に1度4時間毎に1度5時間毎に1度5分毎に1度6時間毎に1度7日毎に1度7時間毎に1度8時間毎に1度9時間毎に1度1日毎に1度1ヶ月に1度1年毎に1度1時間毎に1度プレミアム版でのみ利用可能イメージツールを最適化設定を保存しました固定ページアップデートしてください投稿先読み先読み設定CSSファイルを統合してHTTPリクエストを減らすJS ファイルを統合して HTTP リクエストを減らすリピート訪問者のページ読み込み時間を減らすSQL クエリー数を減らすサーバーから送信されるファイルのサイズを減らすレンダリングブロック JS完了後に先読みを再スタート保存サーバー時刻設定サイトマップ一部の JS ソースは、スクロールやマウスの移動が行われるまで読み込まれなくなります次で始まる成功タグ対象のフォルダ管理ツールバーの WP Fastest Cache メニューは、以下の選択されたユーザー権限グループに表示されます。最もシンプルで速い WP キャッシュシステム次を適用タイムアウト ルールツールバー設定1時間に2度投稿更新ユーザー権限グループWP Fastest CacheWP Fastest Cache の設定警告新しい投稿を公開後にどのようにしますか?投稿や固定ページの更新後にどのようにしますか?ウィジェット キャッシュこのセクションでは、高度な設定をカスタマイズできます。CSS ファイルのサイズを減らすJS ファイルのサイズを減らすHTMLのサイズを減らすすべてのキャッシュ ファイルを削除できます絵文字のインライン CSS や wp-emoji-release.min.js を削除できます先読みに使用するサイトマップを指定できます。先読みに使用するコンテンツを指定でき、さらに並べ替えることもできます。このセクションでは、先読み機能に使用する方式を指定できます。このファイルを削除するGoogle Analytics パラメーターありカートに Woocommerce アイテムありhttps://ja.wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/1分あたりページ数PKL\0t<t<4wp-fastest-cache/languages/wp-fastest-cache-en_ZA.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in English (South Africa) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2021-02-02 07:22:35+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: en_ZA\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "" #: templates/preload.php:186 msgid "Advanced Settings" msgstr "" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "" #: templates/preload.php:150 msgid "Sitemaps" msgstr "" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "" #: templates/preload.php:86 msgid "Content Types" msgstr "" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "" #: templates/preload.php:72 msgid "Choose a Method" msgstr "" #: templates/preload.php:56 msgid "Preload Settings" msgstr "" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Save" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Cancel" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Tool bar Settings" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Clear Cache of All Sites" #: wpFastestCache.php:439 msgid "Settings" msgstr "Settings" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Clear Cache" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Eliminate render-blocking JavaScript resources" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Options have been saved" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "has WooCommerce Items in Basket" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "has Google Analytics Parameters" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archives" #: templates/timeout.php:189 msgid "Server Time" msgstr "Server Time" #: templates/timeout.php:169 msgid "delete the files" msgstr "delete the files" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Contains" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Is Equal To" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Starts With" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Home Page" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "All" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Exclude Page Wizard" #: templates/timeout.php:124 msgid "Then" msgstr "Then" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "If REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Cache Timeout Wizard" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Lazy Load Settings" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Enable Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Please Update" #: templates/update_success.php:9 msgid "Success" msgstr "Success" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Warning" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Add New Rule" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Only available in Premium version" #: templates/timeout.php:141 msgid "Choose One" msgstr "Choose One" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "All cache files will be removed as well" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "If you modify any CSS file, you have to delete minified CSS files" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Target folder" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "You can delete all cache files" #: inc/admin.php:1090 msgid "Exclude" msgstr "Exclude" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Image Optimisation" #: inc/admin.php:1082 msgid "Settings" msgstr "Settings" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Database Cleanup" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN Settings" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Exclude JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Exclude CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Exclude Cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Exclude User-Agents" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Exclude Pages" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Optimise Image Tool" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Timeout Rules" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Cache Statistics" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Clear Cache of Post / Page" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "What do you want to happen after update a post or a page?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Clear Cache of Pagination" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Clear Cache of Post Tags" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Clear Cache of Post Categories" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Clear All Cache" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "What do you want to happen after publishing the new post?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Restart After Completed" #: templates/preload.php:210 msgid "pages per minute" msgstr "pages per minute" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Custom Taxonomies" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Custom Post Types" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Attachments" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Tags" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Pages" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categories" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Posts" #: templates/preload.php:102 msgid "Homepage" msgstr "Homepage" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Reduce HTTP requests through combined JS files" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Load images and iframes when they enter the browsers viewport" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Load Google Fonts asynchronously" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google Fonts" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Render Blocking JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "You can remove the emoji inline CSS and wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Disable Emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Reduce page load times for repeat visitors" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Browser Caching" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Reduce the size of files sent from your server" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combine JS Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combine JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "You can decrease the size of JS files" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minify JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Reduce HTTP requests through combined CSS files" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combine CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "More powerful minify CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minify CSS Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "You can decrease the size of CSS files" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minify CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "More powerful minify HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minify HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "You can decrease the size of page" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minify HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Clear cache files when a post or page is updated" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Update Post" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Clear cache files when a post or page is published" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "New Post" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Create cache for mobile theme" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Mobile Theme" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Don't show the cached version for desktop to mobile devices" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobile" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Don't show the cached version for logged-in users" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Logged-in Users" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Create the cache of all the site automatically" #: inc/admin.php:1157 msgid "Preload" msgstr "Preload" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Reduce the number of SQL queries" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget Cache" #: inc/admin.php:1119 msgid "Enable" msgstr "Enable" #: inc/admin.php:1118 msgid "Cache System" msgstr "Cache System" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Once Every 15 Days" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Once Every 7 Days" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Once Every 3 Days" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Once Every 10 Hours" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Once Every 9 Hours" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Once Every 8 Hours" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Once Every 7 Hours" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Once Every 5 Hours" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Once Every 4 Hours" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Once Every 3 Hours" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Once Every 2 Hours" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Once Every 10 Days" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "The simplest and fastest WP Cache system" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://en-za.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Once a Year" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Once a Month" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Once a Day" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Once Every 6 Hours" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Once an Hour" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Twice an Hour" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Once Every 15 Minutes" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Once Every 5 Minutes" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Once Every 1 Minute"PKL\reDD4wp-fastest-cache/languages/wp-fastest-cache-fr_FR.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in French (France) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2025-02-07 13:38:45+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: fr\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "Le menu WP Fastest Cache de la barre d’outils de l’administrateur sera visible pour les utilisateurs et utilisatrices sélectionnés ci-dessous." #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "Rôles des comptes" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "Au moins un plan de site doit être ajouté" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "Cette section vous permet de personnaliser les réglages avancés." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Réglages avancés" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Vous pouvez spécifier les plans de site à utiliser pour le préchargement." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Plans de site" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Vous pouvez spécifier le contenu à utiliser pour le préchargement et également le trier." #: templates/preload.php:86 msgid "Content Types" msgstr "Types de contenu" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "Vous pouvez spécifier la méthode que vous souhaitez utiliser pour la fonctionnalité de préchargement dans cette section." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Choisir une méthode" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Réglages des préchargements" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "" "Certaines sources JS ne seront pas chargées tant que le défilement \n" "ou le déplacement de la souris n’aura pas eu lieu." #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Temporisation JS" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "Options de WP Fastest Cache" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "possède des paramètres Yandex Click ID" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Vider le cache de certaines pages" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Enregistrer" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Annuler" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Réglages de la barre d’outils" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Vider le cache de tous les sites" #: wpFastestCache.php:439 msgid "Settings" msgstr "Réglages" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Vider le cache" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Élimine les ressources JavaScript bloquant le rendu (Premium)" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Les options ont été enregistrées" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "a des articles WooCommerce dans le panier" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "a des paramètres Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archives" #: templates/timeout.php:189 msgid "Server Time" msgstr "Heure du serveur" #: templates/timeout.php:169 msgid "delete the files" msgstr "supprimer les fichiers" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Contient" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Est égal à" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Commence par" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Page d’accueil" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Tous" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Assistant d’exclusion de page" #: templates/timeout.php:124 msgid "Then" msgstr "Alors" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "si REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Assistant d’expiration du cache" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Réglages pour le chargement différé" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Activer Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Veuillez mettre à jour" #: templates/update_success.php:9 msgid "Success" msgstr "Succès" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Avertissement" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Ajouter une nouvelle règle" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "Vider le cache et les CSS/JS minifiés" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Disponible uniquement avec la version Premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Choisissez-en un" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Tous les fichiers de cache seront également supprimés" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Si vous modifiez un fichier CSS, vous devez supprimer les fichiers CSS minifiés" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Dossier cible" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Vide tous les fichiers cache" #: inc/admin.php:1090 msgid "Exclude" msgstr "Exclure" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimisation d’images" #: inc/admin.php:1082 msgid "Settings" msgstr "Réglages" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Nettoyage de la base de données" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Réglages CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Exclure les JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Exclure les CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Exclure les cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Exclure les agents utilisateurs" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Exclure les pages" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Outil optimisation d’image" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Règles de délai d’expiration" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Statistiques de cache" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Vider le cache d’article/page" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Que voulez-vous qu’il se passe après la mise à jour d’une publication ou d’une page ?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Vider le cache de pagination" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Vider le cache des étiquettes de publication" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Vider le cache des catégories de publication" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Vider le cache de la page d’accueil" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Nettoyer tout le cache" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Que voulez-vous qu’il se passe après la mise en ligne d’une nouvelle publication ?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "OK" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Redémarrer une fois terminé" #: templates/preload.php:210 msgid "pages per minute" msgstr "pages par minute" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Taxonomies personnalisées" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Types de publications personnalisés" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Fichiers joints" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Étiquettes" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Pages" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Catégories" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Publications" #: templates/preload.php:102 msgid "Homepage" msgstr "Page d’accueil " #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Réduit les requêtes HTTP grâce aux fichiers JS combinés" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Charge les images et les iframes quand ils entrent dans la fenêtre du navigateur (Premium)" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Charge les polices Google de façon asynchrone (Premium)" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Polices Google " #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Blocage de rendu JS " #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Retire les émojis CSS en ligne et wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Désactiver les émojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Réduit les temps de chargement des pages pour les visiteurs réguliers" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Cache navigateur" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Réduit la taille des fichiers envoyés depuis votre serveur" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combiner le JS Plus " #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combiner le JS " #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Diminue la taille des fichiers JS (Premium)" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minifier le JS " #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Réduit les requêtes HTTP grâce aux fichiers CSS combinés" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combiner le CSS " #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Minification CSS plus puissante (Premium)" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minifier le CSS Plus " #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Diminue la taille des fichiers CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minifier le CSS " #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Minification HTML plus puissante (Premium)" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minifier le HTML Plus " #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Diminue la taille de la page" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minifier le HTML " #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Vide les fichiers de cache lors de la mise à jour d’un article ou d’une page" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Màj de publication" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Vide les fichiers de cache lors de la publication d’un article ou d’une page" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nouvelle publication" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Crée un cache pour le thème mobile (Premium)" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Thème mobile " #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "N’affiche pas la version mise en cache pour les ordinateurs sur les mobiles" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobile" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "N’affiche pas la version mise en cache pour les utilisateurs connectés" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Utilisateurs connectés " #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Crée automatiquement le cache pour tout le site" #: inc/admin.php:1157 msgid "Preload" msgstr "Préchargement " #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Réduit le nombre de requêtes SQL (Premium)" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Cache de widget " #: inc/admin.php:1119 msgid "Enable" msgstr "Actif" #: inc/admin.php:1118 msgid "Cache System" msgstr "Système de cache" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Tous les 15 jours" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Tous les 7 jours" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Tous les 3 jours" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Toutes les 10 heures" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Toutes les 9 heures" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Toutes les 8 heures" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Toutes les 7 heures" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Toutes les 5 heures" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Toutes les 4 heures" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Toutes les 3 heures" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Toutes les 2 heures" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Tous les 10 jours" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Le plus simple et le plus rapide des systèmes de cache pour WordPress" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Une fois par an" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Une fois par mois" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Une fois par jour" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Toutes les 6 heures" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Toutes les heures" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Deux fois par heure" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Toutes les 15 minutes" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Toutes les 5 minutes" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Toutes les minutes"PKL\G8)8)4wp-fastest-cache/languages/wp-fastest-cache-es_CL.monu[| | }   '  "   * 7 H U j q |        : Y 2r 0     , .J y     ; 1 .4 c m t       A[ nz =  # 4> ERk-@Sh{    !-E KY_g/x.* .#Re} F  (7 <J [ iu99 =(&f%!?34UhT$Db. 3E7J))< E Q[j#$('#+K)wHJ5 R _k{*1 0 MXNn<: 5? GT \h x Rl 0T4 HVfu    . D Z r       !!1!F![!k!z!!&!)!! ""*" 3"="<Q"<"H"##;8#t# #####]# @$M$ V$`$)s$$$#$$$%% 3%@?%K%%E%-#&,Q&'~&-&T&K)'_u'i'?(%S(-y()(2()$)SettingsAdd New RuleAdvanced SettingsAllAll cache files will be removed as wellArchivesAt least one sitemap must be addedAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneChoose a MethodClear All CacheClear CacheClear Cache and Minified CSS/JSClear Cache of All SitesClear Cache of Home pageClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedClearing Specific PagesCombine CssCombine JsCombine Js PlusContainsContent TypesCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDelay JsDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadPreload SettingsReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsSitemapsSome js sources will not be loaded until scrolling or moving the mouseStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWP Fastest Cache OptionsWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can customize the advanced settings through this section.You can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsYou can specify sitemaps to be used for preloading.You can specify the contents to be used for preloading and you can sort them as well.You can specify the method you want the preload feature to use through this section.delete the fileshas Google Analytics Parametershas Woocommerce Items in Carthas Yandex Click ID Parametershttp://wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/pages per minutePO-Revision-Date: 2025-02-14 17:49:47+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: es_CL Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) AjustesAgregar una nueva reglaAjustes avanzadosTodoTambién se eliminarán todos los archivos de la cachéArchivosDebe agregarse al menos un mapa del sitioAdjuntosCaché del navegadorAjustes de la CDNEstadísticas de la cachéSistema de cachéAsistente del tiempo límite de la cachéCancelarCategoríasElige unoElegir métodoVaciar toda la cachéVaciar la cachéBorrar la caché y minimizar CSS/JSVaciar la caché de todos los sitiosVaciar la caché de la página de inicioVaciar la caché de paginaciónVaciar la caché de entradas / páginasVaciar la caché de categorías de entradasVaciar la caché de etiquetas de entradasVaciar los archivos de la caché cuando se publica una entrada o páginaVaciar los archivos de la caché cuando se actualiza una entrada o páginaVaciar páginas específicasCombinar CSSCombinar JSCombine Js PlusContieneTipos de contenidoCrear la caché para el tema para móvilesCrear automáticamente la caché de todo el sitioTipos de contenido personalizadoTaxonomías personalizadasLimpieza de la base de datosAplazar JsDesactivar los emojisNo mostrar la versión de escritorio de la caché en los dispositivos móvilesNo mostrar la versión de la caché para usuarios conectadosEliminar los recursos JavaScript que bloquean los procesosEmre VonaActivarActivar GzipExcluirExcluir CSSExcluir cookiesExcluir JSAsistente para excluir páginasExcluir páginasExcluir agentes de usuarioFuentes de GoogleGzipPágina de inicioPágina de inicioSi REQUEST_URISi modificas cualquier archivo CSS, tienes que borrar los archivos CSS minimizadosOptimización de imágenesEs igual aAsistente de carga diferidaCargar las fuentes de Google de forma asíncronaCargar las imágenes e iframes cuando entren en la visualización de los navegadoresUsuarios conectadosMinimizar CSSMinify Css PlusMinimizar HTMLMinify HTML PlusMinimizar JSMóvilTema para móvilesMás potente minimización CSSMás potente minimización HTMLNueva entradaAceptarUna vez cada 1 minutoUna vez cada 10 díasUna vez cada 10 horasUna vez cada 15 díasUna vez cada 15 minutosUna vez cada 2 horasUna vez cada 3 díasUna vez cada 3 horasUna vez cada 4 horasUna vez cada 5 horasUna vez cada 5 minutosUna vez cada 6 horasUna vez cada 7 díasUna vez cada 7 horasUna vez cada 8 horasUna vez cada 9 horasUna vez al díaUna vez al mesUna vez al añoUna vez por horaSolo disponible en la versión premiumHerramienta de optimización de imágenesLas opciones han sido guardadasPáginasPor favor, actualizaEntradasPrecargarAjustes de precargaReducir las solicitudes HTTP mediante archivos JS combinadosReducir las solicitudes HTTP mediante archivos JS combinadosReducir el tiempo de carga de la página para los visitantes repetitivosReducir el número de consultas SQLReducir el tamaño de los archivos enviados por tu servidorBloqueo de procesado de JSReiniciar después de completadoGuardarHora del servidorAjustesMapas del sitioAlgunos orígenes de js no se cargarán hasta que se haga desplazamiento o se mueva el ratónComienza conCorrectoEtiquetasCarpeta de destinoEl sistema WP Cache más simple y rápidoEntoncesReglas de límiteAjustes de la barra de herramientasDos veces por horaActualizar la entradaWP Fastest CacheOpciones de WP Fastest CacheAdvertencia¿Qué quieres que ocurra después de publicar la nueva entrada?¿Qué quieres que ocurra después de actualizar una entrada o una página?Widget de cachéPuedes personalizar los ajustes avanzados a través de esta sección.Puedes reducir el tamaño de los archivos CSSPuedes reducir el tamaño de los archivos JSPuedes reducir el tamaño de la páginaPuedes borrar todos los archivos de la cachéPuedes eliminar los emojis CSS integrados y el archivo “wp-emoji-release.min.js”Puedes especificar los mapas del sitio que se utilizarán para la precarga.Puedes especificar el contenido que se utilizará para la precarga y también puedes ordenarlo.Puedes especificar el método que quieres que utilice la función de precarga a través de esta sección.borrar los archivostiene parámetros de Google Analyticstiene artículos de WooCommerce en el carritotiene parámetros de ID de clic de Yandexhttps://cl.wordpress.org/plugins/wp-fastest-cache/https://www.wpfastestcache.com/páginas por minutoPKL\YQ A A4wp-fastest-cache/languages/wp-fastest-cache-sl_SI.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Slovenian # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2023-12-18 14:05:59+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n % 100 == 1) ? 0 : ((n % 100 == 2) ? 1 : ((n % 100 == 3 || n % 100 == 4) ? 2 : 3));\n" "X-Generator: GlotPress/4.0.1\n" "Language: sl_SI\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "" #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "Vsaj en sitemap mora biti dodan" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "V tem razdelku lahko prilagodite napredne nastavitve." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Napredne Nastavitve" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Določite lahko zemljevide spletnih mest, ki se bodo uporabljali za prednalaganje." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Zemljevidi spletnih mest" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Zemljevidi spletnih mest" #: templates/preload.php:86 msgid "Content Types" msgstr "Vrste vsebine" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "V tem razdelku lahko določite metodo, ki jo želite uporabiti za funkcijo prednalaganja." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Izberite metodo" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Nastavitve prednalaganja" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Nekateri viri JS se ne bodo naložili, dokler se ne pomaknete ali premaknete miške" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Zakasnitev JS" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "Možnosti za WP Fastet Cache" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "ima Yandex Click ID parametre" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Čiščenje določenih strani" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Shrani" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Prekini" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Nastavitve orodne vrstice" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Počisti predpomnilnik za vse strani" #: wpFastestCache.php:439 msgid "Settings" msgstr "Nastavitve" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Počisti medpomnilnik" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Odpravi Java-Script vire, ki ovirajo izrisovanje" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Nastavitve so shranjene" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "ima Woocommerce artikle na seznamu" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "ima Google Analytics parametre" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Arhivi" #: templates/timeout.php:189 msgid "Server Time" msgstr "Čas strežnika" #: templates/timeout.php:169 msgid "delete the files" msgstr "izbriši datoteke" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Vsebuje" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Je enak kot" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Se začne s/z" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Domača stran" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Vse" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Čarovnik za izločanje strani" #: templates/timeout.php:124 msgid "Then" msgstr "Potem" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Če REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "ČParovnik za časovni potek predpomnilnika" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Nastavitve za lenobno nalaganje" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Omogoči Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Prosimo, posodobite" #: templates/update_success.php:9 msgid "Success" msgstr "Je bilo uspešno" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Opozorilo" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Dodaj novo pravilo" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Na voljo le v premium različici" #: templates/timeout.php:141 msgid "Choose One" msgstr "Izberite eno" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "Odstranjene bodo tudi vse datoteke predpomnilnika" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Ob spremembi katerekoli css datoteke je potrebno izbrisati pomanjšane css datoteke" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Ciljna mapa" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Lahko izbrišete vse datoteke predpomnilnika" #: inc/admin.php:1090 msgid "Exclude" msgstr "Izloči" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimizacija slik" #: inc/admin.php:1082 msgid "Settings" msgstr "Nastavitve" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Očiščenje podatkovne baze" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "CDN nastavitve" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Izloči JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Izločii CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Izloči piškotke" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Izloči uporabniške agente" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Izloči strani" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Orodje za optimizacijo slik" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Pravila za potek časa" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Statistka predpomnilnika" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Počisti predpomnilnik prispevka / strani" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "Kaj naj se zgodi po posodobitvi prispevka ali strani?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Počisti predpomnilnik številčenja strani" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Počisti predpomnilnik oznak strani" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Počisti predpomnilnik kategorij prispevkov" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Počisti celoten predpomnilnik" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "Kaj naj se zgodi po objavi novega prispevka?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "V redu" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Ko končasš ponovno zaženi" #: templates/preload.php:210 msgid "pages per minute" msgstr "strani na minuto" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Taksonomije po meri" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Vrste prispevkov po meri" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Priponke" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Oznake" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Strani" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Kategorije" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Prispevki" #: templates/preload.php:102 msgid "Homepage" msgstr "Domača stran" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Zmanjšaj HTTP zahtevke s pomočjo kombiniranih js datotek" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Naloži slike in iframe okvireje, ko se pojavijo v vidnem delu brskalnika" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Asinhrono nalaganje Google pisav" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Google pisave" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Js, ki ovira izrisovanje" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Lahko izbrišete medvrstični css čustvenih simbolov in wp-emoji-release.min.js" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Onemogoči čustvene simbole" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Zmanjšaj čas nalaganja za ponovne obiskovalce" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Predpomnilnik brskalnika" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Zmanjšaj velikost datotek, ki jih pošlje strežnik" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Kombiniraj Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Kombiniraj Js" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Lahko zmanjšate velilkost js datotek" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Zmanjšaj Js" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Lahko zmanjšate število HTTP zahtevkov s pomočjo kombiniranih css datotek" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Kombiniraj Css" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Bolj zmogljiva css pomanjšava" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Zmanjšaj Css Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Lahko zmanjšate velikost css datotek" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Zmanjšaj Css" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Bolj zmogljiva pomanjšava html" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Zmanjšaj HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Lahko zmanjšate velikost strani" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Zmanjšaj HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Izbriši datoteke predpomnilnika, ko sta prispevek ali stran posodobljena" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Posodobi prispevek" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Izbriši datoteke predpomnilnika, ko sta prispevek ali stran objavljena" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nov prispevek" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Ustvari predpomnilnik za mobilno temo" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Mobilna tema" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Ne prikaži prepomnjene namizne različice na mobilnih napravah" #: inc/admin.php:1195 msgid "Mobile" msgstr "Mobilno" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "Ne prikaži prepomnjene različice za prijavljene uporabnike" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Prijavljeni uporabniki" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Samodejno ustvari prepomnilnik vseh strani" #: inc/admin.php:1157 msgid "Preload" msgstr "Prednalaganje" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Zmanjšaj število SQL poizvedb" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Predpomnilnik gradnikov" #: inc/admin.php:1119 msgid "Enable" msgstr "Omogoči" #: inc/admin.php:1118 msgid "Cache System" msgstr "Sistemski predpomnilnik" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Na vsake 15 dni" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Na vsake 7 dni" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Na vsake 3 dni" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Na vsakh 10 ur" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Na vsakih 9 ur" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Na vsakih 8 ur" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Na vsakih 7 ur" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Na vsakih 5 ur" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Na vsake 4 ure" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Na vsake 3 ure" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Na vsaki 2 uri" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Enkrat na 10 dni" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "Najenostavnejši in najhitrejši predpomnilniški sistem za WP" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Enkrat na leto" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Enkrat na mesec" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Enkrat na dan" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Na vsakih 6 ur" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Na vsako uro" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Dvakrat na uro" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Na vsakih 15 minut" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Na vsakih 5 minut" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Na vsako minuto"PKL\¤==4wp-fastest-cache/languages/wp-fastest-cache-pt_BR.ponu[# Copyright (C) 2019 WP Fastest Cache # This file is distributed under the same license as the WP Fastest Cache package. msgid "" msgstr "" "Project-Id-Version: WP Fastest Cache 0.8.9.7\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-fastest-" "cache\n" "POT-Creation-Date: 2019-09-09 20:43:14+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-09-19 17:03-0300\n" "Language-Team: \n" "X-Generator: Poedit 2.2.3\n" "Last-Translator: \n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "Language: pt_BR\n" #: inc/admin.php:429 inc/admin.php:432 msgid "Options have been saved" msgstr "As opções foram salvas" #: inc/admin.php:987 msgid "Settings" msgstr "Configurações" #: inc/admin.php:988 inc/admin.php:1458 inc/admin.php:1463 msgid "Delete Cache" msgstr "Excluir cache" #: inc/admin.php:990 msgid "Image Optimization" msgstr "Otimização de imagem" #: inc/admin.php:992 msgid "Exclude" msgstr "Excluir" #: inc/admin.php:1020 msgid "Cache System" msgstr "Sistema de cache" #: inc/admin.php:1021 msgid "Enable" msgstr "Ativar" #: inc/admin.php:1046 inc/admin.php:1052 inc/admin.php:1059 inc/admin.php:1066 msgid "Widget Cache" msgstr "Cache de widget" #: inc/admin.php:1047 inc/admin.php:1053 inc/admin.php:1060 inc/admin.php:1067 msgid "Reduce the number of SQL queries" msgstr "Reduzir o número de consultas SQL" #: inc/admin.php:1075 templates/preload.php:20 msgid "Preload" msgstr "Pré-carregamento" #: inc/admin.php:1076 msgid "Create the cache of all the site automatically" msgstr "Criar o cache de todo o site automaticamente" #: inc/admin.php:1085 msgid "Logged-in Users" msgstr "Usuários logados" #: inc/admin.php:1086 msgid "Don't show the cached version for logged-in users" msgstr "Não mostrar a versão em cache para usuários logados" #: inc/admin.php:1090 msgid "Mobile" msgstr "Celular" #: inc/admin.php:1091 msgid "Don't show the cached version for desktop to mobile devices" msgstr "Não mostrar a versão em cache para desktop em dispositivos móveis" #: inc/admin.php:1096 inc/admin.php:1122 msgid "Mobile Theme" msgstr "Tema do celular" #: inc/admin.php:1097 inc/admin.php:1123 msgid "Create cache for mobile theme" msgstr "Criar cache para o tema do celular" #: inc/admin.php:1129 templates/newpost.php:18 msgid "New Post" msgstr "Novo post" #: inc/admin.php:1130 msgid "Clear cache files when a post or page is published" msgstr "Limpar arquivos de cache quando um post ou página for publicada" #: inc/admin.php:1136 templates/updatepost.php:18 msgid "Update Post" msgstr "Atualizar post" #: inc/admin.php:1137 msgid "Clear cache files when a post or page is updated" msgstr "Limpar arquivos de cache quando um post ou página for atualizada" #: inc/admin.php:1145 msgid "Minify HTML" msgstr "Minificar HTML" #: inc/admin.php:1146 msgid "You can decrease the size of page" msgstr "Você pode diminuir o tamanho da página" #: inc/admin.php:1152 inc/admin.php:1157 msgid "Minify HTML Plus" msgstr "Minificar HTML Plus" #: inc/admin.php:1153 inc/admin.php:1158 msgid "More powerful minify html" msgstr "Mais poderoso minificador HTML" #: inc/admin.php:1165 msgid "Minify Css" msgstr "Minificar Css" #: inc/admin.php:1166 msgid "You can decrease the size of css files" msgstr "Você pode diminuir o tamanho dos arquivos css" #: inc/admin.php:1174 inc/admin.php:1179 msgid "Minify Css Plus" msgstr "Minificar Css Plus" #: inc/admin.php:1175 inc/admin.php:1180 msgid "More powerful minify css" msgstr "Mais poderoso minificador css" #: inc/admin.php:1186 msgid "Combine Css" msgstr "Combinar Css" #: inc/admin.php:1187 msgid "Reduce HTTP requests through combined css files" msgstr "Reduza solicitações HTTP por meio de arquivos css combinados" #: inc/admin.php:1194 inc/admin.php:1199 inc/admin.php:1205 msgid "Minify Js" msgstr "Minificar Js" #: inc/admin.php:1195 inc/admin.php:1200 inc/admin.php:1206 msgid "You can decrease the size of js files" msgstr "Você pode diminuir o tamanho dos arquivos js" #: inc/admin.php:1211 msgid "Combine Js" msgstr "Combinar JS" #: inc/admin.php:1212 inc/admin.php:1220 inc/admin.php:1226 inc/admin.php:1232 msgid "Reduce HTTP requests through combined js files" msgstr "Reduza solicitações HTTP por meio de arquivos js combinados" #: inc/admin.php:1218 inc/admin.php:1225 inc/admin.php:1231 msgid "Combine Js Plus" msgstr "Combinar Js Plus" #: inc/admin.php:1237 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1238 msgid "Reduce the size of files sent from your server" msgstr "Reduza o tamanho dos arquivos enviados do seu servidor" #: inc/admin.php:1249 msgid "Browser Caching" msgstr "Cache do navegador" #: inc/admin.php:1250 msgid "Reduce page load times for repeat visitors" msgstr "" "Reduza os tempos de carregamento de página para os visitantes que " "retornaram ao site" #: inc/admin.php:1255 msgid "Disable Emojis" msgstr "Desativar Emojis" #: inc/admin.php:1256 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Você pode remover o emoji inline css e wp-emoji-release.min.js" #: inc/admin.php:1264 inc/admin.php:1270 inc/admin.php:1277 msgid "Render Blocking Js" msgstr "Bloqueio de renderização Js" #: inc/admin.php:1265 inc/admin.php:1271 inc/admin.php:1278 msgid "Remove render-blocking JavaScript" msgstr "Remover javaScript de bloqueio de renderização" #: inc/admin.php:1290 inc/admin.php:1296 inc/admin.php:1303 msgid "Google Fonts" msgstr "Fontes do Google" #: inc/admin.php:1291 inc/admin.php:1297 inc/admin.php:1304 msgid "Load Google Fonts asynchronously" msgstr "Carregar fontes do Google de forma assíncrona" #: inc/admin.php:1314 inc/admin.php:1333 inc/admin.php:1340 msgid "Lazy Load" msgstr "Carregamento lento" #: inc/admin.php:1320 inc/admin.php:1334 inc/admin.php:1341 msgid "Load images and iframes when they enter the browsers viewport" msgstr "" "Carregar imagens e iframes quando eles entrarem na viewport dos navegadores" #: inc/admin.php:1411 inc/admin.php:2039 inc/admin.php:2260 msgid "Only available in Premium version" msgstr "Disponível apenas na versão premium" #: inc/admin.php:1418 msgid "Cache Statistics" msgstr "Estatísticas de cache" #: inc/admin.php:1467 msgid "You can delete all cache files" msgstr "Você pode excluir todos os arquivos de cache" #: inc/admin.php:1468 inc/admin.php:1482 inc/admin.php:1483 msgid "Target folder" msgstr "Diretório de destino" #: inc/admin.php:1476 msgid "Delete Cache and Minified CSS/JS" msgstr "Excluir cache e arquivos minificados CSS/JS" #: inc/admin.php:1480 msgid "If you modify any css file, you have to delete minified css files" msgstr "" "Se você modificar qualquer arquivo css, você precisará apagar os arquivos " "css minificados" #: inc/admin.php:1481 msgid "All cache files will be removed as well" msgstr "Todos os arquivos de cache serão removidos também" #: inc/admin.php:1497 msgid "Timeout Rules" msgstr "Regras de limite de tempo" #: inc/admin.php:1504 templates/timeout.php:95 msgid "All" msgstr "Tudo" #: inc/admin.php:1505 inc/admin.php:1773 templates/exclude.php:93 #: templates/timeout.php:96 msgid "Home Page" msgstr "Página inicial" #: inc/admin.php:1506 inc/admin.php:1780 templates/exclude.php:102 #: templates/timeout.php:97 msgid "Starts With" msgstr "Começa com" #: inc/admin.php:1507 inc/admin.php:1781 templates/exclude.php:103 #: templates/timeout.php:99 msgid "Contains" msgstr "Contém" #: inc/admin.php:1508 inc/admin.php:1782 templates/exclude.php:104 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "É igual a" #: inc/admin.php:1540 inc/admin.php:1805 inc/admin.php:1822 inc/admin.php:1841 #: inc/admin.php:1859 inc/admin.php:1879 msgid "Add New Rule" msgstr "Adicionar nova regra" #: inc/admin.php:1614 msgid "Optimize Image Tool" msgstr "Ferramenta de otimização de imagem" #: inc/admin.php:1638 msgid "Discover Features" msgstr "Descubra os recursos" #: inc/admin.php:1641 msgid "" "In the premium version there are some new features which speed up the sites " "more." msgstr "" "Na versão premium existem alguns recursos novos que aceleram mais os sites." #: inc/admin.php:1647 msgid "New Features" msgstr "Novos recursos" #: inc/admin.php:1661 msgid "Checkout" msgstr "Finalizar compra" #: inc/admin.php:1664 msgid "You need to pay before downloading the premium version." msgstr "Você precisa pagar antes de fazer download da versão premium." #: inc/admin.php:1678 msgid "Just" msgstr "Apenas" #: inc/admin.php:1679 msgid "" "The download button will be available after paid. You can buy the premium " "version now." msgstr "" "O botão de download estará disponível após o pagamento. Você pode comprar a " "versão premium agora." #: inc/admin.php:1684 msgid "Purchased" msgstr "Comprado" #: inc/admin.php:1699 msgid "Buy" msgstr "Comprar" #: inc/admin.php:1712 msgid "Download & Update" msgstr "Download & atualização" #: inc/admin.php:1715 msgid "You can download and update the premium when you want if you paid." msgstr "" "Você pode fazer download e atualizar para premium quando quiser, se você já " "pagou." #: inc/admin.php:1721 msgid "Get It Now!" msgstr "Obter agora!" #: inc/admin.php:1722 msgid "" "Please don't delete the free version. Premium version works with the free " "version." msgstr "" "Por favor, não exclua a versão gratuita. A versão premium funciona junto " "com a versão gratuita." #: inc/admin.php:1728 msgid "Update" msgstr "Atualizar" #: inc/admin.php:1733 msgid "Download" msgstr "Download" #: inc/admin.php:1774 templates/exclude.php:94 templates/preload.php:41 msgid "Categories" msgstr "Categorias" #: inc/admin.php:1775 templates/exclude.php:95 templates/preload.php:49 msgid "Tags" msgstr "Tags" #: inc/admin.php:1776 templates/exclude.php:99 msgid "Archives" msgstr "Arquivos" #: inc/admin.php:1777 templates/exclude.php:96 templates/preload.php:37 msgid "Posts" msgstr "Posts" #: inc/admin.php:1778 templates/exclude.php:97 templates/preload.php:45 msgid "Pages" msgstr "Páginas" #: inc/admin.php:1779 templates/exclude.php:101 templates/preload.php:53 msgid "Attachments" msgstr "Anexos" #: inc/admin.php:1783 templates/exclude.php:105 msgid "has Google Analytics Parameters" msgstr "tem parâmetros do Google Analytics" #: inc/admin.php:1784 templates/exclude.php:106 msgid "has Woocommerce Items in Cart" msgstr "tem itens WooCommerce no carrinho" #: inc/admin.php:1801 msgid "Exclude Pages" msgstr "Excluir páginas" #: inc/admin.php:1818 msgid "Exclude User-Agents" msgstr "Excluir agentes de usuário" #: inc/admin.php:1837 msgid "Exclude Cookies" msgstr "Excluir cookies" #: inc/admin.php:1855 msgid "Exclude CSS" msgstr "Excluir CSS" #: inc/admin.php:1875 msgid "Exclude JS" msgstr "Excluir JS" #: inc/admin.php:1912 msgid "CDN Settings" msgstr "Configurações de CDN" #: inc/admin.php:2024 msgid "Database Cleanup" msgstr "Limpeza do banco de dados" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Aviso" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Assistente para excluir página" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Se REQUEST_URI" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Configurações de carregamento lento" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "O que você quer que aconteça depois de publicar um novo post?" #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Limpar todo o cache" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Homepage" msgstr "Limpar cache da página inicial" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Limpar cache de categorias do post" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Limpar cache de tags do post" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Limpar cache de paginação" #: templates/newpost.php:68 templates/preload.php:102 #: templates/updatepost.php:64 msgid "OK" msgstr "Ok" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Ativar o gzip" #: templates/preload.php:33 msgid "Homepage" msgstr "Página inicial" #: templates/preload.php:58 msgid "Custom Post Types" msgstr "Tipos personalizados de post" #: templates/preload.php:63 msgid "Custom Taxonomies" msgstr "Taxonomias personalizadas" #: templates/preload.php:87 msgid "pages per minute" msgstr "páginas por minuto" #: templates/preload.php:92 msgid "Restart After Completed" msgstr "Reiniciar depois de concluído" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Assistente de tempo limite do cache" #: templates/timeout.php:124 msgid "Then" msgstr "Então" #: templates/timeout.php:137 msgid "Choose One" msgstr "Escolha um" #: templates/timeout.php:165 msgid "delete the files" msgstr "excluir os arquivos" #: templates/timeout.php:185 msgid "Server Time" msgstr "Horário do servidor" #: templates/update_now.php:9 msgid "Please Update" msgstr "Por favor, atualize" #: templates/update_success.php:9 msgid "Success" msgstr "Sucesso" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "O que deseja que aconteça após atualizar um post ou página?" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Limpar cache de post / página" #: wpFastestCache.php:1462 msgid "Once Every 1 Minute" msgstr "A cada 1 minuto" #: wpFastestCache.php:1468 msgid "Once Every 5 Minutes" msgstr "A cada 5 minutos" #: wpFastestCache.php:1474 msgid "Once Every 15 Minutes" msgstr "A cada 15 minutos" #: wpFastestCache.php:1480 msgid "Twice an Hour" msgstr "A cada meia hora" #: wpFastestCache.php:1486 msgid "Once an Hour" msgstr "A cada 1h" #: wpFastestCache.php:1492 msgid "Once Every 2 Hours" msgstr "A cada 2h" #: wpFastestCache.php:1498 msgid "Once Every 3 Hours" msgstr "A cada 3h" #: wpFastestCache.php:1504 msgid "Once Every 4 Hours" msgstr "A cada 4h" #: wpFastestCache.php:1510 msgid "Once Every 5 Hours" msgstr "A cada 5h" #: wpFastestCache.php:1516 msgid "Once Every 6 Hours" msgstr "A cada 6h" #: wpFastestCache.php:1522 msgid "Once Every 7 Hours" msgstr "A cada 7h" #: wpFastestCache.php:1528 msgid "Once Every 8 Hours" msgstr "A cada 8h" #: wpFastestCache.php:1534 msgid "Once Every 9 Hours" msgstr "A cada 9h" #: wpFastestCache.php:1540 msgid "Once Every 10 Hours" msgstr "A cada 10h" #: wpFastestCache.php:1546 msgid "Once a Day" msgstr "Uma vez por dia" #: wpFastestCache.php:1552 msgid "Once Every 3 Days" msgstr "Uma vez a cada 3 dias" #: wpFastestCache.php:1558 msgid "Once Every 7 Days" msgstr "Uma vez a cada 7 dias" #: wpFastestCache.php:1564 msgid "Once Every 10 Days" msgstr "Uma vez a cada 10 dias" #: wpFastestCache.php:1570 msgid "Once Every 15 Days" msgstr "Uma vez a cada 15 dias" #: wpFastestCache.php:1576 msgid "Once a Month" msgstr "Uma vez por mês" #: wpFastestCache.php:1582 msgid "Once a Year" msgstr "Uma vez por ano" #. Plugin Name of the plugin/theme msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #. Plugin URI of the plugin/theme msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "http://wordpress.org/plugins/wp-fastest-cache/" #. Description of the plugin/theme msgid "The simplest and fastest WP Cache system" msgstr "O sistema mais simples e rápido sistema de cache para WordPress" #. Author of the plugin/theme msgid "Emre Vona" msgstr "Emre Vona" #. Author URI of the plugin/theme msgid "http://tr.linkedin.com/in/emrevona" msgstr "http://tr.linkedin.com/in/emrevona" PKL\../wp-fastest-cache/languages/wp-fastest-cache.potnu[# Copyright (C) 2019 WP Fastest Cache # This file is distributed under the same license as the WP Fastest Cache package. msgid "" msgstr "" "Project-Id-Version: WP Fastest Cache 0.8.9.8\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-fastest-cache\n" "POT-Creation-Date: 2019-10-05 12:57:35+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" #: inc/admin-toolbar.php:69 inc/admin.php:988 inc/admin.php:1458 #: inc/admin.php:1463 msgid "Delete Cache" msgstr "" #: inc/admin-toolbar.php:74 templates/newpost.php:51 #: templates/updatepost.php:49 msgid "Clear All Cache" msgstr "" #: inc/admin-toolbar.php:81 inc/admin.php:1476 msgid "Delete Cache and Minified CSS/JS" msgstr "" #: inc/admin.php:429 inc/admin.php:432 msgid "Options have been saved" msgstr "" #: inc/admin.php:987 msgid "Settings" msgstr "" #: inc/admin.php:990 msgid "Image Optimization" msgstr "" #: inc/admin.php:992 msgid "Exclude" msgstr "" #: inc/admin.php:1020 msgid "Cache System" msgstr "" #: inc/admin.php:1021 msgid "Enable" msgstr "" #: inc/admin.php:1046 inc/admin.php:1052 inc/admin.php:1059 inc/admin.php:1066 msgid "Widget Cache" msgstr "" #: inc/admin.php:1047 inc/admin.php:1053 inc/admin.php:1060 inc/admin.php:1067 msgid "Reduce the number of SQL queries" msgstr "" #: inc/admin.php:1075 templates/preload.php:20 msgid "Preload" msgstr "" #: inc/admin.php:1076 msgid "Create the cache of all the site automatically" msgstr "" #: inc/admin.php:1085 msgid "Logged-in Users" msgstr "" #: inc/admin.php:1086 msgid "Don't show the cached version for logged-in users" msgstr "" #: inc/admin.php:1090 msgid "Mobile" msgstr "" #: inc/admin.php:1091 msgid "Don't show the cached version for desktop to mobile devices" msgstr "" #: inc/admin.php:1096 inc/admin.php:1122 msgid "Mobile Theme" msgstr "" #: inc/admin.php:1097 inc/admin.php:1123 msgid "Create cache for mobile theme" msgstr "" #: inc/admin.php:1129 templates/newpost.php:18 msgid "New Post" msgstr "" #: inc/admin.php:1130 msgid "Clear cache files when a post or page is published" msgstr "" #: inc/admin.php:1136 templates/updatepost.php:18 msgid "Update Post" msgstr "" #: inc/admin.php:1137 msgid "Clear cache files when a post or page is updated" msgstr "" #: inc/admin.php:1145 msgid "Minify HTML" msgstr "" #: inc/admin.php:1146 msgid "You can decrease the size of page" msgstr "" #: inc/admin.php:1152 inc/admin.php:1157 msgid "Minify HTML Plus" msgstr "" #: inc/admin.php:1153 inc/admin.php:1158 msgid "More powerful minify html" msgstr "" #: inc/admin.php:1165 msgid "Minify Css" msgstr "" #: inc/admin.php:1166 msgid "You can decrease the size of css files" msgstr "" #: inc/admin.php:1174 inc/admin.php:1179 msgid "Minify Css Plus" msgstr "" #: inc/admin.php:1175 inc/admin.php:1180 msgid "More powerful minify css" msgstr "" #: inc/admin.php:1186 msgid "Combine Css" msgstr "" #: inc/admin.php:1187 msgid "Reduce HTTP requests through combined css files" msgstr "" #: inc/admin.php:1194 inc/admin.php:1199 inc/admin.php:1205 msgid "Minify Js" msgstr "" #: inc/admin.php:1195 inc/admin.php:1200 inc/admin.php:1206 msgid "You can decrease the size of js files" msgstr "" #: inc/admin.php:1211 msgid "Combine Js" msgstr "" #: inc/admin.php:1212 inc/admin.php:1220 inc/admin.php:1226 inc/admin.php:1232 msgid "Reduce HTTP requests through combined js files" msgstr "" #: inc/admin.php:1218 inc/admin.php:1225 inc/admin.php:1231 msgid "Combine Js Plus" msgstr "" #: inc/admin.php:1237 msgid "Gzip" msgstr "" #: inc/admin.php:1238 msgid "Reduce the size of files sent from your server" msgstr "" #: inc/admin.php:1249 msgid "Browser Caching" msgstr "" #: inc/admin.php:1250 msgid "Reduce page load times for repeat visitors" msgstr "" #: inc/admin.php:1255 msgid "Disable Emojis" msgstr "" #: inc/admin.php:1256 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "" #: inc/admin.php:1264 inc/admin.php:1270 inc/admin.php:1277 msgid "Render Blocking Js" msgstr "" #: inc/admin.php:1265 inc/admin.php:1271 inc/admin.php:1278 msgid "Eliminate render-blocking JavaScript resources" msgstr "" #: inc/admin.php:1290 inc/admin.php:1296 inc/admin.php:1303 msgid "Google Fonts" msgstr "" #: inc/admin.php:1291 inc/admin.php:1297 inc/admin.php:1304 msgid "Load Google Fonts asynchronously" msgstr "" #: inc/admin.php:1314 inc/admin.php:1333 inc/admin.php:1340 msgid "Lazy Load" msgstr "" #: inc/admin.php:1320 inc/admin.php:1334 inc/admin.php:1341 msgid "Load images and iframes when they enter the browsers viewport" msgstr "" #: inc/admin.php:1411 inc/admin.php:2039 inc/admin.php:2260 msgid "Only available in Premium version" msgstr "" #: inc/admin.php:1418 msgid "Cache Statistics" msgstr "" #: inc/admin.php:1467 msgid "You can delete all cache files" msgstr "" #: inc/admin.php:1468 inc/admin.php:1482 inc/admin.php:1483 msgid "Target folder" msgstr "" #: inc/admin.php:1480 msgid "If you modify any css file, you have to delete minified css files" msgstr "" #: inc/admin.php:1481 msgid "All cache files will be removed as well" msgstr "" #: inc/admin.php:1497 msgid "Timeout Rules" msgstr "" #: inc/admin.php:1504 templates/timeout.php:95 msgid "All" msgstr "" #: inc/admin.php:1505 inc/admin.php:1773 templates/exclude.php:93 #: templates/timeout.php:96 msgid "Home Page" msgstr "" #: inc/admin.php:1506 inc/admin.php:1780 templates/exclude.php:102 #: templates/timeout.php:97 msgid "Starts With" msgstr "" #: inc/admin.php:1507 inc/admin.php:1781 templates/exclude.php:103 #: templates/timeout.php:99 msgid "Contains" msgstr "" #: inc/admin.php:1508 inc/admin.php:1782 templates/exclude.php:104 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "" #: inc/admin.php:1540 inc/admin.php:1805 inc/admin.php:1822 inc/admin.php:1841 #: inc/admin.php:1859 inc/admin.php:1879 msgid "Add New Rule" msgstr "" #: inc/admin.php:1614 msgid "Optimize Image Tool" msgstr "" #: inc/admin.php:1638 msgid "Discover Features" msgstr "" #: inc/admin.php:1641 msgid "In the premium version there are some new features which speed up the sites more." msgstr "" #: inc/admin.php:1647 msgid "New Features" msgstr "" #: inc/admin.php:1661 msgid "Checkout" msgstr "" #: inc/admin.php:1664 msgid "You need to pay before downloading the premium version." msgstr "" #: inc/admin.php:1678 msgid "Just" msgstr "" #: inc/admin.php:1679 msgid "The download button will be available after paid. You can buy the premium version now." msgstr "" #: inc/admin.php:1684 msgid "Purchased" msgstr "" #: inc/admin.php:1699 msgid "Buy" msgstr "" #: inc/admin.php:1712 msgid "Download & Update" msgstr "" #: inc/admin.php:1715 msgid "You can download and update the premium when you want if you paid." msgstr "" #: inc/admin.php:1721 msgid "Get It Now!" msgstr "" #: inc/admin.php:1722 msgid "Please don't delete the free version. Premium version works with the free version." msgstr "" #: inc/admin.php:1728 msgid "Update" msgstr "" #: inc/admin.php:1733 msgid "Download" msgstr "" #: inc/admin.php:1774 templates/exclude.php:94 templates/preload.php:41 msgid "Categories" msgstr "" #: inc/admin.php:1775 templates/exclude.php:95 templates/preload.php:49 msgid "Tags" msgstr "" #: inc/admin.php:1776 templates/exclude.php:99 msgid "Archives" msgstr "" #: inc/admin.php:1777 templates/exclude.php:96 templates/preload.php:37 msgid "Posts" msgstr "" #: inc/admin.php:1778 templates/exclude.php:97 templates/preload.php:45 msgid "Pages" msgstr "" #: inc/admin.php:1779 templates/exclude.php:101 templates/preload.php:53 msgid "Attachments" msgstr "" #: inc/admin.php:1783 templates/exclude.php:105 msgid "has Google Analytics Parameters" msgstr "" #: inc/admin.php:1784 templates/exclude.php:106 msgid "has Woocommerce Items in Cart" msgstr "" #: inc/admin.php:1801 msgid "Exclude Pages" msgstr "" #: inc/admin.php:1818 msgid "Exclude User-Agents" msgstr "" #: inc/admin.php:1837 msgid "Exclude Cookies" msgstr "" #: inc/admin.php:1855 msgid "Exclude CSS" msgstr "" #: inc/admin.php:1875 msgid "Exclude JS" msgstr "" #: inc/admin.php:1912 msgid "CDN Settings" msgstr "" #: inc/admin.php:2024 msgid "Database Cleanup" msgstr "" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Homepage" msgstr "" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "" #: templates/newpost.php:68 templates/preload.php:102 #: templates/updatepost.php:64 msgid "OK" msgstr "" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "" #: templates/preload.php:33 msgid "Homepage" msgstr "" #: templates/preload.php:58 msgid "Custom Post Types" msgstr "" #: templates/preload.php:63 msgid "Custom Taxonomies" msgstr "" #: templates/preload.php:87 msgid "pages per minute" msgstr "" #: templates/preload.php:92 msgid "Restart After Completed" msgstr "" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "" #: templates/timeout.php:124 msgid "Then" msgstr "" #: templates/timeout.php:137 msgid "Choose One" msgstr "" #: templates/timeout.php:165 msgid "delete the files" msgstr "" #: templates/timeout.php:185 msgid "Server Time" msgstr "" #: templates/update_now.php:9 msgid "Please Update" msgstr "" #: templates/update_success.php:9 msgid "Success" msgstr "" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "" #: wpFastestCache.php:1470 msgid "Once Every 1 Minute" msgstr "" #: wpFastestCache.php:1476 msgid "Once Every 5 Minutes" msgstr "" #: wpFastestCache.php:1482 msgid "Once Every 15 Minutes" msgstr "" #: wpFastestCache.php:1488 msgid "Twice an Hour" msgstr "" #: wpFastestCache.php:1494 msgid "Once an Hour" msgstr "" #: wpFastestCache.php:1500 msgid "Once Every 2 Hours" msgstr "" #: wpFastestCache.php:1506 msgid "Once Every 3 Hours" msgstr "" #: wpFastestCache.php:1512 msgid "Once Every 4 Hours" msgstr "" #: wpFastestCache.php:1518 msgid "Once Every 5 Hours" msgstr "" #: wpFastestCache.php:1524 msgid "Once Every 6 Hours" msgstr "" #: wpFastestCache.php:1530 msgid "Once Every 7 Hours" msgstr "" #: wpFastestCache.php:1536 msgid "Once Every 8 Hours" msgstr "" #: wpFastestCache.php:1542 msgid "Once Every 9 Hours" msgstr "" #: wpFastestCache.php:1548 msgid "Once Every 10 Hours" msgstr "" #: wpFastestCache.php:1554 msgid "Once a Day" msgstr "" #: wpFastestCache.php:1560 msgid "Once Every 3 Days" msgstr "" #: wpFastestCache.php:1566 msgid "Once Every 7 Days" msgstr "" #: wpFastestCache.php:1572 msgid "Once Every 10 Days" msgstr "" #: wpFastestCache.php:1578 msgid "Once Every 15 Days" msgstr "" #: wpFastestCache.php:1584 msgid "Once a Month" msgstr "" #: wpFastestCache.php:1590 msgid "Once a Year" msgstr "" #. Plugin Name of the plugin/theme msgid "WP Fastest Cache" msgstr "" #. Plugin URI of the plugin/theme msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "" #. Description of the plugin/theme msgid "The simplest and fastest WP Cache system" msgstr "" #. Author of the plugin/theme msgid "Emre Vona" msgstr "" #. Author URI of the plugin/theme msgid "http://tr.linkedin.com/in/emrevona" msgstr "" PKL\K\w"w"4wp-fastest-cache/languages/wp-fastest-cache-es_VE.monu[<\\] w'      ' 2 B N g    2 0 8 D O _ h .     ; 15 .g       % * 4 = AL   =  / : J V g q x         (;M`s    !*L`x ~/.* $.Et   (   - ;GX9`9 &%!.P?o.- >_x7!)3] f r| $'+ )9HcJ   *)1T N<D:     *;VhmR 05Tf  !4S s !6K`w&!)Hr <<H=#; "*< DQ Zd)w#  @' Kh  - , ' !-H!Rv!!%!-"11"c"SettingsAdd New RuleAllAll cache files will be removed as wellArchivesAttachmentsBrowser CachingCDN SettingsCache StatisticsCache SystemCache Timeout WizardCancelCategoriesChoose OneClear All CacheClear CacheClear Cache of All SitesClear Cache of PaginationClear Cache of Post / PageClear Cache of Post CategoriesClear Cache of Post TagsClear cache files when a post or page is publishedClear cache files when a post or page is updatedCombine CssCombine JsCombine Js PlusContainsCreate cache for mobile themeCreate the cache of all the site automaticallyCustom Post TypesCustom TaxonomiesDatabase CleanupDisable EmojisDon't show the cached version for desktop to mobile devicesDon't show the cached version for logged-in usersEliminate render-blocking JavaScript resourcesEmre VonaEnableEnable GzipExcludeExclude CSSExclude CookiesExclude JSExclude Page WizardExclude PagesExclude User-AgentsGoogle FontsGzipHome PageHomepageIf REQUEST_URIIf you modify any css file, you have to delete minified css filesImage OptimizationIs Equal ToLazy Load SettingsLoad Google Fonts asynchronouslyLoad images and iframes when they enter the browsers viewportLogged-in UsersMinify CssMinify Css PlusMinify HTMLMinify HTML PlusMinify JsMobileMobile ThemeMore powerful minify cssMore powerful minify htmlNew PostOKOnce Every 1 MinuteOnce Every 10 DaysOnce Every 10 HoursOnce Every 15 DaysOnce Every 15 MinutesOnce Every 2 HoursOnce Every 3 DaysOnce Every 3 HoursOnce Every 4 HoursOnce Every 5 HoursOnce Every 5 MinutesOnce Every 6 HoursOnce Every 7 DaysOnce Every 7 HoursOnce Every 8 HoursOnce Every 9 HoursOnce a DayOnce a MonthOnce a YearOnce an HourOnly available in Premium versionOptimize Image ToolOptions have been savedPagesPlease UpdatePostsPreloadReduce HTTP requests through combined css filesReduce HTTP requests through combined js filesReduce page load times for repeat visitorsReduce the number of SQL queriesReduce the size of files sent from your serverRender Blocking JsRestart After CompletedSaveServer TimeSettingsStarts WithSuccessTagsTarget folderThe simplest and fastest WP Cache systemThenTimeout RulesToolbar SettingsTwice an HourUpdate PostWP Fastest CacheWarningWhat do you want to happen after publishing the new post?What do you want to happen after update a post or a page?Widget CacheYou can decrease the size of css filesYou can decrease the size of js filesYou can decrease the size of pageYou can delete all cache filesYou can remove the emoji inline css and wp-emoji-release.min.jsdelete the fileshas Google Analytics Parametershas Woocommerce Items in Carthttp://wordpress.org/plugins/wp-fastest-cache/pages per minutePO-Revision-Date: 2020-07-16 10:39:36+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Generator: GlotPress/4.0.1 Language: es_VE Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk) AjustesAñadir una nueva reglaTodoTambién se eliminarán todos los archivos de la cachéArchivosAdjuntosCaché del navegadorAjustes de la CDNEstadísticas de la cachéSistema de cachéAsistente del tiempo límite de la cachéCancelarCategoríasElige unoVaciar toda la cachéBorrar cachéVaciar la caché de todos los sitiosVaciar la caché de paginaciónVaciar la caché de entradas / páginasVaciar la caché de categorías de entradasVaciar la caché de etiquetas de entradasVaciar los archivos de la caché cuando se publica una entrada o páginaVaciar los archivos de la caché cuando se actualiza una entrada o páginaCombinar CSSCombinar JSCombine Js PlusContieneCrear la caché para el tema para móvilesCrear automáticamente la caché de todo el sitioTipos de contenido personalizadoTaxonomías personalizadasLimpieza de la base de datosDesactivar los emojisNo mostrar la versión de escritorio de la caché en los dispositivos móvilesNo mostrar la versión de la caché para usuarios conectadosEliminar los recursos JavaScript que bloquean los procesosEmre VonaActivarActivar GzipExcluirExcluir CSSExcluir cookiesExcluir JSAsistente para excluir páginasExcluir páginasExcluir agentes de usuarioFuentes de GoogleGzipPágina de inicioPágina de inicioSi REQUEST_URISi modificas cualquier archivo CSS, tienes que borrar los archivos CSS minimizadosOptimización de imágenesEs igual aAsistente de carga diferidaCargar las fuentes de Google de forma asíncronaCargar las imágenes e iframes cuando entren en la visualización de los navegadoresUsuarios conectadosMinimizar CSSMinify Css PlusMinimizar HTMLMinify HTML PlusMinimizar JSMóvilTema para móvilesMás potente minimización CSSMás potente minimización HTMLNueva entradaAceptarUna vez cada minutoUna vez cada 10 díasUna vez cada 10 horasUna vez cada 15 díasUna vez cada 15 minutosUna vez cada 2 horasUna vez cada 3 díasUna vez cada 3 horasUna vez cada 4 horasUna vez cada 5 horasUna vez cada 5 minutosUna vez cada 6 horasUna vez cada 7 díasUna vez cada 7 horasUna vez cada 8 horasUna vez cada 9 horasUna vez al díaUna vez al mesUna vez al añoUna vez a la horaSolo disponible en la versión premiumHerramienta de optimización de imágenesLas opciones han sido guardadasPáginasPor favor, actualizaEntradasPrecargarReducir las solicitudes HTTP mediante archivos JS combinadosReducir las solicitudes HTTP mediante archivos JS combinadosReducir el tiempo de carga de la página para los visitantes repetitivosReducir el número de consultas SQLReducir el tamaño de los archivos enviados por tu servidorBloqueo de procesado de JSReiniciar después de completadoGuardarHora del servidorAjustesComienza conCorrectoEtiquetasCarpeta de destinoEl sistema WP Cache más simple y rápidoEntoncesReglas de límiteAjustes de la barra de herramientasDos veces a la horaActualizar la entradaWP Fastest CacheAdvertencia¿Qué quieres que ocurra después de publicar la nueva entrada?¿Qué quieres que ocurra después de actualizar una entrada o una página?Widget de cachéPuedes reducir el tamaño de los archivos CSSPuedes reducir el tamaño de los archivos JSPuedes reducir el tamaño de la páginaPuedes borrar todos los archivos de la cachéPuedes eliminar los emojis CSS integrados y el archivo «wp-emoji-release.min.js»borrar los archivostiene parámetros de Google Analyticstiene artículos de WooCommerce en el carritohttp://es.wordpress.org/plugins/wp-fastest-cache/páginas por minutoPKL\c;C;C4wp-fastest-cache/languages/wp-fastest-cache-es_ES.ponu[# Translation of Plugins - WP Fastest Cache - Development (trunk) in Spanish (Spain) # This file is distributed under the same license as the Plugins - WP Fastest Cache - Development (trunk) package. msgid "" msgstr "" "PO-Revision-Date: 2024-12-10 17:18:30+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/4.0.1\n" "Language: es\n" "Project-Id-Version: Plugins - WP Fastest Cache - Development (trunk)\n" #: templates/toolbar_settings.php:34 msgid "The WP Fastest Cache menu on the admin toolbar will be visible to the selected user roles below." msgstr "El menú WP Fastest Cache de la barra de herramientas del administrador será visible para los roles de usuario seleccionados a continuación." #: templates/toolbar_settings.php:33 msgid "User Roles" msgstr "Perfiles de usuario" #: templates/preload.php:374 templates/preload.php:457 #: templates/preload.php:474 msgid "At least one sitemap must be added" msgstr "Debe añadirse al menos un mapa del sitio" #: templates/preload.php:187 msgid "You can customize the advanced settings through this section." msgstr "Puedes personalizar los ajustes avanzados a través de esta sección." #: templates/preload.php:186 msgid "Advanced Settings" msgstr "Ajustes avanzados" #: templates/preload.php:151 msgid "You can specify sitemaps to be used for preloading." msgstr "Puedes especificar los mapas del sitio que se utilizarán para la precarga." #: templates/preload.php:150 msgid "Sitemaps" msgstr "Mapas del sitio" #: templates/preload.php:87 msgid "You can specify the contents to be used for preloading and you can sort them as well." msgstr "Puedes especificar el contenido que se utilizará para la precarga y también puedes ordenarlo." #: templates/preload.php:86 msgid "Content Types" msgstr "Tipos de contenido" #: templates/preload.php:73 msgid "You can specify the method you want the preload feature to use through this section." msgstr "Puedes especificar el método que quieres que utilice la función de precarga a través de esta sección." #: templates/preload.php:72 msgid "Choose a Method" msgstr "Elegir método" #: templates/preload.php:56 msgid "Preload Settings" msgstr "Ajustes de precarga" #: inc/admin.php:1458 inc/admin.php:1465 msgid "Some js sources will not be loaded until scrolling or moving the mouse" msgstr "Algunos orígenes de js no se cargarán hasta que se haga scroll o se mueva el ratón" #: inc/admin.php:1457 inc/admin.php:1464 msgid "Delay Js" msgstr "Aplazar Js" #: inc/admin.php:1074 msgid "WP Fastest Cache Options" msgstr "Opciones de WP Fastest Cache" #: inc/admin.php:1954 templates/exclude.php:114 msgid "has Yandex Click ID Parameters" msgstr "tiene parámetros de ID de clic de Yandex" #. Author URI of the plugin #: wpFastestCache.php msgid "https://www.wpfastestcache.com/" msgstr "https://www.wpfastestcache.com/" #: inc/admin.php:1749 msgid "Clearing Specific Pages" msgstr "Vaciar páginas específicas" #: templates/toolbar_settings.php:71 msgid "Save" msgstr "Guardar" #: templates/toolbar_settings.php:68 msgid "Cancel" msgstr "Cancelar" #: inc/admin-toolbar.php:124 templates/toolbar_settings.php:20 msgid "Toolbar Settings" msgstr "Ajustes de la barra de herramientas" #: inc/admin-toolbar.php:78 inc/admin-toolbar.php:114 msgid "Clear Cache of All Sites" msgstr "Vaciar la caché de todos los sitios" #: wpFastestCache.php:439 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:1083 inc/admin.php:1594 inc/column.php:15 msgid "Clear Cache" msgstr "Vaciar la caché" #: inc/admin.php:1370 inc/admin.php:1376 inc/admin.php:1383 msgid "Eliminate render-blocking JavaScript resources" msgstr "Eliminar los recursos JavaScript que bloquean los procesos" #: inc/admin.php:470 inc/admin.php:473 msgid "Options have been saved" msgstr "Las opciones han sido guardadas" #: inc/admin.php:1955 templates/exclude.php:115 msgid "has Woocommerce Items in Cart" msgstr "tiene artículos de WooCommerce en el carrito" #: inc/admin.php:1953 templates/exclude.php:113 msgid "has Google Analytics Parameters" msgstr "tiene parámetros de Google Analytics" #: inc/admin.php:1943 templates/exclude.php:100 msgid "Archives" msgstr "Archivos" #: templates/timeout.php:189 msgid "Server Time" msgstr "Hora del servidor" #: templates/timeout.php:169 msgid "delete the files" msgstr "borrar los archivos" #: inc/admin.php:1646 inc/admin.php:1948 templates/exclude.php:106 #: templates/timeout.php:99 msgid "Contains" msgstr "Contiene" #: inc/admin.php:1647 inc/admin.php:1949 templates/exclude.php:107 #: templates/timeout.php:98 msgid "Is Equal To" msgstr "Es igual a" #: inc/admin.php:1645 inc/admin.php:1947 templates/exclude.php:105 #: templates/timeout.php:97 msgid "Starts With" msgstr "Comienza con" #: inc/admin.php:1644 inc/admin.php:1940 templates/exclude.php:95 #: templates/timeout.php:96 msgid "Home Page" msgstr "Página de inicio" #: inc/admin.php:1643 templates/timeout.php:95 msgid "All" msgstr "Todo" #: templates/exclude.php:66 msgid "Exclude Page Wizard" msgstr "Asistente para excluir páginas" #: templates/timeout.php:124 msgid "Then" msgstr "Entonces" #: templates/exclude.php:89 templates/timeout.php:91 msgid "If REQUEST_URI" msgstr "Si REQUEST_URI" #: templates/timeout.php:68 msgid "Cache Timeout Wizard" msgstr "Asistente del tiempo límite de la caché" #: templates/lazy_load.php:9 msgid "Lazy Load Settings" msgstr "Asistente de carga diferida" #: templates/nginx_gzip.php:9 msgid "Enable Gzip" msgstr "Activar Gzip" #: templates/update_now.php:9 msgid "Please Update" msgstr "Por favor, actualiza" #: templates/update_success.php:9 msgid "Success" msgstr "Correcto" #: templates/disable_wp_cron.php:20 msgid "Warning" msgstr "Advertencia" #: inc/admin.php:1681 inc/admin.php:1753 inc/admin.php:1976 inc/admin.php:1993 #: inc/admin.php:2012 inc/admin.php:2030 inc/admin.php:2050 msgid "Add New Rule" msgstr "Añadir una nueva regla" #: inc/admin-toolbar.php:105 inc/admin.php:1615 msgid "Clear Cache and Minified CSS/JS" msgstr "Borrar la caché y minimizar CSS/JS" #: inc/admin.php:1547 inc/admin.php:2219 inc/admin.php:2419 msgid "Only available in Premium version" msgstr "Solo disponible en la versión premium" #: templates/timeout.php:141 msgid "Choose One" msgstr "Elige uno" #: inc/admin.php:1620 msgid "All cache files will be removed as well" msgstr "También se eliminarán todos los archivos de la caché" #: inc/admin.php:1619 msgid "If you modify any css file, you have to delete minified css files" msgstr "Si modificas cualquier archivo CSS, tienes que borrar los archivos CSS minimizados" #: inc/admin.php:1607 inc/admin.php:1621 inc/admin.php:1622 msgid "Target folder" msgstr "Carpeta de destino" #: inc/admin.php:1606 msgid "You can delete all cache files" msgstr "Puedes borrar todos los archivos de la caché" #: inc/admin.php:1090 msgid "Exclude" msgstr "Excluir" #: inc/admin.php:1084 msgid "Image Optimization" msgstr "Optimización de imágenes" #: inc/admin.php:1082 msgid "Settings" msgstr "Ajustes" #: inc/admin.php:2192 msgid "Database Cleanup" msgstr "Limpieza de la base de datos" #: inc/admin.php:2083 msgid "CDN Settings" msgstr "Ajustes de la CDN" #: inc/admin.php:2046 msgid "Exclude JS" msgstr "Excluir JS" #: inc/admin.php:2026 msgid "Exclude CSS" msgstr "Excluir CSS" #: inc/admin.php:2008 msgid "Exclude Cookies" msgstr "Excluir cookies" #: inc/admin.php:1989 msgid "Exclude User-Agents" msgstr "Excluir agentes de usuario" #: inc/admin.php:1972 msgid "Exclude Pages" msgstr "Excluir páginas" #: inc/admin.php:1806 msgid "Optimize Image Tool" msgstr "Herramienta de optimización de imágenes" #: inc/admin.php:1636 msgid "Timeout Rules" msgstr "Reglas de límite" #: inc/admin.php:1554 msgid "Cache Statistics" msgstr "Estadísticas de la caché" #: templates/updatepost.php:53 msgid "Clear Cache of Post / Page" msgstr "Vaciar la caché de entradas / páginas" #: templates/updatepost.php:29 msgid "What do you want to happen after update a post or a page?" msgstr "¿Qué quieres que ocurra después de actualizar una entrada o una página?" #: templates/newpost.php:58 msgid "Clear Cache of Pagination" msgstr "Vaciar la caché de paginación" #: templates/newpost.php:57 templates/updatepost.php:55 msgid "Clear Cache of Post Tags" msgstr "Vaciar la caché de etiquetas de entradas" #: templates/newpost.php:56 templates/updatepost.php:54 msgid "Clear Cache of Post Categories" msgstr "Vaciar la caché de categorías de entradas" #: templates/newpost.php:55 templates/updatepost.php:56 msgid "Clear Cache of Home page" msgstr "Vaciar la caché de la página de inicio" #: inc/admin-toolbar.php:61 inc/admin-toolbar.php:97 inc/admin.php:1602 #: templates/newpost.php:51 templates/updatepost.php:49 msgid "Clear All Cache" msgstr "Vaciar toda la caché" #: templates/newpost.php:29 msgid "What do you want to happen after publishing the new post?" msgstr "¿Qué quieres que ocurra después de publicar la nueva entrada?" #: templates/newpost.php:68 templates/updatepost.php:64 msgid "OK" msgstr "Aceptar" #: templates/preload.php:215 msgid "Restart After Completed" msgstr "Reiniciar después de completado" #: templates/preload.php:210 msgid "pages per minute" msgstr "páginas por minuto" #: templates/preload.php:132 msgid "Custom Taxonomies" msgstr "Taxonomías personalizadas" #: templates/preload.php:127 msgid "Custom Post Types" msgstr "Tipos de contenido personalizado" #: inc/admin.php:1946 templates/exclude.php:101 templates/preload.php:122 msgid "Attachments" msgstr "Adjuntos" #: inc/admin.php:1942 templates/exclude.php:97 templates/preload.php:118 msgid "Tags" msgstr "Etiquetas" #: inc/admin.php:1945 templates/exclude.php:99 templates/preload.php:114 msgid "Pages" msgstr "Páginas" #: inc/admin.php:1941 templates/exclude.php:96 templates/preload.php:110 msgid "Categories" msgstr "Categorías" #: inc/admin.php:1944 templates/exclude.php:98 templates/preload.php:106 msgid "Posts" msgstr "Entradas" #: templates/preload.php:102 msgid "Homepage" msgstr "Página de inicio" #: inc/admin.php:1317 inc/admin.php:1325 inc/admin.php:1331 inc/admin.php:1337 msgid "Reduce HTTP requests through combined js files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1425 inc/admin.php:1447 msgid "Load images and iframes when they enter the browsers viewport" msgstr "Cargar las imágenes e iframes cuando entren en la visualización de los navegadores" #: inc/admin.php:1396 inc/admin.php:1402 inc/admin.php:1409 msgid "Load Google Fonts asynchronously" msgstr "Cargar las fuentes de Google de forma asíncrona" #: inc/admin.php:1395 inc/admin.php:1401 inc/admin.php:1408 msgid "Google Fonts" msgstr "Fuentes de Google" #: inc/admin.php:1369 inc/admin.php:1375 inc/admin.php:1382 msgid "Render Blocking Js" msgstr "Bloqueo de procesado de JS" #: inc/admin.php:1361 msgid "You can remove the emoji inline css and wp-emoji-release.min.js" msgstr "Puedes eliminar los emojis CSS integrados y el archivo «wp-emoji-release.min.js»" #: inc/admin.php:1360 msgid "Disable Emojis" msgstr "Desactivar los emojis" #: inc/admin.php:1355 msgid "Reduce page load times for repeat visitors" msgstr "Reducir el tiempo de carga de la página para los visitantes repetitivos" #: inc/admin.php:1354 msgid "Browser Caching" msgstr "Caché del navegador" #: inc/admin.php:1343 msgid "Reduce the size of files sent from your server" msgstr "Reducir el tamaño de los archivos enviados por tu servidor" #: inc/admin.php:1342 msgid "Gzip" msgstr "Gzip" #: inc/admin.php:1323 inc/admin.php:1330 inc/admin.php:1336 msgid "Combine Js Plus" msgstr "Combine Js Plus" #: inc/admin.php:1316 msgid "Combine Js" msgstr "Combinar JS" #: inc/admin.php:1300 inc/admin.php:1305 inc/admin.php:1311 msgid "You can decrease the size of js files" msgstr "Puedes reducir el tamaño de los archivos JS" #: inc/admin.php:1299 inc/admin.php:1304 inc/admin.php:1310 msgid "Minify Js" msgstr "Minimizar JS" #: inc/admin.php:1292 msgid "Reduce HTTP requests through combined css files" msgstr "Reducir las solicitudes HTTP mediante archivos JS combinados" #: inc/admin.php:1291 msgid "Combine Css" msgstr "Combinar CSS" #: inc/admin.php:1280 inc/admin.php:1285 msgid "More powerful minify css" msgstr "Más potente minimización CSS" #: inc/admin.php:1279 inc/admin.php:1284 msgid "Minify Css Plus" msgstr "Minify Css Plus" #: inc/admin.php:1271 msgid "You can decrease the size of css files" msgstr "Puedes reducir el tamaño de los archivos CSS" #: inc/admin.php:1270 msgid "Minify Css" msgstr "Minimizar CSS" #: inc/admin.php:1258 inc/admin.php:1263 msgid "More powerful minify html" msgstr "Más potente minimización HTML" #: inc/admin.php:1257 inc/admin.php:1262 msgid "Minify HTML Plus" msgstr "Minify HTML Plus" #: inc/admin.php:1251 msgid "You can decrease the size of page" msgstr "Puedes reducir el tamaño de la página" #: inc/admin.php:1250 msgid "Minify HTML" msgstr "Minimizar HTML" #: inc/admin.php:1242 msgid "Clear cache files when a post or page is updated" msgstr "Vaciar los archivos de la caché cuando se actualiza una entrada o página" #: inc/admin.php:1241 templates/updatepost.php:18 msgid "Update Post" msgstr "Actualizar la entrada" #: inc/admin.php:1235 msgid "Clear cache files when a post or page is published" msgstr "Vaciar los archivos de la caché cuando se publica una entrada o página" #: inc/admin.php:1234 templates/newpost.php:18 msgid "New Post" msgstr "Nueva entrada" #: inc/admin.php:1202 inc/admin.php:1228 msgid "Create cache for mobile theme" msgstr "Crear la caché para el tema para móviles" #: inc/admin.php:1201 inc/admin.php:1227 msgid "Mobile Theme" msgstr "Tema para móviles" #: inc/admin.php:1196 msgid "Don't show the cached version for desktop to mobile devices" msgstr "No mostrar la versión de escritorio de la caché en los dispositivos móviles" #: inc/admin.php:1195 msgid "Mobile" msgstr "Móvil" #: inc/admin.php:1191 msgid "Don't show the cached version for logged-in users" msgstr "No mostrar la versión de la caché para usuarios conectados" #: inc/admin.php:1190 msgid "Logged-in Users" msgstr "Usuarios conectados" #: inc/admin.php:1158 msgid "Create the cache of all the site automatically" msgstr "Crear automáticamente la caché de todo el sitio" #: inc/admin.php:1157 msgid "Preload" msgstr "Precargar" #: inc/admin.php:1129 inc/admin.php:1135 inc/admin.php:1142 inc/admin.php:1149 msgid "Reduce the number of SQL queries" msgstr "Reducir el número de consultas SQL" #: inc/admin.php:1128 inc/admin.php:1134 inc/admin.php:1141 inc/admin.php:1148 msgid "Widget Cache" msgstr "Widget de caché" #: inc/admin.php:1119 msgid "Enable" msgstr "Activar" #: inc/admin.php:1118 msgid "Cache System" msgstr "Sistema de caché" #: wpFastestCache.php:2321 msgid "Once Every 15 Days" msgstr "Una vez cada 15 días" #: wpFastestCache.php:2309 msgid "Once Every 7 Days" msgstr "Una vez cada 7 días" #: wpFastestCache.php:2303 msgid "Once Every 3 Days" msgstr "Una vez cada 3 días" #: wpFastestCache.php:2291 msgid "Once Every 10 Hours" msgstr "Una vez cada 10 horas" #: wpFastestCache.php:2285 msgid "Once Every 9 Hours" msgstr "Una vez cada 9 horas" #: wpFastestCache.php:2279 msgid "Once Every 8 Hours" msgstr "Una vez cada 8 horas" #: wpFastestCache.php:2273 msgid "Once Every 7 Hours" msgstr "Una vez cada 7 horas" #: wpFastestCache.php:2261 msgid "Once Every 5 Hours" msgstr "Una vez cada 5 horas" #: wpFastestCache.php:2255 msgid "Once Every 4 Hours" msgstr "Una vez cada 4 horas" #: wpFastestCache.php:2249 msgid "Once Every 3 Hours" msgstr "Una vez cada 3 horas" #: wpFastestCache.php:2243 msgid "Once Every 2 Hours" msgstr "Una vez cada 2 horas" #: wpFastestCache.php:2315 msgid "Once Every 10 Days" msgstr "Una vez cada 10 días" #. Author of the plugin #: wpFastestCache.php msgid "Emre Vona" msgstr "Emre Vona" #. Description of the plugin #: wpFastestCache.php msgid "The simplest and fastest WP Cache system" msgstr "El sistema WP Cache más simple y rápido" #. Plugin URI of the plugin #: wpFastestCache.php msgid "http://wordpress.org/plugins/wp-fastest-cache/" msgstr "https://es.wordpress.org/plugins/wp-fastest-cache/" #. Plugin Name of the plugin #: wpFastestCache.php msgid "WP Fastest Cache" msgstr "WP Fastest Cache" #: wpFastestCache.php:2333 msgid "Once a Year" msgstr "Una vez al año" #: wpFastestCache.php:2327 msgid "Once a Month" msgstr "Una vez al mes" #: wpFastestCache.php:2297 msgid "Once a Day" msgstr "Una vez al día" #: wpFastestCache.php:2267 msgid "Once Every 6 Hours" msgstr "Una vez cada 6 horas" #: wpFastestCache.php:2237 msgid "Once an Hour" msgstr "Una vez por hora" #: wpFastestCache.php:2231 msgid "Twice an Hour" msgstr "Dos veces por hora" #: wpFastestCache.php:2225 msgid "Once Every 15 Minutes" msgstr "Una vez cada 15 minutos" #: wpFastestCache.php:2219 msgid "Once Every 5 Minutes" msgstr "Una vez cada 5 minutos" #: wpFastestCache.php:2213 msgid "Once Every 1 Minute" msgstr "Una vez cada 1 minuto"PKL\xu wp-fastest-cache/js/index.htmlnu[Silence is golden.PKL\kwp-fastest-cache/js/db.jsnu[var WpfcDB = { init: function(){ var self = this; jQuery("#wpfc-db").change(function(e){ jQuery("#revert-loader-toolbar").show(); self.update(); }); if(jQuery(".tab8").is(":visible")){ jQuery("#revert-loader-toolbar").show(); self.update(); } jQuery(function(){ self.update(); }); self.click_event_for_warnings(); self.click_event_for_auto_cleanup(); }, click_event_for_auto_cleanup: function(){ jQuery("#wpfc-auto-cleanup-option").change(function(){ let status = jQuery(this).val(); let nonce = jQuery("#wpfc-auto-cleanup-nonce").val(); jQuery("#revert-loader-toolbar").show(); jQuery.ajax({ type: 'POST', url: ajaxurl, dataType : "json", data : {"action": "wpfc_db_set_auto_cleanup", "status" : status, "nonce" : nonce}, cache: false, success: function(data){ if(typeof data.status != "undefined"){ jQuery("#wpfc-auto-cleanup-option").val(data.status); }else{ jQuery("#wpfc-auto-cleanup-option").val("off"); } jQuery("#revert-loader-toolbar").hide(); console.log(data); } }); }); }, click_event_for_warnings: function(){ var self = this; jQuery("div.tab8 div[wpfc-db-name]").click(function(e){ jQuery("#revert-loader-toolbar").show(); jQuery.ajax({ type: 'GET', url: ajaxurl, dataType : "json", data : {"action": "wpfc_db_fix", "type": jQuery(this).attr("wpfc-db-name"), "nonce" : wpfc_nonce}, cache: false, success: function(data){ if(data.success){ self.update(); }else{ jQuery("#revert-loader-toolbar").hide(); if(data.showupdatewarning){ Wpfc_New_Dialog.dialog("wpfc-modal-updatenow", {close: function(){ Wpfc_New_Dialog.clone.find("div.window-content input").each(function(){ if(jQuery(this).attr("checked")){ var id = jQuery(this).attr("action-id"); jQuery("div.tab1 div[template-id='wpfc-modal-updatenow'] div.window-content input#" + id).attr("checked", true); } }); Wpfc_New_Dialog.clone.remove(); }}); }else{ if(typeof data.message != "undefined" && data.message){ alert(data.message); }else{ alert("DB Error"); } } } } }); }); }, update: function(){ var self = this; jQuery.ajax({ type: 'GET', url: ajaxurl, dataType : "json", data : {"action": "wpfc_db_statics", "nonce" : wpfc_nonce}, cache: false, success: function(data){ jQuery.each(data, function(key, value){ jQuery(".tab8 div[wpfc-db-name='" + key + "'] span.db-number").css({'color': (value > 0) ? "red" : "#6BC359"}); jQuery(".tab8 div[wpfc-db-name='" + key + "'] span.db-number").text("(" + value + ")"); jQuery(".tab8 div[wpfc-db-name='" + key + "'] div.meta").attr('class', (value > 0) ? "meta warning" : "meta success"); }); if(data.all_warnings > 0){ jQuery("label[for='wpfc-db']").text("DB (" + data.all_warnings + ")"); }else{ jQuery("label[for='wpfc-db']").text("DB"); } jQuery("#revert-loader-toolbar").hide(); } }); } }; // if(window.attachEvent) { // window.attachEvent('onload', WpfcDB_init); // } else { // if(window.onload) { // var curronload = window.onload; // var newonload = function(evt) { // curronload(evt); // WpfcDB_init(evt); // }; // window.onload = newonload; // } else { // window.onload = WpfcDB_init; // } // } if(window.attachEvent){ window.attachEvent('onload', WpfcDB_init); }else if(window.addEventListener){ window.addEventListener('load', WpfcDB_init, false); } function WpfcDB_init(){WpfcDB.init();}PKL\3-DMwp-fastest-cache/js/button.jsnu[(function() { tinymce.create('tinymce.plugins.Wpfc', { wpfcNotHTML : '', url: '', init : function(ed, url) { var self = this; self.setUrl(url); self.setWpfcNotHTML(); ed.addButton('wpfc', { title : 'Block caching for this page', cmd : 'wpfc', image : self.url + "/icon.png" }); ed.addCommand('wpfc', function() { ed.execCommand('mceInsertContent', 0, self.wpfcNotHTML); }); self._handleWpfcNOT(ed, url); }, setUrl: function(url){ this.url = url.replace("../js","../images"); }, setWpfcNotHTML: function(){ this.wpfcNotHTML = ''; }, _handleWpfcNOT : function(ed, url) { var self = this; ed.onPostRender.add(function() { if (ed.theme.onResolveName) { ed.theme.onResolveName.add(function(th, o) { if (o.node.nodeName == 'IMG') { if ( ed.dom.hasClass(o.node, 'mce-wp-wpfcnot') ){ o.name = 'wpfcnot'; } } }); } }); ed.onBeforeSetContent.add(function(ed, o) { if ( o.content ) { o.content = o.content.replace(/<\!--\s*\[wpfcNOT\]\s*-->/, self.wpfcNotHTML); } }); ed.onPostProcess.add(function(ed, o) { if (o.get){ o.content = o.content.replace(/]+>/g, function(im) { if (im.indexOf('class="mce-wp-wpfcnot') !== -1) { im = ''; } return im; }); } }); } }); tinymce.PluginManager.add( 'wpfc', tinymce.plugins.Wpfc ); })();PKL\E8]]wp-fastest-cache/js/dialog.jsnu[var Wpfc_Dialog = { id : "", buttons: [], dialog: function(id, buttons){ var self = this; self.id = id; self.buttons = buttons; jQuery("#" + id).show(); jQuery("#" + id).draggable({ stop: function(){ jQuery(this).height("auto"); } }); jQuery("#" + id).position({my: "center", at: "center", of: window}); jQuery(".close-wiz").click(function(e){ jQuery(e.target).closest("div[id^='wpfc-modal-']").remove(); }); self.show_buttons(); }, remove: function(clone_modal_id){ if(typeof clone_modal_id != "undefined"){ jQuery("#" + clone_modal_id).remove(); }else{ var self = this; jQuery("#" + self.id).remove(); } }, show_buttons: function(){ var self = this; if(typeof self.buttons != "undefined"){ jQuery.each(self.buttons, function( index, value ) { jQuery("#" + self.id + " button[action='" + index + "']").show(); jQuery("#" + self.id + " button[action='" + index + "']").click(function(e){ if(index == "close"){ jQuery(e.target).closest("div[id^='wpfc-modal-']").remove(); }else{ value(); } }); }); } } };PKL\!wp-fastest-cache/js/schedule.jsnu[var WpfcSchedule = { id: "#wpfc-server-time", serverTime : "", //milliseconds dropdowns: "#wpFastestCacheTimeOutHour, #wpFastestCacheTimeOutMinute, #wpFastestCacheTimeOut", init: function(){ if(jQuery("form[id='wpfc-schedule-panel']").length){ this.setServerTime(); this.clock(); this.setDropdownEvent(); this.setDeleteCronEvent(); jQuery("#wpfc-schedule-panel input[type='submit']").bind("click", this, this.submitButtonEvent); } }, setDeleteCronEvent: function(){ jQuery("#deleteCron").click(function(){ jQuery("#wpFastestCacheTimeOut").val(""); jQuery("form#wpfc-schedule-panel").submit(); }); }, setDropdownEvent: function(){ jQuery(this.dropdowns).change(function(e){ var e = jQuery(e.currentTarget); if(e.attr("value")){ e.css("background-color", ""); } /* if(e.attr("id") == "wpFastestCacheTimeOut"){ if(e.val() == "hourly"){ jQuery("#wpFastestCacheTimeOutHour, #wpFastestCacheTimeOutMinute").prop('disabled', true); }else{ jQuery("#wpFastestCacheTimeOutHour, #wpFastestCacheTimeOutMinute").prop('disabled', false); } }*/ }); }, setServerTime: function(){ this.serverTime = new Date(jQuery(this.id).text()).getTime(); }, clock: function(){ var self = this; var newDate; setInterval(function(){ newDate = new Date(self.serverTime); jQuery(self.id).text(newDate.getFullYear() + "-" + (newDate.getMonth() + 1) + "-" + newDate.getDate() + " " + newDate.getHours() + ":" + newDate.getMinutes() + ":" + newDate.getSeconds()); self.serverTime = self.serverTime + 1000; }, 1000); }, submitButtonEvent: function(self){ var error_count = 0; jQuery(self.data.dropdowns).each(function(i, e){ if(jQuery(e).attr("value")){ jQuery(e).css("background-color", ""); }else{ error_count++; jQuery(e).css("background-color", "red"); } }); return error_count > 0 ? false : true; } }; WpfcSchedule.init();PKL\;;!wp-fastest-cache/js/dialog_new.jsnu[var Wpfc_New_Dialog = { template_id: "", id : "", buttons: [], clone: "", current_page_number: 1, total_page_number: 0, interval : {}, enable_button: function(button_type){ clearInterval(this.interval[this.id]); let self = this; let modal = jQuery("#" + self.id); let button = modal.find(".wpfc-dialog-buttons[action='" + button_type + "']"); button.attr("disabled", false); button.text(button.text().replace(/\.+$/, "")); }, disable_button: function(button_type){ let self = this; let modal = jQuery("#" + self.id); let button = modal.find(".wpfc-dialog-buttons[action='" + button_type + "']"); let text = button.text(); let dot = 0; button.attr("disabled", true); button.text(text + "."); self.interval[self.id] = setInterval(function(){ if(jQuery("#" + self.id).length === 0){ clearInterval(self.interval); } text = button.text(); dot = text.match(/\./g); console.log(self.interval); if(dot){ if(dot.length < 3){ button.text(text + "."); }else{ button.text(text.replace(/\.+$/, "")); } }else{ button.text(text + "."); } }, 300); }, dialog: function(id, buttons, callback){ var self = this; self.clone = jQuery("div[template-id='" + id + "']").clone(); self.total_page_number = self.clone.find("div[wpfc-page]").length; self.total_page_number = self.total_page_number > 0 ? self.total_page_number : self.clone.find("div[wpfc-cdn-page]").length; self.template_id = id; self.id = id + "-" + new Date().getTime(); self.buttons = buttons; self.clone.attr("id", self.id); self.clone.removeAttr("template-id"); jQuery("body").append(self.clone); self.clone.show(); self.clone.draggable({ stop: function(){ jQuery(this).height("auto"); } }); self.clone.position({my: "center", at: "center", of: window}); self.clone.find(".close-wiz").click(function(){ self.remove(this); }); self.update_ids_for_label(); self.show_buttons(); if(typeof callback != "undefined"){ if(typeof callback == "function"){ callback(self); } } self.click_event_add_new_keyword_button(); self.add_new_keyword_keypress(); }, remove: function(button){ jQuery(button).closest("div[id^='wpfc-modal-']").remove(); }, show_buttons: function(){ var self = this; if(typeof self.buttons != "undefined"){ jQuery.each(self.buttons, function( index, value ) { self.clone.find("button[action='" + index + "']").click(function(){ if(value == "default"){ if(index == "next"){ self.default_next_action(); } if(index == "back"){ self.default_back_action(); } if(index == "close"){ self.default_close_action(); } }else{ value(this); } }); }); } }, default_next_action: function(){ this.current_page_number = this.current_page_number + 1; this.show_page(this.current_page_number); this.show_button("back"); if(this.total_page_number == this.current_page_number){ this.hide_button("next"); this.show_button("finish"); } }, default_back_action: function(){ this.current_page_number = this.current_page_number - 1; this.show_page(this.current_page_number); this.show_button("next"); this.hide_button("finish"); if(this.current_page_number == 1){ this.hide_button("back"); } }, default_close_action: function(){ Wpfc_New_Dialog.clone.remove(); }, show_button: function(index){ this.clone.find("button[action='" + index + "']").show(); }, hide_button: function(index){ this.clone.find("button[action='" + index + "']").hide(); }, show_page: function(number){ this.clone.find("div[wpfc-page], div[wpfc-cdn-page]").hide(); this.clone.find("div[wpfc-page='" + number + "'], div[wpfc-cdn-page='" + number + "']").show(); this.current_page_number = number; }, update_ids_for_label: function(){ var self = this; var input; var id = ""; self.clone.find("div.window-content div.wiz-input-cont").each(function(){ input = jQuery(this).find("label.mc-input-label input"); if(input.length){ id = input.attr("id") + self.id; jQuery(this).find("label.mc-input-label input").attr("id", id); jQuery(this).find("label").last().attr("for", id); } }); }, set_values_from_tmp_to_real: function(){ var self = this; Wpfc_New_Dialog.clone.find("div.window-content input, div.window-content select").each(function(){ if(jQuery(this).prop("tagName") == "SELECT"){ jQuery("div.tab1 div[template-id='" + self.template_id + "'] div.window-content select[name='" + jQuery(this).attr("name") + "']").val(jQuery(this).val()); }else if(jQuery(this).prop("tagName") == "INPUT"){ if(jQuery(this).attr("type") == "checkbox"){ if(jQuery(this).is(':checked')){ jQuery("div.tab1 div[template-id='" + self.template_id + "'] div.window-content input[name='" + jQuery(this).attr("name") + "']").attr("checked", true); }else{ jQuery("div.tab1 div[template-id='" + self.template_id + "'] div.window-content input[name='" + jQuery(this).attr("name") + "']").attr("checked", false); } }else{ //toDo } } }); }, add_new_keyword_keypress: function() { const $clone = Wpfc_New_Dialog.clone; const $input = $clone.find(".wpfc-textbox-con .fixed-search input"); const $textboxCon = $clone.find(".wpfc-textbox-con"); const insertKeywordItem = function(){ let keyword = $input.val().replace(/[\s,]/g, ""); $textboxCon.hide(); $input.val(""); if (keyword.length > 0) { const $newKeywordItem = jQuery('
  • ' + keyword + '
  • ').click(function() { jQuery(this).remove(); }); $newKeywordItem.insertBefore($clone.find(".wpfc-add-new-keyword").closest(".keyword-item")); } }; $input.keydown(function(e) { if (e.keyCode === 8) { let keyword = $input.val().replace(/[\s,]/g, ""); if (keyword.length === 0) { $textboxCon.hide(); } } else if (e.keyCode === 13) { insertKeywordItem(); } }); $input.bind("blur", function() { insertKeywordItem(); }); }, click_event_add_new_keyword_button: function(){ Wpfc_New_Dialog.clone.find(".wpfc-add-new-keyword").click(function(){ Wpfc_New_Dialog.clone.find(".wpfc-textbox-con").show(); Wpfc_New_Dialog.clone.find(".wpfc-textbox-con .fixed-search input").focus(); }); }, insert_keywords: function(id, keywords){ if(keywords){ jQuery.each(keywords.split(","), function( index, value ) { jQuery('
  • ' + value + '
  • ').insertBefore(jQuery("div[id^='" + id + "']").find(".wpfc-add-new-keyword").closest(".keyword-item")).click(function(){ jQuery(this).remove(); }); }); } }, };PKL\ c wp-fastest-cache/js/toolbar.jsnu[var WPFC_TOOLBAR = { ajax_url: false, init: function(){ var self = this; if(typeof ajaxurl != "undefined" || typeof wpfc_ajaxurl != "undefined"){ self.ajax_url = (typeof ajaxurl != "undefined") ? ajaxurl : wpfc_ajaxurl; }else{ alert("AjaxURL has NOT been defined"); } jQuery("body").append('
    '); jQuery("#wp-admin-bar-wpfc-toolbar-parent-default li").click(function(e){ var id = (typeof e.target.id != "undefined" && e.target.id) ? e.target.id : jQuery(e.target).parent("li").attr("id"); var action = ""; if(id == "wp-admin-bar-wpfc-toolbar-parent-settings"){ if(jQuery("div[id^='wpfc-modal-toolbarsettings-']").length === 0){ self.open_settings(); } }else{ if(id == "wp-admin-bar-wpfc-toolbar-parent-delete-cache"){ action = "wpfc_delete_cache"; }else if(id == "wp-admin-bar-wpfc-toolbar-parent-delete-cache-and-minified"){ action = "wpfc_delete_cache_and_minified"; }else if(id == "wp-admin-bar-wpfc-toolbar-parent-clear-cache-of-this-page"){ action = "wpfc_delete_current_page_cache"; }else if(id == "wp-admin-bar-wpfc-toolbar-parent-clear-cache-of-allsites"){ action = "wpfc_clear_cache_of_allsites"; } WPFC_TOOLBAR.send({"action": action, "path" : window.location.pathname}); } }); }, open_settings: function(){ var self = this; jQuery("#revert-loader-toolbar").show(); jQuery.ajax({ type: 'GET', url: self.ajax_url, data : {"action": "wpfc_toolbar_get_settings", "path" : window.location.pathname}, dataType : "json", cache: false, success: function(data){ if(data.success){ var data_json = {"action": "wpfc_toolbar_save_settings", "path" : window.location.pathname, "roles" : {}}; Wpfc_New_Dialog.dialog("wpfc-modal-toolbarsettings", { close: function(){ Wpfc_New_Dialog.clone.remove(); }, finish: function(){ jQuery("#" + Wpfc_New_Dialog.id).find("input[type='checkbox']:checked").each(function(i, e){ data_json.roles[jQuery(e).attr("name")] = 1; }); WPFC_TOOLBAR.send(data_json); Wpfc_New_Dialog.clone.remove(); }}, function(dialog){ jQuery("#" + Wpfc_New_Dialog.id).find("input[type='checkbox']").each(function(i, e){ if(typeof data.roles[jQuery(e).attr("name")] != "undefined"){ jQuery(e).attr('checked', true); } }); Wpfc_New_Dialog.show_button("close"); Wpfc_New_Dialog.show_button("finish"); setTimeout(function(){ jQuery("#revert-loader-toolbar").hide(); }, 500); }); }else{ alert("Toolbar Settings Error!") } } }); }, send: function(data_json){ var self = this; if(typeof wpfc_nonce != "undefined" && wpfc_nonce){ data_json.nonce = wpfc_nonce; } jQuery("#revert-loader-toolbar").show(); jQuery.ajax({ type: 'GET', url: self.ajax_url, data : data_json, dataType : "json", cache: false, success: function(data){ if(data[1] == "error"){ if(typeof data[2] != "undefined" && data[2] == "alert"){ alert(data[0]); }else{ Wpfc_New_Dialog.dialog("wpfc-modal-permission", {close: "default"}); Wpfc_New_Dialog.show_button("close"); } } if(typeof WpFcCacheStatics != "undefined"){ WpFcCacheStatics.update(); }else{ jQuery("#revert-loader-toolbar").hide(); } } }); } }; window.addEventListener('load', function(){ jQuery(document).ready(function(){ WPFC_TOOLBAR.init(); }); }); PKL\wp-fastest-cache/js/language.jsnu[window.wpfc = {}; window.wpfc.translate = function(word){ return (typeof window.wpfc.dictionary != "undefined" && typeof window.wpfc.dictionary[word] != "undefined" && window.wpfc.dictionary[word]) ? window.wpfc.dictionary[word] : word; }; jQuery.fn.extend({ wpfclang: function(){ var dictionary = window.wpfc.dictionary || {}; var el = jQuery(this); var text = el.attr("type") == "submit" ? el.val().trim() : el.text().trim(); var converted = typeof dictionary[text] == "undefined" ? text : dictionary[text]; if(typeof converted != "undefined" && converted){ if(el.attr("type") == "submit"){ el.val(converted); }else{ el.html(converted); } } } }); var Wpfclang = { language : "", init: function(language){ this.language = language; this.translate(); }, translate: function(){ if(typeof window.wpfc != "undefined" && typeof window.wpfc.dictionary != "undefined"){ var self = this; jQuery('#wpfc-read-tutorial span, #wpfc-plugin-setup-warning h3, #just-h1, #get-now-h1, #new-features-h1, div.wpfc-premium-step-footer ul li a, div.wpfc-premium-step-footer p, div.wpfc-premium-step-content, #wpbody-content label, div.question, .questionCon input[type="submit"], #message p, .wrap h2, #nextVerAct, select option, th, #rule-help-tip h4, #rule-help-tip label, .omni_admin_sidebar h3, #message p, #wpfc-image-static-panel span, #wpfc-statics-right div, #wpfc-image-static-panel p, #container-show-hide-image-list span, #wpfc-image-list th').each(function(){ if(jQuery(this).children().length === 0){ jQuery(this).wpfclang(); } }); } } };PKL\xu "wp-fastest-cache/js/cdn/index.htmlnu[Silence is golden.PKL\0W)0)0wp-fastest-cache/js/cdn/cdn.jsnu[var WpfcCDN = { values: {"name" : "", "cdnurl" : "", "originurl" : "", "file_types" : "", "keywords" : "", "excludekeywords" : ""}, id : "", nonce: "", template_url : "", content : "", interval : false, init: function(obj){ this.set_params(obj); this.open_wizard(); }, check_conditions: function(action, current_page_number){ var self = this; if(action == "next"){ if(current_page_number == 2){ self.check_url_exist(); }else{ return true; } } }, set_params: function(obj){ this.id = obj.id; this.nonce = obj.nonce; this.template_url = obj.template_main_url + "/" + this.id + ".php"; if(obj.values){ this.values = obj.values; } }, open_wizard: function(){ var self = this; if(jQuery("#wpfc-modal-" + self.id).length == 0){ self.load_template(function(){ self.fill_integration_fields(); self.set_buttons_action(); self.click_event_add_new_keyword_button(); self.add_new_keyword_keypress(); if(self.id == "other" || self.id == "cloudflare"){ self.show_page("next"); self.hide_button("back"); } }); } }, insert_keywords: function(modal, classname, keywords){ var self = this; if(keywords){ jQuery.each(keywords.split(","), function( index, value ) { jQuery('
  • ' + value + '
  • ').insertBefore(modal.find(".wpfc-add-new-keyword").closest("." + classname)).click(function(){ jQuery(this).remove(); }); }); } }, fill_integration_fields: function(){ var self = this; var modal; jQuery(self.values).each(function(i, e){ modal = jQuery("#wpfc-wizard-" + e.id); modal.find("input#cdn-url").val(e.cdnurl); modal.find("select#cdn-url").val(e.cdnurl); modal.find("#origin-url").val(e.originurl); self.insert_keywords(modal, "keyword-item", e.keywords); self.insert_keywords(modal, "keyword-item-exclude", e.excludekeywords); if(e.file_types){ modal.find(".wpfc-checkbox-list input[type='checkbox']").attr("checked", false); jQuery.each(e.file_types.split(","), function( index, value ) { modal.find("#file-type-" + value).attr("checked", true); }); } }); }, add_new_keyword_keypress: function(){ jQuery(".wpfc-textbox-con .fixed-search input").keypress(function(e){ if(e.keyCode == 13){ var keyword = jQuery(e.target).val(); var keyword_type_class = jQuery(e.target).closest("li[class*='keyword-item']").attr("class"); jQuery(".wpfc-textbox-con").hide(); jQuery(e.target).val(""); jQuery('
  • ' + keyword + '
  • ').insertBefore(jQuery(e.target).closest("." + keyword_type_class)).click(function(){ jQuery(this).remove(); }); } }); }, click_event_add_new_keyword_button: function(){ jQuery(".wpfc-add-new-keyword").click(function(){ jQuery(this).next(".wpfc-textbox-con").show(); jQuery(this).next(".wpfc-textbox-con").find(".fixed-search input").focus(); }); }, set_buttons_action: function(){ var self = this; var action = ""; var current_page, next_page, current_page_number; var modal = jQuery("#wpfc-modal-" + self.id); self.buttons(); modal.find("button.wpfc-dialog-buttons").click(function(e){ action = modal.find(e.currentTarget).attr("action"); current_page_number = modal.find(".wpfc-cdn-pages-container div.wiz-cont:visible").attr("wpfc-cdn-page"); if(action == "next"){ if(self.check_conditions("next", current_page_number)){ self.show_page("next"); } }else if(action == "back"){ self.show_page("back"); }else if(action == "finish"){ self.save_integration(); }else if(action == "close"){ Wpfc_Dialog.remove(); }else if(action == "remove"){ self.remove_integration(); }else if(action == "pause"){ self.pause_integration(); }else if(action == "start"){ self.start_integration(); } }); }, start_integration: function(){ var self = this; var modal = jQuery("#wpfc-modal-" + self.id); self.disable_button("start"); jQuery.ajax({ type: 'POST', dataType: "json", url: ajaxurl, data : {"action": "wpfc_start_cdn_integration", "id" : self.id, "nonce" : self.nonce}, success: function(res){ self.show_button("pause"); self.enable_button("pause"); self.hide_button("start"); jQuery("div[wpfc-cdn-name='" + self.id + "']").find("div.meta").removeClass("pause"); }, error: function(e) { self.enable_button("start"); alert("unknown error"); } }); }, pause_integration: function(){ var self = this; var modal = jQuery("#wpfc-modal-" + self.id); self.disable_button("pause"); jQuery.ajax({ type: 'POST', dataType: "json", url: ajaxurl, data : {"action": "wpfc_pause_cdn_integration", "id" : self.id, "nonce" : self.nonce}, success: function(res){ self.show_button("start"); self.enable_button("start"); self.hide_button("pause"); jQuery("div[wpfc-cdn-name='" + self.id + "']").find("div.meta").addClass("pause"); }, error: function(e) { self.enable_button("pause"); alert("unknown error"); } }); }, remove_integration: function(){ var self = this; var modal = jQuery("#wpfc-modal-" + self.id); self.disable_button("remove"); jQuery.ajax({ type: 'POST', dataType: "json", url: ajaxurl, data : {"action": "wpfc_remove_cdn_integration", "id" : self.id, "nonce" : self.nonce}, success: function(res){ self.values = jQuery.grep(self.values, function (e, i) { if(e.id == self.id){ return false; } return true; }); self.enable_button("remove"); jQuery("div.tab7 div[wpfc-cdn-name='" + self.id + "']").find("div.meta").removeClass("isConnected"); Wpfc_Dialog.remove(); console.log(res); }, error: function(e) { self.enable_button("remove"); alert("unknown error"); } }); }, save_integration: function(){ var self = this; var modal = jQuery("#wpfc-modal-" + self.id); self.buttons(); self.values = {}; self.values.id = self.id; self.disable_button("finish"); if(modal.find("input#cdn-url").length == 1){ self.values.cdnurl = modal.find("input#cdn-url").val(); }else if(modal.find("select#cdn-url").length == 1){ self.values.cdnurl = modal.find("select#cdn-url").val(); } self.values.originurl = modal.find("input#origin-url").val(); self.values.file_types = modal.find(".wpfc-checkbox-list input[type='checkbox']:checked").map(function(){return this.value;}).get().join(","); self.values.keywords = modal.find(".keyword-item-list li.keyword-item a.keyword-label").map(function(){return this.text;}).get().join(","); self.values.excludekeywords = modal.find(".keyword-item-list li.keyword-item-exclude a.keyword-label").map(function(){return this.text;}).get().join(","); jQuery.ajax({ type: 'POST', dataType: "json", url: ajaxurl, data : {"action": "wpfc_save_cdn_integration", "nonce" : self.nonce, "values" : self.values, "file_types" : self.values.file_types, "keywords" : self.values.keywords, "excludekeywords" : self.values.excludekeywords}, success: function(res){ jQuery("div[wpfc-cdn-name='" + self.id + "']").find("div.meta").addClass("isConnected"); self.enable_button("finish"); self.show_page("next"); console.log(res); }, error: function(e) { self.enable_button("finish"); alert("unknown error"); } }); }, enable_button: function(button_type){ clearInterval(this.interval); let self = this; let modal = jQuery("#wpfc-modal-" + self.id); let button = modal.find(".wpfc-dialog-buttons[action='" + button_type + "']"); button.attr("disabled", false); button.text(button.text().replace(/\.+$/, "")); }, disable_button: function(button_type){ let self = this; let modal = jQuery("#wpfc-modal-" + self.id); let button = modal.find(".wpfc-dialog-buttons[action='" + button_type + "']"); let text = button.text(); let dot = 0; button.attr("disabled", true); button.text(text + "."); self.interval = setInterval(function(){ text = button.text(); dot = text.match(/\./g); console.log(dot); console.log(button); if(dot){ if(dot.length < 3){ button.text(text + "."); }else{ button.text(text.replace(/\.+$/, "")); } }else{ button.text(text + "."); } }, 300); }, check_url_exist: function(){ var self = this; var modal = jQuery("#wpfc-modal-" + self.id); var cdn_url = modal.find("#cdn-url").val(); var origin_url = modal.find("#origin-url").val(); if(!cdn_url || !origin_url){ if(!cdn_url){ modal.find("#cdn-url").css("background-color", "red"); }else{ modal.find("#cdn-url").css("background-color", "white"); } if(!origin_url){ modal.find("#origin-url").css("background-color", "red"); }else{ modal.find("#origin-url").css("background-color", "white"); } return; }else{ modal.find("#cdn-url").css("background-color", "white"); modal.find("#origin-url").css("background-color", "white"); } modal.find("#cdn-url-loading").show(); modal.find(".wpfc-cdn-pages-container div.wiz-cont:visible #cdn-url").nextAll("label").html(""); jQuery.ajax({ type: 'GET', dataType: "json", url: ajaxurl, data : {"action": "wpfc_check_url", "url" : cdn_url, "origin_url" : origin_url, "type" : WpfcCDN.id, "nonce" : self.nonce}, success: function(res){ modal.find("#cdn-url-loading").hide(); if(res.success){ self.show_page("next"); modal.find("#cdn-url").css("background-color", "white"); modal.find("#origin-url").css("background-color", "white"); }else{ if(WpfcCDN.id == "cloudflare"){ modal.find("label.wiz-error-msg").html(res.error_message); }else{ modal.find(".wpfc-cdn-pages-container div.wiz-cont:visible #cdn-url").nextAll("label").html(res.error_message); } } }, error: function(e) { modal.find("#cdn-url-loading").hide(); alert("unknown error"); } }); }, show_page: function(type){ var current_page = jQuery("#wpfc-modal-" + this.id).find(".wpfc-cdn-pages-container div.wiz-cont:visible"); current_page.hide(); if(type == "next"){ current_page.next().show(); }else if(type == "back"){ current_page.prev().show(); } this.buttons(); }, buttons: function(){ var self = this; var current_page, next_pages; current_page = jQuery("#wpfc-modal-" + this.id).find(".wpfc-cdn-pages-container div.wiz-cont:visible"); next_pages = current_page.nextAll(".wiz-cont"); jQuery(".wpfc-dialog-buttons[action]").hide(); jQuery(self.values).each(function(i, e){ if(e.id == self.id){ self.show_button("remove"); if(typeof e.status != "undefined" && e.status == "pause"){ self.show_button("start"); }else{ self.show_button("pause"); } } }); if(next_pages.length){ if(next_pages.length > 1){ self.show_button("next"); }else if(next_pages.length == 1){ self.show_button("finish"); } if(jQuery("#wpfc-modal-" + this.id).find(".wpfc-cdn-pages-container div.wiz-cont:visible").attr("wpfc-cdn-page") > 1){ if(current_page.attr("wpfc-cdn-page") == 2){ if(self.id == "maxcdn"){ self.show_button("back"); } }else{ self.show_button("back"); } } }else{ self.show_button("close"); } }, show_button: function(type){ jQuery("#wpfc-modal-" + this.id + " .wpfc-dialog-buttons[action='" + type + "']").show(); }, hide_button: function(type){ jQuery("#wpfc-modal-" + this.id + " .wpfc-dialog-buttons[action='" + type + "']").hide(); }, load_template: function(callbak){ var self = this; jQuery.ajax({ type: 'POST', dataType: "json", url: ajaxurl, data : {"action": "wpfc_cdn_template", "id": self.id}, success: function(res){ jQuery("body").append(res.content); Wpfc_Dialog.dialog("wpfc-modal-" + self.id); callbak(); jQuery("#revert-loader-toolbar").hide(); }, error: function(e) { alert("CDN Template Error"); } }); } };PKL\nAwp-fastest-cache/js/column.jsnu[if(window.attachEvent) { window.attachEvent('onload', wpfc_column_button_action); } else { if(window.onload) { var curronload_1 = window.onload; var newonload_1 = function(evt) { curronload_1(evt); wpfc_column_button_action(evt); }; window.onload = newonload_1; } else { window.onload = wpfc_column_button_action; } } function wpfc_column_button_action(){ jQuery(document).ready(function(){ jQuery("a[id^='wpfc-clear-cache-link']").click(function(e){ var post_id = jQuery(e.target).attr("data-id"); var nonce = jQuery(e.target).attr("data-nonce"); jQuery("#wpfc-clear-cache-link-" + post_id).css('cursor', 'wait'); jQuery.ajax({ type: 'GET', url: ajaxurl, data : {"action": "wpfc_clear_cache_column", "id" : post_id, "nonce" : nonce}, dataType : "json", cache: false, success: function(data){ jQuery("#wpfc-clear-cache-link-" + post_id).css('cursor', 'pointer'); if(typeof data.success != "undefined" && data.success == true){ // }else{ alert("Clear Cache Error"); } } }); return false; }); }); }PKL\_owp-fastest-cache/uninstall.phpnu[ $cron_value) { foreach ( (array) $cron_value as $hook => $events ) { if(preg_match("/^wp\_fastest\_cache/", $hook)){ $args = array(); foreach ( (array) $events as $event_key => $event ) { if(isset($event["args"]) && isset($event["args"][0])){ $args = array(json_encode(json_decode($event["args"][0]))); } } wp_clear_scheduled_hook($hook, $args); } } } ?>PKL\|zx8989wp-fastest-cache/inc/admin.phpnu[options = $this->getOptions(); $this->setCronJobSettings(); $this->addButtonOnEditor(); add_action('admin_enqueue_scripts', array($this, 'addJavaScript')); add_filter('plugin_locale', array($this, 'my_plugin_locale_filter'), 10, 2); } public function my_plugin_locale_filter($locale, $domain){ if($domain === 'wp-fastest-cache'){ if(!isset($this->options->wpFastestCacheLanguage)){ return "en_US"; } $locale = $this->options->wpFastestCacheLanguage; if(file_exists(WPFC_MAIN_PATH."languages/wp-fastest-cache-".$locale.".mo")){ return $locale; }else{ return "en_US"; } } return $locale; } public function create_auto_cache_timeout($recurrance, $interval){ $exist_cronjob = false; $wpfc_timeout_number = 0; $crons = _get_cron_array(); foreach ((array)$crons as $cron_key => $cron_value) { foreach ( (array) $cron_value as $hook => $events ) { if(preg_match("/^wp\_fastest\_cache(.*)/", $hook, $id)){ if(!$id[1] || preg_match("/^\_(\d+)$/", $id[1])){ $wpfc_timeout_number++; foreach ( (array) $events as $event_key => $event ) { $schedules = wp_get_schedules(); if(isset($event["args"]) && isset($event["args"][0])){ if($event["args"][0] == '{"prefix":"all","content":"all"}'){ if($schedules[$event["schedule"]]["interval"] <= $interval){ $exist_cronjob = true; } } } } } } } } if(!$exist_cronjob){ $args = array("prefix" => "all", "content" => "all"); wp_schedule_event(time(), $recurrance, "wp_fastest_cache_".$wpfc_timeout_number, array(json_encode($args))); } } public function get_premium_version(){ $wpfc_premium_version = ""; if(file_exists(WPFC_WP_PLUGIN_DIR."/wp-fastest-cache-premium/wpFastestCachePremium.php")){ if($data = @file_get_contents(WPFC_WP_PLUGIN_DIR."/wp-fastest-cache-premium/wpFastestCachePremium.php")){ preg_match("/Version:\s*(.+)/", $data, $out); if(isset($out[1]) && $out[1]){ $wpfc_premium_version = trim($out[1]); } } } return $wpfc_premium_version; } public function addButtonOnEditor(){ add_action('admin_print_footer_scripts', array($this, 'addButtonOnQuicktagsEditor')); add_action('init', array($this, 'myplugin_buttonhooks')); } public function checkShortCode($content){ preg_match("/\[wpfcNOT\]/", $content, $wpfcNOT); if(count($wpfcNOT) > 0){ if(is_single() || is_page()){ $this->blockCache = true; } $content = str_replace("[wpfcNOT]", "", $content); } return $content; } public function myplugin_buttonhooks() { // Only add hooks when the current user has permissions AND is in Rich Text editor mode if (current_user_can( 'manage_options' )) { add_filter("mce_external_plugins", array($this, "myplugin_register_tinymce_javascript")); add_filter('mce_buttons', array($this, 'myplugin_register_buttons')); } } // Load the TinyMCE plugin : editor_plugin.js (wp2.5) public function myplugin_register_tinymce_javascript($plugin_array) { $plugin_array['wpfc'] = plugins_url('../js/button.js?v='.time(),__file__); return $plugin_array; } public function myplugin_register_buttons($buttons) { array_push($buttons, 'wpfc'); return $buttons; } public function addButtonOnQuicktagsEditor(){ if (wp_script_is('quicktags') && current_user_can( 'manage_options' )){ ?> notify(array("The plugin does not work with Multisite.\n Please click here to learn how to enable it.", "error")); // return 0; // } // } if(current_user_can('manage_options')){ if($_POST["wpFastestCachePage"] == "options"){ $this->exclude_urls(); $this->saveOption(); }else if($_POST["wpFastestCachePage"] == "deleteCache"){ $this->deleteCache(); }else if($_POST["wpFastestCachePage"] == "deleteCssAndJsCache"){ $this->deleteCache(true); }else if($_POST["wpFastestCachePage"] == "cacheTimeout"){ $this->addCacheTimeout(); } }else{ die("Forbidden"); } } } } public function exclude_urls(){ // to exclude wishlist url of YITH WooCommerce Wishlist if($this->isPluginActive('yith-woocommerce-wishlist/init.php')){ $wishlist_page_id = get_option("yith_wcwl_wishlist_page_id"); $permalink = urldecode(get_permalink($wishlist_page_id)); if(preg_match("/https?:\/\/[^\/]+\/(.+)/", $permalink, $out)){ $url = trim($out[1], "/"); } } if(isset($url) && $url){ $rules_std = array(); $rules_json = get_option("WpFastestCacheExclude"); $new_rule = new stdClass; $new_rule->prefix = "exact"; $new_rule->content = $url; $new_rule->type = "page"; if($rules_json === false){ array_push($rules_std, $new_rule); add_option("WpFastestCacheExclude", json_encode($rules_std), null, "yes"); }else{ $rules_std = json_decode($rules_json); if(!is_array($rules_std)){ $rules_std = array(); } if(!in_array($new_rule, $rules_std)){ array_push($rules_std, $new_rule); update_option("WpFastestCacheExclude", json_encode($rules_std)); } } } } public function addCacheTimeout(){ if(isset($_POST["wpFastestCacheTimeOut"])){ if($_POST["wpFastestCacheTimeOut"]){ if(isset($_POST["wpFastestCacheTimeOutHour"]) && is_numeric($_POST["wpFastestCacheTimeOutHour"])){ if(isset($_POST["wpFastestCacheTimeOutMinute"]) && is_numeric($_POST["wpFastestCacheTimeOutMinute"])){ $selected = mktime($_POST["wpFastestCacheTimeOutHour"], $_POST["wpFastestCacheTimeOutMinute"], 0, date("n"), date("j"), date("Y")); if($selected > time()){ $timestamp = $selected; }else{ if(time() - $selected < 60){ $timestamp = $selected + 60; }else{ // if selected time is less than now, 24hours is added $timestamp = $selected + 24*60*60; } } wp_clear_scheduled_hook($this->slug()); wp_schedule_event($timestamp, $_POST["wpFastestCacheTimeOut"], $this->slug()); }else{ echo "Minute was not set"; exit; } }else{ echo "Hour was not set"; exit; } }else{ wp_clear_scheduled_hook($this->slug()); } } } public function setCronJobSettings(){ if(wp_next_scheduled($this->slug())){ $this->cronJobSettings["period"] = wp_get_schedule($this->slug()); $this->cronJobSettings["time"] = wp_next_scheduled($this->slug()); } } public function addMenuPage(){ add_action('admin_menu', array($this, 'register_my_custom_menu_page')); } public function addJavaScript(){ wp_enqueue_script("jquery-ui-draggable"); wp_enqueue_script("jquery-ui-position"); wp_enqueue_script("jquery-ui-sortable"); wp_enqueue_script("wpfc-dialog", plugins_url("wp-fastest-cache/js/dialog.js"), array(), time(), false); wp_enqueue_script("wpfc-dialog-new", plugins_url("wp-fastest-cache/js/dialog_new.js"), array(), time(), false); wp_enqueue_script("wpfc-cdn", plugins_url("wp-fastest-cache/js/cdn/cdn.js"), array(), time(), false); wp_enqueue_script("wpfc-schedule", plugins_url("wp-fastest-cache/js/schedule.js"), array(), time(), true); wp_enqueue_script("wpfc-db", plugins_url("wp-fastest-cache/js/db.js"), array(), time(), true); if(class_exists("WpFastestCacheImageOptimisation")){ if(file_exists(WPFC_WP_PLUGIN_DIR."/wp-fastest-cache-premium/pro/js/statics.js")){ wp_enqueue_script("wpfc-statics", plugins_url("wp-fastest-cache-premium/pro/js/statics.js"), array(), time(), false); } if(file_exists(WPFC_WP_PLUGIN_DIR."/wp-fastest-cache-premium/pro/js/premium.js")){ wp_enqueue_script("wpfc-premium", plugins_url("wp-fastest-cache-premium/pro/js/premium.js"), array(), time(), true); } } } public function saveOption(){ unset($_POST["wpFastestCachePage"]); unset($_POST["option_page"]); unset($_POST["action"]); unset($_POST["_wpnonce"]); unset($_POST["_wp_http_referer"]); $data = json_encode($_POST); //for optionsPage() $_POST is array and json_decode() converts to stdObj $this->options = json_decode($data); $this->systemMessage = $this->modifyHtaccess($_POST); if(isset($this->systemMessage[1]) && $this->systemMessage[1] != "error"){ if($message = $this->checkCachePathWriteable()){ if(is_array($message)){ $this->systemMessage = $message; }else{ if(isset($this->options->wpFastestCachePreload)){ $this->set_preload(); }else{ delete_option("WpFastestCachePreLoad"); wp_clear_scheduled_hook("wp_fastest_cache_Preload"); } if(get_option("WpFastestCache")){ update_option("WpFastestCache", $data); }else{ add_option("WpFastestCache", $data, null, "yes"); } } } } $this->notify($this->systemMessage); } public function checkCachePathWriteable(){ $message = array(); if(!is_dir($this->getWpContentDir("/cache/"))){ if (@mkdir($this->getWpContentDir("/cache/"), 0755, true)){ // }else{ array_push($message, "- ".$this->getWpContentDir("/cache/")." is needed to be created"); } }else{ if (@mkdir($this->getWpContentDir("/cache/testWpFc/"), 0755, true)){ rmdir($this->getWpContentDir("/cache/testWpFc/")); }else{ array_push($message, "- ".$this->getWpContentDir("/cache/")." permission has to be 755"); } } if(!is_dir($this->getWpContentDir("/cache/all/"))){ if (@mkdir($this->getWpContentDir("/cache/all/"), 0755, true)){ // }else{ array_push($message, "- ".$this->getWpContentDir("/cache/all/")." is needed to be created"); } }else{ if (@mkdir($this->getWpContentDir("/cache/all/testWpFc/"), 0755, true)){ rmdir($this->getWpContentDir("/cache/all/testWpFc/")); }else{ array_push($message, "- ".$this->getWpContentDir("/cache/all/")." permission has to be 755"); } } if(count($message) > 0){ return array(implode("
    ", $message), "error"); }else{ return true; } } public function modifyHtaccess($post){ $path = ABSPATH; if($this->is_subdirectory_install()){ $path = $this->getABSPATH(); } // if(isset($_SERVER["SERVER_SOFTWARE"]) && $_SERVER["SERVER_SOFTWARE"] && preg_match("/iis/i", $_SERVER["SERVER_SOFTWARE"])){ // return array("The plugin does not work with Microsoft IIS. Only with Apache", "error"); // } // if(isset($_SERVER["SERVER_SOFTWARE"]) && $_SERVER["SERVER_SOFTWARE"] && preg_match("/nginx/i", $_SERVER["SERVER_SOFTWARE"])){ // return array("The plugin does not work with Nginx. Only with Apache", "error"); // } if(!file_exists($path.".htaccess")){ if(isset($_SERVER["SERVER_SOFTWARE"]) && $_SERVER["SERVER_SOFTWARE"] && (preg_match("/iis/i", $_SERVER["SERVER_SOFTWARE"]) || preg_match("/nginx/i", $_SERVER["SERVER_SOFTWARE"]))){ // }else{ return array(" Read More", "error"); } } if($this->isPluginActive('wp-postviews/wp-postviews.php')){ $wp_postviews_options = get_option("views_options"); $wp_postviews_options["use_ajax"] = true; update_option("views_options", $wp_postviews_options); if(!WP_CACHE){ if($wp_config = @file_get_contents(ABSPATH."wp-config.php")){ $wp_config = str_replace("\$table_prefix", "define('WP_CACHE', true);\n\$table_prefix", $wp_config); if(!@file_put_contents(ABSPATH."wp-config.php", $wp_config)){ return array("define('WP_CACHE', true); is needed to be added into wp-config.php", "error"); } }else{ return array("define('WP_CACHE', true); is needed to be added into wp-config.php", "error"); } } } // if(get_option('template') == "Divi"){ // // Divi Theme - Static CSS File Generation // if($et_divi = get_option("et_divi")){ // if(isset($et_divi["et_pb_static_css_file"]) && $et_divi["et_pb_static_css_file"] == "on"){ // return array("You have to disable the Static CSS File Generation option of Divi Theme", "error"); // } // } // } if ($this->isPluginActive('elementor/elementor.php')) { // Elementor Plugin - Element Caching $new_option = get_option('elementor_element_cache_ttl'); $old_option = get_option('elementor_experiment-e_element_cache'); $is_elementor_cache_inactive = false; if ($new_option !== false) { // New versions: element cache is active unless explicitly disabled/inactive $is_elementor_cache_inactive = in_array($new_option, ['disable', 'inactive'], true); }elseif ($old_option !== false) { // Old versions: element cache is active unless inactive $is_elementor_cache_inactive = ($old_option === 'inactive'); } if (!$is_elementor_cache_inactive) { return array( "You have to set the Element Caching option of the Elementor plugin to Inactive", "error" ); } $elementor_css_print_method_option = get_option("elementor_css_print_method"); if($elementor_css_print_method_option && $elementor_css_print_method_option != "internal"){ return array( "You have to set the CSS Print Method option of the Elementor plugin to Internal Embedding", "error" ); } } if(file_exists($path.".htaccess")){ $htaccess = @file_get_contents($path.".htaccess"); }else{ $htaccess = ""; } // if(defined('DONOTCACHEPAGE')){ // return array("DONOTCACHEPAGE ", "error"); // }else if(!preg_match("/^https/i", get_option("home")) && is_ssl()){ return array("Mismatch detected: Site is using HTTPS but the 'Home' URL is set to HTTP. Please update your WordPress 'Home' URL to use HTTPS", "error"); }else if(!get_option('permalink_structure')){ return array("You have to set permalinks", "error"); }else if($res = $this->checkSuperCache($path, $htaccess)){ return $res; }else if($this->isPluginActive('cookie-notice/cookie-notice.php')){ return array("Cookie Notice & Compliance for GDPR / CCPA needs to be deactivated", "error"); }else if($this->isPluginActive('fast-velocity-minify/fvm.php')){ return array("Fast Velocity Minify needs to be deactivated", "error"); }else if($this->isPluginActive('far-future-expiration/far-future-expiration.php')){ return array("Far Future Expiration Plugin needs to be deactivated", "error"); }else if($this->isPluginActive('sg-cachepress/sg-cachepress.php')){ return array("SG Optimizer needs to be deactived", "error"); }else if($this->isPluginActive('adrotate/adrotate.php') || $this->isPluginActive('adrotate-pro/adrotate.php')){ return $this->warningIncompatible("AdRotate"); }else if($this->isPluginActive('mobilepress/mobilepress.php')){ return $this->warningIncompatible("MobilePress", array("name" => "WPtouch Mobile", "url" => "https://wordpress.org/plugins/wptouch/")); }else if($this->isPluginActive('speed-booster-pack/speed-booster-pack.php')){ return array("Speed Booster Pack needs to be deactivated
    ", "error"); }else if($this->isPluginActive('cdn-enabler/cdn-enabler.php')){ return array("CDN Enabler needs to be deactivated
    This plugin has aldready CDN feature", "error"); }else if($this->isPluginActive('wp-performance-score-booster/wp-performance-score-booster.php')){ return array("WP Performance Score Booster needs to be deactivated
    This plugin has aldready Gzip, Leverage Browser Caching features", "error"); }else if($this->isPluginActive('bwp-minify/bwp-minify.php')){ return array("Better WordPress Minify needs to be deactivated
    This plugin has aldready Minify feature", "error"); }else if($this->isPluginActive('check-and-enable-gzip-compression/richards-toolbox.php')){ return array("Check and Enable GZIP compression needs to be deactivated
    This plugin has aldready Gzip feature", "error"); }else if($this->isPluginActive('gzippy/gzippy.php')){ return array("GZippy needs to be deactivated
    This plugin has aldready Gzip feature", "error"); }else if($this->isPluginActive('gzip-ninja-speed-compression/gzip-ninja-speed.php')){ return array("GZip Ninja Speed Compression needs to be deactivated
    This plugin has aldready Gzip feature", "error"); }else if($this->isPluginActive('wordpress-gzip-compression/ezgz.php')){ return array("WordPress Gzip Compression needs to be deactivated
    This plugin has aldready Gzip feature", "error"); }else if($this->isPluginActive('filosofo-gzip-compression/filosofo-gzip-compression.php')){ return array("GZIP Output needs to be deactivated
    This plugin has aldready Gzip feature", "error"); }else if($this->isPluginActive('head-cleaner/head-cleaner.php')){ return array("Head Cleaner needs to be deactivated", "error"); }else if($this->isPluginActive('far-future-expiry-header/far-future-expiration.php')){ return array("Far Future Expiration Plugin needs to be deactivated", "error"); }else if(is_writable($path.".htaccess")){ $htaccess = $this->insertWebp($htaccess); $htaccess = $this->insertLBCRule($htaccess, $post); $htaccess = $this->insertGzipRule($htaccess, $post); $htaccess = $this->insertRewriteRule($htaccess, $post); $htaccess = $this->to_move_gtranslate_rules($htaccess); file_put_contents($path.".htaccess", $htaccess); }else{ return array(__("Options have been saved", 'wp-fastest-cache'), "updated"); //return array(".htaccess is not writable", "error"); } return array(__("Options have been saved", 'wp-fastest-cache'), "updated"); } public function to_move_gtranslate_rules($htaccess){ preg_match("/\#\#\#\s+BEGIN\sGTranslate\sconfig\s\#\#\#[^\#]+\#\#\#\s+END\sGTranslate\sconfig\s\#\#\#/i", $htaccess, $gtranslate); if(isset($gtranslate[0])){ $htaccess = preg_replace("/\#\#\#\s+BEGIN\sGTranslate\sconfig\s\#\#\#[^\#]+\#\#\#\s+END\sGTranslate\sconfig\s\#\#\#/i", "", $htaccess); $htaccess = $gtranslate[0]."\n".$htaccess; } return $htaccess; } public function warningIncompatible($incompatible, $alternative = false){ if($alternative){ return array($incompatible."
    ".$alternative["name"]."", "error"); }else{ return array($incompatible." ", "error"); } } public function insertWebp($htaccess){ if(class_exists("WpFastestCachePowerfulHtml")){ if(defined("WPFC_DISABLE_WEBP") && WPFC_DISABLE_WEBP){ $webp = false; }else{ $webp = true; $cdn_values = get_option("WpFastestCacheCDN"); if($cdn_values){ $std_obj = json_decode($cdn_values); foreach($std_obj as $key => $value){ if($value->id == "cloudflare"){ include_once('cdn.php'); CdnWPFC::cloudflare_clear_cache(); $res = CdnWPFC::cloudflare_get_zone_id($value->cdnurl, $value->originurl); if($res["success"] && ($res["plan"] == "free")){ $webp = false; } break; } } } } }else{ $webp = false; } if($webp){ $basename = "$1.webp"; /* This part for sub-directory installation WordPress Address (URL): site_url() Site Address (URL): home_url() */ if(preg_match("/https?\:\/\/[^\/]+\/(.+)/", site_url(), $siteurl_base_name)){ if(preg_match("/https?\:\/\/[^\/]+\/(.+)/", home_url(), $homeurl_base_name)){ /* site_url() return http://example.com/sub-directory home_url() returns http://example.com/sub-directory */ $homeurl_base_name[1] = trim($homeurl_base_name[1], "/"); $siteurl_base_name[1] = trim($siteurl_base_name[1], "/"); if($homeurl_base_name[1] == $siteurl_base_name[1]){ if(preg_match("/".preg_quote($homeurl_base_name[1], "/")."$/", trim(ABSPATH, "/"))){ $basename = $homeurl_base_name[1]."/".$basename; } }else{ if(!preg_match("/\//", $homeurl_base_name[1]) && !preg_match("/\//", $siteurl_base_name[1])){ /* site_url() return http://example.com/wordpress home_url() returns http://example.com/blog */ $basename = $homeurl_base_name[1]."/".$basename; $tmp_ABSPATH = str_replace(" ", "\ ", ABSPATH); if(preg_match("/\/$/", $tmp_ABSPATH)){ $tmp_ABSPATH = rtrim($tmp_ABSPATH, "/"); $tmp_ABSPATH = dirname($tmp_ABSPATH)."/".$homeurl_base_name[1]."/"; } } } }else{ /* site_url() return http://example.com/sub-directory home_url() returns http://example.com/ */ $siteurl_base_name[1] = trim($siteurl_base_name[1], "/"); $basename = $siteurl_base_name[1]."/".$basename; } } if(ABSPATH == "//"){ $RewriteCond = "RewriteCond %{DOCUMENT_ROOT}/".$basename." -f"."\n"; }else{ // to escape spaces if(!isset($tmp_ABSPATH)){ $tmp_ABSPATH = str_replace(" ", "\ ", ABSPATH); } $RewriteCond = "RewriteCond %{DOCUMENT_ROOT}/".$basename." -f [or]"."\n"; $RewriteCond = $RewriteCond."RewriteCond ".$tmp_ABSPATH."$1.webp -f"."\n"; } $data = "# BEGIN WEBPWpFastestCache"."\n". ""."\n". "RewriteEngine On"."\n". "RewriteCond %{HTTP_ACCEPT} image/webp"."\n". "RewriteCond %{REQUEST_URI} \.(jpe?g|png)"."\n". $RewriteCond. "RewriteRule ^(.*) \"/".$basename."\" [L]"."\n". ""."\n". ""."\n". "Header append Vary Accept env=REDIRECT_accept"."\n". ""."\n". "AddType image/webp .webp"."\n". "# END WEBPWpFastestCache"."\n"; if(!preg_match("/BEGIN\s*WEBPWpFastestCache/", $htaccess)){ $htaccess = $data.$htaccess; } return $htaccess; }else{ $htaccess = preg_replace("/#\s?BEGIN\s?WEBPWpFastestCache.*?#\s?END\s?WEBPWpFastestCache/s", "", $htaccess); return $htaccess; } } public function insertLBCRule($htaccess, $post){ if(isset($post["wpFastestCacheLBC"]) && $post["wpFastestCacheLBC"] == "on"){ $data = "# BEGIN LBCWpFastestCache"."\n". ''."\n". ''."\n". 'AddType application/font-woff2 .woff2'."\n". 'AddType application/x-font-opentype .otf'."\n". 'ExpiresActive On'."\n". 'ExpiresDefault A0'."\n". 'ExpiresByType video/webm A10368000'."\n". 'ExpiresByType video/ogg A10368000'."\n". 'ExpiresByType video/mp4 A10368000'."\n". 'ExpiresByType image/avif A10368000'."\n". 'ExpiresByType image/webp A10368000'."\n". 'ExpiresByType image/gif A10368000'."\n". 'ExpiresByType image/png A10368000'."\n". 'ExpiresByType image/jpg A10368000'."\n". 'ExpiresByType image/jpeg A10368000'."\n". 'ExpiresByType image/ico A10368000'."\n". 'ExpiresByType image/svg+xml A10368000'."\n". 'ExpiresByType text/css A10368000'."\n". 'ExpiresByType text/javascript A10368000'."\n". 'ExpiresByType application/javascript A10368000'."\n". 'ExpiresByType application/x-javascript A10368000'."\n". 'ExpiresByType application/font-woff2 A10368000'."\n". 'ExpiresByType application/x-font-opentype A10368000'."\n". 'ExpiresByType application/x-font-truetype A10368000'."\n". ''."\n". ''."\n". 'Header set Expires "max-age=A10368000, public"'."\n". 'Header unset ETag'."\n". 'Header set Connection keep-alive'."\n". 'FileETag None'."\n". ''."\n". ''."\n". "# END LBCWpFastestCache"."\n"; if(!preg_match("/BEGIN\s*LBCWpFastestCache/", $htaccess)){ return $data.$htaccess; }else{ return $htaccess; } }else{ //delete levere browser caching $htaccess = preg_replace("/#\s?BEGIN\s?LBCWpFastestCache.*?#\s?END\s?LBCWpFastestCache/s", "", $htaccess); return $htaccess; } } public function insertGzipRule($htaccess, $post){ if(isset($post["wpFastestCacheGzip"]) && $post["wpFastestCacheGzip"] == "on"){ $data = "# BEGIN GzipWpFastestCache"."\n". ""."\n". "AddType x-font/woff .woff"."\n". "AddType x-font/ttf .ttf"."\n". "AddOutputFilterByType DEFLATE image/svg+xml"."\n". "AddOutputFilterByType DEFLATE text/plain"."\n". "AddOutputFilterByType DEFLATE text/html"."\n". "AddOutputFilterByType DEFLATE text/xml"."\n". "AddOutputFilterByType DEFLATE text/css"."\n". "AddOutputFilterByType DEFLATE text/javascript"."\n". "AddOutputFilterByType DEFLATE application/xml"."\n". "AddOutputFilterByType DEFLATE application/xhtml+xml"."\n". "AddOutputFilterByType DEFLATE application/rss+xml"."\n". "AddOutputFilterByType DEFLATE application/javascript"."\n". "AddOutputFilterByType DEFLATE application/x-javascript"."\n". "AddOutputFilterByType DEFLATE application/x-font-ttf"."\n". "AddOutputFilterByType DEFLATE x-font/ttf"."\n". "AddOutputFilterByType DEFLATE application/vnd.ms-fontobject"."\n". "AddOutputFilterByType DEFLATE font/opentype font/ttf font/eot font/otf"."\n". ""."\n"; if(defined("WPFC_GZIP_FOR_COMBINED_FILES") && WPFC_GZIP_FOR_COMBINED_FILES){ $data = $data."\n".''."\n". "# to zip the combined css and js files"."\n\n". "RewriteEngine On"."\n". "RewriteCond %{HTTP:Accept-encoding} gzip"."\n". "RewriteCond %{REQUEST_FILENAME}\.gz -s"."\n". "RewriteRule ^(.*)\.(css|js) $1\.$2\.gz [QSA]"."\n\n". "# to revent double gzip and give the correct mime-type"."\n\n". "RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1,E=FORCE_GZIP]"."\n". "RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1,E=FORCE_GZIP]"."\n". "Header set Content-Encoding gzip env=FORCE_GZIP"."\n". ""."\n"; } $data = $data."# END GzipWpFastestCache"."\n"; $htaccess = preg_replace("/\s*\#\s?BEGIN\s?GzipWpFastestCache.*?#\s?END\s?GzipWpFastestCache\s*/s", "", $htaccess); return $data.$htaccess; }else{ //delete gzip rules $htaccess = preg_replace("/\s*\#\s?BEGIN\s?GzipWpFastestCache.*?#\s?END\s?GzipWpFastestCache\s*/s", "", $htaccess); return $htaccess; } } public function insertRewriteRule($htaccess, $post){ if(isset($post["wpFastestCacheStatus"]) && $post["wpFastestCacheStatus"] == "on"){ $htaccess = preg_replace("/#\s?BEGIN\s?WpFastestCache.*?#\s?END\s?WpFastestCache/s", "", $htaccess); $htaccess = $this->getHtaccess().$htaccess; }else{ $htaccess = preg_replace("/#\s?BEGIN\s?WpFastestCache.*?#\s?END\s?WpFastestCache/s", "", $htaccess); $this->deleteCache(); } if(defined("WPFC_SERVE_ONLY_VIA_CACHE") && WPFC_SERVE_ONLY_VIA_CACHE){ $htaccess = preg_replace("/#\s?BEGIN\s?WpFastestCache.*?#\s?END\s?WpFastestCache/s", "", $htaccess); } return $htaccess; } public function prefixRedirect(){ $forceTo = ""; if(defined("WPFC_DISABLE_REDIRECTION") && WPFC_DISABLE_REDIRECTION){ return $forceTo; } if(preg_match("/^https:\/\//", home_url())){ if(preg_match("/^https:\/\/www\./", home_url())){ $forceTo = "\nRewriteCond %{HTTPS} on"."\n". "RewriteCond %{HTTP_HOST} ^www.".str_replace("www.", "", $_SERVER["HTTP_HOST"])."\n"; }else{ $forceTo = "\nRewriteCond %{HTTPS} on"."\n". "RewriteCond %{HTTP_HOST} ^".str_replace("www.", "", $_SERVER["HTTP_HOST"])."\n"; } }else{ if(preg_match("/^http:\/\/www\./", home_url())){ $forceTo = "\nRewriteCond %{HTTP_HOST} ^".str_replace("www.", "", $_SERVER["HTTP_HOST"])."\n". "RewriteRule ^(.*)$ ".preg_quote(home_url(), "/")."\/$1 [R=301,L]"."\n"; }else{ $forceTo = "\nRewriteCond %{HTTP_HOST} ^www.".str_replace("www.", "", $_SERVER["HTTP_HOST"])." [NC]"."\n". "RewriteRule ^(.*)$ ".preg_quote(home_url(), "/")."\/$1 [R=301,L]"."\n"; } } return $forceTo; } public function getHtaccess(){ $mobile = ""; $loggedInUser = ""; $ifIsNotSecure = ""; $trailing_slash_rule = ""; $consent_cookie = ""; $cache_path = '/cache/all/'; if($this->isPluginActive('sitepress-multilingual-cms/sitepress.php')){ $language_negotiation_type = apply_filters('wpml_setting', false, 'language_negotiation_type'); if($language_negotiation_type == 2){ $cache_path = '/cache/%{HTTP_HOST}/all/'; } } if($this->isPluginActive('polylang/polylang.php') || $this->isPluginActive('polylang-pro/polylang.php')){ $polylang_settings = get_option("polylang"); if(isset($polylang_settings["force_lang"])){ if($polylang_settings["force_lang"] == 2 || $polylang_settings["force_lang"] == 3){ // The language is set from the subdomain name in pretty permalinks // The language is set from different domains $cache_path = '/cache/%{HTTP_HOST}/all/'; } } } if(isset($_POST["wpFastestCacheMobile"]) && $_POST["wpFastestCacheMobile"] == "on"){ $mobile = "RewriteCond %{HTTP_USER_AGENT} !^.*".$this->getMobileUserAgents().".*$ [NC]"."\n"; if(isset($_SERVER['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER'])){ $mobile = $mobile."RewriteCond %{HTTP_CLOUDFRONT_IS_MOBILE_VIEWER} false [NC]"."\n"; $mobile = $mobile."RewriteCond %{HTTP_CLOUDFRONT_IS_TABLET_VIEWER} false [NC]"."\n"; } } if(isset($_POST["wpFastestCacheLoggedInUser"]) && $_POST["wpFastestCacheLoggedInUser"] == "on"){ $loggedInUser = "RewriteCond %{HTTP:Cookie} !wordpress_logged_in"."\n"; } if(!preg_match("/^https/i", get_option("home"))){ $ifIsNotSecure = "RewriteCond %{HTTPS} !=on"; } if($this->is_trailing_slash()){ $trailing_slash_rule = "RewriteCond %{REQUEST_URI} \/$"."\n"; }else{ $trailing_slash_rule = "RewriteCond %{REQUEST_URI} ![^\/]+\/$"."\n"; } $query_string = "RewriteCond %{QUERY_STRING} !.+ [OR]"."\n". "RewriteCond %{QUERY_STRING} fbclid="."\n"; $data = "# BEGIN WpFastestCache"."\n". "# Modified Time: ".date("d-m-y G:i:s", current_time('timestamp'))."\n". ""."\n". "RewriteEngine On"."\n". "RewriteBase /"."\n". $this->ruleForWpContent()."\n". $this->prefixRedirect(). $this->excludeRules()."\n". $this->excludeAdminCookie()."\n". $this->http_condition_rule()."\n". "RewriteCond %{HTTP_USER_AGENT} !(".$this->get_excluded_useragent().")"."\n". "RewriteCond %{HTTP_USER_AGENT} !(WP\sFastest\sCache\sPreload(\siPhone\sMobile)?\s*Bot)"."\n". "RewriteCond %{REQUEST_METHOD} !POST"."\n". $ifIsNotSecure."\n". "RewriteCond %{REQUEST_URI} !(\/){2,}"."\n". "RewriteCond %{THE_REQUEST} !(\/){2,}"."\n". $trailing_slash_rule. $query_string. $loggedInUser. $consent_cookie. "RewriteCond %{HTTP:Cookie} !comment_author_"."\n". //"RewriteCond %{HTTP:Cookie} !woocommerce_items_in_cart"."\n". 'RewriteCond %{HTTP:Profile} !^[a-z0-9\"]+ [NC]'."\n".$mobile; if(ABSPATH == "//"){ $data = $data."RewriteCond %{DOCUMENT_ROOT}/".WPFC_WP_CONTENT_BASENAME.$cache_path."$1/index.html -f"."\n"; }else{ //WARNING: If you change the following lines, you need to update webp as well $data = $data."RewriteCond %{DOCUMENT_ROOT}/".WPFC_WP_CONTENT_BASENAME.$cache_path."$1/index.html -f [or]"."\n"; // to escape spaces $tmp_WPFC_WP_CONTENT_DIR = str_replace(" ", "\ ", WPFC_WP_CONTENT_DIR); $data = $data."RewriteCond ".$tmp_WPFC_WP_CONTENT_DIR.$cache_path.$this->getRewriteBase(true)."$1/index.html -f"."\n"; } $data = $data.'RewriteRule ^(.*) "/'.$this->getRewriteBase().WPFC_WP_CONTENT_BASENAME.$cache_path.$this->getRewriteBase(true).'$1/index.html" [L]'."\n"; //RewriteRule !/ "/wp-content/cache/all/index.html" [L] if(class_exists("WpFcMobileCache") && isset($this->options->wpFastestCacheMobileTheme) && $this->options->wpFastestCacheMobileTheme){ $wpfc_mobile = new WpFcMobileCache(); if($this->isPluginActive('wptouch/wptouch.php') || $this->isPluginActive('wptouch-pro/wptouch-pro.php')){ $wpfc_mobile->set_wptouch(true); }else{ $wpfc_mobile->set_wptouch(false); } $data = $data."\n\n\n".$wpfc_mobile->update_htaccess($data); } $data = $data.""."\n". ""."\n". "AddDefaultCharset UTF-8"."\n". ""."\n". "FileETag None"."\n". "Header unset ETag"."\n". "Header set Cache-Control \"max-age=0, no-cache, no-store, must-revalidate\""."\n". "Header set Pragma \"no-cache\""."\n". "Header set Expires \"Mon, 29 Oct 1923 20:30:00 GMT\""."\n". ""."\n". ""."\n". "# END WpFastestCache"."\n"; if(is_multisite()){ return ""; }else{ return preg_replace("/\n+/","\n", $data); } } public function http_condition_rule(){ $http_host = preg_replace("/(http(s?)\:)?\/\/(www\d*\.)?/i", "", trim(home_url(), "/")); if(preg_match("/\//", $http_host)){ $http_host = strstr($http_host, '/', true); } if(preg_match("/www\./", home_url())){ $http_host = "www.".$http_host; } return "RewriteCond %{HTTP_HOST} ^".$http_host; } public function ruleForWpContent(){ return ""; $newContentPath = str_replace(home_url(), "", content_url()); if(!preg_match("/wp-content/", $newContentPath)){ $newContentPath = trim($newContentPath, "/"); return "RewriteRule ^".$newContentPath."/cache/(.*) ".WPFC_WP_CONTENT_DIR."/cache/$1 [L]"."\n"; } return ""; } public function getRewriteBase($sub = ""){ if($sub && $this->is_subdirectory_install()){ $trimedProtocol = preg_replace("/http:\/\/|https:\/\//", "", trim(home_url(), "/")); $path = strstr($trimedProtocol, '/'); if($path){ return trim($path, "/")."/"; }else{ return ""; } } $url = rtrim(site_url(), "/"); preg_match("/https?:\/\/[^\/]+(.*)/", $url, $out); if(isset($out[1]) && $out[1]){ $out[1] = trim($out[1], "/"); if(preg_match("/\/".preg_quote($out[1], "/")."\//", WPFC_WP_CONTENT_DIR)){ return $out[1]."/"; }else{ return ""; } }else{ return ""; } } public function checkSuperCache($path, $htaccess){ if($this->isPluginActive('wp-super-cache/wp-cache.php')){ return array("WP Super Cache needs to be deactive", "error"); }else{ if(file_exists($path."wp-content/wp-cache-config.php")){ @unlink($path."wp-content/wp-cache-config.php"); } $message = ""; if(is_file($path."wp-content/wp-cache-config.php")){ $message .= "
    - be sure that you removed /wp-content/wp-cache-config.php"; } if(preg_match("/supercache/", $htaccess)){ $message .= "
    - be sure that you removed the rules of super cache from the .htaccess"; } return $message ? array("WP Super Cache cannot remove its own remnants so please follow the steps below".$message, "error") : ""; } return ""; } public function check_htaccess(){ $path = ABSPATH; if($this->is_subdirectory_install()){ $path = $this->getABSPATH(); } if(!is_writable($path.".htaccess") && count($_POST) > 0){ include_once(WPFC_MAIN_PATH."templates/htaccess.html"); $htaccess = @file_get_contents($path.".htaccess"); if(isset($this->options->wpFastestCacheLBC)){ $htaccess = $this->insertLBCRule($htaccess, array("wpFastestCacheLBC" => "on")); } if(isset($this->options->wpFastestCacheGzip)){ $htaccess = $this->insertGzipRule($htaccess, array("wpFastestCacheGzip" => "on")); } if(isset($this->options->wpFastestCacheStatus)){ $htaccess = $this->insertRewriteRule($htaccess, array("wpFastestCacheStatus" => "on")); } $htaccess = preg_replace("/\n+/","\n", $htaccess); echo ""; echo ""; ?> options->wpFastestCacheCombineCss) ? 'checked="checked"' : ""; $wpFastestCacheGoogleFonts = isset($this->options->wpFastestCacheGoogleFonts) ? 'checked="checked"' : ""; $wpFastestCacheGzip = isset($this->options->wpFastestCacheGzip) ? 'checked="checked"' : ""; $wpFastestCacheCombineJs = isset($this->options->wpFastestCacheCombineJs) ? 'checked="checked"' : ""; $wpFastestCacheCombineJsPowerFul = isset($this->options->wpFastestCacheCombineJsPowerFul) ? 'checked="checked"' : ""; $wpFastestCacheDisableEmojis = isset($this->options->wpFastestCacheDisableEmojis) ? 'checked="checked"' : ""; $wpFastestCacheRenderBlocking = isset($this->options->wpFastestCacheRenderBlocking) ? 'checked="checked"' : ""; $wpFastestCacheRenderBlockingCss = isset($this->options->wpFastestCacheRenderBlockingCss) ? 'checked="checked"' : ""; $wpFastestCacheDelayJS = isset($this->options->wpFastestCacheDelayJS) ? 'checked="checked"' : ""; $wpFastestCacheLanguage = isset($this->options->wpFastestCacheLanguage) ? $this->options->wpFastestCacheLanguage : "eng"; $wpFastestCacheLazyLoad = isset($this->options->wpFastestCacheLazyLoad) ? 'checked="checked"' : ""; $wpFastestCacheLazyLoad_keywords = isset($this->options->wpFastestCacheLazyLoad_keywords) ? $this->options->wpFastestCacheLazyLoad_keywords : ""; $wpFastestCacheLazyLoad_placeholder = isset($this->options->wpFastestCacheLazyLoad_placeholder) ? $this->options->wpFastestCacheLazyLoad_placeholder : "default"; $wpFastestCacheLazyLoad_exclude_full_size_img = isset($this->options->wpFastestCacheLazyLoad_exclude_full_size_img) ? 'checked="checked"' : ""; $wpFastestCacheLBC = isset($this->options->wpFastestCacheLBC) ? 'checked="checked"' : ""; $wpFastestCacheLoggedInUser = isset($this->options->wpFastestCacheLoggedInUser) ? 'checked="checked"' : ""; $wpFastestCacheMinifyCss = isset($this->options->wpFastestCacheMinifyCss) ? 'checked="checked"' : ""; $wpFastestCacheMinifyCssPowerFul = isset($this->options->wpFastestCacheMinifyCssPowerFul) ? 'checked="checked"' : ""; $wpFastestCacheMinifyHtml = isset($this->options->wpFastestCacheMinifyHtml) ? 'checked="checked"' : ""; $wpFastestCacheMinifyHtmlPowerFul = isset($this->options->wpFastestCacheMinifyHtmlPowerFul) ? 'checked="checked"' : ""; $wpFastestCacheMinifyJs = isset($this->options->wpFastestCacheMinifyJs) ? 'checked="checked"' : ""; $wpFastestCacheMobile = isset($this->options->wpFastestCacheMobile) ? 'checked="checked"' : ""; $wpFastestCacheMobileTheme = isset($this->options->wpFastestCacheMobileTheme) ? 'checked="checked"' : ""; $wpFastestCacheMobileTheme_themename = isset($this->options->wpFastestCacheMobileTheme_themename) ? $this->options->wpFastestCacheMobileTheme_themename : ""; $wpFastestCacheNewPost = isset($this->options->wpFastestCacheNewPost) ? 'checked="checked"' : ""; $wpFastestCacheRemoveComments = isset($this->options->wpFastestCacheRemoveComments) ? 'checked="checked"' : ""; $wpFastestCachePreload = isset($this->options->wpFastestCachePreload) ? 'checked="checked"' : ""; $wpFastestCachePreload_homepage = isset($this->options->wpFastestCachePreload_homepage) ? 'checked="checked"' : ""; $wpFastestCachePreload_post = isset($this->options->wpFastestCachePreload_post) ? 'checked="checked"' : ""; $wpFastestCachePreload_category = isset($this->options->wpFastestCachePreload_category) ? 'checked="checked"' : ""; $wpFastestCachePreload_customposttypes = isset($this->options->wpFastestCachePreload_customposttypes) ? 'checked="checked"' : ""; $wpFastestCachePreload_customTaxonomies = isset($this->options->wpFastestCachePreload_customTaxonomies) ? 'checked="checked"' : ""; $wpFastestCachePreload_page = isset($this->options->wpFastestCachePreload_page) ? 'checked="checked"' : ""; $wpFastestCachePreload_tag = isset($this->options->wpFastestCachePreload_tag) ? 'checked="checked"' : ""; $wpFastestCachePreload_attachment = isset($this->options->wpFastestCachePreload_attachment) ? 'checked="checked"' : ""; $wpFastestCachePreload_number = isset($this->options->wpFastestCachePreload_number) ? esc_attr($this->options->wpFastestCachePreload_number) : 4; $wpFastestCachePreload_restart = isset($this->options->wpFastestCachePreload_restart) ? 'checked="checked"' : ""; $wpFastestCachePreload_order = isset($this->options->wpFastestCachePreload_order) ? esc_attr($this->options->wpFastestCachePreload_order) : ""; $wpFastestCachePreload_sitemap = isset($this->options->wpFastestCachePreload_sitemap) ? esc_attr($this->options->wpFastestCachePreload_sitemap) : ""; $wpFastestCacheStatus = isset($this->options->wpFastestCacheStatus) ? 'checked="checked"' : ""; $wpFastestCacheTimeOut = isset($this->cronJobSettings["period"]) ? $this->cronJobSettings["period"] : ""; $wpFastestCacheUpdatePost = isset($this->options->wpFastestCacheUpdatePost) ? 'checked="checked"' : ""; $wpFastestCacheWidgetCache = isset($this->options->wpFastestCacheWidgetCache) ? 'checked="checked"' : ""; ?>

    "wpfc-options","title" => __("Settings", "wp-fastest-cache" ))); array_push($tabs, array("id"=>"wpfc-deleteCache","title" => __("Clear Cache", "wp-fastest-cache" ))); array_push($tabs, array("id"=>"wpfc-imageOptimisation","title" => __("Image Optimization", "wp-fastest-cache" ))); if(!class_exists("WpFastestCachePowerfulHtml")){ array_push($tabs, array("id"=>"wpfc-premium","title"=>"Premium")); } array_push($tabs, array("id"=>"wpfc-exclude","title"=>__("Exclude", "wp-fastest-cache" ))); array_push($tabs, array("id"=>"wpfc-cdn","title"=>"CDN")); array_push($tabs, array("id"=>"wpfc-db","title"=>"DB")); foreach ($tabs as $key => $value){ $checked = ""; //tab of "delete css and js" has been removed so there is need to check it if(isset($_POST["wpFastestCachePage"]) && $_POST["wpFastestCachePage"] && $_POST["wpFastestCachePage"] == "deleteCssAndJsCache"){ $_POST["wpFastestCachePage"] = "deleteCache"; } if(!isset($_POST["wpFastestCachePage"]) && $value["id"] == "wpfc-options"){ $checked = ' checked="checked" '; }else if((isset($_POST["wpFastestCachePage"])) && ("wpfc-".$_POST["wpFastestCachePage"] == $value["id"])){ $checked = ' checked="checked" '; } echo ''."\n"; echo ''."\n"; } ?>
    id="wpFastestCacheStatus" name="wpFastestCacheStatus">
    id="wpFastestCacheWidgetCache" name="wpFastestCacheWidgetCache">
    id="wpFastestCacheWidgetCache">
    id="wpFastestCacheWidgetCache">
    id="wpFastestCacheWidgetCache">
    id="wpFastestCachePreload" name="wpFastestCachePreload">
    " >" />
    " >
    id="wpFastestCacheLoggedInUser" name="wpFastestCacheLoggedInUser">
    id="wpFastestCacheMobile" name="wpFastestCacheMobile">
    id="wpFastestCacheMobileTheme" name="wpFastestCacheMobileTheme">
    id="wpFastestCacheNewPost" name="wpFastestCacheNewPost">
    id="wpFastestCacheUpdatePost" name="wpFastestCacheUpdatePost">
    id="wpFastestCacheMinifyHtml" name="wpFastestCacheMinifyHtml">
    id="wpFastestCacheMinifyHtmlPowerFul" name="wpFastestCacheMinifyHtmlPowerFul">
    id="wpFastestCacheMinifyCss" name="wpFastestCacheMinifyCss">
    id="wpFastestCacheMinifyCssPowerFul" name="wpFastestCacheMinifyCssPowerFul">
    id="wpFastestCacheCombineCss" name="wpFastestCacheCombineCss">
    id="wpFastestCacheMinifyJs" name="wpFastestCacheMinifyJs">
    id="wpFastestCacheCombineJs" name="wpFastestCacheCombineJs"> (header)
    id="wpFastestCacheCombineJsPowerFul" name="wpFastestCacheCombineJsPowerFul"> (footer)
    (footer)
    (footer)
    id="wpFastestCacheGzip" name="wpFastestCacheGzip">
    id="wpFastestCacheLBC" name="wpFastestCacheLBC">
    id="wpFastestCacheDisableEmojis" name="wpFastestCacheDisableEmojis">
    id="wpFastestCacheRenderBlocking" name="wpFastestCacheRenderBlocking">
    id="wpFastestCacheGoogleFonts" name="wpFastestCacheGoogleFonts">
    Lazy Load
    id="wpFastestCacheLazyLoad_exclude_full_size_img" name="wpFastestCacheLazyLoad_exclude_full_size_img"> id="wpFastestCacheLazyLoad" name="wpFastestCacheLazyLoad">
    " >" />
    " >
    Lazy Load
    id="wpFastestCacheDelayJS" name="wpFastestCacheDelayJS">
    Language
    statics(); }else{ ?>
    Show Logs

    12.3Kb / 1 Items

    12.4Kb / 1 Items

    278.2Kb / 9 Items

    338.4Kb / 16 Items

    " class="button-primary">

    getWpContentDir("/cache/all"); ?>
    " class="button-primary">


    getWpContentDir("/cache/all"); ?>
    getWpContentDir("/cache/wpfc-minified"); ?>
    printLogs(); } ?>

    Reverse Proxy Cache

    ">
    Varnish Cache

    Varnish Cache is a web application accelerator also known as a caching HTTP reverse proxy.

    statics(); ?> imageList(); ?>
    • Bronze
      $ 49 .99 /lifetime
      1 License Number of Licenses
      5,000 Image Credits per License
      Support and Updates
      " width="40" height="40" /> One-Time Fee
      " width="40" height="40" /> 1 year license transfer right
      " width="40" height="40" /> 30 Day Money Back Guarantee
    • Silver
      $ 125 .00 /lifetime
      3 Licenses Number of Licenses
      5,000 Image Credits per License
      Support and Updates
      " width="40" height="40" /> One-Time Fee
      " width="40" height="40" /> 1 year license transfer right
      " width="40" height="40" /> 30 Day Money Back Guarantee
    • Gold
      $ 175 .00 /lifetime
      5 Licenses Number of Licenses
      5,000 Image Credits per License
      Support and Updates
      " width="40" height="40" /> One-Time Fee
      " width="40" height="40" /> 1 year license transfer right
      " width="40" height="40" /> 30 Day Money Back Guarantee
    • Platinum
      $ 300 .00 /lifetime
      10 Licenses Number of Licenses
      5,000 Image Credits per License
      Support and Updates
      " width="40" height="40" /> One-Time Fee
      " width="40" height="40" /> 1 year license transfer right
      " width="40" height="40" /> 30 Day Money Back Guarantee

    " />
    CDN by Bunny

    Speed up content with next-generation CDN

    " />
    Other CDN Providers

    You can use any cdn provider.

    " />
    CDN by Cloudflare

    CDN, DNS, DDoS protection and security

    isPluginActive("wp-fastest-cache-premium/wpFastestCachePremium.php")){ ?>
    "all_warnings", "class" => "int-item-left", "icon" => "flaticon-technology", "title" => "ALL", "desc" => "Clean all of them" ], [ "name" => "post_revisions", "class" => "int-item-right", "icon" => "flaticon-draft", "title" => "Post Revisions", "desc" => "Clean all post revisions" ], [ "name" => "trashed_contents", "class" => "int-item-left", "icon" => "flaticon-recycling", "title" => "Trashed Contents", "desc" => "Clean all trashed posts & pages" ], [ "name" => "trashed_spam_comments", "class" => "int-item-right", "icon" => "flaticon-interface", "title" => "Trashed & Spam Comments", "desc" => "Clean all comments from trash & spam" ], [ "name" => "trackback_pingback", "class" => "int-item-left", "icon" => "flaticon-pingback", "title" => "Trackbacks and Pingbacks", "desc" => "Clean all trackbacks and pingbacks" ], [ "name" => "transient_options", "class" => "int-item-right", "icon" => "flaticon-file", "title" => "Transient Options", "desc" => "Clean all transient options" ], [ "name" => "orphaned_post_meta", "class" => "int-item-left", "icon" => "flaticon-xxx", "title" => "Orphaned Post Meta", "desc" => "Clean all orphaned post meta" ], [ "name" => "orphaned_comment_meta", "class" => "int-item-right", "icon" => "flaticon-xxx", "title" => "Orphaned Comment Meta", "desc" => "Clean all orphaned comment meta" ], [ "name" => "orphaned_user_meta", "class" => "int-item-left", "icon" => "flaticon-user", "title" => "Orphaned User Meta", "desc" => "Clean all orphaned user meta" ], [ "name" => "orphaned_term_meta", "class" => "int-item-right", "icon" => "flaticon-tag", "title" => "Orphaned Term Meta", "desc" => "Clean all orphaned term meta" ], [ "name" => "orphaned_term_relationships", "class" => "int-item-left", "icon" => "flaticon-connection", "title" => "Orphaned Term Relationships", "desc" => "Clean all orphaned term relationships" ] ]; foreach ($items as $item) { echo '
    '.$item['title'].' (0)

    '.$item['desc'].'

    '; } ?>
    options->wpFastestCacheStatus)){ if(isset($_SERVER["HTTP_CDN_LOOP"]) && $_SERVER["HTTP_CDN_LOOP"] && $_SERVER["HTTP_CDN_LOOP"] == "cloudflare"){ $cloudflare_integration_exist = false; $cdn_values = get_option("WpFastestCacheCDN"); if($cdn_values){ $std_obj = json_decode($cdn_values); foreach($std_obj as $key => $value){ if($value->id == "cloudflare"){ $cloudflare_integration_exist = true; break; } } } if(!$cloudflare_integration_exist){ include_once(WPFC_MAIN_PATH."templates/cloudflare_warning.html"); } } } ?>
    " data-pin-no-hover="true" style="margin-top: 3px; margin-bottom: 11px;"/>
    Our support is here 24/7 for you.
    Send Us an Email Create Topic
    " data-pin-no-hover="true" style="margin-top: 3px; margin-bottom: 11px;"/>
    Please support us by giving a review.
    Add Your Review
    " alt="İngilizce Kelime Öğren!" data-pin-no-hover="true">
    " data-pin-no-hover="true" />
    Make today the day you say goodbye to slowness.
    " alt="Make today the day you say goodbye to slowness." data-pin-no-hover="true"> Sign Up Now!
    check_htaccess(); } } } } ?>PKL\xu wp-fastest-cache/inc/index.htmlnu[Silence is golden.PKL\AiV~q%q%%wp-fastest-cache/inc/js-utilities.phpnu[html = preg_replace("/\s+/", " ", ((string) $html)); $this->minify = $minify; $this->wpfc = $wpfc; $this->html = $html; $this->setJsLinksExcept(); $this->setJsLinks(); } public function check_exclude($js_url = false){ if($js_url){ foreach((array)$this->wpfc->exclude_rules as $key => $value){ if(isset($value->prefix) && $value->prefix && $value->type == "js"){ if($value->prefix == "contain"){ $preg_match_rule = preg_quote($value->content, "/"); } if(preg_match("/".$preg_match_rule."/i", $js_url)){ return true; } } } } } public function combine_js(){ if(count($this->jsLinks) > 0){ $prev_content = ""; foreach($this->jsLinks as $key => $value){ $script_tag = substr($this->html, $value["start"], ($value["end"] - $value["start"] + 1)); if(!preg_match("/]+json[^>]+>.+/", $script_tag) && !preg_match("/]+text\/template[^>]+>.+/", $script_tag)){ if($href = $this->checkInternal($script_tag)){ if(strpos($this->jsLinksExcept, $href) === false){ if($key == 0 && $this->check_exclude($href)){ continue; } if($key > 0 && $this->check_exclude($href)){ $this->mergeJs($prev_content, $this->jsLinks[$key - 1]); $prev_content = ""; continue; } if(preg_match("/data-no-minify/i", $script_tag) || preg_match("/type\s*=\s*[\"\']\s*module\s*[\"\']/i", $script_tag)){ if($key > 0 && $prev_content){ $this->mergeJs($prev_content, $this->jsLinks[$key - 1]); $prev_content = ""; continue; }else{ continue; } } $minifiedJs = $this->minify($href); if($minifiedJs){ if(!is_dir($minifiedJs["cachFilePath"])){ $this->wpfc->createFolder($minifiedJs["cachFilePath"], $minifiedJs["jsContent"], "js"); } if($jsFiles = @scandir($minifiedJs["cachFilePath"], 1)){ $jsFiles[0] = preg_replace("/\.gz$/", "", $jsFiles[0]); if($jsContent = $this->file_get_contents_curl($minifiedJs["url"]."/".$jsFiles[0]."?v=".time())){ if($key > 0 && preg_match("/^[\"\']use strict[\"\']/i", $jsContent)){ $this->mergeJs($prev_content, $this->jsLinks[$key - 1]); $prev_content = ""; }else{ $prev_content = $jsContent."\n".$prev_content; $script_tag = ""; if(($key + 1) == count($this->jsLinks)){ $this->mergeJs($prev_content, $value, true); $prev_content = ""; }else{ $this->html = substr_replace($this->html, $script_tag, $value["start"], ($value["end"] - $value["start"] + 1)); } } } } }else{ if($key > 0 && $prev_content){ $this->mergeJs($prev_content, $this->jsLinks[$key - 1]); $prev_content = ""; } } }else{ if($key > 0 && $prev_content){ $this->mergeJs($prev_content, $this->jsLinks[$key - 1]); $prev_content = ""; } } }else{ if($key > 0 && $prev_content){ $this->mergeJs($prev_content, $this->jsLinks[$key - 1]); $prev_content = ""; } } }else{ if($key > 0 && $prev_content){ $this->mergeJs($prev_content, $this->jsLinks[$key - 1]); $prev_content = ""; } } } } return $this->html; } public function setJsLinks(){ $data = $this->html; $script_list = array(); $script_start_index = false; for($i = 0; $i < strlen( $data ); $i++) { if(isset($data[$i-6])){ if(substr($data, $i-6, 7) == ""){ array_push($script_list, array("start" => $script_start_index, "end" => $i)); $script_start_index = false; } } } } if(count($script_list) > 0){ $this->jsLinks = array_reverse($script_list); } // to update jsLinksExcept foreach($this->jsLinks as $key => $value){ $script_tag = substr($this->html, $value["start"], ($value["end"] - $value["start"] + 1)); if(preg_match("/wp-spamshield\/js\/jscripts\.php/i", $script_tag)){ $this->jsLinksExcept = $this->jsLinksExcept.$script_tag; } //amazonjs/components/js/jquery-tmpl/jquery.tmpl.min.js?ver=1.0.0pre if(preg_match("/jquery-tmpl\/jquery\.tmpl\.min\.js/i", $script_tag)){ $this->jsLinksExcept = $this->jsLinksExcept.$script_tag; } } } public function setJsLinksExcept(){ $comment_tags = $this->find_tags(""); $document_write = $this->find_tags("document.write(", ")"); foreach ($comment_tags as $key => $value) { if(preg_match("/ if(preg_match("/[\?\=].*".preg_quote($httpHost, "/")."/i", $src[1])){ return false; } return $src[1]; } } } return false; } public function mergeJs($js_content, $value, $last = false){ $name = md5($js_content); $name = base_convert(crc32($name), 20, 36); $cachFilePath = $this->wpfc->getWpContentDir("/cache/wpfc-minified")."/".$name; $jsLink = $this->convert_path_to_link($cachFilePath); if(!is_dir($cachFilePath)){ $this->wpfc->createFolder($cachFilePath, $js_content, "js"); } if(is_dir($cachFilePath)){ if($jsFiles = @scandir($cachFilePath, 1)){ $newLink = ""; $script_tag = substr($this->html, $value["start"], ($value["end"] - $value["start"] + 1)); if($last){ $script_tag = $newLink."\n\n"; }else{ $script_tag = $newLink."\n".$script_tag; } $this->html = substr_replace($this->html, $script_tag, $value["start"], ($value["end"] - $value["start"] + 1)); } } } public function convert_path_to_link($path){ preg_match("/\/cache\/.+/", $path, $out); $prefixLink = str_replace(array("http:", "https:"), "", WPFC_WP_CONTENT_URL); return $prefixLink.$out[0]; } public function file_get_contents_curl($url) { if($data = $this->wpfc->read_file($url)){ return $data; } if(!preg_match("/\.php$/", $url)){ $url = $url."?v=".time(); } if(preg_match("/^\/[^\/]/", $url)){ $url = home_url().$url; } $url = preg_replace("/^\/\//", "http://", $url); $response = wp_remote_get($url, array('timeout' => 10 ) ); if ( !$response || is_wp_error( $response ) ) { return false; }else{ if(wp_remote_retrieve_response_code($response) == 200){ $data = wp_remote_retrieve_body( $response ); if(preg_match("/<\/\s*html\s*>\s*$/i", $data)){ return false; }else{ return $data; } } } } public function find_tags($start_string, $end_string){ $data = $this->html; $list = array(); $start_index = false; $end_index = false; for($i = 0; $i < strlen( $data ); $i++) { if(substr($data, $i, strlen($start_string)) == $start_string){ $start_index = $i; } if($start_index && $i > $start_index){ if(substr($data, $i, strlen($end_string)) == $end_string){ $end_index = $i + strlen($end_string)-1; $text = substr($data, $start_index, ($end_index-$start_index + 1)); array_push($list, array("start" => $start_index, "end" => $end_index, "text" => $text)); $start_index = false; $end_index = false; } } } return $list; } } ?>PKL\5wp-fastest-cache/inc/cache.phpnu[preload_user_agent = true; }else{ $this->preload_user_agent = false; } $this->options = $this->getOptions(); $this->set_cdn(); $this->set_cache_file_path(); $this->set_exclude_rules(); if(isset($this->options->wpFastestCacheDisableEmojis) && $this->options->wpFastestCacheDisableEmojis){ add_action('init', array($this, 'disable_emojis')); } } public function disable_emojis(){ remove_action('wp_head', 'print_emoji_detection_script', 7); remove_action('admin_print_scripts', 'print_emoji_detection_script'); remove_filter('the_content_feed', 'wp_staticize_emoji'); remove_filter('comment_text_rss', 'wp_staticize_emoji'); remove_action('wp_print_styles', 'print_emoji_styles'); remove_action('admin_print_styles', 'print_emoji_styles'); remove_filter('wp_mail', 'wp_staticize_emoji_for_email'); // remove the DNS prefetch add_filter('emoji_svg_url', '__return_false'); } public function detect_current_page_type(){ if(preg_match("/\?/", $_SERVER["REQUEST_URI"])){ return true; } if(preg_match("/^\/wp-json/", $_SERVER["REQUEST_URI"])){ return true; } if(is_front_page()){ echo ""; }else if(is_category()){ echo ""; }else if(is_tag()){ echo ""; }else if(is_singular('post')){ echo ""; }else if(is_page()){ echo ""; }else if(is_attachment()){ echo ""; }else if(is_archive()){ echo ""; } } public function set_exclude_rules(){ if($json_data = get_option("WpFastestCacheExclude")){ $this->exclude_rules = json_decode($json_data); } } public function set_cache_file_path(){ $type = "all"; if($this->isMobile() && isset($this->options->wpFastestCacheMobile)){ if(class_exists("WpFcMobileCache") && isset($this->options->wpFastestCacheMobileTheme)){ $type = "wpfc-mobile-cache"; } } if($this->isPluginActive('gtranslate/gtranslate.php')){ if(isset($_SERVER["HTTP_X_GT_LANG"])){ $this->cacheFilePath = $this->getWpContentDir("/cache/".$type."/").$_SERVER["HTTP_X_GT_LANG"].$_SERVER["REQUEST_URI"]; }else if(isset($_SERVER["REDIRECT_URL"]) && $_SERVER["REDIRECT_URL"] != "/index.php"){ $redirect_url = $_SERVER["REDIRECT_URL"]; if(isset($_SERVER["REDIRECT_QUERY_STRING"]) && defined('WPFC_CACHE_QUERYSTRING') && WPFC_CACHE_QUERYSTRING){ $redirect_url .= "?".$_SERVER["REDIRECT_QUERY_STRING"]; } $this->cacheFilePath = $this->getWpContentDir("/cache/" . $type . "/") . $redirect_url; }else if(isset($_SERVER["REQUEST_URI"])){ $this->cacheFilePath = $this->getWpContentDir("/cache/".$type."/").$_SERVER["REQUEST_URI"]; } }else{ $this->cacheFilePath = $this->getWpContentDir("/cache/".$type."/").$_SERVER["REQUEST_URI"]; // for /?s= $this->cacheFilePath = preg_replace("/(\/\?s\=)/", "$1/", $this->cacheFilePath); } $this->cacheFilePath = $this->cacheFilePath ? rtrim($this->cacheFilePath, "/")."/" : ""; /* /public_html/wp-content/cache/all/sample-page */ $this->cacheFilePath = preg_replace("/\/cache\/(all|wpfc-mobile-cache)\/\//", "/cache/$1/", $this->cacheFilePath); /* /public_html/wp-content/cache/all/DOMAIN.COM/sample-page */ $this->cacheFilePath = preg_replace("/\/cache\/([^\/]+)\/(all|wpfc-mobile-cache)\/\//", "/cache/$1/$2/", $this->cacheFilePath); if(strlen($_SERVER["REQUEST_URI"]) > 1){ // for the sub-pages if(!preg_match("/\.(html|xml)/i", $_SERVER["REQUEST_URI"])){ if($this->is_trailing_slash()){ if(!preg_match("/\/$/", $_SERVER["REQUEST_URI"])){ if(isset($_SERVER["QUERY_STRING"]) && $_SERVER["QUERY_STRING"] && defined('WPFC_CACHE_QUERYSTRING') && WPFC_CACHE_QUERYSTRING){ }else if(preg_match("/y(ad|s)?clid\=/i", $this->cacheFilePath)){ // yclid // yadclid // ysclid }else if(preg_match("/gclid\=/i", $this->cacheFilePath)){ }else if(preg_match("/fbclid\=/i", $this->cacheFilePath)){ }else if(preg_match("/utm_(source|medium|campaign|content|term)/i", $this->cacheFilePath)){ }else if(preg_match("/srsltid\=/i", $this->cacheFilePath)){ }else{ $this->cacheFilePath = false; } } }else{ //toDo } } } $this->remove_url_paramters(); $this->cacheFilePath = trim($this->cacheFilePath); // to decode path if it is not utf-8 if($this->cacheFilePath){ $this->cacheFilePath = urldecode($this->cacheFilePath); } // for security if(preg_match("/\.{2,}/", $this->cacheFilePath)){ $this->cacheFilePath = false; } if(preg_match("/\/{2,}/", $this->cacheFilePath)){ $this->cacheFilePath = false; } if($this->cacheFilePath == "/"){ $this->cacheFilePath = false; } if($this->isMobile()){ if(isset($this->options->wpFastestCacheMobile)){ if(!class_exists("WpFcMobileCache")){ $this->cacheFilePath = false; }else{ if(!isset($this->options->wpFastestCacheMobileTheme)){ $this->cacheFilePath = false; } } } } } public function remove_url_paramters(){ if(isset($_SERVER["QUERY_STRING"]) && $_SERVER["QUERY_STRING"]){ $query_params = explode("&", $_SERVER["QUERY_STRING"]); $action = true; foreach ($query_params as $key => $query_param) { // Google Ads Click & Conversion Parameters if(preg_match("/^(gclid|gbraid|wbraid|gclsrc)\=/i", $query_param)){ continue; } // Google Analytics / GA4 Parameters if(preg_match("/^(_ga|_gid|_gl|_gac)\=/i", $query_param)){ continue; } // Google UTM Campaign Parameters if(preg_match("/^utm_(source|medium|campaign|content|term)/i", $query_param)){ continue; } // Google Merchant Center if(preg_match("/^srsltid\=/i", $query_param)){ continue; } //to remove query strings for cache if Yandex parameters are set if(preg_match("/^y(ad|s)?clid\=/i", $query_param)){ // yclid // yadclid // ysclid continue; } //to remove query strings for cache if facebook parameters are set if(preg_match("/^fbclid\=/i", $query_param)){ continue; } $action = false; } if($action){ if(strlen($_SERVER["REQUEST_URI"]) > 1){ // for the sub-pages $this->cacheFilePath = preg_replace("/\/*\?.+/", "", $this->cacheFilePath); $this->cacheFilePath = $this->cacheFilePath."/"; if(!defined('WPFC_CACHE_QUERYSTRING')){ define('WPFC_CACHE_QUERYSTRING', true); } } } } } public function set_cdn(){ $cdn_values = get_option("WpFastestCacheCDN"); if($cdn_values){ $std_obj = json_decode($cdn_values); $arr = array(); if(is_array($std_obj)){ $arr = $std_obj; }else{ array_push($arr, $std_obj); } foreach ($arr as $key => &$std) { $std->originurl = trim($std->originurl); $std->originurl = trim($std->originurl, "/"); $std->originurl = preg_replace("/http(s?)\:\/\/(www\.)?/i", "", $std->originurl); $std->cdnurl = trim($std->cdnurl); $std->cdnurl = trim($std->cdnurl, "/"); if(!preg_match("/https\:\/\//", $std->cdnurl)){ $std->cdnurl = "//".preg_replace("/http(s?)\:\/\/(www\.)?/i", "", $std->cdnurl); } } $this->cdn = $arr; } } public function checkShortCode($content){ if(preg_match("/\[wpfcNOT\]/", $content)){ if(!is_home() || !is_archive()){ $this->blockCache = true; } $content = str_replace("[wpfcNOT]", "", $content); } return $content; } public function createCache(){ if(isset($this->options->wpFastestCacheStatus)){ // to exclude static pdf files if(preg_match("/\.pdf$/i", $_SERVER["REQUEST_URI"])){ return 0; } // to check logged-in user if(isset($this->options->wpFastestCacheLoggedInUser) && $this->options->wpFastestCacheLoggedInUser == "on"){ foreach ((array)$_COOKIE as $cookie_key => $cookie_value){ if(preg_match("/wordpress_logged_in/i", $cookie_key)){ ob_start(array($this, "cdn_rewrite")); return 0; } } } // to exclude admin users if($this->is_user_admin()){ return 0; } // to check comment author foreach ((array)$_COOKIE as $cookie_key => $cookie_value){ if(preg_match("/comment_author_/i", $cookie_key)){ ob_start(array($this, "cdn_rewrite")); return 0; } } if(isset($_COOKIE) && isset($_COOKIE['safirmobilswitcher'])){ ob_start(array($this, "cdn_rewrite")); return 0; } if(isset($_COOKIE) && isset($_COOKIE["wptouch-pro-view"])){ if($this->is_wptouch_smartphone()){ if($_COOKIE["wptouch-pro-view"] == "desktop"){ ob_start(array($this, "cdn_rewrite")); return 0; } } } if(preg_match("/\?/", $_SERVER["REQUEST_URI"]) && !preg_match("/\/\?fdx\_switcher\=true/", $_SERVER["REQUEST_URI"])){ // for WP Mobile Edition if(preg_match("/\?amp(\=1)?/i", $_SERVER["REQUEST_URI"])){ // }else if(defined('WPFC_CACHE_QUERYSTRING') && WPFC_CACHE_QUERYSTRING){ // }else if(isset($_GET["wc-api"]) && $_GET["wc-api"]){ // }else{ ob_start(array($this, "cdn_rewrite")); return 0; } } if(preg_match("/(".$this->get_excluded_useragent().")/", $_SERVER['HTTP_USER_AGENT'])){ return 0; } if(isset($_SERVER['REQUEST_URI']) && preg_match("/(\/){2}$/", $_SERVER['REQUEST_URI'])){ return 0; } // to check permalink if it does not end with slash if(isset($_SERVER['REQUEST_URI']) && preg_match("/[^\/]+\/$/", $_SERVER['REQUEST_URI'])){ if(!preg_match("/\/$/", get_option('permalink_structure'))){ return 0; } } if(isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == "POST"){ return 0; } if(preg_match("/^https/i", get_option("home")) && !is_ssl()){ //Must be secure connection return 0; } if(!preg_match("/^https/i", get_option("home")) && is_ssl()){ //must be normal connection if(!$this->isPluginActive('really-simple-ssl/rlrsssl-really-simple-ssl.php')){ if(!$this->isPluginActive('really-simple-ssl-pro/really-simple-ssl-pro.php')){ if(!$this->isPluginActive('really-simple-ssl-on-specific-pages/really-simple-ssl-on-specific-pages.php')){ if(!$this->isPluginActive('ssl-insecure-content-fixer/ssl-insecure-content-fixer.php')){ if(!$this->isPluginActive('https-redirection/https-redirection.php')){ if(!$this->isPluginActive('better-wp-security/better-wp-security.php')){ return 0; } } } } } } } if(isset($_SERVER["DOCUMENT_ROOT"]) && preg_match("/bitnami/", $_SERVER["DOCUMENT_ROOT"])){ // to disable cache for the IP based urls on the bitnami servers // /opt/bitnami/apps/wordpress/htdocs if(preg_match("/(?:[0-9]{1,3}\.){3}[0-9]{1,3}/", get_option("home"))){ return 0; } } if(preg_match("/www\./i", get_option("home")) && !preg_match("/www\./i", $_SERVER['HTTP_HOST'])){ return 0; } if(!preg_match("/www\./i", get_option("home")) && preg_match("/www\./i", $_SERVER['HTTP_HOST'])){ return 0; } if($this->exclude_page()){ ob_start(array($this, "cdn_rewrite")); //echo ""."\n"; return 0; } // http://mobiledetect.net/ does not contain the following user-agents if(preg_match("/Nokia309|Casper_VIA/i", $_SERVER['HTTP_USER_AGENT'])){ return 0; } if(preg_match("/Empty\sUser\sAgent/i", $_SERVER['HTTP_USER_AGENT'])){ // not to show the cache for command line return 0; } //to show cache version via php if htaccess rewrite rule does not work if(!$this->preload_user_agent && $this->cacheFilePath && (@file_exists($this->cacheFilePath."index.html") || @file_exists($this->cacheFilePath."index.json") || @file_exists($this->cacheFilePath."index.xml"))){ $via_php = ""; if(@file_exists($this->cacheFilePath."index.json")){ $file_extension = "json"; header('Content-type: application/json'); }else if(@file_exists($this->cacheFilePath."index.xml")){ $file_extension = "xml"; header('Content-type: text/xml'); }else{ $file_extension = "html"; $via_php = ""; } if($content = @file_get_contents($this->cacheFilePath."index.".$file_extension)){ if($file_extension == "html"){ header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($this->cacheFilePath."index.".$file_extension)).' GMT', true, 200); } if(defined('WPFC_REMOVE_VIA_FOOTER_COMMENT') && WPFC_REMOVE_VIA_FOOTER_COMMENT){ $via_php = ""; } $content = $content.$via_php; die($content); } }else{ if($this->isMobile()){ if(class_exists("WpFcMobileCache") && isset($this->options->wpFastestCacheMobileTheme)){ if(isset($this->options->wpFastestCacheMobileTheme_themename) && $this->options->wpFastestCacheMobileTheme_themename){ $create_cache = true; }else if($this->isPluginActive('wptouch/wptouch.php') || $this->isPluginActive('wptouch-pro/wptouch-pro.php')){ //to check that user-agent exists in wp-touch's list or not if($this->is_wptouch_smartphone()){ $create_cache = true; }else{ $create_cache = false; } }else{ if((preg_match('/iPhone/', $_SERVER['HTTP_USER_AGENT']) && preg_match('/Mobile/', $_SERVER['HTTP_USER_AGENT'])) || (preg_match('/Android/', $_SERVER['HTTP_USER_AGENT']) && preg_match('/Mobile/', $_SERVER['HTTP_USER_AGENT']))){ $create_cache = true; }else{ $create_cache = false; } } }else if(!isset($this->options->wpFastestCacheMobile) && !isset($this->options->wpFastestCacheMobileTheme)){ $create_cache = true; }else{ $create_cache = false; } }else{ $create_cache = true; } if($create_cache){ $this->startTime = microtime(true); add_action('wp', array($this, "detect_current_page_type")); add_action('get_footer', array($this, "detect_current_page_type")); add_action('get_footer', array($this, "wp_print_scripts_action")); // to exclude current page hook add_action("wpfc_exclude_current_page", array($this, 'exclude_current_page'), 10, 0); ob_start(array($this, "callback")); } } } } public function is_user_admin(){ global $wpdb; foreach ((array)$_COOKIE as $cookie_key => $cookie_value){ if(preg_match("/wordpress_logged_in/i", $cookie_key)){ $username = preg_replace("/^([^\|]+)\|.+/", "$1", $cookie_value); break; } } if(isset($username) && $username){ $username = esc_sql($username); $res = $wpdb->get_var("SELECT `$wpdb->users`.`ID`, `$wpdb->users`.`user_login`, `$wpdb->usermeta`.`meta_key`, `$wpdb->usermeta`.`meta_value` FROM `$wpdb->users` INNER JOIN `$wpdb->usermeta` ON `$wpdb->users`.`user_login` = \"$username\" AND `$wpdb->usermeta`.`meta_key` LIKE \"%_user_level\" AND `$wpdb->usermeta`.`meta_value` = \"10\" AND `$wpdb->users`.`ID` = `$wpdb->usermeta`.user_id ;" ); return $res; } return false; } public function exclude_current_page($some = true){ $via = debug_backtrace(); if(isset($via) && is_array($via)){ foreach ($via as $key => $value){ if($value["function"] == "wpfc_exclude_current_page"){ if(defined('WPFC_DEBUG') && (WPFC_DEBUG === true)){ if(preg_match("/wp-content\/themes/", $value["file"])){ $this->exclude_current_page_text = ""; }else if(preg_match("/wp-content\/plugins/", $value["file"])){ $this->exclude_current_page_text = ""; } }else{ $this->exclude_current_page_text = ""; } break; } } } } public function wp_print_scripts_action(){ echo ""; } public function ignored($buffer){ $list = array( "\/wp\-comments\-post\.php", "\/wp\-login\.php", "\/robots\.txt", "\/wp\-cron\.php", "\/wp\-content", "\/wp\-admin", "\/wp\-includes", "\/index\.php", "\/xmlrpc\.php", "\/wp\-api\/", "leaflet\-geojson\.php", "\/clientarea\.php" ); if($this->isPluginActive('woocommerce/woocommerce.php')){ if($this->current_page_type != "homepage"){ global $post; if(isset($post->ID) && $post->ID){ if(function_exists("wc_get_page_id")){ $woocommerce_ids = array(); //wc_get_page_id('product') //wc_get_page_id('product-category') array_push($woocommerce_ids, wc_get_page_id('cart'), wc_get_page_id('checkout'), wc_get_page_id('receipt'), wc_get_page_id('confirmation'), wc_get_page_id('myaccount')); if (in_array($post->ID, $woocommerce_ids)) { return true; } } } //"\/product" //"\/product-category" array_push($list, "\/cart\/?$", "\/checkout", "\/receipt", "\/confirmation", "\/wc-api\/"); } } if($this->isPluginActive('wp-easycart/wpeasycart.php')){ array_push($list, "\/cart"); } if($this->isPluginActive('easy-digital-downloads/easy-digital-downloads.php')){ array_push($list, "\/cart", "\/checkout"); } if(preg_match("/".implode("|", $list)."/i", $_SERVER["REQUEST_URI"])){ return true; } return false; } public function exclude_page($buffer = false){ $preg_match_rule = ""; //$request_url = urldecode(trim($_SERVER["REQUEST_URI"], "/")); $request_url = urldecode($_SERVER["REQUEST_URI"]); if($this->exclude_rules){ foreach((array)$this->exclude_rules as $key => $value){ $value->type = isset($value->type) ? $value->type : "page"; if($value->prefix == "yandexclickid"){ if(preg_match("/y(ad|s)?clid\=/i", $request_url)){ // yclid // yadclid // ysclid return true; } }else if($value->prefix == "googleanalytics"){ if(preg_match("/utm_(source|medium|campaign|content|term)/i", $request_url)){ return true; } }else if(isset($value->prefix) && $value->prefix && ($value->type == "page")){ $value->content = trim($value->content); //$value->content = trim($value->content, "/"); if($buffer && preg_match("/^(homepage|category|tag|post|page|archive|attachment)$/", $value->prefix)){ if(preg_match('/<\!--WPFC_PAGE_TYPE_'.$value->prefix.'-->/i', $buffer)){ return true; } }else if($value->prefix == "exact"){ $request_url = trim($request_url, "/"); $value->content = trim($value->content, "/"); if(strtolower($value->content) == strtolower($request_url)){ return true; } }else if($value->prefix == "regex"){ if(preg_match("/".$value->content."/i", $request_url)){ return true; } }else{ if($value->prefix == "startwith"){ $request_url = ltrim($request_url, "/"); $value->content = ltrim($value->content, "/"); $preg_match_rule = "^".preg_quote($value->content, "/"); }else if($value->prefix == "contain"){ $preg_match_rule = preg_quote($value->content, "/"); } if($preg_match_rule){ if(preg_match("/".$preg_match_rule."/i", $request_url)){ return true; } } } }else if($value->type == "useragent"){ if(preg_match("/".preg_quote($value->content, "/")."/i", $_SERVER['HTTP_USER_AGENT'])){ return true; } }else if($value->type == "cookie"){ if(isset($_SERVER['HTTP_COOKIE'])){ if(preg_match("/".preg_quote($value->content, "/")."/i", $_SERVER['HTTP_COOKIE'])){ return true; } } } } } return false; } public function is_json(){ return $this->current_page_content_type == "json" ? true : false; // if(isset($_SERVER["HTTP_ACCEPT"]) && preg_match("/json/i", $_SERVER["HTTP_ACCEPT"])){ // return true; // } // if(preg_match("/^\/wp-json/", $_SERVER["REQUEST_URI"])){ // return true; // } // if(preg_match("/^\s*\{\s*[\"\']/i", $buffer)){ // return true; // } // if(preg_match("/^\s*\[\s*\{\s*[\"\']/i", $buffer)){ // return true; // } // return false; } public function is_xml(){ return $this->current_page_content_type == "xml" ? true : false; // if(preg_match("/^\s*\<\?xml/i", $buffer)){ // return true; // } // return false; } public function is_html(){ return $this->current_page_content_type == "html" ? true : false; } public function set_current_page_type($buffer){ preg_match('/<\!--WPFC_PAGE_TYPE_([a-z]+)-->/i', $buffer, $out); $this->current_page_type = isset($out[1]) ? $out[1] : false; } public function set_current_page_content_type($buffer){ $content_type = false; if(function_exists("headers_list")){ $headers = headers_list(); foreach($headers as $header){ if(preg_match("/Content-Type\:/i", $header)){ $content_type = preg_replace("/Content-Type\:\s(.+)/i", "$1", $header); } } } if(preg_match("/xml/i", $content_type)){ $this->current_page_content_type = "xml"; }else if(preg_match("/json/i", $content_type)){ $this->current_page_content_type = "json"; }else{ $this->current_page_content_type = "html"; } } public function last_error($buffer = false){ if(function_exists("http_response_code") && (http_response_code() === 404)){ return true; } if(is_404()){ return true; } //to exclude "There has been a critical error on this website" page if(preg_match("/\s*/i", $buffer)){ return true; } } public function callback($buffer){ $this->set_current_page_type($buffer); $this->set_current_page_content_type($buffer); $buffer = $this->checkShortCode($buffer); // for Wordfence: not to cache 503 pages if(defined('DONOTCACHEPAGE') && $this->isPluginActive('wordfence/wordfence.php')){ if(function_exists("http_response_code") && http_response_code() == 503){ return $buffer.""; } } // Prevent caching of 403 Forbidden error pages. // This is particularly important for compatibility with the following security plugins: // 1. iThemes Security // 2. Defender Security if(defined('DONOTCACHEPAGE')){ if(function_exists("http_response_code") && http_response_code() == 403){ return $buffer.""; } } // for Divi Theme if(defined('DONOTCACHEPAGE') && (get_template() == "Divi")){ if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'){ // /?wc-ajax=dgwt_wcas_ajax_search&s=keyword&l=en return $buffer; } return $buffer.""; } if($this->exclude_page($buffer)){ $buffer = preg_replace('/<\!--WPFC_PAGE_TYPE_[a-z]+-->/i', '', $buffer); $buffer = $this->cdn_rewrite($buffer); return $buffer; } $buffer = preg_replace('/<\!--WPFC_PAGE_TYPE_[a-z]+-->/i', '', $buffer); if($this->is_html()){ $tmp_buffer = (string) apply_filters('wpfc_buffer_callback_filter', $buffer, "html", $this->cacheFilePath); if(!$tmp_buffer){ return $buffer; }else{ $buffer = $tmp_buffer; } } if($this->exclude_current_page_text){ return $buffer.$this->exclude_current_page_text; }else if($this->is_json() && (!defined('WPFC_CACHE_JSON') || (defined('WPFC_CACHE_JSON') && WPFC_CACHE_JSON !== true))){ return $buffer; }else if(preg_match("/Mediapartners-Google|Google\sWireless\sTranscoder/i", $_SERVER['HTTP_USER_AGENT'])){ return $buffer; }else if (is_user_logged_in() || $this->isCommenter()){ return $buffer; }else if($this->isPasswordProtected($buffer)){ return $buffer.""; }else if($this->isWpLogin($buffer)){ return $buffer.""; }else if($this->hasContactForm7WithCaptcha($buffer)){ return $buffer.""; }else if($this->last_error($buffer)){ return $buffer; }else if($this->ignored($buffer)){ return $buffer; }else if($this->blockCache === true){ return $buffer.""; }else if(isset($_GET["preview"])){ return $buffer.""; }else if($this->checkHtml($buffer)){ if(preg_match("/^.*$/s", $buffer)){ // Check if the buffer has only one line (no line breaks) return $buffer; }else{ return $buffer.""; } }else if((function_exists("http_response_code")) && (http_response_code() == 301 || http_response_code() == 302)){ return $buffer; }else if(!$this->cacheFilePath){ return $buffer.""; }else{ $content = $buffer; if(isset($this->options->wpFastestCacheDelayJS) && method_exists("WpFastestCachePowerfulHtml", "render_blocking")){ if(file_exists(WPFC_WP_PLUGIN_DIR."/wp-fastest-cache-premium/pro/library/delay-js.php")){ if(!$this->is_amp($content)){ include_once WPFC_WP_PLUGIN_DIR."/wp-fastest-cache-premium/pro/library/delay-js.php"; $delay = new WpFastestCacheDelayJS($content); $content = $delay->action(); } } } if(isset($this->options->wpFastestCacheRenderBlocking) && method_exists("WpFastestCachePowerfulHtml", "render_blocking")){ if(class_exists("WpFastestCachePowerfulHtml")){ if(!$this->is_amp($content)){ $powerful_html = new WpFastestCachePowerfulHtml(); if(isset($this->options->wpFastestCacheRenderBlockingCss)){ $content = $powerful_html->render_blocking($content, true); }else{ $content = $powerful_html->render_blocking($content); } } } } if(isset($this->options->wpFastestCacheCombineCss)){ require_once "css-utilities.php"; $css = new CssUtilities($this, $content); $content = $css->combineCss(); unset($css); }else if(isset($this->options->wpFastestCacheMinifyCss)){ require_once "css-utilities.php"; $css = new CssUtilities($this, $content); $content = $css->minifyCss(); unset($css); } if(isset($this->options->wpFastestCacheCombineJs) || isset($this->options->wpFastestCacheMinifyJs) || isset($this->options->wpFastestCacheCombineJsPowerFul)){ require_once "js-utilities.php"; } if(isset($this->options->wpFastestCacheCombineJs)){ $head_new = $this->get_header($content); if($head_new){ if(isset($this->options->wpFastestCacheMinifyJs) && $this->options->wpFastestCacheMinifyJs){ $js = new JsUtilities($this, $head_new, true); }else{ $js = new JsUtilities($this, $head_new); } $tmp_head = $js->combine_js(); $content = str_replace($head_new, $tmp_head, $content); unset($r); unset($js); unset($tmp_head); unset($head_new); } } if(class_exists("WpFastestCachePowerfulHtml")){ if(!isset($powerful_html)){ $powerful_html = new WpFastestCachePowerfulHtml(); } $powerful_html->set_html($content); if(isset($this->options->wpFastestCacheCombineJsPowerFul) && method_exists("WpFastestCachePowerfulHtml", "combine_js_in_footer")){ if(isset($this->options->wpFastestCacheMinifyJs) && $this->options->wpFastestCacheMinifyJs){ $content = $powerful_html->combine_js_in_footer($this, true); }else{ $content = $powerful_html->combine_js_in_footer($this); } } if(isset($this->options->wpFastestCacheRemoveComments)){ $content = $powerful_html->remove_head_comments(); } if(isset($this->options->wpFastestCacheMinifyHtmlPowerFul)){ $content = $powerful_html->minify_html(); } if(isset($this->options->wpFastestCacheMinifyJs) && method_exists("WpFastestCachePowerfulHtml", "minify_js_in_body")){ $content = $powerful_html->minify_js_in_body($this, $this->exclude_rules); } } if($this->err){ return $buffer.""; }else{ $content = $this->cacheDate($content); $content = $this->minify($content); $content = str_replace("", "", $content); if(isset($this->options->wpFastestCacheLazyLoad) && class_exists("WpFastestCachePowerfulHtml")){ $execute_lazy_load = true; // to disable Lazy Load if the page is amp if($this->is_amp($content)){ $execute_lazy_load = false; } // to disable for Ajax Load More on the pages if($this->isPluginActive('ajax-load-more/ajax-load-more.php') && preg_match("/\/page\/\d+\//", $_SERVER["REQUEST_URI"])){ $execute_lazy_load = false; } if($execute_lazy_load){ if(!class_exists("WpFastestCacheLazyLoad")){ include_once $this->get_premium_path("lazy-load.php"); } $content = $powerful_html->lazy_load($content); if(method_exists("WpFastestCacheLazyLoad",'get_js_source_new')){ $lazy_load_js = WpFastestCacheLazyLoad::get_js_source_new(); }else if(method_exists("WpFastestCacheLazyLoad",'get_js_source')){ $lazy_load_js = WpFastestCacheLazyLoad::get_js_source(); } $content = preg_replace("/\s*<\/head\s*>/i", $lazy_load_js."", $content, 1); } } $content = $this->cdn_rewrite($content); $content = $this->fix_pre_tag($content, $buffer); if(preg_match("/]+href\s*\=\s*[\'\"][^\"\']+\.\.[\"\'][^\>]+>/", $content)){ /* to check that resources have been successfully optimized */ return $buffer.""; } if($this->cacheFilePath){ if($this->is_html()){ $tmp_content = (string) apply_filters('wpfc_buffer_callback_filter', $content, "cache", $this->cacheFilePath); if(!$tmp_content){ return $content; }else{ $content = $tmp_content; } $this->createFolder($this->cacheFilePath, $content); do_action('wpfc_is_cacheable_action'); }else if($this->is_xml()){ if(preg_match("/<\/link>/", $buffer)){ if(preg_match("/\/feed$/", $_SERVER["REQUEST_URI"])){ return $buffer.time(); } } $this->createFolder($this->cacheFilePath, $buffer, "xml"); do_action('wpfc_is_cacheable_action'); return $buffer; }else if($this->is_json()){ $this->createFolder($this->cacheFilePath, $buffer, "json"); do_action('wpfc_is_cacheable_action'); return $buffer; } } return $content.""; } } } public function find_tags($data, $start_string, $end_string){ $list = array(); $start_index = false; $end_index = false; for($i = 0; $i < strlen( $data ); $i++) { if(substr($data, $i, strlen($start_string)) == $start_string){ $start_index = $i; } if($start_index && $i > $start_index){ if(substr($data, $i, strlen($end_string)) == $end_string){ $end_index = $i + strlen($end_string)-1; $text = substr($data, $start_index, ($end_index-$start_index + 1)); array_push($list, array("start" => $start_index, "end" => $end_index, "text" => $text)); $start_index = false; $end_index = false; } } } return $list; } public function fix_pre_tag($content, $buffer){ // Check if buffer contains any
     tag
    		    if(!preg_match("/]*>/i", $buffer)){
    		        return $content;
    		    }
    
    		    // Extract 
     blocks from buffer
    		    $pre_buffer = $this->find_tags($buffer, "");
    
    		    // Extract 
     blocks from content
    		    $pre_content = $this->find_tags($content, "");
    
    		    // If either side has no 
     blocks, do nothing
    		    if(empty($pre_buffer) || empty($pre_content)){
    		        return $content;
    		    }
    
    		    // Reverse the order to avoid index shifting during replacement
    		    $pre_content = array_reverse($pre_content, true);
    
    		    foreach ($pre_content as $key => $value){
    		        if(isset($pre_buffer[$key])){
    
    		            // New 
     block that will replace the old one
    		            $replace_text = $pre_buffer[$key]["text"];
    
    		            // Replace the original 
     block in the content with the buffer's block
    		            $content = substr_replace(
    		                $content,
    		                $replace_text,
    		                $value["start"],
    		                ($value["end"] - $value["start"] + 1)
    		            );
    		        }
    		    }
    
    		    return $content;
    		}
    
    
    
    		public function cdn_rewrite($content){
    			if($this->cdn){
    				$content = preg_replace_callback("/(srcset|src|href|data-vc-parallax-image|data-bg|data-bg-webp|data-fullurl|data-mobileurl|data-img-url|data-cvpsrc|data-cvpset|data-thumb|data-bg-url|data-large_image|data-lazyload|data-lazy|data-source-url|data-srcsmall|data-srclarge|data-srcfull|data-slide-img|data-lazy-original)\s{0,2}\=\s{0,2}[\'\"]([^\'\"]+)[\'\"]/i", array($this, 'cdn_replace_urls'), $content);
    
    				//url()
    				$content = preg_replace_callback("/(url)\(([^\)\>]+)\)/i", array($this, 'cdn_replace_urls'), $content);
    
    				//{"concatemoji":"http:\/\/your_url.com\/wp-includes\/js\/wp-emoji-release.min.js?ver=4.7"}
    				$content = preg_replace_callback("/\{\"concatemoji\"\:\"[^\"]+\"\}/i", array($this, 'cdn_replace_urls'), $content);
    				
    				//
    				$content = preg_replace_callback("/[\"\']([^\'\"]+)[\"\']\s*\:\s*[\"\']https?\:\\\\\/\\\\\/[^\"\']+[\"\']/i", array($this, 'cdn_replace_urls'), $content);
    
    				// 
    				$content = preg_replace_callback("/(jsFileLocation)\s*\:[\"\']([^\"\']+)[\"\']/i", array($this, 'cdn_replace_urls'), $content);
    
    				// 
    //
    $content = preg_replace_callback("/(data-product_variations|data-siteorigin-parallax)\=[\"\'][^\"\']+[\"\']/i", array($this, 'cdn_replace_urls'), $content); // $content = preg_replace_callback("/]+(data)\s{0,2}\=[\'\"]([^\'\"]+)[\'\"][^\>]+>/i", array($this, 'cdn_replace_urls'), $content); } return $content; } public function get_header($content){ $head_first_index = strpos($content, ""); return substr($content, $head_first_index, ($head_last_index-$head_first_index + 1)); } public function minify($content){ $content = preg_replace("/<\/html>\s+/", "", $content); $content = str_replace("\r", "", $content); return isset($this->options->wpFastestCacheMinifyHtml) ? preg_replace("/^\s+/m", "", ((string) $content)) : $content; } public function checkHtml($buffer){ if(!$this->is_html()){ return false; } if(preg_match('/<\s*html[^\>]*>/si', $buffer) && preg_match('/<\s*body[^\>]*>/si', $buffer) && preg_match('/<\/body\s*>/si', $buffer)){ return false; } // if(strlen($buffer) > 10){ // return false; // } return true; } public function cacheDate($buffer){ $prefix = ($this->isMobile() && class_exists("WpFcMobileCache") && isset($this->options->wpFastestCacheMobile) && isset($this->options->wpFastestCacheMobileTheme)) ? "Mobile: " : ""; $comment = ""; if(apply_filters( 'wpfc_remove_footer_comment', false )){ $comment = ""; } if(defined('WPFC_REMOVE_FOOTER_COMMENT') && WPFC_REMOVE_FOOTER_COMMENT){ $comment = ""; } return $buffer.$comment; } public function creationTime(){ $time = microtime(true) - $this->startTime; $time = number_format($time, 3); return $time; } public function isCommenter(){ $commenter = wp_get_current_commenter(); return isset($commenter["comment_author_email"]) && $commenter["comment_author_email"] ? true : false; } public function isPasswordProtected($buffer){ if(preg_match("/action\=[\'\"].+postpass.*[\'\"]/", $buffer)){ return true; } foreach($_COOKIE as $key => $value){ if(preg_match("/wp\-postpass\_/", $key)){ return true; } } return false; } public function create_name($list){ $arr = is_array($list) ? $list : array(array("href" => $list)); $name = ""; foreach ($arr as $tag_key => $tag_value){ $tmp = preg_replace("/(\.css|\.js)\?.*/", "$1", $tag_value["href"]); //to remove version number $name = $name.$tmp; } return base_convert(crc32($name), 20, 36); } public function createFolder($cachFilePath, $buffer, $extension = "html", $prefix = false){ $create = false; $file_name = "index."; $update_db_statistic = true; if($buffer && strlen($buffer) > 100 && preg_match("/html|xml|json/i", $extension)){ if(!preg_match("/^\<\!\-\-\sMobile\:\sWP\sFastest\sCache/i", $buffer)){ if(!preg_match("/^\<\!\-\-\sWP\sFastest\sCache/i", $buffer)){ $create = true; } } if($this->preload_user_agent){ if(file_exists($cachFilePath."/"."index.".$extension)){ $update_db_statistic = false; @unlink($cachFilePath."/"."index.".$extension); } } } if(($extension == "svg" || $extension == "woff" || $extension == "css" || $extension == "js") && $buffer && strlen($buffer) > 5){ $create = true; $file_name = base_convert(substr(time(), -6), 20, 36)."."; $buffer = trim($buffer); if($extension == "js"){ if(substr($buffer, -1) != ";"){ $buffer .= ";"; } } } if (is_user_logged_in() || $this->isCommenter()){ $create = false; } if($create){ if(!is_dir($cachFilePath)){ if(is_writable($this->getWpContentDir()) || ((is_dir($this->getWpContentDir("/cache"))) && (is_writable($this->getWpContentDir("/cache"))))){ if (@mkdir($cachFilePath, 0755, true)){ if($extension == "html"){ if(!file_exists($this->getWpContentDir("/cache/index.html"))){ @file_put_contents($this->getWpContentDir("/cache/index.html"), ""); } }else{ if(!file_exists($this->getWpContentDir("/cache/wpfc-minified/index.html"))){ if(!is_dir($this->getWpContentDir("/cache/wpfc-minified/"))){ @mkdir($this->getWpContentDir("/cache/wpfc-minified/"), 0755, true); } if(is_dir($this->getWpContentDir("/cache/wpfc-minified/"))){ @file_put_contents($this->getWpContentDir("/cache/wpfc-minified/index.html"), ""); } } } } } } if(is_dir($cachFilePath)){ if(!file_exists($cachFilePath."/".$file_name.$extension)){ if($extension != "html"){ $buffer = (string) apply_filters('wpfc_buffer_callback_filter', $buffer, $extension, $cachFilePath); } file_put_contents($cachFilePath."/".$file_name.$extension, $buffer); if(class_exists("WpFastestCacheStatics")){ if($update_db_statistic && !preg_match("/After\sCache\sTimeout/i", $_SERVER['HTTP_USER_AGENT'])){ if(preg_match("/wpfc\-mobile\-cache/", $cachFilePath)){ $extension = "mobile"; } $cache_statics = new WpFastestCacheStatics($extension, strlen($buffer)); $cache_statics->update_db(); } } } } }elseif($extension == "html"){ $this->err = "Buffer is empty so the cache cannot be created"; } } public function is_amp($content){ global $redux_builder_amp; $action = false; $request_uri = trim($_SERVER["REQUEST_URI"], "/"); if(preg_match("/^amp/", $request_uri)){ $action = true; } if(preg_match("/amp$/", $request_uri)){ $action = true; } if(preg_match("/\/amp\//", $request_uri)){ $action = true; } if(preg_match("/\?amp\=1$/", $request_uri)){ $action = true; } if(preg_match("/web-stories\//", $request_uri)){ // https://wordpress.org/plugins/web-stories/ $action = true; } if(isset($redux_builder_amp) && isset($redux_builder_amp['ampforwp-amp-takeover']) && ($redux_builder_amp['ampforwp-amp-takeover'] == true)){ $action = true; } if($action){ if(preg_match("/]+amp[^\>]*>/i", $content)){ return true; } if(preg_match("/]+\⚡[^\>]*>/i", $content)){ return true; } } return false; } public function isMobile(){ foreach ($this->get_mobile_browsers() as $value) { if(preg_match("/".$value."/i", $_SERVER['HTTP_USER_AGENT'])){ return true; } } foreach ($this->get_operating_systems() as $key => $value) { if(preg_match("/".$value."/i", $_SERVER['HTTP_USER_AGENT'])){ return true; } } if(isset($_SERVER['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER']) && "true" === $_SERVER['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER']){ $is_mobile = true; } if(isset($_SERVER['HTTP_CLOUDFRONT_IS_TABLET_VIEWER']) && "true" === $_SERVER['HTTP_CLOUDFRONT_IS_TABLET_VIEWER']){ $is_mobile = true; } } public function isWpLogin($buffer){ // if(preg_match("/]+loginform[^\>]+>((?:(?!<\/form).)+)user_login((?:(?!<\/form).)+)user_pass((?:(?!<\/form).)+)<\/form>/si", $buffer)){ // return true; // } if($GLOBALS["pagenow"] == "wp-login.php"){ return true; } return false; } public function hasContactForm7WithCaptcha($buffer){ if(is_single() || is_page()){ if(preg_match("/]+_wpcf7_captcha[^\>]+>/i", $buffer)){ return true; } } return false; } public function is_wptouch_smartphone(){ // https://plugins.svn.wordpress.org/wptouch/tags/4.0.4/core/mobile-user-agents.php // wptouch: ipad is accepted as a desktop so no need to create cache if user agent is ipad // https://wordpress.org/support/topic/plugin-wptouch-wptouch-wont-display-mobile-version-on-ipad?replies=12 if(preg_match("/ipad/i", $_SERVER['HTTP_USER_AGENT'])){ return false; } $wptouch_smartphone_list = array(); $wptouch_smartphone_list[] = array( 'iPhone' ); // iPhone $wptouch_smartphone_list[] = array( 'Android', 'Mobile' ); // Android devices $wptouch_smartphone_list[] = array( 'BB', 'Mobile Safari' ); // BB10 devices $wptouch_smartphone_list[] = array( 'BlackBerry', 'Mobile Safari' ); // BB 6, 7 devices $wptouch_smartphone_list[] = array( 'Firefox', 'Mobile' ); // Firefox OS devices $wptouch_smartphone_list[] = array( 'IEMobile/11', 'Touch' ); // Windows IE 11 touch devices $wptouch_smartphone_list[] = array( 'IEMobile/10', 'Touch' ); // Windows IE 10 touch devices $wptouch_smartphone_list[] = array( 'IEMobile/9.0' ); // Windows Phone OS 9 $wptouch_smartphone_list[] = array( 'IEMobile/8.0' ); // Windows Phone OS 8 $wptouch_smartphone_list[] = array( 'IEMobile/7.0' ); // Windows Phone OS 7 $wptouch_smartphone_list[] = array( 'OPiOS', 'Mobile' ); // Opera Mini iOS $wptouch_smartphone_list[] = array( 'Coast', 'Mobile' ); // Opera Coast iOS foreach ($wptouch_smartphone_list as $key => $value) { if(isset($value[0]) && isset($value[1])){ if(preg_match("/".preg_quote($value[0], "/")."/i", $_SERVER['HTTP_USER_AGENT'])){ if(preg_match("/".preg_quote($value[1], "/")."/i", $_SERVER['HTTP_USER_AGENT'])){ return true; } } }else if(isset($value[0])){ if(preg_match("/".preg_quote($value[0], "/")."/i", $_SERVER['HTTP_USER_AGENT'])){ return true; } } } return false; } } ?>PKL\Cm,i,i wp-fastest-cache/inc/preload.phpnu[ $s_value) { $s_value = esc_url($s_value); array_push($sitemap_arr, array("url" => $s_value, "pointer" => 0)); } $preload_arr["sitemaps"] = $sitemap_arr; }else{ foreach ($_POST as $key => $value) { $key = esc_attr($key); $value = esc_attr($value); preg_match("/wpFastestCachePreload_(.+)/", $key, $type); if(!empty($type)){ if($type[1] == "restart" || $type[1] == "sitemap"){ //to need to remove "restart" value }else if($type[1] == "number"){ $preload_arr[$type[1]] = $value; }else{ $preload_arr[$type[1]] = 0; } } } } } if($data = get_option("WpFastestCachePreLoad")){ $preload_std = json_decode($data); if(empty($preload_arr)){ // clear cache process if(isset($preload_std->sitemaps) && !empty($preload_std->sitemaps)){ foreach ($preload_std->sitemaps as $s_key => $s_value) { $s_value->pointer = 0; } }else{ foreach ($preload_std as $key => &$value) { if($key != "number"){ $value = 0; } } } }else{ // save settings process if(isset($preload_arr["sitemaps"])){ if(isset($preload_std->sitemaps) && !empty($preload_std->sitemaps)){ for ($i=0; $i < count($preload_arr["sitemaps"]) ; $i++) { for ($j=0; $j < count($preload_std->sitemaps); $j++) { if($preload_arr["sitemaps"][$i]["url"] == $preload_std->sitemaps[$j]->url){ if(isset($preload_std->sitemaps[$j]->pointer)){ $preload_arr["sitemaps"][$i]["pointer"] = $preload_std->sitemaps[$j]->pointer; } if(isset($preload_std->sitemaps[$j]->total)){ $preload_arr["sitemaps"][$i]["total"] = $preload_std->sitemaps[$j]->total; } } } } $preload_std = $preload_arr; }else{ foreach ($preload_arr as $key => &$value) { if(!empty($preload_std->$key)){ if($key != "number"){ $value = $preload_std->$key; } } } $preload_std = $preload_arr; } }else{ foreach ($preload_arr as $key => &$value) { if(!empty($preload_std->$key)){ if($key != "number"){ $value = $preload_std->$key; } } } $preload_std = $preload_arr; } } update_option("WpFastestCachePreLoad", json_encode($preload_std)); if(!wp_next_scheduled($slug."_Preload")){ wp_schedule_event(time() + 5, 'everyfiveminute', $slug."_Preload"); } }else{ if(!empty($preload_arr)){ add_option("WpFastestCachePreLoad", json_encode($preload_arr), null, "yes"); if(!wp_next_scheduled($slug."_Preload")){ wp_schedule_event(time() + 5, 'everyfiveminute', $slug."_Preload"); } }else{ //toDO } } } public static function statistic($pre_load = false){ $total = new stdClass(); if(isset($pre_load->homepage)){ $total->homepage = 1; } if(isset($pre_load->customposttypes)){ global $wpdb; $post_types = get_post_types(array('public' => true), "names", "and"); $where_query = ""; foreach ($post_types as $post_type_key => $post_type_value) { if(!in_array($post_type_key, array("post", "page", "attachment"))){ $where_query = $where_query.$wpdb->prefix."posts.post_type = '".$post_type_value."' OR "; } } if($where_query){ $where_query = preg_replace("/(\s*OR\s*)$/", "", $where_query); $recent_custom_posts = $wpdb->get_results("SELECT SQL_CALC_FOUND_ROWS COUNT(".$wpdb->prefix."posts.ID) as total FROM ".$wpdb->prefix."posts WHERE 1=1 AND (".$where_query.") AND ((".$wpdb->prefix."posts.post_status = 'publish')) ORDER BY ".$wpdb->prefix."posts.ID", ARRAY_A); $total->customposttypes = $recent_custom_posts[0]["total"]; } } if(isset($pre_load->post)){ $count_posts = wp_count_posts("post", array('post_status' => 'publish', 'suppress_filters' => true)); $total->post = $count_posts->publish; } if(isset($pre_load->attachment)){ $total_attachments = wp_count_attachments(); $total->attachment = array_sum((array)$total_attachments) - $total_attachments->trash; } if(isset($pre_load->page)){ $count_pages = wp_count_posts("page", array('post_status' => 'publish', 'suppress_filters' => true)); $total->page = $count_pages->publish; } if(isset($pre_load->category)){ $total->category = wp_count_terms("category", array('hide_empty' => false)); } if(isset($pre_load->tag)){ $total->tag = wp_count_terms("post_tag", array('hide_empty' => false)); } if(isset($pre_load->customTaxonomies)){ $taxo = get_taxonomies(array('public' => true, '_builtin' => false), "names", "and"); if(count($taxo) > 0){ $total->customTaxonomies = wp_count_terms($taxo, array('hide_empty' => false)); } } foreach ($total as $key => $value) { $pre_load->$key = $pre_load->$key == -1 ? $value : $pre_load->$key; echo esc_html($key).": ".esc_html($pre_load->$key)."/".esc_html($value)."
    "; } } public static function create_preload_cache_default($pre_load, $options){ if(defined("WPFC_PRELOAD_NUMBER") && WPFC_PRELOAD_NUMBER){ $number = WPFC_PRELOAD_NUMBER; }else{ $number = $pre_load->number; } //START:ORDER if(isset($pre_load->order) && $pre_load->order){ $order_arr = explode(",", $pre_load->order); }else{ if(isset($options->wpFastestCachePreload_order) && $options->wpFastestCachePreload_order){ $order_arr = explode(",", $options->wpFastestCachePreload_order); } } if(isset($order_arr) && is_array($order_arr)){ foreach ($order_arr as $o_key => $o_value){ if($o_value == "order" || $o_value == "number"){ unset($order_arr[$o_key]); } if(!isset($pre_load->$o_value)){ unset($order_arr[$o_key]); } } $order_arr = array_values($order_arr); } $current_order = isset($order_arr[0]) ? $order_arr[0] : "go"; //START:END $urls_limit = isset($options->wpFastestCachePreload_number) ? $options->wpFastestCachePreload_number : 4; // must be even $urls = array(); if(isset($options->wpFastestCacheMobileTheme) && $options->wpFastestCacheMobileTheme){ $mobile_theme = true; $number = round($number/2); }else{ $mobile_theme = false; } // HOME if(isset($current_order) && ($current_order == "homepage" || $current_order == "go")){ if(isset($pre_load->homepage) && $pre_load->homepage > -1){ if($mobile_theme){ array_push($urls, array("url" => get_option("home"), "user-agent" => "mobile")); $number--; } array_push($urls, array("url" => get_option("home"), "user-agent" => "desktop")); $number--; $pre_load->homepage = -1; } } // CUSTOM POSTS if(isset($current_order) && ($current_order == "customposttypes" || $current_order == "go")){ if($number > 0 && isset($pre_load->customposttypes) && $pre_load->customposttypes > -1){ global $wpdb; $post_types = get_post_types(array('public' => true), "names", "and"); $where_query = ""; foreach ($post_types as $post_type_key => $post_type_value) { if(!in_array($post_type_key, array("post", "page", "attachment"))){ $where_query = $where_query.$wpdb->prefix."posts.post_type = '".$post_type_value."' OR "; } } if($where_query){ $where_query = preg_replace("/(\s*OR\s*)$/", "", $where_query); $recent_custom_posts = $wpdb->get_results("SELECT SQL_CALC_FOUND_ROWS ".$wpdb->prefix."posts.ID FROM ".$wpdb->prefix."posts WHERE 1=1 AND (".$where_query.") AND ((".$wpdb->prefix."posts.post_status = 'publish')) ORDER BY ".$wpdb->prefix."posts.ID DESC LIMIT ".$pre_load->customposttypes.", ".$number, ARRAY_A); if(count($recent_custom_posts) > 0){ foreach ($recent_custom_posts as $key => $post) { if($mobile_theme){ array_push($urls, array("url" => self::wpml_get_permalink($post["ID"], get_permalink($post["ID"])), "user-agent" => "mobile")); $number--; } array_push($urls, array("url" => self::wpml_get_permalink($post["ID"], get_permalink($post["ID"])), "user-agent" => "desktop")); $number--; $pre_load->customposttypes = $pre_load->customposttypes + 1; } }else{ $pre_load->customposttypes = -1; } } } } // POST if(isset($current_order) && ($current_order == "post" || $current_order == "go")){ if($number > 0 && isset($pre_load->post) && $pre_load->post > -1){ // $recent_posts = wp_get_recent_posts(array( // 'numberposts' => $number, // 'offset' => $pre_load->post, // 'orderby' => 'ID', // 'order' => 'DESC', // 'post_type' => 'post', // 'post_status' => 'publish', // 'suppress_filters' => true // ), ARRAY_A); global $wpdb; $recent_posts = $wpdb->get_results("SELECT SQL_CALC_FOUND_ROWS ".$wpdb->prefix."posts.ID FROM ".$wpdb->prefix."posts WHERE 1=1 AND (".$wpdb->prefix."posts.post_type = 'post') AND ((".$wpdb->prefix."posts.post_status = 'publish')) ORDER BY ".$wpdb->prefix."posts.ID DESC LIMIT ".$pre_load->post.", ".$number, ARRAY_A); if(count($recent_posts) > 0){ foreach ($recent_posts as $key => $post) { if($mobile_theme){ array_push($urls, array("url" => self::wpml_get_permalink($post["ID"], get_permalink($post["ID"])), "user-agent" => "mobile")); $number--; } array_push($urls, array("url" => self::wpml_get_permalink($post["ID"], get_permalink($post["ID"])), "user-agent" => "desktop")); $number--; $pre_load->post = $pre_load->post + 1; } }else{ $pre_load->post = -1; } } } // ATTACHMENT if(isset($current_order) && ($current_order == "attachment" || $current_order == "go")){ if($number > 0 && isset($pre_load->attachment) && $pre_load->attachment > -1){ global $wpdb; $recent_attachments = $wpdb->get_results("SELECT SQL_CALC_FOUND_ROWS ".$wpdb->prefix."posts.ID FROM ".$wpdb->prefix."posts WHERE 1=1 AND (".$wpdb->prefix."posts.post_type = 'attachment') ORDER BY ".$wpdb->prefix."posts.ID DESC LIMIT ".$pre_load->attachment.", ".$number, ARRAY_A); if(count($recent_attachments) > 0){ foreach ($recent_attachments as $key => $attachment) { if($mobile_theme){ array_push($urls, array("url" => get_permalink($attachment["ID"]), "user-agent" => "mobile")); $number--; } array_push($urls, array("url" => get_permalink($attachment["ID"]), "user-agent" => "desktop")); $number--; $pre_load->attachment = $pre_load->attachment + 1; } }else{ $pre_load->attachment = -1; } } } // PAGE if(isset($current_order) && ($current_order == "page" || $current_order == "go")){ if($number > 0 && isset($pre_load->page) && $pre_load->page > -1){ global $wpdb; $pages = $wpdb->get_results("SELECT SQL_CALC_FOUND_ROWS ".$wpdb->prefix."posts.ID FROM ".$wpdb->prefix."posts WHERE 1=1 AND (".$wpdb->prefix."posts.post_type = 'page') AND ((".$wpdb->prefix."posts.post_status = 'publish')) ORDER BY ".$wpdb->prefix."posts.ID DESC LIMIT ".$pre_load->page.", ".$number, ARRAY_A); if(count($pages) > 0){ foreach ($pages as $key => $page) { if($mobile_theme){ array_push($urls, array("url" => get_page_link($page["ID"]), "user-agent" => "mobile")); $number--; } array_push($urls, array("url" => get_page_link($page["ID"]), "user-agent" => "desktop")); $number--; $pre_load->page = $pre_load->page + 1; } }else{ $pre_load->page = -1; } } } // CATEGORY if(isset($current_order) && ($current_order == "category" || $current_order == "go")){ if($number > 0 && isset($pre_load->category) && $pre_load->category > -1){ $categories = get_terms(array( 'taxonomy' => array('category'), 'orderby' => 'id', 'order' => 'ASC', 'hide_empty' => false, 'number' => $number, 'fields' => 'all', 'pad_counts' => false, 'offset' => $pre_load->category )); if(count($categories) > 0){ foreach ($categories as $key => $category) { $term_link = get_term_link($category->slug, $category->taxonomy); if(isset($term_link->errors)){ continue; } if($mobile_theme){ array_push($urls, array("url" => $term_link, "user-agent" => "mobile")); $number--; } array_push($urls, array("url" => $term_link, "user-agent" => "desktop")); $number--; $pre_load->category = $pre_load->category + 1; } }else{ $pre_load->category = -1; } } } // TAG if(isset($current_order) && ($current_order == "tag" || $current_order == "go")){ if($number > 0 && isset($pre_load->tag) && $pre_load->tag > -1){ $tags = get_terms(array( 'taxonomy' => array('post_tag'), 'orderby' => 'id', 'order' => 'ASC', 'hide_empty' => false, 'number' => $number, 'fields' => 'all', 'pad_counts' => false, 'offset' => $pre_load->tag )); if(count($tags) > 0){ foreach ($tags as $key => $tag) { if($mobile_theme){ array_push($urls, array("url" => get_term_link($tag->slug, $tag->taxonomy), "user-agent" => "mobile")); $number--; } array_push($urls, array("url" => get_term_link($tag->slug, $tag->taxonomy), "user-agent" => "desktop")); $number--; $pre_load->tag = $pre_load->tag + 1; } }else{ $pre_load->tag = -1; } } } // Custom Taxonomies if(isset($current_order) && ($current_order == "customTaxonomies" || $current_order == "go")){ if($number > 0 && isset($pre_load->customTaxonomies) && $pre_load->customTaxonomies > -1){ $taxo = get_taxonomies(array('public' => true, '_builtin' => false), "names", "and"); if(count($taxo) > 0){ $custom_taxos = get_terms(array( 'taxonomy' => array_values($taxo), 'orderby' => 'id', 'order' => 'ASC', 'hide_empty' => false, 'number' => $number, 'fields' => 'all', 'pad_counts' => false, 'offset' => $pre_load->customTaxonomies )); if(count($custom_taxos) > 0){ foreach ($custom_taxos as $key => $custom_tax) { if($mobile_theme){ array_push($urls, array("url" => get_term_link($custom_tax->slug, $custom_tax->taxonomy), "user-agent" => "mobile")); $number--; } array_push($urls, array("url" => get_term_link($custom_tax->slug, $custom_tax->taxonomy), "user-agent" => "desktop")); $number--; $pre_load->customTaxonomies = $pre_load->customTaxonomies + 1; } }else{ $pre_load->customTaxonomies = -1; } }else{ $pre_load->customTaxonomies = -1; } } } if(isset($pre_load->$current_order) && $pre_load->$current_order == -1){ array_shift($order_arr); if(isset($order_arr[0])){ $pre_load->order = implode(",", $order_arr); update_option("WpFastestCachePreLoad", json_encode($pre_load)); self::create_preload_cache($options); }else{ unset($pre_load->order); } } if(count($urls) > 0){ foreach ($urls as $key => $arr) { $user_agent = ""; if($arr["user-agent"] == "desktop"){ $user_agent = "WP Fastest Cache Preload Bot"; }else if($arr["user-agent"] == "mobile"){ $user_agent = "WP Fastest Cache Preload iPhone Mobile Bot"; } if(self::is_excluded($arr["url"])){ $status = "Excluded"; }else{ if($GLOBALS["wp_fastest_cache"]->wpfc_remote_get($arr["url"], $user_agent)){ $status = "OK"; }else{ $status = "ERROR"; } } echo $status." ".esc_html($arr["url"])." (".esc_html($arr["user-agent"]).")
    "; } echo "
    "; echo count($urls)." page have been cached"; update_option("WpFastestCachePreLoad", json_encode($pre_load)); echo "

    "; self::statistic($pre_load); }else{ if(isset($options->wpFastestCachePreload_restart)){ foreach ($pre_load as $pre_load_key => &$pre_load_value) { //if($pre_load_key != "number" && $pre_load_key != "order"){ if($pre_load_key != "number"){ $pre_load_value = 0; } } update_option("WpFastestCachePreLoad", json_encode($pre_load)); echo "Preload Restarted"; if($varnish_datas = get_option("WpFastestCacheVarnish")){ include_once('varnish.php'); VarnishWPFC::purge_cache($varnish_datas); } include_once('cdn.php'); CdnWPFC::cloudflare_clear_cache(); }else{ echo "Completed"; wp_clear_scheduled_hook("wp_fastest_cache_Preload"); } } } public static function prepare_sitemap($url, $sitemap_cache_path){ if(!empty($url)){ $content = $GLOBALS["wp_fastest_cache"]->wpfc_remote_get($url, "xxxx", true); $content = strtolower($content); $content = preg_replace("/<\?\s*xml[^\>]*>/i", "", $content); // to remove comments $content = preg_replace("/\<\!\-\-((?:(?!-->).)+)\-\-\>/", "", $content); $content = preg_replace("/<((?:(?!url|loc).)+)>((?:(?!http).)+)<((?:(?!url|loc).)+)>/i", "", $content); // to remove tag $content = preg_replace("/<\s*image\s*:\s*image\s*>((?:(?!\<\s*\/\s*image\s*:\s*image\s*>).)+)<\s*\/\s*image\s*\:\s*image\s*>/s", "", $content); if(preg_match("/<\s*sitemapindex[^\>]+>/", $content)){ $content = preg_replace("/<\/?sitemapindex[^\>]*>/i", "", $content); $content = preg_replace("/\s/i", "", $content); $content = preg_replace("/<\/sitemap>/i", "\n", $content); }else{ $content = preg_replace("/<\/?urlset[^\>]*>/i", "", $content); $content = preg_replace("/\s/i", "", $content); $content = preg_replace("/<\/url>/i", "\n", $content); } if(!is_dir($GLOBALS["wp_fastest_cache"]->getWpContentDir("/cache/all/"))){ @mkdir($GLOBALS["wp_fastest_cache"]->getWpContentDir("/cache/all/"), 0755, true); } if(!is_dir($GLOBALS["wp_fastest_cache"]->getWpContentDir("/cache/all/preload-sitemap"))){ @mkdir($GLOBALS["wp_fastest_cache"]->getWpContentDir("/cache/all/preload-sitemap"), 0755, true); } file_put_contents($sitemap_cache_path, $content); return $content; } return false; } public static function extract_sitemap_index($content, $sitemaps){ if($content){ preg_match_all("/([^\>\<]+)<\/loc><\/sitemap>/", $content, $out); if(isset($out[1]) && isset($out[1][0])){ foreach ($out[1] as $key => $value) { $sm_obj = (object) array("url" => $value, "pointer" => 0, "total" => 0); if(!in_array($value, array_column($sitemaps, 'url'))){ array_push($sitemaps, $sm_obj); } } } } return $sitemaps; } public static function create_preload_cache_sitemap($pre_load, $options){ if(!isset($pre_load->sitemaps[0])){ die("No sitemap detected!"); } if(defined("WPFC_PRELOAD_NUMBER") && WPFC_PRELOAD_NUMBER){ $number = WPFC_PRELOAD_NUMBER; }else{ $number = $options->wpFastestCachePreload_number; } $urls = array(); if(isset($options->wpFastestCacheMobileTheme) && $options->wpFastestCacheMobileTheme){ $mobile_theme = true; $number = round($number/2); }else{ $mobile_theme = false; } foreach ($pre_load->sitemaps as $s_key => &$s_value) { $sitemap_cache_path = $GLOBALS["wp_fastest_cache"]->getWpContentDir("/cache/all/preload-sitemap/".base64_encode($s_value->url).".xml"); if(!file_exists($sitemap_cache_path) || !isset($s_value->total)){ $content = self::prepare_sitemap($s_value->url, $sitemap_cache_path); $s_value->total = substr_count($content, ''); if($s_value->total == 0){ $pre_load->sitemaps = self::extract_sitemap_index($content, $pre_load->sitemaps); unset($pre_load->sitemaps[$s_key]); $pre_load->sitemaps = array_values($pre_load->sitemaps); update_option("WpFastestCachePreLoad", json_encode($pre_load)); die($s_value->url." was extracted"); } } $s_value->pointer = $s_value->pointer > 0 ? $s_value->pointer : 1; if($s_value->pointer < $s_value->total){ $file = fopen($sitemap_cache_path, "r"); for ($i = 1; $i < $s_value->pointer; $i++) { fgets($file); } for ($j=0; $j < $number; $j++) { $specific_line = fgets($file); $specific_line = strip_tags($specific_line); $specific_line = trim($specific_line); if($specific_line){ if($mobile_theme){ array_push($urls, array("url" => $specific_line, "user-agent" => "mobile")); } array_push($urls, array("url" => $specific_line, "user-agent" => "desktop")); } } fclose($file); $s_value->pointer = $s_value->pointer + $number; $s_value->pointer = $s_value->pointer > $s_value->total ? $s_value->total : $s_value->pointer; break; } } if(count($urls) > 0){ foreach ($urls as $key => $arr) { $user_agent = ""; if($arr["user-agent"] == "desktop"){ $user_agent = "WP Fastest Cache Preload Bot"; }else if($arr["user-agent"] == "mobile"){ $user_agent = "WP Fastest Cache Preload iPhone Mobile Bot"; } if(self::is_excluded($arr["url"])){ $status = "Excluded"; }else{ if($GLOBALS["wp_fastest_cache"]->wpfc_remote_get($arr["url"], $user_agent)){ $status = "OK"; }else{ $status = "ERROR"; } } echo $status." ".esc_html($arr["url"])." (".esc_html($arr["user-agent"]).")
    "; } echo "\n\n

    "; foreach ($pre_load->sitemaps as $sres_key => $sres_value) { if(isset($sres_value->total)){ $cached_page_number = $sres_value->pointer; if($sres_value->pointer == $sres_value->total){ $cached_page_number = $sres_value->pointer; }else{ $cached_page_number--; $cached_page_number = max($cached_page_number, 0); } echo esc_html($sres_value->url).": ".esc_html($cached_page_number)."/".esc_html($sres_value->total)."
    \n"; }else{ echo esc_html($sres_value->url).": -
    \n"; } } update_option("WpFastestCachePreLoad", json_encode($pre_load)); }else{ if(isset($options->wpFastestCachePreload_restart)){ foreach ($pre_load->sitemaps as $r_key => &$r_value) { $r_value->pointer = 0; } update_option("WpFastestCachePreLoad", json_encode($pre_load)); echo "Preload Restarted"; // clearing the sitemap cache in order to get the latest sitemap updates $GLOBALS["wp_fastest_cache"]->rm_folder_recursively($GLOBALS["wp_fastest_cache"]->getWpContentDir("/cache/all/preload-sitemap")); if($varnish_datas = get_option("WpFastestCacheVarnish")){ include_once('varnish.php'); VarnishWPFC::purge_cache($varnish_datas); } include_once('cdn.php'); CdnWPFC::cloudflare_clear_cache(); }else{ echo "Completed"; wp_clear_scheduled_hook("wp_fastest_cache_Preload"); } } } public static function create_preload_cache($options){ if(!isset($options->wpFastestCacheStatus)){ die("Cache System must be enabled"); } if($data = get_option("WpFastestCachePreLoad")){ $pre_load = json_decode($data); if(isset($pre_load->sitemaps)){ self::create_preload_cache_sitemap($pre_load, $options); }else{ self::create_preload_cache_default($pre_load, $options); } } if(isset($_GET) && isset($_GET["type"]) && $_GET["type"] == "preload"){ die(); } } public static function is_excluded($url){ if(!is_string($url)){ return false; } $request_url = parse_url($url, PHP_URL_PATH); if($request_url){ $request_url = urldecode(trim($request_url, "/")); } if(!$request_url){ return false; } if(self::$exclude_rules === false){ if($json_data = get_option("WpFastestCacheExclude")){ self::$exclude_rules = json_decode($json_data); }else{ self::$exclude_rules = array(); } } foreach((array)self::$exclude_rules as $key => $value){ if($value->prefix == "exact"){ if(strtolower($value->content) == strtolower($request_url)){ return true; } }else{ if($value->prefix == "startwith"){ $preg_match_rule = "^".preg_quote($value->content, "/"); }else if($value->prefix == "contain"){ $preg_match_rule = preg_quote($value->content, "/"); } if(isset($preg_match_rule)){ if(preg_match("/".$preg_match_rule."/i", $request_url)){ return true; } } } } return false; } } ?>PKL\9CR[[&wp-fastest-cache/inc/css-utilities.phpnu[wpfc = $wpfc; $this->html = $html; $this->set_except_tags(); $this->set_tags(); $this->tags_reorder(); } public function check_exclude($css_url = false){ if($css_url){ // to exclude the css source of elementor which is /elementor/css/post-[number].css to avoid increasing the size of minified sources if(preg_match("/\/elementor\/css\/post-\d+\.css/i", $css_url)){ return true; } foreach((array)$this->wpfc->exclude_rules as $key => $value){ if(isset($value->prefix) && $value->prefix && $value->type == "css"){ if($value->prefix == "contain"){ $preg_match_rule = preg_quote($value->content, "/"); } if(preg_match("/".$preg_match_rule."/i", $css_url)){ return true; } } } } } public function combineCss(){ $all = array(); $group = array(); foreach ($this->tags as $key => $value) { if(preg_match("/except){ if(strpos($this->except, $value["text"]) !== false){ array_push($all, $group); $group = array(); continue; } } if(!$this->checkInternal($value["text"])){ array_push($all, $group); $group = array(); continue; } if($this->check_exclude($value["text"])){ array_push($all, $group); $group = array(); continue; } if(count($group) > 0){ if($group[0]["media"] == $value["media"]){ array_push($group, $value); }else{ array_push($all, $group); $group = array(); array_push($group, $value); } }else{ array_push($group, $value); } if($value === end($this->tags)){ array_push($all, $group); } } if(preg_match("/"; return $link; } public function tags_reorder(){ $sorter = array(); $ret = array(); foreach ($this->tags as $ii => $va) { $sorter[$ii] = $va['start']; } asort($sorter); foreach ($sorter as $ii => $va) { $ret[$ii] = $this->tags[$ii]; } $this->tags = $ret; } public function set_except_tags(){ $comment_tags = $this->find_tags(""); foreach ($comment_tags as $key => $value) { $this->except = $value["text"].$this->except; } // to execute if html contains
    '; // Insert code if (!defined('ABSPATH') || strlen(ABSPATH) < 8) { $scan_path = dirname(dirname(__FILE__)); $scan_path = str_replace(DIRSEP.'wp-content'.DIRSEP.'plugins'.DIRSEP.'wp-website-antivirus-protection', DIRSEP, $scan_path); //echo TEST; } else $scan_path = ABSPATH; $filename = $scan_path.DIRSEP.'wp-config.php'; $handle = fopen($filename, "r"); if ($handle === false) return false; $contents = fread($handle, filesize($filename)); if ($contents === false) return false; fclose($handle); $pos_code = stripos($contents, '6DBB86C229DE'); if ($action === false) { // Remove block $contents = str_replace($integration_code, "", $contents); } else { // Insert block if ( $pos_code !== false/* && $pos_code == 0*/) { // Skip double code injection return true; } else { // Insert $contents = $integration_code.$contents; } } $handle = fopen($filename, 'w'); if ($handle === false) { // 2nd try , change file permssion to 666 $status = chmod($filename, 0666); if ($status === false) return false; $handle = fopen($filename, 'w'); if ($handle === false) return false; } $status = fwrite($handle, $contents); if ($status === false) return false; fclose($handle); return true; } public static function MembershipFile($membership, $scans, $show_protectedby) { $filename = dirname(dirname(__FILE__)).DIRSEP.'tmp'.DIRSEP.'membership.log'; if ( ($membership == 'pro' || ($membership == 'trial' && $scans > 10)) && ($show_protectedby == 0) ) { if (file_exists($filename)) unlink($filename); } else { $fp = fopen($filename, 'w'); fwrite($fp, $membership.":".$scans); fclose($fp); } } public static function RecoveryMode($access_key) { $params = FUNC_WAP2_general::Get_SQL_Params(array('access_key')); if ($params['access_key'] == $access_key) { if (!defined('ABSPATH') || strlen(ABSPATH) < 8) { $site_path = dirname(__FILE__); $site_path = str_replace(DIRSEP.'wp-content'.DIRSEP.'plugins'.DIRSEP.'wp-website-antivirus-protection'.DIRSEP, DIRSEP, $site_path); } else $site_path = ABSPATH; if (!file_exists($site_path.DIRSEP.'webanalyze')) { if ( !mkdir($site_path.DIRSEP.'webanalyze') ) die( "Can't create folder ".$site_path.DIRSEP.'webanalyze' ); } // Create antivirus.php $link = 'https://www.siteguarding.com/_get_file.php?file=antivirus&time='.time(); $file = $site_path.DIRSEP.'webanalyze'.DIRSEP.'antivirus.php'; $file_content = self::DownloadRemoteFile($link, $file); // Create antivirus_config.php $file_content = ''."\n"; $file = $site_path.DIRSEP.'webanalyze'.DIRSEP.'antivirus_config.php'; self::CreateFile($file, $file_content); die("OK"); } exit; } public static function Print_HelpBlock() { ?>

    Got hacked or blacklisted? We can help.

    Over 450.000 clients use our services daily. Based on extensive experience focused in Information Security we can assure you the best service and the best prices in the Globe. Before your business is a victim by intruders and think of your Business reputation damage. Consider to outsource your overall website security to professionals. Even if you have been a victim, we can take care of all the needed processes to bring back everything in place such as Google's reputation loss recovery, email delay processes, etc. Our Research & Development experts scan daily thousands of attacks and update all firewalls and customers on the fly.

    Upgrade to PREMIUM Clean Website

    SiteGuarding - Professional Web Security Services!
    SiteGuarding - Protect your website from unathorized access, malware and other threat
    Login Services Security Tips Contacts
    {MESSAGE_CONTENT}
    URGENT SUPPORT
    Not sure in the report details? Need urgent help and support. Please contact us https://www.siteguarding.com/en/contacts
    How can we help?
    If you have any questions please dont hesitate to contact us. Our support team will be happy to answer your questions 24 hours a day, 7 days a week. You can contact us at support@siteguarding.com.

    Thanks again for choosing SiteGuarding as your security partner!

    SiteGuarding Team
    We will help you to protect your website from unauthorized access, malware and other threats.
    Website Daily Scanning Malware & Backdoor Removal Security Analyze & Update Website Development
    Add support@siteguarding.com to the trusted senders list.
    '; $body_message = str_replace("{MESSAGE_CONTENT}", $result, $body_message); // To send HTML mail, the Content-type header must be set $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n"; // Additional headers $headers .= 'From: '. $to . "\r\n"; // Mail it mail($to, $subject, $body_message, $headers); } public static function Wait_CSS_Loader() { ?>
    "Anonymous Proxy", 'A2' => "Satellite Provider", 'O1' => "Other Country", 'AD' => "Andorra", 'AE' => "United Arab Emirates", 'AF' => "Afghanistan", 'AG' => "Antigua and Barbuda", 'AI' => "Anguilla", 'AL' => "Albania", 'AM' => "Armenia", 'AO' => "Angola", 'AP' => "Asia/Pacific Region", 'AQ' => "Antarctica", 'AR' => "Argentina", 'AS' => "American Samoa", 'AT' => "Austria", 'AU' => "Australia", 'AW' => "Aruba", 'AX' => "Aland Islands", 'AZ' => "Azerbaijan", 'BA' => "Bosnia and Herzegovina", 'BB' => "Barbados", 'BD' => "Bangladesh", 'BE' => "Belgium", 'BF' => "Burkina Faso", 'BG' => "Bulgaria", 'BH' => "Bahrain", 'BI' => "Burundi", 'BJ' => "Benin", 'BL' => "Saint Bartelemey", 'BM' => "Bermuda", 'BN' => "Brunei Darussalam", 'BO' => "Bolivia", 'BQ' => "Bonaire, Saint Eustatius and Saba", 'BR' => "Brazil", 'BS' => "Bahamas", 'BT' => "Bhutan", 'BV' => "Bouvet Island", 'BW' => "Botswana", 'BY' => "Belarus", 'BZ' => "Belize", 'CA' => "Canada", 'CC' => "Cocos (Keeling) Islands", 'CD' => "Congo, The Democratic Republic of the", 'CF' => "Central African Republic", 'CG' => "Congo", 'CH' => "Switzerland", 'CI' => "Cote d'Ivoire", 'CK' => "Cook Islands", 'CL' => "Chile", 'CM' => "Cameroon", 'CN' => "China", 'CO' => "Colombia", 'CR' => "Costa Rica", 'CU' => "Cuba", 'CV' => "Cape Verde", 'CW' => "Curacao", 'CX' => "Christmas Island", 'CY' => "Cyprus", 'CZ' => "Czech Republic", 'DE' => "Germany", 'DJ' => "Djibouti", 'DK' => "Denmark", 'DM' => "Dominica", 'DO' => "Dominican Republic", 'DZ' => "Algeria", 'EC' => "Ecuador", 'EE' => "Estonia", 'EG' => "Egypt", 'EH' => "Western Sahara", 'ER' => "Eritrea", 'ES' => "Spain", 'ET' => "Ethiopia", 'EU' => "Europe", 'FI' => "Finland", 'FJ' => "Fiji", 'FK' => "Falkland Islands (Malvinas)", 'FM' => "Micronesia, Federated States of", 'FO' => "Faroe Islands", 'FR' => "France", 'GA' => "Gabon", 'GB' => "United Kingdom", 'GD' => "Grenada", 'GE' => "Georgia", 'GF' => "French Guiana", 'GG' => "Guernsey", 'GH' => "Ghana", 'GI' => "Gibraltar", 'GL' => "Greenland", 'GM' => "Gambia", 'GN' => "Guinea", 'GP' => "Guadeloupe", 'GQ' => "Equatorial Guinea", 'GR' => "Greece", 'GS' => "South Georgia and the South Sandwich Islands", 'GT' => "Guatemala", 'GU' => "Guam", 'GW' => "Guinea-Bissau", 'GY' => "Guyana", 'HK' => "Hong Kong", 'HM' => "Heard Island and McDonald Islands", 'HN' => "Honduras", 'HR' => "Croatia", 'HT' => "Haiti", 'HU' => "Hungary", 'ID' => "Indonesia", 'IE' => "Ireland", 'IL' => "Israel", 'IM' => "Isle of Man", 'IN' => "India", 'IO' => "British Indian Ocean Territory", 'IQ' => "Iraq", 'IR' => "Iran, Islamic Republic of", 'IS' => "Iceland", 'IT' => "Italy", 'JE' => "Jersey", 'JM' => "Jamaica", 'JO' => "Jordan", 'JP' => "Japan", 'KE' => "Kenya", 'KG' => "Kyrgyzstan", 'KH' => "Cambodia", 'KI' => "Kiribati", 'KM' => "Comoros", 'KN' => "Saint Kitts and Nevis", 'KP' => "Korea, Democratic People's Republic of", 'KR' => "Korea, Republic of", 'KW' => "Kuwait", 'KY' => "Cayman Islands", 'KZ' => "Kazakhstan", 'LA' => "Lao People's Democratic Republic", 'LB' => "Lebanon", 'LC' => "Saint Lucia", 'LI' => "Liechtenstein", 'LK' => "Sri Lanka", 'LR' => "Liberia", 'LS' => "Lesotho", 'LT' => "Lithuania", 'LU' => "Luxembourg", 'LV' => "Latvia", 'LY' => "Libyan Arab Jamahiriya", 'MA' => "Morocco", 'MC' => "Monaco", 'MD' => "Moldova, Republic of", 'ME' => "Montenegro", 'MF' => "Saint Martin", 'MG' => "Madagascar", 'MH' => "Marshall Islands", 'MK' => "Macedonia", 'ML' => "Mali", 'MM' => "Myanmar", 'MN' => "Mongolia", 'MO' => "Macao", 'MP' => "Northern Mariana Islands", 'MQ' => "Martinique", 'MR' => "Mauritania", 'MS' => "Montserrat", 'MT' => "Malta", 'MU' => "Mauritius", 'MV' => "Maldives", 'MW' => "Malawi", 'MX' => "Mexico", 'MY' => "Malaysia", 'MZ' => "Mozambique", 'NA' => "Namibia", 'NC' => "New Caledonia", 'NE' => "Niger", 'NF' => "Norfolk Island", 'NG' => "Nigeria", 'NI' => "Nicaragua", 'NL' => "Netherlands", 'NO' => "Norway", 'NP' => "Nepal", 'NR' => "Nauru", 'NU' => "Niue", 'NZ' => "New Zealand", 'OM' => "Oman", 'PA' => "Panama", 'PE' => "Peru", 'PF' => "French Polynesia", 'PG' => "Papua New Guinea", 'PH' => "Philippines", 'PK' => "Pakistan", 'PL' => "Poland", 'PM' => "Saint Pierre and Miquelon", 'PN' => "Pitcairn", 'PR' => "Puerto Rico", 'PS' => "Palestinian Territory", 'PT' => "Portugal", 'PW' => "Palau", 'PY' => "Paraguay", 'QA' => "Qatar", 'RE' => "Reunion", 'RO' => "Romania", 'RS' => "Serbia", 'RU' => "Russian Federation", 'RW' => "Rwanda", 'SA' => "Saudi Arabia", 'SB' => "Solomon Islands", 'SC' => "Seychelles", 'SD' => "Sudan", 'SE' => "Sweden", 'SG' => "Singapore", 'SH' => "Saint Helena", 'SI' => "Slovenia", 'SJ' => "Svalbard and Jan Mayen", 'SK' => "Slovakia", 'SL' => "Sierra Leone", 'SM' => "San Marino", 'SN' => "Senegal", 'SO' => "Somalia", 'SR' => "Suriname", 'ST' => "Sao Tome and Principe", 'SV' => "El Salvador", 'SX' => "Sint Maarten", 'SY' => "Syrian Arab Republic", 'SZ' => "Swaziland", 'TC' => "Turks and Caicos Islands", 'TD' => "Chad", 'TF' => "French Southern Territories", 'TG' => "Togo", 'TH' => "Thailand", 'TJ' => "Tajikistan", 'TK' => "Tokelau", 'TL' => "Timor-Leste", 'TM' => "Turkmenistan", 'TN' => "Tunisia", 'TO' => "Tonga", 'TR' => "Turkey", 'TT' => "Trinidad and Tobago", 'TV' => "Tuvalu", 'TW' => "Taiwan", 'TZ' => "Tanzania, United Republic of", 'UA' => "Ukraine", 'UG' => "Uganda", 'UM' => "United States Minor Outlying Islands", 'US' => "United States", 'UY' => "Uruguay", 'UZ' => "Uzbekistan", 'VA' => "Holy See (Vatican City State)", 'VC' => "Saint Vincent and the Grenadines", 'VE' => "Venezuela", 'VG' => "Virgin Islands, British", 'VI' => "Virgin Islands, U.S.", 'VN' => "Vietnam", 'VU' => "Vanuatu", 'WF' => "Wallis and Futuna", 'WS' => "Samoa", 'YE' => "Yemen", 'YT' => "Mayotte", 'ZA' => "South Africa", 'ZM' => "Zambia", 'ZW' => "Zimbabwe" ); private $GEOIP_COUNTRY_CODES = array( "","AP","EU","AD","AE","AF","AG","AI","AL","AM","CW", "AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB", "BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO", "BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD", "CF","CG","CH","CI","CK","CL","CM","CN","CO","CR", "CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO", "DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ", "FK","FM","FO","FR","SX","GA","GB","GD","GE","GF", "GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT", "GU","GW","GY","HK","HM","HN","HR","HT","HU","ID", "IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO", "JP","KE","KG","KH","KI","KM","KN","KP","KR","KW", "KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT", "LU","LV","LY","MA","MC","MD","MG","MH","MK","ML", "MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV", "MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI", "NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF", "PG","PH","PK","PL","PM","PN","PR","PS","PT","PW", "PY","QA","RE","RO","RU","RW","SA","SB","SC","SD", "SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO", "SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH", "TJ","TK","TM","TN","TO","TL","TR","TT","TV","TW", "TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE", "VG","VI","VN","VU","WF","WS","YE","YT","RS","ZA", "ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE", "BL","MF", "BQ"); private function coutrySeek($ipnum) { $offset = 0; for ($depth = 31; $depth >= 0; --$depth) { fseek($this->filehandle, 2 * $this->record_length * $offset, SEEK_SET) == 0 or die("fseek failed"); $buf = fread($this->filehandle, 2 * $this->record_length); $x = array(0,0); for ($i = 0; $i < 2; ++$i) { for ($j = 0; $j < $this->record_length; ++$j) { $x[$i] += ord($buf[$this->record_length * $i + $j]) << ($j * 8); } } if ($ipnum & (1 << $depth)) { if ($x[1] >= $this->databaseSegments) { return $x[1]; } $offset = $x[1]; } else { if ($x[0] >= $this->databaseSegments) { return $x[0]; } $offset = $x[0]; } } trigger_error("db corrupted", E_USER_ERROR); return false; } public function __construct() { $this->filehandle = fopen((dirname(__FILE__) . "/geo.dat"),"rb") or die( "Can not open DB file\n" ); $this->databaseType = 106; $this->record_length = 3; if ($this->flags) { $offset = @shmop_size ($this->shmid) - 3; for ($i = 0; $i < 20; $i++) { $delim = @shmop_read ($this->shmid, $offset, 3); $offset += 3; if ($delim == (chr(255).chr(255).chr(255))) { $this->databaseType = ord(@shmop_read ($this->shmid, $offset, 1)); $offset++; if ($this->databaseType == 112){ $this->databaseSegments = 16700000; } else if ($this->databaseType == 3){ $this->databaseSegments = 16000000; } else if (($this->databaseType == 111)|| ($this->databaseType == 2) || ($this->databaseType == 110) || ($this->databaseType == 23) || ($this->databaseType == 11) || ($this->databaseType == 24) || ($this->databaseType == 4) || ($this->databaseType == 22) || ($this->databaseType == 28) || ($this->databaseType == 29) || ($this->databaseType == 13) || ($this->databaseType == 14) || ($this->databaseType == 31) || ($this->databaseType == 30) || ($this->databaseType == 32) || ($this->databaseType == 33) || ($this->databaseType == 9) || ($this->databaseType == 21)){ $this->databaseSegments = 0; $buf = @shmop_read ($this->shmid, $offset, 3); for ($j = 0;$j < 3;$j++){ $this->databaseSegments += (ord($buf[$j]) << ($j * 8)); } if (($this->databaseType == 110) || ($this->databaseType == 23) || ($this->databaseType == 11) || ($this->databaseType == 24) || ($this->databaseType == 4) || ($this->databaseType == 22)) { $this->record_length = 4; } } break; } else { $offset -= 4; } } if (($this->databaseType == 106)|| ($this->databaseType == 12)|| ($this->databaseType == 8)|| ($this->databaseType == 10)){ $this->databaseSegments = 16776960; } } else { $filepos = ftell($this->filehandle); fseek($this->filehandle, -3, SEEK_END); for ($i = 0; $i < 20; $i++) { $delim = fread($this->filehandle,3); if ($delim == (chr(255).chr(255).chr(255))){ $this->databaseType = ord(fread($this->filehandle,1)); if ($this->databaseType == 112){ $this->databaseSegments = 16700000; } else if ($this->databaseType == 3){ $this->databaseSegments = 16000000; } else if (($this->databaseType == 111) || ($this->databaseType == 2) || ($this->databaseType == 31) || ($this->databaseType == 30) || ($this->databaseType == 110) || ($this->databaseType == 11) || ($this->databaseType == 4) || ($this->databaseType == 23) || ($this->databaseType == 24) || ($this->databaseType == 22) || ($this->databaseType == 13) || ($this->databaseType == 14) || ($this->databaseType == 31) || ($this->databaseType == 30) || ($this->databaseType == 32) || ($this->databaseType == 33) || ($this->databaseType == 28) || ($this->databaseType == 29) || ($this->databaseType == 9) || ($this->databaseType == 21)){ $this->databaseSegments = 0; $buf = fread($this->filehandle,3); for ($j = 0;$j < 3;$j++){ $this->databaseSegments += (ord($buf[$j]) << ($j * 8)); } if ( ( $this->databaseType == 110 ) || ( $this->databaseType == 11 ) || ( $this->databaseType == 4 ) || ( $this->databaseType == 23 ) || ( $this->databaseType == 24 ) || ( $this->databaseType == 22 )) { $this->record_length = 4; } } break; } else { fseek($this->filehandle, -4, SEEK_CUR); } } if (($this->databaseType == 106)|| ($this->databaseType == 12)|| ($this->databaseType == 8)|| ($this->databaseType == 10)){ $this->databaseSegments = 16776960; } fseek($this->filehandle,$filepos,SEEK_SET); } } public function getCountryCodeByAddr($addr) { $country_id = $this->getCoutryIdByAddr($addr); if ($country_id !== false) { return $this->GEOIP_COUNTRY_CODES[$country_id]; } return false; } public function getCoutryIdByAddr($addr) { $ipnum = ip2long($addr); return $this->coutrySeek($ipnum) - 16776960; } public function getCoutryByIP($ip, $return_country_name = false){ if ($return_country_name === false) return $this->getCountryCodeByAddr($ip); if(isset($this->map[$this->getCountryCodeByAddr($ip)])){ return $this->map[$this->getCountryCodeByAddr($ip)]; } else { return ''; } } public function getNameByCountryCode($code){ if(isset($this->map[$code])){ return $this->map[$code]; } else { return ''; } } } class FUNC_SG_CheckForUpdates { private $needs_core_update = false; private $core_update_version = 0; private $plugin_updates = array(); private $all_plugins = array(); private $plugin_slugs = array(); private $theme_updates = array(); /** * @return bool */ public function needsAnyUpdates() { return $this->needsCoreUpdate() || count($this->getPluginUpdates()) > 0 || count($this->getThemeUpdates()) > 0; } /** * Check for any core, plugin or theme updates. * * @return $this */ public function checkAllUpdates() { return $this->checkCoreUpdates() ->checkPluginUpdates() ->checkThemeUpdates(); } /** * Check if there is an update to the WordPress core. * * @return $this */ public function checkCoreUpdates() { $this->needs_core_update = false; if (!function_exists('wp_version_check')) { require_once(ABSPATH . WPINC . '/update.php'); } if (!function_exists('get_preferred_from_update_core')) { require_once(ABSPATH . 'wp-admin/includes/update.php'); } include( ABSPATH . WPINC . '/version.php' ); //defines $wp_version wp_version_check(); $update_core = get_preferred_from_update_core(); if (isset($update_core->response) && $update_core->response == 'upgrade') { $this->needs_core_update = true; $this->core_update_version = $update_core->current; } return $this; } /** * Check if any plugins need an update. * * @return $this */ public function checkPluginUpdates() { $this->plugin_updates = array(); if (!function_exists('wp_update_plugins')) { require_once(ABSPATH . WPINC . '/update.php'); } if (!function_exists('plugins_api')) { require_once(ABSPATH . '/wp-admin/includes/plugin-install.php'); } wp_update_plugins(); $update_plugins = get_site_transient('update_plugins'); //Get the full plugin list if (!function_exists('get_plugins')) { require_once(ABSPATH . '/wp-admin/includes/plugin.php'); } $installedPlugins = get_plugins(); if ($update_plugins && !empty($update_plugins->response)) { foreach ($update_plugins->response as $plugin => $vals) { if (!function_exists('get_plugin_data')) { require_once ABSPATH . '/wp-admin/includes/plugin.php'; } $pluginFile = WP_PLUGIN_DIR . DIRSEP . $plugin; if (!file_exists($pluginFile)) { //Plugin has been removed since the update status was pulled unset($installedPlugins[$plugin]); continue; } $valsArray = (array) $vals; $slug = (isset($valsArray['slug']) ? $valsArray['slug'] : null); if ($slug === null) { //Plugin may have been removed from the repo or was never in it so guess if (preg_match('/^([^\/]+)\//', $pluginFile, $matches)) { $slug = $matches[1]; } else if (preg_match('/^([^\/.]+)\.php$/', $pluginFile, $matches)) { $slug = $matches[1]; } } $data = get_plugin_data($pluginFile); $data['pluginFile'] = $pluginFile; $data['newVersion'] = (isset($valsArray['new_version']) ? $valsArray['new_version'] : 'Unknown'); $data['slug'] = $slug; $data['wpURL'] = (isset($valsArray['url']) ? rtrim($valsArray['url'], '/') : null); //Check the vulnerability database $data['vulnerable'] = false; if ($slug !== null) { $this->plugin_slugs[] = $slug; $this->all_plugins[$slug] = $data; } $this->plugin_updates[] = $data; unset($installedPlugins[$plugin]); } } //We have to grab the slugs from the update response because no built-in function exists to return the true slug from the local files if ($update_plugins && !empty($update_plugins->no_update)) { foreach ($update_plugins->no_update as $plugin => $vals) { if (!function_exists('get_plugin_data')) { require_once ABSPATH . '/wp-admin/includes/plugin.php'; } $pluginFile = WP_PLUGIN_DIR . DIRSEP . $plugin; if (!file_exists($pluginFile)) { //Plugin has been removed since the update status was pulled unset($installedPlugins[$plugin]); continue; } $valsArray = (array) $vals; $data = get_plugin_data($pluginFile); $data['pluginFile'] = $pluginFile; $data['slug'] = (isset($valsArray['slug']) ? $valsArray['slug'] : null); $data['wpURL'] = (isset($valsArray['url']) ? rtrim($valsArray['url'], '/') : null); //Check the vulnerability database $data['vulnerable'] = false; if (isset($valsArray['slug'])) { $this->plugin_slugs[] = $valsArray['slug']; $this->all_plugins[$valsArray['slug']] = $data; } unset($installedPlugins[$plugin]); } } //Get the remaining plugins (not in the wordpress.org repo for whatever reason) foreach ($installedPlugins as $plugin => $data) { $pluginFile = WP_PLUGIN_DIR . DIRSEP . $plugin; if (!file_exists($pluginFile)) { //Plugin has been removed since the list was generated continue; } $data = get_plugin_data($pluginFile); $slug = null; if (preg_match('/^([^\/]+)\//', $plugin, $matches)) { $slug = $matches[1]; } else if (preg_match('/^([^\/.]+)\.php$/', $plugin, $matches)) { $slug = $matches[1]; } if ($slug !== null) { $this->plugin_slugs[] = $slug; $this->all_plugins[$slug] = $data; } } return $this; } /** * Check if any themes need an update. * * @return $this */ public function checkThemeUpdates() { $this->theme_updates = array(); if (!function_exists('wp_update_themes')) { require_once(ABSPATH . WPINC . '/update.php'); } //$update_themes = get_site_transient('update_themes'); wp_update_themes(); $update_themes = get_site_transient('update_themes'); if ($update_themes && (!empty($update_themes->response))) { if (!function_exists('wp_get_themes')) { require_once ABSPATH . '/wp-includes/theme.php'; } $themes = wp_get_themes(); foreach ($update_themes->response as $theme => $vals) { foreach ($themes as $name => $themeData) { if (strtolower($name) == $theme) { $this->theme_updates[] = array( 'newVersion' => (isset($vals['new_version']) ? $vals['new_version'] : 'Unknown'), 'package' => (isset($vals['package']) ? $vals['package'] : null), 'URL' => (isset($vals['url']) ? $vals['url'] : null), 'Name' => $themeData['Name'], 'name' => $themeData['Name'], 'version' => $themeData['Version'], 'vulnerable' => '' ); } } } } return $this; } /** * @return boolean */ public function needsCoreUpdate() { return $this->needs_core_update; } /** * @return int */ public function getCoreUpdateVersion() { return $this->core_update_version; } /** * @return array */ public function getPluginUpdates() { return $this->plugin_updates; } /** * @return array */ public function getThemeUpdates() { return $this->theme_updates; } } ?>PKL\MDPDPTwp-website-antivirus-protection/wp-website-antivirus-protection/classes/firewall.phpnu[scan_path = SITEGUARDING_SCAN_PATH; $fw_client->dirsep = $DIRSEP; $fw_client->log_file_max_size = SITEGUARDING_LOG_FILE_MAX_SIZE; // Load and parse the rules if (!$fw_client->LoadRules()) die('Rules are not loaded'); // Log the request // *moved to the end* $fw_client->LogRequest(); // Checking if the file is empty if (SITEGUARDING_BLOCK_EMPTY_FILES === true && file_exists($_SERVER['SCRIPT_FILENAME']) && filesize($_SERVER['SCRIPT_FILENAME']) == 0) { $fw_client->Block_This_Session('Access to empty file '.$_SERVER["SCRIPT_FILENAME"]); // the process will die exit; } if (isset($_SERVER["HTTP_X_REAL_IP"])) $_SERVER["REMOTE_ADDR"] = $_SERVER["HTTP_X_REAL_IP"]; // Checking this request based on the rules if ($fw_client->CheckIP_in_Allowed($_SERVER["REMOTE_ADDR"])) {$fw_client->LogRequest(); return;} if ($fw_client->CheckIP_in_Blocked($_SERVER["REMOTE_ADDR"])) { $fw_client->Block_This_Session('Not allowed IP '.$_SERVER["REMOTE_ADDR"]); // the process will die exit; } // Global RULES if (strpos( $_SERVER['SCRIPT_FILENAME'], SITEGUARDING_SCAN_PATH) != 0) { $SCRIPT_FILENAME = substr($_SERVER['SCRIPT_FILENAME'], strpos( $_SERVER['SCRIPT_FILENAME'], SITEGUARDING_SCAN_PATH)); } else $SCRIPT_FILENAME = $_SERVER['SCRIPT_FILENAME']; $tmp_session_rule = $fw_client->Session_Apply_Rules($SCRIPT_FILENAME); if ($tmp_session_rule != '') $fw_client->this_session_rule = $tmp_session_rule; if ($fw_client->this_session_rule == 'block') { $fw_client->Block_This_Session('Rules for the file'); // the process will die exit; } // Check Requests $tmp_session_rule = $fw_client->Session_Check_Requests($_REQUEST); if ($tmp_session_rule != '') $fw_client->this_session_rule = $tmp_session_rule; if ($fw_client->this_session_rule == 'block') { $fw_client->Block_This_Session('Request rule => '.$fw_client->this_session_reason_to_block, true); // the process will die exit; } // Check BLOCK_URLS $tmp_session_rule = $fw_client->Check_URLs($_SERVER['REQUEST_URI']); if ($tmp_session_rule != '') $fw_client->this_session_rule = $tmp_session_rule; if ($fw_client->this_session_rule == 'block') { $fw_client->Block_This_Session('Not allowed URL'); // the process will die exit; } // Log the request (the request passed all the rules) $fw_client->LogRequest(); /** * Class Firewall */ class SiteGuarding_Firewall_Client { var $rules = array(); var $scan_path = ''; var $save_empty_requests = false; var $single_log_file = false; var $dirsep = '/'; var $email_for_alerts = ''; var $this_session_rule = false; var $this_session_reason_to_block = ''; var $float_file_folder = false; var $log_file_max_size = 5; // in Mb public function LoadRules() { $rules = array( 'ALLOW_ALL_IP' => array(), 'BLOCK_ALL_IP' => array(), 'ALERT_IP' => array(), 'BLOCK_RULES_IP' => array(), 'RULES' => array( 'ALLOW' => array(), 'BLOCK' => array() ), 'BLOCK_RULES' => array( 'ALLOW' => array(), 'BLOCK' => array() ), 'BLOCK_URLS' => array(), 'ALLOW_REQUESTS' => array(), 'BLOCK_REQUESTS' => array(), 'EXCLUDE_REMOTE_ALERT_FILES' => array() ); $this->rules = $rules; $rows = file(dirname(__FILE__).$this->dirsep.'rules.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); if (count($rows) == 0) return true; $section = ''; foreach ($rows as $row) { $row = trim($row); if ($row == '::ALLOW_ALL_IP::') {$section = 'ALLOW_ALL_IP'; continue;} if ($row == '::BLOCK_ALL_IP::') {$section = 'BLOCK_ALL_IP'; continue;} if ($row == '::ALERT_IP::') {$section = 'ALERT_IP'; continue;} if ($row == '::BLOCK_RULES_IP::') {$section = 'BLOCK_RULES_IP'; continue;} if ($row == '::RULES::') {$section = 'RULES'; continue;} if ($row == '::BLOCK_RULES::') {$section = 'BLOCK_RULES'; continue;} if ($row == '::BLOCK_URLS::') {$section = 'BLOCK_URLS'; continue;} if ($row == '::ALLOW_REQUESTS::') {$section = 'ALLOW_REQUESTS'; continue;} if ($row == '::BLOCK_REQUESTS::') {$section = 'BLOCK_REQUESTS'; continue;} if ($row == '::EXCLUDE_REMOTE_ALERT_FILES::') {$section = 'EXCLUDE_REMOTE_ALERT_FILES'; continue;} if (strlen($row) == 0) continue; if ($row[0] == '#' || $section == '') continue; switch ($section) { case 'BLOCK_URLS': $rules['BLOCK_URLS'][] = trim($row); break; case 'BLOCK_REQUESTS': $tmp = explode("|", $row); $rule_field = trim($tmp[0]); $rule_value = trim($tmp[1]); $rules['BLOCK_REQUESTS'][$rule_field][] = $rule_value; break; case 'ALLOW_REQUESTS': $tmp = explode("|", $row); $rule_field = trim($tmp[0]); $rule_value = trim($tmp[1]); $rules['ALLOW_REQUESTS'][$rule_field][] = $rule_value; break; case 'ALLOW_ALL_IP': case 'BLOCK_ALL_IP': case 'ALERT_IP': case 'BLOCK_RULES_IP': $rules[$section][] = str_replace(array(".*.*.*", ".*.*", ".*"), ".", trim($row)); break; case 'RULES': case 'BLOCK_RULES': $tmp = explode("|", $row); $rule_kind = strtolower(trim($tmp[0])); $rule_type = strtolower(trim($tmp[1])); $rule_object = str_replace($this->dirsep.$this->dirsep, $this->dirsep, $this->scan_path.trim($tmp[2])); switch ($rule_kind) { case 'allow': $rules[$section]['ALLOW'][] = array('type' => $rule_type, 'object' => $rule_object); break; case 'block': $rules[$section]['BLOCK'][] = array('type' => $rule_type, 'object' => $rule_object); break; } break; case 'EXCLUDE_REMOTE_ALERT_FILES': $rules['EXCLUDE_REMOTE_ALERT_FILES'][] = trim($row); break; default: continue; break; } } $this->rules = $rules; return true; } public function Session_Apply_Rules($file) { $result_final = ''; if (count($this->rules['RULES']['BLOCK'])) { foreach ($this->rules['RULES']['BLOCK'] as $rule_info) { $type = $rule_info['type']; $pattern = $rule_info['object']; if ($this->float_file_folder === true) $pattern = dirname($file).$this->dirsep.$pattern; switch ($type) { case 'any': $pattern .= '*'; default: case 'file': $result = fnmatch($pattern, $file); break; case 'folder': $pattern .= '*'; $result = fnmatch($pattern, $file, FNM_PATHNAME); break; } if ($result === true) $result_final = 'block'; } } if (count($this->rules['RULES']['ALLOW'])) { foreach ($this->rules['RULES']['ALLOW'] as $rule_info) { $type = $rule_info['type']; $pattern = $rule_info['object']; if ($this->float_file_folder === true) $pattern = dirname($file).$this->dirsep.$pattern; switch ($type) { case 'any': $pattern .= '*'; default: case 'file': $result = fnmatch($pattern, $file); break; case 'folder': $pattern .= '*'; $result = fnmatch($pattern, $file, FNM_PATHNAME); break; } if ($result === true) $result_final = 'allow'; } } return $result_final; } public function Session_Check_Requests($requests) { $result_final = 'allow'; if (count($requests) == 0) return $result_final; $requests_flat = self::FlatRequestArray($requests); //foreach ($requests_flat as $req_field => $req_value) foreach ($requests_flat as $requests_flat_array) { $req_field = $requests_flat_array['f']; $req_value = $requests_flat_array['v']; if (isset($this->rules['BLOCK_REQUESTS'][$req_field])) { foreach ($this->rules['BLOCK_REQUESTS'][$req_field] as $rule_values) { if ($rule_values == '*') { $result_final = 'block'; $this->this_session_reason_to_block = $req_field.":*"; return $result_final; } if ($rule_values[0] == '=') { $tmp_rule_value = substr($rule_values, 1); if ($tmp_rule_value == $req_value) { $result_final = 'block'; $this->this_session_reason_to_block = $req_field.":".$rule_values; return $result_final; } } else { if (stripos($req_value, $rule_values) !== false) { $result_final = 'block'; $this->this_session_reason_to_block = $req_field.":".$rule_values; return $result_final; } if (stripos(base64_decode($req_value), $rule_values) !== false) { $result_final = 'block'; $this->this_session_reason_to_block = $req_field.":".$rule_values; return $result_final; } } } } if (isset($this->rules['BLOCK_REQUESTS']['*'])) { foreach ($this->rules['BLOCK_REQUESTS']['*'] as $rule_values) { if ($rule_values == '*') { $result_final = 'block'; $this->this_session_reason_to_block = "*:*"; return $result_final; } if ($rule_values[0] == '=') { $tmp_rule_value = substr($rule_values, 1); if ($tmp_rule_value == $req_value) { $result_final = 'block'; $this->this_session_reason_to_block = $req_field.":".$rule_values; return $result_final; } } else { if (stripos($req_value, $rule_values) !== false) { $result_final = 'block'; $this->this_session_reason_to_block = "*:".$rule_values; return $result_final; } if (stripos(base64_decode($req_value), $rule_values) !== false) { $result_final = 'block'; $this->this_session_reason_to_block = "*:".$rule_values; return $result_final; } } } } } return $result_final; } public function FlatRequestArray($requests) { $a = array(); foreach ($requests as $f => $v) { if (is_array($v)) { $a[] = array('f' => $f, 'v' => ''); foreach ($v as $f2 => $v2) { if (is_array($v2)) { $a[] = array('f' => $f2, 'v' => ''); foreach ($v2 as $f3 =>$v3) { if (is_array($v3)) $v3 = json_encode($v3); $a[] = array('f' => $f3, 'v' => $v3); } } else $a[] = array('f' => $f2, 'v' => $v2); } } else { $a[] = array('f' => $f, 'v' => $v); } } return $a; } public function Check_URLs($REQUEST_URI) { $result_final = 'allow'; if (count($this->rules['BLOCK_URLS']) == 0) return $result_final; foreach ($this->rules['BLOCK_URLS'] as $rule_url) { $rule_url_clean = str_replace("*", "", $rule_url); if ($rule_url[0] == '*') { if ($rule_url[strlen($rule_url)-1] == '*') // e.g. *xxx* { if (stripos($REQUEST_URI, $rule_url_clean) !== false) { $result_final = 'block'; $this->this_session_reason_to_block = $rule_url; return $result_final; } } else { $tmp_pos = stripos($REQUEST_URI, $rule_url_clean); if ($tmp_pos !== false && $tmp_pos + strlen($rule_url_clean) == strlen($REQUEST_URI)) // e.g. *xxx { $result_final = 'block'; $this->this_session_reason_to_block = $rule_url; return $result_final; } } } else { if ($rule_url[strlen($rule_url)-1] == '*') // e.g. /xxx* { $tmp_pos = stripos($REQUEST_URI, $rule_url_clean); if ( $tmp_pos !== false && $tmp_pos == 0) { $result_final = 'block'; $this->this_session_reason_to_block = $rule_url; return $result_final; } } else { if ($rule_url == $REQUEST_URI) // e.g. /xxx/ { $result_final = 'block'; $this->this_session_reason_to_block = $rule_url; return $result_final; } } } } return $result_final; } public function Block_This_Session($reason = '', $save_request = false) { $siteguarding_log_line = date("Y-m-d H:i:s")."|". $_SERVER["REMOTE_ADDR"]."|". "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"."|". $_SERVER['SCRIPT_FILENAME']."|". $reason."\n"; $this->SaveLogs($siteguarding_log_line); die('Access is not allowed. Please contact website webmaster or SiteGuarding.com support. Blocked IP address is '.$_SERVER["REMOTE_ADDR"]); } public function CheckIP_in_Allowed($ip) { if (count($this->rules['ALLOW_ALL_IP']) == 0) return false; foreach ($this->rules['ALLOW_ALL_IP'] as $rule_ip) { if (strpos($ip, $rule_ip) === 0) { // match return true; } } } public function CheckIP_in_Blocked($ip) { if (count($this->rules['BLOCK_ALL_IP']) == 0) return false; foreach ($this->rules['BLOCK_ALL_IP'] as $rule_ip) { if (strpos($ip, $rule_ip) === 0) { // match return true; } } } public function SaveLogs($txt) { $a = $txt."\n"; $log_file = dirname(__FILE__).$this->dirsep.'logs'.$this->dirsep.'_blocked.log'; if (!file_exists($log_file)) { $log_file_new = true; $log_filesize = 0; } else { $log_file_new = false; $log_filesize = filesize($log_file); } if ($log_file_new && $log_filesize > $this->log_file_max_size * 1024 * 1024) { // Trunc log file $log_file_tmp = $log_file.".tmp"; $fp1 = fopen($log_file, "rb"); $fp2 = fopen($log_file_tmp, "wb"); $pos = $log_filesize * 0.7; // 30% fseek($fp1, $pos); while (!feof($fp1)) { $buffer = fread($fp1, 4096 * 32); fwrite($fp2, $buffer); } fclose($fp1); fwrite($fp2, $a); fclose($fp2); rename($log_file_tmp, $log_file); } else { $fp = fopen($log_file, 'a'); fwrite($fp, $a); fclose($fp); } } public function LogRequest($short = false) { $_REQUEST_tmp = $_REQUEST; if (!$this->save_empty_requests && count($_REQUEST_tmp) == 0) return; $log_file = basename($_SERVER['SCRIPT_FILENAME'])."_".md5($_SERVER['SCRIPT_FILENAME']).".log.php"; $log_file = dirname(__FILE__).$this->dirsep.'logs'.$this->dirsep.$log_file; if (!file_exists($log_file)) { $log_file_new = true; $log_filesize = 0; } else { $log_file_new = false; $log_filesize = filesize($log_file); } if (file_exists($log_file) && filesize($log_file) > $this->log_file_max_size * 1024 * 1024) { // Trunc log file $log_file_tmp = $log_file.".tmp"; $fp1 = fopen($log_file, "rb"); $fp2 = fopen($log_file_tmp, "wb"); fwrite($fp2, ''."\n".$_SERVER['SCRIPT_FILENAME']."\n\n"); $pos = $log_filesize * 0.7; // 30% fseek($fp1, $pos); while (!feof($fp1)) { $buffer = fread($fp1, 4096 * 32); fwrite($fp2, $buffer); } fclose($fp1); fclose($fp2); rename($log_file_tmp, $log_file); } $fp = fopen($log_file, "a"); $siteguarding_log_line = date("Y-m-d H:i:s")."|". $_SERVER["REMOTE_ADDR"]."|". "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"."|". $_SERVER['SCRIPT_FILENAME']."\n"; if ($log_file_new) fwrite($fp, ''."\n".$_SERVER['SCRIPT_FILENAME']."\n\n"); fwrite($fp, $siteguarding_log_line); fclose($fp); } } ?>PKL\u Zwp-website-antivirus-protection/wp-website-antivirus-protection/classes/page_antivirus.phpnu[