From 35c273958d136f7b4cfd2938fc227b59bfe20a1c Mon Sep 17 00:00:00 2001 From: Lampros Fasoulas Date: Thu, 23 Jan 2025 00:07:40 +0200 Subject: [PATCH 01/47] First commit on developing AuthMD, a CodiMD fork. --- .github/workflows/push-image.yml | 76 ++++--------------------------- README.md | 2 + app.json | 4 +- lib/models/note.js | 2 +- public/it-logo.png | Bin 0 -> 16621 bytes public/js/extra.js | 4 +- public/views/codimd/header.ejs | 6 ++- public/views/index/body.ejs | 9 +++- public/views/index/head.ejs | 2 +- 9 files changed, 29 insertions(+), 76 deletions(-) create mode 100644 public/it-logo.png diff --git a/.github/workflows/push-image.yml b/.github/workflows/push-image.yml index 0d46e9e887..0961ba07a1 100644 --- a/.github/workflows/push-image.yml +++ b/.github/workflows/push-image.yml @@ -15,23 +15,15 @@ on: default: 'hackmdio/buildpack:16.20.2-35fe7e39' env: - REGISTRY_IMAGE: hackmdio/hackmd + REGISTRY_IMAGE: lamprosfasoulas/codimd jobs: build: runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - platform: - - linux/amd64 - - linux/arm64 steps: - name: Prepare - run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + run: echo "PLATFORM_PAIR=linux-amd64" >> $GITHUB_ENV - name: Checkout uses: actions/checkout@v4 @@ -54,70 +46,18 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push by digest + name: Build and push id: build uses: docker/build-push-action@v5 with: context: . file: ./deployments/Dockerfile - platforms: ${{ matrix.platform }} + platforms: linux/amd64 labels: ${{ steps.meta.outputs.labels }} - outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + tags: | + ${{ env.REGISTRY_IMAGE }}:latest + ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} + build-args: | RUNTIME=${{ github.event.inputs.runtime || 'hackmdio/runtime:16.20.2-35fe7e39' }} BUILDPACK=${{ github.event.inputs.buildpack || 'hackmdio/buildpack:16.20.2-35fe7e39' }} - - - name: Export digest - run: | - mkdir -p /tmp/digests - digest="${{ steps.build.outputs.digest }}" - touch "/tmp/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@v4 - with: - name: digests-${{ env.PLATFORM_PAIR }} - path: /tmp/digests/* - if-no-files-found: error - retention-days: 1 - - merge: - runs-on: ubuntu-latest - needs: - - build - steps: - - - name: Download digests - uses: actions/download-artifact@v4 - with: - path: /tmp/digests - pattern: digests-* - merge-multiple: true - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Docker meta - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY_IMAGE }} - tags: | - type=match,pattern=\d.\d.\d - type=sha,prefix= - - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Create manifest list and push - working-directory: /tmp/digests - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) - - - name: Inspect image - run: | - docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} diff --git a/README.md b/README.md index 898bd5d9f3..c4e77cf16b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ CodiMD === +# This is a fork of the original CodiMD project. The original project can be found [here](https://github.com/hackmdio/codimd). + [![build status][travis-image]][travis-url] [![version][github-version-badge]][github-release-page] [![Gitter][gitter-image]][gitter-url] diff --git a/app.json b/app.json index b30d487647..e1317e2044 100644 --- a/app.json +++ b/app.json @@ -1,6 +1,6 @@ { - "name": "CodiMD", - "description": "Realtime collaborative markdown notes on all platforms", + "name": "AuthMD", + "description": "Fork of CodiMD", "keywords": [ "Collaborative", "Markdown", diff --git a/lib/models/note.js b/lib/models/note.js index 9e0fb6c5ce..8a9837dde7 100644 --- a/lib/models/note.js +++ b/lib/models/note.js @@ -356,7 +356,7 @@ module.exports = function (sequelize, DataTypes) { return title || 'Untitled' } Note.generateWebTitle = function (title) { - title = !title || title === 'Untitled' ? 'CodiMD - Collaborative markdown notes' : title + ' - CodiMD' + title = !title || title === 'Untitled' ? 'AuthMD - Collaborative markdown notes' : title + ' - AuthMD' return title } Note.extractNoteTags = function (meta, $) { diff --git a/public/it-logo.png b/public/it-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f77efd2a12e46ddec62e315b823ea51c58b5402b GIT binary patch literal 16621 zcmeHubySq^x9`v$igbxeNJ|Zkg3<^`=YVu~r&3A^2uOoScgMg`N_Y1#A`CsiFm&AU z`#a~Xd(J&;oqPYkti@Wh-uJ2ZdG`K%_TJClpEcepkPy-l0ssIKCB@h8004~jzyJ8S z=qEulkQ4ymWrNb|SK7Wy`>RB*neZU^wL;5-$FInLbY;F)B4<^Z`StLr(E|!_^dHf9 zt^Uuza<3otmC0L{$*QY%9rZgo*6t$g(^6vKWVPbO#pLt`sb#Oa>Bb~Ap95=udkL}9 zEOFAH6k{$Ci)n#pd$LN82tEQ=+}3392Obk7wQT&l4wezD;aNAkbmP_kBsKRWEt!KA(!-ByWfXzR`Q1kYnQ%VfBJ092v zDhMDSxD>2d?VD=ukB<@)1K^v{Ja@cJ??R;+OzIkm#9{&OpMAw3@3Q^UHLBZim(}HD z*{%8*Pv8T?pJ!Ou{CQ~;j052Zp%|FW6EB%2dwj!_$;i82@?g!U6D;qKj>tQ&4bfEH zfoA9Hk-rUo5zpee-^twM&d%G3V4)4Fp(zG;HJVum(?1T?ginl;zF^ku z%bn(l5l(Cn9{<%brr5LhiFI|!Y4W&EfdaPX;6V)p<LwP6mzTV&OZG@vZdQXWFws1LEo)7qp*nTenWe32++^i=Ogj&wt!Ta?y794euL~W% z**D?9!le|Lbz6p@<+oO~kHD<$$-SVjRd)B_>4G~I!8lW;p_;4bzm9~^Z8?0?;U==F zWPZip?+P8fP^w!|E`IEyOVX6tc1OK@Fo_DP$YO%` zXKi;>;XkiDXRkvI+eB_hr<~tTD-$ zYoPV~_McA}Taopams81(yBMpGS~$6x(gmq?&-^L1>X)&t!#yOpaCdgC)G+qWcS9s* zW657HO}VthXNjC;f7&?=Z|1?WomaFyjds_B)6r1UlO0!)+ekWjW@p~;eV&f%%0W#m zAzP~#+$5MZZN#9+EWsaOzuVWAT^XwB!EyB%Q9mL)RdT-@(Y5*3kF)RxU0gNZ2kWK> z4j7b~LSMIlh%y=FbN6_(y%m?3RL1yG+t3Jx|Rtx zfqydEhn(`Ch#MLCW;gOU);31*oS_omALfn_kwJnjewuY+*73lV#0y^m3aGkO>QfA9 z+z;EBm|W#4gsc5GkOfYqKfel6=DM>Lq;-^9&ZH`<&cUOVQd4Vw?UGj4SLPbnAZ_zk zq%1s~at(KeH+Pkr<5gp6O2kwK0&9e9Dg^)62&HDZRb*`A~s zCe^<15jd#=(q_8O^Vq83TbCEGw~VccSvZ~GRjSe3c*H|T4(@$#W4mSb6+Pyjn{vDa zgdJ6Ww09|E`H=YuyM1tgmB+Qeos&{<n#%gj{HQhQ) za%?sQJ;lP2@NG@KvAD+Ec`5~@PKZO~Ru=Tcea$8VwnzpFb`tU4|Z^gs<{O7tW))*y4&*RWqdqBwNBOcyBR$q(h-k{^w`k;}6xkzI5 z>IBd1#Rn@AD@?~~56}%Kw_y&u2dpt9ppSaYOT7@m>+j$w2}Yj83r8(c>4TYTI%8S1 zh*L!%9vpNk;6odG)7EE;51iIwqS^wmcr$qtW2w-^LVTZEZ%?J|@`mU}-ND2R$r z3M9uaoz`69v7j-6GeD;R?{8*#83g9!U2J3^t!h+?7bGanCTfll)C!Pw+=VaGTk}~bPxk-= zYszi3i8kmX0z1Op1BWPM--_Tpoi_{mT)K#CeM zeEpm5W-)bPM%|}ed!d^zy7p(X(sJvBwmJu0qZhC_oUk%7tz*0O{iqtmAXmHZtjVuf zxhkgLW++E6l_|W#ko6`>m!MzF=y7NqEkpoueK|t0<~cQw%#L>gUAd+2k$_~xzQwjr z|Kj^xtMF_(Qai z#cj`7^nX=?2U)cyx(L(-WWP&YNf@5`zWoP!XmzdVq0_tA3R63rtMi#k60=a~4^(L4 zocq`^gX$AFfX!k0hSy_bF6hr9zMMf>wC=vMC5g1wCGuRZxpOUQ$PukE9xqM@SK>Au z5xtk5hr>Ili;6pp45c;-NtNK`(V5MvXTn}l?WHBc#yv-#3A#9VjpWwSG}tw-dh}B1 zlu!;s`S2VEBslZ^VCHb;k4aAVjn5r}3!9|DVk2teh0t$V3lnR9i2X7%IK4mMIcW7f z@117Ft@V^ouw{|#rNzWp*>;xlHomTYK3~_QE`POxLD1S>?()(W z9`%gC9`jBsrkY(2MCic{<`E|u7K$K|HMEE=B_pTJ6H-W8@O)~7lkf8v&NSts5W z>s`JJv9^2nO%MyS#jOm~c?Jy_y_hiCdcSs7x=m`=M3``Y{wjr77)kWuy`{+E_O6|C zdWkN6bv;K+2hYBjGx1fD`SJ=OvRA-=wg89!`VD$N@^~&oAiC{5Vl;mAk z)xm1ZzN~WNXFEPXo^ZbTgEyDFqhl9kj6FSTbjP-{u6pik(#geihZY=kF>5Vu_?~;8 zXqg*4rGO>@cOpI1DQ7pcTv*ksG>9sHo$0Tx{$$1sj`V>(;9n2MZy8e~hXTYX@-XLo zP+Twxv%aXc<1;9;8g7X6fWT8Bch)Q;l76`{v#})BooG^99oH}Q7?}DYFfK%rTI)s% zJiFMX9(4c9TnXPl~P{;a3y~v>ediI=E3$7us2%Se>igoUUeh`+x?C^ zoI|SL@!eo{*|Ko|ktIU|%i%!d+-L2c-xFnKg%Pfyg0BE!yUmBN<+CkNh%k9idepJa~?s7-NXq1!5Zldj=$85N1FZhid z6(xUE=x(z!;_gXzQ9LLJp%TuwyVEn$P@R$K#m$=OBXnsUG?%IfJ*-u~i?veH?keeg zC8*Q6a};zSqjmZH(6YaRoevu~EYVeq=iX#KQUf%vu;%+m0sd$lZ8LaTm#G2UpC(9| z#i@Ci<7~5q=LVnOtX=xH7ZrS@3OE_KsJ{*8$B1n+SU?R48NKy~UQ{zTj+-#9|CCdg zoh-Swq2`;pIX}4?ZywAq-=0iqHGq0pq&3f+ zK#4(T{_LQgXnT!}D#-$MhTQ0@%px`jqFi~2vfvCdgsj6vv2~lnbhZ7 zvV}WCN%(^O5s{D83}iY3-SSe^4AOF2W^*q=vflvmvphl|TF4W}plcV>NzVxRr)mb{ zppM_wR+J1x!i)ImxwJbe6LZcx&IpkZTg3vcZiwL+9_VtpBSoopn+Y{CL_^N%8M!)MG0(_e;M;@& zoZ`&05bJ$@p) z0srHr*)r)gBAQ4lEJMl>cNt6?2XVKlQsR~y#WHBoXQ1DM(9*12Qk3>}w2}j{oDHM7 z^fy4HQaQA#`R>Y;R}f#2jtN}Xks%XumR0>lv+y*KAN|ddgP8iMjABJl#y>MXv3kth1C7OE$!^hmtFOVkFQN|CFa}8*n|Tj2{_Hl zKzUa>N2i(Dzl4ASkJJDb=@jgx!5C%h-$%0%9BiQ-#Bb08jcH)0qKIaS2vau|xs0>S zSv~(gy&9WQBrCcc;v)b(?$7KVEQ?qhu`LDzqp9DFKv zKt9yhxNFrq-R(+jq2>*QEtf+?SQXbesS<+09o2L)K4;nS?@VP5t*UJ?X>f_m&H`~y zh-`I^0wtX*Psiip!K*(1rYf_w7PSs{b5Zskj+Kgibg!JvGFS)6(QDRz!Ew-LQYvD1gbs7*Eivy z^U~XRLc%Ka-iqWM4n>!(>r~(`O~9OpfSBent5U6!o*0Rab~kp79qoI~c8?ojI`L3U zMM2%d5NjcQU4Rz4OVR9+3Wg<|%fT^Y)$8xeIrN^OQf|^=!)xwXUpc=4*h1+~FpMQe zj|4Tsk<%=>V}}oQ_%R%nNkC#EYLGWbN{w)pdO=FE^+CO>l8*#t-y(&r>izjvyU`u8 z?1|;{N(ilexG`zs$RYMxo)dmMUNU%C9Hxa)`NR6rUt_G5(az?UavN)4ib-oGFXUh& z6z~fyB2(NirdO1VZ#i05vwc+e1M|kF zvJy7`DFcKmCHOnggn>2igMe{Hdg+1(hvb%<-nPPnu76(lyztHe;0_%fjx;b8yWVgs zmC4XY0k|Su#6zpwwGyex)E&x~zyU9_gMwa16cvlDab#>bK#k98x0&x9R-uUFqjuA< zw`J>EH`baM1vx*KTO~wlgaRwIHq_=W7wgiv124&#bY1Q?h;~D=Zi27WFD1;_(DsB= z%7xhAr^=)^6ulE@7nli>?hG%?tpjx$p9N0ikuhq6g8!UT;nkh_T#A}erCD}3B>*WA)HZU&E7x&kE(&rkQ%y_ZeODkD9QTb?>b*pV-S&tB8P86SZ>kJ;< zc)q(4`T(ckLGxP#T|hfUS4nHmg7<8au~)#La>ad+^F_pWX;PX*M-|%G@JvtN`7C0& zc`}oUSzr-3V1@~ySvd&N={?^CQ!YxbkKdnM@4&WJqJ20YDTlO^hupZ_DITnLI8656 zjWXX$pvr;r7o$_9UaK8LSCi`8SNit*b;^>r7Fx_{4oIZ4OS0hiX-?5D7hViU$pl8S zatd~oM~G!>B46!RP4aDDN;Gl$U{XPt&srtqW}tWHvDEby{jL%8?rpb9;-3I%(bKy( z%nrzglYl~-w`p}3%{*5cNd-@a6IUd(uSv3TkCL-k(7yFEHNCpI<}ZBN1iJgt&mT5{ zuAA?3Hpo2mx`^WR;a1$e8WeV%s-fsUfmRo+=$!GM=*$$<;b9!_^Ih=@Zrv0hn+^aAe zl99NfocEnX-vZHIyKf<7~#8Pfh)!NEn z%Hga0gdZ-g565qw1(k0T^~!;ao4#_Kbs*+g8X~JrXT-9%j;PaaO%}i^G;vR>Tq$<-Gu{4Ghf4e?~{zzZ$TY! zXX&}`@uT>?nVytWwqZmq!e5VGW*F1pg z`uu866F+s#Y&T5{azHw@)lSXNYQ5k)a)_wCozB(#EXY^-Q!8Zp+pJ!W8c>(G4HLp^ zl9H-#RSYE#Jehve!D8soJPp?=&)P6-tnNp`_DM#yk^T4EStm?;daq3D98L{;SoqCw zR#J~r1Wp5y5gb&Taf^g}M@@W^-yN4?0$X9=lCsG%^JN>zPYmAk72E!rnIn_a?k)w>^LHyMYBst|JC6&0B*c3$x5-6mPCA9$it z8NgZ2ZHA}ct8_wk#0DubWu=`v;K9>~G~>4yRU+rS@U5-+>KE#{m64k^efKxZlpWQZ zRXEs_J-XrRHy?i9@;0+KH^$mvL|16LIXu z3?G>aK*5%#`fFc*L@g3srgsni4hC7hey@}_)R~r}lG;~RDk-C0?#zP~pqt&R-ue7$ zLZM8Y-MFG?EZrWj2J`_S@--sng|(}Z<<(~6aIH=zeyf-ofH-10g0!aj3fG4`}u({ zH`@pN4C`yvz)<(YKh~4+e*T9*bsg^9X)S;RxVW6L%kh;8fc_ndo?d)oS!`ss@*_p> zeT~NCP>egRn)u1>;-*TB>Cq-a;N13blRu)iIi}x#J~RXf!!bR{_1K;W9CC_`h z#O7SQT6BrFTo8v|>K7*?&5_{_!rVR5N7(#2uHBaXTt-$oLTBZOCf5vmc0{|akpy1R zx1*pfcFN@~ExP7Z99NvQtds()z1Nj<@VZBz0Y!wopSUH;*5mb3wv-^ZIii!zgWPp}@xf@iD`mjkW#7_~qs3lh8P095UTM?0yfmJ5i6p z93*R1+}AF}7U_U00-N(wVw+4rq$y_0$L#Ue@7Y0;lX@)IV$0H(>lpzA1@fwO=1Rj& zZjreppTySfjTRyW^sGe0&)IHtN;$Gd3Emn8m(g9JW?#bn^s+{>#$Y3gb5C~Gta zjl6dvd4npmC192Es2H6dy)$Q~b}0nhlA3LCh+kOP;Pi_vgoqjtQ}#?ja;*(1{!|N_ zpYu8rqGurJ)c8%c<_kPy=EY6LLhVi+C>!tE z(wM8>VX~#!vGvWO%7fkFA7%TF;lH5cO7n^FVbpzMgy_ZWsVYHdlPdfH#rtY*Z^r{> z*Xv?BhP@+Fb|IB7<@5^qsPfXv@6BL@ioz|}Ecj-az6bn@7q*bH%657ORUPNzXM1%MQq;C|=0o;^1eS2cD2g&M>Ydm%p6wjqw}L|ZkcIKz0R zeFzs6()BQlvNTvlKe%Da>U=8hy_Ie^RV7`u;klqgG4-0<@&OJR`|!zAXg2)YJ!`1u zIpFMBVB^xc80>7FUxfc1}@g0EktPdb$KL?yr+~{?1&dn7RN0oCXbD`{S5x4(qj+NLdjcZTp z98S=_Isb`AY+so)Pt@T zWCpMO(9jHWlTg~5aN#a@POgSD+}d))POR(kf!(#Y{}y)Gv>EPX zp*$!vXQTc)0g;ynq*i&Pj=mX6;p^Ij8n|6Z*Drov@p+1DHO4{d@!vR-I{wrQ!DyUg zB`mydjeO_?`Q(gwaY;R^&GBO?b>v#PCD?WQb{COzS4tRB1&z^X$waSOwu3iKrC&f>neU>a_xD+KuBJ9vUHtb!H)%U8 zrz@@dUPf2cL6z;AN|hR$z&4R6G!-;^F$JT;)SSf)%UE2&O_9ChK+w9;vW??(va=LJ zR_DbqqMT3WB*2dg#us=f$Q2A-TLsS)#nI1z(}p@NO>Xd@Dr81{m06pJhk1n&+hkM7 z!otAn@E`3;1I;S)Q_3ckqVrj6t9v`ldVjK58*@{VqJii;iz|`|PM42=NK|_AF!r6? zsZO_=EI9a!%zTMo?S(n2wVp_96#ZzP^Wj)rDa$n9cDe0Gl+;&uYEGTs#f(ceNVca6 z=}?~fRep>OL4X~CU0%UTZ;1&&w932=KV*r_O7*z}cJptuqMa+B_wRk43O2nW`HTVo zNMwS=o$1oR+%mwxjS)+iSVKQ{O{+I$k}wMVeURN|NOV)Wk^5Xc{QicovlxOpK>Vp3 z(=|ys=dEJoOrWPGk7kI$KNhC50gSO(WI?!Vdw>!$~ww$!EHb!BdWDG!P_$)n~u?QdY@2b90&- znA+;|;)LqbxKt(Y9pCs&4w1Bd8)+R9U%PFtZf$>l%OgANJGWU?JoKA+E3O4I*UwT4M}Woi+f+w1)2l-&TQ2i~ z+zzSU!}MLL!k;UTzomAhm-G}qECN1O0eY_pU zjmelk>IGf}-^tGa7n7Qid&6Cz8aW86@)TbKgDJ{l6lT+Zl}?*21bT6!3do!*&Aitu zzJz9CRMg9J=V>-l^WTH-!VtzYgR88e1ZG$UK@vkLfLrDLuoR`<{0=sCRhURy;y}h5$ zuDGreoivr{op?!Ld0Rbftx}k>49A!JJz1_`dga;^rU`*Z2dcB1pC7J45_|?;Vt6-J zgPK|+K4P z016x{4JjSfXSp90(sIpB_F55sU=WF64c_yI&hA64dgIQpsOe#TvVWU$AO5lB0q)?R zBk~Dx-S>~0pcTQ4Xsfg-`0#QPw{=e&ebz&g$!@c$l3L~DsoAyqN!aarw~+Dq6jHPF z^VQ?(VDF+2J!$Y47_rget|UG~8Owr?*7LB4W?j5@H1DZ%rKSN$h;}D-4S}S0d((Z6 zr+h$zatkhtDkU*@Rd4_z#OZZ0wc&t54%kLC44a=$IK1@ZD^zAxuoSpD78U6EBhmlq z-}4o6$JfF^-%;#+cWkOX@X2**cv*188ajFOcO(kEPN!8^Dei)!#d8CuU&vH|d_h!= zc6S9)ByBlVPQpn3$42XijHzJ#G?0&fMW3tW zCd)oWPT#vf+S`Q*KGRLSlu_A@2N6Hf#`2QnBZ2CGEaFif@n}gYd&^!J?rL;WXzw)l zfbMGBcFH=zt(El(lLlory>_W<*I#j(lGKC%54?&@L?O~8JmCGs zW5DfIvXTf~ZggmU+909ayYgXG4-P{SG-TW_m9@JD0b(3HLfjzIavj&BUZRi7f~3)4 z1fdkqVN>^;zE7QObr>^*X6hP2n!URnuRzywMdC_DVCL~WSYl{N=gVIyHd)-_wj0Pm zK!-JihzmU|gpS5LCC?;h`S8sw$`8n$wK(;6wkmd(Wf;sj=;T@C#>s9cH~Z-?STt@Q zcCmT=wycF}Uf)_4im7ZxFb+m*S3S4!_?T}?6G1F>jv!Fiy!{9$!mP@fn<=qZ%BlSM zMM!Rv|6|;8&r=fV(|=^qtalXE@jY5lxJswDcPN81pjCEz>>3*1+%)d`Zt|1m_NB@_ z{8vByjrrdhIo{Qbb<(+>9*Atee0pWm>4UPw@{x*pPzFNBO{uyJ zrdWAM46U?#YY)}x>%*cH#0qVnA+9yHwXs}U5>d}=k^u6@ryk}mb`weVEn;Ht?1j1Y zR0&<$tYW95$^#YrQ$ zEVt9WF0lEPA5EY-lDW7BYZ|x>4AVF-KJ!vL;s;+$8^=6qJI%*q%Uub9kIdqR&^%42 z$2a@>>fWQM&a(8WSXK@*FaM{)=MGnAWJpX5lfEYgQa$Ix_ve=iBooKnOnRPD6kU0QV=8S$Qij4SIldwt z9adw7WSc`u6wCqJ#4N-;&Clw}LW|@vX>|DC*Fal*{R325PxG~Z)s^Ec82JkQ9@r}_K3rWqfzx#`q}~p z3}Va{LYDpG*KEPpKEdRxHHp-;WA!?&x38NJEy__sC$-ncf|;EHLi;Pb z*^LJ8k8iW9=~+Xqu2{Qh*+Mlzp4jE*;y>VLhXoXm><*Xxd7ZDIk)};;j0Bh0O-)Go zQYvP+pE^K}x$jZ022d^J&l)`JT;^!iQi}rlo{d#*ESrop>p&c`cd(Mcyc=}+1V)5O zlhT)z#USu3Xrnn84klL0Ot7$UaNR&a&))5IuhF+MyLg0Kiw-J=1`hKGw z_gI}dlHNC9w`yS5BtM&7LlUnI6iZ?Ze%&qvV%(Kl9heph=ffb*miWaoz}IBHF%t*9 z>^ZmGAT2ZB_|j@x>R&ji+?J(x)was$B5aSMXA2zd?_;r5obr68lani#nCrOm0_eM} zxD36$Fzw$|31dj?WA*4TVfT*vL+@;AU$fUJUlClN={R9#*91&OThwB1bw|~V8C-wL zp9RVce=y11V;*<3qYXYZ-P>0sQz&rLH)4dvC!i8|o$3sa31F@KXX-AO%kr5yiNNW$ zWy>%&Zceib-Y=vaFg7$S=eCC2onL2;x4R?SUiS=YPP*x=*Yp{Yof$iJE{D7T zS2dGIT?fUQ?){uej&wnm`cGphnOFt&E4yQi*)EIrC6j?;iBj=xnogMFCF{DooikqH)IDFA6?@}1jG$xVTFW?gYPbb&nl8;;}O-)}j zZ%+zE;MJz|d7QjeOI`=tH0MmKfwd2NM=tjrnLA20#^A6Kk0cfw@-C9XBixEYothE6 zX;p1=0riU2DIK@z?abAxkU*~qX>Y$!epA&sM4Pi6v&-TJJ)b8sHVM?iU3)R9HojYX zMPgmH2Ize7ICS*QR)%HESGMn*iNnnH&BYD(LDBqGPTO1lAo$|Tm>}t@`d&BXT6GD0 zvuQ#bQ^4V-#*B0UjVW~`R(2j;tXyHb39rc1pL~MUFJ=AFJ)`+$n9$_Fsp*LwI#ACbG%#@%;Wstlh;is=xKi z{F7WhnDBCTzyAk#NhEmH0W3ae@%eSuJD%d)uR5eQ1dFG+hB^*zLk!Le6NerV<+GK> z&qteDU9;({d(z>vHQ&Ls*!;RIh>1d$n71a`L!Npn5q{Fhd>eNe7lMe43{1Fx2Ez** z#FbKryW><^Rs!{DR%45!TdA2#WDpkizTx50&AwtbT{XTbc^Ajkn=r;Yx^IqzNszDK zmDNS={5R%?r8;=@ZoM5=JWUP-PK~2(a|r%6HF&H=zzow6f~W}6_x+h$4IG_cb+1$} z$5ngLrWutFH)Hc0CvQimpQBv^+UO##rN>ocUU9>t8~Cljmi{Zrc)Q%$B%yteOGu@R zlu4gK}K)9)yKnvD^59^rv;(t7Rrn?t@SA}jbd zvOeMV)M$EnwN-CPlToN7Umab*WWX-5G+@q+gyb%qX|wif$^ySow2d5~vrg5NDEIY7 z@G=ErgQ^HXMp^^K=jQgU6S5IoLG``E7@Q{C4wnfl}p{+YI=xG>mA7qt0^u|E_Tt`n?|8!oXuG<tgu+?P$G6T!(PR9Cn>Ic&8r5acKFUKWABOMt2WT0_IdL8J~ zWZ8Uc z@u}WXu2B^4=DBg+C82f~zcwp3*sAt5fiMwt-__%K_3pHYE<$|eTqPb|Lcp!L|BL1{ z!mEd)U!N_I$Pm8V-d`-9aKO#!8!;~Y7KJt>BA>A^XzVk_{T@K5zRGk|Jn{~#=*-LC z3XJpz!EDi)Ksdxez3Zg#!Y>^Kz3JpzoXYyh^EX6m{pF1R#y|{i=n4d(){@JDbn+rO zIxatBBBn zwAN!bHrE{4<7mw_zjEj@EI+wydat+?`$rri0Ojh$+ChP01V>kVNxZs(g+qiw6T&L+1?)jL9&~tQMEMUuNouvB+Cu=ky$wCI-5S%tq6lM zbD5~#8kZ)f&drEUIyVI3-IxnQ)g|MXy<4V3`YqK^0B-6R^Ff8u$T%ZZuvu@6d1If> z=dzs~o?=l7{%~|Kkdw=beyA@4%QQ~w1<>&;Q0HO$2Y=`TyY?&Jdv(#L!mbs$7B6vP zq|dNedJ))<1K+GY(yE2KUxg6 zb=zv$wJ0fmqDV~B;f#}ejO{La>a>4f%{=~8XptfIopc;AZaSRWaD+zD zlOl(8$ttY<62gz;-BT9v-ltb! z?5+MR{}+#^v1!TqoBKH{ut1R6JZ4p|SgEAi^pI2TtjS|&tGPZ}sZ7qsFL#;O@*(Iu z+HRNEpBD&X2x$iNX5+~FVzAxghco0xYJZrRWbY|M-LYDKNf)og({47%e??zd4Pzyu zAcc{LUZ0NU4ZHr^<=GE>KYW|eXK7E~cc)4|oGXPJvH}~~Ag$2dq2i<;XtgArvmz>Q zD*EECU$A4;7-o=BMYswV13G#P3V#le=~NeM_Mi1e2ujMKYl(!*FtO6_eXKt&xO{m@ z3YU~_)#(WH<6X;wtm6A{UuTW5FY~xrO*_96CMsvm$MLrFXqpUvdJC5WhiGUFRQ){k zC?z3d*3fN!DwWXQiS){$M4yAW&ZnnhA6Akn`rMJb7m$Qa?8+6-*;a;V|FRR0&fr{a zmq`|tXJUtXs3&V#CSabn?J9fP#{f);^&$whlIyn#hYI_w}M#|P3D3*d51E$ z)=E(J{{o9Qb725nPwtu_c)OU6yU4fUQromUnIU3Of1mEG*ZVYg&t~o`-^`~!(2fSf zg1`hiEQ^JDq#Y9#tRVXAir_CaHV*kHtc|bkS{$O85}+;gp8>JriNhy!Fb)7Kr`qyI zo7)xoDC>hm-!zX9QveperZ>c40tZ(9`Fjb z_is1|(6GO-j>=p{oD~CSIc8uGko%Wc0E^G>`T79ggaR|qFSOyc*>7;Fk6QamgVAMR zFKc03-OIhH<9Vc#YO3V@JySAMBldSDCNILrfxh8;;t-zG!_jN;yClj0_U&A$IGa$CE3xZ z2=Hh{!_T|JTa%&7xL)D==1u?3sOv~E0`%Ix4daQlm(0-Vv6dADG-dsMhOXMeScrTm zPq-$Y+{cy5r~^$Hd+t?{yMY!>{-C4ie^7=05w8ON%X1hP+I-`V)62ueeR(vOL@ZSg zMI$c&+lA!CDZ2Or&~1cw?sSXJC`C_1-rne0b1h`@Z@(MzHwo#T(K_?D>x ze)28=U1tA-chd9Wg#DRcr>Q2-W0F|=+WAyJcy-O5Ex5&F?D9TBm3U|cdtEI_qox+} z#Hm-l_rWEmK2!kZr1*!Qnz-lf!Ilcoc}dw?n3@elSLQNtKF9Q;xWijF-)b4Hexnw<3c#$Dbk)f!P!Um^7ho1A*?sfw$77Jz(W4 z({m@Ovb~F{%n<0DcMb*4U!j`1ErxRMTw4w-o_Fz-q0A89|N8dnVT9&@i6 zLrh-&Bah%8e?3Z#wSr78fsw57u`|uTI#=@|SQmHWk3kU3!mR#nqqnAGse zFHy+OJSm@^KPye^!<}tirxKQiCX!lq(C+%RK0!i2x4jag$7pTOWBzw?3^yqkmB>mq z{3Z6kGh|RQ3KHe7o_5+n1{HQi-b)-pt4IS`ehs2m`11ZkmdciyNmGrz1L5;1;S7k5 z#J9qo-HltB=i>jB5wnc{V#2U-yI2tT!J+<{Sh{+X(eI(6)gSg$x+=0n`%_zvXiwm3 zJj(k%FYk-V=l`((75tg}Lg0H@is%7i<+hT`(YUWfxu!F9-u7S3eLzj>f6rzN+UU+2 zaYtT`jymY*(sOjk>w7}8m~7d!aQ6pvAvHR)5Q7}z=XbbJq63jQ2|m7FKI!>wQW#pW zRkB0}UjSf6p<7bYvwn^?n%!K1Rp`>3zoR=|DE}w>{N=ywbBAgU4+cE)b{ySKiDl?k zD4MoI8+)1`c4vAuAjC*T(W}*e9#~l3Y6Y^H9MvgL9D|SMs4#e - CodiMD + + IT logo + AuthMD + +