r21^bIXx)}sp5`MONuSYU-V5b`3zJ!t>VI&i
z?2q4=CLB_X9A;(ZM2F7IS8n3{@uN;nm*V)7-jgyFsMt#$BTjL*nI0LY^-4?=<+5Xr
z)WD9u*qfg*VeO7O#B|oeZ^iZPtA92-f%}^+vbETz``N1xVC-3l{rJX^UEWp~?|vdR
zpFo=2$wv;mA0t!vBgl+FoQRv!umK|32{zEBf$q(`!#Lv%jz#FphpyEjGa#dVm$6y{
zQ-K)MOir{fERhrK3U?q0MAVii;;@EZOihs~jgZ8Y(r>QW!$a3N7$JVCP&c;gcqm+S
zcpiSy?iF^OnqSo=)Xpr}KG7!1Jvxux$jYhZ6`}MR5-J3>usLKzhB=1*YJQ1t-
z2Qt>gIWyV&GZUM*A7$OC?#&4o<4X6osG({fkN&PG)P)rwo`5fl{1Wa0Hq<^Kw5R8@
z^W0?^AfP6bmhdo*d5OWI;AD**UsFq0hxXbSKK0ULAF=us4dn4BbE&@BO*{FRXKN5h
z4h*3`Fckzd@-y@1$FCG|qAAqdrr?2-l^bhYW@^lS3K6wt+tDezrFq+VE2WqjXQPI%
zQW@tSVE2-IiP(Y@94z0Lp#H;eIThr`qPX{JnM8}z2Vy@y@nJ^yb<-{C#P3_%%b|EADIxFgcgbGey#M7Pm&{+$*-mVEZ$-|DkWwtrh-WT
zGDqp2%0#kv1)--txl(P2-Ce_7rAjz(#jXU|W-f4@%k;8e4M|R6bHruRK0;x)Y#4C2
z<^)BIb2<-;=W_Xs_%YM1TJ{k({U?#-?QC1Uc`yQIvwEc*2;JolrK3{%QWIR?P92=?
zNLc|QVTn4#sx2OIjOAZ6amrfbikg5+-HBTk&dun0nS~s)dkx0hu5G~y+&bHXFdk=I7AXXkX`Ozt&RAlA<^AX&a`8fS*g
zR+1s?WX@MMkfM3iimTF@lRu*%AYRBba3EVv_bC19^1`W{Vow!E1uP|Os+KDj
zCg7yu^&{vHC})&w%?u%tAZwRde3rsbUt8jXsB6z3oWZVDcj2apbU4=Rd@0I
z4Rh68J=}r4tZ^32JDqc^7s_eQk~H5dcx}7&W{2w@b;W@#?lraS$klr|%
zbo8}$Mj78dMq#|$^2lHf_wiqxrQ!#+00V(*hk`&SZj{a>`^2QbQ;`+FEj&8UO#P&j
z*$7{TIF|FM&56V@JxEy!q>^G?c!=DQPpb*=m4<~Hf
zP}S5nE!ob9lvXLtx5o0JKZbtCVL$U}#5!cZV?H}hMjb9YA$QYj?Cd`VQ%
zoR3{o(|k0S>3-frZ!oX4-_32`epY|9w9m+{9Dr!o7GNbY@t3a+u3)xv;a{~baaB*p
z+f|VIP4TF*iIBO#(AHG|m{=U&wk0I5^!N`3uNv>|QXy|uykTu+-kG4J37z;IaRQ^L
zVIjB4A*5cUOtPW6{2sZZbnbGtgZM7>>k-Z}04wlK=fX1|MqFM3n|KknU^quDq%qI%
zV*$qo@lO`A^(#xI_;z0_*A=j-pIhmWZFY&b34BPHXY1pG(1~;<%#l||nB8fi?F@oV
zA1j}IwS+{TNr|Xoe|7joi2jJJpq1xUBXC;TzxH6sdrHu9-TjFIZb~A6L)_xgghk0a
zl@A(JXQG%$%cqeM$4f+2<*AE7f~L4fD^PUncM>47#2z7ZSx^dG_O
zLWiu!pI}m&D7v4aRP@Y1tT~CVH?!E8sQS5OLP^11lgk%Qv2@lOyZzoCJ{Mb*kHp4y
z3#e0e?JlHEJqjQp@_ZW#*_ZqmAb4m0y>0xY^Y(IO-c98EivOOE$1ZuMi4p!dYsk4r
zOSzm$r0mPwxw&VF;4eu4(ppC7n>dL}otF`~?|QHd{K#g6KZpjTjRZ{8mjN8=_%&>=
zNnyA1lJ{(CoZX@HI~X7uP2PT6t*wpdRvGtdm!7GA0wfRvs_V1XLVAz}kZP(@QgUR1
zV+Hnan5HI_5xl(G#L1Z=Mi3;Nxfy%P5G$n{0x1~Hv5;La-Q!ar2X6zA5UzEcvedn)
zg*O(+M`mFO?!a;ylt)Gaj
zb|18K3}gd~-QY0AaR``8%)#xem--__ZyLqxrZCRfLbYKE(A+}UWrakW*~|b5GPuvT
zlAQ=oB-}Lhs?Epd6Jg%cL_TbOg_5aT&{C(n`1Wbe49Hmio|IQ9#+SNa>S2VuGP9S3
zcC`!2g-`6bW_L#v<@?rD1-3DFQ=MaCG%?s4c;XxCt@4---|RZgTO6>&K*GW{6pc*w
zp8q5zVCh?acDIgm_Yc?O9wM1&Q!fHynR9PTIj4TmxkcE;vaMdN^TV-d&<)~tGWNTT
zqM$YnAsY;)v*{{d_Of`7G&Z)|=|N*8M2rX@9sDBh5PydkY>w9jWjenXGy4t5yhbOm
zzL?hYaGq_zZ@4on?Bowyr@bXwie5))J7jT}K9e!Px<9&+y8W@{t+qYEnIf+e=M99x
z23%bVb2F{3oS*EX5!^Wby&I
zJ1sTxqAn-+tpc_);+DqzqH?0fcl)TUs<&q6UN&&?Ft=HH3N=E!gV2TNJAz!z(Ig6H>9ja|qc1mSx5gd)^-oz(@
zGi`kN`!`rn7UXshjQNE5g~vm=>A_KG%vLr;es^oq^8q$H4-=0xXkp!z_<(SwIND`L
zt<)<*M8QTj$N}pDUZd&acu=;}a?ReZXKh?WECNedsOK&+OyAgUgq85LbmjQsF@C}Z
zTBf*nqW#b1po?sY^I-sbYs7kBuZlX`|C=GfEI92TO!6
z)nRF<#Lm8`O*AtfW97c?#)Us1Cz_gVk)juS{JmYy(NfmW_>}FDnF--&3g~^c45|vj
z&;(O^y+kMJVhk9l&61!+x@+&eguu1+
zq{u>TypMnyiArSSx7F{OkAy(0CD(G;iE`f&HH}EXTrVkXePu3W71vgu|6|`IRZ48oMt&p}X>WVv9^+zB{wIN>?dOq7=Tu9`?W
zH<~RCJ*%7sdrXM3TOtwcCNfcs&PFkL$1=dfuR-D(xf|sR8o9hI-f20U;gnh7r%`JQ
zIu*Pz;_q`*K1LgRCuFnOuXmzP4HiE(4*cE)d5(>`h%)$g-)pI)zrFa=yN#;7-R**L
zFt)2+_YH^?W8{7>3dYKZ)lCFnn?;q$$NSoJRD;U97`Zi^ndTyG^Dh)6ABHY&G$9^HGY(WQ2F9P+$u9u7Mw!A{v;vcwQxZIcUCH?wi%C
z6H+h4J>&9DnE9+3vv(!?5`;A-Ut$h8KQnACdM2)93bB|EM&Qdmjj2=e9~9K8rQzr==Ey?TW|{+yI6q*
zCp3QMq|PdXAopA5t`Az3=-_k&UbejrU*x9(X^+bSsxuZ1_^oVz!U%C
zZ`~-x(3)s{7JurjDkUJP=V*d@eBK?i0p1X>y!vK~feBga?&Atpp?F=SH0tk{gtc$^SZf;!8o42Z9^??TOSo%sFA0>!OgtaH%@
z2|~sgR@WihG`6#;EG(<*5jln@O0!28@Rq>dF
z^mnT*%_l>agHZ$T3WUh0<;O$71UX7`3O?=znZk%KKNlG^ga>EY*PM|xh^{qvzQYv1tz&VDq
zg%z|x1L(&Bwr;-}OD`P&aMFC}&`Ko`aAdT&CTBW56h#djG34h8@nZi{D6#>d_~`dH
z8-jSp}W%uIs7=qYdWq~u25d(7*b|Et(*6`5iD0v3M0p)@uj%yLH4cI
zxZ`B)=d(>^dG9(^Pw)NiG@7>Jx8k$Pc%(O5KFdCLmk?4)X^TA$H-~8(suk^A&wC*f
z8$I15kmD^<^}TjWBR}um9KbU?%ppD+%y8h;Zv2#pkTl(#etF_*lDbF9J2t
zHKhwtNLPfb3np;qB~ovZ=ik*%3)xS;obW@U2!g%+8?TiT^U8E#8VvU`Z!HYHF$W1s
zG2URz*%=y}6_g-R9YsM9%woMDX)am^6zs5>PSRww^Usd7CtD*-W*0dMJar}p+@kWF
z9z!&j;C2Kv?ZNai)#B8yktj+et3KelrR{N`UX-4B#wn0(DCg$r3alS{w9-CjHVp+O
zI3pH|hWKS~485@cO`;n^l@eJ)QlAyRbDj$LhdOFFHEYqbrT6HKvn2VZm07~6>tho_
z5i7$Hmb8#*Feu?AE;cI*`D#vR)xQj%3lf%Fr`};~QJMR2?Dw&J!JK0sU@vTuucIZW
zErx5+DF%r<>?WREFs4kDh;w1n2hITWTNOUVxq8NJGmoZA9%UDxRX4gFYpC99dCt!9
zU+kQbGJs?9Z+v*OWW-4MJI;pbC9kx2y)CG)81aQS8;Ct_RretZ-X%PDF`%I?+k?^q
zk?Hp0pb#B{hnE1}Y%fgiwD4r#X=H`y5F>KwY5ZawTyDRHJ=JG9NH~QgnbXmAPoWhG
zTs^FX<&8!RfwV@p0k?PU?aU}NWxwlz3DjClX+hO`p#lsRc@_Xo{q{j?vYhNRw`n^i
z$LH$3LTz1@{b_8H-n_+U)ZFFMeY;ipAk|l7FRG|bp)_EeJNfg)cVGh@lR;GAAEH5G
z<9-+Kb{wHt^3y4H&`^WCtM+-y@@p2*chR*s4aSTRmw9t8+@TiJ4w&_UN03-XHyM!;
z4;7r4L%_Peu#Hb#BhI$s$1`Rm=wRJn7rHnwsoQ2pzc;#Z)#nB!+GSgNAlF%;Xk7IH
zHA%Q<&a&~c&!U#KJMo`_LO|5f;w`@9X7^A9tl)!>ren3!!yCUpX&FUm+U!~=X5T5M
z)>};3>G0#HkO;)bds6H>z5L=~0{4<+N*cnC$2z?Ge%ln%g>s*B<#%us&-9iI_;%1(
zP`%jo3CPk_J9rOm;(jT8@f}?0;ZgxYDk`m4HUWz9%K6qAvtMHZncs;%AWV(X*($@GH
z=ttO$;IP>1c&?y}XJX-ZG{hH+Q)smf0Nk57#qa7=fG=X-1c7mh{<~zSL{`WUV@x(P
z$9^vcFc_0KUs!gh!H9>PDNLTcmmT)tK6ldn=Anm;Mm7oYciy}j3-=VI2sdKPYCAZD}5BIM#iK*y!qxc+w~~(rT)*HF7tU{
zs6j%`Uc9T_g9wruq|6=?6@A>OoGVjUwy@N!P$QRI$aBr|x3OroW2w6~YPup;OJaB;
zxqnDJve==P_y&Wv9mJh94JYXAIUEY5tjH2JTOI{l3i5J$bZgvdQ!OnVI-Id>2@SPm
z?J7k~l$r`!=7fLim)cikp1yq^-83)Q!%SEhS}wORxIJ|Ww^_QvBXGZVC-8~g_S4jM
z{e9EdCpD*fI0Y0!oyKi1V%Ideu0I6J5lH3MNO1hyr2M6gF#a+9@NIH>S@c&E2r7L>
zee$LJc|nV``yug5=wT7?GfD?sG*fuoxit0s2;&@-XLvmCT&LgVO9FcfUul6aB`;d5
zrfvmx{s7hC-{M?=>KW_Rz#w>Sv5K)#g{Z7RVs@3oA#D!SZ{PWP!4GZD#)w+6Fp`~t
zw6B5OA75+@JQsHM-Qp^!={+1%NyF5z6c-^j^{KRiT=@50IO=%O=7(c%2?&R?3C(tr
zZx(S`aukCU?#5c%qQ%xnZ;l_ZgG7SD9#=#gpjGcRo$f^QxpWMFHiUe2C%+w0PWNT$BE`$rs&&Vs6Cd8@)UevQuemTVz#^=t&aKz
zrwZAv1!4(XwsBbBP0Pm;7fQ>-@^T65Z$>+y4m+lwTXL>+mJC7*D3Ygd
z@eyA4BGi(j6{hXaWL51>DYLK(1E8!`Uz(|X`M^&9SNl2#TMp;9yg;3Y?Np$uPHIQY07B8^wOl@`m1S+hnAUo$zkwDhL05$2qs>=&`LLUoDqJ7*gq^*w344k23h@Od9G4g>NY?JM4vmby
zH6*ywkIdf#Ybm=d=wx-Peteva<82_X!YV*0aaobTzJ=J$I(x8T>?3uxh(msq6!2j~-&q=!LC~pOEPINQ5)W4eupE3rFeZJU7|%oobq44C?UW7u7HK
zj@U$~dAHk>^d*Oc8;V&YV~yS8fErZ)M8SiO8U?UTLm2qG9u6_|#>jciP`B_B#=e&W
zc4Wt0_vT`0_L+{Hu;J}olzE_N=ub(?k$|(*-%EN=v+#k!91sH*nrvI+-;He0gs+-K
z;x@y4JK|@-9H{AcAM0WaTF!k2U5q+YXK}qIkPrkCyzhFacrdfGv%^MYQBxbXkbsu8
zCRc&Pv}H*dCJr%0cg(gMBREq|+dzz?`xTyni919_$llIw!sxkU>j(pI0JwHGZRvoF
zHbhlm5Vl&%H+OsG0P`I&c|)a+fO#U{_>kiV)NODLRti7#e5u4i-~G}Cexfb*qQYW}
zo&f>jNZO{Bx`q}NA}O#MH|=-fH<%ZgEg{2Gc4|>WSFQY_+RmY_d@C3d|B|zPWfDgj
zuw_Nz%4a`@PB@EW?A@-{*7nZU%opuiUlijzOPbvYP8{O1Ok2L2Dl%frf)msQRTG#H
zYV%eF*%(|e-yo*zET6-x=+mw)GG-d)I+9OP9kSRR5%xg_TeSLl@LnIqspP0W5F#VM
zxUFSEtf~9>oE^;jTpwQL;@^(?R2Fx@S^q91f>SD07b!Jff_;8lrMPN36Pf8&KlNxl
z6%LgMMs%-c8}*tIHNpwE@Dqdu3vQieYweGk1DpgM!8lJk)nWk)Yd|h??
z<1OdwP`EYR5`%sgcR|utH)9MTckefxIT_KPWP&_J(lZd*BBe`=;+yb3lMm&mMw!4z@|cS{1>
zG^0=wYPayjxuNAuf9B$bT8e|8HV4x-wdl5KMoO+{uX)q&fZU<8fO=lwxy9?jFz&sL
z(wevWz0HSz$Ac8?3wJ7NZ>y;hd0L=(fv9TU7VyitA^cb@cM;fWJbnH*CXp91ZJ$qN
zqAnPzJO>HJ`63e=Zhc%CMrm)8M*BQ!VwQ*TyXft4X8-qE_vf3pY%7bUdYDR8(f7>X
zfrSV0l1Vb2TjN1Ze9w`i%t@*=w
zkGP1}W*0h7L*g5FuxJT|yas`qXz}Uw$uO7s3Id8D3=x!;Lx3bV|
zH5lCqKB*Bsm9E%h(QCoqUJDyUzXo((iCm{HILs4bkFSIW&SFT{A2H^%T%OtBV(hO
zrYB0J94aI^0y;CTS($tP!u2*`lxBL)-Dwiatq>*%-C3U*Xn6s#
zoCxve@$=hrNJs+b1VZEdU?nFPG-~`S-ti{dF#b+sqS56R4*lmQ^Y-O$J=|z`5Tf9s
zojhOzJy-IsRkm@b!B^4Kd4w>(B*Tv7ta=q#)
zPmKOu#!wwy^RF7?L)SqW?8%V5YpU72&Kiu=;6eg+#*S!h8O0kF^IUvqXGlA>R5wGc
zYZy(d1TF(qD^@+Gj%YOgffHhs`gA$$X8Vi6rSTT9w98qj!*@TsA_8J%rvHp}(phf4
z;S=%AK?FCHxK)x{O!t`=(hhGUwd=cjlm}UEWDHUkpa;eXA5uLCR^YAcF@{4W=fAaF3e5IT#fwI!cT)wTB^qYSqYjyPU`ZxP=pG%1$qKueuXl
z1=Q8$!4=lX_mpdV*IEmioPc_9!{jRtOK?0!4a0EH>FsiH#oT~-M4Rh9q4XC$F~WoI
z#rYltFS^=Mw_o>jHke#NbzgyRQ1O%T1Ir$-y6;-d8RH{IOVEz`KK&AN|Emv-gm9-
zrrWHtch^C20Z-w7pivi!D@%GlDm0Hs&D&p>>XOi6<6LmwGgMS4EvJmK%p6&7xvqR#ZsJZN&x3A1=4@DW}y
zmHw?OVhhL-!w7P0rKNVXN+Gw`Jo6o
z==bET#c$}!M?7R2$qPcCY|7wR<;;fB-yU6`Z#;%d^=Bd*NulcdrH
zbOpr=sDAWbBc#=cYncbK>V|aB1#2rUaP$`0LEe@Es@KhJ{N5Op*X-ZQmpg-SRMxGB
z@xBX9MQDgM;?0=r;K2@Gf(9dBg8($X$a$KN5W5P}_*}d*03gthb)}!q#K4^=03A^n
z8vx}WQC&N?10_GfKi*R#6LJCJ%vPEoDdYW(^7$ZG;(SwHA~q_ov;$yM
z)xyFHdM&8=btgmDfDOdTfa#Wl3&B$*0yO~@wZRP}N?m5!Pys_~gs^Z7e(c;}#jBJP
z@}jll$1>)R#&5-zplmT$zg|842F_7s
zj_4B+_`WISj%+*_d%d1)3FL^lZL@`Jr*9r#C!+Q7KC($_hwn;CfAYv&iDrF5S+@R-
zppZ~us{H~81Es7?-WSG9l9F$t9>3Fu2%e;}o$}tTwR(K9_}L>y3qPW?fQf`w|4m00
zck=TqcRuAbo)hROF-HGf>a=!SY`cYDEGCfvMz;BUe|lJ-({yS#URPj&siY>oMi3BQ
zDpxT!#3I=R%bx&=n~bE0+MJN3XPKp%c{S8Zm0S{Nlx^yOcsKD=+&FV^0wG>#^|91^
zdQmu1V|I$2sO2R%8N?)DM`+z_u_JOLUyhAU58GY|3>dSwc@PYae@&u@vq@QzU6XWc
z2t}?fP%o0X9(0_P)|CirCcCp1Gu~4;SW?j-x)M|}ujFoJzx@tNWD}1UTF}TG8v~xL
zsfk(j9Q-&6b|bS_IQ})6k%OvO4G7go_aC|VE;4l|iYt?IaiXl@ETq1lqRArb-<6Gm
zh{u1%<|A&Jl7)p7@XB6oh8)I_+opr*5^zg#p$KD$H^1qsHs<$G-XhFbRa35Ogy`tU
zL#lj%s!_hE*{EkNrj2>qvzl+*MBTW_fchiGFwVk(IBZKCp5GRy=3`4%s=JB{>yL9T
zR3s-ws|_`#AB#n!AMO7mZ|d=|q@#5hoIxuaGgPG1xQs{^6)>=Oi}mkHCPd~rslgrO
z5^NYb1o^_XFACNS))h+N``>4vUJhNo`f7pT`j`9PQ!TwGm}zkZ65=xmW~{jh@Z!mZ
z<=mDi*4;oE)SFK5BdXswRaSxDd^0gT<*J*8)XsTj2aPT~I^Wn9zDSr|DR12L?QqxL
z4*pj?i#%l=!fUZAw9~+D8WtO`_B(G9rNDSWB@V{@*=xgG%S=F~*soDu`?mF9fqZ<}
zAo?`v+NY`pf$9+uG*puOO+aR-Hl5RTNIsPl`P?Vtn~bHsp0mYcFywuY0yff_&mkeS
zH&u@zDiy&QmC2bd^GSu%K?9rlhd9SGk;yuv6Y00ID*99pknD=uq*_KUw3veM%LxBH
z;oNuLLeNhHQlG(2ug8rZYL8#fRN*(yg(xn|02HjN1S~w4rguO)oZ#%>;D3XF6pK3j
z7^0QBWRrSh_Q_IClV>$4=IwE(eh+2bet-L{CMo?i4Wql6-Bwd-saX-2j&fdXV6lq%
zZ;OG}iSIr(E=FUgBcc;~UmzUs@suHIkx@(E2Dl%DET<+j4SGe&p`E22zV_n91wMz8
z9kj6W3!ASRJ*Y_+C9EIsT&P8#j?Kn5|65nGIVi5mVcFAnLO^!P;#}9FUH$1!f6BNW
zi(G@D0p`j3%gWw+f#mA++XnXJ;+@o;VoKf4xSN3~zoVR-DpB!9N7
zzK=7aXe%Fv)k?&wt??*(wFVMdp-wSPo5C8fE->@OBN6n8`0gHiSIU!~M7F@G3
z#Or=NEx+3D76%4uLnL$&w=LPWOiLB^?UQm)xqnv|bUkk?|3nB}5R5?tGqG=(8kCmY
z_*91M^k1%#v)fSTmJ>BgB#=@#;pSeUUYAi}D=iz5{;#Xh&&kT(+g`{1hdu(YV-^mk
zQPxRcu3kgBe|`gEWGubGHuO4O1=+xMy{^N`lB)8#flPJ|6wX6*AUY=0w1@_VWHY~#
z79JnmLN1Rmm#ca@hAr@^_74PDPe5m3g{
z5D3c8EMeHll)nZ=95NcCIKT$vDSLx!f>I8IOGJn4Ds)VLBo=^X>G5opv{Jkjw?qHd
zKk~r8wJe4VhQqNrp8*x50L*6>=xS)x0+JP|Z^#?86n4s_?5kkI519=hyKPj_AtCA^*_TBTA$UDnvVKiSRCsaB>V^d*XLf{*L*K
zJ=D_9QPXC@``4Falx^HOTQ_M6{_LF518SQDLj#z01x@%@AIGu_XhcVmBmNFrJ)1)#
zK-RkqG#c1d*8dM}FxO96m-u1ldpf%TalNf?anXbX*ND$b^=L+dqpjh0u6+TAxxeqM
zbV9qFmz6S^=j-&P?0#H{5y@YoS@06pxG-e>ve%RQp?u3Gh)+{GOk3(B&-4d
z7CXl*$F2eztm$pboqWU^?QTnZ|NI2Sa_2=k4u~!y)-4ms$rN0A{R^K!Uf9{#=;YH|
zHdloG%e(6+C=`)UOQ{7MkP%r-PKdLQeOlDR+rS^_3E2HEgYtcUIY!iDua=@jHlqS9
zH)vme1tCtfXe&O(m18+Zd>UYo+jIp3!&viZooMx^|CI^<-G+1;XhX^p0MuZ?rMIep
z&a1c>?78p#HM>8=$d(gb3^s6FG11IBzN&cr86l7yS}lT>19bjVNMsN(w2d9ad!F0*oZw9;zg9~}C3XP~0nG1l~GEx3jG
zbeEc_+w-0N_)pkTfB~7NkQS`8EY}>g1x!VrNIyo0%yi3wCzod@>=19mkvpSSX|=wo(pgqFO+sYfyx`
z4Ftr5AD^449ygIp)29Ph-jI3E&^O|;+{iJ$#6QqOwt}Ix|GA2N0q4)~8wsSLLCJRp
zjbUU0D6{OfBN732zF?mp@T2(<=>4jl%2{|36^}S){8}|Z?8io+c?i*}lZ2o-!m=q4
zj1+Pdg#C@YX|J^e&6#c2?hruC3s5`1)GB}$0isd2g2N3UTfAldpp~Y~4+&w*0Hm|&
z3-}uUY>BJCbUFYW&TY9cRmUR(}&8f=AUea$;>CL9Y@(;E6*H&kJ
z@IgqGBU=l)%<1{Z{vSRWx)Lj5Y^wq|QN=^YByQbm;!AY^5Du+TZSwsBW8p)IUk?)C
ze40O7yAj&6LtZoAJ_`lV%Y|ExPpaCU_2n2A1UyZedR^O?`QRMG+`)9uIY3~#(+U1!
zR`;eHXll7J7N5>`L$&T74a8rBo8siDtoPa(PN%+U{}1K>-2P)fhNRD?Jd#TP>BanW
zWj;iYbNttme;ilx3eX>W_}iy5|Amy^Y(;@PT%E
z-ZG!NSXwVE{D9Sxwx5fA7=&{NNp{Nw@RIn5!;rafsa>AN==b(l^M!bpvzl(39bWBn
z3P2ak_ByhN1HV87b@BsS|MF35-xd7GcK51Zo3$^#^~A!R{LAqVFZ{5P4|k7B2uA>w
zhf6h{A=^N2^XNSnlNT*%{(oXP{$xeCowF=yXyB5O+(m0T|EdsQU0#3Bt
ztntzi0hRSFQ-!1kEMP4veDpeNw0gvLqUtj&AJJIbOY#A4*v1#
zUuafQgux5QHMv|K7N=kO6B;3SJ`{k>9ZM4Jn}LfDl_CMV@lxE&Mx(doe}CyrK$U77
zUcI_a*Z{-->7vt*YkvHY;k=!tb*T|(QdX+=^MeF$;P%4R70pqNPyWK5SArEm$guEg
zSlQv0Ir#Y>^`3xmMMb`0n?+Qy&ZW;xe_lc_*JIRbwM=#D*&k-c&lixW8n@
z;C?Gadr{zEjB;9TN>STfY4L=#O{b(LTQ&+E`k*+{HtCg{1M}yg5{IJ`0K~
zrg3_Tq+?nn67xxEqyK#e_>hDI(8hnl
zZ`=CLuO9J-vw5oubn2Ne}%GecixG@3ANfbbl+2X#6ikr=OB$Q1pcb8c*rl=l>`p
z35a>)=y&?9g5~%9j&+XNR;nZNYfc^uIZfjIfd4zmFzyn=>oQh&$g#0Y+Oe@v+OaE&
zV>yrvE%z7o>=!n|aHII=0MBs$!@$ZDu5azh>qj=HYYTvKu;vl2$BQnF17mkDAFueU
zTc7_xz{#{|j!yAr)R>#a;lVF4m^iWhM}gj(twc7#P5#m#NWOjK1r`CT-P=@?&92`(
zLfG!Yj=J(QI8fVpzRr*JND9Q4omBsT>fkW&@}*j)r}Ivd&j>DQ%B;Bl`UoDvdSw2(_@59r(-HC
z<0w=bS`gM~gXv~}pO))$_diEA_n5A?8@=XYYL75sK3($s3G;F5d(>0Sn@NJjh?Y^J
zQc+ai!-KYR%Tqq>=Z5XpA3qlU^F}`0J@z5m=Gz73q6@FSNOtdy!xWZs6W{hq1@E?1
zkN)2NYUFGr!}Em83zd46;mtUFwT}L#zu?6sm>dc0K@B@n)J1C=Ej*U)H&f{1awwqd
zXu6zL*b>qS`PbZ&57*8BKK%5Gj9=~rhP7Bx*R@z7*U4CQr;ZN)ZewxM$x`Ev6C)l+
zV56umOV5lX4GoRu?E{-`d&Ux9<)l}7)$ja?b+Z&0!j?!Ln%1ZPx^RFvtnp=|s8L)xemQA1K$CtH??5h_czu|{^q*q7`(sR!A~
zzC~m=gfW(}^pJhumoX+G+YBiThH>t}`=0ka=RKeE$N79te>JZAzV7?FuHW@rzt{Kf
ze|f95M=j*$Y%p@OKWq`86aijvCG!t6p93tL{t3lL!D+xGRb@dlE|}|Yp=jG~t5HLoc*E+dly)Z6R)m!i3>@R;%IW?Kkk6)Y
zF7whfBd%)u{(e+dUFm$V+s*4n_iLTP^S|cLNeV5trpp^~WVPOJhe?mS$%)m&vTPkz
z=A{fp1QQR(nxm&DTIq$i=4n1v4X#X;j-PSZ;%CGB>@ZeL%3~CRb*c~szbir=SEclX
z_)Hk&a^Xz&m6O@+5)RKt@+o5d;`=m=hLif-wG#VW1$qOxNW7sPS67Di#>MZ{`juUj
z#-nBO8;CAR0`DScqt@!*#8EtTv58xkcfE-dU2RNcWe72eiuz!T@Kr3{(N|cS&lQkI
zr+AAIIz(V0ADC-n`QBpMl{qcHQ=c!Pe>grxm%FHASa;tov|81#-m_wOu{X#JgM91s?ZntKMFIpr-=eICym#Nx3zr9^ZGD1R4zbRy3J_+R
z{RAqu1Q9S9P7JNebIDO7rb((=$37Q-*H1`m=a6mmC?4y`C04+(yP3HFMBE0J4}b7y
zI4hKxcFQU{8#lJjN@n~@8*Zf~Zl;H0f=W8mpoed}}L(RmI2V2(B
zGX`}zXK+_Qg)He}hxIU;X%^wkSK}&8T(*?&i`5%Re#M7L(}4%>P#k)a{_xwS<)&hy
zQYPFb)ZItE-E5V<4kP^_w42i`#edRud+KshNhgmm+S5v~`)&|8)QKPI@QjH%@5#ccdSAW=SoYp@MPc
z7%r9TM|h{yJTWA0sZ_AG^bhjPttjywm`_82paY>IWP{<6zo)a|lL+@@xAHjd)}Pa(l-?
z13~>_@)yiso3jKimVZI&mWz>Eoh0(|8D5>=8W+J~CO5%K=JW*k8`Ye@C$|A$~#`u5Pe&0q}2lTFl$2;uC
zduXN`F+8N@@c<=0>*KfJ%UHFL&t$KDyhyRO_@rrW&ut|k-f*l27{4AQ@^dhI7XHl?
zbO{3QLL-Q&fMs~qpXacqF!*2ddMN>|
ziKEyDbB_p9&9u|ZvAu6jcQe+G)kt>uk^M5OLKh
zKf+)(p!@c+F9`*!aJ10J+<2Lr!K{J!qTaifl&WjN`6zL%Q
z>IWNf-QR5wo1BG8%^?S(^uaRX=cWZ$Lp>$Yd5e1>r~HfJ6Mkm6N%89aWl!SmnNaJB
z%B@8Zt$EiX%{`6uzujmWf^c>^JM(pGX9-1$U+>}a*`#b+V@4t
z&Hz~aFf5))n#J2wKJ_Yl2n48#>u*8Fl&<
zM4L>3n#T!3D8i(W)>>6T2AAqiMq0hAJSUU_2R*_a`yW4YPY*b;m%g~udg^EZ3x=WqGSx~@KYM}+n`+Ws#m1Ah6bip{IQg!Xe*Sfa?Ufoe1GR$AI~)!fF!6V`oruv+X6<7)0jcJ
zWh&cpEj;$46}+CB;qk&t!)14U>7TdNp_GfzI{q0(D+5_woFw~k!~p7
zN3Xsur!w1Kz1t_`iJ1?t{CSk10b=oxFNYSL_kTsO&?osv&Y3hnm~O`CJ!SB3Oavcsi&Yov9o
zb~jL4Gt<`1ngzp1Zg8tZ>h3FOkjlpjCc#WjCyCpg9)4*)dr2ujlkOlJiS0N`ItC&C
zn?VWd8{z_%a%HiLDIHzUo8@v4m4B9MdSj*=?mzTM^@Q2n?&&(cv6p4|YLlX_W3LiFs46_aF07#qkBuhdZmAX^P7E
z`9JDCwksXRXVPE`D4Qt^RQmhyG$vMaF*(qr+dS@t0;rmAGuZ;nxB0edV1KHat)&^s
zpcot+9l3Hy`cqlR{^zN)@>~kbR`xCxT62!{6+4Ec92XPk!ziS~Zhlhw15arJJUSq@
z_^D2Pyr5dY4eU0U6(_9sbeb#j0yw`^OgRkboX=eBf
zN|5VDt)7(2W~|3qtC#a@zaZp2Kz(iOAJlE>g{>jJ4U2`##mFpl`y
zY>g?s;LwSB^vx~lDN%LHli
zpy&rStKWu$>cnLx(n={QD{@Q(?ISVvneCufag%q*uX_+2*`Rn
zBTBeTVVoOZqTr4wl%(3Mp2aB!ywdM{xt81^niRh*4RTgb+}JizY5YqSJed5z3^i!q
zBxOdlBqWv}2s0iFTGrfUQ=(>9!_B6eor6P8=Z#;vDOwJ^{FzN6T_#07O)?A70w!EP
z3j&Jexr9@guYkDy1%za95SGZ2xsqOMIw7PiM`)roF)UeQ@VvHlap6y_W#vGE>(k|Kw=OlM@(1EV!l1aA(Oi<2XY>31MB=KqHpQ7pv@@-?f{)WItp|qi
zI3udjm_wq`Z*<8#Z_r5R)xjOJf(FReDmTfdcZwxWGq!ENAH1*qsBL@6Q6ppjqD{fs
zkhY@&fDGz35L&WKcOgrDfLPP1vUBR6T)PW>+^Uo;jdgo2x-XboW~ZP=v#xrZ2j;$1
zt6`3QNn7om6bo%jUmd-#1X)dB#TT(qfD8JQJtI*Lt(i4_u}<#T1Ca_gdI#IB;o;^8
zy!D?`3KC{M#G2^MKhqAmd(Gjt)*{yE0YBGUx4Nh(oc;~m7*67@iG
zlZYFRZcgBRFFpf#Av^vgd#+B|?d{vW<^+k{F8lQbo!>apa}yKepQWcO_iy(eV9G*R
z7SA9MI-Z>m3hgXZB9QRjFwRKt@UrM;eXkrJpYK@*74y$l$Xm9M#8!Q9c_Mc_Pmdb3
zrGid|vN&e}Hk?OkjoZwpbBQVMmYENpbmo4~lgCevvgBD9a`xtu!^Y>tKn}tkUgF00
zPPloHyq~TWXyC5e$15-Vg!aRgxn9X0Vk(7tjgVg&s$SXYr1R?=R-#NN1cB$URFMdJ
zYPHN3l1oz0_Z5qU{Qrysmj&C#yX(9??It1`_^8(p6MdF7c_K8!+y1*de(OCdpwA_A
z**bRCGbItLM%yifB)YC}^-O&56DZme<3{O}o>;{y4nSm(``wx-=>7mB8|WL~*hSi?
zFE^92;?GByk1?Bq-i;Q8zXZx7lhmKoXSGV|qhbQkA2L1Cwx0787ayh)S(D8F(37?r
z$0MC}W-2*JAHONSa5)_{*=N&}e+`iAPe}T+6q#RAo?LPR%$!9wNpw|_kRWAXS*ix|
zeeH8wBDXM}tsI0FzK({yE^pYfhmT>i#_rRfI?-_~fzYbr)YNW8)3*-A*Z81e>90nW
zhtMOZyRX%DDqEO$niQ`p>5T^&x<-vTl>jLQow4#kr}3I;Dn$1D*;54jgxP-Kn^p|@
z?*@W2e1edFz;96`l#X_(I*xf1
zW~F1>*5lLNP=0Un^^!iOA^}#$x8tZYi3qPkMMAsZry8G|^R}|IQRw(1P?Aa>alu*o
z`esVAt1%+?=e0P;cgp+TUGP4!A(U$W7Dm@6;C3`(S}_7&JGlc6ih%f&^g}@CxOEwE
z(iskAPR5fcu?f(8BkK*|BABggKF$sZs@`-jeGT#3^B3efw6DDBqMV~DsJNDwLTf4K
zIAdmCZ9M+0;`=Y7CHS|Gv2-0C0htHdiUwJ}AnRF03t4NTUVRDL5%*wek$Ug{qUM?TU!9%!=y4etm*kIWFu6t_Sbxv0C|il
z#Rp%X090LP<*2m|cWhbw{9LkX8ZEbn*J`~S&1DG@S07kj6z6p@QUP|teK;_AUWCxuz$+PNQLFN#ujHWnhPdH=-gfGh{2CS?
z`}BmxJP<7k)cwP}HR#$kwc1ub1Ja}t6Q6LSQ>*ZFol)h*?!ARQ*Ogg+2+lKK>}?})
zZqr9u$alG$oBhUAhhD?#(`w6gI5k**R8qh8lbKt9#QZCdcBRESBOk}HBLB(48rY8<
z`1gZ%uMCEl_<3rEgKykOS-1aH2@A?CsB@mDHLA(w=F$2Pu6cbtJHx9^hK`Dw^A_rP
z`=xz-&ch)qmHo+iX%40tseoTw&|-8?rzt^fZ_PC6G%*4X*GLdrLnLbMUT@p(I=oo4
zZ}jQRiK&L2f3>Fx+trb)!!^`beDkZe%!GeWxYTshJ)N08V|&BKTy1_Ui1h(WW=SYv
zDz+iEx2|lVnU7C6sn0DS)hWQn0BgJ%OGM+iFyni6ah=6@8QtjpSRYYuwtWlpMcFv}
z(Q5f|2DY3^9&z}{^^qa5IFmp%Mm3k(3!@e=-j-INW(ToPSf1XT%qg`$Yl5o{B=)}{
zylhpk&f{Neob0dj>b{ovvCZy^$?EUZgrJ+5Aj)2-+hD`e?4I12q%FpWnW&dj*y)5}
z(gy+MbWUcW3h_$C==(xmZgf4t7+nu?PN<>bCz}{pXi8F~&JjowFt)Fc*$P|oIG3il
zM?LZuy2X~j!;HS4NR*J67CxA!mK4~
zq1Zw*NscHayVU*lXV*U1Si*cW%Q5+}Ec~$P&cp#^F=8>Iyumx*?UXwg_@q=<@G!97
zqNvJ|hL1b;HB{k!V5eJl0*`li@pqOfaouJQTe
zV9CbI88X>wscF|ibflRb6I9R)dJZ9EuQ)C^8}Nbj8shsUsq(8G*7iw$w7BZ~AAH~@
zO^a8`()ntIP-%loRm)SgdyH6_wd3d!ZJc0u=J+&AGnQ4W2%M^H4vJ4
zSKF$rEE^l+#{ADAwjf+|jqvN45mysQVHJQ&UDutDS+KNbAkA$OryUx^q7$-|Mvxj{
z_e-pV?j>|x{WE{*H~(b{kWxTq8@`*gCst6!{_?~^M#{a$D@VFDIU{wXXPSi99_O>g
z(73VkrOrozJT&UN@&<&87DMR$7fZuAnLd_}iGcd$?IE}vlbS>R4>5^VCClV&qA`P(
z&PN7D&V^9{F6>g{_N?`39`h1Kt)xC@F4dZzATA3%@1@nNyqNw>wLNU7;0y2D<3|fj
zvrOZ4D@N87Uz&rNJ*Z4TX$IS>^eiUI{uu60+qBGIPpREPm91P_t}ZtEu?0fA%z=Rg
z<%3IrfuV>e%{i*u7JfadJp4fg=tLeE)1q-MQrq!T6NIE&-W%VrXScf9BHbBjBr>=>
z&j!DxhpSLqRqSGITmCZ-3vIw)$mN^ot|CaC-aifEOM2eG!oS0{h2HFL){pbn6*Y3+
z$L{T1+vt3JmVj=BU!Bxj9-rnZzSv!VUQ6e3kbt?V7f|Tgu+(&Q?xy*Tb?@&DXd$Ox
z(`@|RW&<$(X8q3Im!g$7NuCfqG{1I-3kU5Ka_b#t(BA7+zl87YvOMCe_;
zF>Hq~&J}uUZ-J#8r*hQ!8vu)}x-&M^uv5Z}OeMtM;S+5QTZtoot3<
zujkk^do6Pj01FjTxEB2#iFMS@4f8zn|8>`mP|WN8FFUPT(?M~LeF)#Zp-FNXkSz9A
zDnMB&(hF;K|JZbr|3m|X&GsL4b1KLyD%R^;BVVO;TrSgo1C)_C3hvM!yGB6Tctnf>
zDKJVn_;`ev_}hRGT9n+dspZIAga0xy#|dZP&Um3MzW^(ie?FNE^a1(=-U}ZOxF_!3
zX3LEK_{+cau%!yry#27O`u`0&4Ac)HWRE>#=6T)elV$j4pFpD@5Nv2+2_a*D2a*97
z4M542zD98PwYEs+#XQxt9~OP-
z%K-Q3b&IkkH!Ur##Qm3LmDEYEH0%JVDP7U0b3l#v6lHgkKz~uy#A-=1hv8KNlVog>
zowKgN=U#u{lL8mv*QB17!p}A0pMlr;nIcmZNfloG}5^|TVsG=vBGn=HEhk#aS>cA$pFRN5ECx4ODIAt;
zxEp$e;tbqYl?h|jA^{B0B5OE+pLhB!tM4~{6i$eYDy##z$)+Ni?icyJ&GH~GIa4~Y
zznJ#V4EX{Wvjh5pXgq-4?tJ*WM|gvg!w5~gv5ocdJ}zno(G6hF97F;u66^z@WapY#
z@;-yL&+HygSRLTSYbS|Skr$Uc^@|??vk1_x2#Q(u-G~>I8_pq%Nnn(MOjimp&b9!^
zrWn<+cx{nCrExIBtWW-0#x2fQ04-{*UZusym|3qQc@2DX{;6P26U!d+o1-%)fqP^L
z^k2WoNB#-m*63V8TdgND6?QuduKYh;36QQnwwt(i<5<)KU!Gg~Q|jR2Uq`pf8~|lx
zttLWnBKhaL^B0&!d8Jma{>!z=cK_40c2%P~rMbDMnNB*+J_o=xQGCdW>;fV4;G==B
zkb5_p86l4`%ZieSug+XWR|^!w!Z;O<_7O{xjFwj1>TrHE`I`U`ek$)vW
zvh)C;E=tuDpmuPA;6A@yovh3sj<)*;%8Zrb06u_?5b)m!cc{j=cPAwr+nEAEKn2`y
zq|gRLPv%zSYdcCq*FiZbIvD^gFCuQRET}Nu2cUWs=UgQz_t05QSM-f)$sfxI7ifIY
zxaP^eBuHMgHga0WX^nvo0PsoN3k3LUQ2?KIE16^8VRLD4gL%LKQ&-!U0cn@6$*mbY
z3sXJo|C9`582EV3s(!pifFpv$=!%~j-C7!KA=6f`C7VS#0mRP5WKM#Rmya#UuOMG6b$O2*vAoRvoGd>!TZ?jRpm9Lp+;!-w+jF>uFSD6#Y
z-Pw9KR}j#(j4=QJ^xB9a@93-+IskH~m)rgG5>3$2n-wqw+C(&r7Ubyc7hEG>-9TrG
zgO5X=9GUr%L^5754>Mk3-(A2$Za&Md9$8+^zH`KpTZ+P1#^r3pO8*768r$REHp=+i=#_!R(fQzg_KOAUr3^^(nsxVF}mQKKHO#d7ZOeb{*hw>Q%4K);+$2)=yL=6Y5*aD0l=#oc$-36
z@}z~_&Jxry<2yMs9TP4y{HtR@X>*P><##s3<$IL_=~s}y$cv--0OFoR1li@huhFsd
zFA!Uz`Z=;BS)HPYT$c{lk#PuloOkgmm^`j5v&-B78UBsAYidqS8Qv%#t3DbBuT9!x
zW!p+W0KOr#$IX0dbh;wGEEfPAN468rE=IiY?LQlKq&2(%pfR>~oO5GGs^s?xyK=H5tF>@SVv%t^Z*c{PRi4o%5BGo2%=@eZQaQrmuIL89%-&7
z!cyCHO!>TCs@xB_7kUm{KDhMv6R|r|e#>@kgg48v0Qhssib|xB;JC&Ty`HxHu8m-v
zCLS-yf(K_ck(Y2vK8rn91zq&%Z+Q2kH3R0e=%dNy6Yc*u_b8rRa{nbP_uoDiL$;z%
z0V~4Ea0T?Yd&o_%Wp;u63YOMl|98OlKy6^ZYF>$@04^l!_LKKG{_p?gk^9n3oot8d
TSJa~a0RAb;L1jxHo4)xE6;A%>
diff --git a/demos/angular2/src/app/app.module.ts b/demos/angular2/src/app/app.module.ts
deleted file mode 100644
index d7bb39a..0000000
--- a/demos/angular2/src/app/app.module.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { BrowserModule } from '@angular/platform-browser';
-import { NgModule } from '@angular/core';
-
-import { SheetJSComponent } from './sheetjs.component';
-
-
-import { Component } from '@angular/core';
-
-@Component({
- selector: 'app-root',
- template: ``
-})
-export class AppComponent {
- title = 'test';
-}
-
-@NgModule({
- declarations: [
- SheetJSComponent,
- AppComponent
- ],
- imports: [
- BrowserModule
- ],
- providers: [],
- bootstrap: [AppComponent]
-})
-export class AppModule { }
diff --git a/demos/angular2/src/app/sheetjs.component.ts b/demos/angular2/src/app/sheetjs.component.ts
deleted file mode 100644
index 0015d61..0000000
--- a/demos/angular2/src/app/sheetjs.component.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
-/* vim: set ts=2: */
-import { Component } from '@angular/core';
-
-import { WorkBook, WorkSheet, WritingOptions, read, writeFileXLSX as writeFile, utils, version, set_cptable } from 'xlsx';
-//import * as cpexcel from 'xlsx/dist/cpexcel.full.mjs';
-//set_cptable(cpexcel);
-
-type AOA = any[][];
-
-@Component({
- selector: 'sheetjs',
- template: `
- Version: {{ver}}
-
-
-
- `
-})
-
-export class SheetJSComponent {
- data: AOA = [ [1, 2], [3, 4] ];
- wopts: WritingOptions = { bookType: 'xlsx', type: 'array' };
- fileName: string = 'SheetJS.xlsx';
- ver: string = version;
-
- onFileChange(evt: any) {
- /* wire up file reader */
- const target: DataTransfer = (evt.target);
- if (target.files.length !== 1) throw new Error('Cannot use multiple files');
- const reader: FileReader = new FileReader();
- reader.onload = (e: any) => {
- /* read workbook */
- const ab: ArrayBuffer = e.target.result;
- const wb: WorkBook = read(ab);
-
- /* grab first sheet */
- const wsname: string = wb.SheetNames[0];
- const ws: WorkSheet = wb.Sheets[wsname];
-
- /* save data */
- this.data = (utils.sheet_to_json(ws, {header: 1}));
- };
- reader.readAsArrayBuffer(target.files[0]);
- }
-
- export(): void {
- /* generate worksheet */
- const ws: WorkSheet = utils.aoa_to_sheet(this.data);
-
- /* generate workbook and add the worksheet */
- const wb: WorkBook = utils.book_new();
- utils.book_append_sheet(wb, ws, 'Sheet1');
-
- /* save to file */
- writeFile(wb, this.fileName);
- }
-}
diff --git a/demos/angular2/src/environments/environment.prod.ts b/demos/angular2/src/environments/environment.prod.ts
deleted file mode 100644
index 3612073..0000000
--- a/demos/angular2/src/environments/environment.prod.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export const environment = {
- production: true
-};
diff --git a/demos/angular2/src/environments/environment.ts b/demos/angular2/src/environments/environment.ts
deleted file mode 100644
index ffe8aed..0000000
--- a/demos/angular2/src/environments/environment.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export const environment = {
- production: false
-};
diff --git a/demos/angular2/src/index.html b/demos/angular2/src/index.html
deleted file mode 100644
index bc806fb..0000000
--- a/demos/angular2/src/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
- SheetJS + Angular 2+
-
-
-
-
-
-
-SheetJS + Angular 2+ demo
-
-The core library can be used as-is in angular applications.
-The Community Edition README details some common use cases.
-We also have some more public demos
-
-This demo shows `SheetJSComponent` which provides:
-- File input button with an event handler to parse the workbook
-- `data` property: array of arrays
-- Simple angular table which binds to the `data` property
-- `export` function that exports the `data` property to a new file.
-
-Sample Spreadsheet
-
-
-
-
-
diff --git a/demos/angular2/src/main.ts b/demos/angular2/src/main.ts
deleted file mode 100644
index d3da1bb..0000000
--- a/demos/angular2/src/main.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
-import { AppModule } from './app/app.module';
-platformBrowserDynamic().bootstrapModule(AppModule);
diff --git a/demos/angular2/src/styles.css b/demos/angular2/src/styles.css
deleted file mode 100644
index 90d4ee0..0000000
--- a/demos/angular2/src/styles.css
+++ /dev/null
@@ -1 +0,0 @@
-/* You can add global styles to this file, and also import other style files */
diff --git a/demos/angular2/src/tsconfig.app.json b/demos/angular2/src/tsconfig.app.json
deleted file mode 100644
index 321e0d7..0000000
--- a/demos/angular2/src/tsconfig.app.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "extends": "../tsconfig.json",
- "compilerOptions": {
- "outDir": "../out-tsc/app",
- "module": "es2015",
- "baseUrl": "",
- "types": []
- }
-}
diff --git a/demos/angular2/tsconfig.json b/demos/angular2/tsconfig.json
deleted file mode 100644
index a35a8ee..0000000
--- a/demos/angular2/tsconfig.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "compileOnSave": false,
- "compilerOptions": {
- "outDir": "./dist/out-tsc",
- "baseUrl": "src",
- "sourceMap": true,
- "declaration": false,
- "moduleResolution": "node",
- "emitDecoratorMetadata": true,
- "experimentalDecorators": true,
- "target": "es5",
- "typeRoots": [
- "node_modules/@types"
- ],
- "lib": [
- "es2016",
- "dom"
- ]
- }
-}
diff --git a/demos/angular2/versions/angular.json-ng10 b/demos/angular2/versions/angular.json-ng10
deleted file mode 100644
index 9e7228c..0000000
--- a/demos/angular2/versions/angular.json-ng10
+++ /dev/null
@@ -1,125 +0,0 @@
-{
- "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
- "version": 1,
- "newProjectRoot": "projects",
- "projects": {
- "sheetjs": {
- "root": "",
- "sourceRoot": "src",
- "projectType": "application",
- "prefix": "app",
- "schematics": {},
- "architect": {
- "build": {
- "builder": "@angular-devkit/build-angular:browser",
- "options": {
- "outputPath": "dist/sheetjs",
- "index": "src/index.html",
- "main": "src/main.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "tsconfig.app.json",
- "aot": true,
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- },
- "configurations": {
- "production": {
- "fileReplacements": [
- {
- "replace": "src/environments/environment.ts",
- "with": "src/environments/environment.prod.ts"
- }
- ],
- "optimization": true,
- "outputHashing": "all",
- "sourceMap": false,
- "extractCss": true,
- "namedChunks": false,
- "extractLicenses": true,
- "vendorChunk": false,
- "buildOptimizer": true,
- "budgets": [
- {
- "type": "initial",
- "maximumWarning": "2mb",
- "maximumError": "5mb"
- },
- {
- "type": "anyComponentStyle",
- "maximumWarning": "6kb",
- "maximumError": "10kb"
- }
- ]
- }
- }
- },
- "serve": {
- "builder": "@angular-devkit/build-angular:dev-server",
- "options": {
- "browserTarget": "sheetjs:build"
- },
- "configurations": {
- "production": {
- "browserTarget": "sheetjs:build:production"
- }
- }
- },
- "extract-i18n": {
- "builder": "@angular-devkit/build-angular:extract-i18n",
- "options": {
- "browserTarget": "sheetjs:build"
- }
- },
- "test": {
- "builder": "@angular-devkit/build-angular:karma",
- "options": {
- "main": "src/test.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "tsconfig.spec.json",
- "karmaConfig": "karma.conf.js",
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- }
- },
- "lint": {
- "builder": "@angular-devkit/build-angular:tslint",
- "options": {
- "tsConfig": [
- "tsconfig.app.json",
- "tsconfig.spec.json",
- "e2e/tsconfig.json"
- ],
- "exclude": [
- "**/node_modules/**"
- ]
- }
- },
- "e2e": {
- "builder": "@angular-devkit/build-angular:protractor",
- "options": {
- "protractorConfig": "e2e/protractor.conf.js",
- "devServerTarget": "sheetjs:serve"
- },
- "configurations": {
- "production": {
- "devServerTarget": "sheetjs:serve:production"
- }
- }
- }
- }
- }
- },
- "defaultProject": "sheetjs"
-}
diff --git a/demos/angular2/versions/angular.json-ng11 b/demos/angular2/versions/angular.json-ng11
deleted file mode 100644
index a1563c1..0000000
--- a/demos/angular2/versions/angular.json-ng11
+++ /dev/null
@@ -1,124 +0,0 @@
-{
- "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
- "version": 1,
- "newProjectRoot": "projects",
- "projects": {
- "sheetjs": {
- "root": "",
- "sourceRoot": "src",
- "projectType": "application",
- "prefix": "app",
- "schematics": {},
- "architect": {
- "build": {
- "builder": "@angular-devkit/build-angular:browser",
- "options": {
- "outputPath": "dist/sheetjs",
- "index": "src/index.html",
- "main": "src/main.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "tsconfig.app.json",
- "aot": true,
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- },
- "configurations": {
- "production": {
- "fileReplacements": [
- {
- "replace": "src/environments/environment.ts",
- "with": "src/environments/environment.prod.ts"
- }
- ],
- "optimization": true,
- "outputHashing": "all",
- "sourceMap": false,
- "namedChunks": false,
- "extractLicenses": true,
- "vendorChunk": false,
- "buildOptimizer": true,
- "budgets": [
- {
- "type": "initial",
- "maximumWarning": "2mb",
- "maximumError": "5mb"
- },
- {
- "type": "anyComponentStyle",
- "maximumWarning": "6kb",
- "maximumError": "10kb"
- }
- ]
- }
- }
- },
- "serve": {
- "builder": "@angular-devkit/build-angular:dev-server",
- "options": {
- "browserTarget": "sheetjs:build"
- },
- "configurations": {
- "production": {
- "browserTarget": "sheetjs:build:production"
- }
- }
- },
- "extract-i18n": {
- "builder": "@angular-devkit/build-angular:extract-i18n",
- "options": {
- "browserTarget": "sheetjs:build"
- }
- },
- "test": {
- "builder": "@angular-devkit/build-angular:karma",
- "options": {
- "main": "src/test.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "tsconfig.spec.json",
- "karmaConfig": "karma.conf.js",
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- }
- },
- "lint": {
- "builder": "@angular-devkit/build-angular:tslint",
- "options": {
- "tsConfig": [
- "tsconfig.app.json",
- "tsconfig.spec.json",
- "e2e/tsconfig.json"
- ],
- "exclude": [
- "**/node_modules/**"
- ]
- }
- },
- "e2e": {
- "builder": "@angular-devkit/build-angular:protractor",
- "options": {
- "protractorConfig": "e2e/protractor.conf.js",
- "devServerTarget": "sheetjs:serve"
- },
- "configurations": {
- "production": {
- "devServerTarget": "sheetjs:serve:production"
- }
- }
- }
- }
- }
- },
- "defaultProject": "sheetjs"
-}
diff --git a/demos/angular2/versions/angular.json-ng12 b/demos/angular2/versions/angular.json-ng12
deleted file mode 100644
index 69d02ea..0000000
--- a/demos/angular2/versions/angular.json-ng12
+++ /dev/null
@@ -1,106 +0,0 @@
-{
- "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
- "version": 1,
- "newProjectRoot": "projects",
- "projects": {
- "sheetjs": {
- "root": "",
- "sourceRoot": "src",
- "projectType": "application",
- "prefix": "app",
- "schematics": {
- "@schematics/angular:application": {
- "strict": true
- }
- },
- "architect": {
- "build": {
- "builder": "@angular-devkit/build-angular:browser",
- "options": {
- "outputPath": "dist/sheetjs",
- "index": "src/index.html",
- "main": "src/main.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "tsconfig.app.json",
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- },
- "configurations": {
- "production": {
- "budgets": [
- {
- "type": "initial",
- "maximumWarning": "500kb",
- "maximumError": "2mb"
- },
- {
- "type": "anyComponentStyle",
- "maximumWarning": "2kb",
- "maximumError": "4kb"
- }
- ],
- "fileReplacements": [
- {
- "replace": "src/environments/environment.ts",
- "with": "src/environments/environment.prod.ts"
- }
- ],
- "outputHashing": "all"
- },
- "development": {
- "buildOptimizer": false,
- "optimization": false,
- "vendorChunk": true,
- "extractLicenses": false,
- "sourceMap": true,
- "namedChunks": true
- }
- },
- "defaultConfiguration": "production"
- },
- "serve": {
- "builder": "@angular-devkit/build-angular:dev-server",
- "configurations": {
- "production": {
- "browserTarget": "sheetjs:build:production"
- },
- "development": {
- "browserTarget": "sheetjs:build:development"
- }
- },
- "defaultConfiguration": "development"
- },
- "extract-i18n": {
- "builder": "@angular-devkit/build-angular:extract-i18n",
- "options": {
- "browserTarget": "sheetjs:build"
- }
- },
- "test": {
- "builder": "@angular-devkit/build-angular:karma",
- "options": {
- "main": "src/test.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "tsconfig.spec.json",
- "karmaConfig": "karma.conf.js",
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- }
- }
- }
- }
- },
- "defaultProject": "sheetjs"
-}
diff --git a/demos/angular2/versions/angular.json-ng13 b/demos/angular2/versions/angular.json-ng13
deleted file mode 100644
index 69d02ea..0000000
--- a/demos/angular2/versions/angular.json-ng13
+++ /dev/null
@@ -1,106 +0,0 @@
-{
- "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
- "version": 1,
- "newProjectRoot": "projects",
- "projects": {
- "sheetjs": {
- "root": "",
- "sourceRoot": "src",
- "projectType": "application",
- "prefix": "app",
- "schematics": {
- "@schematics/angular:application": {
- "strict": true
- }
- },
- "architect": {
- "build": {
- "builder": "@angular-devkit/build-angular:browser",
- "options": {
- "outputPath": "dist/sheetjs",
- "index": "src/index.html",
- "main": "src/main.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "tsconfig.app.json",
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- },
- "configurations": {
- "production": {
- "budgets": [
- {
- "type": "initial",
- "maximumWarning": "500kb",
- "maximumError": "2mb"
- },
- {
- "type": "anyComponentStyle",
- "maximumWarning": "2kb",
- "maximumError": "4kb"
- }
- ],
- "fileReplacements": [
- {
- "replace": "src/environments/environment.ts",
- "with": "src/environments/environment.prod.ts"
- }
- ],
- "outputHashing": "all"
- },
- "development": {
- "buildOptimizer": false,
- "optimization": false,
- "vendorChunk": true,
- "extractLicenses": false,
- "sourceMap": true,
- "namedChunks": true
- }
- },
- "defaultConfiguration": "production"
- },
- "serve": {
- "builder": "@angular-devkit/build-angular:dev-server",
- "configurations": {
- "production": {
- "browserTarget": "sheetjs:build:production"
- },
- "development": {
- "browserTarget": "sheetjs:build:development"
- }
- },
- "defaultConfiguration": "development"
- },
- "extract-i18n": {
- "builder": "@angular-devkit/build-angular:extract-i18n",
- "options": {
- "browserTarget": "sheetjs:build"
- }
- },
- "test": {
- "builder": "@angular-devkit/build-angular:karma",
- "options": {
- "main": "src/test.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "tsconfig.spec.json",
- "karmaConfig": "karma.conf.js",
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- }
- }
- }
- }
- },
- "defaultProject": "sheetjs"
-}
diff --git a/demos/angular2/versions/angular.json-ng6 b/demos/angular2/versions/angular.json-ng6
deleted file mode 100644
index 30e40df..0000000
--- a/demos/angular2/versions/angular.json-ng6
+++ /dev/null
@@ -1,127 +0,0 @@
-{
- "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
- "version": 1,
- "newProjectRoot": "projects",
- "projects": {
- "sheetjs": {
- "root": "",
- "sourceRoot": "src",
- "projectType": "application",
- "prefix": "app",
- "schematics": {},
- "architect": {
- "build": {
- "builder": "@angular-devkit/build-angular:browser",
- "options": {
- "outputPath": "dist/sheetjs",
- "index": "src/index.html",
- "main": "src/main.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "src/tsconfig.app.json",
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- },
- "configurations": {
- "production": {
- "fileReplacements": [
- {
- "replace": "src/environments/environment.ts",
- "with": "src/environments/environment.prod.ts"
- }
- ],
- "optimization": true,
- "outputHashing": "all",
- "sourceMap": false,
- "extractCss": true,
- "namedChunks": false,
- "aot": true,
- "extractLicenses": true,
- "vendorChunk": false,
- "buildOptimizer": true
- }
- }
- },
- "serve": {
- "builder": "@angular-devkit/build-angular:dev-server",
- "options": {
- "browserTarget": "sheetjs:build"
- },
- "configurations": {
- "production": {
- "browserTarget": "sheetjs:build:production"
- }
- }
- },
- "extract-i18n": {
- "builder": "@angular-devkit/build-angular:extract-i18n",
- "options": {
- "browserTarget": "sheetjs:build"
- }
- },
- "test": {
- "builder": "@angular-devkit/build-angular:karma",
- "options": {
- "main": "src/test.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "src/tsconfig.spec.json",
- "karmaConfig": "src/karma.conf.js",
- "styles": [
- "src/styles.css"
- ],
- "scripts": [],
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ]
- }
- },
- "lint": {
- "builder": "@angular-devkit/build-angular:tslint",
- "options": {
- "tsConfig": [
- "src/tsconfig.app.json",
- "src/tsconfig.spec.json"
- ],
- "exclude": [
- "**/node_modules/**"
- ]
- }
- }
- }
- },
- "sheetjs-e2e": {
- "root": "e2e/",
- "projectType": "application",
- "architect": {
- "e2e": {
- "builder": "@angular-devkit/build-angular:protractor",
- "options": {
- "protractorConfig": "e2e/protractor.conf.js",
- "devServerTarget": "sheetjs:serve"
- },
- "configurations": {
- "production": {
- "devServerTarget": "sheetjs:serve:production"
- }
- }
- },
- "lint": {
- "builder": "@angular-devkit/build-angular:tslint",
- "options": {
- "tsConfig": "e2e/tsconfig.e2e.json",
- "exclude": [
- "**/node_modules/**"
- ]
- }
- }
- }
- }
- },
- "defaultProject": "sheetjs"
-}
diff --git a/demos/angular2/versions/angular.json-ng7 b/demos/angular2/versions/angular.json-ng7
deleted file mode 100644
index be12951..0000000
--- a/demos/angular2/versions/angular.json-ng7
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
- "version": 1,
- "newProjectRoot": "projects",
- "projects": {
- "sheetjs": {
- "root": "",
- "sourceRoot": "src",
- "projectType": "application",
- "prefix": "app",
- "schematics": {},
- "architect": {
- "build": {
- "builder": "@angular-devkit/build-angular:browser",
- "options": {
- "outputPath": "dist/sheetjs",
- "index": "src/index.html",
- "main": "src/main.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "src/tsconfig.app.json",
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": [],
- "es5BrowserSupport": true
- },
- "configurations": {
- "production": {
- "fileReplacements": [
- {
- "replace": "src/environments/environment.ts",
- "with": "src/environments/environment.prod.ts"
- }
- ],
- "optimization": true,
- "outputHashing": "all",
- "sourceMap": false,
- "extractCss": true,
- "namedChunks": false,
- "aot": true,
- "extractLicenses": true,
- "vendorChunk": false,
- "buildOptimizer": true,
- "budgets": [
- {
- "type": "initial",
- "maximumWarning": "2mb",
- "maximumError": "5mb"
- }
- ]
- }
- }
- },
- "serve": {
- "builder": "@angular-devkit/build-angular:dev-server",
- "options": {
- "browserTarget": "sheetjs:build"
- },
- "configurations": {
- "production": {
- "browserTarget": "sheetjs:build:production"
- }
- }
- },
- "extract-i18n": {
- "builder": "@angular-devkit/build-angular:extract-i18n",
- "options": {
- "browserTarget": "sheetjs:build"
- }
- },
- "test": {
- "builder": "@angular-devkit/build-angular:karma",
- "options": {
- "main": "src/test.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "src/tsconfig.spec.json",
- "karmaConfig": "src/karma.conf.js",
- "styles": [
- "src/styles.css"
- ],
- "scripts": [],
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ]
- }
- },
- "lint": {
- "builder": "@angular-devkit/build-angular:tslint",
- "options": {
- "tsConfig": [
- "src/tsconfig.app.json",
- "src/tsconfig.spec.json"
- ],
- "exclude": [
- "**/node_modules/**"
- ]
- }
- }
- }
- },
- "sheetjs-e2e": {
- "root": "e2e/",
- "projectType": "application",
- "prefix": "",
- "architect": {
- "e2e": {
- "builder": "@angular-devkit/build-angular:protractor",
- "options": {
- "protractorConfig": "e2e/protractor.conf.js",
- "devServerTarget": "sheetjs:serve"
- },
- "configurations": {
- "production": {
- "devServerTarget": "sheetjs:serve:production"
- }
- }
- },
- "lint": {
- "builder": "@angular-devkit/build-angular:tslint",
- "options": {
- "tsConfig": "e2e/tsconfig.e2e.json",
- "exclude": [
- "**/node_modules/**"
- ]
- }
- }
- }
- }
- },
- "defaultProject": "sheetjs"
-}
diff --git a/demos/angular2/versions/angular.json-ng8 b/demos/angular2/versions/angular.json-ng8
deleted file mode 100644
index de608c0..0000000
--- a/demos/angular2/versions/angular.json-ng8
+++ /dev/null
@@ -1,126 +0,0 @@
-{
- "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
- "version": 1,
- "newProjectRoot": "projects",
- "projects": {
- "sheetjs": {
- "root": "",
- "sourceRoot": "src",
- "projectType": "application",
- "prefix": "app",
- "schematics": {},
- "architect": {
- "build": {
- "builder": "@angular-devkit/build-angular:browser",
- "options": {
- "outputPath": "dist/sheetjs",
- "index": "src/index.html",
- "main": "src/main.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "tsconfig.app.json",
- "aot": false,
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- },
- "configurations": {
- "production": {
- "fileReplacements": [
- {
- "replace": "src/environments/environment.ts",
- "with": "src/environments/environment.prod.ts"
- }
- ],
- "optimization": true,
- "outputHashing": "all",
- "sourceMap": false,
- "extractCss": true,
- "namedChunks": false,
- "aot": true,
- "extractLicenses": true,
- "vendorChunk": false,
- "buildOptimizer": true,
- "budgets": [
- {
- "type": "initial",
- "maximumWarning": "2mb",
- "maximumError": "5mb"
- },
- {
- "type": "anyComponentStyle",
- "maximumWarning": "6kb",
- "maximumError": "10kb"
- }
- ]
- }
- }
- },
- "serve": {
- "builder": "@angular-devkit/build-angular:dev-server",
- "options": {
- "browserTarget": "sheetjs:build"
- },
- "configurations": {
- "production": {
- "browserTarget": "sheetjs:build:production"
- }
- }
- },
- "extract-i18n": {
- "builder": "@angular-devkit/build-angular:extract-i18n",
- "options": {
- "browserTarget": "sheetjs:build"
- }
- },
- "test": {
- "builder": "@angular-devkit/build-angular:karma",
- "options": {
- "main": "src/test.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "tsconfig.spec.json",
- "karmaConfig": "karma.conf.js",
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- }
- },
- "lint": {
- "builder": "@angular-devkit/build-angular:tslint",
- "options": {
- "tsConfig": [
- "tsconfig.app.json",
- "tsconfig.spec.json",
- "e2e/tsconfig.json"
- ],
- "exclude": [
- "**/node_modules/**"
- ]
- }
- },
- "e2e": {
- "builder": "@angular-devkit/build-angular:protractor",
- "options": {
- "protractorConfig": "e2e/protractor.conf.js",
- "devServerTarget": "sheetjs:serve"
- },
- "configurations": {
- "production": {
- "devServerTarget": "sheetjs:serve:production"
- }
- }
- }
- }
- }
- },
- "defaultProject": "sheetjs"
-}
diff --git a/demos/angular2/versions/angular.json-ng9 b/demos/angular2/versions/angular.json-ng9
deleted file mode 100644
index 9e7228c..0000000
--- a/demos/angular2/versions/angular.json-ng9
+++ /dev/null
@@ -1,125 +0,0 @@
-{
- "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
- "version": 1,
- "newProjectRoot": "projects",
- "projects": {
- "sheetjs": {
- "root": "",
- "sourceRoot": "src",
- "projectType": "application",
- "prefix": "app",
- "schematics": {},
- "architect": {
- "build": {
- "builder": "@angular-devkit/build-angular:browser",
- "options": {
- "outputPath": "dist/sheetjs",
- "index": "src/index.html",
- "main": "src/main.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "tsconfig.app.json",
- "aot": true,
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- },
- "configurations": {
- "production": {
- "fileReplacements": [
- {
- "replace": "src/environments/environment.ts",
- "with": "src/environments/environment.prod.ts"
- }
- ],
- "optimization": true,
- "outputHashing": "all",
- "sourceMap": false,
- "extractCss": true,
- "namedChunks": false,
- "extractLicenses": true,
- "vendorChunk": false,
- "buildOptimizer": true,
- "budgets": [
- {
- "type": "initial",
- "maximumWarning": "2mb",
- "maximumError": "5mb"
- },
- {
- "type": "anyComponentStyle",
- "maximumWarning": "6kb",
- "maximumError": "10kb"
- }
- ]
- }
- }
- },
- "serve": {
- "builder": "@angular-devkit/build-angular:dev-server",
- "options": {
- "browserTarget": "sheetjs:build"
- },
- "configurations": {
- "production": {
- "browserTarget": "sheetjs:build:production"
- }
- }
- },
- "extract-i18n": {
- "builder": "@angular-devkit/build-angular:extract-i18n",
- "options": {
- "browserTarget": "sheetjs:build"
- }
- },
- "test": {
- "builder": "@angular-devkit/build-angular:karma",
- "options": {
- "main": "src/test.ts",
- "polyfills": "src/polyfills.ts",
- "tsConfig": "tsconfig.spec.json",
- "karmaConfig": "karma.conf.js",
- "assets": [
- "src/favicon.ico",
- "src/assets"
- ],
- "styles": [
- "src/styles.css"
- ],
- "scripts": []
- }
- },
- "lint": {
- "builder": "@angular-devkit/build-angular:tslint",
- "options": {
- "tsConfig": [
- "tsconfig.app.json",
- "tsconfig.spec.json",
- "e2e/tsconfig.json"
- ],
- "exclude": [
- "**/node_modules/**"
- ]
- }
- },
- "e2e": {
- "builder": "@angular-devkit/build-angular:protractor",
- "options": {
- "protractorConfig": "e2e/protractor.conf.js",
- "devServerTarget": "sheetjs:serve"
- },
- "configurations": {
- "production": {
- "devServerTarget": "sheetjs:serve:production"
- }
- }
- }
- }
- }
- },
- "defaultProject": "sheetjs"
-}
diff --git a/demos/angular2/versions/package.json-ng10 b/demos/angular2/versions/package.json-ng10
deleted file mode 100644
index fff68df..0000000
--- a/demos/angular2/versions/package.json-ng10
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "name": "angular10",
- "version": "0.0.0",
- "license": "MIT",
- "scripts": {
- "ng": "ng",
- "start": "ng serve",
- "build": "ng build"
- },
- "private": true,
- "dependencies": {
- "@angular/animations": "~10.2.4",
- "@angular/common": "~10.2.4",
- "@angular/compiler": "~10.2.4",
-
- "@angular/core": "~10.2.4",
- "@angular/forms": "~10.2.4",
-
- "@angular/platform-browser": "~10.2.4",
- "@angular/platform-browser-dynamic": "~10.2.4",
-
- "@angular/router": "~10.2.4",
-
-
- "rxjs": "~6.6.0",
- "tslib": "^2.0.0",
- "zone.js": "~0.10.2"
- },
- "devDependencies": {
- "@angular-devkit/build-angular": "~0.1002.3",
- "@angular/cli": "~10.2.3",
- "@angular/compiler-cli": "~10.2.4",
-
- "@types/node": "^12.11.1",
- "ts-node": "~8.3.0",
- "tslint": "~6.1.0",
- "typescript": "~4.0.2"
- }
-}
diff --git a/demos/angular2/versions/package.json-ng11 b/demos/angular2/versions/package.json-ng11
deleted file mode 100644
index 9bb80a8..0000000
--- a/demos/angular2/versions/package.json-ng11
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "name": "angular11",
- "version": "0.0.0",
- "license": "MIT",
- "scripts": {
- "ng": "ng",
- "start": "ng serve",
- "build": "ng build"
- },
- "private": true,
- "dependencies": {
- "@angular/animations": "~11.2.14",
- "@angular/common": "~11.2.14",
- "@angular/compiler": "~11.2.14",
-
- "@angular/core": "~11.2.14",
- "@angular/forms": "~11.2.14",
-
- "@angular/platform-browser": "~11.2.14",
- "@angular/platform-browser-dynamic": "~11.2.14",
-
- "@angular/router": "~11.2.14",
-
-
- "rxjs": "~6.6.0",
- "tslib": "^2.0.0",
- "zone.js": "~0.11.3"
- },
- "devDependencies": {
- "@angular-devkit/build-angular": "~0.1102.13",
- "@angular/cli": "~11.2.14",
- "@angular/compiler-cli": "~11.2.14",
-
- "@types/node": "^12.11.1",
- "ts-node": "~8.3.0",
- "tslint": "~6.1.0",
- "typescript": "~4.1.5"
- }
-}
diff --git a/demos/angular2/versions/package.json-ng12 b/demos/angular2/versions/package.json-ng12
deleted file mode 100644
index 74df6c5..0000000
--- a/demos/angular2/versions/package.json-ng12
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "name": "angular12",
- "version": "0.0.0",
- "license": "MIT",
- "scripts": {
- "ng": "ng",
- "start": "ng serve",
- "build": "ng build"
- },
- "private": true,
- "dependencies": {
- "@angular/animations": "~12.2.0",
- "@angular/common": "~12.2.0",
- "@angular/compiler": "~12.2.0",
-
- "@angular/core": "~12.2.0",
- "@angular/forms": "~12.2.0",
-
- "@angular/platform-browser": "~12.2.0",
- "@angular/platform-browser-dynamic": "~12.2.0",
-
- "@angular/router": "~12.2.0",
-
-
- "rxjs": "~6.6.0",
- "tslib": "^2.3.0",
- "zone.js": "~0.11.4"
- },
- "devDependencies": {
- "@angular-devkit/build-angular": "~12.2.7",
- "@angular/cli": "~12.2.7",
- "@angular/compiler-cli": "~12.2.0",
-
- "@types/node": "^12.11.1",
-
-
- "typescript": "~4.3.5"
- }
-}
diff --git a/demos/angular2/versions/package.json-ng13 b/demos/angular2/versions/package.json-ng13
deleted file mode 100644
index a214cef..0000000
--- a/demos/angular2/versions/package.json-ng13
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "name": "angular13",
- "version": "0.0.0",
- "license": "MIT",
- "scripts": {
- "ng": "ng",
- "start": "ng serve",
- "build": "ng build"
- },
- "private": true,
- "dependencies": {
- "@angular/animations": "~13.2.0",
- "@angular/common": "~13.2.0",
- "@angular/compiler": "~13.2.0",
-
- "@angular/core": "~13.2.0",
- "@angular/forms": "~13.2.0",
-
- "@angular/platform-browser": "~13.2.0",
- "@angular/platform-browser-dynamic": "~13.2.0",
-
- "@angular/router": "~13.2.0",
-
-
- "rxjs": "~7.5.0",
- "tslib": "^2.3.0",
- "zone.js": "~0.11.4"
- },
- "devDependencies": {
- "@angular-devkit/build-angular": "~13.2.1",
- "@angular/cli": "~13.2.1",
- "@angular/compiler-cli": "~13.2.0",
-
- "@types/node": "^12.11.1",
-
-
- "typescript": "~4.5.2"
- }
-}
diff --git a/demos/angular2/versions/package.json-ng2 b/demos/angular2/versions/package.json-ng2
deleted file mode 100644
index c6cdfe9..0000000
--- a/demos/angular2/versions/package.json-ng2
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- "name": "angular2",
- "version": "0.0.0",
- "license": "MIT",
- "scripts": {
- "ng": "ng",
- "start": "ng serve",
- "build": "ng build"
- },
- "private": true,
- "dependencies": {
- "@angular/common": "~2.4.1",
- "@angular/compiler": "~2.4.1",
- "@angular/compiler-cli": "^2.4.1",
- "@angular/core": "~2.4.1",
- "@angular/forms": "~2.4.1",
- "@angular/http": "~2.4.1",
- "@angular/platform-browser": "~2.4.1",
- "@angular/platform-browser-dynamic": "~2.4.1",
- "@angular/platform-server": "^2.4.1",
- "@angular/router": "~3.4.0",
- "core-js": "^2.4.1",
- "reflect-metadata": "^0.1.8",
- "rxjs": "^5.0.2",
- "systemjs": "0.19.40",
- "zone.js": "^0.7.4"
- },
- "devDependencies": {
- "@angular/cli": "1.1.2",
- "@angular/compiler-cli": "^2.0.0",
- "@angular/language-service": "^2.0.0",
- "@types/node": "~6.0.60",
- "ts-node": "~3.0.4",
- "tslint": "~5.3.2",
- "typescript": "~2.3.3"
- }
-}
diff --git a/demos/angular2/versions/package.json-ng4 b/demos/angular2/versions/package.json-ng4
deleted file mode 100644
index 2891383..0000000
--- a/demos/angular2/versions/package.json-ng4
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "name": "angular4",
- "version": "0.0.0",
- "license": "MIT",
- "scripts": {
- "ng": "ng",
- "start": "ng serve",
- "build": "ng build"
- },
- "private": true,
- "dependencies": {
- "@angular/animations": "^4.0.0",
- "@angular/common": "^4.0.0",
- "@angular/compiler": "^4.0.0",
-
- "@angular/core": "^4.0.0",
- "@angular/forms": "^4.0.0",
- "@angular/http": "^4.0.0",
- "@angular/platform-browser": "^4.0.0",
- "@angular/platform-browser-dynamic": "^4.0.0",
-
- "@angular/router": "^4.0.0",
- "core-js": "^2.4.1",
-
- "rxjs": "^5.1.0",
-
- "zone.js": "^0.8.4"
- },
- "devDependencies": {
- "@angular/cli": "1.1.2",
- "@angular/compiler-cli": "^4.0.0",
- "@angular/language-service": "^4.0.0",
- "@types/node": "~6.0.60",
- "ts-node": "~3.0.4",
- "tslint": "~5.3.2",
- "typescript": "~2.3.3"
- }
-}
diff --git a/demos/angular2/versions/package.json-ng5 b/demos/angular2/versions/package.json-ng5
deleted file mode 100644
index 1f62707..0000000
--- a/demos/angular2/versions/package.json-ng5
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "name": "angular5",
- "version": "0.0.0",
- "license": "MIT",
- "scripts": {
- "ng": "ng",
- "start": "ng serve",
- "build": "ng build"
- },
- "private": true,
- "dependencies": {
- "@angular/animations": "^5.0.0",
- "@angular/common": "^5.0.0",
- "@angular/compiler": "^5.0.0",
-
- "@angular/core": "^5.0.0",
- "@angular/forms": "^5.0.0",
- "@angular/http": "^5.0.0",
- "@angular/platform-browser": "^5.0.0",
- "@angular/platform-browser-dynamic": "^5.0.0",
-
- "@angular/router": "^5.0.0",
- "core-js": "^2.4.1",
-
- "rxjs": "^5.5.2",
-
- "zone.js": "^0.8.14"
- },
- "devDependencies": {
- "@angular/cli": "^1.5.3",
- "@angular/compiler-cli": "^5.0.0",
- "@angular/language-service": "^5.0.0",
- "@types/node": "~6.0.60",
- "ts-node": "~3.2.0",
- "tslint": "~5.7.0",
- "typescript": "~2.4.2"
- }
-}
diff --git a/demos/angular2/versions/package.json-ng6 b/demos/angular2/versions/package.json-ng6
deleted file mode 100644
index a6df172..0000000
--- a/demos/angular2/versions/package.json-ng6
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "name": "angular6",
- "version": "0.0.0",
- "license": "MIT",
- "scripts": {
- "ng": "ng",
- "start": "ng serve",
- "build": "ng build"
- },
- "private": true,
- "dependencies": {
- "@angular/animations": "^6.1.0",
- "@angular/common": "^6.1.0",
- "@angular/compiler": "^6.1.0",
-
- "@angular/core": "^6.1.0",
- "@angular/forms": "^6.1.0",
- "@angular/http": "^6.1.0",
- "@angular/platform-browser": "^6.1.0",
- "@angular/platform-browser-dynamic": "^6.1.0",
-
- "@angular/router": "^6.1.0",
- "core-js": "^2.5.4",
-
- "rxjs": "~6.2.0",
-
- "zone.js": "~0.8.26"
- },
- "devDependencies": {
- "@angular-devkit/build-angular": "~0.8.0",
- "@angular/cli": "~6.2.9",
- "@angular/compiler-cli": "^6.1.0",
- "@angular/language-service": "^6.1.0",
- "@types/node": "~8.9.4",
- "ts-node": "~7.0.0",
- "tslint": "~5.11.0",
- "typescript": "~2.9.2"
- }
-}
diff --git a/demos/angular2/versions/package.json-ng7 b/demos/angular2/versions/package.json-ng7
deleted file mode 100644
index 841dab7..0000000
--- a/demos/angular2/versions/package.json-ng7
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "name": "angular7",
- "version": "0.0.0",
- "license": "MIT",
- "scripts": {
- "ng": "ng",
- "start": "ng serve",
- "build": "ng build"
- },
- "private": true,
- "dependencies": {
- "@angular/animations": "~7.2.0",
- "@angular/common": "~7.2.0",
- "@angular/compiler": "~7.2.0",
-
- "@angular/core": "~7.2.0",
- "@angular/forms": "~7.2.0",
-
- "@angular/platform-browser": "~7.2.0",
- "@angular/platform-browser-dynamic": "~7.2.0",
-
- "@angular/router": "~7.2.0",
- "core-js": "^2.5.4",
-
- "rxjs": "~6.3.3",
- "tslib": "^1.9.0",
- "zone.js": "~0.8.26"
- },
- "devDependencies": {
- "@angular-devkit/build-angular": "~0.13.0",
- "@angular/cli": "~7.3.10",
- "@angular/compiler-cli": "~7.2.0",
- "@angular/language-service": "~7.2.0",
- "@types/node": "~8.9.4",
- "ts-node": "~7.0.0",
- "tslint": "~5.11.0",
- "typescript": "~3.2.2"
- }
-}
diff --git a/demos/angular2/versions/package.json-ng8 b/demos/angular2/versions/package.json-ng8
deleted file mode 100644
index 5643841..0000000
--- a/demos/angular2/versions/package.json-ng8
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "name": "angular8",
- "version": "0.0.0",
- "license": "MIT",
- "scripts": {
- "ng": "ng",
- "start": "ng serve",
- "build": "ng build"
- },
- "private": true,
- "dependencies": {
- "@angular/animations": "~8.2.14",
- "@angular/common": "~8.2.14",
- "@angular/compiler": "~8.2.14",
-
- "@angular/core": "~8.2.14",
- "@angular/forms": "~8.2.14",
-
- "@angular/platform-browser": "~8.2.14",
- "@angular/platform-browser-dynamic": "~8.2.14",
-
- "@angular/router": "~8.2.14",
-
-
- "rxjs": "~6.4.0",
- "tslib": "^1.10.0",
- "zone.js": "~0.9.1"
- },
- "devDependencies": {
- "@angular-devkit/build-angular": "~0.803.29",
- "@angular/cli": "~8.3.29",
- "@angular/compiler-cli": "~8.2.14",
- "@angular/language-service": "~8.2.14",
- "@types/node": "~8.9.4",
- "ts-node": "~7.0.0",
- "tslint": "~5.15.0",
- "typescript": "~3.5.3"
- }
-}
diff --git a/demos/angular2/versions/package.json-ng9 b/demos/angular2/versions/package.json-ng9
deleted file mode 100644
index fe6c382..0000000
--- a/demos/angular2/versions/package.json-ng9
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "name": "angular9",
- "version": "0.0.0",
- "license": "MIT",
- "scripts": {
- "ng": "ng",
- "start": "ng serve",
- "build": "ng build"
- },
- "private": true,
- "dependencies": {
- "@angular/animations": "~9.1.13",
- "@angular/common": "~9.1.13",
- "@angular/compiler": "~9.1.13",
-
- "@angular/core": "~9.1.13",
- "@angular/forms": "~9.1.13",
-
- "@angular/platform-browser": "~9.1.13",
- "@angular/platform-browser-dynamic": "~9.1.13",
-
- "@angular/router": "~9.1.13",
-
-
- "rxjs": "~6.5.4",
- "tslib": "^1.10.0",
- "zone.js": "~0.10.2"
- },
- "devDependencies": {
- "@angular-devkit/build-angular": "~0.901.15",
- "@angular/cli": "~9.1.15",
- "@angular/compiler-cli": "~9.1.13",
-
- "@types/node": "^12.11.1",
- "ts-node": "~8.3.0",
- "tslint": "~6.1.0",
- "typescript": "~3.8.3"
- }
-}
diff --git a/demos/angular2/versions/polyfills.ts-ng10 b/demos/angular2/versions/polyfills.ts-ng10
deleted file mode 100644
index 741c886..0000000
--- a/demos/angular2/versions/polyfills.ts-ng10
+++ /dev/null
@@ -1 +0,0 @@
-import 'zone.js/dist/zone';
diff --git a/demos/angular2/versions/polyfills.ts-ng11 b/demos/angular2/versions/polyfills.ts-ng11
deleted file mode 100644
index 741c886..0000000
--- a/demos/angular2/versions/polyfills.ts-ng11
+++ /dev/null
@@ -1 +0,0 @@
-import 'zone.js/dist/zone';
diff --git a/demos/angular2/versions/polyfills.ts-ng12 b/demos/angular2/versions/polyfills.ts-ng12
deleted file mode 100644
index aa09a9f..0000000
--- a/demos/angular2/versions/polyfills.ts-ng12
+++ /dev/null
@@ -1 +0,0 @@
-import 'zone.js';
diff --git a/demos/angular2/versions/polyfills.ts-ng13 b/demos/angular2/versions/polyfills.ts-ng13
deleted file mode 100644
index aa09a9f..0000000
--- a/demos/angular2/versions/polyfills.ts-ng13
+++ /dev/null
@@ -1 +0,0 @@
-import 'zone.js';
diff --git a/demos/angular2/versions/polyfills.ts-ng2 b/demos/angular2/versions/polyfills.ts-ng2
deleted file mode 100644
index 2143ebf..0000000
--- a/demos/angular2/versions/polyfills.ts-ng2
+++ /dev/null
@@ -1,3 +0,0 @@
-import 'core-js/es6/reflect';
-import 'core-js/es7/reflect';
-import 'zone.js/dist/zone';
diff --git a/demos/angular2/versions/polyfills.ts-ng4 b/demos/angular2/versions/polyfills.ts-ng4
deleted file mode 100644
index 2143ebf..0000000
--- a/demos/angular2/versions/polyfills.ts-ng4
+++ /dev/null
@@ -1,3 +0,0 @@
-import 'core-js/es6/reflect';
-import 'core-js/es7/reflect';
-import 'zone.js/dist/zone';
diff --git a/demos/angular2/versions/polyfills.ts-ng5 b/demos/angular2/versions/polyfills.ts-ng5
deleted file mode 100644
index 2143ebf..0000000
--- a/demos/angular2/versions/polyfills.ts-ng5
+++ /dev/null
@@ -1,3 +0,0 @@
-import 'core-js/es6/reflect';
-import 'core-js/es7/reflect';
-import 'zone.js/dist/zone';
diff --git a/demos/angular2/versions/polyfills.ts-ng6 b/demos/angular2/versions/polyfills.ts-ng6
deleted file mode 100644
index 2143ebf..0000000
--- a/demos/angular2/versions/polyfills.ts-ng6
+++ /dev/null
@@ -1,3 +0,0 @@
-import 'core-js/es6/reflect';
-import 'core-js/es7/reflect';
-import 'zone.js/dist/zone';
diff --git a/demos/angular2/versions/polyfills.ts-ng7 b/demos/angular2/versions/polyfills.ts-ng7
deleted file mode 100644
index 2143ebf..0000000
--- a/demos/angular2/versions/polyfills.ts-ng7
+++ /dev/null
@@ -1,3 +0,0 @@
-import 'core-js/es6/reflect';
-import 'core-js/es7/reflect';
-import 'zone.js/dist/zone';
diff --git a/demos/angular2/versions/polyfills.ts-ng8 b/demos/angular2/versions/polyfills.ts-ng8
deleted file mode 100644
index 741c886..0000000
--- a/demos/angular2/versions/polyfills.ts-ng8
+++ /dev/null
@@ -1 +0,0 @@
-import 'zone.js/dist/zone';
diff --git a/demos/angular2/versions/polyfills.ts-ng9 b/demos/angular2/versions/polyfills.ts-ng9
deleted file mode 100644
index 741c886..0000000
--- a/demos/angular2/versions/polyfills.ts-ng9
+++ /dev/null
@@ -1 +0,0 @@
-import 'zone.js/dist/zone';
diff --git a/demos/angular2/versions/tsconfig.app.json-ng10 b/demos/angular2/versions/tsconfig.app.json-ng10
deleted file mode 100644
index f758d98..0000000
--- a/demos/angular2/versions/tsconfig.app.json-ng10
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "extends": "./tsconfig.json",
- "compilerOptions": {
- "outDir": "./out-tsc/app",
- "types": []
- },
- "files": [
- "src/main.ts",
- "src/polyfills.ts"
- ],
- "include": [
- "src/**/*.d.ts"
- ]
-}
diff --git a/demos/angular2/versions/tsconfig.app.json-ng11 b/demos/angular2/versions/tsconfig.app.json-ng11
deleted file mode 100644
index f758d98..0000000
--- a/demos/angular2/versions/tsconfig.app.json-ng11
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "extends": "./tsconfig.json",
- "compilerOptions": {
- "outDir": "./out-tsc/app",
- "types": []
- },
- "files": [
- "src/main.ts",
- "src/polyfills.ts"
- ],
- "include": [
- "src/**/*.d.ts"
- ]
-}
diff --git a/demos/angular2/versions/tsconfig.app.json-ng12 b/demos/angular2/versions/tsconfig.app.json-ng12
deleted file mode 100644
index f758d98..0000000
--- a/demos/angular2/versions/tsconfig.app.json-ng12
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "extends": "./tsconfig.json",
- "compilerOptions": {
- "outDir": "./out-tsc/app",
- "types": []
- },
- "files": [
- "src/main.ts",
- "src/polyfills.ts"
- ],
- "include": [
- "src/**/*.d.ts"
- ]
-}
diff --git a/demos/angular2/versions/tsconfig.app.json-ng13 b/demos/angular2/versions/tsconfig.app.json-ng13
deleted file mode 100644
index f758d98..0000000
--- a/demos/angular2/versions/tsconfig.app.json-ng13
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "extends": "./tsconfig.json",
- "compilerOptions": {
- "outDir": "./out-tsc/app",
- "types": []
- },
- "files": [
- "src/main.ts",
- "src/polyfills.ts"
- ],
- "include": [
- "src/**/*.d.ts"
- ]
-}
diff --git a/demos/angular2/versions/tsconfig.app.json-ng8 b/demos/angular2/versions/tsconfig.app.json-ng8
deleted file mode 100644
index 565a11a..0000000
--- a/demos/angular2/versions/tsconfig.app.json-ng8
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "extends": "./tsconfig.json",
- "compilerOptions": {
- "outDir": "./out-tsc/app",
- "types": []
- },
- "files": [
- "src/main.ts",
- "src/polyfills.ts"
- ],
- "include": [
- "src/**/*.ts"
- ],
- "exclude": [
- "src/test.ts",
- "src/**/*.spec.ts"
- ]
-}
diff --git a/demos/angular2/versions/tsconfig.app.json-ng9 b/demos/angular2/versions/tsconfig.app.json-ng9
deleted file mode 100644
index f758d98..0000000
--- a/demos/angular2/versions/tsconfig.app.json-ng9
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "extends": "./tsconfig.json",
- "compilerOptions": {
- "outDir": "./out-tsc/app",
- "types": []
- },
- "files": [
- "src/main.ts",
- "src/polyfills.ts"
- ],
- "include": [
- "src/**/*.d.ts"
- ]
-}
diff --git a/demos/function/.eslintrc b/demos/function/.eslintrc
deleted file mode 100644
index dbf6551..0000000
--- a/demos/function/.eslintrc
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "env": { "shared-node-browser":true },
- "parserOptions": {
- "ecmaVersion": 8
- },
- "plugins": [ "html", "json" ]
-}
diff --git a/demos/function/AzureHTTPTrigger/function.json b/demos/function/AzureHTTPTrigger/function.json
deleted file mode 100644
index 7c64ea6..0000000
--- a/demos/function/AzureHTTPTrigger/function.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "disabled": false,
- "bindings": [
- {
- "authLevel": "function",
- "type": "httpTrigger",
- "direction": "in",
- "dataType": "binary",
- "name": "req"
- },
- {
- "type": "http",
- "direction": "out",
- "name": "res"
- }
- ]
-}
diff --git a/demos/function/AzureHTTPTrigger/index.js b/demos/function/AzureHTTPTrigger/index.js
deleted file mode 100644
index c39d77c..0000000
--- a/demos/function/AzureHTTPTrigger/index.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
-/* eslint-env node */
-// base64 sheetjs.xlsb | curl -F "data=@-;filename=test.xlsb" http://localhost:7262/api/AzureHTTPTrigger
-
-const XLSX = require('xlsx');
-const formidable = require('formidable');
-const Readable = require('stream').Readable;
-var fs = require('fs');
-
-/* formidable expects the request object to be a stream */
-const streamify = (req) => {
- if(typeof req.on !== 'undefined') return req;
- const s = new Readable();
- s._read = ()=>{};
- s.push(new Buffer(req.body));
- s.push(null);
- Object.assign(s, req);
- return s;
-};
-
-module.exports = (context, req) => {
- const form = new formidable.IncomingForm();
- form.parse(streamify(req), (err, fields, files) => {
- /* grab the first file */
- var f = Object.values(files)[0];
- if(!f) {
- context.res = { status: 400, body: "Must submit a file for processing!" };
- } else {
- /* file is stored in a temp directory, so we can point to that and read it */
- const wb = XLSX.read(f.path, {type:"file"});
-
- /* convert to specified output type -- default CSV */
- const ext = (fields.bookType || "csv").toLowerCase();
- const out = XLSX.write(wb, {type:"string", bookType:ext});
-
- context.res = {
- status: 200,
- headers: { "Content-Disposition": `attachment; filename="download.${ext}";` },
- body: out
- };
- }
- context.done();
- });
-};
diff --git a/demos/function/Firebase/.gitignore b/demos/function/Firebase/.gitignore
deleted file mode 100644
index f9ed3da..0000000
--- a/demos/function/Firebase/.gitignore
+++ /dev/null
@@ -1,65 +0,0 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-firebase-debug.log*
-
-# Firebase cache
-.firebase/
-
-# Firebase config
-
-# Uncomment this if you'd like others to create their own Firebase project.
-# For a team working on the same Firebase project(s), it is recommended to leave
-# it commented so all members can deploy to the same project(s) in .firebaserc.
-.firebaserc
-
-# Runtime data
-pids
-*.pid
-*.seed
-*.pid.lock
-
-# Directory for instrumented libs generated by jscoverage/JSCover
-lib-cov
-
-# Coverage directory used by tools like istanbul
-coverage
-
-# nyc test coverage
-.nyc_output
-
-# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
-.grunt
-
-# Bower dependency directory (https://bower.io/)
-bower_components
-
-# node-waf configuration
-.lock-wscript
-
-# Compiled binary addons (http://nodejs.org/api/addons.html)
-build/Release
-
-# Dependency directories
-node_modules/
-
-# Optional npm cache directory
-.npm
-
-# Optional eslint cache
-.eslintcache
-
-# Optional REPL history
-.node_repl_history
-
-# Output of 'npm pack'
-*.tgz
-
-# Yarn Integrity file
-.yarn-integrity
-
-# dotenv environment variables file
-.env
diff --git a/demos/function/Firebase/firebase.json b/demos/function/Firebase/firebase.json
deleted file mode 100644
index 0967ef4..0000000
--- a/demos/function/Firebase/firebase.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/demos/function/Firebase/functions/.gitignore b/demos/function/Firebase/functions/.gitignore
deleted file mode 100644
index 40b878d..0000000
--- a/demos/function/Firebase/functions/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
\ No newline at end of file
diff --git a/demos/function/Firebase/functions/index.js b/demos/function/Firebase/functions/index.js
deleted file mode 100644
index d14b499..0000000
--- a/demos/function/Firebase/functions/index.js
+++ /dev/null
@@ -1,39 +0,0 @@
-const functions = require('firebase-functions');
-const Busboy = require('busboy');
-const XLSX = require('xlsx');
-
-// // Create and Deploy Your First Cloud Functions
-// // https://firebase.google.com/docs/functions/write-firebase-functions
-//
-exports.helloWorld = functions.https.onRequest((request, response) => {
- response.send("Hello from Firebase!");
-});
-
-exports.main = functions.https.onRequest((req, res) => {
- var bb = new Busboy({
- headers: {
- 'content-type': req.headers['content-type']
- }
- });
- let fields = {};
- let files = {};
- bb.on('field', (fieldname, val) => {
- fields[fieldname] = val;
- });
- bb.on('file', (fieldname, file, filename) => {
- var buffers = [];
- file.on('data', (data) => {
- buffers.push(data);
- });
- file.on('end', () => {
- files[fieldname] = [Buffer.concat(buffers), filename];
- });
- });
- bb.on('finish', () => {
- let f = files[Object.keys(files)[0]];
- const wb = XLSX.read(f[0], { type: "buffer" });
- // Convert to CSV
- res.send(XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]]));
- });
- bb.end(req.body)
-});
diff --git a/demos/function/Firebase/functions/package.json b/demos/function/Firebase/functions/package.json
deleted file mode 100644
index 53238b4..0000000
--- a/demos/function/Firebase/functions/package.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "name": "functions",
- "description": "Cloud Functions for Firebase",
- "scripts": {
- "serve": "firebase emulators:start --only functions",
- "shell": "firebase functions:shell",
- "start": "npm run shell",
- "deploy": "firebase deploy --only functions",
- "logs": "firebase functions:log"
- },
- "engines": {
- "node": "8"
- },
- "dependencies": {
- "busboy": "^0.3.1",
- "firebase-admin": "^8.6.0",
- "firebase-functions": "^3.3.0",
- "xlsx": "^0.16.2"
- },
- "devDependencies": {
- "firebase-functions-test": "^0.1.6"
- },
- "private": true
-}
diff --git a/demos/function/LambdaProxy/index.js b/demos/function/LambdaProxy/index.js
deleted file mode 100644
index 5d82404..0000000
--- a/demos/function/LambdaProxy/index.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
-/* eslint-env node */
-// base64 sheetjs.xlsb | curl -F "data=@-;filename=test.xlsb" http://localhost:3000/LambdaProxy
-
-'use strict';
-var XLSX = require('xlsx');
-var Busboy = require('busboy');
-
-exports.handler = function(event, context, callback) {
- /* set up busboy */
- var ctype = event.headers['Content-Type']||event.headers['content-type'];
- var bb = new Busboy({headers:{'content-type':ctype}});
-
- /* busboy is evented; accumulate the fields and files manually */
- var fields = {}, files = {};
- bb.on('error', function(err) { console.log('err', err); callback(err); });
- bb.on('field', function(fieldname, val) {fields[fieldname] = val });
- bb.on('file', function(fieldname, file, filename) {
- /* concatenate the individual data buffers */
- var buffers = [];
- file.on('data', function(data) { buffers.push(data); });
- file.on('end', function() { files[fieldname] = [Buffer.concat(buffers), filename]; });
- });
-
- /* on the finish event, all of the fields and files are ready */
- bb.on('finish', function() {
- /* grab the first file */
- var f = files[Object.keys(files)[0]];
- if(!f) callback(new Error("Must submit a file for processing!"));
-
- /* f[0] is a buffer, convert to string and interpret as Base64 */
- var wb = XLSX.read(f[0].toString(), {type:"base64"});
-
- /* grab first worksheet and convert to CSV */
- var ws = wb.Sheets[wb.SheetNames[0]];
- callback(null, { body: XLSX.utils.sheet_to_csv(ws) });
- });
-
- bb.end(event.body);
-};
diff --git a/demos/function/LambdaProxy/template.yaml b/demos/function/LambdaProxy/template.yaml
deleted file mode 100644
index 43ef45a..0000000
--- a/demos/function/LambdaProxy/template.yaml
+++ /dev/null
@@ -1,18 +0,0 @@
-AWSTemplateFormatVersion : '2010-09-09'
-Transform: AWS::Serverless-2016-10-31
-
-Description: Sample Lambda API Gateway Normalizer
-Resources:
- LambdaProxy:
- Type: AWS::Serverless::Function
- Properties:
- Runtime: nodejs6.10
- Handler: index.handler
- BinaryMediaTypes: '*/*'
- Events:
- Api:
- Type: Api
- Properties:
- Path: /LambdaProxy
- Method: any
- BinaryMediaTypes: '*/*'
diff --git a/demos/function/Makefile b/demos/function/Makefile
deleted file mode 100644
index 1588319..0000000
--- a/demos/function/Makefile
+++ /dev/null
@@ -1,28 +0,0 @@
-.PHONY: aws
-aws: lambda-proxy
-
-.PHONY: lambda-proxy
-lambda-proxy:
- cd LambdaProxy; mkdir -p node_modules; npm install https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz busboy; sam local start-api; cd -
-
-.PHONY: init-azure
-init-azure:
- cd AzureHTTPTrigger; mkdir -p node_modules; npm install https://cdn.sheetjs.com/xlsx-latest/xlsx-latest.tgz formidable fs
-
-.PHONY: azure
-azure: init-azure
- func start
-
-.PHONY: azure-server
-azure-server:
- mkdir -p /tmp/azurite
- azurite -l /tmp/azurite
-
-FILES=$(filter-out xlsx.full.min.js,$(wildcard *.js)) $(wildcard *.html)
-.PHONY: lint
-lint: $(FILES)
- eslint $(FILES)
-
-.PHONY: clean
-clean:
- rm -f *.db *.xlsx *.csv
diff --git a/demos/function/README.md b/demos/function/README.md
index c5cd76a..238afbc 100644
--- a/demos/function/README.md
+++ b/demos/function/README.md
@@ -1,113 +1,9 @@
# "Serverless" Functions
-Because the library is pure JS, the hard work of reading and writing files can
-be performed in the client browser or on the server side. On the server side,
-the mechanical process is essentially independent from the data parsing or
-generation. As a result, it is sometimes sensible to organize applications so
-that the "last mile" conversion between JSON data and spreadsheet files is
-independent from the main application.
+Cloud services are covered in separate demos:
-The straightforward architecture would split off the JSON data conversion as a
-separate microservice or application. Since it is only needed when an import or
-export is requested, and since the process itself is relatively independent from
-the rest of a typical service, a "Serverless" architecture makes a great fit.
-Since the "function" is separate from the rest of the application, it can be
-integrated into a platform built in Java or Go or Python or another language!
+- [AWS](https://docs.sheetjs.com/docs/demos/aws)
+- [Azure](https://docs.sheetjs.com/docs/demos/azure)
-This demo discusses general architectures and provides examples for popular
-commercial systems and self-hosted alternatives. The examples are merely
-intended to demonstrate very basic functionality.
+[![Analytics](https://ga-beacon.appspot.com/UA-36810333-1/SheetJS/js-xlsx?pixel)](https://github.com/SheetJS/js-xlsx)
-
-## Simple Strategies
-
-#### Data Normalization
-
-Most programming languages and platforms can process CSV or JSON but can't use
-XLS or XLSX or XLSB directly. Form data from an HTTP POST request can be parsed
-and contained files can be converted to CSV or JSON. The `XLSX.stream.to_csv`
-utility can stream rows to a standard HTTP response. `XLSX.utils.sheet_to_json`
-can generate an array of objects that can be fed to another service.
-
-At the simplest level, a file on the filesystem can be converted using the bin
-script that ships with the NodeJS package:
-
-```bash
-$ xlsx /path/to/uploads/file > /tmp/new_csv_file
-```
-
-From a utility script, workbooks can be converted in two lines:
-
-```js
-var workbook = XLSX.readFile("path/to/file.xlsb");
-XLSX.writeFile(workbook, "output/path/file.csv");
-```
-
-#### Report Generation
-
-For an existing platform that already generates JSON or CSV or HTML output, the
-library can process the data and generate a new file with embellishments. The
-`XLSX.utils.sheet_add_json` and `XLSX.utils.sheet_add_aoa` functions can add
-data rows to an existing worksheet:
-
-```js
-var ws = XLSX.utils.aoa_to_sheet([
- ["Company Report"],
- [],
- ["Item", "Cost"]
-]);
-XLSX.utils.sheet_add_json(ws, [
- { item: "Coffee", cost: 5 },
- { item: "Cake", cost: 20 }
-], { skipHeader: true, origin: -1, header: ["item", "cost"] });
-```
-
-
-## Deployment Targets
-
-The library is supported in Node versions starting from `0.8` as well as a
-myriad of ES3 and ES5 compatible JS engines. All major services use Node
-versions beyond major release 4, so there should be no problem directly using
-the library in those environments.
-
-Note that most cloud providers proactively convert form data to UTF8 strings.
-This is especially problematic when dealing with XLSX and XLSB files, as they
-naturally contain codes that are not valid UTF8 characters. As a result, these
-demos specifically handle Base64-encoded files only. To test on the command
-line, use the `base64` tool to encode data before piping to `curl`:
-
-```
-base64 test.xlsb | curl -F "data=@-;filename=test.xlsb" http://localhost/
-```
-
-#### AWS Lambda
-
-Through the AWS Gateway API, Lambda functions can be triggered on HTTP requests.
-The `LambdaProxy` example reads files from form data and converts to CSV.
-
-When deploying on AWS, be sure to `npm install` locally and include the modules
-in the ZIP file.
-
-When reading form data, be sure to include the necessary binary types on the AWS API Gateway console.
-To do this, navigate to the "Binary Media Types" section in the settings tab of the console.
-For reading a file, you may need to add `"multipart/form-data"`.
-For downloading a file, you may need to add `"application/vnd.ms-excel"`.
-
-#### Azure Functions
-
-Azure supports many types of triggers. The `AzureHTTPTrigger` shows an example
-HTTP trigger that converts the submitted file to CSV.
-
-When deploying on Azure, be sure to install the module from the remote console,
-as described in the "Azure Functions JavaScript developer guide".
-
-#### Firebase Functions
-
-Firebase functions can be triggered via HTTP requests, similar to a REST API.
-In the `Firebase` directory, the example function reads files sent through
-HTTP and converts it to a CSV and sends the response in the form of a string.
-
-To run this demo locally, run `npm i -g firebase-tools` to install the
-Firebase CLI and `npm i` to install the dependencies, then `firebase use --add`
-to connect to an existing Firebase project. Run `firebase emulators:start` to
-start the local server.
diff --git a/demos/function/host.json b/demos/function/host.json
deleted file mode 100644
index 81e35b7..0000000
--- a/demos/function/host.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "version": "2.0"
-}
\ No newline at end of file
diff --git a/demos/function/local.settings.json b/demos/function/local.settings.json
deleted file mode 100644
index 755966e..0000000
--- a/demos/function/local.settings.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "IsEncrypted": false,
- "Values": {
- "AzureWebJobsStorage": "UseDevelopmentStorage=true",
- "AzureWebJobsDashboard": "UseDevelopmentStorage=true"
- },
- "Host": {
- "LocalHttpPort": 7262,
- "CORS": "*"
- }
-}
diff --git a/demos/react/.gitignore b/demos/react/.gitignore
deleted file mode 100644
index 228ee28..0000000
--- a/demos/react/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-SheetJS
-.next
-static/shim.js
-public/shim.js
diff --git a/demos/react/Makefile b/demos/react/Makefile
deleted file mode 100644
index da556c3..0000000
--- a/demos/react/Makefile
+++ /dev/null
@@ -1,24 +0,0 @@
-.PHONY: react
-react: init ## Simple server for react and clones
- python -mSimpleHTTPServer
-
-.PHONY: next
-next: init ## next.js demo
- next
-
-.PHONY: native
-native: ## Build react-native project
- bash ./native.sh
-
-.PHONY: ios
-ios: native ## react-native ios sim
- cd SheetJS; cd ios; pod install; cd -; react-native run-ios --simulator="iPhone X"; cd -
-
-.PHONY: android
-android: native ## react-native android sim
- cd SheetJS; react-native run-android; cd -
-
-.PHONY: init
-init: ## set up node_modules and symlink
- mkdir -p node_modules
- cd node_modules; if [ ! -e xlsx ]; then ln -s ../../../ xlsx; fi; cd -
diff --git a/demos/react/NOTES.md b/demos/react/NOTES.md
deleted file mode 100644
index ca6238e..0000000
--- a/demos/react/NOTES.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Additional Notes
-
-## Java, React Native, Gradle versions
-
-This demo was tested and runs with React Native 0.62.2, Java 11, and Gradle
-3.5.2. Running `make native` will invoke `native.sh`, which uses a fixed version
-of React Native 0.62.2 to build and run the demo.
-
-Make sure you have the correct version of Java (11) installed, since 0.62.2 might
-not work with newer versions of Java.
-
-## Common Issues
-
-```
-ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-```
-
-Add `export JAVA_HOME=`, replacing `` with the location of
-your Java install, to your `.bashrc` or any other shell that you are using.
-
-
-
diff --git a/demos/react/README.md b/demos/react/README.md
index ffee578..428f391 100644
--- a/demos/react/README.md
+++ b/demos/react/README.md
@@ -1,154 +1,12 @@
# React
-The `xlsx.core.min.js` and `xlsx.full.min.js` scripts are designed to be dropped
-into web pages with script tags:
+[The new demo](https://docs.sheetjs.com/docs/demos/react) has an updated
+exposition for legacy and modern deployments alike.
-```html
-
-```
+The ecosystem demos were grouped by type in the new demo site:
-The library can also be imported directly from JSX code with:
-
-```js
-import { read, utils, writeFileXLSX } from 'xlsx';
-```
-
-This demo shows a simple React component transpiled in the browser using Babel
-standalone library. Since there is no standard React table model, this demo
-settles on the array of arrays approach.
-
-
-Other scripts in this demo show:
-- server-rendered React component (with `next.js`)
-- `react-native` deployment for iOS and android
-- [`react-data-grid` reading, modifying, and writing files](modify/)
-
-## How to run
-
-Run `make react` to run the browser demo for React, or run `make next` to run
-the server-rendered demo using `next.js`.
-
-## Internal State
-
-The simplest state representation is an array of arrays. To avoid having the
-table component depend on the library, the column labels are precomputed. The
-state in this demo is shaped like the following object:
-
-```js
-{
- cols: [{ name: "A", key: 0 }, { name: "B", key: 1 }, { name: "C", key: 2 }],
- data: [
- [ "id", "name", "value" ],
- [ 1, "sheetjs", 7262 ],
- [ 2, "js-xlsx", 6969 ]
- ]
-}
-```
-
-`sheet_to_json` and `aoa_to_sheet` utility functions can convert between arrays
-of arrays and worksheets:
-
-```js
-/* convert from workbook to array of arrays */
-var first_worksheet = workbook.Sheets[workbook.SheetNames[0]];
-var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1});
-
-/* convert from array of arrays to workbook */
-var worksheet = XLSX.utils.aoa_to_sheet(data);
-var new_workbook = XLSX.utils.book_new();
-XLSX.utils.book_append_sheet(new_workbook, worksheet, "SheetJS");
-```
-
-The column objects can be generated with the `encode_col` utility function:
-
-```js
-function make_cols(refstr/*:string*/) {
- var o = [];
- var range = XLSX.utils.decode_range(refstr);
- for(var i = 0; i <= range.e.c; ++i) {
- o.push({name: XLSX.utils.encode_col(i), key:i});
- }
- return o;
-}
-```
-
-## React Native
-
-[The new demo](https://docs.sheetjs.com/docs/demos/mobile#react-native) uses
-up-to-date file I/O and file picker libraries.
-
-## Server-Rendered React Components with Next.js
-
-The demo reads from `public/sheetjs.xlsx`. HTML output is generated using
-`XLSX.utils.sheet_to_html` and inserted with `dangerouslySetInnerHTML`:
-
-```jsx
-export default function Index({html, type}) { return (
- // ...
-
- // ...
-); }
-```
-
-Next currently offers 3 general strategies for server-side data fetching:
-
-#### "Server-Side Rendering" using `getServerSideProps`
-
-`/getServerSideProps` reads the file on each request. The first worksheet is
-converted to HTML:
-
-```js
-export async function getServerSideProps() {
- const wb = XLSX.readFile(path);
- return { props: {
- html: utils.sheet_to_html(wb.Sheets[wb.SheetNames[0]])
- }};
-}
-```
-
-#### "Static Site Generation" using `getStaticProps`
-
-`/getServerSideProps` reads the file at build time. The first worksheet is
-converted to HTML:
-
-```js
-export async function getStaticProps() {
- const wb = XLSX.readFile(path);
- return { props: {
- html: utils.sheet_to_html(wb.Sheets[wb.SheetNames[0]])
- }};
-}
-```
-
-#### "Static Site Generation with Dynamic Routes" using `getStaticPaths`
-
-`/getStaticPaths` reads the file at build time and generates a list of sheets.
-
-`/sheets/[id]` uses `getStaticPaths` to generate a path per sheet index:
-
-```js
-export async function getStaticPaths() {
- const wb = XLSX.readFile(path);
- return {
- paths: wb.SheetNames.map((name, idx) => ({ params: { id: idx.toString() } })),
- fallback: false
- };
-}
-```
-
-It also uses `getStaticProps` for the actual HTML generation:
-
-```js
-export async function getStaticProps(ctx) {
- const wb = XLSX.readFile(path);
- return { props: {
- html: utils.sheet_to_html(wb.Sheets[wb.SheetNames[ctx.params.id]]),
- }};
-}
-```
-
-## Additional Notes
-
-Some additional notes can be found in [`NOTES.md`](NOTES.md).
+- [server-rendered React components with `next.js`](https://docs.sheetjs.com/docs/demos/content#nextjs) is now part of "Content and Site Generation"
+- [`react-native` deployment for iOS and android](https://docs.sheetjs.com/docs/demos/mobile#react-native) is now part of "iOS and Android Apps"
+- [`react-data-grid` reading, modifying, and writing files](https://docs.sheetjs.com/docs/demo/grid#react-data-grid) is now part of "Data Grids and UI"
[![Analytics](https://ga-beacon.appspot.com/UA-36810333-1/SheetJS/js-xlsx?pixel)](https://github.com/SheetJS/js-xlsx)
diff --git a/demos/react/index.html b/demos/react/index.html
deleted file mode 100644
index 8487db4..0000000
--- a/demos/react/index.html
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-SheetJS React Demo
-
-
-
-
-
-
-
-
-
-
-