rovided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type null $last_used Null. * @type null $last_ip Null. * } * @param string $new_password The generated application password in plain text. * @param array $args { * Arguments used to create the application password. * * @type string $name The name of the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * } */ do_action( 'wp_create_application_password', $user_id, $new_item, $new_password, $args ); return array( $new_password, $new_item ); } /** * Gets a user's application passwords. * * @since 5.6.0 * * @param int $user_id User ID. * @return array { * The list of application passwords. * * @type array ...$0 { * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } * } */ public static function get_user_application_passwords( $user_id ) { $passwords = get_user_meta( $user_id, static::USERMETA_KEY_APPLICATION_PASSWORDS, true ); if ( ! is_array( $passwords ) ) { return array(); } $save = false; foreach ( $passwords as $i => $password ) { if ( ! isset( $password['uuid'] ) ) { $passwords[ $i ]['uuid'] = wp_generate_uuid4(); $save = true; } } if ( $save ) { static::set_user_application_passwords( $user_id, $passwords ); } return $passwords; } /** * Gets a user's application password with the given UUID. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's UUID. * @return array|null { * The application password if found, null otherwise. * * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } */ public static function get_user_application_password( $user_id, $uuid ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as $password ) { if ( $password['uuid'] === $uuid ) { return $password; } } return null; } /** * Checks if an application password with the given name exists for this user. * * @since 5.7.0 * * @param int $user_id User ID. * @param string $name Application name. * @return bool Whether the provided application name exists. */ public static function application_name_exists_for_user( $user_id, $name ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as $password ) { if ( strtolower( $password['name'] ) === strtolower( $name ) ) { return true; } } return false; } /** * Updates an application password. * * @since 5.6.0 * @since 6.8.0 The actual password should now be hashed using wp_fast_hash(). * * @param int $user_id User ID. * @param string $uuid The password's UUID. * @param array $update { * Information about the application password to update. * * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } * @return true|WP_Error True if successful, otherwise a WP_Error instance is returned on error. */ public static function update_application_password( $user_id, $uuid, $update = array() ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as &$item ) { if ( $item['uuid'] !== $uuid ) { continue; } if ( ! empty( $update['name'] ) ) { $update['name'] = sanitize_text_field( $update['name'] ); } $save = false; if ( ! empty( $update['name'] ) && $item['name'] !== $update['name'] ) { $item['name'] = $update['name']; $save = true; } if ( $save ) { $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not save application password.' ) ); } } /** * Fires when an application password is updated. * * @since 5.6.0 * @since 6.8.0 The password is now hashed using wp_fast_hash() instead of phpass. * Existing passwords may still be hashed using phpass. * * @param int $user_id The user ID. * @param array $item { * The updated application password details. * * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } * @param array $update The information to update. */ do_action( 'wp_update_application_password', $user_id, $item, $update ); return true; } return new WP_Error( 'application_password_not_found', __( 'Could not find an application password with that id.' ) ); } /** * Records that an application password has been used. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's UUID. * @return true|WP_Error True if the usage was recorded, a WP_Error if an error occurs. */ public static function record_application_password_usage( $user_id, $uuid ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as &$password ) { if ( $password['uuid'] !== $uuid ) { continue; } // Only record activity once a day. if ( $password['last_used'] + DAY_IN_SECONDS > time() ) { return true; } $password['last_used'] = time(); $password['last_ip'] = $_SERVER['REMOTE_ADDR']; $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not save application password.' ) ); } return true; } // Specified application password not found! return new WP_Error( 'application_password_not_found', __( 'Could not find an application password with that id.' ) ); } /** * Deletes an application password. * * @since 5.6.0 * * @param int $user_id User ID. * @param string $uuid The password's UUID. * @return true|WP_Error Whether the password was successfully found and deleted, a WP_Error otherwise. */ public static function delete_application_password( $user_id, $uuid ) { $passwords = static::get_user_application_passwords( $user_id ); foreach ( $passwords as $key => $item ) { if ( $item['uuid'] === $uuid ) { unset( $passwords[ $key ] ); $saved = static::set_user_application_passwords( $user_id, $passwords ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not delete application password.' ) ); } /** * Fires when an application password is deleted. * * @since 5.6.0 * * @param int $user_id The user ID. * @param array $item The data about the application password. */ do_action( 'wp_delete_application_password', $user_id, $item ); return true; } } return new WP_Error( 'application_password_not_found', __( 'Could not find an application password with that id.' ) ); } /** * Deletes all application passwords for the given user. * * @since 5.6.0 * * @param int $user_id User ID. * @return int|WP_Error The number of passwords that were deleted or a WP_Error on failure. */ public static function delete_all_application_passwords( $user_id ) { $passwords = static::get_user_application_passwords( $user_id ); if ( $passwords ) { $saved = static::set_user_application_passwords( $user_id, array() ); if ( ! $saved ) { return new WP_Error( 'db_error', __( 'Could not delete application passwords.' ) ); } foreach ( $passwords as $item ) { /** This action is documented in wp-includes/class-wp-application-passwords.php */ do_action( 'wp_delete_application_password', $user_id, $item ); } return count( $passwords ); } return 0; } /** * Sets a user's application passwords. * * @since 5.6.0 * * @param int $user_id User ID. * @param array $passwords { * The list of application passwords. * * @type array ...$0 { * @type string $uuid The unique identifier for the application password. * @type string $app_id A UUID provided by the application to uniquely identify it. * @type string $name The name of the application password. * @type string $password A one-way hash of the password. * @type int $created Unix timestamp of when the password was created. * @type int|null $last_used The Unix timestamp of the GMT date the application password was last used. * @type string|null $last_ip The IP address the application password was last used by. * } * } * @return int|bool User meta ID if the key didn't exist (ie. this is the first time that an application password * has been saved for the user), true on successful update, false on failure or if the value passed * is the same as the one that is already in the database. */ protected static function set_user_application_passwords( $user_id, $passwords ) { return update_user_meta( $user_id, static::USERMETA_KEY_APPLICATION_PASSWORDS, $passwords ); } /** * Sanitizes and then splits a password into smaller chunks. * * @since 5.6.0 * * @param string $raw_password The raw application password. * @return string The chunked password. */ public static function chunk_password( #[\SensitiveParameter] $raw_password ) { $raw_password = preg_replace( '/[^a-z\d]/i', '', $raw_password ); return trim( chunk_split( $raw_password, 4, ' ' ) ); } /** * Hashes a plaintext application password. * * @since 6.8.0 * * @param string $password Plaintext password. * @return string Hashed password. */ public static function hash_password( #[\SensitiveParameter] string $password ): string { return wp_fast_hash( $password ); } /** * Checks a plaintext application password against a hashed password. * * @since 6.8.0 * * @param string $password Plaintext password. * @param string $hash Hash of the password to check against. * @return bool Whether the password matches the hashed password. */ public static function check_password( #[\SensitiveParameter] string $password, string $hash ): bool { if ( ! str_starts_with( $hash, '$generic$' ) ) { /* * If the hash doesn't start with `$generic$`, it is a hash created with `wp_hash_password()`. * This is the case for application passwords created before 6.8.0. */ return wp_check_password( $password, $hash ); } return wp_verify_fast_hash( $password, $hash ); } } ے6(쎘@-RZ]=Lr>ӫ"!].]S;gyd RDU{fr%`" xx, ~'v:s.i.Q䠶{'+YQL~z2(O=\xrFI8a 9\zn=;sQ¹mKQXj-W󠯳LQhK|z"Y1FF{' z[ǁkchʏi?ĥy@TH9K#@'ĿNb{Y2\MU[%6T%ȝ{D 0sNL`$h^b7GVzM ϥ̃=z+{ATߎVcaAW{REKBש.V_IV=eVTN:@sCJi\3Cd1n.=itra(}-ߕk1NiK!JEjLёӘ: 6Vk u@rK6zkSSZ'>մ&}u̺߇:UƙXK;7߲24owNEdKew ?7+>|9zx%d݆@pv9YoiC˿3ٗhV:D^Gda6 ۫{2AFAD%o.퀕H?c c5pFWD9!PUL.fb\L#2l$LO5ڧsO>B*L:VG3⣗, &ޫTZaIݛĞʌR[_}_?"1L+ӏNE>?Vמ’xBxGe'7>o_O GBz+\˰@hJՕ /k_єtUyPu/,6%Tmm:{ S4uvQSZֶɄe^NC o铙:"_liFQ\u(FG#[q{En=g: `Ž0tyz s†!V4#u93dIW4#NFnxiza ʵs)`'w戵QOj`GN %240N5THۈFW%)j"e&I$'f^ Mhtːu  kxn G XLF٪h fsxwmPR4VNDK=W[=ʥhODi+zӢ32>=g;lm۱ǽGj)ә}46{#{8K$\bs"juG{ò ɝi7an?1uu%+ 2``@5Ϛpc(0-*rE p}uLf ]>C俦8E1ԡ18pRh&ˑ \;,)R x` =(6o2[!*Y,oU@iN:ΦӹOJiIAfZ k][fUF[(uapb (L?񽵲Il[t NfCsL¥48-xӒ)Lz@u E)ES΁ROP6eFWRw,Xu*K+ ؏SP|o8]yutxO { + #6E'ᚡd(ik9M/4GyM4Byn)K27cj~ U"%l*2?kWwiJν[.-WAq`r0 |?3Qt@@_;1F5[q-҈voĨʼU%;9]άbPw\8p)&(snfs@c<'wmˁH bto ю%i; r{oP\ru Qy@MIUۗrS}7gEhj*;vBa䵯tcg P&G@˨kVF e]jL.쬦׎x,ٳ q `{-lUu˕voi5ۃZAAmAorAE{9B|יb nƫmMM*Lͅ{3k1T@)c6'PVVmn4~W mYJ.j9 ar7ܼy۪ z&w[oDQVQU^Q[OH=fe kCGl~7+w X2[Y_sǥPDC0#xvѲU6c?̼yn]#QlrL_L2E ,`1)8^ʎ8efN69:R.KXtISTe[i}d@?XGqǽ'D,IM5!|^(Kn44MC,'@^<-\}O GFr"zi[-_lx\X5qO:O-aˇbx#V@l* ԭ[ռ܊i{mL4)|V]/ P?]mD}Pf}&[ K\,DzkAAo!yֺ~.-0_N#|}"<,XvroRǥ6~-8u=Eka>d+oVtkn$AFLf&L4W<μfVx'!B+Li`T:~SyW4Y8ZwD9G489U K|Bam / Ȭ)Z۶z+ɲՈpiDgǛ#CtXWl4_Yl B')WCak%9Sl%75AY*YX jq7Uf}V^YkhFYJlc7pPUFlw2 Ѵp@UΔ:i*o*P  XVԢ1(mGcnE׌@P bKȲ a D퍁ZwQSvqMBE ¢enw\iPGvNb2Ҏm;k1W;^ ssz=adRuKƿ+?g!šXv!@*._yXx #mKkO^ofq?H[+| SdI5:^tۍ1Bni0MmS;c{}UvcVݤg& c3.ORԳ3ߋUNs & E6abeynC;"V_Dtء_Հ/Ɗ ap7nmri,gQv!0+j?F,SaMU''dgVxkY-]R>ToP5KZ1,1$i㻹s*ۖћR9K{[a0M:֍ACu. ʸWaȧ;]OW| m [m(}Gt)W۪C ZitҍU ڳ1Eֶ >;B%fв LMyY{x0"oZ#ňHɼ/̝*Wjt2ѭBG_6_k7N/@tO$38=M=du[K7bj <} F`bWKl5YvGcذ>?,OK]f'׫/ 7rفv0;09;{Q'zEj[H}qW`$:ήNHX<9AY^Q⓽heLXzjoYUƩU ՊDS]Zo;ёjLSWC 9#:rwzC- cP,Nzu&BTҋ ^BZЀ喇%UrWv c#9sV=Gu'3e W '@Ne\&WeXb2':DJ#}NF=U ?4-.Ԉ(>ExSbͭ@bMٷvdl28cGqPd+dׇ0pjCN#SxkgS%P!3gaֶO5n4vQ=`QA Z5aA ᤩZ\JaB4JW[ YP- Ir `@XYjY+y&@8Oqox&Q6 %Pod^OjGIP>HheXJZohfP7[TQTq2AYO!1]E3 :t`Z1 KT0p*ȏ`$ARo/]34 tund,2zЪ$oӁ '9ca\mm;&`Omwa XT0%T¥ G[@,ѷ{ub82S5[@2Pa 6(JvA76@Gڠ_5v)]CM ܢVj Ѻ(.ocb-gWL <}t{9 wf'M\mb] 䔈e lN -ifB((mڒ>Ŷ{֭U9TMq#{"s# wqT0囱mkV_ʇ[fF⣏{.aX*%6O%dq_`),ٌX)Or(hjDWVlg-5r%Womeŝ`YJΟZbdkl1W5qD1܃-Lowyo`"l5+-WrQd0)\O!})az%oXpk)|2 ߕH{>rUk-_.k{}k5`7Aw@B;kKpww(~Zw).R]+%\Ew4軃C1}]wzϲHmIm h+!G>%f!ɫA_c1gYucTݗWv'P^j~a 15iBxb 45e7UNUMYmZJ?cu^+yșco69>F}TZ^D A˿=VQVƀy?K:qGn~ ?9]Ekch3Q/=wAu/ g%DO7K~hmB ;2 ;>f1tkwd = FX?OJnZ Jv Àa+Edg3 tWu̹'ROX6 ز $zΊ(;5 Q ~;6Q*n(̹@ s7}/dv]aP2ա9B+'q!ӷS꼪yp1;J玆cq>\M$ +I ["w.>݂īBaJBYYS[wty] 8*&u{JTwg%!rdFlfBM[ .JT{Ei0BmJٍ'53v ?-C֠_[ݞFxvΟ0A{˻e Q&w]<5 '߯MK3 ac<;T~OrVlhFlѺ{Aͣ-FavqOF1V0YL21(MZb ގEJ e?LyժXPU)MlϿ= C@tP8>G~_wvH0 ֛- HMS/uau91ɔ!?snI5jI#P0pҗL _`X BXt1XxdخL„?,sGokUھ^B9o=T]q C x#rpS<0|:Ԥ8^5T6ҵn74k>H.]9c= Wt4LC] F@x8^B]` qnk/>U` d8?BgE. o>šESO`S)uB,EQ±@I+ U̝ejWVe&5ޠ"8.~2&Y9)ʌ^q2P=锆4Xxb :1bE2ϧ0)mw/rCڷ_"_ vX6X lbuBV3xi2>MT.0[>Ҡx2ۅ >VRYr?`d<5 d=B-(eQ!>o7Ds]NIWD5\x-1͒j &-|2ORI;~P6G}AY_18O$\09E8{_"}I ) ?{K!mtd2t(?+ ;-">SՊ[9Ç3!J%Hfzl]YzoWݱΈ}[mh.WHuHga-/jLJ̵UvL^@d䞰bxb; xsԤ4 9|i 39AG)栂'f T{W$ -EWbsIpȦ 'ZKEP HZABpťfi}@!y4YH쵶%FfL9Uk4|p<$](OR T'^V/`#}4 m@ZUE1>ԑ5P[3t?`s[>#IQ$gF >3,MN jXhoIPl_,rў}&C{Ym/Y*!RE%gi #,ESn2nۀ!CTb!KjFI&Vx Z}x1h4pO9|mյb4F0@3<%4p<_CAC[[cdUJek0-yQ缕N"yee*wƵp|aQeiY?x "N.ȻR $R[ak6k6G&5bUak6k6Y|EYQ Ǯ [\g /" S ^G^aLn`9;TZZUbŻuDIm=>.5pcrPj}բ:s/Ͷ "]/MnV̈́l`CCN(T|eo+cȲԫ0@sqc9=ȂGoKY6;L؈0Zژ ~,s5u(WIhMp.k|P|hbj/t}jSMDSW-`:Ϡ}OTbFd3"6zkSSZ({ieI,i)ND'B?ۻk,crfU>uESL;mC[d{HlJũ8G>?#*F҃MQ6ƲoqT ]>Ρq dU_RK6ΐs `#6 xiFZ0d@*F-S$<\=ă(AFec~* <Gy$C>#d^3*H]hX/ݦXUpҳWDN~ͷ,^oHS/X[u|jrKkqi=soFesq-8^-Ȝ&gy54?t8uB<y);_ ~4:v!+@Ov:)C4И~g.{0MM2C  />^}`t}`𦀧64k|j|HPYX (?S@}8`Y 8SN kVmc zaQL6Jx1 cilLy ?/$lV>|W+EHF#:5Y>L3׷_3a3C=|ba^Xlj S8O`8;->1zig€=5 N*ip0]iCc1qYx6&x :vY3͋=HA_ ue0o BgJ_x'Oy/L8KhΫDpǑ`c,XPh tMn@S!$r{ia?Uc܀QF&e 庪e8{A CO,ǺjN. Z᛼wˡ\zQԂ3 v4CG9>Fy M<>![ lbz^,3.y0 s';|߂FЄA1QLׁ'}kφCt w<=3#ĝgpZ dž8TV᳁> -2#B1"Aׂ?};€ ` '#2 t>dԆP<j=:` T3^1jj~=a~`EʚW__ߦ|}mdx|5)qq6ԛ8cqu nUtAuv?]0 Մ); T' NԑmԪ?Zlv@bHmACSػ?W 2T} %B?#]s;&Ħ:$~gyA!1P~a*LҔbR&CRͷ`*1@+qCŀ1J@MY#M&'0qnqsR-w{zt慢OP_f-[Aa-k5`SAE ' & qEL -;6y|)BEǬڥ/7qag{e256ɷDzݦ,Le6&%seW[0/3x)O D"QdoI)m\Q6g` әF ӄUt=#S҈E%s4&%sC]`*2!&PU-YL@gFr)n3KE h6e0ۓr^Q.eYDlkX)s:KwxL;lz9c bKc9}F7 %|4IZKТ,FcԾcZ$.z \yG#T G`c@Klv/_fh2Z\komз]t0gf`Ŋ}wM>gX8쬈=$0ӊd[))K{5K:L? O^V/$_s {T,ɩ'䶉(q.V)K~ zrgDlptyoٸ="”Ht]x ;bΈ ua2,=XE7 K&oeΘuwL3"mur16wȝw,;%zSAR4EsM<;.-o| 't~!"j,irג,^պ$qE xQE Ԫe†2e,#AKf࿤X` ,,*;a6~ d8C/^ t;EͦS5>xM{u~F3* } خ0zIcfc/e*Q];u0e\kr;cnjhCiwsaⷮ_Lƣ3<~ 8V5+!) o̿fI`Ͼn5k@]\I0nf9<n||u>DMT3/K. ȹ9i-'թ8$P#b%rN&wV|ߗ$ao(\WŒ RqP<yPw.?|C5dճK.5K5 ,tӘ,].H{mn~_&YPNi-pCU'M"UPI~( A hsBK/vɧ̋ioVn5Ta83{'KOSϲ\Now6 BUlO4vwR.^G?O*!3tEd u"12F0 /S2xuV^j%:rCT%?c 5R?J=,|UvyE-^w'3AFaF-/&K:s* pNx] i@{-{`Un'miatȧqlɓ޹^[5F۶,UYg5޻`Ji7]}=>j8)h:>ˤ]Dȫʥ2\{0oY!_J ">829Xxa3:m<@=y[yO~Sl̂?esNd[o5:)6W֩P#ӯByXmp*ms3Dv^q^t7^ j "#hɐ||ή7 ׂYm͎_`X/4LcJPLo lM-V^X71Snz@Od*m寸<I\ "[>oorsֶ~u/Eŏeo2 LA!8_sU{G֩+ňO?h@;45^Ybo[~4:.lrs]ɇ8 Tp@ }Ge9/Q)nhMơm7qAx|(4?O~IYkz"z̿⵲sNhR6M/>ہo1cY8^S'MlQ2Ơ0˛3u. D"!vwn{7@p@/;(x>sr X ^}DW5`BHyu+S&$y#Jp="?u(dhGJ G w;@AB1&'ނ `/?|F8YaF.?H֠NBY[^pfAXeoJ HR,Y։l(xZ!)C$ɝ j~mWkAhv([QTƅ0ej[T*F3 <c KF'[u m0SJ4RوC3\“DYkewGo*5=PHu oދ Cx>[ }<<ƪ!PݲTkc$u \"As8>`xT$[ߝGN[D3]c ( &DE(C_n-蒍#N^8uvb)9|xa/ y W&&liMJfe8f)^G.uc Tz԰"_kVvhtpuo;€uo7"ޜ*qSϊrQo97aõc<@.LS"i⁕͗1#(m e % XDN8ߤƬxѥL׌\[AaقWip.dF=.N&N]’ ETkɣ{} LɕUPА~\ u-l bL 0C\RZ,( VfǓF9G<_ױƒ~Tjɬ%ugU)F8&Hh1Bʀ{Q'Lj2t(afPNf35^WI<-[:PӝA7/uoV+6亨=v>%ҝw8oDBSc<-XKbaԡU}12Ov׈WWL r{4's^drY=y9zem?[s)&o@DM l5܁b8?o y_#XtbY%.qC7p]JmDxc ͚ _Yfζ9G { \ZYV:h"B4s s9,(ϖ`B'P1y_(= .{~-6[WKI̹"(20>t") )v׫0=UOl-[| (V 6JzQ}\5@\ns[`PٚH$7Xrc0з2K7bg%˂f Fg h9,ߔA9H Oqm@,ՙ-`ycyxsG[m5 :QͷYyM5le6[4d=i 濗)sol+¹S'??%\|5a;_ɘՇlq]F+^d!}8pD-NH 7 6,֯m?Q,Fw9R>ʁq|mj6Bxf]g%6;]3 `yT‘ b:Ffq'mKڒ%h_,<@Ƃu/.BP3Y|%LpgNɭɩI(^n层g uØ2{ёեk1eBR=h~րV jd _GE4Y69 }b|+.3-lT_:EE7Pwe$S[573usC\CޙaɸvqA`rC^{` cYi7H;fIPa 2A˄nKW:7Dm73w=(+},[KuI1iMƬBsT~Ž p\0׿/d<9@y~~pG#b !Uݱ,k'W2 0,{RT]` ,6"bsl9}T{z>=b%F;;!UД<!,c2cFٮSbI>gj5疠 N>Fkŝ)-y5u5R-v5&r}#/ȼc%b; :x6ύIigQƨ? 9ʪsi56E62TV~ n-txcvNоy7΢wL:(3!LΣ-rS;(&꡸'] [bjO vW_&Hu.FCð,cPgp?*|)1Y7۰Pj؁D\zV*X٬}Ђ+ '96Xҋ ۰`E* \_8NB?;umG1=ʖMkP>=馮n/<97T. <{<]ⓗocS{uy-vo &^1OiJzzKvҤ G$y6 sXa&x룤۽u&w{A{CUяIփg;a/u!^@%u'/HL((67l@3= 81Y&iDGlݓSzrrbL^u]WhOdB>={ Bȧ '1}0:UdyL?͏''K˫PuyD zv&M  TηSQ:Nݱ|n9Sm4>tf%2Za#?Rf߆{ JMx bl 6Rn47r+Z@`>~ g:ρEswp[~\MLu?@ˊ򍻽T9Zzxd u{lr=ݰo31p:G5;Mn 7Y2S6Ej#'8z#GL"-ءwa0I󣸗l&Kʋ̼&i /W'>zEZ ǏK{\mQ z n{c}(A _`+f T 4:J4Qmq&‰'輣 X߰! ~:LV߰ysD[7<&y&OMU 쩀ʹ}"\T̤8i e^K3q3nr&6W$-wA o0=B?)y 3_ %ypxҀ.N5U3`itx do1XPm25il6o(>O-