ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙ *bH dZddlZddlZddlZddlmZmZmZmZm Z m Z m Z m Z ddl mZddlmZmZmZmZejeZ d+deded ed eegefd eegefd ef d ZGddZGddeZGddejZe ddZGddejej eZ!de"d efdZ#d,dede e$ded e"fdZ%de"d efdZ&d,dede e$ded e"fd Z'd!ej(d efd"Z)d#ed ej(fd$Z*d%ej(d efd&Z+d#ed ej(fd'Z,e d(d)Z-Gd*d)e!Z.dS)-zJSON (de)serialization framework. The framework presented here is somewhat based on `Go's "json" package`_ (especially the ``omitempty`` functionality). .. _`Go's "json" package`: http://golang.org/pkg/encoding/json/ N)AnyCallableDictListMappingOptionalTypeTypeVar)crypto)b64errors interfacesutilF json_namedefault omitemptydecoderencoderreturnc*t|||||S)a4Convenient function to declare a :class:`Field` with proper type annotations. This function allows to write the following code: import josepy class JSON(josepy.JSONObjectWithFields): typ: str = josepy.field('type') def other_type(self) -> str: return self.typ rrrrr) _TypedFieldrs 2/usr/lib/python3/dist-packages/josepy/json_util.pyfieldrs& Gy& 9 9 99c FeZdZdZdZ ddedededeegefd eegefd df d Z e d ed efd Z d ed efdZ ded dfdZ deegefd dfdZdeegefd dfdZd ed efdZd ed efdZe d ed efdZe d ed efdZdS)FieldaJSON object field. :class:`Field` is meant to be used together with :class:`JSONObjectWithFields`. ``encoder`` (``decoder``) is a callable that accepts a single parameter, i.e. a value to be encoded (decoded), and returns the serialized (deserialized) value. In case of errors it should raise :class:`~josepy.errors.SerializationError` (:class:`~josepy.errors.DeserializationError`). Note, that ``decoder`` should perform partial serialization only. :ivar str json_name: Name of the field when encoded to JSON. :ivar default: Default value (used when not present in JSON object). :ivar bool omitempty: If ``True`` and the field value is empty, then it will not be included in the serialized JSON object, and ``default`` will be used for deserialization. Otherwise, if ``False``, field is considered as required, value will always be included in the serialized JSON objected, and it must also be present when deserializing. )rrrfdecfencNFrrrrrrcp||_||_||_||jn||_||jn||_dSN)rrrdefault_decoderrdefault_encoderr)selfrrrrrs r__init__zField.__init__AsC# ",3OD(( ,3OD(( rvaluec4t|t o| S)zIs the provided value considered "empty" for this field? This is useful for subclasses that might want to override the definition of being empty, e.g. for some more exotic data types. ) isinstanceboolclsr&s r_emptyz Field._emptyKseT***85y8rc:||o|jS)zOmit the value in output?)r,rr$r&s romitz Field.omitUs{{5!!4dn4rkwargsc r|j|j|j|j|jd|}t |di|S)Nr)rrrrrtype)r$r0currents r_update_paramszField._update_paramsYsO|yy     tDzz$$G$$$rrc.||S)z6Descriptor to change the decoder on JSON object field.)rr5)r$rs rrz Field.decoderd""4"000rrc.||S)z6Descriptor to change the encoder on JSON object field.)rr7)r$rs rrz Field.encoderhr8rc,||S)z4Decode a value, optionally with context JSON object.)rr.s rdecodez Field.decodelyyrc,||S)z4Encode a value, optionally with context JSON object.)rr.s rencodez Field.encodepr<rct|trtfd|DSt|tr2t jfd|DS|S)zDefault decoder. Recursively deserialize into immutable types ( :class:`josepy.util.frozendict` instead of :func:`dict`, :func:`tuple` instead of :func:`list`). c3BK|]}|VdSr!r").0subvaluer+s r z(Field.default_decoder..s1MM8,,X66MMMMMMrchi|].\}}||/Sr2rA)rBkeyr&r+s r z)Field.default_decoder..sK222S%$$S))3+>+>u+E+E222r)r(listtupledictr frozendictitemsr*s` rr"zField.default_decoderts eT " " MMMMuMMMMM M t $ $ ?2222#(;;==22233 3Lrc|S)zDefault (passthrough) encoder.r2r*s rr#zField.default_encoders  rNFNN)__name__ __module__ __qualname____doc__ __slots__strrr)rr% classmethodr,r/r5rrr;r>r"r#r2rrrr's.FINS1515II#IItI"C5#:.I"C5#:.I:>IIII9394999[95#5$5555 %s %w % % % %1HcUCZ01W11111HcUCZ01W1111 C C     C C    CC[$CC[rrceZdZdZdS)raSpecialized class to mark a JSON object field with typed annotations. This class is kept private because fields are supposed to be declared using the :function:`field` in this situation. In the future the :class:`Field` may be removed in favor of this one.N)rOrPrQrRr2rrrrs"MMMMrrcfeZdZUdZiZeeefed<dede edeee fddfdZ dS) JSONObjectWithFieldsMetaaMetaclass for :class:`JSONObjectWithFields` and its subclasses. It makes sure that, for any class ``cls`` with ``__metaclass__`` set to ``JSONObjectWithFieldsMeta``: 1. All fields (attributes of type :class:`Field`) in the class definition are moved to the ``cls._fields`` dictionary, where keys are field attribute names and values are fields themselves. 2. ``cls.__slots__`` is extended by all field attribute names (i.e. not :attr:`Field.json_name`). Original ``cls.__slots__`` are stored in ``cls._orig_slots``. In a consequence, for a field attribute name ``some_field``, ``cls.some_field`` will be a slot descriptor and not an instance of :class:`Field`. For example:: some_field = Field('someField', default=()) class Foo: __metaclass__ = JSONObjectWithFieldsMeta __slots__ = ('baz',) some_field = some_field assert Foo.__slots__ == ('some_field', 'baz') assert Foo._orig_slots == () assert Foo.some_field is not Field assert Foo._fields.keys() == ['some_field'] assert Foo._fields['some_field'] is some_field As an implementation note, this metaclass inherits from :class:`abc.ABCMeta` (and not the usual :class:`type`) to mitigate the metaclass conflict (:class:`ImmutableMap` and :class:`JSONDeSerializable`, parents of :class:`JSONObjectWithFields`, use :class:`abc.ABCMeta` as its metaclass). _fieldsnamebases namespacerci}|D]&}|t|di'|D]u\}}t |t r[t |t r.||divrtd|d|d| |||<v|dd|d<tt|dt| z|d<||d<tj||||S) NrY__annotations__zField `z` in JSONObject `z` has no type annotation.rSr2 _orig_slots)updategetattrcopyrLr(rrget ValueErrorpoprIrHkeysabcABCMeta__new__)mcsrZr[r\fieldsbaserFr&s rriz JSONObjectWithFieldsMeta.__new__s] 8 8D MM'$ 266 7 7 7 7$..**0022 1 1JC%'' 1e[11])--0A2"F"FFF([c[[D[[[]]]'mmC00s #,==b#A#A - !& =) * *T&++---@-@ @"B"B +% ){""3eY???rN) rOrPrQrRrYrrTrr^rrrir2rrrXrXs%%N!#GT#u* """@3@tCy@S>@.H@@@@@@rrXGenericJSONObjectWithFieldsJSONObjectWithFields)boundc@eZdZdZedeeeffdZdeddffd Z dedefdZ deeeffd Z deeeffd Z ed e eefddfd Zed e eefdefd Zedeed e eefdefdZxZS)rnaJSON object with fields. Example:: class Foo(JSONObjectWithFields): bar = Field('Bar') empty = Field('Empty', omitempty=True) @bar.encoder def bar(value): return value + 'bar' @bar.decoder def bar(value): if not value.endswith('bar'): raise errors.DeserializationError('No bar suffix!') return value[:-3] assert Foo(bar='baz').to_partial_json() == {'Bar': 'bazbar'} assert Foo.from_json({'Bar': 'bazbar'}) == Foo(bar='baz') assert (Foo.from_json({'Bar': 'bazbar', 'Empty': '!'}) == Foo(bar='baz', empty='!')) assert Foo(bar='baz').bar == 'baz' rcHd|jDS)zGet default fields values.c$i|] \}}||jSr2)r)rBslotrs rrGz2JSONObjectWithFields._defaults..s-   $/D%D%-   r)rYrL)r+s r _defaultszJSONObjectWithFields._defaultss1  36;3D3D3F3F    rr0Nc ftjdii||dSNr2)superr%rt)r$r0 __class__s rr%zJSONObjectWithFields.__init__s;::9dnn..9&9:::::rrZc |j|}n5#t$r(tjd|wxYw|t ||S)zEncode a single field. :param str name: Name of the field to be encoded. :raises errors.SerializationError: if field cannot be serialized :raises errors.Error: if field could not be found zField not found: {0})rYKeyErrorr Errorformatr>ra)r$rZrs rr>zJSONObjectWithFields.encodesr DL&EE D D D,5<rr SerializationErrorr|)r$jobjomittedrsrr&errors rfields_to_partial_jsonz+JSONObjectWithFields.fields_to_partial_jsons%%<--// 1 1KD%D$''Ezz%   1 T5M****1,1LL,?,?D))0111 39@@ %001111 s-B  C)CCc*|Sr!)r)r$s rto_partial_jsonz$JSONObjectWithFields.to_partial_json's**,,,rrc,t}|jD]/\}}|js#|j|vr||j0|r:t jdd |dS)Nz&The following fields are required: {0},) r~rYrLrrrr DeserializationErrorr|join)r+rmissing_rs r_check_requiredz$JSONObjectWithFields._check_required*s%% ))++ - -HAu? -ud'B'B EO,,,  (-8??HHW%%''(( ( ( (rc t||i}|jD]\}}|j|vr|jr |j||< ||j} ||||<G#tj$r.}tjd |||d}~wwxYw|S)zDeserialize fields from JSON.z#Could not decode {0!r} ({1!r}): {2}N) rrYrLrrrr;r rr|)r+rrkrsrr&rs rfields_from_jsonz%JSONObjectWithFields.fields_from_json6s D!!!;,,.. - -KD%d**u*$}t U_--#(<<#6#6F4LL2--- 56[6b6beU7,7,---- sA88B5)B00B5r+c8|di||Srv)r)r+rs r from_jsonzJSONObjectWithFields.from_jsonGs(s00S))$//000r)rOrPrQrRrUrrTrrtr%r>rrrrrr rmr __classcell__)rxs@rrnrns2 $sCx.   [ ;;;;;;;;13131111 S#X$-c3h---- (738#4 ( ( ( ([ (GCH$5#[ 1 - .16=c3h6G1 $111[11111r) metaclassdatacPtj|dS)zJEncode JOSE Base-64 field. :param bytes data: :rtype: `str` ascii)r b64encoder;)rs rencode_b64joserNs" =   % %g . ..rsizeminimumcR tj|}n+#tj$r}t j|d}~wwxYw|Q|st||ks|r:t||kr't jd||S)aDecode JOSE Base-64 field. :param unicode data: :param int size: Required length (after decoding). :param bool minimum: If ``True``, then `size` will be treated as minimum required length, as opposed to exact equality. :rtype: bytes Nz&Expected at least or exactly {0} bytes) r b64decoder>binasciir{r rlenr|)rrrdecodedrs rdecode_b64joserYs1- .. >111)%0001 'c'lld.B.B%/C*-g,,*=*=) 4 ; ;D A ACC C Ns&)AA  Ar&cNtj|S)z;Hexlify. :param bytes value: :rtype: unicode )rhexlifyr;)r&s r encode_hex16rqs!  E " " ) ) + ++rc4|}|C|st||dzks|r)t||dzkrtj t j|S#tj$r}tj|d}~wwxYw)aDecode hexlified field. :param unicode value: :param int size: Required length (after decoding). :param bool minimum: If ``True``, then `size` will be treated as minimum required length, as opposed to exact equality. :rtype: bytes N)r>rr rr unhexlifyr{)r&rrvalue_brs r decode_hex16r{sllnnG 'c'lldQh.F.F%/G*-g,,*A*A)+++1!'*** >111)%0001sA//B>BBcertct|jtjrt dt tjtj|jS)zEncode certificate as JOSE Base-64 DER. :type cert: `OpenSSL.crypto.X509` wrapped in `.ComparableX509` :rtype: unicode z.Error input is actually a certificate request.)r(wrappedr X509Reqrdrdump_certificate FILETYPE_ASN1)rs r encode_certrsU$,//KIJJJ &1dl,, - --rb64derc tjtjtjt |S#tj$r}tj|d}~wwxYw)zDecode JOSE Base-64 DER-encoded certificate. :param unicode b64der: :rtype: `OpenSSL.crypto.X509` wrapped in `.ComparableX509` N) rComparableX509r load_certificaterrr{r rrrs r decode_certrsm1"6#:  ."8"8$:$:;; ; <111)%0001=AA(A##A(csrct|jtjrt dt tjtj|jS)zEncode CSR as JOSE Base-64 DER. :type csr: `OpenSSL.crypto.X509Req` wrapped in `.ComparableX509` :rtype: unicode z&Error input is actually a certificate.)r(rr X509rdrdump_certificate_requestr)rs r encode_csrrsU#+v{++CABBB &9ck++ , ,,rc tjtjtjt |S#tj$r}tj|d}~wwxYw)zDecode JOSE Base-64 DER-encoded CSR. :param unicode b64der: :rtype: `OpenSSL.crypto.X509Req` wrapped in `.ComparableX509` N) rrr load_certificate_requestrrr{r rrs r decode_csrrsm1"6#B  ."8"8$:$:;; ; <111)%0001r GenericTypedJSONObjectWithFieldsTypedJSONObjectWithFieldsc (eZdZUdZeZeed< dZeed< eZ e ee fed< e dde e deede e fd Ze d eeefde dfd Zde eeffd Ze d eeefddfd ZdS)rzJSON object with type.typr3type_field_nameTYPESNtype_clsrc0||jn|}||j|<|S)z(Register class for JSON deserialization.)rr)r+rrs rregisterz"TypedJSONObjectWithFields.registers#"khlls! #rrc||jvr7|j|vr,tjd|j|St |ts'tjd| ||j}n"#t$rtjdwxYw |j|S#t$rtj ||wxYw)z&Get the registered class for ``jobj``.zMissing type field ({0})z{0} is not a dictionary objectzmissing type field) rvaluesrr rr|r(rJrzUnrecognizedTypeError)r+rrs r get_type_clsz&TypedJSONObjectWithFields.get_type_clss #)""$$ $ $"$..1.55c6IJJLLL J$%% ?-077==?? ? Ds*+CC D D D-.BCC C D :9S> ! : : :.sD99 9 :s BB= C C.cL|}|j||j<|S)aGet JSON serializable object. :returns: Serializable JSON object representing ACME typed object. :meth:`validate` will almost certainly not work, due to reasons explained in :class:`josepy.interfaces.IJSONSerializable`. :rtype: dict )rrr)r$rs rrz)TypedJSONObjectWithFields.to_partial_jsons)**,,%)XT !" rcb||}|di||S)zDeserialize ACME object from valid JSON object. :raises josepy.errors.UnrecognizedTypeError: if type of the ACME object has not been registered. r2)rr)r+rrs rrz#TypedJSONObjectWithFields.from_json s;##D))x::(33D99:::rr!)rOrPrQrRNotImplementedrrTr^rrrr rUrrrrrrrrr2rrrrsF  C7!OS!!! ,E4T ?+++3&*%E Fsm/34T/U[:S 1:d;V6W:::[:0 c3h     ;WS#X. ;3N ; ; ;[ ; ; ;rrN)NF)/rRrgrloggingtypingrrrrrrr r OpenSSLr josepyr r rr getLoggerrOloggerrTr)rrrrhrXrm ImmutableMapJSONDeSerializablernbytesrintrrrrrrrrrrr2rrrs NNNNNNNNNNNNNNNNNNNN000000000000  8 $ $BGPT99S939$9SE3J'99A3%*9M9Y\9999$eeeeeeeePMMMMM%MMMA@A@A@A@A@s{A@A@A@H&g&CKabbbl1l1l1l1l14,%8%=l1l1l1l1^//3////HSM4TY0,,#,,,,1118C=1$1SX1111* -d) -c - - - - 1 1 3 1 1 1 1 ,D' ,C , , , , 1s 1t2 1 1 1 1$+7&.I$K$K$K H;H;H;H;H; 4H;H;H;H;H;r