Files
archy/core/target/debug/deps/libyoke-17a2be691e559186.rmeta
T

325 lines
175 KiB
Plaintext
Raw Normal View History

2026-01-24 22:59:20 +00:00
rust
#rustc 1.93.0 (254b59607 2026-01-19)Á³VOÐêùÿ²?ÑL¼§Ì±-a7a40eb546f9e2b0Ástable_deref_traitÁþÖ›#Ÿžõ E4Õèr-80e318edb62c0e9cÁë&Gf·Ã ¬ëñq:¤»b-bb76018b1173caf6Á yoke_deriveÁ­Ù@÷ò+çšFåcz-5e7d4687001d5481ÁzerofromÁˆo“ÄÄx(ÃjBsÖ›ªÅ-e7a4aaab09db7e3aÁzerofrom_deriveÁ¿ &èé•)ˆç-03b1dd1f2d87713aÁáጩBoxÁÄጞôòáŒÏI¡á<†Œüq$ÃàtestsÁ,˜aà$aerasedÁ4šá<ˆŒþƒ
ErasedArcCartÁlßጷƒ
ErasedBoxCartÁlî,á*( ErasedRcCartÁdýQáOMïáŒÉƒôá<„ŒúƒIÌጧ¼ùáŒÑ¼œá³ cartable_ptrÁ sentinel_forÁSENTINELÁprivateÁ SealedÁCartablePointerLikeÁRawÁinto_rawÁdrop_rawÁCloneableCartablePointerLikeÁ
addref_rawÁ'aÁ®ÎØç®!k!¾ !
from_cartableÁ!is_noneÁ&k&²)k)È,k.k0keitherÁ22226C0Á6C1Á66š6;2=Ž
=
=2AŽ
A
kinda_sorta_danglingÁDDDDDDDKindaSortaDanglingÁKKdangleÁDNN N
into_innerÁDRRšRDVVDYY² macro_implsÁ\\\\\\\copy_yoke_implÁ\impl_copy_typeÁ\unsafe_complex_yoke_implÁ\f®ff'bÁfØ\k®kT1Ák©
kT2Ák©
kØ\r®rr©
rÍr rØx utilsÁzzztransform_mut_yokeableÁ}®}}}}©
yokeÁƒƒƒƒƒƒƒƒƒƒ ƒYokeÁŽÒŽ®ŽkŽyokeableÁŽcartÁƒÒ®k®ÍƒšÒš®škšattach_to_cartÁžÚž'deÁštry_attach_to_cartÁ¡¡Ú¡Ôšattach_to_cart_badlyÁ¥Ôštry_attach_to_cart_badlyÁ§ù§ÔƒªÒª®ªkªgetÁ®®ª backing_cartÁªinto_backing_cartÁª replace_cartÁ²C2Á²impl FnOnce(C) -> C2Áªwith_mutÁµ®µÚµ©
ªwith_mut_returnÁ¹®¹Ú¹â¹©
ªwrap_cart_in_optionÁƒ¿Ò¿®¿new_always_ownedÁ¿
into_yokeableÁƒÄÒÄ®ÄkÄ new_ownedÁÄtry_into_yokeableÁƒÊÒÊ®ÊkÊ convert_cart_into_option_pointerÁƒÏÒÏ®ÏkÏåƒ
CloneableCartÁƒÕƒ×®×ƒ ƒ
ÛÒÛ®ÛkÛ®Ûȃ áÒá®áká map_projectÁååÚå®å®ámap_project_clonedÁê'thisÁêýêÚê®ê®átry_map_projectÁðýðÚðùð®ð®átry_map_project_clonedÁö¸öýöÚöùö®ö®á!map_project_with_explicit_captureÁýýýý®ý®á(map_project_cloned_with_explicit_captureÁ¸ý®®á%try_map_project_with_explicit_captureÁˆýˆˆùˆ®ˆ®á,try_map_project_cloned_with_explicit_captureÁޏŽýŽŽùޮޮƒ Ò®k
map_with_cartÁýÚ®®map_with_cart_clonedÁž¸žýžÚž®ž®try_map_with_cartÁ¤ý¤Ú¤ù¤®¤®try_map_with_cart_clonedÁª¸ªýªÚªùª®ª®ƒ
±Ò±®±k±wrap_cart_in_either_aÁµ±wrap_cart_in_either_bÁ·ƒƒƒÒ¼¼¼¼YokeableÁÀ®ÀØÀ transformÁÀtransform_ownedÁÀmakeÁÀ
transform_mutÁÆÚÆ©
¼É®ÉÉØÉ¥ÉÉÍÉÙÐÚЩ
¼Ó®ÓÓØÓ¥ÓÓÍÓÙÚÚÚ©
 zero_fromÁÝÝÝÝÝÝãÒãkã®ã®ãattach_to_zero_copy_cartÁè CartableOptionPointerÁðkðinnerÁð _cartableÁ ôkôÍ2
EitherCartÁ÷Ž
÷
÷Ñú
úì÷«ý
ýì2Ž

È2Ž

2Ž

Õ2Ž

˜2Ž

