From fdab0e6768f443fc86ca92419d2fae8d352d0661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Tue, 22 Oct 2019 09:27:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AFbuild=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/config/env.js | 4 +- public/react/config/webpack.config.prod.js | 692 +++++++++--------- public/react/package.json | 1 + public/react/src/App.js | 62 +- .../competitimain/CompetitionsIndex.js | 119 +-- .../competitions/competitimain/groups1.png | Bin 0 -> 3275 bytes .../competitions/competitimain/groups2.png | Bin 0 -> 4820 bytes .../competitions/competitimain/groups3.png | Bin 0 -> 3671 bytes 8 files changed, 471 insertions(+), 407 deletions(-) create mode 100644 public/react/src/modules/competitions/competitimain/groups1.png create mode 100644 public/react/src/modules/competitions/competitimain/groups2.png create mode 100644 public/react/src/modules/competitions/competitimain/groups3.png diff --git a/public/react/config/env.js b/public/react/config/env.js index aef6a8ff4..d76de4ce1 100644 --- a/public/react/config/env.js +++ b/public/react/config/env.js @@ -7,7 +7,7 @@ const paths = require('./paths'); // Make sure that including paths.js after env.js will read .env variables. delete require.cache[require.resolve('./paths')]; -const NODE_ENV = process.env.NODE_ENV; +const NODE_ENV = "production"; if (!NODE_ENV) { throw new Error( 'The NODE_ENV environment variable is required but was not specified.' @@ -71,7 +71,7 @@ function getClientEnvironment(publicUrl) { { // Useful for determining whether we’re running in production mode. // Most importantly, it switches React into the correct mode. - NODE_ENV: process.env.NODE_ENV || 'development', + NODE_ENV: "production", // Useful for resolving the correct path to static assets in `public`. // For example, . // This should only be used as an escape hatch. Normally you would put diff --git a/public/react/config/webpack.config.prod.js b/public/react/config/webpack.config.prod.js index 33c778d45..22bf615ad 100644 --- a/public/react/config/webpack.config.prod.js +++ b/public/react/config/webpack.config.prod.js @@ -11,7 +11,6 @@ const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin'); const eslintFormatter = require('react-dev-utils/eslintFormatter'); const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin'); - const paths = require('./paths'); const getClientEnvironment = require('./env'); @@ -33,7 +32,7 @@ const env = getClientEnvironment(publicUrl); // Assert this just to be safe. // Development builds of React are slow and not intended for production. if (env.stringified['process.env'].NODE_ENV !== '"production"') { - throw new Error('Production builds must have NODE_ENV=production.'); + throw new Error('Production builds must have NODE_ENV=production.'); } // Note: defined here because it will be used more than once. @@ -44,9 +43,9 @@ const cssFilename = './static/css/[name].[contenthash:8].css'; // However, our output is structured with css, js and media folders. // To have this structure working with relative paths, we have to use custom options. const extractTextPluginOptions = shouldUseRelativeAssetPaths - ? // Making sure that the publicPath goes back to to build folder. - { publicPath: Array(cssFilename.split('/').length).join('../') } - : {}; + ? // Making sure that the publicPath goes back to to build folder. + { publicPath: Array(cssFilename.split('/').length).join('../') } + : {}; // This is the production configuration. // It compiles slowly and is focused on producing a fast and minimal bundle. @@ -54,332 +53,365 @@ const extractTextPluginOptions = shouldUseRelativeAssetPaths // 上线用的 // console.log('publicPath ', publicPath) module.exports = { - // externals: { - // 'react': 'window.React' - // }, - // Don't attempt to continue if there are any errors. - bail: true, - // We generate sourcemaps in production. This is slow but gives good results. - // You can exclude the *.map files from the build during deployment. - // devtool: shouldUseSourceMap ? 'nosources-source-map' : false, //正式版 - devtool: shouldUseSourceMap ? 'source-map' : false,//测试版 - // In production, we only want to load the polyfills and the app code. - entry: [require.resolve('./polyfills'), paths.appIndexJs], - output: { - // The build folder. - path: paths.appBuild, - // Generated JS file names (with nested folders). - // There will be one main bundle, and one file per asynchronous chunk. - // We don't currently advertise code splitting but Webpack supports it. - filename: './static/js/[name].[chunkhash:8].js', - chunkFilename: './static/js/[name].[chunkhash:8].chunk.js', - // We inferred the "public path" (such as / or /my-project) from homepage. - // cdn - // publicPath: 'https://shixun.educoder.net/react/build/', //publicPath, https://cdn.educoder.net - // publicPath: 'https://cdn-testeduplus2.educoder.net/react/build/', //publicPath, https://cdn.educoder.net - publicPath: '/react/build/', //publicPath, https://cdn.educoder.net - - // Point sourcemap entries to original disk location (format as URL on Windows) - devtoolModuleFilenameTemplate: info => - path - .relative(paths.appSrc, info.absoluteResourcePath) - .replace(/\\/g, '/'), - }, - resolve: { - // This allows you to set a fallback for where Webpack should look for modules. - // We placed these paths second because we want `node_modules` to "win" - // if there are any conflicts. This matches Node resolution mechanism. - // https://github.com/facebookincubator/create-react-app/issues/253 - modules: ['node_modules', paths.appNodeModules].concat( - // It is guaranteed to exist because we tweak it in `env.js` - process.env.NODE_PATH.split(path.delimiter).filter(Boolean) - ), - // These are the reasonable defaults supported by the Node ecosystem. - // We also include JSX as a common component filename extension to support - // some tools, although we do not recommend using it, see: - // https://github.com/facebookincubator/create-react-app/issues/290 - // `web` extension prefixes have been added for better support - // for React Native Web. - extensions: ['.web.js', '.mjs', '.js', '.json', '.web.jsx', '.jsx'], - alias: { - "educoder": __dirname + "/../src/common/educoder.js", - // Support React Native Web - // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/ - 'react-native': 'react-native-web', - }, - plugins: [ - // Prevents users from importing files from outside of src/ (or node_modules/). - // This often causes confusion because we only process files within src/ with babel. - // To fix this, we prevent you from importing files out of src/ -- if you'd like to, - // please link the files into your node_modules/ and let module-resolution kick in. - // Make sure your source files are compiled, as they will not be processed in any way. - new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]), - ], - }, - module: { - strictExportPresence: true, - rules: [ - // TODO: Disable require.ensure as it's not a standard language feature. - // We are waiting for https://github.com/facebookincubator/create-react-app/issues/2176. - // { parser: { requireEnsure: false } }, + // externals: { + // 'react': 'window.React' + // }, + // Don't attempt to continue if there are any errors. + bail: true, + // We generate sourcemaps in production. This is slow but gives good results. + // You can exclude the *.map files from the build during deployment. + // devtool: shouldUseSourceMap ? 'nosources-source-map' : false, //正式版 + devtool: false,//测试版 + // In production, we only want to load the polyfills and the app code. + // entry: [require.resolve('./polyfills'), paths.appIndexJs], + entry: { + main:[require.resolve('./polyfills'), paths.appIndexJs], + vendor: [ + 'moment', 'react', 'react-dom','react-router-dom','antd','@icedesign/base','@novnc/novnc','array-flatten','axios', + 'material-ui','monaco-editor','react-monaco-editor', 'echarts',"qs" + ], + }, + output: { + // The build folder. + path: paths.appBuild, + // Generated JS file names (with nested folders). + // There will be one main bundle, and one file per asynchronous chunk. + // We don't currently advertise code splitting but Webpack supports it. + filename: './static/js/[name].[chunkhash:8].js', + chunkFilename: './static/js/[name].[chunkhash:8].chunk.js', + // We inferred the "public path" (such as / or /my-project) from homepage. + // cdn + // publicPath: 'https://shixun.educoder.net/react/build/', //publicPath, https://cdn.educoder.net + // publicPath: 'https://cdn-testeduplus2.educoder.net/react/build/', //publicPath, https://cdn.educoder.net + publicPath: '/react/build/', //publicPath, https://cdn.educoder.net + + // Point sourcemap entries to original disk location (format as URL on Windows) + devtoolModuleFilenameTemplate: info => + path + .relative(paths.appSrc, info.absoluteResourcePath) + .replace(/\\/g, '/'), + }, + resolve: { + // This allows you to set a fallback for where Webpack should look for modules. + // We placed these paths second because we want `node_modules` to "win" + // if there are any conflicts. This matches Node resolution mechanism. + // https://github.com/facebookincubator/create-react-app/issues/253 + modules: ['node_modules', paths.appNodeModules].concat( + // It is guaranteed to exist because we tweak it in `env.js` + process.env.NODE_PATH.split(path.delimiter).filter(Boolean) + ), + // These are the reasonable defaults supported by the Node ecosystem. + // We also include JSX as a common component filename extension to support + // some tools, although we do not recommend using it, see: + // https://github.com/facebookincubator/create-react-app/issues/290 + // `web` extension prefixes have been added for better support + // for React Native Web. + extensions: ['.web.js', '.mjs', '.js', '.json', '.web.jsx', '.jsx'], + alias: { + "educoder": __dirname + "/../src/common/educoder.js", + // Support React Native Web + // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/ + 'react-native': 'react-native-web', + }, + plugins: [ + // Prevents users from importing files from outside of src/ (or node_modules/). + // This often causes confusion because we only process files within src/ with babel. + // To fix this, we prevent you from importing files out of src/ -- if you'd like to, + // please link the files into your node_modules/ and let module-resolution kick in. + // Make sure your source files are compiled, as they will not be processed in any way. + new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]), + ], + }, + module: { + strictExportPresence: true, + rules: [ + // TODO: Disable require.ensure as it's not a standard language feature. + // We are waiting for https://github.com/facebookincubator/create-react-app/issues/2176. + // { parser: { requireEnsure: false } }, + + // First, run the linter. + // It's important to do this before Babel processes the JS. + { + test: /\.(js|jsx|mjs)$/, + enforce: 'pre', + use: [ + { + options: { + formatter: eslintFormatter, + eslintPath: require.resolve('eslint'), + + }, + loader: require.resolve('eslint-loader'), + }, + ], + include: paths.appSrc, + }, + { + // "oneOf" will traverse all following loaders until one will + // match the requirements. When no loader matches it will fall + // back to the "file" loader at the end of the loader list. + oneOf: [ + // "url" loader works just like "file" loader but it also embeds + // assets smaller than specified size as data URLs to avoid requests. + { + test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/], + loader: require.resolve('url-loader'), + options: { + limit: 10000, + name: 'static/media/[name].[hash:8].[ext]', + }, + }, + // Process JS with Babel. + { + test: /\.(js|jsx|mjs)$/, + include: paths.appSrc, + loader: require.resolve('babel-loader'), + options: { + + compact: true, + }, + }, + // The notation here is somewhat confusing. + // "postcss" loader applies autoprefixer to our CSS. + // "css" loader resolves paths in CSS and adds assets as dependencies. + // "style" loader normally turns CSS into JS modules injecting ( - 竞赛时间: 2019-08-07 24: 00~2019-09-10 24: 00, - 报名截止时间:2019-08-07 08:10, - ]} - extra={ -
- - -
奖金
- - -
浏览数
- - -
报名数
- -
- - - -
¥4500
- - -
351
- - -
351
- -
- -
- } - > - {item.name}{item.sub_title===null?"":{ - item.sub_title - }} - } - /> - {item.description} -
- )} +
+ + {item.description===null||item.description===undefined||item.description===""?:""} + + 竞赛时间: 2019-08-07 24: 00~2019-09-10 24: 00, + 报名截止时间:2019-08-07 08:10, + ]} + extra={ +
+ + +
奖金
+ + +
浏览数
+ + +
报名数
+ +
+ + + +
¥4500
+ + +
351
+ + +
351
+ +
+ +
+ } + > + {item.name}{item.sub_title===null?"":{ + item.sub_title + }} + } + /> + {item.description} +
+
+ + ) + + } />
7MQ?$+9&^UWEMxX8scqHKkBr ztx`rU@C@j%gOu`XN~xb@)FxW(6k4Dn=*6D>yUhIU6zZ&1%Af_Rg3io_l=4^1{J9L; zMXQ`L3seOidiM48P3!OP|2s2(AZ2=MbuwlFThL*Pd_KRpP$--vq750djaD~B7H|Z; z=&x@hqIZ~ieu{M0s$|Flu0V%9a=F|`4a0bonVU0YAFXOiEZ`dSBJ2lXfUf+N=5mYn$#T_bVwC>mv z&Ye5WqTSuyG(0@)r<%l+2@Omk#H-BwdSW!IAjpy>OU&LdiuCm9Q+oLDq3fy_FJ4S* z*RG{Pp+KijoicyBNg8xFR(dv1sI4x9_!%>Q#h)nAm)f^)AE76WA`J`-P;YOq>#BF` z*g-R9%%I!1Z`0MQS6!FWpu0BJq>Q10&dg0hh`$ig^Zvw%w$#?GTgmb}!+KJ4b2Cku zGKIW=4!{9AeC)2SF2ZPFC5$-Jrd6NrEM2;k7A;z2x;%Y-eO1*M9UYxCN~~G4hUUz1 ze?k&+Or1K_tRM1unGZa8@PMvgzaEx}L#ZcJ&>@i!VlFfPn~2_Z@KT=Ety^b;=LK{? z2R8~pT)1#yl7+07AgI|cUAjc~?%kWHX49rkG;iL#pw+r6kLTj~NlKxE4(0Os{MzEy z-epNrHVRq1f{sYb?%lgh7wYWUv-J4!% zKstBsTve?R67=G3lvkvqE*^l&<#L}f4CB|h4a`HaNV6i^fkp%<{r&xcpXCK~^pd-F z?J^@jJv}|9pKYZrTeg@!G(f+2@nTiE^kmdulSS5}TjEG5zoC@+fj{xWFST*wMw&l= zzUjY);YWG_-O5}3Z1m)qD5Dp~8#7fv@4ju@HkvteCf&Mq%k+osQc%#t zn(S7RvC^EwZ##uut|p)}bEA~)HaAyEJwgPl^ zcA6nU{5RaIN(uh`!i5XXmC9=2Mf9rGwic9vjs>o2emo}2Rygv}qer$2S{NabG7mb8 z(ACv7Yj}A0Z6ey|70xj8#|8S{y?brdz&3!pckh~c@Dd<0<2PYc!01pZm4e>U(LvV8 zQl8iCWEATX`}gnHpqCmjpU_97N~YxI6jadbQvy(dC% z*w=#J3l=Pxh@fC{Y9$T2mlklBw*FJSt*6X)v=_wK}Ro+m^oY)fPsDGr3wBy{C9u`S-mDK zIN6OlZH z?dq)+=s#lS!*M8B{>&&rM?4*;n2<2ZEZww)i5*@70E>Ue$|imToJteIT7r&HCLo5( zVvQ)37L0K84tG@Fx(W#SZ!q#E(~5;`0B{(G}0uc-6I7ZS78(i1$;;#F*oo=3Hsc*b4_S4 ztV=0)Az;;3ik;viS;7dZ2_=s2w(lml`H1f;-sg@Krb%$ zqqP%t$|y?EaSa7_7s4&U6%lR|dR4q6a2+r~#Y!pMf~Y`;iv>Ax1Q0J)C0E1_bd za2dTdTm?i)05<+Ey@mrXNfe;t8JG~`l#&%XtTuUdv#AR&3V?@?kKX;}&70=l^(0PI zBLQ6q@pESWa+nZ>RoC+6%gu&HLL&pppoawjg|$Ho^#bzJ(@W?)UYf!a8&Tz@0{sQqZ0Dnm}&&_t2+Oj}8#=aszD0=jMdI7tk%cp$tNh zNZ8(x${rn8TqvbPJ>9Gemjbv$=m&HQc-Ym+)e6$7_$eDo zk1m9mQM|P1J${7HWhz_1^5xwC3b@d712DI-dON!Zxv49O?HLN_xm@l95q&9%3Tm0O z1z>@|pyzVAZxPY=v^li}l5BxMpi3z~$;^LF(gj6HHnx^6J`4B;T}ru$ng6H1CLLen z=_k9lfG^OCS67_O%8j}1&8c%H)dHSD$LCw5l(St>UgkgcIpy%`Xy-KNf(*CinFpQ|{NWKLsg5J~9vv6>55PQqlC0_+C zp|*gt1)c#NUw@WTzRAoVb1trPXbaSb1)c$22=N9pzfvFKYbmt_+*x1}=($|(01>sh zE2?v83)GJVCO~g*Z-3wT_&7eM72B20^9Qzd&_^Ulse?Th|Z}kP=6M1+yYR4Drt$cWPxMHj8uTntkwRS^Kp!^@<3MX`>j@2d3L8I5D%pVk)G&RJW# z!N$hMPaipQR#YEDeXNigw>RJlAVHkHB8yjCZ zeE4ujxvCoU6gGaAR4M`eT0=v_^DQkcXDjKiLC+EuDb%$H`UN8T_|cz%_NOucl!_w}p$?z{JvM@!}fpg(SL z5r|_1JX#t_r1LHs?c!KYSF{92z$5Z&Lny*=mZEWag5%+eAEyX-iS8x)04j2dRcKU+ zQ(0ZH5*UH=ME8=tFPCzTuhF<5fiZDKk3$495#3AnRBlA$Lp1Wnp}ek035q}#qI=1n zLN7EXCMYJZ*l~z}A<=zgAA`oQIF#8HDFG2MC%T4*6y63pB_J-Y$Z>{%Dbc;VdKv{u zX9*ft#hKi$I0=S8NTPem-jA}JWhELHCm1%axN(GlCDDCm$GV(jIT|J7NOo701VX?T z(S2lZ!C5{5@+S~JuBdT>fNi4tZ0z00U}~Jm?uwB>2!us+AKBB$U}OSe@_&UN}x;vVC9OKixG&5=)S{gGcs5N6wJjqI6w8$)gdVl9NiBm51aR2pcrJF zg)=9dpF?nuMM}d(P2u1#kiHGHbD3*+@?`y+le3cXOI!#CcEZUcPWEisSJXuJk^OEm zm<2e}pXID`LxnMWpm+s%yFV;>$$ZAW=0T&|VcSx8u~qbvmAVKH{SFytvi5bwJr}cFQWn6Rf$;5u=;vY7L#Of3YM`3m@T%GSqY4_|F=A@TJPeG^9)v7< z9k>KaR<%F$%QwUR?W%r(qVVW9_S(KP6gJGWSJw{Ft6vR6m#hBf4S~GN3~zLUwX*jFln&3rjSs=zt?)$M%+LCK2$!@~KZ183flvPx-CTlO=PLxGe}f_= z;p5S;V7RmWTlD4_(Y-r+3X{?35mO0duu(rj*)UvjMqL7XHmhkCya1jLp;`nAGxY&j z`G!65tcYH?6g<2d%GOZ*{kqXweOde>teb50Yqt)Ty&dhcDFM_%)Vf9Ry za&P8m`3gh#H=*$z>hH^^z>I%_mSIm`t6Epx5BE(`wMNwTZ!}iz9D437(bLFFIt$Tg z?a=(}b)ysg(`RABeB(AA4-8$Qo|zGS!DI0IrmXEBm;nWgf)UY6Rsqp%gGm*N=y?l5 zzlBh{g+2N7TB24gmh2=Z<&H6M(=gbx1xD4+T50S-wWH1*42#BReeOvDQ7>BhvY)J& z3e&qgL-t{-pxWPH`&TeN_Eu>}i7v=#!zj)XmZ8xgyj6^%wode!De%>6CPYtyfBOz! zW<(#~0=6$TAjknIQYtIaTMvN_|AMWH;iWd2+nEvlf(nrQE>yo#)nE8D?EcnVc&XQV zka|A;2H5V~v5i_hx)CZjg3rdm{2`fZ$l>^@9lm}{s_#!h!HOdG&1Y5WE*BDk2j{gx(3vXS=iS8wPA1)%p>)Kl(>={MUAg72f zyZMOk)o%YvTiCqNKYJshH@F4vodhK-Lq-P7OonBzn@fB_MR;T_l&A!2-h%&jF|S*^ z5{&sxJ%6E<`tb#p%kG3;bCnK0sD!oEqw|Z<@c&-_oIAlEbpf91;b&;%EWNn6& z{p%3jOZL88!C7Q`EF76cVYJFAqRSLp4T4VN;P=h&R3pD7A&}^6XG7P?(C{`T)T!ez zy$5Xj0-8ObcHm$uN!|h=yXD1K!^xvCvJM>CV-8BQ?(mQQsJeqoXYH^3({RghWmZh9 zV*^|dw0{zoybMRv&FfdW3<{Mne}2_{aP@ua`HWt$|3@2Rhp6)7*Txnli(a#3N7u*H z`fxiL%ts?BI_WH0>qHm*Pd{V^HxV8Ey58!qPN^=^m+0ri*F)uoY9aL3->E~i5Pni8IDSCQuY6r~Fs#}{z2>KNhgH);gV1vhH0cBfe}&a= zX00oS%nEg3|4*=PPGrmR>v~upM%&7b)ww8NLHP1DC3g;$Y$dwLq@^$bjpwsfKBufM z;p*tRP>ni3@_abF7e>~CQ^z1!btzgFYTp3sB@EYBsx(phdZ{X~e+Nux4`MmFb1dX9 z1SgNdf9`=zABKi6DK9*?9}0)qS)EvbmD6CVZ+EupPpny@c9pB8WP7S1oIdVvB^PDA zeWuzs?hF04vKq_A^K2)&kL<6Y(Z|MoBCDbk{oD6p=W63VWJhl|%K07L+oMPA&XpR# zhoj(wky(juCRwp^&~vWRb7l9I+f*t4+YPVY2EW;`@ykI|)F-nd&#N?6`uR8SMuxGp zk~dGN%dfzm|2Z2jze}A(o^Js^ewBG#F|UsEy}=%@0e|=o%8}15WXsqP{cZBFgav5a znk{nVq>io&)b#I4-S~MGJa-L@-fev|TA@BP?V|qa_VhES;Oj}s8WT!44hKk`bURk4 zgJpJ?=Bd!-RW*u{1xWrLk3{$G>Zue(<4ZIya~$Wt0?|cR7gOL4-%Y2H)ul)oWjn8P z1Jr4$bY{H>!Iw=|w}yv())OayDqK>%UGf!xIfGzv_G*z{Uz)*Rsqw^O^Gp*sdorse z@k(?r+51w7v#bItJF$l6`}ivmJy;+kqTl^8wCJ0;=C1W1DwmM_&~E=TvF0>Sf!!P7 z_0EyQC4F@Hw^Ccgza(&s$a^(zDL>xc??546>dqtSaCDz>T{%}&tf!udCFty_(6gCv zI~@2q;u*(8bqSoE){jPPIDKA}7le^}FJcaCZDhoFIC|1~9_FrNIWI-YUobfQQOj z*KRWuI*d`|K5-c44pKIKDO2x<69z811&hJ`zD;RXs28beCf0Jg^>1xa%-5>88*x{ zA4&Hwmm0r)r${bmfKt^Go9J2!m!t8utOkRt$Rs%4;r?E!+YSF%az}I>1xIFI->r>&AFl;d zz%TI1EihoQ@r6iFjib>eJ-~5z7E$)FomXk z(gSVk4ce+JdGSlx{4uE<^Jj#ML1OCYS}HxsU{d6$*=T7+blG(u zUISGxgJ8!bE22w?*|>x1rca!Y0=)>kOn~OT->-zHNq~axxD+bFs7wttABpynkToM) zbtFWuc^wS=0+N#8tBK0rJ-Eml?(Y-T&MrkfKE)MS-bSLAk82Kp9<%{^h$@M;qid;1 zDvTxBo`Khj=&~kFIzvyN=b$X6?qp;{bh%B`?cMcnhDPnxs;1S2^sW9CE?WzRuY);a z?Fl*{TE&dkzX|$$q(~{Y=HQF2aEUJGkjK7(QdQyj|CAS{?)GcM$-p0}JeM|d_;kYk zz$u~!29x|%&5Pda{&TF0NtBTp(F+z=KH67yRqn6)ZJk$ly+$p+5z!y~4C)1iy?U(> z0oD|qJmP(5bj@u=bZOslEVLP{0x`rVWZyPFCBq@Q9DK#fQvXJ!e^2QOYi1g6xq0%# z^?ji2rfFs!85l*bRp;?>)_xnnD#(sZ$-OA7vf587~O9FRzFz!iZPCjJE|Dh zay8X+@pl(XRHaLlN%8zfuuKs?I2_OJ>O{Jui|RF4XcJTEn z&CIS?HJhsx53)#NGcHzMsRMeEo5eM=ly1IjE$FXo@2%ezAXm|Px(l-lBfE16tY?Sl zQs3;2(D6BFGep^_&3s+N!XoOJei0@4ScJHNMe?ag;v#V-lZYj~$PZU6FS@ECc6;$@ zmm5*N?Ao9rrsVt)D%)5vK9Le#4$DvPRC#HnNJcSY4bjzxSBGUYU!P_oKX>B!huoY zID|n* z>qS(er+$Xw75#scpyJQRt8{agPGufwaI?~pC3AuPh7=V`g0zkN%frPiw-Vi(;^G`@ zW1d-8Ud{5V3uR#lwFp+`#c&r;uOAN4C6um7(5}7jM-}$=-s7Q(B^N#3G#f#ASH$H& z{LsabOOh4IMi5B}d^5-`@9G(m^pdqrZX~*vMq$#uNsGd8=5PkD=zH<_cRtbQ1Fy29 z>AYNR5FJ`BkF4y{@?#TEJ-tZmXtZH;VjdOqoKt}ovZ2V^CY0|>IC#n3hVJ_#+0m>5 zFT&~DpspjTic6>yu!1c8W%?n_-ENkn6pF*hb~xP!zi0$~$f z)9{e$&8O(g7$2|DxN^l40^t)q+56RKU-ImDg2I(0o)HL(=-%wO=XfW(@~X!((5`Gb zi-2vSYpK*D!<%Kxxx_;`E4w>-0wG|F=-L2Ea1u#VTPuOEaYcJ}G)T#GanlsB;1*^g+&Mh15j7XeEIJl>Sf8@%}u12WfGwsR}E2;?dRJX$iZ0ljn8 ztli1F2!x4%r3*lq{khd$1Y(Oo$67%NZGwjPkO7`#m*}xw7I!qK5eP|i&sjWLH|A}h z%I}N9@}McM{^nhMf9H_Z!6|+`Ngbzm*`Fd@Aem41n#W0i9&hXFk{P} uPy@R}kL|L!qdAR0x4Na7_QL_IZvPKUC@D(MLc`Yp0000%jsl zhXQizQ!W(*M9oYRkV_KeCP2c3oHJefswWdNlev1PCz*6t@g6VfsrswFufEh&{Z;ih z2YvQiAeau87y~k9fCI@>!BFuf2zgM(I2kmBGr$S>^}29?>;yp{h4aDS%aj3&&}lj_ zI|X$$dqL1nrdSy)1v79>=#&IQZg=pe9{@xtm=gwFh78yWodPV#83Hre1Q3l3@iIsX zWuU3hg^@jbGI%UfC?^cI3>k1NbP6C7-X3- z;9Tew=<&QzTrqA3L4TRyW^fe7fNP;sGLF2EfXdoEAn2$tZWvq{G2mY4!s7IWt{`>0 zK}f8OurnwMV!$(@3vNfc;*2nkjYKMbl&81P)^6tF%g3xr=H6YLCzf*24dbV2O8 zJPkA$Kc;CkC^XGvJ-jDd?iS zIGBt-g5dgA&H-z_0vPaK=z=FECj(}F4}dlb;EF+P#SHi+bV2O7w}Urt1tFoWmh(E+Gl%6x;@zj0ZicVRquZcqQe}_{Mk`Lw^6SO_^K6(y^!WG~ro@ zAs4m8?2%3TObgQFqzWR(ms%bWx(g`y^ zXBNQEZMK$+tf*^90(N9Pg9J@DW}VrL*DvgFYr)?_pA^>*AGRAUv}3}F60zwA)%(Nd2sKH@D+6X+;<_^L7`tl--EM9^-@D6M9m(W${uGe`6EWk~ zBMb0L)v1OyFriD|`O-~YtZh4%8x5mr7l3ZkH&+^qxd{U>FLjt;Y+ZRFMinm=#2y3{ zVl`n6mCR^!7hXsjh@BP3FuG)!P33*GZLzuIlftuh2VS=MW+*jX1)V}TORppk#q6Yk z!pF~@T#I)vQo63CIJFjO^$T6Gh)smY!J6}8i#5s5Ms!aoJdoWUb=)2hlI%(LmdG~@dTLWW%ATZ&Y-r~P7x&>qJqUv*4QI_vf-sa3C{fKUDeZkDWF!MVBa&3rg zPGla`^+w7A!j$2&vR{SV{uDZ0BdlzniD6NeHNpluZ7NynwYSCtcule_OMeWRvHlI+ zv%1V6;0m-fd<@Bd+3Nu1!+yXgnRH(@?dPQIEoR+7uyu+8`ch6 zGo}d75(@urBUmF}V>59{(nMfmhe@DiX!^WNk8vfRHmnV(zkX0;XMA2}fXT^vK??q? zLO)k$gu#uwFj5tQ{^1rs`kt#LpqN~xn?jS35)=hx3Y{{e*UbPS^QGvh=C&c#Vst_3 z2t1c?r_lWWl>Pbb zyRpcM>#Ja)QwH<1-v#ijl%3Wbwq8segqKt9$Hwvlc(C|mn<~X@7(Eo#4WFhzF1RzT z(HfgSgzgVk8`~tS)X?u+2M~*^qXkkJ7v!*3I#qDC ztNE{#VaQ1wfKM;~g3J@2c`bB09ZC<1Y2poO>`SL}_Tj~gg>{0}o8t>jw7sj#3v5g< zq5Hz9r)3NCB49Rt2ZCOn7Lh6+J-1=({;ETBuI7{k;f<8KwF8_%9v>$T7wRZM;9 z+cT!%?uZOrG+jlvL$BkUsR9EdI^o;;xxX*?#}qHas&YLOdOZXFU5wiI)NeCWQN!;A zA#Hu>M6qSP75W$Lv+!ul&6s;`D`ubFBB{_{O&%)v=xG{VycD088-$6(;l+5jw53Ft-QH=I=pBq}$$824vcvMyYXVN%Wv~=xTe%?F*bE^OOeDG^tuN@$a;ybiZVAV zaRBC~3~LbjgxJ1VoIX~R4Of}zZs|$8QI@*wR<$3G`=h!x6#eA#&lrDVx#)Tu3%%=a zui;S51-CYs(A`obafbYye*^sU5?d8z&R*#B?Dd4WTN-R6Ya%f`x*G@~`1sPkCN953 zO@!bQr0JuJdz*Yd>&zxxHdi&+OVvbSQ^!f@sZA4}nF$XyrvekYsBZH*bMwy8X)_CS znJ^REgCkxy-}{30Lbtc{&!qc=sSQ2na?i1aO)3)OUc50R314-53hjbp1Uqk>-+|Pi zC_En9TN0s*ow~3MBky(NSxG~79}w<`K)8+MO6YWlwB*JYg@aX3oLGs)mw)m}=p&-K zVQq(rxN5G!q?4<#vP=)_28$FUx>%um)>+==Qtr;El`p+65g_{m<<&8+g#JL(4cO3O z5-Ryx&;weIu91lu(W%#GZ|7+kTk?r;n~0{C6#BvHb68#P<#8rwv4^@Iin-3+{E!+J+2jVTGC*%6z-Lyv#qSBy-H(^Z4GOW8&gvVlf3cH;niY0OhLA`KiM(Bf%0fvdmnC7`0ZoPWQL7TQKkZ zcF-+)PcA=n3rWI9^`R>6Jo=tTWg54uCFba2`hrbeJYg$8n_kD6;7Qiz%rh>g7d~k} zPN;JBna!AYejA>Nza8(SJq(WHu>A6`m~-}P9I17GZp7Di`zmyLIeY*0GlXV%>PHvT zW+rrZZ0U8=K*-zfvNiYTorBxpm+PNLggON8m+r>YQ)?QUK>q;fIhP<#Ej&9~Q;H)s z7jV{O1dWqIM|gU>o^IRI+x_%@KmDJM{&X8(!>OQ#N+=(~si9Q`VO@C<)?O)e3e!`e z)5ru}LlaTO*P)WHLlvn5Ju{P+JOmTt`U&AOl8gRHe`#_?onF@1eB~hCys*$9Zg%J*DVJj(jDfO3LUe<7^r8!ccB|{ zW`gHmV~jEe0+|8dgr1*!A2{>o))Js7kUN64&A$wIFZ7~WonSKUV{eo8ZwE2!(lFqi z&}rxjlaao=C}1PzN<$B`A{Pe43!M-SdL7+uvBX+ni80U$7!WUXy>1Q&$!i7JSQ8lo z4Gf4Ax)2?gtPS*+aRvem4Chgg>}2BcuXGoc^Pi$QtCK7e$V zqEcpqG0@x$xEDIfQ^8QN5rhnF?#8kD7z0u<;9ls4?784EOR5T)9mYUQFyLC~1-j8N zla(#eFjgmHKuQLj3!O&2HJNt@^2@fQB!bzJHv^7^e(;5O)YQ_mtc0?4p11}Fp9gkG3^ z3(VYife_M}bq!-cY6dJqFPNPKzIK0ezeG!FFw7ofz!?J^Xh>)Mk?jDvgVDqokShZm z@^$Y6(WaZQQ`7F0$-;Wr1=ibPiY51j9{PTeex*U?aM+bRj#m zO@+>tX;kW=b(tGzl!}JLgf6?TR~8@}p>sH|fqF>Y_>Fpd7MReLr3=}iZ4f$#lfeiY zR5O0P!&u!+=(6j2WdW)e`mqo-H?Vr#<`QS