From a03c66710969a713117b2fcdab960ebdef1f3905 Mon Sep 17 00:00:00 2001 From: ghanshyam Date: Wed, 2 Aug 2017 11:33:21 +0300 Subject: [PATCH] Improve stable-api doc with current API state extensions, stevedore and extensions config options are gone and plain router is introduced in Pike. Also this documents was little bit confusing about current and old state of APIs. This commit makes it more clear and reflect the current API state and also describe the evolution of APIs. Change-Id: I6522100a78241400b1ea059a39a32c259fe6ab90 --- .../_static/images/evolution-of-api.png | Bin 0 -> 30325 bytes doc/source/reference/stable-api.rst | 117 +++++++++++++----- 2 files changed, 84 insertions(+), 33 deletions(-) create mode 100644 doc/source/_static/images/evolution-of-api.png diff --git a/doc/source/_static/images/evolution-of-api.png b/doc/source/_static/images/evolution-of-api.png new file mode 100644 index 0000000000000000000000000000000000000000..03d27d38c1ee52b8378e0a895fbf745a93fea471 GIT binary patch literal 30325 zcmY&=WmuL=)Gi^?As`@W(JkF62+~M*cQ;5#N(f4KNOyNhH`4VI(k0z}=EePe=bRt= z+LzBe&pb10R^01eYY3K;5l2TMM1g^UL6`U-ssIB6Uk(EU3qgVdPa?}hh`|3~9Tdcc zVM>OHx4}Q2m{ zcX(tR*fA{RNGt;Zd2q;5`x(SMo}*F*YJOR+&{xXg#t3i}c|>IlW8j!xPL+4~B(-Nnhk`aCdjw zX&=4UuD~4OH`NDY@;C;f3^2W~hq{7Ueot*gz4T!h!hwf@5o}gVX?V$6UUqd9rQx6` zK_$rZ-y}s#o{ARwR0rc8DjjiR;w`g*3tjyr~MABXW zPbvi-yMUMd&9WmleEReMzUoovkouCnhTU`fa_eOElqdqymwyjWwsy>95jU-@jFatfvEUzPs1|30jE==x zCmRqWJo&eiJ>~)Ds;U6mTxYxk@;(@akxuX>IgchI9`(epzd2FL{u|c!_$Fl!hRamc zDbw-4?Vdl0+cPyoRgu|a_)Wo}TlL>qYSo&|Y^x@YAFf}XJ^lCLT-Vv~Sc)F`zgFZe zx^MrD!#OmxZam-G*>0Y!@5B!yecZe$TquqSZvy0t)qHDeo!_&63ztq`t01A@JK`yQ z7q0)`%5hxnZ+_-l^VEo|$O>pA$=36z4*ddn{(Lx}$G2SF3){=xZ%WfCAfZhqv6zx~;oWvQjt?HYKCVpdS(zx8g}gH62#|J3`Rk+#q&UHAUBO-V*FPmnz-2CIK6BShZvWRn2KVdPxz7svc`*Myo>YTA_Ixl_ zFePCB?^z5~hQ%^ky2S6F3qG27X5JiB+IA~wt5ks)|7lU%RR7}6Joq*nA&(wVkhkEs ze@1TJeKh*zdn*JpHvmq%-pOmbn@d)IY9e*MrI#~A@88lT4Y+-#jl0QOPjb)+8dJdYd zp$1M8UQsNq!_CkA!5rlp^Kq3=+bXNw7GRsWo%G!72cvvc7x79{_-5243NWwH9!I!G z$p50P9Y(d<%;zi08j486os6HLKE-)lf+H$QU1<$F%P?n%*FSAKpIK5BhQ*wD^c(MW z{wd=#Vb}w@#qm`iafjDmLuSB!!ZNqW9;MkU2&*zbbuv-Ax)7g+*PSE(jtlCK zSr2;?U9X+4#FQcbW~>Dhsa{Z?YmC zY==woD2zN5^(T~RozlrixR`;}P~~I^|H<;WP!afNVP_reCX`XMXp)bE35dVyS~3B> zY^s}y9Keu#6voyY@K6=%_Dn2J`T~%OAJy#?Ta-ze1h|YVXi&;V4tQKn1KhJPrTNYn zAj#Or2XkUy{|wFc0Uz?(w_H8GP7dmK2JnR+e^hrUtFE}Sb-&wB8pH{koY?4*wH}ft z$7fx8{KONcH?NhgQ%t%zifD?BC{E_{r z$fJ)Ci|c4EPU-R>I*{h|+EkL|&{g%b0?zTgV|$Gq1_7#4VyJg+^E(p(Kpq~#upMIk zQ#p(zWF&7nx_hCL@CnQmh|oxSv3bIYc4E2RUBAZv!VN045kW^2rnDYC)pBN>09dFq zkp5%pEgONB!$Qy@ndoXJwND0Jyr3tu-|Kh^xQ@AM5UMaPY9c+5q3_EvrWOwgcs@|* z^y;a`)im2u*5?aCjm<~W;j?2|BX6VK1NV5go@%M3)wP1XpU~rmXnK~1ug}|4suPZ~ zi8h;Rh&##{_C_bi>5SqYBW;YXx54)I4M*C1OC6_Ow?#WM+HS@ka6&F5s!&Pmn(}HS zO|#?x%Q;Q7LhHEJgZe{j0b8hP{1P0!Yb#X5A88|C*VSlpjt$t=hrX14KtM8xLP)?) zhhvig1rr|F_K(jQi7ksQhom$7n2TQ5*gd%0I|w5|E%6ks*bl6rcdd;;nOY;2_~X99 zW5D+*;ha|!M>J540f&&~sw2Ix`tNzoj}t_JWbLGu&L%SgWltQN;=W>3yGJphI5GuJ zj)K#d-Pfaf0+q9TcmxIr`Nd0~4o7opr5RmJMb}V&zr3hyFCg*?YCngwOR96pDW7kL z3$<@T^i-QIJ(gwcRYYi^Q@$J(c>{HB6K3CPWAdjt4qE9gciScwcam#T0(iJ>m9*g* zJtWGw=YSopod;q=w9ouoIu-Ig4H5^JSe}k5;7ghMrQt(qb&b#YNLx0Wc-17$K&bTuL zyer9so=`4UKlJzskO>Hx6Kl@*>#jN_zb>SGzUZ>~eEmk}Hf4#XrquJeW3%-xz{UH1 z+|Q&UQ+~@VqX6oDhRgfst`|7YB!V9C4I!$?8?jkZ>0}^>F%@6Aj?&M|7ktYa-Tpo; zd`Bj8!6Q>3ZfY~AB1q34oVOyRzXekB$!QxwlKQH$z}IwTc!j8Q7nbV?Vav$f+`q3s zq==r1+Wx4mt(pyDN0uADZw*wrS-)i7H3KMUF&;;79bCNFlGlhF@ZIz13eyd)mgVM{ zlHc{@*y38>~UUB|x=#=haj&k++@zT@>WQDqfhHpV*l|;D6}xJvUtmBNgFwGaJOIXs#ynJgK}+ z)U0<~q=jb}#rcissh$4l5o3&PoWg_Ol*Jmi6eZrR|MuWFd~IXXd>+!fYwE3nWLNrj zM$U45%I)lz&oI<-K81HQ({EsR&sCf?s&vMj7#<0g@)uZ`dAse>|5)8$;R7%Hf!e7t zp7|COOb9B0$Ta6_qYr{@Xnzd^3KlLG~TaPzFu1Bsnm8W6H0V-&oe=Gga&q9q%F*i zcoFp7#ZE|cs>RC0CjW-nlow>0|4MH`X)uPD4yf&$#llGuga#;>VdBK7Q3f&K1<9AQ zkyHOpzk|0^IgKF+C9bM9wcNR+^ds<4>+v-4HVCeNQ^r5Lzp7^UO^fr6T(%gaTl=d0 zAaownWvW?051#4hlRPHD7CQ8py~=?r12I`pugDvu3ksOYmvfW?fAc55%x**($@_pv zRcfiKBi&@MtBBbQ4Xq;|MQO8J6ATF1EMaQgZ+_P8Yyb_+RYWx7U~Hx6FLQga0&hGF zN{OTMK^?*f{MzX=%v?1?45Bh*avFx#T5XT6@qE9k1J8BEpJ+U&E=?7Bca`66rYHRn z-I0N4(jDUY;fPAC_`VNZr9PbF^QLfr;5n<02!01*x|>nQwIQ&Mog;WYs6~&kOObt1 z>U5saM_;<>&xMY?0Xv}U|7GIrR}Rvsp9PZ+NbXR4l1>L5I&}I;(=RPyhDAPbH4`2z zRlw3h=H3M68WuVPAs9E6bCpeofZcIiD{$%ZRGjw*x2{LUr66txEzy(%fce^dQR$3O zuhS0ouk)?pxZMSo?#EvQxQ^syvoK~(&7HMp%NFM{3v)3qY9>06ui?PVzh3=lNBjP3 zN7ubA{GjQu34miWM*fFa@=v>QE+93NGj{(#4zdD4VWyQpGM>soM9Y<$Y%a#w{aUB^ z`xhV{c^GxLn_8G7*lf{)vm-DA;3uuc8;2T%4v+@+@5 z#9U=W1AG~8iM5tS*Wa|yr<#MO(eB#e{h;w%di8Qk*JF7Yc#6_5ZDnF}W8V%!2fR-D zj-eJKTXqglV2O~_C9lOa`C)ud=WOwey}YleJ*R|=zX8s z3ch2_uZDLuCNb}Tb3oueX-xoi(0R1(bxctobmPl%50-E_x^x!Z2NX;0DmjKdwbtrd z%hzI_>@J=v&@t(P1q}8LZ)J!dLilSWCoD* zZbJYpz&Sp1zijo;Xv;u6JWDzDEA{G*Dr>HW2A)O@qSu+=d#C+APG&0$8@4td)5Hmw zpv&P#!|yJOq}a!G8{maN?Z-{HM&*3vgiPJbR%fkUfB3G9)-$mP%zcfPU^S#LHTM!5B&f^4R^$Urd_ZIAaQ%=zWkZqPmLhu@D zJH(9xl^{1bO?-mZ@l;nfhjEW?9{F4x1>y4{-J#PoaLyTlSF$oXP%%I>c)-oQyT7a>1v!}~o_tOX7a%+gnhO#|g8+#|Hz_CZ|JCi2lE2sDFuai;JxXApwzrknJxvy;j& z%7(i|c%gweYhpAuqc$l%Jq6lu>T~yvJQnhc360huq9m1n9wM2VD)$0vM_i6*1_XiC z7CfOBktS51kilq2-(*SsHE}e?h0B&ae*mlw7#1NKDL6GZuF8K=R{3B%%F;m&AW51j z#|)i<6o>}E*rwdu53`xUEERwD1=U09PKVDH*5;j?1lk}*o9aYhMk!&kr_lj_GDo!8 za{mbFq7GU(-OT>>t-zCrzl>&9wAEGZ0hlyez5(Ft3CRlp$-j;5Nf}|Rn^8z68DdUC z$su~q8Fe*)dDWGH&=X}SGTdc7_YD>s>Qe9ef+Ow$W}I7?!#awHz+gXU-Q((Hl0s4} z)o`IC3C7j5FAe%C)!cpxVP8!8a2zNJcoH9~&jKb=RO(uk2luzRkCEj{Ls#c!EvWS2 zvPh<}(KVvFt!$K;B~s66$9Jkx!@>TJS8qjHV+mKp@Yn7jqc#u3CI(XrO1Y!~Jkyd^ zX=Sn;UXqY@cc_uNMsFr?yQ5FCJ3eCuawmTShIJxRxi@zTxqhrJI zl|#Ff;zkcpD^a)UP-HHKaTKQAU^nbxYmnL((TRzPk-F!(7e#h1Y83}{QMM<26`ap3 z4#GVW^i>D3TJC-ouBAfyi%%qEwX9ALUapUjXN{MLJg+_@`p&WA0M>?IuNbV-+2`q>;3S{7(dvIno z$oVuow#Q@fl!hLr0+%}`qIiuFCcy6}&H+DKx9WfXoTAFcfa1uC-P4^~E15I%Vf4uv zfP^DdAmyteleuvEK2J3>ve=&!^(} z=^?L5Lf*pX0czSO@Fl)si+76bmb*Uq1epWdT|!D68#^w}u}Z|Xbc?G& zgU@LC=72LDpfVrOcL4lO@BZ5D0nF?|uDgMQ??$PWtvoe*W`J2>98FutHUHM&W;$6qcFE~%cDtLqwRYy7=%0S4WkjY4e zP8fLW549q-u(PRCUlOP}^F4=%j4#cQ>=${c8KlgvbiUv^zi3A0JC7^9XMsypO(b^{ zSI4>72{p94A}7tLfzAStBZ)Q$JQ6+4t%<;GEc7s;>E(Mo;bu2A10yI&k_E3?e44Y5 z`8A!joZj|8=RP2^OWUTri^@zt!>GBi5FSLbKFWA>z{1KofwN5oAd`*vgGPe8*2FD< ze;59in0wa|zeDJNV{R^D{(V}34{}U@IK1PyfN%&!ZZLvP*sN9;Bv(7}@>`sjlg{1; zu-Xf9+2rpJLK5<$3Y85B76EltO&?3(#~;*uq3m)VgE~4(^V}clEvCDp%STW*aNeIv z$B%XIF(y9w)&NQL0NG4`K}k~`rx3}ywL*Eaq>Cq&R_bEFxkyIq!)GBVoBiq8D+Km^ z9i2M+eveCic$Pb|E7aW9HM7~&cv8-`wa#ETV?DQx zvnT*p;udG50T?v190oHqpqJ*aNK5mUY2r!w%R$aPkan4#YuZ?QHR}>^l6$8nQdp5A zE(F!;->`$MCGfAgQ)j}Qsm3}>+^5!7Xg>{Je@h3oZ>h@2U@gaP3s-x`Q4n11?u=0W@`VO* z#Wi{wNKB7QAjcF82c4*_pxpE8Q14ZP`6C*xbU3su4GQJ;1|DnbP4M)A_EAM)BNXGr z`9jp1dioKbzfKQsUYswZkfCREAj%HrA#JbXvR;&ry$FeI=GrRep^m{7nn5^9B60hwr&|km{s39h{Q2ykNrN zqFUFzqB{LEL8KhNJe(BsmAAoDJ;Pgi&s%GvO4qk_b3Pui$G;7H3Z0Zy7`;?R>oB!U z)oAFm%Dv%HTmEm)!Kiw2=`FJbkIcU*G&H;*zr*&HrQvRI_3utakwe_&#Snj zB*@bT*f-X$jeTnmShj)Iedc7E*6=7v$HK1F|ymtoq$P-dERME z*LmJyCI-(DQo>gLGU3|{A>*^eG*wl4HaiXY8Nh|w`>{R;;(Mt(Z@XZ%+&|E`o%L}5 zbN}H_VcL_km1?9mM=_2nog5yAG$dg;_(DgXa!$R* z0Kh?sr{4hl7}1H>E0%x~O$mwsxcK#bGP|~6>OAiJv;Tplb?gxcT9#);$3nG6}_SZ8nvo^6*Hnp3a zovp61;eBC4sOv3*>MpJ#BrAaposwqwtA>^wf%u%Wo-@7a{@L**TrH^-K*amx+qLvE z$)HG??%{j&6e<1f&3f$KjMo;UHXJ&1)gS$_gwPG(E7v+W`6%K8R$#b=o2J}dlmW|O zj7^jXb-f%&Y`mQhkp`It!cR&8O9+xWC?|XbE9ioYY0rZ5PWW*VKE?Ia6HHT-8Vz>V zR>qo|27@pNBa|S2Jlp4iIFE6eq|buAHRyu^C!)nmJ=HJ4wEa?8KQv8XMr2VaFm#ey zqD6gkfMePE4gy@BUXcpe56F9^?c|Rb)qUD<5ZyCvL=o*+>kK@}ou3 zW0o*bAo5WFiA3>Gn1`$snuVEtN!0~~bDW79H%5BJSDuMRhd59qo#@O1s%#3Yh+$wg z3wQ#RTn1jxhmFeWt2IJ6AM;gu2(y4!q?xuDDBcJ@1Nc7P5Z%Jey@A!Py6luzkmLx+ zJUKn}>Mz4*R>GlG z%!ri!bOu|#1XUkkNK9jh9bp-M8ME`Px1mdyx1#!tcROC##A4!J`^U}|jNjp?q#3L> z&`J3D4B%v?cGF)DP*zm6kFCKAF+h%T1+IzG9=2;Y?H~4nksC8mTZU1Xdi61zL*_ur z_x+WBxEyaPTD#bMJGUzTR>x2cHj1Yud=(ZoE*?xux#teK17GM~@DhQB%sJeLJ9mA{ z?jOS?FzyC}4MOVXZ?cp2P&G7n!vE~EfC8z&-KaRfH=kUu>T(dnB{%J_m!W*8H0Fq` z%sy*?8*p%r#N1}GD!%bs_w!n*kF&osG}X@|mRwLjusO!IzxFZmZ@M0Q@9+#;`Mw~! zyq=H`*6^TaL~Qw8R=h}=dudDuj=`}r7RA_(hKNlPQZ7Rh!_MEc$<9x)(dJgyx!$+l z@q#fws2v7lJmhvretpBrG+HLl$W&H+fo#zVV>K1lxwBo1iZj5h+#Uk7PWL^xl)A_2 zYs1Xf>ZL}Lrd;2?n18ySdAcQrDvd^NHz6^0u#2Kb?E;4_NfCB|6RK0~?(nmoaCG*} z>zL|VNuq-_l&*1&^b?8#HM@ldNqC4Zc0W;%QY@j9NZ%!B4G4Nzy0g8~QmH_ji&3&{ zB-M8_s-pY+H*aqqA?5i?XHJG3=i+y^5q1tKGLrl7cyzjMoNd#b{iFG%UUkyXl( zj`2dLQ-6h%&7Tw35NT`r#N%MTC`o?urqiBoyD2g~SWgrnU~g#6{d<{w8L0H^cCA4x zF@+iMYku0a$i-Y08VBSrv=H7l4?o}p|wA)2qI)&s@dlUY5C2X@%Fah4`pzDf6xFrB!h|8 zixi?~t6|+4K8ND6635^pk!|PP!InvCA)$Mz`H_}Rk3yv57YR*Zl>;vW9dBi z1E{6(X?#+vMwEc0SLJM*ov@WF|8%oT40JvE=F8mNr2S-p6XC`uD z)+%cn)0blFGlUqBVVdWGK57)ch}Z=#Qo3&%YyGaGX0o};g6R2PdaYGZ zn-!(_K(Ge(1&QFIk6J+0Dh+MCXeaXad%r!VCK4|5=ho(ZUUOCQKG;ETdd-d9DR>x_ zlRt!yVk?8BCkzF!6oB9INJO?s4R#^rV%1-kfr$7+gxS%QZ>-oht%+VHsTT9vZ*-4J zhn~LaFfxd$8lNgfSzl5tFHkx$3=z#{!=}s%c6yoU`c^*fTc*!RoQ2>}og~#OWXJbP zfenLI&$TRfYThvyS8UVHqgS1vSbHq~eW$VRW^LIWdwG2yN%78nyMI_kMVMa(3)I|s zTqh#`vgWtf>iEnoBek=wY7*RkjJ~2i!J*gd62cKV`Qb;tn50`K>L;B%Kbeo(OiVb6 zJ(;I^{Z27^&tgR?vA3$>h($rk$dE($m2{E4ow~HNGEMMtFh!tz+h`n2F_@!cR;}p* zT3rVvQva-Qk+`>zwXPSV1#gSs~37-9TBVA-CL7q=<%$6_1w$v6dHlvS=2E zQ3U<~-rmZWBCy-Oth!w{cq4(BkeOxiBI6l-pT)|j_*8pVJE`IZQ$6=tv-WiXa-Hi* zqV^;REb&-ppEr}IS>e2K2r=*jps+dzn0a*nHteCw^}cdY_r3d;y+(|g;zJ?BmRD6o zK7~CM*Y&Rc`Ol`S(J+qEq*=v=#J3gMFbZi2i%O4$KcSJ%5mo}aQG$;Y*re`pw%^k! zWZVO^tadyDBNK`v$Nj^{q`O~lKC!?~RZV=G9J+@E7!_!{(a;z0RVKbK>H!V@e*SEB zd9BJ({<*O?qzs&wLI{EPS4n5Ih@VQCb+&&3iXD&(8OVS`M1H<5L0cpSts_Q3@Ef%> zFkk}3xurg+>EhwyUuomJFAZcYa39#8^JG+=>M%_4yef4Yfd&4b4+KvFI(bDL3J&6%3{V;YO%_C3k^?Yu*czIW zv9hMmw)6Yo?99ASx_|KX{P1T-xL2HqC761Np1@9WqjzD2Dp`l{^$SJd9JJUCiq+%L z;vy)jammHkzk#6%%_SVNrsMVBC#~TLW6O5`%2wP}$hI{bAKQyyrqPJ-73e9UEnxN7 zJ^P|`RNq7ElBr_FA+#1SKC*4DD;0?|gYL%OL6lkut%Xq~_Bwy7aZBI%(w0g``c}~| zz;yz1nFN%MQ9(5dwBKmuy^+b$BIr-DFMvrWRn;mh|4~QZnavZTvcgbGMK8^uJg@u(kUkoC<{hV4?uor zsoH(|3_P_2Pr1MWZZK3yPE>;O1s(9?&KZ*>N&BvxrX>a}*D&cWgRIwN_kEJfY(7w8S)1xd9fUO90|$FMy?|HW?cMw2Xjz{b;X1OhU>FfhG8VOa=@y55MS>PiUBC_Zt{_V<@qKKHR3y!Z$sS9q!VdXo zQtk1bD*CKNc9mMwF?4>;MqRbLuVPgK?NvWr&d5XRQMnmFtL6(3jbb zKR^F{D3QS3)Wd0Q>m^U?S=Z8)^cjZ<*~1XN*F|abalq0;Xxc;TO(Rc(zp(6uQU&JV zY5Ty3W$o2-&zu!mbBd1!8#GtQSsR^QZFyoxL;?{9 zblR2Zd_V7g{lBv%`n2dBX$pQLGIhVn;p?I_AMim{6lRwq#W{l(he(5?h!u!{B z8yAk<{knkbe%$nZTBe^#kGS~jGtk^oY!cuB8ah@ML_XCOp=_~L+>Ds6d_wH0juxhw z&`b}2pi@`d{4B_>m2>vh6$|v$S(mM8!ZBx5IsQ{~z#>hB+)8sPp!%Gj@ zBb_}#H|-tW9yqBdJCK#?%B0FDZe#Ad4=+&J{rCmJ;uF# z`z(=hM2r3io12CS9n-o8+ug125QDW`az&J?gcTp)LkI?LG>T2`er0#a%NRyJh#QS$QE0R6y3ucMHfh<{Z4>Ps;^+p? zjb+dNgeiUd5vRl4WvqA@)lI5gh_$1+M}utr?es&<{|Bx5*MCv^k!u6{NcTuc794*}tVIJHa zUv3?4{Yf}HF}#k9d!HS)+&(Fi&ma!_@qPU14MnUu8>)&2`P(ny&Q%}IYMC^AZ+h1# zEE+8f^0ak7s%^Vf4p_!))|bD~SfP!{_riWr?P#=FNc)P6@@ooH4GFKggmdDjWgeP; z%6u9(G%F$7eKrZDAm8!v^S4|d$an)AYoK)dID2qExhrtrigE68b{M?S<)MxDoH-D+ z!`2po7DmuO5J#kS>q31 za3d)CGlpgmbOdD30RA9714yt3nz7Fl&iUduz&qL8fW=-d?W*E=3 z^*&(?g(d0;03F>=L21psZ~xd*2Y=Pntbx+W+vcJ=>LF{j9LM|mSOBuLfE%fbnRZw~ z5C+J%8;~okAc#!Tg7)WAd{*XD(01SlVu*XY^GDv4Aq^AYs&l^beg#;E?~#GRR&Qe&z9=;sOP#9TYhc;^Y<52* zKlsad5u)b=Xu<+Acc6Kv-ChIgd<}(XmzS3+F4msAWOsW4*L#?*?HtD5mk{rDjfbsP zwM$uVyGzTPOIw|Yl&vN6H}1ZA@<9a*85^cu&a;jtfw6^$oj)fp%yxw>0=^Cg|5D?6 zU4XGVU~6cE>Qdcr4+Um1yP-1UC2S#aAtZX4bhUA}KSPdprrK;R+O;%h!y ze1e0ULHbS!uw6M z@*_dc|KK}!v%Lj-=t4jZETyd3HkW&qoEMPq2~@+Yt9Q){kcXp{KJUv>;8GCv4MMwQ zp?zk&ce36G%^E5fwbK#jE|@MHMmw4C89IEM3p1cOLf)oAcZ3(EGx;0ZZ;KUN0lBXe za%-?XAjG*4X4fC<+p!Q@c>`S zF+*LqxM6QR!rvfUq1@)qX#HvMYG>1R`4DG|x?rFa+xFnZ8O=jImwOVjo?_~- zpbj76e#mST8S1HswDus5o(72%vwEu>h?Umyq70XL9|oD+LfB|PaZ6{p z`7PD>ap6lVi`o&sm5KPuA{j-?-lP4YI7->1A!c=hfoDU^$!~1xj)k^kl}zq z&?%8JKC6<#BikQ%za5ToadF|yo@QCXU{l1vucfm%tGck{=3duI>&3mN#AE3nE~V9HT2u9{;(Kv@vWk)zYS-pW5=Ny%Lpz_exl(h-f39E`(t^}J&VN2 znK8xj`QLZZCH8l2UH1s@d<%`G9uc=Nu9IHxc;ctVCjVrd9ZlUp%_?FenUK1lSvc8Y z9#_mp64FJj3~bEnKT_+Gjh8oK`i+dPf3aZZoJ$!QbG*0nr0FW9rx#l+o)p?QOo^ud zp1&)qj_E!nPRhz$m4mlR?h93?p|I8-#NQx(W+R7VR7>)6&)_eMp@+Wl1U)+r3ebk~ zg~TLmnJNx~SB5vy?CR}*7ugD{JwVRBFTlRs0>dU?6>h%}zEc7^Md(L;BtB5af2>SCZArD=ab`!WMfB9Ila}8z?d&as5 zx;|^jj%77r^7wNKXMT7#@Qm;OnV|BVlC(Bg-(o5aRZqy3JOSUZGFuUKr05`$a`o!y zKxLdqpU4fvqA{f7`Eo_wnql?=L(7LE5C%YX;S)C+EF5V6VG|8#8YgE%fRR%)G%1_N zKgY6~%}+l2tNx*Hy)znjm+7jo5J~#h*T0LOWp2FlotKwu;PW;fTMOQDErRUhVrJ~& zUC|=`O3v4Ay;g^z5IUK+iob((K0&)pFF_i8u&4eU&<{gp91JgD(rc*7*Qs>5x&=`i zClnIM$>XxmCrX~vzm)at%liOl0LKs$)BgEx0k&LIs*Xq~c8FNMN&vERd#*!zd`4|I z|8%`bW3TTEkDYLWyA0g>fEpnjzYfs6Zk_YWA`4nb&Upc@QJI3PAib)fPmU5%e4c;; z00<_KmqbfrsXbKNRF*xeO0lRiZUH^agR zO;_YiOpdf!j9>0Q-n6o21H*qHNb`fPS|!o>vS(uL2}JC?a&) zd_E~cb_40aF%EbAes;B`aYbxSGbuIbNrKUJ1Ydgcrs{1_c5pE=c@^AnDPsg^Y5~{# z66>x&Rf17_;98o)1@Ikk@FB!iRuub6SOw`1>WhAppK%nVxvQH~7U2l8S;~vh~ z+uy2h8;ek&xgijbc8;^Wt}jm}1LIA>+9)a;d3m@MrHa5^mU%VVZgk2-PKvJx*{nxI z1_^}2bU5>1;0V@8=QpF9<*Ho5B=caxDb++(+PM$Et&ydZPq8%o7;Z7oz^L?B>A^{T zRCIGtOa{25`!S+?iYedA`T>YUovej4aqNVQ04o^C`h?YP{JTSmw9fIGK?hw?Ae)(r zwRyShuDZE?^{$juhP=*SE@bG{!1MHAqAt)f0y;=ieJvyVj1mrX7}aBE2^Vc2jv1rr zhIiG4K1vghw=fq&@9D8Um7XW|SI`6sHC(hc&$=F5k5fy$BiWY-f=SRymuaxT7+%TpS0in>BUq zI@=MWj27O(x8dcq$9VO8i{dwLJU6RS;zDqJgFVe`gUGo4+JZXCn#`2MEL=i^Ox6)0 z8WT!-@GkUPB_%nLE@;)|Sgp`I#+8itjC)$W^G(u<1;!v!mFZ}h%f!QK^S^1T@~ z{nzYl-#%qsd!CnBpCZg?zpPW$Bb7HLR~00SMRYH4-_^w;ur+tqNuK^3{6M3Ele%+;%AGa1Yk+;7wJ-JSCI&@8XnphXh zYJ1lUcm>F3Xp0R3^@JxH45f*s_GKoPa@tD`rGlpnOK* zuFhDh64`}a7^AuUa?~GkI^Fd9?FhG&Sv@C;#{P}Fy0t$Dook<`NZmwp7PG3S6gmo` zT8t+G94?+pJ;Tt*7rXJLi;SEso9;9X=9235VpfhGu5d9Mpng5hJ3*)59xOnl0^4#5Zbz5)$Iv0_qz2; zkCk?6F?uI~GFIbAYo>uS@OEQFxa%-{fl$^GzuPR!2)nT@wnC77%=vx2-Prk}0}o#m za)99MYY;zfe@VKxCs0OCdD18TMOVu1k(Ufl$66=E0a^q1PpXKIUYEBcf z+NE&LErHuUC(%YE(s|1u!RwQUWksFb-Cz?|pfa&4uBs~kfgUm0ou@^sUPte^t_whv zS>NC87DQ=vI((dcG26G{*1_X4ePE>De1|#_d}fhhU3q7yK({Z{{W}enqlJ9?wNdz6#}M-s(`2pXnys(LG>Y!* z^?9g_jiay6Rwv4WXwDrNgM)&V+6kJ6)K`_l+xiMY8-s-(Rwue@4z!sSg4t;E9dI9L zv0HIDYd>OxV*?iP<`;a^o-CGpdx(;=%t3pF$%h&7{;&pN(VF-b)d^#)cKTV)v#F7t zbuOAlC;LpzVizBn<{|D^%0#buwIf0MQ3)a_NIBtmy4!7l^nC3*aLx}Ow2anDVUW~1Gdq!X9_JX9(>r*&Csn_SSAN+(+Q}s9|FYz!VaS4Ib&p;g5eBBY z&GC6|e_tFA7fF7(3#u3PB?kSPY>EDOC+{gQFJ2quoa&N#nvoXCTzNq}=^@{VqnPK9 zQ0wHHM-Cg`@Elel?6Yu+Ks~#%Y6S}+a7j~$SlFHkfDK2@dV}q(-Wko{k)c?+lP8L_ z2xeCjJ=cx*^-SxcS|V>UychlbnqT1v|aJzYV=z)=nT%!=tIRQ;q)NA*bBZ z{`s5f8^;VSuJ&9F73u=rVObfx{-TOm)tj(E;`+^+7=#K^2!Ahl8W2m&JM`ea9>6N5EugO3yj^_1~quWafS!?Ab=$+HYu^u!z z!6JS*i9;WV858U5Eg9$YQ(kU}Gz2QvPay%F=}8YR>;m0F;H7!3MHe;Ize|E%n*m$T?e zujQ+s>rDqx#5RvoXyQqcM00&M+I~jeTr#Az7bl`Mr!3&I(njqU6OdnC(*z3>?fId> zF_tD`GgrkLqED3|{K|AiQZ6%M2i)N{j|sxiSowW=(;%!YS>=NkgS>jzxnZC|sotho z{kNl}&`UpaRr=^{{iSmP%Qj=CT91A~mjuIFDSqA)yF{9k`B)AZ0tWg;k7BLnAIyaukVw|eEzI1H2Iv%&Y@~G zw+EZY8C=L%Sysds(hO?DUUZ;ztN8HBw66|uA8iJ`UiN)^tT`v5ifSI{g4bmyaHf%WMB1$2Sdp8kuT9Hn}jg5*4>Ut6x}yG+5fk!4hepCQ!_`#Y4yN@K2<9Sqm7yk^w#q+|H)9UigvHcC2QAeyEVrPyg_Kop1Qb z6{UKrZyNEbV&nI^!cQw2TGQCeEH3f0Nj_hT>`&(t7q$}yV~_`57jpPdXl&He+rY>@ zgS)8vxwPynI5^V5w88ZC@+?~?MUp4b2=mD3MI`UqUR9TMsKaPH=M}p2m2LfK!7HCH zJ`|)Fh#Is?c%7ijmt!%>bP9V&a*zu})m(hHSu_4@M$!(!NEmyIZyPQD9?#ff9OFlQ zJhriQ3aRz;p1j{hlyCU7)pVnpRJ$4`Bcqpsi_8_ok=WUN^=)97MB8l&h8wHg_45vI zo5@^#W=i|lwUfx#7Z+nhE|xd0%11GiPuudyy1H`}pK`dAx_%j>328+8Df2o=w=05} z2aS;R2n$@#)k)@D?Hk!qU3mHtlqTI?+Z3D++!|?Y8vW4ne1Q^2rB>8oP&yQ%U~>>z z^b0uHwY!dV3b=9VdnLB8<}ZI31by+PAY}#H{YFR!+@=<`VobvD!xvhVMA!6B%2*tBWguyE1TF<1^oOC2YwevIic|~YV1|R6r2q%uFe=j(AvtMiXj--ff6(DIc=ij) zk7Az(WUAn{$K-fsM>X`1GJrq%u@3JO!c_Jk?gE9Vc{y~45A}5Lm9y|qC0i>oNNuF^ z77mfSJp{ppVb9IJz0lORBqiX&aV1_MEBpl7?239N^=y=2*CFBdm+D#1p*+-0`xztc zmncESpA2S?68|5Vc@n5@#4`H=ra4itITUB%`T7ZoGBUK0`ep!HL3&H_6H4KOCJpKr zFsFF6u*wSglVKmVllaOgnxM$>GnYo-^iO}o`I;$CIlj{6gX?wKVA_0Cjo(3&jYUq? zrsRn{Vprq3l$$$!2qV*lc|ONi7=`|F8ervX;MxhF5;q+neCxS*5^zyr+SXNeEjd!z`dT#tzarAMFe$MMv=k2t|1Sm{+=-{#k$64|*J>=x zH62QK(r+AwHn0H?kOK@DtoU&JNaT~ zCRNweo_(M?WT9{P6{ca7^PxUo=1Z~85Ot_AN+w)loz7pn#S{PSvcJ&3k}^psXk&Mp zy-(;!?rWJF#UL_yowE@1E@NBLF)B}McUpMC_@*yQb>1)Rp!)8$4u{tUrSirH;oLlm z@b1~?)}i54rSGy$qC(Zt=%T29T-%w?h&;ckkMsAhkR-^gRkLX7XXbP}BWomRkf~5X z@X#RnKb5_8R8-L$?>!($OAIZj4Bg!zNFy*H-7$1GQqnbq3P^W%!_Wvwhcwbiw*nG^ zAnzG}zx%%HUH9H~*PVY@i#2D?Is5Fh_p_hp`~B>KXw&FDV+T0+Pj_cU-Hn~d)JHLEOw3OvGRoQgl;SvB7g)J#K>euN=9=0FKm z?fX5kdy@R$r4hyU4K5y_-%s?+M-voei&1v~g6H_MdC+axtd`tgt1M-092U_uWodgQ z`l-{Bsp#eJAq;x|r|7ZclQLlq1(XGD66=k^SNt_pcdd~PVOg!}+#rB9gDvB2#OL}O z#`P@^Vc3h5iBZdg-IEA>SE*MAMIA&j*s~b-Q!%ne=DYj!|<# zm^E)DTq`QLTd0+oYPWD;)pVP34QovfIoymV5nqOa7=F+LZ?LpUhB=@n)~G_kMQKKF z@=&)p&6g3_OJlPyQS`cxV$(E!gI|v;Cs1>rGBq-~FK_#iqqsuf2GaE~@>g*WF9t&j+K}^(Bd_xDWk2foIaSoyje=#3ysz+(Tqu<$v$yu%uOIECLS)LP~b;ynp&!@Vb5Tx zy;Z(!O8w)oL?-RvG=xDo%wg11-;DjKXA!=~_TGS1f=kUyRP&!It;l)?5Ot-1|1nOKgVw^grNjk>i?zGI>+Ny9o#9lM7;Kh~K9k+GTMwaR> zbGY>NP#_?X#CVO;Psa)Wl&a^WB=|bE=|Cx4fx2)?92exc1rMU3y|C0Kr%76I+Unun zuiVjdp>u00otH(Ol%MSDG~4>?2{?|&QVmf-B84zF`Kv?vEHA0&_(}{uUd{_fa=|D=bQm{#i|Dy zY2k_418lH*e+w;WIu|Y~U#gzxE8b-1V0n01aBoEDXl=g*sMm!bPB{Gmn@`}y_{2Xi zoqvMAe*4*4SW0;j7FHL(U{T^DkdOxhiXT0dxP;bZ0pO}+!b@+F25JY`BECSDosdwb zv9&$$Z1 zt0a=N0>GW2q_=9KzrKg=S-PAzm$5ODVbKz_HsK@KyHHUA#)FP_V| ztOWq=AD!ABb1jCC0LWT-_2Fx@%d%5lcJ_;sA}XH5Co^e|n$4SOMfKf>xJNzb3W^-r zyOS{vO&kIqN~hld!qwHPN!o^uueGt?r5QFNgHPF3U9^I< z?$n9o4dbw2RViE$AV*$#1}wPI*XL}(lsbKPJvtIw%-=iSZOuHNdMS>-q+8KCQD~$# zjF=nVrZLc9H$D;IkDAS89B@;b)yLAZHb}2ohYm7L1(bw0?s&7@j#{9s!al?3t$Rd2 zTYZ!Gxp{}cZRQNpy)%qjQHlQaFBT0K<8Za7v(q(+wnahnT9W*6wkjmcPw|UcP)dH= zA@%j7)eQHq`@I0kYl3GbURgfWGN>X-QD1*Qqkc(6JA}fP;Nj{%n=QX~JW5 zL=E(LZR|%AeikzJNLxc3g0@#8gwZ{Rx0ggq?Uw$p0iC-{d%_l*it^l-x5DGS^(n<>M>g4SR9JP&xdAT{xy3tC|vzF5(kxAS_e92 zMsRkd^jRdy3wQJx%=L{=iChW0mqDfyK_cDfJm%*df>K&2ppPL8PN6{2$#;a`=JruL z60VSaH@+M*5vb4yxI`Kfe+e52>ZXqYOEYXO?0U%=Ch)*5oZqqeO2cP zjFXJH8wQQji3v6#Z@&S(Z^Id;l!gQySeq;5NO!m3Ns{ zVa-CWyNgR5BLpIniWrLl_DV})i<0`j5PMe*O`N6j;0wwvF)y^%ED;Z)a-zq77TikJ z7b6pOyY7g#Sf*llXv?7gDMWqv8F4i8mUTP6JQ&tY2_}y*92ovM)yvI&okfG^aeLe_ zRNaLeu2gB?etJ91k-?Wf8zLg3yUWXZ>Tb^4e|bFugfQn{a2rBJWqpA{y9%DQY7UqUJMg`O5<#7c4yP;cx%6AO=Lq| z+-OJ@UUm6SoLvxEdUAVdFIRczDN%j+-9!O|R2nw}M89_cyNcGw01!{6T&jIXQa8Xo zhyz8&S@NBq6CZL`0&GN#bDt`|O`m}r{!nfY)hM{oYeh7K8`rg+#rl-3X65(g={A;pr&u8!@@wqGZ{$`qhnH-uI@M~^CAY#ZU-Xv2mq?aj6k zvIeexurJ-$>FEo(<_Adv`3O?L5qNsxq`2(MRU|&PdhebWG%gg4DS-us{ zc#>}pz#lFE4j@n_PWx(F*Li7bcfz@5dTRzcEi)n$dUpkyB%bUuTe`2VW;buO3M!te zi0Ar}kh=3r7VQxd9T=$xWOKtDRF(G~29!X2iP=%Iz%17d#1R+^ErF{u_2Nh?K&lC9 zZruXxjbjeEl9iOgZk1AV!_cDL+(BeU^=4z2o(F{3M;na@`%YOU1#xLqz;$U`z#Av6 zU1+FW(tY-m_Nbmi5EKg#C2|nSdrZzq;8_4x5QBMzbZb_$CVyq`l7PmnrF)VBO1W&| z4qaNa%!VA(1(gz$3vW~6!p-iRTOlIeWvvh)&+H^1Gy?^(1T%OEtt|Tj=nF>c_C_FN z_ieHU+3+BA9a*7 zb$2W6G#XDxaH0f`UKDSr_r)f&yD`lKN!XjSy!t8O z_TkH4LbNh7`QQ$bVC+ogP9u3NAMUKPzNu97Ex37FuPK+&-+0znAH!w7I^Tdx%tvZi z#`$S+TsGZyX_AJP)SLBs)ogKIDqPYoth=V0e z3nl_xvNJT3Y;1|<(~ByATk5}K8O>>-EAAk#$CtcUqNnxSN+7Hs)rzpz8|+Pz77V$k zE@2BizP&yT@XX9`aaAiW?Hq4A1sSbS+P}el&RN`LJ+oRlW;}mYeVyo6Sl6IUHrbbe z44kV^X21RoZo!OJG2u9D-7;?SLC?f@{YVDe6?WMJNy-j4v4ZYjHPPxRZP+nOljbiM z_pO}q?o{i7dEZ#ogZ{?k$Km29jT|FzodwN4CP4Y>ObjA0m=F41d|9Q8@fp&fYKZ*; z!#}@;8=3=%%DbbJ$QfbV<-98BePp1GxJqvXphff*AXk&mOolArFbzr72f)%M`6PF0 zbSLIg59z#m(JeoUqp-naB+(%si9zDZ0$V~kN_X`Qm2-+06cc&epe zc?G8;p1@~YJD>g@=18sm7@5v>2vl|Kg`5F`snGaG)iBgIN7D!f=v4FTdybbuQ$^W$ zk7vQOC9$`PMIUJXIJY|>rt83N%R0gAbuc^rH1E+~_GVOyA1q>Vi;fg)PQ5QIA$#J3 z>ixZ;jb78`1F&c3#Di>GT&Iau4-v+}GKY!}ah*%~n(?dqI%s zT;KUYG9KoP&;&zpbiog9Ed|G(4ozkAYy&`nO$~%aPBIC3IrXwb*}v2mOIOc{2H~y# zz1y%}Bc0%>I-&{%_Af?}^VP8qg@q$S(YsqzEr*6W@g>%V+=sghiIvohRrp+L=1ypV z-v%CrN1)F=_j!iwq&JOepe(^I#mSK zjK=^JW-p!3i6t8FU7v+XI-J5tWhIe66A9u3^6s15lGJ>4f0)MpxJqqnacKB_1@d5R zkm7vbqUyq&sP{hw`}M95L3#Fan&4{-ygi@~S6RKNZe#fRm%i|Hb6-%xFM$lI1?uI%IuV3(eMra*8bG@RRHpD6h+Q#!HEhZ8?;PTLE^v@Y zzC^k%pB)?zv1mtY&*y4MF00bf=`sjz`9}c-YJl(>(pi1*AolZ_5#akEPs?pS*OUSV zfZT)B;dJRsOCW*5l6d68Dl6lqa9}RH!IaD>u2a0diJy>ci|W zPCrn})N~)9_0Jw-ca~CazRl;DkmRc)E%S=3_MaA}vC960;B!4(^tEBgc9)_6f$U!S zFvr?N5SoYaodHcYSipcprgSvQf99*>^)^YXaMF?z3_)D+)zKGI7bF5FDh6b`kl2q5 z0FQ8+d6fsbWJ8Wn`HqhZ;nJN51Y0uo0CjAZf`V@h7-whB(?f{ zhrO--c_YnHy=E0w(>^||QEa2yx5pq!!BqKI0n(5{7m*)du`q02(&oWMpYqduE?w4B zHI#hk`uym1(GKH`%b9*iFh4Gki*(-`Wt75NCm+4f=^3;$^vu!lo{hU>cBL1s(9fa< z?LYp-H011kaS2CL6PJ?$zvZ&apUWRt(;IvE12LlhS`Bx&hUo{37&5kI-aFT|aL!PM zog~w2_E0xE^1spZH(-buad^U#{^m!njPCc(MKm&v-8E@yUoRn}9p`SsD~oJ(n+1R; zJnp)M>#gf8-;k3rD{42>q`%5aPbnPmwVkMPqa<}trL^fxzpEUT51ckAvw$tRGlSEO zm22ofw$Imuw~b#VmUXvaP^>e_Ce}P%S5J)RktY(7<#*-#TJ2)sArt)9bYpQle_-62 zMM7Nyisx4flekW>Nva}3m6ULKM%F6&^$D&V$c6*&Tc6YtLeviCXeFkIdnv6bM}rO4 z7*Rf8XXVmzUfb%*rDs}eItwI%O?{%-&fD9l!(2mjFUQd~I&_(=;54rB^-}6zO37L_ zL!D$AE&=URC&NQaYBu}=uf3)nq*Ahxu8V1?dQQ5G#QMH2WmMOpxT(-eXZ&lyS!|2% zkYp8?ewjf0b7?525>?aL;p$_T|i7L?$B&dHGo zfG$$IS6P~Bd?L|Ggji9@V^n&0MRw)h{7gOgHZu*P>Xq_MFQqzfBL90;wJV(2}dk*^pj23!+f!nBqGX9W~k zE1}VUn`h-?RxRWqBLvZGMOB>EmRJT}oWnp-H&+8#w>(xc=RX4omEs#uc^PP&gkHPZ zwib`gyT67Vy6A+_k0?iyVU2^-F%KJi#m38By&4|$UkVB&hWS~3l|j7FwA!j=qP@=D zd|V_$FUQS1dw_;RNyN>;FW!aM_J(}DO;Azpxud3#HgJd3=a*>i`P63K?Ch$ z;LY{{LLsq}r+j%CdP$F1UhmK;1Q?=i*UAMkRcwz+Tc?l$YBRZ@V%yCGFcDzdohYXQ zioJ##r4ceZs`5y8A%sr_oO09X1Q1+_o`Q0v#|Gcq2D(6n^v$7k^Mff)33re+s5cS0 zLiNzgEaGIVJv6JL`j?Z$$#U;~yt+s)GlkaQp#qdmIonO33XaS@qh3|oRk)!oH;@A* z-|$2SQI!IEHpl5{cwN}pS(lW+_I+iv+y@S(eFnDQWxT#WY9)kxxrN%Jy0PQWG^o>T zEh+LmTV7-uMjGg>J~e+|I#;?UN14rP!8`$F0b+Z;MBr4&geLm2-eqzbxGKi>i#~$S z&8h-y-U_d)B!vo?pAB&K+W7O++kL5SCU`AU$Wo%UZF(7fTXUO%C|C#GQtP=I0;XC8AQTLlZaq#054Uw{06^xH z^RK99j2TWouKvmYNO-=5=3(0E|~DY86H6suul+zcMO}Z#0@% z8;-R$)IXL#itJYuVcqC{^E0RHK#AVO4Ga;i{5`GQk|nben|GSOU3bJ@xP+eNbES>~ z;){>4*-Xxv$8%fVl{7!V(tFEo5UNc6lTo1jE1cA3V|ulId;usYY1&;J-pde_8M}Jr z)ACiKu)}{X9Lzjrk4V$sAX0jimLPg2YoWtfG*!tu-%3>JVis>-)>3*S9rKCi%iGks zl9~7%5zd!+b<#)ZyONMdhZL2+#4M7P$*3Fj3D!dxP%o|JVbNby?Q7X3H6f{y+x7Kxf!7*VqR@gCVWNAh^-fAp~ENus89xaS~+*rW( zGyno93=&hq1B*3_v%$!e9%{=p3vspTJIZX5HDnFh){>FD)$ZJpT$wpbs^mO)q& z7?k^p?-lsDLlv>VzM$?aws^-_o7twc4J0wN-)M0WJ9as zx2W7lQ70QzIo6opr|S4Q#|AdX+8esWO1_T6*ZvNhtPjReNG2U)Lt2-L{tUYV3!7+Z z=yaPZT(vZ(_TgLW*i;*Z`yzTau5rTMRxjkv^sINhiSaqJVy-@~7;9`>N7fMGgu3`q zx5Jz(67ZR>2M$khGN)7DW@8>_MnGWPxwu$33WnrO9 z2=f_%M}1xJCufywqxCy;==#ca!Z7&js$`V|JND@Gxm@4tM=TGL|EKaSOV7T|^>dKG z#YQZwxAQ~{9qaxn4SODZYY!$*N;=`8>y3f*U>01Z3tib}5g=m~#lq;1S1Z3CT4EJS zaTi?>1&4f=8Oss&n|Df4xiQy?pL8#yPt_UuJZ^8PIWYThsh!8nvQxjH;-jyjO@(br zHHlnWdTXC|V|mhQe%b`mSV1W2&ME+krWWwcYJBM}XNsaPPZ=dtu1{;etqVh^R4B`k zE{8rISkgR_C_$h-7njK*n^P^j2I~#C+Od`1tPCe8Pqg?#OOnWf&e(8rzfkWT)=#}O z-}s8~>_Njm*k*F6;nuQYpTcLYJCbkh1Gke=a`&00A@GQ3{OFPFp z?1#OEL;~aYcMWqD|CZ*YheoH3kuqRlq;soz(*4oW#6{U?Kdw{w@-T_kbBn$%wyB@PRUf9P|S8 z^9=~JQ(DAuB?2extI9K?vb1}9_0+v}( zKum6zg?47s6hn~T;BGgutme|wXrZg4dE=kqJKpSPcv*$vS+%5da6kH)e1EUXC*AiA zisX7}4g-ShAQj-J14ZDQy!u#ZJ0`ct%M$Tc@(54aq={ylZyjk*I8PvP)G3-D84SH@ zSZ-{_iy7ItG_sGb-1d`(eLuVw6S9m_UC@~}AU_bO4q6_Y%`TsSs+Y4U?|HQFOilVGI;-IcjstTHR3PjSvBusLejDPw*=OrdvO*rZ>lHdZpoJ$v2T&OU*W|8hjt3Xyzuf6byH(V?Z~z5Jb)zs@Jo!)f4kk78JlI-`n1&34CqE$Y1# zef--?%*L2GI^6(?TA4p~v|psp#FZN@+PmHLgT%bXl9#iW{aeUryuTxpLBZD=V_MH{ z>{)@zB|ZuB;<$LW?X`E$`RB*)N6(p6?kS^^k6Bz3WuV3mV>NDHy2knx9o7v9CPG!( z({9f+EWFhdW~BmR1A`xCn9PkAlvksp>;JZI&L?@&i@vp~2&C7m3Ac@5C|In@a5|r+ z3yvlJTJ?!U`9{#W7xXR{n*JLo`5!Sxq4$5-y{j>fT4{PtaKH;8U|*z$w(Dv^n&QI> zNz2jN-!(nIp4OzkJwwm436Z>9nhNs?P(Kc1Z$6P!{INX}r`Gk#`RacZe$~1HW~*0h ze!5Y!?CwJbcV5uukZ0IlzI1pV@H*{_U@)L?8Fk4pHH{z!z&XaV>U1fn$9OXUge^^vaGDU;{6+e^kp#;DmKEdJoOJn1Yd{PWBrJ-*g&_h9QlBJ zKo0;c3V*Sdp7A>5P-?26Rq+J2CRxnPWD zb1ZZ(|5sy4g;lrQHwdsX|0a4OL=y4i9P8s8obiR>YA&RLGKTu^MXW(53s(%)8+J#Z z7_%d~a3RU2Wvk+Bx`g&&S@nFD%#QOU;qp>D?sTEn1B;#1?%#0IDYr|il`A6s_Jbl0 zLPqZ4(U|9B3g6`)?Q=Fw^|d8>Z~eWr_$=4=^RT!nhJ;T2@70pdb@z@Q>)G$G`HCZ1 zGh&Ddps0+}yW{-sd;Ez_a2AkvyDnW#mAy>tZ+xFWwxiE)(ZjQor$SZie$4W|_4S-8 zOYy3sRYJ3nzg`@Jn|cn^LMul^s)e;WsTtLxm#wSFetAT5ld8VpL)B>|i(4@B%?OnW z>ZR4H>$%Qehi-gP*)Ld5?svpW?Q>XfAlG|p^3kDlb4HYXiOb18z!3v%eKV&{fP*R+ z=)T-PLdYKIcT#cqc;;$lLHT_4ibaJWwwTEiD$eFyzwPA(^z55eH$+P^Y`G4#-L=E$ zp;T%9!&afAEIKV(Nf+@h1J7H-V)&)k^zG2?*pCt1_UzE*HMq;${sQUWDc3E(R&0{u zyO+`Td4ZDyIZ5K=W6%Y>O(M`%!gTg~`cDD_@R6Oe*G`4=RWwImqk6TMcw}?ZF%%4F zG*Zky>p*hi&$qnr(|#RUpiJW1<-!5(HQT9P)e^Z>s$a6 zfMm(+?o&}@k|O9O0MA1HeFGpmkpCz^?xK>*kUD&9eA`bj@SfL{`aj$7-H09*xBfQI}f#?%|VIJYDk zS9GfM39Xpk(H}$+MC}bXWF^IpCpI@zpXK;1)2Om~OM+RtXmyuaIvT>v0rurSr+I(v@5zMC2L-mgUUQ>#Tfl|lO`?AjuyZ`3)Bf?gQRC^6KLGJNcX zkdz?=?U(iNE03slmhiF%_}A)J1#o`;CbZq^Ts3}Q7n^Is^|gdAbYhBNw9P+WX6*Y@ zs}zj6cRdlv&4zOQKKcIY3#+mb?~v;~9_Te+Mn4mWapQ5lM7HeA-VWayp&)iq>c=bDC zZ&1l;t3P(frWbup)vCFW)n12_y0S{a3SBIWC&Y=n#--TT5_8L+&T2N2dYv()fQ($l zMuKVjd=STcT}aQf|FB2+P)!c&@4IcW_6t=+gK4ss8Y~@!32bc?q<`q0v}fHyy)NG) zyXM?70rrpWPuG%xp?pqAZ!bZ^4M8x+d1;G`k9VY(vlBySThuw6}rC17l}Z!pkB61QCWId>70ZlY zspUx++73>H8KScmUZYoFBin?sfU@x7c|3J2hf9Vax$SoUM`NY0JB1fIi>jHmrDQ{_)B-)qxY{^%Q*ha6LFE4$kEGcCfPz|Pp{V${ z&2*KgHr5p6B9I3-c~L;O;g{i_A_=O^_bClEi1E_LdlI8^&wrm8Nt8ukT70TKuA(;W zCoT@CH`2>V%y@9RE-^JjJ+q9DmA)bANccT3__udDAEC7o9O{YvJf|kNu(^0M8x}Nx z+~#K=M?I&=giuj0t&HR72*O;53VSoGM)G4I<)!-}duF`c@8&Lxkp!IB$h!y`rrrQj zHW{|AMN&f4hN9xI#P*#r7BTNyyUi$f0+}OQi0jceEmk?G9bmO05Q#($;8BY$fiGw(10@?|mQm zv0J~PmMJ!7t$&ess3#0#1-F2N%$wq38^Rl2i|)`kB;n$(|KKMYsjFE>H)szY|7Tod6D6 zWX*bofn3+}4zW%>qors4YYlS$0w@$>x?ZSR=SruRcvE6L4mFK{w1TuMkq}<%#o#zBWP@$fB8hw(n-rZKUP6 z$a$?Bhs?%{q>o7X3>jK}#>RR7?f6v>_VD0@W{aeyorfwz#5ApANv|}WTLAA_pmoo34|9Av`H)8n_Ru|ggtJU%9nU(v$gJX%U&MX>0ErvA0^+fee)AhC8 zu&;1%>-UEEDWbGV4}rZc`<1V@1&5oXq9)mIHsFb=%eeAv5i74(%xBMxlG50%*~b*^ zF|{?>20sz?yVoP4>7r(zd0-;%)ilf{OmkYWa!!{*k2(I?G}KZFyS>*}KT1cb_3>tf z3+>-}Lrt^k-+KBKG&p2^D*@6h3?52B@Pm27v5DUC0$el2LS+0NvEROI`N*061+H-p8P&;ZhQ}xwY zl{|BE9SjXTz^%v^(90*EVZ-6IJ!v0HwmwQJf(&FpT}pR}WSwY7$M z{@{q+*w6Q{5hIecpU@_Uw9EK2kH;-(&{{T?Yb2~vhQ>SWS(v=x#?>p2TGr*RJhs^8 z*@E9kNAK87)qDSVW3UCM?T_F9kfX?sr5BPqJxbK! zCXcSnD#3X6Q!93)DAQ1`VfQv^ zL~Gd6cmrMKa6{d~llyg`%~v~Izb{Qk#C!;%UG;=zt5 z{~4+7Xa3*Y`@bJw{uAK?5Bh&QKrP+fetVE04vJ)O^OXjiSRjz1EL5gi$~5Hv0dgQK AlK=n! literal 0 HcmV?d00001 diff --git a/doc/source/reference/stable-api.rst b/doc/source/reference/stable-api.rst index e75042cb2df2..4afcd3195590 100644 --- a/doc/source/reference/stable-api.rst +++ b/doc/source/reference/stable-api.rst @@ -19,66 +19,117 @@ Nova Stable REST API ==================== This document describes both the current state of the Nova REST API -- as -of the Newton release -- and also attempts to describe how the Nova team intends -to evolve the REST API's implementation over time and remove some of the +of the Pike release -- and also attempts to describe how the Nova team +evolved the REST API's implementation over time and remove some of the cruft that has crept in over the years. Background ---------- Nova used to include two distinct frameworks for exposing REST API -functionality. Older code is called the "V2 API" and existed in the +functionality. Older code is called the "v2 API" and existed in the /nova/api/openstack/compute/legacy_v2/ directory. This code tree was totally removed during Netwon release time frame (14.0.0 and later). -Newer code is called the "v2.1 API" and exists in the +Newer code is called the "v2.1 API" and exists in the /nova/api/openstack/compute directory. -The V2 API is the old Nova REST API. It is mostly replaced by V2.1 API. +The v2 API is the old Nova REST API. It is mostly replaced by v2.1 API. -The V2.1 API is the new Nova REST API with a set of improvements which +The v2.1 API is the new Nova REST API with a set of improvements which includes Microversion and standardized validation of inputs using JSON-Schema. -Also the V2.1 API is totally backwards compatible with the V2 API (That is the -reason we call it as V2.1 API). +Also the v2.1 API is totally backwards compatible with the v2 API (That is the +reason we call it as v2.1 API). -Stable API ----------- +Current Stable API +------------------ -In the V2 API, there is a concept called 'extension'. An operator can use it -to enable/disable part of Nova REST API based on requirements. An end user -may query the '/extensions' API to discover what *API functionality* is +* Nova v2.1 API + Microversion (v2.1 APIs are backward-compatible with + v2 API, but more strict validation) +* /v2 & /v2.1 endpoint supported +* v2 compatible mode for old v2 users + +Evolution of Nova REST API +-------------------------- + +.. image:: /_static/images/evolution-of-api.png + +Nova v2 API + Extensions +************************ + +Nova use to have v2 API. In v2 API, there was a concept called 'extension'. +An operator can use it to enable/disable part of Nova REST API based on requirements. +An end user may query the '/extensions' API to discover what *API functionality* is supported by the Nova deployment. -Unfortunately, because V2 API extensions could be enabled or disabled +Unfortunately, because v2 API extensions could be enabled or disabled from one deployment to another -- as well as custom API extensions added to one deployment and not another -- it was impossible for an end user to know what the OpenStack Compute API actually included. No two OpenStack deployments were consistent, which made cloud interoperability impossible. -API extensions, being removed from the v2.1 API, are no longer +In Newton release, extensions magic was deprecated and marked for removal. + +In Newton release, v2 API code base has been removed and /v2 endpoints were +directed to v2.1 code base. + + +v2 API compatibility mode based on v2.1 API +******************************************* +v2.1 API is exactly same as v2 API except strong input validation with no additional +request parameter allowed and Microversion feature. +Since Newton, '/v2' endpoint also started using v2.1 API implementation. But to keep the +backward compatibility of v2 API, '/v2' endpoint should not return error on additional +request parameter or any new headers for Microversion. v2 API must be same as it has +been since starting. + +To achieve that behavior legacy v2 compatibility mode has been introduced. v2 compatibility +mode is based on v2.1 implementation with below difference: + +* Skip additionalProperties checks in request body +* Ignore Microversion headers in request +* No Microversion headers in response + +Nova v2.1 API + Microversion +**************************** + +In Kilo release, nova v2.1 API has been released. v2.1 API +is supposed to be backward compatible with v2 API with strong +input validation using JSON Schema. + +v2.1 API comes up with microversion concept which is a way to version +the API changes. Each new feature or modification in API has to done +via microversion bump. + +API extensions concept was deprecated from the v2.1 API, are no longer needed to evolve the REST API, and no new API functionality should use the API extension classes to implement new functionality. Instead, new -API functionality should use the microversioning decorators to add or change -the REST API. +API functionality should be added via microversion concept and use the +microversioning decorators to add or change the REST API. -The extension is considered as two things in the Nova V2.1 API: +v2.1 API had plugin framework which was using stevedore to load Nova REST +API extensions instead of old V2 handcrafted extension load mechanism. +There was an argument that the plugin framework supported extensibility in +the Nova API to allow deployers to publish custom API resources. -* The '/extensions' API +In Newton release, config options of blacklist and whitelist extensions and +stevedore things were deprecated and marked for removal. - This API exposed the list of enabled API functions to users - by GET method. However as the above, new API extensions - should not be added to the list of this API. +In Pike, stevedore based plugin framekwork has been removed and url mapping +is done with plain router list. No more dynamic magic of detecting API +implementation for url. - The '/extensions' API is frozen in Nova V2.1 API and is deprecated. +The '/extensions' API exposed the list of enabled API functions to users +by GET method. However as the above, new API extensions should not be added +to the list of this API. The '/extensions' API is frozen in Nova V2.1 API and +is deprecated. -* The plugin framework +Things which are History now +**************************** - One of the improvements in the V2.1 API was using stevedore to load - Nova REST API extensions instead of old V2 handcrafted extension load - mechanism. +Till Pike release, many deprecated things have been removed and became +history in Nova API world: - There was an argument that the plugin framework supported extensibility in - the Nova API to allow deployers to publish custom API resources. - -From Nove V2.1 REST API, the concept of core API and extension API is -eliminated also. There is no difference between Nova V2.1 REST API, -all of them are part of Nova stable REST API. +* v2 legacy framework. +* API extensions concept. +* Stevedore magic to load the extension/plugin dynamically. +* Configurable way to enable/disable APIs extensions.