Í\®Ø¥ÍÙÚ©
\œ®œØœ¥œœÍœÙ¢Ú¢©
\¥®¥Ø¥¥¥¥Í¥Ù«Ú«©
\®®®Ø®¥®®Í®Ù´Ú´©
\·®·Ø·¥··Í·Ù½Ú½©
\À®ÀØÀ¥ÀÀÍÀÙÆÚÆ©
\ ɮɨɥÉÉÍÉÙÏÚÏ©
\
Ò®ÒØÒ¥ÒÒÍÒÙØÚØ©
\ Û®ÛØÛ¥ÛÛÍÛÙáÚá©
\ ä®äØä¥ääÍäÙêÚê©
\
í®íØí¥ííÍíÙóÚó©
\ö®öØö¥ööÍöÙüÚü©
\ÿ®ÿØÿ¥ÿÿÍÿÙÚ©
\ˆ®ˆØˆ¥ˆˆÍˆÙŽÚŽ©
\®Ø¥ÍÙÚ©
f¥ffÍfÙÚ©
k¥kkÍkÙ£Ú£©
r¥rrÍrÙ©Ú©©
%
(
+
;
U
X
[



°
à
ö
ö
ö
ƒ
Š
Š
Ž




Ÿ
¨
±
º
Ã
Ì
Õ
Þ
ç
ð
ù



ÔÀ  ®ý/ý/à`ðð¡"òÅ"óÒ"¶ ÓdÑåÙ k £0Þ£0Ô£0¨â£0£0Þ÷úûÑüìýþ«ÿìQ£^Ÿ
áŽ

¬â™1ž™1™1£™1à`™1ì™1™1Ô™1ìKK M· DyHG| ÿCù¼2 ¼2À®À®À®À®À®À®À®À®À®À®À®À®À®À®À®Àø°ú°û°Ðü°ý°þ°ìHˈXêE>ƒ0®ÀÄ
Ô
®Àƒ0Í®à`ŽŽ¯Òƒâƒ9­+¼%+}AÒkÔø°ú°û°Ðü°ý°þ°ìHˈXêE>å2Ôý/Ô†3Þø5À ƒ0®ÀŠ PhantomDataÁÑ{·Ë…YÚƒ0®


ôð÷Ž&ðYK)ð÷ÛŽ,ðA÷Õø°×
Ú
.ð0ð÷÷÷6÷RK=÷VK“
œ¥®·ÀÉÒÛäíöÿˆfø°k
rÉ
Ó øà` Þ Ô¨â¬âž£ì ùÀÄ
"
å23D §üçL
Kå2 ²¹ü²P¼2å2ÒÒ MaybeUninitÁÒuninitÁüÒ˜ügÇ@ÇeÉRå2ùå2ø· hü¬±!Dı 
%¼¬±
P±64G ̱$á± 
ø°·6ü½°³
ޱ6ø°ú°û°Ðü°ý°þ°ìHˈXêE>·6 ï± ö±ü‡°ïÈŽŽ¯Òƒâƒ9­+¼%+}A±6ï=$®°±6Dž°KK M· DyHG| ÿC±6±6ï=GÒN¼ìï
ŒÞ﹆3çï&()Áݤ
ŒÏ¤º†3ؤ&()ÁÁò
Œ³ò»†3¼ò&()Á ¾
÷à1æ1û+™16à1=D É
÷à1æ1þ+™16æ1=D2D\zƒ¼Ý³Àî(êæÔ쯎íZeroFromÁDÓ
ï†C5ïüËüËjg This crate provides [`Yoke<Y, C>`][Yoke], which allows one to "yoke" (attach) a zero-copy deserializedÁü¶ object (say, a [`Cow<'a, str>`](alloc::borrow::Cow)) to the source it was deserialized from, (say, an [`Rc<[u8]>`](alloc::rc::Rc)),Áü¾if known in this crate as a "cart", producing a type that looks like `Yoke<Cow<'static, str>, Rc<[u8]>>`Áü¨*' and can be moved around with impunity.ÁÓËü×fc Succinctly, this allows one to "erase" static lifetimes and turn them into dynamic ones, similarlyÁü¾TQ to how `dyn` allows one to "erase" static types and turn them into dynamic ones.ÁËü—XU Most of the time the yokeable `Y` type will be some kind of zero-copy deserializableÁüðUR abstraction, potentially with an owned variant (like [`Cow`](alloc::borrow::Cow),ÁüÆ [`ZeroVec`](https://docs.rs/zerovec), or an aggregate containing such types), and the cart `C` will be some smart pointer likeÁüÉŽ [`Box<T>`](alloc::boxed::Box), [`Rc<T>`](alloc::rc::Rc), or [`Arc<T>`](std::sync::Arc), potentially wrapped in an [`Option<T>`](Option).ÁØ ËüÜ da The key behind this crate is [`Yoke::get()`], where calling [`.get()`][Yoke::get] on a type likeÁüÁ
a^ `Yoke<Cow<'static, str>, _>` will get you a short-lived `&'a Cow<'a, str>`, restricted to theÁü£ pm lifetime of the borrow used during [`.get()`](Yoke::get). This is entirely safe since the `Cow` borrows fromÁü” ro the cart type `C`, which cannot be interfered with as long as the `Yoke` is borrowed by [`.get()`](Yoke::get).Áü‡
if [`.get()`](Yoke::get) protects access by essentially reifying the erased lifetime to a safe local oneÁœñ
 when necessary.ÁËü‰74 See the documentation of [`Yoke`] for more details.Á2D\zƒ¼Ý³µÀîÇ(êæÔ쯵Ží†C¬
ï†C¾5ï,/2¤ÒüË85 Types for optional pointers with niche optimization.ÁËüˆNK The main type is [`CartableOptionPointer`], which is like `Option<Rc>` butÁü×MJ with a niche so that the resulting `Yoke` has a niche. The following fourÁü¥74 types can be stored in the `CartableOptionPointer`:ÁÝË 1. `&T`Á 2. `Box<T>`Á 3. `Rc<T>`Á 4. `Arc<T>`ÁœËü OL These four types implement the sealed unsafe trait [`CartablePointerLike`].ÁüðKH In addition, all except `Box<T>` impl [`CloneableCartablePointerLike`],Áü¼@= which allows [`CartableOptionPointer`] to implement `Clone`.Á ðæl‰ÔìÐ6\ÛÐ6ŠÎ StableDerefÁ\˜£4 
¤‚€ÌÍo”ìOü„8ü‘ "d” Îà óîÁ üæ«éå2  ©âå2 ¡ 
å2 
¤º   –3ƒ „ë  ªâœë –\–\|†Bü™:ü˜85 An object fully representable by a non-null pointer.ÁÑË # SafetyÁâ˼æ Implementer safety:ÁþËü‚\Y 1. `into_raw` transfers ownership of the values referenced by StableDeref to the caller,Áüß(% if there is ownership to transferÁüˆWT 2. `drop_raw` returns ownership back to the impl, if there is ownership to transferÁàËüä_\ Note: if `into_raw` returns the sentinel pointer, memory leaks may occur, but this will notÁüÄ  lead to undefined behaviour.ÁåËüéXU Note: the pointer `NonNull<Self::Raw>` may or may not be aligned and it should neverÁüÂVS be dereferenced. Rust allows unaligned pointers; see [`std::ptr::read_unaligned`].Áœª–\ü™Øž\\¿ ž\\4äb)òb \Cäb8òb/©âž\´cüÚDA The raw type used for [`Self::into_raw`] and [`Self::drop_raw`].Á¡¥ ¨ ¯8°»ü‹(üÅ.+ Converts this pointer-like into a pointer.Á¡ú ý 8°ž\Îà óîÁ üæ«é¼c
ž\$—ü¿0ü¹74 Drops any memory associated with this pointer-like.ÁõË¢\ŽË”– Caller safety:Á­ËüµEB 1. The pointer MUST have been returned by this impl's `into_raw`.Áüÿ(% 2. The pointer MUST NOT be dangling.Á¡® ± ¸8°Ýe†3
ž\à üóBüó?< An object that implements [`CartablePointerLike`] that alsoÁü³EB supports cloning without changing the address of referenced data.ÁùË¢\ŠË¼ŽÁ\¦ËüªKH 1. `addref_raw` must create a new owner such that an additional call toÁüö41 `drop_raw` does not create a dangling pointerÁü«GD 2. `addref_raw` must not change the address of any referenced data.Áä„–\üóéž\œ¢\&íl\0íl%ü¨2ì¼ Clones this pointer-like.ÁÞË¢\÷Ë”ÿ˜fËüžE¾füè(Œg¡ š ¡8°4›t•Ýe†3
ž\à äÞ®©âƒ0 çý/ã
üÚ0®¦o êý/æ"$D  ƒ0ü² ý/Îà óîÁ üæ«éƒ0
®ƒ0ü€!(DŠ!Ýp†3
®ƒ0_pointerÁD“!üË"9®¦o Û"ý/  ×"ü™#*T£#Ýp†3
®ƒ0ñpD®#üÄLBk""©âÚ0 ÉL
7
89879à1íT”æ1íÎ|T¯ªâÎ| àìà1ŒŽ©âà1Øìæ1Œ©©âæ1Ü™1:;íî;57#%np66Î|¬æ¯ ¯™1 ¯Î|6 ï6
;à1æ1Î|ü»®Ž
>
?@@>? Ä|T³Ø|TÎé| Ïà1æ1ù|Œ­ˆ}ǘ}ŒÈ§}Ë™1Y[ü«lŽ
B
CBCˆ}·§}»Ôà1Ôæ1l‰™1,.24Ä¢¤¦K ManuallyDropÁdÛíÑDFú:\éÒDG,‡ìDIDerefMutÁDŽùDJüÏ&XZHJäû<>%'ü¯ 0”Á LL“[ Ô å2<× ¼2yHG| ÿCM[')´ÜDKKî;ü÷&OO“[ üÁ‚<ÿ¼2PQü²*Æå2¼2NN
På2· hüÌ#¼2å2NN
Qå2üÚ0SS“[ ßÁ‚¼2TUíîU \4RRå2¬´° °¼2 °å2R ½R
Uå2ü3WW“[ ¢Á‚¼2XúXüå!± ±¼2 ±å2V òV
Xå2üÞ/ZZ“[ ãÁ‚¼2[ [”¢² ²¼2†3Y ªY
[å2À\]î(\]êmemÁ$÷Õ\`œ€íÑ\a÷ ê\b|Ðküå1Eñ79')Ü™ µ Ÿ » ¼*¾ Á œ3+ Ë Ì Ó8þ8 Ý8¥ é ï ê8(ñ ô8'ù8Ø  8$+ § ¨ ¯8þ8 ¹8 Ë Ð8(Ò8'Ù8Ø â ý8+  ˆ 8þ4‰8"4™8  8Í § º8thisÁ& ¬8'²8Ø4´(¼8$¿ Ä ß8ë‹+ é ê ñ8þ8 û8Ù 8Ú Œ  Ž ¡ :®88$—$ 8þ & ž8Ú  8$8Ú ½& ¾:7 È8
Ê Í:©
Î Ð8 Ø í Ù:©
Ú8Ý8'å8Ø$ î ø 8þ   Œ8% Ü¡ ½ Ð  à Ê, Ä8Å& Ç8È*Ì Ï Í 
8"8 ä:®å ç8 ñ:®ò ô8
ö, ú8û þ Ç  8!8Ø4  ˜ 8% ž 8Î  º  »  ¼ % ½ % Î üˆ%Ä• ® Ì ´ µ*· º É,8 Ä8¥ Ð Ù Ñ:®Ò8(Û Þ:®ß8'æ8Ø ï 8" à ÷8ø‡â'å8ù ð õ88 Œ8| ž £8(¥8'¬8Ø µ ±8 debug_assertÁ Ï Ð 8ø‡Ñ'Ô8é'Ý ß8'ä8Ø ì í îð8ø‡ó'ö8é'ÿ 8$‚   ˆ% Š8" û §88÷ & 
8,—8$'¡8Ø ª ¬ Á ­88³
88 Â8castÁ Ç È% É8Û8 ß á8œ€'ï8 ñ ô ù8% ú8÷ Œ'8readÁ$  8÷ 8"8 Ã8Í Ê Ý8ï& Ï8'Õ8Ø4×(ß8 ç 8Ó”   »8ø‡ƒ'8é<ˆ' 8$'8Ø4˜ ž Ÿ  ¢8ø‡¥'¨8é'± ³8 ¸ ¹ º% ¼8Ê8÷ Î& Ñ
Ó88 ß á þ â8ï8è
ë88'ö8Ø ÿ8ã—$€  % 88 ˜ š8œ€'¨8 ª ­ ²8ï% ³8" ù Š8÷ û'þ8ï˜$€  ˆ8÷ 8 Ÿ8Ù ¯8Ú ° ± ² Å ³:®´8·8$ ¿8þ Á
YV the cart serves little purpose except to guarantee that `Y`'s references remain validÁü£ da for as long as the yoke remains in memory (by calling the destructor at the appropriate moment).Áˆ ËüŒ `] The primary constructor for [`Yoke`] is [`Yoke::attach_to_cart()`]. Several variants of thatÁüí YV constructor are provided to serve numerous types of call sites and `Yoke` signatures.ÁÇ
ËüË
c` The key behind this type is [`Yoke::get()`], where calling [`.get()`][Yoke::get] on a type likeÁü¯aªMü‘c` lifetime of the borrow used during `.get()`. This is entirely safe since the `Cow` borrows fromÁüõa^ the cart type `C`, which cannot be interfered with as long as the `Yoke` is borrowed by `.getÁü×a^ ()`. `.get()` protects access by essentially reifying the erased lifetime to a safe local oneÁœ¹ùPÍËüÑli Furthermore, there are various [`.map_project()`][Yoke::map_project] methods that allow turning a `Yoke`Áü¾c` into another `Yoke` containing a different type that may contain elements of the original yokedÁü¢A> value. See the [`Yoke::map_project()`] docs for more details.ÁäËüè\Y In general, `C` is a concrete type, but it is also possible for it to be a trait object.ÁÅË
# ExampleÁ×ËüÛQN For example, we can use this to store zero-copy deserialized data in a cache:Á­Ë ```rustÁ¬½ # use yoke::Yoke;Á´Ó # use std::rc::Rc;ÁÜê # use std::borrow::Cow;Áü†74 # fn load_from_cache(_filename: &str) -> Rc<[u8]> {Áü¾! # // dummy implementationÁüàKH # Rc::new([0x5, 0, 0, 0, 0, 0, 0, 0, 0x68, 0x65, 0x6c, 0x6c, 0x6f])Á # }Á´Ëü¸IF fn load_object(filename: &str) -> Yoke<Cow<'static, str>, Rc<[u8]>> {Áü‚52 let rc: Rc<[u8]> = load_from_cache(filename);Áü¸OL Yoke::<Cow<'static, str>, Rc<[u8]>>::attach_to_cart(rc, |data: &[u8]| {Áüˆ52 // essentially forcing a #[serde(borrow)]Áü¾>; Cow::Borrowed(bincode::deserialize(data).unwrap())Á })ÁŽËü’/, let yoke = load_object("filename.bincode");ÁüÂ'$ assert_eq!(&**yoke.get(), "hello");Áüê52 assert!(matches!(yoke.get(), &Cow::Borrowed(_)));Á<  ```ÁÒk©â±6 ¸©â·6 ÑÀ±6¤»ø59­+¼%+}AKM¿NPüÔƒŽŽÆ?<Ô"$Ô"ƒŽŽ·6üâ#“ÒkÒÈ ç#âÈ €$À±6¤ê#à`·6„ƒ$˜à`±6˜Â„ä$ø5™á`jlî#uwÃ$üü$Dÿ$³´µ ³ø5 ´Á`Á`œÃ`è Á]Ä`bufÁÁ]Ê­\É:•µê³í³î³Òï³ìð³ñ³ò³ìäs{©¶†3ѼѼÒ¼ štÀ. ƒ%
±6·6$„%þ Š%ü‡)aÒkÒÈ Œ)âÈ ¥)œÀ±6œ¤)·6\¨)·6í<à)ø5ž¡¥§WY“)bdü‰?£üï)EB Construct a [`Yoke`] by yokeing an object to a cart in a closure.Á¹*ËüÁ*QN The closure can read and write data outside of its scope, but data it returnsÁü—+<9 may borrow only from the argument passed to the closure.ÁØ+Ëüà+RO See also [`Yoke::try_attach_to_cart()`] to return a `Result` from the closure.Á·,Ëü¿,UR Call sites for this function may not compile pre-1.61; if this still happens, useÁü™-41 [`Yoke::attach_to_cart_badly()`] and file a bug.ÁÒ-ËtÚ- # ExamplesÁí-Ë<õ-Ǭ.ªÀ´›.ÇÀܶ.åÀüÖ.7‰Áü’/!ÉÁü¸/KóÁ<ˆ0ÆÂ”0Ëüœ0IáÂüê05³Ãü¤1OñÃüø15ÉÄü²2>‡ÅTõ2ÍÅ,„3ßÅŽ3Ëü–3B? let yoke: Yoke<Cow<str>, _> = load_object("filename.bincode");ÁüÝ3'°Æü‰45àÆ<Ã4ÇÏ4Ëü×4;8 Write the number of consumed bytes to a local variable:Á—5Ë<Ÿ5Ǭ«5ªÀ´Å5ÇÀÜà5åÀü€67‰Áü¼6!ÉÁüâ6?< # Rc::new([0x5, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0, 0, 0])Á<¦7ÆÂ²7Ëœº7 fn load_object(Á¼Ò7 filename: &str,Áüî752 ) -> (Yoke<Cow<'static, str>, Rc<[u8]>>, usize) {Áü¨85³Ãüâ8$! let mut bytes_remaining = 0;Áü‹930 let bytes_remaining = &mut bytes_remaining;ÁüÃ9GD let yoke = Yoke::<Cow<'static, str>, Rc<[u8]>>::attach_to_cart(Á|: rc,ÁÜ£: |data: &[u8]| {ÁüÃ:EB let mut d = postcard::Deserializer::from_bytes(data);Áü;EB let output = serde::Deserialize::deserialize(&mut d);Áü×;?< *bytes_remaining = d.finalize().unwrap().len();Áü›<.+ Cow::Borrowed(output.unwrap())ÁtÎ< },ÁTá< );Áüð<  (yoke, *bytes_remaining)Á,•=ßÅŸ=Ëü§=C@ let (yoke, bytes_remaining) = load_object("filename.postcard");Áüï='°Æü›>5àÆüÕ># assert_eq!(bytes_remaining, 3);Á<ý>Çt?·6‚«ø5šÚŸŸšß« Ÿ? ‚«  
be valid.ÁüÓVJG For example, if you're working with a `Yoke<Cow<'static, T>, C>`, thisÁü¢W# will return an `&'a Cow<'a, T>`ÁÊWËlÒW’¿äWË\ìW—À¬üWªÀ´–XÇÀܱXåÀüÑX7‰ÁüY!ÉÁü³YKóÁ<ƒZÆÂ,Zü™ZKH # fn load_object(filename: &str) -> Yoke<Cow<'static, str>, Rc<[u8]>> {ÁüéZ74 # let rc: Rc<[u8]> = load_from_cache(filename);Áü¥[QN # Yoke::<Cow<'static, str>, Rc<[u8]>>::attach_to_cart(rc, |data: &[u8]| {Áüû[@= # Cow::Borrowed(bincode::deserialize(data).unwrap())ÁdÀ\ # })Á<Ñ\ÆÂÝ\Ëüå\C@ // load_object() defined in the example at the top of this pageÁü­]B©Ôüô]$! assert_eq!(yoke.get(), "hello");Á<^Ǿ^¯ ¯ø5 ¯±6¯ÂªÂ^ª
®±6·6$Ê^ü•a ü¢_(% Get a reference to the backing cart.ÁÏ_Ëü×_XU This can be useful when building caches, etc. However, if you plan to store the cartÁü´`\Y separately from the yoke, read the note of caution below in [`Yoke::into_backing_cart`].Ádœa ø5 ·6ª ©aª
°±6·6$ªaü‚n#üÖa@= Get the backing cart by value, dropping the yokeable object.ÁbËü£b]Z **Caution:** Calling this method could cause information saved in the yokeable object butÁü…c[X not the cart to be lost. Use this method only if the yokeable object cannot contain itsÁ¤åc own information.ÁþcËl†d’¿˜dËü dYV Good example: the yokeable object is only a reference, so no information can be lost.ÁþdË<†eÇœ’e use yoke::Yoke;ÁªeËü²e&# let local_data = "foo".to_owned();ÁüÝeKH let yoke = Yoke::<&'static str, Box<String>>::attach_to_zero_copy_cart(Áì­f Box::new(local_data),Á4Ïf );ÁüÚf# assert_eq!(*yoke.get(), "foo");ÁgËÄŠg // Get back the cartÁü§g(% let cart = yoke.into_backing_cart();ÁôÔg assert_eq!(&*cart, "foo");Á<÷gǃhËü‹h@= Bad example: information specified in `.with_mut()` is lost.ÁÐhË<ØhÇÌäh use std::borrow::Cow;Áœ‚iÄúšiËü¢i&ëú”Íi let mut yoke =ÁüäiIF Yoke::<Cow<'static, str>, Box<String>>::attach_to_zero_copy_cart(Áü²j! Box::new(local_data),ÁTØjÅÜüçj" assert_eq!(yoke.get(), "foo");ÁŽkËü–k  // Override data in the cartÁÌ»k yoke.with_mut(|cow| {ÁüÙk# let mut_str = cow.to_mut();ÁÄl mut_str.clear();Áüžl  mut_str.push_str("bar");Á<Ãl });ÁüÏl" assert_eq!(yoke.get(), "bar");ÁölËÄþl×üü›m(øüüÈm)& assert_eq!(&*cart, "foo"); // WHOOPS!Á<ömÇŒ‰nø5·6ªª
±±6·6$nüêyLüÅn74 Unsafe function for replacing the cart with anotherÁoËü‰o<9 This can be used for type-erasing the cart, for example.ÁÊoËdÒo¢\ãoËÔëo - `f()` must not panicÁüŠpTQ - References from the yokeable `Y` should still be valid for the lifetime of theÁìãp returned cart type `C`.Á…qËüq^[ For the purpose of determining this, `Yoke` guarantees that references from the YokeableÁüðqb_ `Y` into the cart `C` will never be references into its stack data, only heap data protectedÁü×reb by `StableDeref`. This does not necessarily mean that `C` implements `StableDeref`, rather thatÁüÁseb any data referenced by `Y` must be accessed through a `StableDeref` impl on something `C` owns.Á«tËü³tgd Concretely, this means that if `C = Option<Rc<T>>`, `Y` may contain references to the `T` but notÁ¤Ÿu anything else.Áü¸u[X - Lifetimes inside C must not be lengthened, even if they are themselves contravariant.Áü˜vWT I.e., if C contains an `fn(&'a u8)`, it cannot be replaced with `fn(&'static u8),Áüôv)& even
fn slice(Áü…)& y: Yoke<&'static [u8], Rc<[u8]>>,Áü³:7 ) -> Result<Yoke<&'static str, Rc<[u8]>>, Utf8Error> {Áüò@= y.try_map_project(move |bytes, _| str::from_utf8(bytes))Á,·ŽßÅ<ÁŽÇÍŽËüÕŽ9òË<›Çü§!䖜ͨ—´åÇÀü€&€ˆïüµ* ó¤äïœÔý bytes_1: &'a [u8],ÁÔœ‘ƒô,»‘ßÅÅ‘ËäÍ‘¿ôüî‘*åôü:†‰üÜ’A> bar.try_map_project(|bar, _| str::from_utf8(bar.bytes_1))Á,¢“ßŬ“Ë,´“ïü¾“5¨öüø“ çöü1‘÷”Ó”Ë÷\ê”æ÷,ú”ïü„•/ˆøü¸•<Áø”ù•Ë÷\æ÷, –ïüª–1®ùüà–-éù\’—æ÷,¢—ïü¬—1ºú|â—ôúüö—8û\³˜ÎûüØ0ãû\ø˜æ÷<ˆ™ÆÂ<”™Ç|§™ø5¤ãê³í³î³Òï³ìð³ñ³ò³ìäs{©¶ÜýùáýñÚòùóñòóáÍþ ·™Àä º™©â‘ ½™ôÀ•þô¤ú™õ¤ã±6õŠÐ6Ñ{·Ë…YÚ õ†3ü›šõ¤ãÙ’ê³í³î³Òï³ìð³ñ³ò³ìäs{©¶•þõ‘ü‚›&
ð±6·6•þ¤ã‘$À™þ Æ™EHKNHKþ™Ÿšü‚¢¿ü ŸJG This is similar to [`Yoke::try_map_project`], however it does not moveÁüïŸR¿€Æ ËüΠa§ü´¡I’‚´‰¢ùƒ‚„ê³í³î³Òï³ìð³ñ³ò³ìäs{©¶‡„ùá¸÷ýøÚùùúùúø÷á…… §¢—… ª¢©â’— ­¢ûÀÀ„û¤ñ¢Åçl’£ü‚„ ¸±6üŠÐ6Ñ{·Ë…YÚ ü†3ü¬£ü‚„¿˜ê³í³î³Òï³ìð³ñ³ò³ìäs{©¶À„üÂ’—üš¤&
ö±6·6¸À„‚„’—$·¢þ ½¢, ¢behkehõ¢°£üÖª³ü¨PM This is similar to [`Yoke::map_project`], but it works around older versionsÁüò¨NK of Rust not being able to use `FnOnce` by using an explicit capture input.ÁüÅ©B? See [#1061](https://github.com/unicode-org/icu4x/issues/1061).ÁŒªËü”ª=: See the docs of [`Yoke::map_project`] for how this works.Áüݪ!ø5±6ÂüŠÐ6Ñ{·Ë…YÚ †3•þÂÜýáýþÿþÿáÍþ ÿª©âü ‚«À•þ¤ô¬
ý±6·6•þü$Ž«captureÁ<œ«þ °«jlegø¬·«üú³éü³±WT This is similar to [`Yoke::map_project_cloned`], but it works around older versionsÁü²Nïšüâ²BÇ›©³Ëü±³DA See the docs of [`Yoke::map_project_cloned`] for how this works.Áü´(ƒ ƒø5ü ƒ±6ÂüŠÐ6Ñ{·Ë…YÚ †3•þÂÜýáý,ª´áÍþ ±´¡Ÿ ´´À•þ¤´¶ÅçlÕ¶
±6·6•þü$Ç´îž<Õ´þ é´rthjln¸¶ð´ü¬½ÐüĺTQ This is similar to [`Yoke::try_map_project`], but it works around older versionsÁü»Nïšüð»BÇ›·¼Ëü¿¼A> See the docs of [`Yoke::try_map_project`] for how this works.Áü³½%ø5ü±6ÂüŠÐ6Ñ{·Ë…YÚ †3ê³í³î³Òï³ìð³ñ³ò³ìäs{©¶•þ‘ðáýŠùŠáÍþ Ù½¡Ÿ ܽ˜’ ß½ŒÀ•þŒ¤ç¿
ˆ±6·6•þü‘
the cart.ÁÊÐËüÒÐ\Y If access to the old [`Yokeable`] `Y` is sufficient to produce the new [`Yokeable`] `P`,Áü³ÑXU then [`Yoke::map_project`] should be preferred, as `map_with_cart` places additionalÁäÒ constraints on the cart.Á±ÒËü¹Ò_\ This can be used, for example, to transform data between two formats, one of which containsÁtÓ more data:Á°ÓË<¸ÓÇüÄÓ!ä–œêÓ¨—´‚ÔÇÀ,Ôïü§Ô\Y // Both structs have `first_line`, which won't need to be recomputed in `map_with_cart`.ÁüˆÕ0- // They also safely implement `Yokeable<'a>`Á¤½Õ struct Foo<'a> {ÁüÖÕ$! first_line: Option<&'a str>,Á,ÿÕߍ‰Öïœü¢Ö$€·üËÖ# last_line: Option<&'a str>,Á,óÖßÅýÖË”…× fn foo_to_bar(Áüœ×)& foo: Yoke<Foo<'static>, Rc<str>>,ÁüÊ×&# ) -> Yoke<Bar<'static>, Rc<str>> {Áüõ×'$ foo.map_with_cart(|foo, cart| {ÁŒ¡Ø Bar {Áü·Ø+( first_line: foo.first_line,ÁüçØ41 last_line: cart.lines().next_back(),Ál Ù
T²ÙÍÅ,ÁÙßÅËÙË”ÓÙ fn bar_to_foo(ÁüêÙ)& bar: Yoke<Bar<'static>, Rc<str>>,Áü˜Ú&# ) -> Yoke<Foo<'static>, Rc<str>> {ÁüÃÚ" bar.map_project(|bar, _| {ÁŒêÚ Foo {Áü€Û+( first_line: bar.first_line,Ál°Û׺TÂÛÍÅ,ÑÛßÅÛÛË,ãÛïüíÛ52 # unsafe impl<'a> Yokeable<'a> for Foo<'static> {Áü§Ü  # type Output = Foo<'a>;ÁüÌÜ1. # fn transform(&'a self) -> &'a Foo<'a> {Á”‚ÝË÷\™Ýæ÷,©Ýïü³Ý/, # fn transform_owned(self) -> Foo<'a> {ÁüçÝ<Áø”¨ÞË÷\¿Þæ÷,ÏÞïüÙÞ1. # unsafe fn make(from: Foo<'a>) -> Self {Áüß-éù\Áßæ÷,ÑßïüÛß1ºú|‘àôúü¥à8û\âàÎûüòà0ãû\§áæ÷<·áÆÂ,ÃáïüÍá5¨öü‡â çöü¬â1‘÷”ââË÷\ùâæ÷,‰ãïü“ã/ˆøüÇã<Áø”ˆäË÷\Ÿäæ÷,¯äïü¹ä1®ùüïä-éù\¡åæ÷,±åïü»å1ºú|ñåôúü…æ8û\ÂæÎûüÒæ0ãû\‡çæ÷<—çÆÂ<£çÇlõçø5¤ãÜýýšÚšÍþ ƒèÀä †èœÀ•þœ¤¸è¤ã±6 ÚÎüÙè¤ã•Æ•þÂÜÅéØÎ<€ê
±6·6•þ¤ã$‰èþ èÁÃÅǼèÝèüòòÐü£îYV This is similar to [`Yoke::map_with_cart`], but it does not move [`Self`] and insteadÁüï>; clones the cart (only if the cart is a [`CloneableCart`]).ÁÄïËüÌïKH This is a bit more efficient than cloning the [`Yoke`] and then callingÁüœð\Y [`Yoke::map_with_cart`] because it will not clone fields that are going to be discarded.ÁýðËü…ñ\ü±üæñ[X then [`Yoke::map_project_cloned`] should be preferred, as `map_with_cart_cloned` placesÁüÆò'$ additional constraints on the cart.Á¤ùòùƒ‚„‡„¸Ÿý Ú¡ Ÿ¡…… •ó—… ˜ó¢ÀÀ„¢¤Ñ󣂄 ¸±6£Â £ÚÎüò󎣂„ÍÀ„£ÂÜåôÅçlõØÎ<ºõ
ž±6·6¸À„‚„$¢óþ ¨ó,ŽóÞàâäÕóöóüëÿ·ü ùRO This is similar to [`Yoke::map_with_cart`], but it can also bubble up an errorÁ´÷ù­‡’úËüšú\ü±üûúUR then [`Yoke::try_map_project`] should be preferred, as `try_map_with_cart` placesÁüÕû'ÃÊüË<‰üÇ´•üÇÀ¬°üªÀüÊü&€ˆ,õüïäÿü // Implements `Yokeable`Áü ý+( type P<'a> = (&'a str, Option<&'a u8>);ÁÐýËlØý¼ˆüêý)Óˆü˜þ85 ) -> Result<Yoke<P<'static>, Rc<[u8]>>, Utf8Error> {ÁüÕþ0- y.try_map_with_cart(move |bytes, cart| {ÁüŠÿ74 Ok((str::from_utf8(bytes)?, bytes.first()))ÁTÆÿÍÅ,ÕÿßÅ<ßÿÇŒòÿø5¤ãðý¥Ú¦ù§¥§¦Íþ „€Àä ‡€˜’ Š€¨À•þ¨¤Ç€©¤ã±6©Â ©ÚÎü耩¤ã±Õê³í³î³Òï³ìð³ñ³ò³ìäs{©¶•þ©Â‘üÔ&ØÎ<š‚
¤±6·6•þ¤ã‘$þ “€!$'*-0Ë€ì€ü ‹íü†]Z This is similar to [`Yoke::try_map_with_cart`], but it does not move [`Self`] and insteadÁü¤‡>µÇç‡Ëüï‡K‰Èü¿ˆ`] [`Yoke::try_map_with_cart`] because it will not clone fields that are going to be discarded.Á¤‰Ëü¬‰[X If access to the old [`Yokeable`] `Y` is sufficient to producethe new [`Yokeable`] `P`,ÁüŒŠ\Y then [`Yoke::try_map_project_cloned`] should be preferred, as `try_map_with_cart_cloned`ÁüíŠ.+ places additional constraints on the cart.Áħ
Ëü‰
qn With this terminology, [`Yokeable`] exposes ways to cast between `Self<'static>` and `Self<'a>` generically.Áüû
]Z This is useful for turning covariant lifetimes to _dynamic_ lifetimes, where `'static` isÁüÙ *' used as a way to "erase" the lifetime.Á Ë ¢\ Ëü™ b_ This trait is safe to implement on types with a _covariant_ lifetime parameter, i.e. one whereÁüü \Y [`Self::transform()`]'s body can simply be `{ self }`. This will occur when the lifetimeÁüÙ
da parameter is used within references, but not in the arguments of function pointers or in mutableÁü¾;8 positions (either in `&mut` or via interior mutability)ÁúËüþ[X This trait must be implemented on the `'static` version of such a type, e.g. one shouldÁüÚA> implement `Yokeable<'a>` (for all `'a`) on `Cow<'static, T>`.ÁœËü LI This trait is also safe to implement on types that do not borrow memory.ÁíËüñQN There are further constraints on implementation safety on individual methods.ÁÃËäÇ # Implementation exampleÁäËüèWT Implementing this trait manually is unsafe. Where possible, you should use the safeÁüÀ_\ [`#[derive(Yokeable)]`](yoke_derive::Yokeable) custom derive instead. We include an exampleÁü OL in case you have your own zero-copy abstractions you wish to make yokeable.ÁðË—ÀÌ€ # use yoke::Yokeable;ÁÜšåÀÔ¶ # use std::{mem, ptr};Á¤Ñïœüæì†µ¼¤ÛßÅÂËüÆ30 unsafe impl<'a> Yokeable<'a> for Bar<'static> {Áôú type Output = Bar<'a>;Áü™/, fn transform(&'a self) -> &'a Bar<'a> {ÁüÉ:7 // covariant lifetime cast, can be done safelyÁ„„
selfÁL•ŸËü£-* fn transform_owned(self) -> Bar<'a> {ÁüÑ:Äÿ„Œ†€Lž€§Ëü«/, unsafe fn make(from: Bar<'a>) -> Self {ÁüÛ+( unsafe { mem::transmute(from) }ÁL‡ž€Ëü•/, fn transform_mut<F>(&'a mut self, f: F)Á
whereÁüÓ63 F: 'static + FnOnce(&'a mut Self::Output),Áü”NK unsafe { f(mem::transmute::<&mut Self, &mut Self::Output>(self)) }Áž€ßÅÇÀ®ÁÀÁ–\üû°1ž\À–\#æ…–\.æ…ÃÄÅÆÂÃÄÅÆ©âž\®Â„€³†®«†ȆÆÄÃÅ|€ü¨SP This type MUST be `Self` with the `'static` replaced with `'a`, i.e. `Self<'a>`Á4…ÀÀüã+ü–PM This method must cast `self` between `&'a Self<'static>` and `&'a Self<'a>`.ÁëËÜó # Implementation safetyÁËü›RO If the invariants of [`Yokeable`] are being satisfied, the body of this methodÁüòXU should simply be `{ self }`, though it's acceptable to include additional assertionsÁ if desired.ÁLæ ®ž\ ®³†ÀÀ
Þ\®üÙ!)ü”HE This method must cast `self` between `Self<'static>` and `Self<'a>`.ÁáËÜéâ‡Ëü‘ R‘ˆüè Xìˆ|Å!̉|Ü!ž\³†ÀÀ
Äž\®$ì!üö$+üˆ"?< This method can be used to cast away `Self<'a>`'s lifetime.ÁÌ"ËdÔ"¢\å"Ëüí"VS The returned value must be destroyed before the data `from` was borrowing from is.ÁÈ#ËÜÐ#â‡ð#Ëüø#RO A safe implementation of this method must be equivalent to a transmute betweenÁüÏ$" `Self<'a>` and `Self<'static>`Á$€%³†ž\ÀÀ
Åž\®ï$…%üêJ¿ü§%XU This method must cast `self` between `&'a mut Self<'static>` and `&'a mut Self<'a>`,Á¼„& and pass it to `f`.Á &Ëܨ&â‡È&ËüÐ&_\ A safe implementation of this method must be equivalent to a pointer cast/transmute betweenÁü´'@= `&mut Self<'a>` and `&mut Self<'static>` being passed to `f`Áù'˼( # Why is this safe?Á(Ëü¥(PM Typically covariant lifetimes become invariant when hidden behind an `&mut`,Áüú(LI which is why the implementation of this method cannot just be `f(self)`.ÁüË)gd The reason behind this is that while _reading_ a covariant lifetime that has been cast to a shorterÁü·*XU one is always safe (this is roughly the definition of a covariant lifetime), writingÁü”+]Z may not necessarily be safe since you could write a smaller reference to it. For example,Áüö+c` the following code is unsound because it manages to stuff a `'a` lifetime into a `Cow<'static>`ÁÞ,ËÄæ, ```rust,compile_failÁ܃-åÀÌ£-’ý„Á-
struct Foo {Á¤Ö- str: String,Áüï- cow: Cow<'static, str>,Á,“.ßÅ.Ëü¥.&# fn unsound<'a>(foo: &'a mut Foo) {ÁüÐ. let a: &str = &foo.str;Áüô.=: foo.cow.transform_mut(|cow| *cow = Cow::Borrowed(a));Á,¶/ßÅ<À/ÇÌ/ËüÔ/da However, this code will not compile because [`Yokeable::transform_mut()`] requires `F: 'static`.Áü½0`] This enforces that while `F` may mutate `Self<'a>`, it can only mutate it in a way that doesÁü¢1fc not insert additional references. For example, `F` may call `to_owned()` on a `Cow` and mutate it,Áü2^[ but it cannot insert a new _borrowed_ reference because it has nowhere to borrow _from_ --Áüð2jg `f` does not contain any borrowed references, and while we give it `Self<'a>` (which contains borrowedÁüß32/ data), that borrowed data is known to be validÁ4Ëüž4ZW Note that the `for<'b>` is also necessary, otherwise the following code would compile:Áý4ËÄ…5Á—Ü¢5åÀÌÂ5’ýœà5¨—,ø5ïü‚6* ó¤±6Ê6
num: u8,ÁÌß6 cow: Cow<'a, u8>,Á,ý6ßŇ7Ëü7/, fn unsound<'a>(bar: &'a mut Bar<'static>) {ÁüÃ7HE bar.transform_mut(move |bar| bar.cow = Cow::Borrowed(&bar.num));Á,8ßÅ,š8ïü¤85¨öüÞ8 çöü
Ýâï†C5Ýâï¢|à„öeüŒW|²IüÄÄÒäkåäåÒÈ ÉâÈ ÌæÀ±6æ¤çç
±6çÂçÚÎü¦"ÊÎì·6ØÎ<€ø5èëüÜ 0ü\Y Construct a [`Yoke`]`<Y, C>` from a cart implementing `StableDeref` by zero-copy cloningÁüð=: the cart to `Y` and then yokeing that object to the cart.Á²ËüºYV The type `Y` must implement [`ZeroFrom`]`<C::Target>`. This trait is auto-implementedÁü˜\Y on many common types and can be custom implemented or derived in order to make it easierÁÔù to construct a `Yoke`.Á˜Ë’¿²Ë¬º Attach to a cart:ÁÔËÇÌèÅþœ†ÄúžËü¦KH let yoke = Yoke::<Cow<'static, str>, String>::attach_to_zero_copy_cart(ÁÔö "demo".to_owned(),Á4• ’ü  Ëü¨ # assert_eq!("demo", yoke.get());ÁÇÄã ·6ø5ãã
è±6·6âº
è<closure_kind>Áé<closure_signature>Áé<upvars>Áééèé±6·6–4 Úα6†3¬ÀB!üà"d!d!v!v!ÌŒD”É!üáI#ü©GEB A type with similar semantics as `Option<C<T>>` but with a niche.ÁïGËüóGJG This type cannot be publicly constructed. To use this in a `Yoke`, seeÁü¾H/, [`Yoke::convert_cart_into_option_pointer`].ÁîHËüòH]Z [`Yoke::convert_cart_into_option_pointer`]: crate::Yoke::convert_cart_into_option_pointerÁ¬ìIkññ¯s ‚J¿sœ’J£0¶ ÓdÑåÙ òó(')´ŠL,ŠLððÎà óîÁ üæ«éÚ0̦LL¦LððŠÐ6Ñ{·Ë…YÚÚ0(ÙIkõõ¯säà`Ú01¿sïà`ãÍD£0öá`öce¸¹º ¸£0 ¹Á`Á`œÃ`è Á]Ä`£ËÁ]Ê­\É:•ºÉÌôÙIô
öÚ0,ÙIþÜœüÊRO A cart that can be one type or the other. Enables ergonomic polymorphic carts.ÁËü¡TQ `EitherCart` enables yokes originating from different data sources and thereforeÁüöUR having different cart types to be merged into the same yoke type, but still beingÁüÌ85 able to recover the original cart type if necessary.ÁËü‰OL All relevant Cart traits are implemented for `EitherCart`, and carts can beÁüÙ&# safely wrapped in an `EitherCart`.ÁËü„EB Also see [`Yoke::erase_box_cart()`](crate::Yoke::erase_box_cart).ÁÊ˵ÒÝËǤéÑÉüþ! use yoke::either::EitherCart;Áœ Äú´Ëü¸)& let y1: Yoke<&'static str, Rc<str>> =ÁüâOL Yoke::attach_to_zero_copy_cart("reference counted hello world".into());Á²Ëü¶^[ let y2: Yoke<&'static str, &str> = Yoke::attach_to_zero_copy_cart("borrowed hello world");ÁËü™ MJ type CombinedYoke<'a> = Yoke<&'static str, EitherCart<Rc<str>, &'a str>>;Áç Ëüë QN // Both yokes can be combined into a single yoke type despite different cartsÁü½
63 let y3: CombinedYoke = y1.wrap_cart_in_either_a();Áüô
63 let y4: CombinedYoke = y2.wrap_cart_in_either_b();Á« Ëü¯ ;8 assert_eq!(*y3.get(), "reference counted hello world");Áüë 2/ assert_eq!(*y4.get(), "borrowed hello world");Áž Ëü¢ QN // The resulting yoke is cloneable if both cart types implement CloneableCartÁÄô  let y5 = y4.clone();Áü
2/ assert_eq!(*y5.get(), "borrowed hello world");Á
ÇŽ
ø
ùùøˆ}°§}´™1Q£^Ÿ
áúûýþûüà1™1þÿæ1™1JLPR÷÷
ûà1æ1à1™1÷÷ÌÞÀ÷÷à1Ô Ô ÷÷
þà1æ1Ô Ô æ1™1÷÷¼ßË÷÷æ1( Ñ
Ž

ˆ}x§}wÞà1HÞæ1U™1ƒßƒ©¬±´ƒ» »™1™1 Ñ

ƒà1æ1
H
Ø
Ž

ˆ}Q§}P™1]`eh^bŽ
ˆ
ˆˆ}¬§}«žà1à1¦žæ1æ1¶™1Š Šãæëîäæ¼½ ¼™1 ½™1
Ø

Šà1æ1
î N ã
Ž
Œ
Œˆ}¢§}¡£à1H£æ1U™1ޤŽÓÖÛÞƒ¡ŠŒ8°Ÿ¡¾ ¾™1†3 ã

Žà1æ1ã
( ç
Ž

ˆ}§}à`à1Hà`æ1U™1’á`ÈËÐÓƒ¿ÀÁ ¿™1 ÀÁ`Á`œÃ`è Á]Ä`£ËÁ]Ê­\É:•ÁÉÌ ç

à1æ1
þ4ø
Ù$®†3•˜ÂÃÄÅÆ˜
åX
Œ 0
†3øÝ$Hà †3 †3®Âê
® ëø¹(x¼†3›ê
® Ìø* £›ê†3
˜®ë‹ ¨øûthþ ®†3Ú†3Úšš©â•쌕ì8À•ì ›êøÊ$•ìëì†3àÒ
®•ì þtvÎøÙ$®–3žŸ ¡¢ÂÃÄÅÆ¢ ¡ŸåXŒ 0œœ–3øÝ$Hàà Ö3 Ö3®Âœêœ
Ÿ® ëø¹(x¼–3
 ® Ìø* £ï–3œœ
¡®ë‹ ¨øûthþ ®–3•ì†3œÚ££œ½ìŒÏì8À¤•ì ¤ïøÊ$¤•ìÃñ†3àÒ
¢®•ì þqsÎøÙ$®¦¦¦3§¨©ª«ÂÃÄÅÆ«©ª¨åXŒ 0¥¥¦3øÝ$HàÄ Ä¦3 Ħ3®Â¥ê¥
¨® ëø¹(x¼¦3Ùó¥¥
©® Ìø* £Ùó¦3¥¥
ª®ë‹ ¨øûthþ ®¦3•ì†3¥Ú¬¬¥½ìŒÏì8À­•ì ­ÙóøÊ$­•ì›ö†3àÒ
«®•ì þqsÎøÙ$®¯¯¶3°±²³´ÂÃÄÅÆ±´²³åXŒ 0®®¶3øÝ$HàŠŶ3 Ŷ3®Â®ê®
±® ëø¹(x¼¶3±ø®®
²® Ìø* £±ø¶3®®
³®ë‹ ¨øûthþ ®¶3•ì†3®Úµµ®½ìŒÏì8À•ì ±øøÊ$•ìóú†3àÒ
´®•ì þqsÎøÙ$ ®¸¸Æ3¹º»¼½ÂÃÄÅÆ¼º»½åXŒ 0··Æ3øÝ$HàÆ ÆÆ3 ÆÆ3®Â·ê·
º® ëø¹(x¼Æ3‰ý··
»® Ìø* £‰ýÆ3··
¼®ë‹ ¨øûthþ ®Æ3•ì†3·Ú¾¾·½ìŒÏì8À¿•ì ¿‰ýøÊ$¿•ìËÿ†3àÒ
½®•ì þqsÎøÙ$
®ÁÁÖ3ÂÃÄÅÆÂÃÄÅÆÅÃÄÆåXŒ 0ÀÀÖ3øÝ$HàÇ ÇÖ3 ÇÖ3®ÂÀêÀ
î ëø¹(x¼Ö3áÀÀ
Ä® Ìø* £áÖ3ÀÀ
Å®ë‹ ¨øûthþ ®Ö3•ì†3ÀÚÇÇÀ½ìŒÏì8ÀÈ•ì ÈáøÊ$ȕ죄†3àÒ
Æ®•ì þqsÎøÙ$ ®ÊÊæ3ËÌÍÎÏÂÃÄÅÆÎÌÍÏåXŒ 0ÉÉæ3øÝ$HàÈ Èæ3 Èæ3®ÂÉêÉ
Ì® ëø¹(x¼æ3¹†ÉÉ
Í® Ìø* £¹†æ3ÉÉ
Î®ë‹ ¨øûthþ ®æ3•ì†3ÉÚÐÐɽìŒÏì8ÀÑ•ì ѹ†øÊ$Ñ•ìûˆ†3àÒ
Ï®•ì þqsÎøÙ$ ®ÓÓö3ÔÕÖרÂÃÄÅÆØ×ÕÖåXŒ 0ÒÒö3øÝ$HàÉ Éö3 Éö3®ÂÒêÒ
Õ® ëø¹(x¼ö3‘‹ÒÒ
Ö® Ìø* £‘‹ö3ÒÒ
×®ë‹ ¨øûthþ ®ö3•ì†3ÒÚÙÙÒ½ìŒÏì8ÀÚ•ì Ú‘‹øÊ$Ú•ìÓ†3àÒ
Ø®•ì þqsÎøÙ$
®Ü܆4ÝÞßàáÂÃÄÅÆßáàÞåXŒ 0ÛÛ†4øÝ$HàÊ Ê†4 ʆ4®ÂÛêÛ
Þ® ëø¹(x¼†4éÛÛ
ß® Ìø* £é†4ÛÛ
à®ë‹ ¨øûthþ ®†4•ì†3ÛÚââÛ½ìŒÏì8Àã•ì ãéøÊ$ã•ì«’†3àÒ
ᮕì þqsÎøÙ$®åå–4æçèéêÂÃÄÅÆêèçéåXŒ 0ää–4ø Ý$H àË Ë–4 Ë–4®Âä êä
ç® ëø ¹(x ¼–4Á”ää
è® Ìø ™* £Á”–4ää
é®ë‹ ¨ø ûth þ ®–4•ì†3äÚëëä½ì ŒÏì8 Àì•ì ìÁ”ø Ê$ì•샗†3à Ò
ꮕìþ qs Îø!Ù$®îî¦4ïðñòóÂÃÄÅÆóñòðX!Œ 0! íí¦4ø"Ý$H"àÌ Ì¦4 ̦4®Âíí
ð®ø"¹(x"¼¦4™™íí
ñ®ø"™*™™¦4íí
ò®ë‹ø"ûth"þ ®¦4•ì†3íÚôôí½ìÏì8"Àõ•ì õ™™ø"Ê$õ•ìÛ›†3à"Ò
ó®•ì "—þ"qsø#Ù$®÷÷¶4øùúûüÂÃÄÅÆùüúûX#Œ 0# öö¶4ø$Ý$H$àÍ Í¶4 Ͷ4®Âöö
ù®ø$¹(x$¼¶4ñöö
ú®ø$™*ñ¶4öö
û®ë‹ø$ûth$þ ®¶4•ì†3öÚýýö½ìÏì8$Àþ•ì 
°øµ!Nšª¿ÄÊÏá±ãKRc<[u8]>Á
alloc::rc::RcÁ alloc::rcÁÓ Yoke::get()Á Yoke::getÁalloc::boxed::BoxÁ alloc::boxedÁRc<T>Á
alloc::borrowÁŸ»¬»Óø° Option<T>ÁÑ»Box<T>Áï»…¼alloc::borrow::CowÁ¥¼Ÿ» std::syncÁμÑ»https://docs.rs/zerovecÁâ¼ï»á Cow<'a, str>Áþ¼¥¼std::sync::ArcÁ¡½μZeroVecÁÀ½â¼¯.get()Á
Yoke<Y, C>Áò½þ¼áArc<T>Á¾¡½¾»³¾À½¯á»оÛ¾ò½á–¼û¾¾¬»¾»³¾Ó¯Žá»оÛ¾…¼–¼û¾*std::ptr::read_unalignedÁstd::ptrÁSelf::into_rawÁ¡"Self::drop_rawÁö&Yoke::convert_cart_into_option_pointerÁ-crate::Yoke::convert_cart_into_option_pointerÁ¯ crate::YokeÁ´£ÀÀÀ¡"ðÍÀöåÀýÀ¯¨ÁßÁ´£ÀÀÀÍÀåÀ¡"öýÀ¯¨ÁßÁŽ´ßÁcrate::Yoke::erase_box_cartÁYoke::erase_box_cart()Á¯ßÁ´Ã¯ØÃßÁŽ´ÃØÃ¯Yoke::attach_to_cart_badly()ÁYoke::attach_to_cart_badlyÁÓYoke::new_ownedÁYoke:: wrap_cart_in_option()ÁYoke::try_map_projectÁ#1061Á0https://github.com/unicode-org/icu4x/issues/1061ÁYoke::try_attach_to_cartÁ¹ÄÓø°Yoke::new_owned()Áõ"þÄ.https://github.com/rust-lang/rust/issues/86702Á³ÅÍÅ_ŒÆ¹ÄYoke::with_mutÁºÆõ"#86702ÁÛÆ³ÅSelf::wrap_cart_in_either_aÁ_Yoke::try_attach_to_cart()ÁŒÆYokeable::transform_mutÁªÇºÆõ"÷Yoke::map_with_cartÁÈÇÛÆ¯ßÇо_ƒÈ¨ÈƪÇ$stable_deref_trait::CloneStableDerefÁÚÈÈÇæ¯Self::wrap_cart_in_either_a()Áá»оYoke::map_project()ÁƒÈßÇYokeable::transform_mut()Á¨ÈYoke::new_always_ownedÁ®ÉÚÈ(毎Self::wrap_cart_in_either_bÁá»оYoke::map_projectÁ›ÊíÉYoke::with_mut_returnÁ¿ÊãÊ®ÉÑ».map_project()Áá»ÏË›ÊæÔ£ËYoke::into_backing_cartÁñË¿ÊíÉYoke::new_always_owned()ÁãÊSelf::wrap_cart_in_either_b()ÁÀ£ËYoke::attach_to_cartÁÑ»ÏˬÌYoke::try_attach_to_cart_badlyÁáÌñËÍYoke::try_map_with_cartÁ²ÍäÍÑ»¬ÌÎáÌYoke:: wrap_cart_in_optionÁÍYoke::try_map_project_clonedÁÄβÍYoke::attach_to_cart()ÁäÍ Yoke::try_attach_to_cart_badly()Á΄ÏYoke::map_project_clonedÁ®ÏÄÎÛÏÚÄüÏ’Å„Ï×Åì¶Ð®ÏÛÏÚÄüÏÓþÄ’ÅÍÅ×ŶÐSelf::transformÁ¨È#[derive(Yokeable)]Áyoke_derive::YokeableÁÃSelf::transform()Á¿Ê¨È×ÑõÑÿÊÒ(±Ò¨ÈÆ×ÑõÑÀÒÿʱ҆C
†C5¯¯Ž†C¯ÀÔ
ªJýþޣÞÉôñú÷Ä ÞáæòJ©K·J®JÞK¨â©âåâÔ ªJýþޣÞÉôñú÷Ä ÞáæòJ©K·J®JÞK¨â©âåâÔìªJýþޣÞÉôñú÷Ä ÞáæòJ©K·J®JÞK¨â©âåâÀìÔªJýþޣÞÉôñú÷Ä ÞáæòJ©K·J®JÞK¨â©âåâÀªJýþޣÞÉôñú÷Ä ÞáæòJ©K·J®JÞK¨â©âåâì×ó5$ÔÂU´ÊUŒ"Å$nÃ$ ÔUC»ß»ð½ÃŽ#ÝTËU›ÌÛñ€M:ôØÔ¾É…éz;v?–ù2:éxõaiCïý/¿‚‡ ¢±"D¸¿âƒÈx-úìåÈÑ‰Û Ô2ëbnMX=»”ÞÀì‹7’N„Ï%¦Ô»~ñÔCXËäZgãŒvŒBh ¬|äÃÅò~ãY9#°…<¢¾Õ„g+÷C(¯ZdJÛÔ£µ$YûÓQ5*+¾”rV,7–ëS*0׿×ç©lÊΨ2w¼éj"±I™£³K¨2ð }ãå'Ê'%½
&döÁÜ·–ù­¡ !¥¾—Æ["ÇŽoäü#C“8{™q7ZD?Ãì„(
žÒœã9×QÐ/.h=3~&¢¤ÕQ0¶6>Súȳc2Ý=»v6Xr/ë4O¢‘·“OÆ4öA
NElƒ7!¿Âî‡K½NÞNÖÇD馋ñ¼µ»,h¤÷'Žqn`û¡+¼»‚"¿p}}õ¶@Ë#4xU.Ê] !×Y¡ÂRÿÙk§7*û/ReƒSë°,ÔˆœsM¬fÒÂú»®g |·oát¸­ý?™jšz”
ÉGf5fãÌ’®‘=WLJUθŒª›»ë?Aîvª¬«1Y`iñÍÃäÐCƽBOËR¶ÉÇG_üÏ!/2HX#D˜mS“êâø×G®UòSF ˆˆ 4d…®ƒQÙØúúþ¾¹¨¬ÑƒW&ë°ž‘‡IUŽa¹×ÛÊ3 âã £õKm#â¿dwîˆa.pâ”ì‡6ºF xÊîî 4Q ç>2\®Q;
…osýQ %IÜy½b1ž6êÅ­V¨Û*åGaQUøH`ÄZžxÒºËØð¸=ŒPÚÃFÿÚ<º™‡I@b]0m<Qp¹Òúž,°¦áÞÝþg­rd~² à'(â5šÉ5W2 tB&³‹Éé[dý[¹c:¼ß&‡»–ÜQUÙ˜w®"FqUßß}>º/ÞPrêE·C‚âH¤NµäS²­/•6QÇ|‚ÏŸÚï÷}«45d¤ŒÙ‰Žñ‘àèÏ©Mg»Ð Æ»þSµaÀ¸Ì8Y²û£~ý­Õ Ú¥Ú“T ªcï…,ûûWíyûÜ}& ´5+óG.»JèTðhÀϡʸ8žœÔV€cBälÐV ñýq ÞúŽ}òo¥ÔÖºÝLYä1ÿR OV`ô 7à¤ã^ŠiJÚìûÑÆC¶ÿã_#¸¯-ø¶Z¼"¾É`=þ”ÎYrÿZ)9òŸíLze¥KÛÎób§ö-b‘7è=OxÁhÊ?Ò} äËË H=rœÃò!ÙÍë‚«s*kˆUW-ô* üXÛÝŸóÉC-L[ÇÄéì1 –
»Wí•9”bíÎE)S×ã9ZcÁ™A½óE` ¿?Ý)`á×ýí%®8ë>Œ†R"ÇÂéR¤Üb—RÊ»Ê “Ft þ ÌþûK-Y#ŽÏzbÙ*
wu+šð±|ì>™ìÁ èôBÜ伂—…úšÜD‡\·€¥ ¾¥ Û¹(Á¦òD7ßVx\‡å·^ÞﺣÒËþt€‡œhy¬m‹cºw½-E­ç韹÷Wó]<aÕXâöᵚ(r=ž÷¥[9¼ðſљe‚eçœ%b”È®»üs\p]Ô%ΠÆ^ÞA·[ÑîRv
È^)px1¡i"±@àw»WmxøÜ‚[º:m̉‹ û=[¢·æP)œÃ'¿fDCÑáqÈ7û´Ë]âci•ž,e&=8ðœ™ÿœaÝÔ^3·Å0ѵŸ!Ù`k Âß³ÊÀõWë-ç¯hnÂpªÅVæIÐÐâ¹°Oˆ_úMÒÐ/YÎ;CdV^:”$ãó“BâÔât íÀ·rLì>%Ö$1)T§ÅÁéˆþšÿ«ªãTöI'ÛtSíÞQXÎxiCà’&ÅfÚ¼¼÷ç„zÖ°…GŸ>\i²}ÈCŸ~hæûœ«¼ÜX)3Çĸf˜`É#9 &E#QšVÇ¢™q¼h0˜ñ{‡yxn²…0 Þ¶/+-g"ù¾U´š^$u2Wf3©2Ó¢E
A $C(f½Ï(¹É<i Ós¬»¶#¡pÅÚ‡ÝEÝO¤Ü¬jOXWÝ&ÆÁmm¼¨¹$’±Y—ñýõñZ}/ÿjˆ¤UÈXÂO £l‚ø¼¹‡jA'Ôkw¦€Km «‰ÓËBŒBYGsÏTÞ0½—1zÙÒ[`Y$yÕ>¤n
/Ä„û³8ÐÄSÓ›õÆo@Í?è4‡>Ó£¥Zg~/,,{¶GP#"Ô†ã`“uï HG ¨Ã>y-wðªÛáOÿ·tÜš˜bë8ε÷Ü[Äòr‡m4O2þN‘ñ³c²¯®^qu%þ-ãTÙT¿ªª
"3ó½RËÇb§së{lÓ´‘ZÓ{½Ä5ƪ™*ÖP·’ #]ð›` ŠˆÏ7‚låFWÜÜrb{˜uB£L?S/ÛÚØŠ*mjücc|e2;è`9,/êÏ÷;álxôOÒ¹ã®ãa6ñ@8ˆ½-j ÿÕütæ $[õ7Qï§_L]¸:@ çÜIœ:–²" HŠ9¶mð;"ésí*¡¼¸úšB®¡B"_GS…åô=´''1ªbi žBZõ®E¸2XS¿ ý<}Á,ÈQ£H1@‰ònzD.Zý6ÁQÿ-B-Úp&lšçZ@4¥\k.² 1@Zw>Æüê{îÖˆ« º}y@gÝA
yÊHÊÜæ…ó;µTØ<—ÎÈLgôÑ·‡T^ãÏMJÓÁÐC7L¥rFr&Æ„‰ó”–…Ü›@ÃæYDƒey£Tâµ~ù{e†k·­7‚ß[ë3@ùÛÑ>ÂE ¦V“îÆ¢J5±kÁ­Æ|[0’õgüÔuÏÑó=DÁæxïèö½B'ÌŸx£üÃá‘Ý„‡ðMg=—ë{W“Ü©2Ê?¸M›§ÀUWSMxÚ½Àâê™ÈÚóß]×&FÄiØ›¨UŽ¡ÁŠf”Zýf©I7†¨$8¨kL, ÍÝ{J3Ñõ$~¦h­ Q˜ ;j.Þàr*%ü˜9kÑü :ÏÒè+ÿ6r¸[ΛÉé´þ(J©E{¡1uRT8Fû)zuD9ÛGhd+º*r»4ºÂ´Ö©&˜D^&9|”8j4±iâ`Ä5«¼NûˆÑ!žô|épö>ÕºõQï×˯ :G¹Þ~Š
M¨„µÇúÊ7yÖhÑ©T
Šÿç­Ývù¼Óríwšæ”2^Ôðë`‹ƒhÕ’é
›WX1Û_ØìŒê¨Œ›ü?°zø- =¡L+ÊùØÛ «„¡ÿSJRs¯øyé_Ý¾ËØDªUùë*Út¡îˆxñA^ŠPؼNdãÞJÏ­ÐÉ`˜ Þl}ÆKÈ ÕÎÑ’wÑ·ß'GT²étÖBŸPÝj³BJ¥¸j†´Eý…ÄÔüíCÖ7¸JÙfëôoRtÞ*¯°5¦’8Švo¡DÍcŒÓY
rò õ W´·‰’=† Ou)^Þ4F"br´mý±öªv ·²ôÊÅ(àáÿ^ò’uKÇpkÝå=[-Mq÷ðµ9«Ñyrb,rÅC»v©0…HŠß®þvdÏw¾`Õòi6|FgDfËá÷¥›¤©±"ùy9ó|pg×Ý~fèˆä¼©ö7ÿkŸb€}B±£ÿXvÓ7Œ­žÄ( BTˆø·ê&8X
vo†xt6âVð€¨X]ŸaÕµR^e(uŽ7>¡Ó®ÔϾhc8sŽš)ÞŠ‚ÛCæjåÕ¡­EøO‘ïÑZïLg83í%]@Ë.=–°%“ö>pÁì—F[ ÞÚ w÷òZ­ºõ›wÌ (<@RÞ¢÷¿ž¼?3€ÔÙ¤ƒ¹‡ µœÜÀ9ô!ª‘Ý_‚"!â±}ZB±ñ3žá`sc¶ä'j¼°­’§©çiJerØ6óGî´ò rœçòÌÂÜNÎ+GSÀé
¶2H¾ }óJÞ㺶Ñþ©L?m TÑÕ¸ˆâ’ÂçÊfv¡æ’¢Š…F®•«.Ÿá˜_¶
Ë`
É3—O^2IÙ[ÕÎ0Nsº–;ìÑÏåãdPHÎápÚÖQ2êåsªµ5É€H:÷#A¦þgx’úRésÅ£`ç!Oûm6b#¹`mÝOÎê\m€)"µggX>HZïŸð„ä œ&Æ H\>íM#a^ùhïÝ®Í\šCb©•2ì!ŒÁA–â@•Ûí3¼¥èéaÙrÃ…ìÙ8Hë¶ÛáYŸ÷Œ¯àr_|(Ùòˆ²jÕßZTþlÎÆ;„K[g‰ë²dœVè·V P>#½P ÂL—ÌRp±À³ƒ‰êñqYe¸›•A–Þ¦Âe”S 1`Wg®BNž›?~¸ò29†o[ŠÏ’Úe‹k4BP¨«ð!ÃÚÊ¥›6I½ó—ƒcü3$j>ÔµÀä#¿R˜8ñWï¢VG«@¹°¨ûÞ‡z÷¥öât7mÉ‚tT=¥èú×!žÀo¿‚wTSL`RAFTE?âdæMŽç;õváðäZ”´Îã>{Ï>€è¥qZ÷e1Б@¨;þEòœ"K5[¯#¿ØgGE
âWg'UWZ†~NœìÁp'†Š.›èÑÌ?£“« üÊøì@e£À•
A‡~ì;&ÐqÈRñ¼!ÐVòØï¢¥ÒÀv”Ÿæg¥²/‘›úß½¥Ôªn:öj•;uáVdL3 oa䌊,SÅ&m22\´E‡?П䢿E½!Xÿ½ jwE69*FóÇ€÷ŽÑ{Þ
g~ÄB!:î&ÜoZ.Æ¢ÈÉ#_eBVUa³_:SÚo>IiãžhõöCåsÊ¡zˆ‘—&‡†™MÑäj¸Ë﹇žÏ“Kc €w]±6”®­×7
ÚÒît„^ò*’oo7f6ÆÊɜ݃"»»o#ªmù›§dÜ¢>šþksèfAí²‡yÄßÏ1Smôn…~ب[¼§ðܹ}!¨WjMkjŽ÷A®øÜß=å„u¶wz9}`¸èzx€6|{IÝNÆ©&qnL{Ãíå|ÂquuC8?›ç&9ÎRĸ\«ûÅ^õþ@—2|)ý9W
ÝAÝeœ¶òNâQçyÇr^¥NŸA]¹Ãþ0²þŽ5¯j·*ô×·aÁf…p_é%Ó¤6©w;FåÖßÏ.N˜ó¯’—/&8eqÜZ7::FçAn<µ&Çøyê!}&¬fwäó¤]3í¾+Õ(yï7ö›ºÏŸŠȯ§ZSøb×^®óoÍsŒÀ7çäÒ‘âZ•!ê±RÓ]Ú%¢)¾ i1@ôœBeï®dEñC°®ó,ИšNÆl1ghÀL¬¥ûh-à `–±[ùRa•`Ö½9OshwÝTwºËܶQîö¶ÙnWIB«>©À š óà›ŸÁé<È:ô°C_”;œþÈOá›Û¾ß$C†¨±*B`Ù½RjkLà°ÛPt5š„þËÒ!ˆßØ¡n,YÄ™7b›68N2[±Å¢7Z¹­Šâõ"·ãŒ×ÃpÊ~Á€’20íº}Æ8¿µ’LdàyùÏÎГXdã=¥s$Ãs¹JóéõÓà²PŸ@k%4 ×ðà^¶Ëj¿™›„±) M0Òq‘
RÏs#÷ždì¦b–Ä–F¡_ô\^ÃvQ8ª$ë)EÌlaS-c‘ÚTwúÊÒ h·ök¢nAŸÃ[Ü9ç“ÎhXÞåOݲw–ZÂa_ÿ QüN>è©¡¦í%T©&=a¶\Ó’£hYUææ·ÈÂr¼ùt6T•Ä„/Ì8´´ý¢ü¢ò ¦¦3Á†„¯—&DøbfæÕ¡M‰;ÜZÓV×<Îí<Q¦ŸüDïš’)a¶ÑÞÚ²#jF¿µÜTö\:ø†ŒØ) šÈ&Ê¥¢)XfBx)<ûI¿ã`ü;ÎÃSh^iå{#31ªI1Ö-1 6
]]ä(,>=@ËCTj V-ôæ
4) 67P7¨7À7488Ð89f9ž9ç9ÿ:@;;Û;.<v<¾<==s>Š>ô>¡?@@ô@
ALAAÐAB0BBÑB.CqCÃCTDÉG÷HbQRkRiSŸS_T}TØTXV8WMdhddEeufDgpÅròsBuÓuzf1{û>‰­Ìm ˜³œ:äŸW¡ê/¡ž©,ªL«Í¯°h°{ °´³´¬A´ä¿E;ÃÊ
Í´ÏþÑÔ`×G ãÞæM ëLïÓïòßóöó
ô#ôu3
ÔsÎQkÃ
X8»Õ:Ò¥¬ ¥#t$"&o&¯&'Á$'¸./(//š/0s0Î0T1Ä1D2¹293ñ3J4f4Ú4$5p5W6°6Ì6@7Š7Ö7¯89$9˜9â9.:;`;|;ð;:<<_=¸=Ô=H>>Þ>·?@,@ @ê@6ABhBBøBBCŽCgDÀDÜDPEšEæE¿FG4G¨GòG>HIpIŒIJJJJoKÈKäKXL¢LîLÇM N<N°NúNFOPxPPQRQžQwRÏRêR\S¥SðSÈT U;U­UöUAVWWËWXóX]Y­YþYÝZJ[[ñ[Ù(
,u-À-,16<=@ËCT`VƯ+ôæm.À-/1677{7¯8N9%;À;c<«<ô<8>t?ó?à@5AøAµBVC²QST$deêf˜uë ¿¡ªÆ¯°