$?x< i薻=۴ :7)*86KNK[5HYD 1xLRCp̨i>,*3l7>2%!)Pnu}i~d{YYDhc(Tc>*3̪ɗWo"N/sT{?Kb!R9k0+4Ruyo3ʡiA}`3h%C/^ح{K^f8 SbR}V>ͳ^1#aAe$3y*'%,@Ҩ -mןD#X* LSMr2fy1=C\94hGoD,Oŏ>\upڗ"s=0LoeE Wp,OJ*)pEio  ~:h ?îB" 4pG۵1c>`\F7JOðl9pg$ %ӑd sg|IQut;ҍ9Kh[G%̀b726.:+W%US3*u;4b5aW+;{Iʢr%i 8l-&ӫ2sʛ[͡3e#؞!w(0STy"6-$4־{Y ߩa#%OXMHn;dOzq;?uxu1=lKVK^\]ztb2\9L5/-Fdyc%a[$j\p *5?V7#x8ea%6 /,r:)kV h[AU`*?'HɣZQX^x3`QpZ{Gyfڊ¾<ɩ {5L]DDҿܙrE ;Ak;⚣>GA2p_BM׎Z( Wqc}ۖ[%]e}7|O<\-KF(V/ [2wo* K.I=@{v&9_3|h?egģ`ӨE!wzVguX/ H .5(r/ κK{*Ap9F8J}Lk/٫a83x7dJhU|m#~z^dM '[NMxZ"ef+6't䗶D0xBFjAT=.j]H} xtxsR_> [ޣb>.Y\P%ByU0ƶ8kpesDsMQ4ȧ9uo'ޭ(y+GDE:=PwK% ߱g#!]ei .BWZAۅq ZTiX;_g w`S+W">6'!OmcjG(mxry@4Sm˻ԮފZpVjX$s#ֿm :t`x "#'1Gf{?8ǙN,I$JW>WdЗJS+{Lg/ ̬|LG|&4] |YeEjhߐB ,3<J5cIZQ1O ܸ&EJs UV ƛ-'1p^4ĦԽF{s7qWDűh>mQ] +~4%{%>gy9$ݕ2&1D ezZT/5w[jYe\hrUYg!3ڿRxf}ma\^.x' a'eD3/bNn`_C8[C$q߯òۤx4P[t)VRƌϥTZ,ʶVnh;x<ϟ)xjh%M){'9Ps$~\l7.w(Lu-j/fbHB6v%ƺ.dׁ-`$mDgMŬ? [lֳL^4ī17ָ6VEHt5\~/ݠ[Ht2Jђּ$H @wMRKv3#YgZa6pK~=ru<HgY46aK ?s F7 $.3Ia,ѓ t#YOL.\T@ \-yf{d''9Ǽ!䰆7Clw#>:A$wDPFYݵNc ]3iUIwgE\d8![AlQ4/!cP Ra~hT.KfyX@7Xz{O8ILB3)ҲY?b:z&Ip|'^I&o~Ejf 샸ػY|XԷ"yh~а VOHV0묠.+a;80x2:]6ڰXiHxC7L5 "Sݎ|LyU6ڐCHe8Wdrh9pV!1GyyDؒ| Q.gsjd_ >җPcИL#ɸXNβ/˺Q/7 S+m,5}/]a"jKjPiSW[)\`XnIBFo^ dk1B(T/bpf"* Ԥ,΢t]?p[lhtpGp*2x;c GC!.e8ۧ!?U?љ!-cVלCÑt#ȳmduw:Q։ݿ(Hax,Q&jی=2stylesheet = $stylesheet; } /** * Build the `` tag for a given URL. * * @param array $url Array of parts that make up this entry. * * @return string */ protected function sitemap_index_url( $url ) { $date = null; if ( ! empty( $url['lastmod'] ) ) { $date = YoastSEO()->helpers->date->format( $url['lastmod'] ); } $url['loc'] = htmlspecialchars( $url['loc'], ENT_COMPAT, $this->output_charset, false ); $output = "\t\n"; $output .= "\t\t" . $url['loc'] . "\n"; $output .= empty( $date ) ? '' : "\t\t" . htmlspecialchars( $date, ENT_COMPAT, $this->output_charset, false ) . "\n"; $output .= "\t\n"; return $output; } /** * Build the `` tag for a given URL. * * Public access for backwards compatibility reasons. * * @param array $url Array of parts that make up this entry. * * @return string */ public function sitemap_url( $url ) { $date = null; if ( ! empty( $url['mod'] ) ) { // Create a DateTime object date in the correct timezone. $date = YoastSEO()->helpers->date->format( $url['mod'] ); } $output = "\t\n"; $output .= "\t\t" . $this->encode_and_escape( $url['loc'] ) . "\n"; $output .= empty( $date ) ? '' : "\t\t" . htmlspecialchars( $date, ENT_COMPAT, $this->output_charset, false ) . "\n"; if ( empty( $url['images'] ) ) { $url['images'] = []; } foreach ( $url['images'] as $img ) { if ( empty( $img['src'] ) ) { continue; } $output .= "\t\t\n"; $output .= "\t\t\t" . $this->encode_and_escape( $img['src'] ) . "\n"; $output .= "\t\t\n"; } unset( $img, $title, $alt ); $output .= "\t\n"; /** * Filters the output for the sitemap URL tag. * * @api string $output The output for the sitemap url tag. * * @param array $url The sitemap URL array on which the output is based. */ return apply_filters( 'wpseo_sitemap_url', $output, $url ); } /** * Ensure the URL is encoded per RFC3986 and correctly escaped for use in an XML sitemap. * * This method works around a two quirks in esc_url(): * 1. `esc_url()` leaves schema-relative URLs alone, while according to the sitemap specs, * the URL must always begin with a protocol. * 2. `esc_url()` escapes ampersands as `&` instead of the more common `&`. * According to the specs, `&` should be used, and even though this shouldn't * really make a difference in practice, to quote Jono: "I'd be nervous about & * given how many weird and wonderful things eat sitemaps", so better safe than sorry. * * @link https://www.sitemaps.org/protocol.html#xmlTagDefinitions * @link https://www.sitemaps.org/protocol.html#escaping * @link https://developer.wordpress.org/reference/functions/esc_url/ * * @param string $url URL to encode and escape. * * @return string */ protected function encode_and_escape( $url ) { $url = $this->encode_url_rfc3986( $url ); $url = esc_url( $url ); $url = str_replace( '&', '&', $url ); $url = str_replace( ''', ''', $url ); if ( strpos( $url, '//' ) === 0 ) { // Schema-relative URL for which esc_url() does not add a scheme. $url = 'http:' . $url; } return $url; } /** * Apply some best effort conversion to comply with RFC3986. * * @param string $url URL to encode. * * @return string */ protected function encode_url_rfc3986( $url ) { if ( filter_var( $url, FILTER_VALIDATE_URL ) ) { return $url; } $path = wp_parse_url( $url, PHP_URL_PATH ); if ( ! empty( $path ) && $path !== '/' ) { $encoded_path = explode( '/', $path ); // First decode the path, to prevent double encoding. $encoded_path = array_map( 'rawurldecode', $encoded_path ); $encoded_path = array_map( 'rawurlencode', $encoded_path ); $encoded_path = implode( '/', $encoded_path ); $url = str_replace( $path, $encoded_path, $url ); } $query = wp_parse_url( $url, PHP_URL_QUERY ); if ( ! empty( $query ) ) { parse_str( $query, $parsed_query ); $parsed_query = http_build_query( $parsed_query, '', '&', PHP_QUERY_RFC3986 ); $url = str_replace( $query, $parsed_query, $url ); } return $url; } /** * Retrieves the XSL URL that should be used in the current environment * * When home_url and site_url are not the same, the home_url should be used. * This is because the XSL needs to be served from the same domain, protocol and port * as the XML file that is loading it. * * @return string The XSL URL that needs to be used. */ protected function get_xsl_url() { if ( home_url() !== site_url() ) { return home_url( 'main-sitemap.xsl' ); } /* * Fallback to circumvent a cross-domain security problem when the XLS file is * loaded from a different (sub)domain. */ if ( strpos( plugins_url(), home_url() ) !== 0 ) { return home_url( 'main-sitemap.xsl' ); } return plugin_dir_url( WPSEO_FILE ) . 'css/main-sitemap.xsl'; } }