From d37bb540bf292dd48c8f1738454a89523c0b6e9e Mon Sep 17 00:00:00 2001 From: git_repo_user Date: Tue, 14 Oct 2025 07:23:09 -0400 Subject: [PATCH 1/4] Add content processors properties #8086 --- ...ontent-processor-script-sample-result.webp | Bin 0 -> 38972 bytes .../content-modeling/content-modeling.rst | 3 + source/reference/modules/studio.rst | 153 ++++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 source/_static/images/developer/content-processor-script-sample-result.webp diff --git a/source/_static/images/developer/content-processor-script-sample-result.webp b/source/_static/images/developer/content-processor-script-sample-result.webp new file mode 100644 index 0000000000000000000000000000000000000000..bdb4bc20d478f01a129eb66236dc4166698558cb GIT binary patch literal 38972 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

URLo=VuD@ndIC8P1HZh-&s9xL>GGzD%-U-B z_}0GuY)uhf$*+Ps0l@8j{~#%CzpxcgY<(8L^F0~GRM@svt6146DEg5B9cP=W8bjsn z2(>uqRXH>O!8l}96o##&eteiy<^l((X`2l0Qujnf(&-E0!uZ%PYN`6TeNoG>9!A*zjr z!4yQTM|kqUU-~6z6Jsi(UIIPCzZD5L&kAEp21KZXuUZ}x;eAYHbq9ibcB`7CR7`zK zj@E_9rpWk+!Idj_o$hRMzP&l-6R_aWM=snx2dWo%=$y=CtR8 z_-4D3k%49_W{fc``gGIy8mNO-s12$+%~b}Kpkk3JPhZtjg`w@c8b2H&3|I!GX!Vo` zFX`?vM0!N}^A}G+706iIiR9Q7CUFfH+UgQ%3ni?@Cm?`AG03_yk!f+Nb$0~S9&eG9 zSPa#y4=J512+zFFYsBtjJu&L{hYN498CiIx`*$ThQ6!6E68zhP*n=xT2Wds zFn0(=m;)CwU`?EyFizA?3wZ4Iq4{LU>$gha#ZQ#|wsl<#7mv8{$a{%`2tQVmN#>VAsds*&KJNp4_>WpWUS^!4~zY?DLTws>Ja(v93#q;c;V&)ehBmhMl{}>G!$A> zkl|XOUE8rF`r{B6(hK@1KHzowFz)pF%5)c?3xMbi4UY=AB{dyR52$-AIM2U`=Vf4K{I?2GL^a3lL-db5$(??!&vfdrHKmVHS+ffJe<;qx+KM z{2EKTbD~Hs6 zhEV%wYo4edZ}2VuY8LV-GLmN&!;e{2Qtw{$o990U3e7W$?YS_){3FyCo49HT<98!k z>#>#P3;OR~-nqIU544;b)Li2ACwf*c8S;!C|@w9qLw>So^ zcNiwz2OTQJ!ga685$7(tzbSH(vBEU1>S>K<4G_R{n=kq>N6muW{ zq@H^Fzy)EGs)A4%eA@?gwWNEl;D1Xe*&)yT3j?7}@bprLMxZdEgS38yIWqa1 zMRhbIr~pYG$@sHYgEAEnVuNmNZcJF_A!BNu{chqb8?5hydPkWIQIyr;5N)mUkP9YO znnoz|X4K;Qh1Q1<9kB_0G{s|1+}C7H%V=P-G1mfDkcwRt;>>%Z&?#*FYA_%|e_LmD z35Y7y`7Cg)BTde=6@N+be7IugHH~-ew8~KpS1qM@;|=6tq=@;uVuT%1rD&I`$-G45 z&>A~h)Xc^tB*dOEh2{RfVfZ~ki?j(lD!Wo41ul!g?@%S!Kyc-PKAc{?!PSnW_F z7A%$$8jA1Wv(dvP8)(Majt@|hQD%)358WL1co3+(6QB{pQBi3*M}OC_XkUV2TjCwgJWh8VxFe%@seysVG$1 z3mA;gMm)AUyj0Ho2T3>)*H?9+eGL!`@IE%v=oen^RScx2uQP(y4UE~{*3DAI1KU9E zFCFH4D_CdI(#^qO-2w4nVmP*WG}}`wrC;Nk`;}5&2xsG<-^mbCg;-PiBv|;^E5m%> zH#wHAs8;#NT3QX+aS-`Wx7$3o4SnagOQZK-W0gHbp>#d5BEP~UL`!P-2?h#8B7^Zs z%9aBo;z~^T!8MJ4sWjCii$?*aRP@{9Pr-B;_2qkt(UVm=i}As|anea0QIONN^hYJQ z8#&#Tp}hbytT&*?$U&D2@_Pm0ypAZ;d#}2o^TB-Mm)T7iXsJOy_9mQJ)DM7#6%;E<*P6+?Z53m_Juk1d;h`7dXLw=KP zb#DBjsq(xvrG7Ts%ql|Jf06|+z&9PpU-fa5J+|0K{a#poEC_N0{MtQ-8i%issHU5N z*-_`UTg%`KzF!CaS?5LI$NLTk0pF!Ix~9@HfjPG6f&=RLM_!lHM zGun&(WQCMcLv7zbPDtoN3M586v$Trb8Zg*3{ArKABA%ybvolH3*~qp@Zs)YoEUg-a z(ho=-AHt{Ef7HjVO7BiifU0uJ60B~ zeEttm|;x zEJ8b_eSIsrCwj)ikFpnibCC}BQs}ca&|3Un9o<0|-h6lji6Zse$Dn0x&yDlZXSE)nrxAoLWauk5`+ zi1bI@Tpw}Q!HzB75hNkFHNUns`=^bqrx8B|I~4U3I5D-ly;HE(6cX;mK;`c%0GS&q z(akcW26=}~GpCs-l32H_A|B4coR%YZJQa(X1%xm@{&Qm?YU#L_nW(sL{yA|mUuN8F~=RW+cx-c@0lTDhiaU& z0OC*5LHwx~F3XANu0oe1apzrOt~$EA$I(w5ggNcQq+W3nnt50|Ci>-N9}dL+LA-9< zm^u~vjU^>GWiQc|u=JeD9k`I5fvK*x{ZaZoZ1s>nsETaUZ2Zk=UrMc2GuR;jNie}` zHyf2v15#W=^EEtp*Zn|@{Bru`jDp&<C=^NA|U zz$pSs0(`RBr-w|+o~oz8gOq)B;|k;?(MggWJSAF%ZEWk>S^4rukf7S#Pw`wN3yM`L zAWq5lcAR=$aCg2dDH0FSw!AFel~J!`dM}OT8fdqEJ)9rZz zOyJs`eWAmT$U;V0h;*i%L@u?F^L?t7=+~Sy$H8aZ6K<<@7B|!PnPN~$tckFp!JF8pjwj@RBsUpL+6S~?i}4kJWz(QT$R*RN7EEt zayn?=WwHb~GahFn8M3*>?iKbxb|>_EX)L5^b~TvQu7h@tztf0{$0!kZTFP+A4UCTH zdhiQiXp_{=le1>EEg?va+C)Wb%j8-VGHPLal^Ju)=Z{uoY^;qUdnIr3!WBb$?yonF zjmTpQ{Z1+^sG|0vFG^S=+y<3(;4hVJV#iRzEf7oK2*w3f{~Zlb<3&DM;jS!n@Vs<$ zg>onQ6y&k5X9NNQBIKiGp|NjO38`6z>)r(vSQ1{aO9_f z(#DkY7oQKQHJ3yow=GT#hC0gce$;s3IC@t4R0WL+l}=grufEMXzvBAIVE=i4ZN{`5 zVJd9I+|@Q$-kt!q`NJniTjJyC_q*J=!w5Wj9}FBd->ALaC<3S~2TrOFNO-u9R}1Dl zCT;~J3JD(HSmiea5?-Z+j?&fNxAvC&7L!E(gj&lk*H9VQ&Ji9S|bXu>_sIw|) zrU;lQ;1n+lH;efHY?!o+4dj-RevZ0iG zPBu|VSm)?@{(<$%up=;FP8r$N@f&sa$1Oc}gn6=FK1EE`9w>9|_MzZ>VN5sV>rOOu0p-%+T>6|RFftw=I(-!8Jr&q#krk|S( zk!eI$yn7rxFck#K7U^Jpl#Bqhn{j>Gld&m)=b3pEFz5Sh8Z?yHjhxloT0Q5fI?0w7 z=o>`*7nM(I0dU`;=$d$r-5yd}sKxNWGjc>@RdLi0=kA&ts0uI2h(NP!`}VR}M_lHwPd< z9ZuGidDRSfiI6$7y>{?j;B#Pah@Fh7 zK6XuQZBZfZv--lKr-`LmuFU1ug2nP!%`UHY;XS2pSl9=+qSNrzVo2ld;C5cT3!DCN zttj@>0$K*J5Y>?zHdHiP#yg*f+t}sdo*rXhW35&&UhP)!2{cCxD84r1ZU}pXtlFQ1 zNdZEEDWsl&8wcs7%f-X9gp5$RzwuHuj!UeEF=%p6HTXjVyJ;93FBF#b%?sRaC;%n4 z&oqy$u!3EgjKocefXL_$&de*STs*Sp=*)hlZ9JRGGMjIk;^*;LaGIkr zF>~MB?zkr-19z-OfL_SRA?fcEDV9vcBGe^WBp2t16Dbq4r*%eTqd5;UA}mX^B^i43 zZQiK{q-Hqz)><00spf2OrbTfbJAUB)?!`38U*W+gjcX59{<}_hZs>>MV+`QeB9>Xm z#|B8p3`~I&#gsWg(d*r96TDT!0YtlUExg8i!n`^ogksMhxYH!Kh><1EC!VF8;AwH7 zQ&sMYg{Kz9WD`_D_hx)L=rVUQR+V4!u&o64HXG{;T5qnUN>Xu&1?C_kXWBFdcQ~0E z9CkOJW&t%H)Yy>ta^Fl(d_8Qc_=0W-%MsN+%yNrS3IW#->xD_7LlWN7yTYU1t8o}; zB9&Jn=JN3Q=8y%+jvK(|1&kHIo;WTC*tuFH;X%7jnP3=# zmLDC*@OM1Hyjc31#U7%c<#^Dlq3q@J}Qu4NcAX~y5f-D}?&=?2?2sw}VC2FpyPn&D? zz3rM#ww&l)DeT|q^43d8$yapK@iUC{n%Nj6liEWd6*J6b(xsZNT{nPjEFXH617%gR)v%MwyKyFccN;dq_6-QIfNTW zwL_E6`zumYQWE9Ub%-Q=nH5Nm>8L6FA_BqOb)~0AMwUV-3H(^k76}Vi?Ar(kdK`BG z;~v2Do_C_dEvJc^4)5c)>mMQK&SyWubTqd4muPbB0jmZ&WZ8A_he{Y0EQlT3yl8V* z=B+HbICT@=zD*@)s73&xZ8;HJX_?wn?h`a z-o;I-x{2q{6T=#Q5{s57Rw|%lj=xM8nS|~`^cx1CSOmB}jYW`QO`#ps$V#seD324n zy4NG+!k%wWU%Z)1SQbT>PHbg=@`_qM4UiqGnr>v=U_>G?BOe&Wf=%z$eG%|b4S-wA za9ObnN$D*0LdCU)>_wX2bF$-pH@{yMm%!1giXEMz%lfU@i0DQV4fVobGP7z4j2K zz^*$k;_7n#yg#2L%67pbAe;AVXsFTl>`f71K^zPdB zzcVKH>XmG>56SG$PCP0@)`8_xz!nN9o@?b+O#Ni7qHr{hXa1NA32JH&+AQ%%M$`e% z;0y3z>Sops7+=bPB=;9Qam2u0d<2v2yH?mfbA~RotVTVzi{1Z3_m0|JIT|w? zg+)q2*Cmo*#!NuVf%^UNTa1M5_BWT(a}G9FTBUvGHD?i|`Wuaj>Nmmf)W!uaTgG3S zY7{Mzl7N<(jv$>%AxC<^gdfoJwLwv+Le(lz3)I1b&CtZskbfFusb`W_ba( z(A=$I?ZNT+p^2(y`B3OA)HpsbtWlcrjanOI5h)7go%&_`%kbHp{HJY{Z6d-*=4T9I zKjFua;&-&Kk!Doer)4((dIp$>B&_7=lB~-HZ>EK~Qt zksGVp|NL5kQO-jq7$%mu)qFPCCh!>-u|&~T4~i-c9%m3Mp1KZZ8rjwe0b}mq4Ag|_ z&{r_|LuJZ2UjfL+tz-d zyag8Z$?ztMuxV$(OlCMy3f&?q{#_Pu4^G{ z4&d{mfh#|G3k#mF($g$U$7WEIlDvZF4)`?|nPP!h%f)6J@*r*-s{wY9D-+!GFo*lQ zhRiV27pDlqIhC@V+@`Rm*`5P>2Z2;}h*Sa}Nn5pUMh7|xIXn1=dsU${+gk}5h91~c|2#Rxsk`H@kkpglWT`fiTa2VbFxn4k z*cHtmzMQVfbE6DL#alka=srrKCg}>AnPZPO12yuNm}gx=`#Lq? zLz8{5-FhEna7Zid*&xFG=G{B(3VGH>Qu)q%7UQl#P(B{(cqRl1oZWd}t*D4fCqA;1 znljEwkLFwHMjmlhbL>-&G~6_(dbyjGYq9wvCPDyPe< zRsMx_l|gM|_(VQ?WWw7J_JZ%Tej2f98)lwsb4vZA<4nkKluZZ7iHbzD{z$B9F`tt$SsKB!6KsyFSh0; zH(%P18w{s18uSkX;fJ|K@u}ae_)THoQpx+Hf7Hisli3-R0aPf}*J20leECtrriND8 z#&K;czio(FT#QxvtRL=ML?wqa9%qM+j0vQMufi;c9ns);SJ3zO;Rw?i=6yPXPl+O< zT_HKng`y*uXj=E?Wyq0(5P!z9RL1#KNY!xljV~qNUT{2I?)kbSyJ=G>%_Drl=k*_Y z^6@_xm6_6Y)t5*Br}mqCwNXc6C1QW(J54fmld54tKHUm{hfq(E&D!_T7l90brpvW! zzk*nAsLkc<_g|baeR{GT;n(gTKdFR~`JVIq$t%C9D_2YBRPwgr4EHU?Dy5I3#uv`2iAD$8Zn`wp0^DS9UEQn{wOQH6_TEq5^ zd@E@UoZk>*cABi9?pz?sE?He#k^xKBsV*hfWFOdobNXH`1oiR7AV!;9bB>HDfT;6IFzGU_N8Umb}i^7W3?Kn-&Ogxqzbz8>?*Qv8nACw zgv3U=nMLLL3Nzk0be{V&DFgW)l~Aqah|K;_ddzd|okHxMeC7Gc{&v{|T8V)N6A+1=C~H?eANj>}}O2T3mxhuNFNlJ!!>(>zR`Ye=Q?6N@B$o3T0G0=mTK2AOrfc_ zEEKLi8$SzJweH#Tn^2CVC$7tVwJfpd_V11(ck!=H3uh0-)+Oz-tC*dT?!E&r7k6bk zD@uyqLn|KL(g?I{WJ$#GvGgqBUiUsrt;-o@E6GTE?!~C|=877V3#)RrX3g7chmkra z2wJajZteQA8KCcP$qFX*oI@}_m~+J`1OBjRL&mWvpgq*gvNh8>lUcSa=08fH2hk_{ z#T}t6kPiltKeU7NO!o(86;y5 z*~u>uV8x%7s8iN`;l}7gKp1mn9)93P4f;h-fxA z^0Y|-mBbAr$aDOIc_^lGzH1QPXFQxmzDPe}cF!N#9ql6EMU2fi3RwIpfMMAq#>gZ9 zpoJKGxBkg%33^{_8%#P!Ug&MQLr#~_TO<^ikEtCJUZR#Yq%~$=7q?MXW^W|(jjd&8 zqsmZ;?o1d29}^<*Epu0KT}!X`J1;LA`(8|-({L|ZX4{OK53>oS@&o$mQv@-17-&!U z9(?}uyG7+hoGnKy1RiEM9d8+F0TL|Bc@9jdT-&=`^m3ruKKrU6EEbGt_7Fj{-haG2 z%OLfOZt|no-LmyAGYHZ0l-@cgR!vPZAV;-J{}z|ZP0NP5pQmoVNMxHqZjK(_NWmA2 zuasS>Fh=3>Yf8WC4KQ0$K*Eb@LP&SvC7S6+RL(Ct}>A{h+9duU0XNvbDaafsi8waoxAV z;XeM9Z}#i%V82)({;@^MfW%fVT4x{s65J8@VZ$t{95?tO+U7LNKN96W%?379yOAx! z$1!gauwK431xKV}I|CXMtXO7*cVAt0Fi5<^-aM71Iny#M)bBXjff>iMRa)|d%iJGY z8&-ZAJ#HhZKwADf$p%i)fL@>*_p< zJY2u?!RFV~t2Z3AP&;>&(X7$Z8ZXl3r|yMKZD%Ho%&fc(G33;MbN#|pr+Eu9C&$Hz zqJP>;?w#;cM_I|h4fXM9E*ID*Jg63T_f2z6SQ=YjjIfK34?e6YD0S|>%y!LYOffP zz3z#J8IYF$X+Co=LpH)MceYqc0i?i+L?nkWRjw=DCb$LGCO+;iT2%eQkHqFU(0~dq z97!U`xN^2iwhC%d>GDW_lWr;z3$I&Dg*e;7>1<;=)-2A$2j}}pV8l7lmu39w;r87J zOhdg(qxK`-;mt(RSB1TyxUF8587RqKlFg%($Tm;r0#nPoj|%#oNUJS(vLW8x;Docp zEZe~Q;UTMo0a??jcqm><>gp%gEA7+8zPOcZDWbP(%Cl|EkVi?RNDZtWp+jvEMf=if zRz_i+WrHH=IXlVzP8xEqniEib+Kba+SQM`^ass2u`}){KJD`!rMza`|#A+Htz6zWa zi-Kjqn_F97v$RBFKFcA5cVye72>we?jRSr}2cdlQa&SjeYt9)I3pLFFT(bVm6lG`B z^YnXerC~|t8~@Mv1nMTUnEH?J9UK2XGivpvnLtb%*-7~bd#17UpYi2geIlkuAeY@Z zC{sv*W~_0dbIx>2u)yO1)3e-rAK&_iUIlq-SgGhgp}AK5wEzahJYv=C8s+D2UsJBO%co=<=*ITiG8xg}qFNZ&-LI^%SW=(UjV zyRH|OM5ar5=7%?t@NK2g<2RSomXH+ffKR^^;i9c2<mx;dv+y_V6r_by z6lF$%4Mf!OQkgco-UW8$b)4eLkN0AxNhym3yZH!V(2!vt^+YF&g**k0>u^;IsBH@o z%$Nes`wym_Pox+af`O)F*y0__Q+z&P(&C89$MKk-bFp+*Tf?h@jmQVEp=#aRmS{{? z%crAgsqPX7mJ@k`p8a}k^=7sXEciLYi6UU-h=yU8;?pd9Mhc%0{Z)~~f~7HFV*J*L z_G;>_xy(^_1H+>=z=6sN4a+@qAz$aWcu0?A`RO2iOOOZGUAcx#S=!6j zDxQlHJ?V(qFtg&92U3J4JI04Z4BoAtojD{t*==r)Q zpuF*-y$BwzJNadc+1V!g7b4WOyZrb@L*SAd;Yu>TZaa zWC%j?gEQ`7qk)Nf9_86!Kpz=Go4hR;wDtTai?*O=AjWwqu8x&nAJ%M3ttA(v`t78( zC;SU|t^tKn-)6T@{P?iz2dEqusw|k-b}%&`Ce#vo64)#Vj8Zn)37VjNdGk=E zb8aqbp5ko?rs+vCACBy|l0Qa)Bdh~S8V8h40}8rhGBudy9pk;9#<39(2`@5xm-|9w z442#+lHzyuR%Uz@<6Lg?74HKD-(+ZG?;6E^@Qc05804z}FE?WJDtaKJs?;%?Hl;I( z=Z?X(J~Xul_*Rt71>73Z1o9XnZF?Ui{a!B)u~5pR!3yn1BqV0UAUE}SKEmbocp-1T zf=RiT&SynE@f03L<#Q+(a$FGzzz9rA&@cJO-zB3t5>V$ll6TvRsy8^`(Ar8%M=;(B zYCminErWhfCg_nYv@e`j-&}ZDu#ds7C)`BUI}LNTv*uT3(mUIjQ3-O6xfU~rhgwO zI%PZrDp530bfDWmFAr*U6q_(LGU3eH-BJAV*^>PvC2>)h$q6XoY~My)A!U8Ww7w^a zCN*OeXCI%WZR$|2E5NmUN1_!B# zMkh5S_J!h-%MS=x8ozOIHo1LEgjkjo2kyILkQEJ1jq#)iNM4I<^Cjo*tM|xoB@-I? z`aKA)8nZDGL}VcIh)~Ew&QxFOu~6FXQWp;(ZTlm^f!%opQZ)^!JiEUneU+bM>+Bu4*&eOuu|DgkG%(x$ z0XRU%znl1=@26}|NzlJxgOhlqzCX&i69J5MAawIqpuSsBd7dr8uGuaE$bdW+JzNYR zw^qdJ$2mcyp#v;Uuj}-4H~yCDxu*e) zgv>e25*;H4)EiA~wR5REf+m*%jw-NWyu`daNQ>0VC!OP?83AKsL9HI(Y&D=SY12Ja zNB&MRaq0UUbZEqx`cHfq+3v~uMvH)RdrP>!GoF5L{-Z0-mM6V~o*htxkki>&yCtP2 zH1i9%SeY`RD6BAaMAAR|j%m&jA%2NFxf?#hDfeckbT?tVLj-Wh#}L1%uyG*@FZ^wm z0psd?s`pA(HvTCmQd?ADkBV#-=E1FdDMXIxs_70iI*;1?UXUrIw!_WxOSTeH#4V=w zHxe~qOJ;HB4$76Z8H(`ltJQwzE2L2F8D)y$+I>=8{UIfV%Fw)`P<0V0cqZ?S+qzzQ z_;+2Xo3u?gR#uJn&st}{meGSs+``D(xi9(CrZN=`6<1ROMB5@IaMApPTX%RqisHk< zO4LERolNO(-YsCM$4*6E9k6;927CG{sPUV4=$v8E zjxa25gjguD{9^^FxWS02&E8jI?V|ab5hINwM6toT@{4lya`IX}CZvQ^tzOUD9837t z3z^ky1K;Zm-7aY_Q?ON8;`aD)5VHw)d0UXRShTzFaGWnn)rbXmqB%3Ap&qaDr7XQ9 zFI}>L5mtK<ML&2f%MtCNAFe555J?aKmlJjR>SkGC)2kHf4ToV?cAF3*NK1~ zl2PI+NG)DGw>87&^oDUO9+r`G0s?aYIz+QnJ#clZSBV$K` z`SUwGu<%u&bjgpwi7j*d5f?x$uX2~mIi5Xp?jLiT-O=j2(}#CWk@SNGL7}sxM>lx` zN<;`>0M52?CBM98y4Tl=s8{NlmOfz*li{5vQ&nl=BE(xsu1K6#>oM=o;6&#bJ}Kct z?)%Z9I#-V8cV_hYJ_o@Ry{VA@Vgiw8z8Wr6r<>v1j4Potj#7H1-&EN6a1P~L+S$@+ z8C@Ueocd7!PR;mhxrT}(dFE%rx)d4*jEA5FADKrC4kO}@rs=)*)i?be(^oaZFB^I+ z{i%!a#gD2<`%?ve&2mf9m|F4E!vd&<%LxncZQhtBx7?p>J2*RbdVGfFXJP=-r#M=e3XX2N_GeOLT|Ed^D9gjVgjyx-=reZBGc{Qo5W z&gl+~wd=RIUskb3WO%jYC*8!Qsg+wbRwD#Am>dD!62xL+8eNR{*&UhE1L zoB(uSY&du&(mdVu>?Tj3X^ydQk_uvavK_Nt&nS)=HJ+P#jv&bZKG_L}5i8?c z$ZKGbgK0WeXkQe`c9mPn*#br7ml#ymjX%B3j4XH$!&b(@n!P#*Yee>gpSsV5W6I3^ z?XQm0huSL@NlM^(1I%-Q1jfUyJF}x0+b_rw$(YT-p+u8b2ZRjcc!L&xZbjIgN3A@j zWB%`^ubIxA-j2P*>RzMN5>#TBJe65faSsp`CF30zy&`@qQH6fFu!S&#?Fx2t6&FF}*gp zvi*j}`pPH-L?dWZa!Yn@bBKa<$i_x@EdLBawSYtvss(kC$ukETUVIMWCXx ziKJ)BN>ZX#j5)%5Na#5@i#~vOoO(e-mvg95(S7`+x>g1r$BKU>A<=!+-4vX}AR)`5-$<#!I;YKadHBziBvqslRrBZU7I(=5b4qd&X3+zvQ$cM8sepf%#(#O?NE|N__Xm z`ERRTkQMT|l#(3ycAu5zFk}ZQM`L^Z*H3E1`geWgfpmx^Yahy6b=RA^x(^e6U!;k9 zL^p}`*a0Jke%!rL94r9?0W*;_p(axAX9>sCBf^E$=k0j-y1rm86A9SJW$Rs(3rp8fSs0%z(2e1!?^iJNd1~b2mYoE+MTK9CKccd@0(xb z9ViYCjWf)cNw>BtOjH;{D4x64oIxGm z6ER3QicwU{VMKd)P*c0%2TX8SXBaNu$h^7f4DyYXZtDhMR||0S z9p0PL?vu0c8(wM?7aLx_M9GY%?ns(O+5*4LLB&Is(oim)o$ou;I>!aabqIeW2?KwC zKk@G_Oo&&o(yi7v<+gv~a4`m{SYNW=Pw7Z=E-{Pm`H!a+YERv>6>3h=M5~cOmb{5B zCT)cro7xhUn<>dPOg&wMh~UW}bB3#>uTF<03yyAylG;7f3XOWdIJ{>dY_T>LoKS{l zCGqp&=jl*bZ7#}U4Mv)jXLV+2s+{PCfd$H0^zh^cAvZkAAbz^uhO>{G0w-&m=aOLp zv;t|oNAH>+_de<`FW=R_dWAnIYyfqwQkqxQ04Y{0(PtWKYoEfX4IG6SL1PF^MCbet zIuADDMNOO+q^_V)g=TVjKK%}`FZ!onMf}l!7Po=5aM1g@+|3r|FPk5CRT#oV{1rer zX0r@|A}4l(CYgOhDk7ZP_4j;L+%k2h${c5O?`){6j5W*%3eEUo921-Xlfmzt%)jz~ zZU1NSj{&vw%SK{(6oHtntD9L(M6%44>eL0u`)2oi@=dQxnNqs}S_t4GJJkV8k|;5> zLA~(CSbNlAPgr2H;nbf{=Ft=r`^64jHG$C}@zPO3@%L;V5@%|cV}FlYB@bf$sx)p5 zk^vodCbZ~LIg|Kwmo?uLlyIwjQRl3?hieH1Pz$4&rP*3wV2=e4)GM3rctuG%^>KJ- z93vl*!FQ^K!$+~%Nd0mlmI5R;!7xpt&IyWqPT*sm^ext!3xkIk;Vfm1Z{ z#;qbQIY)`bMb8*}=LctlGt;2<(F8aV+Chz-0NUMLa${TE5wcO6#tg1@^D0I1%<7I! zr^WjF2|7B_tN7!;#aNy`PmdW3)+<4*jH)%vFY>@c zm3&$7_Kpu(HJ-xf07*V@8im&O6;=NT-18XZ*I|5vR|p-3p*r&F^>3V*4m9GS6!ig8 zt!<%t7qQPn9lYnZucwMHMEwPCK1*NRVWPh-XO1bwq~)AnI=S(5wXnhT~co%-@Nm!CGi$ zbrVa?*$UiV@{snRr*vQpqU5I{WC=QnPgyBnFi2G7(Nqm+Z^xgY9bGZiz2R78)J7OJ zm9LxD{G9F@2Rp2daAy2l&mP z!!ub?GQTZ1Fe|JnB};$-%tC0`8RFp%r`Z$6E$E#Rfn?@#B1KBoL!(mNy=8*FV6n$> zlYX15xxI=CEu($mG>rh8TV{6Fj;|R`7-eIv021g~TsIUf|ND&4z}sdpAih zv7Km(BWZ1{Wd~1@M`So=VmF^B!(DQ96&T{7;T=BzQJN>PB0)gRaV-pe!^@*s6~!s` zq%L+yL93R510<`=t8W$YjWALN(t^yKs+p9-0+V!yMkV2g5oRGtn%ok*c=R4hiR4#ORH87Kx@D=|Ja^QH7 zDC@ecVJgX3mNsr!r(X+5@!P4VfKDouPoYrC=aUR^-jb%k39pzm^i(Zb`9MAV66~+% zIyP=T$|?JJo*I5aOToias?=Iz%e#1m5z3R)W_wrlw{J1{Z=?pMQ|Zb@dX83kgD@zt z2(NW8s;ogkQS@(P26JUUFu#ILK6csV~-2vMOVypTD4Z7WlV46Vk`_; zSrhfioqS#-uvl`!A1=t%p^yx1IVK2LWqvDS&?;;bp4 zfGxOq*ybw*ydqht#3UgDVe(m!O#E|34+P!UpWDnbTLVI(Ox^K{E zXD}4#l}siUGQ%lsEe=nQD4fp?CoN{CSPRwKBn^{lZjaAGYo>K^%^M1L`qhxBMP?Ut zO^)XvZdj(TgQBi1O3&nMaL9vNO=);7=TK70%Urv9!ESKi$AW9Fs>@!CscKqr3_n9j zF%B*L_SO7;mlQ%jhA1d5%S^yU$l2;0fy%1{NED!G*W+#c&K6=OD$}pr>-?Zk$F}_) ziZsfWP;lmtG3^7e=V;O}Hll}spF0ci`jd`=F#A-xcA5lUBT841Gc_x-k|o)DP)0p3 z*h6R?oT-vInFw_F3@<^6ldNze-=|@{xDYN9BG- z4mi>pvcM$U+HskZ_-X~7jb8@sb{D{hm`@uY$Ij)G4M|G0kJ=plL9SZnrmJ(eF(v1EHmDDeaSh<~{B*wY@>FkcV|=nKs0eHFYi^^gEB+; zY~)N%mH*Km=yJ>YLO_MCBLy?RWeV|+P_Vwbf(Yt)S(rOt*u(Z%@a9SFC^vTy{-mL} ztk6?MdBTNXqZ0{?8)SEe*{?1qN^an-b>d*TMZtQAm}oCHinnhp(%o9f*Pw)bw9t`V z%gF0i1wyk#xjgZB65k4Q?5FH46G(U)A?zkMYzY=fW@mW(aKjFpchVauy+e z^^j#JcldJaZ)xG(6~KXs7$pfyEXK?kg_`{eedkdhL}MS`Tu3lh7E~tDJ8U%?4(1vq zIqLa5afw`ESSHf8DF7h8`JOBFq_+SMjYFU180j&fkzF-qHwED7=5Q_zFBD(WUOrQ% ztq_uw51(`m{ut+0S+e+{o0fGH5ff;ygbzbL$Hy3)83pRJ+PLr*H{aJT zAGFKofPN5F12J-jTx-ikws%We&JIR$H%)*do}Jl0jP%w=DYIYRoYN{6dolL(**Tzlvonv0&n*U> zH-wUE9uGX&UeG2^w3AE{e|iPf_?5E(Q}$h|SXJc%VY9>U+9c*G!c!3D>BTuMj~xa1 zETHOK$>t=Lq82<;!F~c4kt&4Vi2gX>YrZ|rQtrIHLjtKH3HFp6dxTEF3eVqfuuLKx z?OLFt?`Q5bCJ?D#MtJu{>}=0@?c4?5-h7%6=%zZfkeDMJ<40KDOLNCIg-|}gE4o;( zXMnI*V*{9hD3JNi{yFwL{9~P1J$3i)e1g4X&c>i%iza9xBO2V&tTAmyT~gPbZyzC( z-br!&@LFeOXC@MgY24J?k`Bpzul0DR89&CzFvEizf-cNdPzBtKbhoeN@oMCOah37% zZOvwgt>WhcDWD5fDCMvuWS;dA4LF4xpy>}or35p5G+DSaVSfNTGBiYov4@@UKN7MX zkS)NpOLBfwf8{&#s_{q-$pLc6OJE}#jy=B;2(Z}?LOw2)HTcdE<>4yjIc3l8?m})* zURW47h?J3(aApQgpE^90;X~|##GyDMxz2Q=lN*>P=wg2g`N)x;VCNf+5Kd1SEX6vL zLKS!LkWr<$6VNUs2k0a&IQU?+GxNzidKuv&>1a3Nu`muuj7Rz%1}0uq7WEN-gSFD0 zB)_UzXwvOs$Z-{lZDJp1;{J}H3#>f{C5InFgPQoYZT-}DQR2V);%iiD&@VT7Yd1=* zUM%~6s2Eu01Q9p=_%}7<9?iM2!Gj9~DQ&H_)A1Fcmp*t?YiKaIuZ!(H(_&oyGpa1c zws8~_GwQ_g6nG4Qti+(|%aYN5QD6p4Kt!sBKmjbA$5-{yjmG!dk3lt`%2OkN=;G5W zoV7dBEOXpE)$T(`@Lt==CTi?W!Ml- zW!V`Hbycs9f{_L~6m>ZRMmUsP_y;v`p@p~6s@!{y{2TXm z?bkn`XdT4ICq+B32=8?*Bl#5{JYaUkAYgW8f5;B+p4swa`T~;+hp(|V_M&nTt&(R# zp`GANiT_gOe{4F)OroI8Rh5oAHC)WLv^^N$i;5r$=HZ%;($l!9qp|=saWYQ{ z?YrZrim}Q9qBejLo`IvULKBMspJ(Fe^6~8$xO|3enCgkSWRk;asX!g1>;2-j5UxB- zQk_eV(u*Xj9#MhVFOU~E6srBbb{Yg@_B?ke`)CEAEDd-PZHI!`e;huXj_{8OK`?!0 zH}4cec;l|bh4j59X0dyYK)w83xm8*eIgh~seLrxx4&#>FkLRi~9?G*5=z-aC%ihx~ zoVB6FNsXU|@A%f(VN?Pa4HmQ3pO(?#!CkExxl8o2CVxN z^G(7ewCtK705nE{G8_QA0~7O6o{iBs1Z)!+3alKo`BK14`2+(TZ|Xgk zkQ=_FCssZW?F=+t{?_^|rwOc9+;u>~fK1cU$JKK5OkHBai70t#SD+5wDB*pHjtWhm z(@ba|avyKL-J?1SM_fREn4UBl@Vm@5veSwalt^UqJiawaLVNWGShWrNR2W(i$9Mo% z``h2F;}k?=(Dw#5m>d7)*0+jhqUY^6sPD4JM?{}=>H?a1+jQ{uO&@Km$DTR2nLznL zwb(Hou2~M=u2dIw0Gqk^y&i^3*df4trKPy=leSftuPSsYIN7O$EfL@hDupGMYY<(15c$SYFgld@D)J& zl!uTUE-x;|+@a+6P4YKsxLJ8+?IB6qzWhOpeIrgj?D&oHcTnrZlw{&&purZ82v|en zCFeFJr?WYjLs?qzJVh`j%ZFzwpZcT>FGfd1xOB6L@|d4vtC|>^gsELIu%DB4fhPOr z=)h5QM}VHm!jP_2MW8uMa7zb%4- z_3l=@p(plt5Nk7NTl(MPPFP9`6gt=BXgv|o%=8m0lV|Cm(I?;ZfFp)iFR@7;|cb+xHb7mPM zFxk;DgwwldiuD`QcZKNBcQ4E@#aZR<<$k`dETZg*XS^o*O>eYTfZO;Ojjfi{jGM_3 z_F}1giy69NV;3m&p-xx5l=~|h`m)zwDKK`cNJ}mILWm}Xjg6#w7Sm@R<9dBQgdCoW z5#WgeyynRy54f+hE=FbZ+)+q?N@W{>b<@Cg(Pj&@SnAHmt7(jiG6%yKoS=9>^9CX} zW2N3kZae{REZ+SC&`7FLdBp-fI66}2q_*Yl#~MoO9lTITC|3-zI7W>nmVE+jHZVUa zy8|}o01i1inz+3Fk7eU|AV6nhHeyBt|G0FzGuQ$b#*U3cnsLfNYLkbZg2v@*E4&hP zdcSnm_lNrxH>&VfTgzdks%L6fLmIXBC?3tPs|_4gzUaCA@N#;+ zE6*;qnS*C*rBf)f!=ssm)`U}W(}T>y?Y)dbNwL?Bvrt?&hZ<~kJ7MpjI3-8QbPW@c z2FD_b$*(hAOBCuUp*;8!P?3}bb?Xvydme=674*_Gp(4MqzAs%Y&8c<*({VrC>4p-B z;6|+#pR{0kNwKVCtIu~I|0M;tSxJ1*0LLk!AKO>Pb@LLnSui@n97yD(Pys8 z4(?|g{ge;npR;zW!+#riKiW(l$j_mYS}e%H)b`gBcs{?O$8o3Hp?Eb?4wM{6npf-I zi>rm9r!w^*1zv>qG9ulC4c&YG=()qHp|b@(FWh)wmXtR(2ZF5HvINH`2YcH;o8Rh~Z{IEkVv^Vul@oFNIlWTF%(Z@+IfyYmB6^_EV${Y&X zj?lNMvY(1^O<^Z%(jX@$23mM+k_gmr({} zmCOL=LJ3AukLDG>J#cP@7Pxqh*R(rxyPqVnoX?erd;Hc?n#%MD2#ZxBIiu8Mvqy%b z(35O~aZ-n%0S}f#w}Ex}@S+k@vIi5vJ1sYYrL>`#42PF(Ox{k~T(Usg%72~au%b<9Q>L3+04^aB+R((LXV~GE}p|t^I#N#-w=t$}w zYf|N#W8dFoD;lgO+KaVEH;UftaC?OX_bvye?f_tE%N~;G!5j_9V3}SZ4mW0Up;(BV~pne5GXOosm zxFEb~Zk{W&sY!K*d8}jPo|_|8w_CWjQ^TB(N*%rMp-hP*Ads`rqvz_XzWj-zes3r*U^d~lRVo!O~^?Q6DLJvM;0`PCP@ z-#dKP(rXu>mPrcscPFUDRel8^OwgguAy+MWQW0=^0ez@%M_Uz zTLnNWa?fvU8n6DkfnNdyM0y^b<{cy0KPq)4^c8(~PM{J3RalaiTZibyi&O;i?YiwE ze!j8z$DtJJ+}i+otHN>!^Q<)N9jHidQ3Emi_=+3pD(jWuOV-m!gq4Ti<_SN!p#cLN z_-zEK;l7x&EdEFedd-l=d@W|394$k}1kkg~8D&tDGiwpXGzCSsljRQ$Icb|YRk3dM zQu@uQ@7WFWV4;p`Zg$5)Mze2LBsU1OXlf2*X@8VKfvEGJdtA;QU9}o`VJG zrA{EkKj^lS6p#7eQY>kTAl}(_N+Z@lU!^-YGi>-%4d|2!{LZ}1BK-@Apz%}JAZ)&r zOq^0vM_hSYPn5j!XPQSc&R(I46&fO|K%qSx?>f|GH5&H>x^5tYLDf&3IJ2aUFQr}6 zLh?IqG-5yyJJEb4dcbtI_d=NR1o1vkVPvsO7|p*<#+4Scs*!gB$>cqySGbZQGM!M`HD)Yl2u<*s9SU&puGtTlL zPzIs`oX(aj$b+Ba-KH>o|B!tbuv83$iJ@^AX+GzEe3OJ-d3@+%oWBlJbH%m`J zvHXkvDjb?k>BYV|y*juYhbCf;pt5s`b~S@5k4TFMOT+70{}pr%eoTS2L?TWjw!P}J zMmOaHmY)Al0Mn@zQN^rea_Ttz$2~NVb$e(P3z5+6G@R!v);T;oi6Ni0T5ss4&iH#Q zdh5+##7%4X`Zzgp#lWxT`Cq9;P+0EW-{2>U%G3scmx&u@%&B7mB%>#4&S+r$fV{|k zOj9Ofh0mqe2wl-4T`U-S^)ST)DIYv1lu$?|$;~5|i!+$Qr=o~@;mZ#Yggv_#WGIm@ z!||8CH4QSCSAf4<72s+T2#w`Ww&PlHBk!TBJ6@R#2&8jg?B=J(6nh-EG@uooYu#ZA zRH7?Fdw+Y$W6NmX1ZDgRO%H|jDLP!8WjDYpd3Ei3{Q18S(Gq6Nrj(O$X5$!}I5_ z?>bPv1(mVumOb#;nrth677a{ENQ=b92pXz%V_|u#aLhK=uHRVn>n!#%2!coZgRs_F z8i=pvrxrtZL&9sWKf!i%GkZ1;x{OG_B>iK0N{s4)dcwok=-;R1G7hY)bcZtrj|cr= z6N|)Y+@4)Gs=$7K;{%x!lQ7U3k`ewR^n&ynd8?JDGMJdBjP&QhX}~(oPHnziFIZ1_ z5Q|>@-G;~G1$l&*MmSq$+#_sxJ2G~%M80F{nRzv->5%&%bsZsL z2XUq#PZ;EIVq?qe$1nOgP;@U#Q*8IhK~J?a9^iZaJ~`c41PwKCKk+!Z*5|O+UM5Yv zlKmhjv8jnBJSCENxOir%=p>e2>5auEx^6&6?J4=YGK!w7P9!0x2mdvlN=!4@cg(sx zzx8=Q&s-~DRGn_ge&O234!WeVoizV?NQq`KdqTpjKp9go(;S%%4Zv#Y_&2Lx!RA#7 z4*)O$cGOU$b&E<0_m5F&S2C4Gw0(bhGu^#niR95{JAhaGS8YN@?YHK>HS{oVq?~x1 zUl8!#CP4->OdwJ|(u8zV3nU7e7~3Zj8)e<+(%I8j)LVXg2sBfNsOJjciJI!oUTgk3 z1rfEA6f=Z51%&5h1GKp=nZ=gK9tDm_*%=;C>JKdJ&yPb_XK#BBm@ry|aqQ9&sS95W%&XeZ|F#_%CnEnbof{ zNu@o>_ynWpJf`v}DliFZA{2^Vxj7l9m`Gn~{gzI7s>}e4EtS7X4hdhn!AaI5vD>k*6xH%eqhBWyJ~HuU4fLBRDl-`OguSap zz@L87E1l=Xr$Hx`I#Ja|x+rwrrWFg&`~v1dS+EUUt=v|7g?aBff^g<-~*JOX5hi5UKw=cccT>&ENo$w^bOd$^8AhyyfD!SB9*c!9~g)3a2b?=eM^~*3x1RF$57ES-f?p( z7-YAY9ML%26Rdh&OG`;`HFdiLLx>mHz#1(Hk4=Egj3+tTXC;ZC!>tOXOd|3qz_fKK zIw-S-?~x~glMl>j5;C@Cal|t4`IRwUsFRRjaRGK-KgJRdmgFr#^M6k zP}e#qPm!o*N+p)HP#3C1-i3Q%kRbwp3l)oAG9OgWZ4(qv)8~PmslYSuHYBsi6xg}; zcRmAV1!FYrk%AhWsK#M>Lh+d3myN{6)Y~xXJay0#Jdg@ zLTYxa$9R}5J>~Eq@OU@I%MeECeUH}k)19{WZ%JojQ9d6mc42{(Un z>O7A&OATh~1|yR1^%$Lo_nY%$h%-LrSaf8jFHM;Ir21-~RuUKdN2xa@RI~EjM0~@a z^G^`{9}qS?m}-SHZPg-D}>4AluQ$j zucEp|Giz-hUy}|WX?$jwF+*8JFRNjkk5S~CvfmOZMh1c)y=O--$y=4BTeV;Gv~sR_ zOeI|aRfc}89M3N1J9L9frp)DzmAKMpe%?G|%Q3tKZl^Ypu6uYBhGIR0dsE+%b+uB} z`fv$~Pil9Dy7h6&@9=|>HiE>pGff7)GH0XjgKbp=?I(FJi%%U#V<;0d1wsHY%ulWL zs}`jvo9aUlhCbLfb?1C|mB;4x`3n4mq<)^2UyTZZyNI`vg{^ogPJ^4y5927no+1ET zCV-<8TZL{Pbe4Y>(PFek_l0K@JWgcMc7~Ta0lQZ-P<6m+0R=n5`l5h5AiB4n2TCS8 z%i1FXje5T(m3;hHaNEY+;kE5(Mx+S1u&O*`^mx?JJ?lb{K!PPs#clcc~EJw zfIoHUM}h-D`|!z??_3(!Z)-cmo?&%4XJR>IM0qb{KTKPvQ1n>E;OCSTMUVPU*^U$vOOREj*(IGexTQS4ZB1lar>v5o^ zB(&Nn&-DOL<4tO@Em2ZCn3NiKpE$G49t{9Ln9XsJjIfC+bBgE=%KmHe%_}pG<#Fou z!ogrv#K8HSpf4bwmUB{jIR|e?)=`;Vxn4TXlthqR3;nd#Sdq@i#p8WiuZxzp4mGl2 z(PkR)l|75}pviPlLF7abWyDW?x2zN6w=eJDyrdys_?0_kaamy3q!t+6(KQ(TcWv%R zshyz9rQ?QXTfIsfY$m+?@M2YQha;9_zP6DmBapL1$3eRo+3IL#NFLl`am4b$mT80E z+{z;J^YnpZA&I1E@JXbY{UA*i+!Ag&y_C>gi~u$&O**ZKv1Y6u=ZZh&*pKFQxnb(~ z>sKRvlRD9@ND`1qQZ?ux$y!R!Ue|sP9%3)%dI&}DEHH^c9xYC`x{#!}*KY3VeXviY z$CZoB-Fky%+W*)TX$s#fub10KwW!Z9fobIz8v0mPblid_nmt)^59W>bOzC0VQaK3K zPsJ_zTc>1J3f5%#8C2E%LZ5o3Zd&1;_+-VMEE4k;*s@mHTi3`c#t{}EOF@cCxmHec z{VW>g8G9E)la)MVA%bm$uMLV)Q6RVEB-3uHqyEv0ZiM8Nc;2fidXo!4X%zVqI#i?0 z8CgsW8}n$0UjFyMQSj0Ln6-0)2^8DX*nx6LM)E@{#U5s$Yh%L@hCcy~ID-lR&dnV9 zeG5aRr#<{~S+yA*%P88kL$W!c0}zJR|3bS~$LFlHK75lF)#(_dCBzg}e~*dR(g-e& z2fcc>O8&IzR&59n?@yCpyutWhT8R?wo%%2bFL42mWN!JHqI)#Be1bY|X8SbDS2 zQ`$!8UCoAD=UZkC0Q*jq2~%H;uS7SGUQUs3r_4C2awA9(Wsh)b-~2)D9qU*`toBk= z4e6%5xt(!9BSch}rM${T@995q4XO8M+^8C)&s2QSUygHk*jJe_TS9P`{3OXI4@3a; zOl(|;lQF`;kJ)1wwXhpRn>!}HY?tgj}|GnxG6IJa1-x zj%Jd;8*cwou9PMW$C&pWmsVCiRnGdO_drT-)`VYFnV|=_-k{sec_GdHt7=>=x$Lh=D^O>kp zP;Qxax7K63g>N(>xr9<1q2`#lojXC~zWHOFVv<1RBf5^T$c)Y*RDx#FFym51tE1Y4 z10{4Npr{Xn4z(%)f+wpH05;sQRJvg}0YlBNKzgOVH85m=9MR{os;y}>M253!ac!d+ z!>8Bo`wsIQ07x>(d54OEA=$!^bL9!Xy#ARjGe~`Fq3h6>VF?mWtqrWfDFntnEagDA z1j8L3GF^{^h%b!p7yy{WVq;Z7hLlB2n=mj&k>>c=`X_oIPbTDd{xZOD{E!@Hh*vG) z$CNmdmDJr;GRAUWz`c+%0XH07-y>8wo7SLV1TDzRHcavL6zH7^0U|;s1qe3v6y=M$ zxf?_uWL01ixIht8S+e4_D5y@W0;3>QRTb-#Xm3Jkq3G2oVm!L^}$|=S$g+ZIk<^Olbqgkgn zQ(jG~p?qN5){@Za1&ZZc4zLL#fPuJa*&+riAKYAamcYeJii3&2k@{HjigZ%cMMWpv ztZKQ6atImY&m7d@Fhb}?Lgt6D%AWp@>^MYza~Zn)Is&@}L~$LyB44>Utc;ik{0wdS za&ivd(r=N&UW?eYuBF;INIrlYlO>8Lwt?YeMR_Gt><^GAc1fr<6f4GpDqwNX6V@rJ z`rgBv+-(c#SE87>Ld!b;KjUCXjI6iX|EV5XK5Dpi@jBS;WtXRp?59vrOH(Ht=)oGS zE^kAw8A}yX%@$u@VcInE9BeT%$Gq@H)y>J&m{^qIq3c_S7w^UwnHIR9c0^nz?$`_Q zXg#%?<`tt{l;Xguh&qyIqfQ1!=J41h$$Ih5->&*GDJlyNNDoq?K5U%E;q-GZ2BXJ# za@OF_20b}Rb^)$ra1MjEd|mZdaIb1Th}X{j0Pa$w_zuWzt0F~Z6(xFSw^hJ_j#K$F z9?QXrr-YeW2LTA*`uzVW+@KGdg_2w5r*U94W8E^q|67`Tmr-CzNy6{D4%5Fl|Aj@? z+8Z5=AnrlxGQA`&2M)G!jo{@Y`4cOXxO+MW^w;FTBqn;@#_9rG(V^zm9f}HVDiS1_ z1ajhQv$F;Mo8yL8tyfpC#pUrRyn53fIz!FH+Q}fDXQ1VR+qx#{*V*6tcLbD5ce!Jh z^BFXZi?tN+iaM1GjBOUd8=UFZ@<>5r=Jz_rTm{_{lV~)KAS*`I^!VUa=#-dh0$svf z{7cmmKbHb9dqJWVg6gzm^7tfGl;9@BNCD; z1CO^rpyKA!#v$=@-)gO=5SE|SB7i<=jM0G`1FSMS%jk;r zbBof&^Sz!!PY0?M-kg~GrCt=U;2yfZ{CH=WrDVd;dBK7$IH6IZi4bt+0u=$*6IUjO z_6JJBsW+sI#{y5xjg!7Hbf`g%xdC*wFQJ65)F1s0W?CJ@aHf<l;ke2eno+50bu(F#7js5A_RA|4i6be$N88D zsj8pp0SI0nY|y^Ey^e=D!2d-4-=N-uyyb$81Ogyji&m@nplJfV>Q|0sh|#MJcAr^> zlx8)C2h*hm+kLU?+k98Nf@Pt+iP!|U%W?mT*v7)Lln=9T85Lws?Q~0` zt{+FAuKOe|BtNoTBiMZm8)jxPOMI-0k|nq_HgN$?<&yLv`AzAX$v2Slg{7V1kRFR~ zG8@jV5W-s+cQGQIf{^0SJQFZ|dG*=gT@3^$&p|q}d53J2@5+-}o`@|`a%Y(vzQ!j_ zTnv`Dj`n(-R&~a@?NE*IwU(I4vTNoUVl0(`;b8^Tim zk;$PwjP6V*p_cLCcngna7jMxC`4Si|VL^i?|7$Dz^O?OO>4mmOmUPLNUFgF2ZH!ze zaP8iO9NL890a`L`zF3>qr^EM8h_5iEd9#l4Xivx?E(VCkBdijIe;ay1uPU^C;oTnV zHjV<$POFjoFomro@+z_f7=U?d!h2RLHMLbK9@8eJT4+!a`$zN1X^ckl4Q5t~PhZay zXMY+RFsHgUAcjmSPxj?N^)XGy$rg-~%;y2KiZ4EmeMy#F{--2D`T0OhbYso4o2d^u zXY|hVaTXQ)DNj`l)Fxl3JWA>H8%ZKAaK69o_{yj;@9B6|w7C8xF08rlu4q$!D)^sz z{~RxtOU|tm%t(B4asf#ew(0m-@t$XhZc45GzJcZ)OQkaV;PPq6LMsRBxnQmVn^mEYAze; zPp%_NtR8VpMLu?jIMBuKhNuBJI;{B2AfG-F((3zg%-Xz3SNeG!xSObXF+tnpJw(h5 zi(!|24?35i8i*5zbK#wKdT(fQEB;7Y5>FmD_R45DqDUUyuWog;JU`cAYZ_&==calmWnm)C-~;$*KRc1crQ3%)}CjD0)X4a z>tcsV;0C@117(nsAFk8%kvDsASow>Y!oANf7xmI3YGtsq^3W zjiz2hDmJR!TFN7YuHfxlkaByF2ntPV;oj=SK$%E{O^HWky<=^v^Tm==(pNxPM_n1& zet%-$*bCT^yGoLRY+Dc64~(*BHC?JGK7oX++p8{is~rD&4Zv-Y5bRTCrzHcawa z%HP@N<<%J4;WT6)%P zNX-o;anzPkS>=;54CjvTOW^{a=I_sYA!IHNV4zyk)j#a~j+nM}7;7LjK24~;kjI5X zv)RC!A7~a0ov&cW9y$ohDnfUW-+<|C%R0|_tDcP^3~r*QJ452pYCJn}#3`p|1(25i zN1A^A30+_7e7t?bhJV7kJhq}x%y)=A{kp{jh?!U1v*$C(1Q1JaSp=ltv@D zclDizwgXp-rjpc9*mmlWTw?FwtiB-VBT-l%mP*b;n*wqqcltK{pUaDXS}*So8zoG) z-x_tw-I-cn^nMNBqm7%KK;w2(z7C)j#w(w=>}H4F{NVuk+rinU=|6BO5jgb^NTwGF zB3g6ST((mPVrmZ?7x>=r@z2?M_8tMAabd8U9zsDjWJ9msCpa4Rl}qM=A>mb+|1VVN zQ+->;h}2cReKT7?q*uMhUNb+{4{n(_80xc~#LNYMEL*-R04OCvXy2+_!klRho-qA$+^ggc5v+srs0e zt#CVdB?~Ydg53_X>fv9%Q8h*2XM%|O;~6#93e_Q>ZYK7VWhjD<+I^=srF?WV2POBK#?^->7Utk%ltxlU=>+-UfKgpD=z zh}c}y-CurmbF15k1e23XA=#fAtsL_(@Hrq7h212cERu50S?$G^_{;I38hWv-d7z{F zhMRh-a__xX^vOKD08N2{zu29F4SXwy*MsCBhMVXEt#p#AbDRU5scna8;JihvAi!^=}d3|Temj}_Eg{n^YH#z z%kob(ks|lgr`|V91k zW`UPCMHWDWl1TTe<*{T>v~gwWBd0p>MNR0#L6hqwrO?d`mRC=ygCu7~Ns5Iff)+C; znv~;R4=S|AiT-0c^_b^Sb3oW}kw9~>=HWtz1x56TXNf%T)3HZFw>QbP*X*ojny=Te zUHvqf{MfU+dBi559aOtxa1S-YJY(6cnw3%!LT+qitMl|l7tDNxOObO+Qi9#HasR-# z@Q}mxVjo;S+LUGjht4R6!8Jn^14#9&6v%mr?B%8P^Hxt=hLw%^czY3MRm9RnU&*2X zP74h7C;(m=Gm7!%By9#J5AivT@K-wE9@-rBlVCP{fcWun8zrayP?)3gvuX8PvcIJf zQP=Y__Mc4H8=vv(RPRE`lI!Ox?9@_~!ee_sYoWJid0eJbb?DS^aCl?tpBS?hzv89r z)}?8tXV`1hBRy8KN0+451TL_tNf-oLT5y3IHI6H3H*Sw&3{4}5(lUS0YvNvC?CZUR z+L+alpl!5Bs=wEiw3>+P-fDP!oE9zx)#M4d6QzO6s1m(CQ_0+S7yHile9R#Vf2aHv z-X4Ewa^&qNDO0o|xxtd@T4sauGi^AZ+b1JqR~%fMx*bllWydovM}Y%zjJ1!Dcm`Fo z|L^ed8zJVyFYo>6(-oq*QZH-?bcGiG*%YylV5-Xa$VY?6M7b8a8uGOHxojt^aVn|B z@JG(UY5^DQ`dc*m)PdQa#T9FQA{0E{cl~Nx()J*>>1B)1LN>%;ZZKAW@5C%Ey(c{3 zsHmw3ctxl)go62)k{mH^Jih!P)m_;!-I9P!;vJ%iT_4ssyq3{WtA~$a+#r~di$Bnx zn+{F|LM9)zCJ-;{{cfna^TwRfAhaTrn_@2aWtT!C!i~0@)2Y8*I>t3_Bk!jnIpyu+ z?bGBnFV$H(@X3%*KJbevR&y=V(V?ZoK`dG%I^_2u_m&$cJwN=lPu+ZD{C3Mz0}6k{ zG8TiTPX+R&1Lt8|50-zu-_x-!v`#p>9sA_oEA+nh;~OZ>xg|(^9FI9%(UHTjF5<#5 zdaKWf->mrrtpSJ_=!co&th=fBB2U0Sl$aVIwVeUK)Y4Vq%pfm^Fj(5I zi;^@<7s5ZLun0{yPGl4)&rJK~mznB7Y48ZKdC(|x$39twA?RYjEK~P_caso5ad)!>qa(sNf5{nR_)NMqoy9uBN zq&tDXVdSOPvD4ZNq!*E{7wK;qtHf>b(k4e%4e@X=6H(V1)MH4tOMOrcb)Mm>++;^9 zX-+-4Y4WVF8}0p4nrJ35etAAWs?YJ7MSX2L4+U49*8B$_jY^krI0hXq@Iuu(Y|bEtGWBTlx1VMqaJxl+*@{F6V> z#F#o2nK#l*Bmi@0cOHix{dPsJ!8sB^DuU)a=PUf9DlSPA8>7IcNOs!FPY#-GnA93L zCFwjrSinFbjVom0gG*-!AKoO7O+&yxek_~E@UCYA0c8MH0<&ogof})L)w-K%WT@p9 z*zUm5O@n8W|5Ao3HV0z5^5s+TGtt6*SKnDM?Wlp}KIw^J0u(FJGDeAJ`hbX@P^F@& zsG9*~oj7Dmu`GRz1|}HhJ_vnp@iS19g2pFR&Pa(fVUn_v)jV3_bF#EuACGCcUO0%O zJ;+Mg^sn$+Q^{Mqop)RAOxCDW_S|bzLb??h!r^)7D~~4aD|2C_kJ!tj7JuZiDM7q? z?J*#tmSTM^{|D}O00E#ySvOC(6*4*w=&mRb5vUgpNo*;*ffJV+-rhsJ|4Ku#jiMk3 z*}C)+H+DH$s(z^&c47#;`6-ax$F7eTa{tu2b#Al5p&M}rd!kUj zYADA4No4pnF1Ij7!C)0XPwE*1qH!AKM*kH1-!=38sK}+02?jFsm*;v=fUX)k2=AAJ zqt#+Lsqc{NWtK9S6<@tBzW~B|Cf~F=64#ze)kZ6Ji;f3+{pF#0%0&j4d)sz`<`ERJ zy^qA|-Es8mnD6sv(WuP?BQ$DBLtL?R0(BfD7So7qv7EW6AhV)it3o9MB3&Q50Y@l| zj8pAgBtZ^wBUyM1xt@>8hgjx_Q%FiiD^YVcV73QtZb3TN(*$r{-420tF(w?f?VJ5E z7=jrW`gD|FzHZqiSehpOiwO(ne(8-Yh$@01g2nn+S>lW&3@lNb;JTBo?t#&1vwT3n zVMeYbMLLdPlCVyvg7kRSOE9NW4EvV>ewj78$w`t&eV~6vAfP+HxYM#9Lm% zF(GCd(R+i zXz(9BYS4zgN`rI^`%)*M>$a`=Xg}yrY+!~+ab{^nc{(G879bkRYmUTHKVCuly+Mdx zcNx{I>~^jj)gyggyKzw~T7s&j)vi^aut@!Wb|doe<_{~y=Ou))eJm43c;83%>CBT_ zZi=7WO_GG-5Fib#L`P}TJc3+$j;Vh1c!HB#HC4s)z2LVjy2j_MSpJrUjIwLdXy?TEU_}+OYW_Gqoj!BP>1tUb+jxx>4q|Y_G{MQCEn?ns+ zyOxW&M2#!)H;7}BD^~%q-_Lv^D{Xu~&NeE8xi{Dot^UpeV>Zd1G`x(@e3O@Fx~@|R ztw8^;E+S4>#DME)g^~fq?c%ZEVPG^+(Rk%N#(u2BeooZ)XBjc_!_E87=We!MNG}Bk zx@hi=vu1ylhW{@3dX?i=+7x7N7Yj%R2;t*%?=0xCS7yECvwy|z% zwjT&943NY1dwvN4WT;y~S8C|Gq=$j~{{uY`^-u3e*Cly8MbWWTEI`M$kR@F-OJwYMZ1&`SCP2~b;RF-G@+ zn0a-==2?C=j-F5SN}ANomN}r)3YeZm{t>hFVhWfTI}`qCT=blntTZ=EeBBZr3}H$S zGry&K`|)~b3maC}rr^0G(Fd1I5aS-Fg;1rb^x!Zju<52fHzGm?(rxtN5fYrfovv@8 zg4F7k7UdA7{~O|~IdRy((s60px$ZYu9;LD+e*l{ypx8*_us| z9DFcR_ooB;4I@r#fs2&6S$3Gdbtor4{yQ{?`ASs;U3?J`_ z(JF0QIvTzCS^7f>Aj!N;!ynVh+>ZEbfG1ZXe(qf%tW{JxD1qo~e8kETX87rv7gL); zPACsJCOTa7r=wJn_|#^d(@k+HxbEO+m3yJ3(k{T@o|1q`%BcFXJh42pAg`e8T)|0MNdg2p-19+ zx(p0eFK1@K-s%iD4UAD}d-t-xJ$|@Hl_q&l2IWeCqvQH;nC|RJQe(_(ytezz!!ZsJ zc!X77#WDLVf`hD`X<#|E?2{PCT6-~4i8vfX5{_-FJEfihp?}sS)pPSzP!X4~9yzH2 zuHOJ;$%ZxP)4K3*Qd>Q9d2)knCQ9mz*yOu|nFcQX0uEAArfk zj+>~FKL4p>6awf)-+!IKm=yqxu&7?LC*&QUJ#27A>z9-9w-zZvA3H_Q&E-rWJ@SDo zb1j|?0JpwQzPaj`Xe%_&Kfoh7eeUIXdy32cs zk!bTzmtyJWRqs_-)sLkS9;`%Ct7yY+6pZ{F7<` z0gwO#SCD380)2gZP(Uw{BP658gch2%^jUUz&^YG>kT~#emK7OLZzamw09#~^3NR%n0A5kiQrn*6=9xtR*Q9!qn@&l=8aP=j@b)z8T9+=wOd$+M$}3>hiU? zbQ{Lx*nw(4&RXeOVD{z{uW|Wyg~Jr$&1>?PKL7v&>Hq` - Configure Git properties + * - :ref:`Content Processors Configuration ` + - Configure content lifecycle properties * - :ref:`Content Type Editor Configuration ` - Configure the content types * - :ref:`Dependency Resolver Configuration ` @@ -3512,6 +3514,157 @@ Remember that you need to restart Studio for the changes you make to the above p |hr| +.. _content-processors-configuration: + +"""""""""""""""""""""""""""""""" +Content Processors Configuration +"""""""""""""""""""""""""""""""" +.. version_tag:: + :label: Since + :version: 5.0.0 + +| + +Here are the default values for the configurable properties of content processors: + +.. code-block:: yaml + :caption: *Default values for content processors properties* + + ############################################################ + ## Content Processors ## + ############################################################ + # Location where groovy script for content lifecycle processor is stored. + studio.contentProcessor.contentLifecycle.scriptLocation: /config/studio/content-types/{content-type}/controller.groovy + # Indicates if application context should be available in the content lifecycle controller script. + studio.contentProcessor.contentLifecycle.includeApplicationContext: false + # List of beans that should be available in the content lifecycle controller script. + studio.contentProcessor.contentLifecycle.includedBeans: [] + +| + +The ``applicationContext`` variable provides access to Crafter Engine's Spring beans and site beans defined in +``config/spring/application-context.xml``. The ``applicationContext`` is disabled by default and can be enabled +by setting the property ``studio.contentProcessor.contentLifecycle.includeApplicationContext`` to ``true``: + +.. code-block:: yaml + :caption: *CRAFTER_HOME/bin/apache-tomcat/shared/classes/crafter/studio/extension/studio-config-override.yaml* + + # Indicates if application context should be available in the content lifecycle controller script. + studio.contentProcessor.contentLifecycle.includeApplicationContext: true + +| + +When ``studio.contentProcessor.contentLifecycle.includeApplicationContext`` is set to false, administrators might +decide to include some specific beans from the context, e.g.: contentService, searchService. Those beans can be listed +in ``studio.contentProcessor.contentLifeCycle.includedBeans`` property: + +.. code-block:: yaml + :caption: *CRAFTER_HOME/bin/apache-tomcat/shared/classes/crafter/studio/extension/studio-config-override.yaml* + + # List of beans that should be available in the content lifecycle controller script. + studio.contentProcessor.contentLifecycle.includedBeans: [] + +| + +To learn more about content lifecycle controllers, see :ref:`server-side-form-controllers`. + +~~~~~~~ +Example +~~~~~~~ +Let's take a look at an example script that will read the content and create a copy with a new ``internal-name`` value set to +"This is a test". It will also amend the "main content item" to append "-revised" to its ``internal-name``. We'll use a site +created using the empty blueprint and add the script to the ``/page/entry`` content type ``controller.groovy`` file: + +.. code-block:: groovy + + /* + * Copyright (C) 2007-2025 Crafter Software Corporation. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + import org.dom4j.Document + import org.apache.commons.lang3.StringUtils + + Document doc = lifecycleContent.get(path).contentAsDocument() + doc.getRootElement().element('internal-name').setText('This is a test') + lifecycleContent.write(StringUtils.removeEnd(path, '/index.xml') + '/bk/index.xml', doc) + + doc = lifecycleContent.get(path).contentAsDocument() + def internalNameElem = doc.getRootElement().element('internal-name') + internalNameElem.setText(internalNameElem.getText() + '-revised') + lifecycleContent.write(path, doc) + +We'll edit content on the page by using the :base_url:`write content<_static/api/studio.html#tag/content/operation/contentWrite>` API, +which triggers the script above. Here's how the API response will look like: + +.. code-block:: json + :caption: *Content write API response with script added in controller.groovy* + + { + "response": { + "code": 0, + "message": "OK", + "remedialAction": "", + "documentationUrl": "" + }, + "items": [ + { + "path": "/site/website/bk/index.xml", + "operation": "UPDATE", + "amended": false + }, + { + "path": "/site/website/index.xml", + "operation": "UPDATE", + "amended": true + } + ], + "commitId": "7f9c36d7d99fa7754198fe7944cad730e7a5b04d" + } + +| + +Notice that the ``internal-name`` of the page we edited now has ``-revised`` appended to it: + +.. figure:: /_static/images/developer/content-processor-script-sample-result.webp + :alt: Page internal name edited via controller.groovy script + :width: 75% + :align: center + +When we look at the ``/site/website/bk/index.xml`` file, notice the internal name has been changed to ``This is a test``: + +.. code-block:: xml + :caption: */site/website/bk/index.xml* + :emphasize-lines: 8 + + + + /page/entry + /templates/web/entry.ftl + inherit-levels + false + index.xml + This is a test + -1 + ... + false + + +| + +|hr| + .. _content-type-editor-configuration: """""""""""""""""""""""""" From 0c0d873d1337761727b5c683fb2e9d802155b2b1 Mon Sep 17 00:00:00 2001 From: git_repo_user Date: Tue, 14 Oct 2025 07:39:56 -0400 Subject: [PATCH 2/4] Update based on coderabbit --- source/reference/modules/studio.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/reference/modules/studio.rst b/source/reference/modules/studio.rst index a6a6f11b1..ffeaa6eff 100644 --- a/source/reference/modules/studio.rst +++ b/source/reference/modules/studio.rst @@ -3555,8 +3555,8 @@ by setting the property ``studio.contentProcessor.contentLifecycle.includeApplic | When ``studio.contentProcessor.contentLifecycle.includeApplicationContext`` is set to false, administrators might -decide to include some specific beans from the context, e.g.: contentService, searchService. Those beans can be listed -in ``studio.contentProcessor.contentLifeCycle.includedBeans`` property: +decide to include some specific beans from the context, e.g.: contentService, searchService. Use the +``studio.contentProcessor.contentLifecycle.includedBeans`` property to list the beans to be included: .. code-block:: yaml :caption: *CRAFTER_HOME/bin/apache-tomcat/shared/classes/crafter/studio/extension/studio-config-override.yaml* From 00c102a8aa61c6c163696cab6a57c98cd3d4fadd Mon Sep 17 00:00:00 2001 From: git_repo_user Date: Tue, 14 Oct 2025 08:58:59 -0400 Subject: [PATCH 3/4] Add list of variables for server-side controllers --- .../content-modeling/content-modeling.rst | 22 +++++++++++++++++++ source/reference/modules/studio.rst | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/source/by-role/developer/common/content-modeling/content-modeling.rst b/source/by-role/developer/common/content-modeling/content-modeling.rst index 59db39074..d90ab4168 100644 --- a/source/by-role/developer/common/content-modeling/content-modeling.rst +++ b/source/by-role/developer/common/content-modeling/content-modeling.rst @@ -1943,6 +1943,28 @@ To access the ``controller.groovy`` script from Studio: - In the ``Properties Explorer`` on the right side, look for the ``Controller`` field. This field contains the ``controller.groovy`` file. Click on the field then click on the pencil icon in the field to edit the script. +The following variables are available for server-side controllers in addition to the :ref:`global groovy variables `: + +.. list-table:: + :header-rows: 1 + + * - Name + - Description + * - site + - The site to use + * - user + - The user running the script + * - path + - The path of the content + * - contentType + - The content type the script is being executed from + * - contentLifecycleOperation + - The content operations, e.g. COPY, RENAME, etc. + * - contentLoader + - Used for loading content from the repository + * - lifecycleContent + - Provides access to the content being written + If you'd like to access the ``applicationContext`` variable or add to the list of available beans in the controller script, see :ref:`content-processors-configuration` for more information. diff --git a/source/reference/modules/studio.rst b/source/reference/modules/studio.rst index ffeaa6eff..47c54c316 100644 --- a/source/reference/modules/studio.rst +++ b/source/reference/modules/studio.rst @@ -112,7 +112,7 @@ In this section, we will highlight some of the more commonly used properties in * - :ref:`Git Configuration ` - Configure Git properties * - :ref:`Content Processors Configuration ` - - Configure content lifecycle properties + - Configure content processors (content lifecycle) properties * - :ref:`Content Type Editor Configuration ` - Configure the content types * - :ref:`Dependency Resolver Configuration ` @@ -3562,7 +3562,7 @@ decide to include some specific beans from the context, e.g.: contentService, se :caption: *CRAFTER_HOME/bin/apache-tomcat/shared/classes/crafter/studio/extension/studio-config-override.yaml* # List of beans that should be available in the content lifecycle controller script. - studio.contentProcessor.contentLifecycle.includedBeans: [] + studio.contentProcessor.contentLifecycle.includedBeans: [beanA, beanB] | From afc33186a317ee79c4c655998f2020d028e49cfd Mon Sep 17 00:00:00 2001 From: git_repo_user Date: Mon, 20 Oct 2025 10:13:14 -0400 Subject: [PATCH 4/4] Add logger variable to controller script and update example --- .../content-modeling/content-modeling.rst | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/source/by-role/developer/common/content-modeling/content-modeling.rst b/source/by-role/developer/common/content-modeling/content-modeling.rst index d90ab4168..d047a88b1 100644 --- a/source/by-role/developer/common/content-modeling/content-modeling.rst +++ b/source/by-role/developer/common/content-modeling/content-modeling.rst @@ -1964,6 +1964,15 @@ The following variables are available for server-side controllers in addition to - Used for loading content from the repository * - lifecycleContent - Provides access to the content being written + * - logger + - The GroovyUtils SLF4J logger. For the controller scripts, the logger name contains the site and the content type + id (``[Lifecycle-{Site Id}-{Content Type Id}]``) e.g. + + .. code-block:: text + + [DEBUG] 2025-09-27T16:30:36,626 [http-nio-8080-exec-4] [Lifecycle-ed1-/page/category-landing] | Debug message + [ERROR] 2025-09-27T16:30:36,626 [http-nio-8080-exec-4] [Lifecycle-ed1-/page/category-landing] | Error message + If you'd like to access the ``applicationContext`` variable or add to the list of available beans in the controller script, see :ref:`content-processors-configuration` for more information. @@ -1987,7 +1996,7 @@ screen under ``Properties Explorer``, click on the ``Controller`` field then cli | -We'll now edit the controller to log lifecycle events by adding +We'll now edit the controller to log lifecycle events by adding the following in the ``controller.groovy`` file: .. raw:: html @@ -1996,23 +2005,8 @@ We'll now edit the controller to log lifecycle events by adding .. code-block:: groovy :caption: *Example controller.groovy* - :emphasize-lines: 15 - - import scripts.libs.CommonLifecycleApi - - def contentLifecycleParams =[:] - contentLifecycleParams.site = site - contentLifecycleParams.path = path - contentLifecycleParams.user = user - contentLifecycleParams.contentType = contentType - contentLifecycleParams.contentLifecycleOperation = contentLifecycleOperation - contentLifecycleParams.contentLoader = contentLoader - contentLifecycleParams.applicationContext = applicationContext - - def controller = new CommonLifecycleApi(contentLifecycleParams) - controller.execute() - System.out.println("Server side content lifecycle event : " + contentLifecycleOperation) + logger.info('Server side content lifecycle event: ' + contentLifecycleOperation) .. raw:: html @@ -2031,11 +2025,9 @@ Save your changes to the ``controller.groovy`` file, then edit some content in y just edited. Once your changes have been saved, watch your logs and notice the entry made when we updated content: .. code-block:: text - :emphasize-lines: 2 :caption: *Tomcat log* - [INFO] 2025-08-20T10:32:35,265 [pool-23-thread-1] [ed] [context.SiteContext] | GraphQL schema build completed for site 'hello' in 0 secs - Server side content lifecycle event : UPDATE + [INFO] 2025-10-17T17:05:09,311 [http-nio-8080-exec-5] [Lifecycle-hello-/page/entry] | Server side content lifecycle event: UPDATE |