From c795112f0a73a94cf02298c29da80c774632fa1f Mon Sep 17 00:00:00 2001 From: educoder_weapp Date: Fri, 1 Nov 2019 11:36:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8educoderAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- app.js | 81 +++++-- app.json | 18 +- components/icon/myicon.wxml | 2 +- components/modal/join_course/join_course.js | 23 ++ components/modal/join_course/join_course.json | 4 + components/modal/join_course/join_course.wxml | 10 + components/modal/join_course/join_course.wxss | 9 + data/client.js | 182 +++++++++++++++ data/cookie.js | 45 ++++ data/eduapi.js | 213 ++++++++++++++++++ data/requests.js | 72 ++++++ images/avatar.png | Bin 10742 -> 1210 bytes images/avatar_blue.png | Bin 0 -> 10742 bytes images/educoder.png | Bin 0 -> 9049 bytes images/tabbar-icon/tabbar_study_default.png | Bin 0 -> 1142 bytes images/tabbar-icon/tabbar_study_pressed.png | Bin 0 -> 1104 bytes pages/about/about.js | 12 +- pages/about/about.wxml | 24 +- pages/about/about.wxss | 18 +- pages/addclass/addclass.wxml | 6 +- pages/addclass/addclass.wxss | 10 +- pages/changeuser/changeuser.js | 19 +- pages/classroom/classroom.wxss | 1 + pages/course_detail/course_detail.js | 66 ++++++ pages/course_detail/course_detail.json | 3 + pages/course_detail/course_detail.wxml | 2 + pages/course_detail/course_detail.wxss | 1 + pages/courses/courses.js | 108 +++++++++ pages/courses/courses.json | 5 + pages/courses/courses.wxml | 24 ++ pages/courses/courses.wxss | 47 ++++ pages/createclass/createclass.wxml | 2 +- pages/login/login.js | 92 ++++++++ pages/login/login.json | 4 + pages/login/login.wxml | 24 ++ pages/login/login.wxss | 34 +++ .../classes.js => my_courses/my_courses.js} | 7 +- .../my_courses.json} | 0 .../my_courses.wxml} | 2 +- .../my_courses.wxss} | 5 +- pages/setting/setting.js | 84 ++++++- pages/setting/setting.wxml | 25 +- pages/setting/setting.wxss | 19 ++ pages/user/user.js | 7 +- project.config.json | 2 +- 46 files changed, 1222 insertions(+), 94 deletions(-) create mode 100644 components/modal/join_course/join_course.js create mode 100644 components/modal/join_course/join_course.json create mode 100644 components/modal/join_course/join_course.wxml create mode 100644 components/modal/join_course/join_course.wxss create mode 100644 data/client.js create mode 100644 data/cookie.js create mode 100644 data/eduapi.js create mode 100644 data/requests.js create mode 100644 images/avatar_blue.png create mode 100644 images/educoder.png create mode 100644 images/tabbar-icon/tabbar_study_default.png create mode 100644 images/tabbar-icon/tabbar_study_pressed.png create mode 100644 pages/course_detail/course_detail.js create mode 100644 pages/course_detail/course_detail.json create mode 100644 pages/course_detail/course_detail.wxml create mode 100644 pages/course_detail/course_detail.wxss create mode 100644 pages/courses/courses.js create mode 100644 pages/courses/courses.json create mode 100644 pages/courses/courses.wxml create mode 100644 pages/courses/courses.wxss create mode 100644 pages/login/login.js create mode 100644 pages/login/login.json create mode 100644 pages/login/login.wxml create mode 100644 pages/login/login.wxss rename pages/{classes/classes.js => my_courses/my_courses.js} (96%) rename pages/{classes/classes.json => my_courses/my_courses.json} (100%) rename pages/{classes/classes.wxml => my_courses/my_courses.wxml} (97%) rename pages/{classes/classes.wxss => my_courses/my_courses.wxss} (94%) diff --git a/README.md b/README.md index 7b96e6a..151fe0c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,9 @@ - 学员可以收到教员让其起立提问、回答的提示,还可以点击“我要提问、回答” -- 在课堂界面右下角进入“更多”可以查看本课堂的课程文件资源 +- 课堂内有讨论区,可以交流 + +- 在课堂界面右下角进入“资源”可以查看本课堂的课程文件资源 # 发布版要长按白色底部栏进入 - 教员可以在课程的设置界面中更新课程的名称,还可以将学员移除本课程的学习 diff --git a/app.js b/app.js index b412074..d4b3f12 100644 --- a/app.js +++ b/app.js @@ -1,37 +1,72 @@ //app.js //导入leancloud库,与后台交互 + +import {Session} from "./data/requests"; +import {Client} from "./data/client"; +import {Account, Course, Exercise, ExerciseQuestion} from "./data/eduapi" const AV = require('./lib/av-live-query-weapp-min'); +const Towxml = require('/towxml/main'); const login = require("./model/user"); + //初始化 AV.init({ - appId: 'eVHYNBdT5D2lDxNj5jtJXsWT-MdYXbMMI', - appKey: 'waM3bwf1ftpsMLjRBqqVyJIQ', + appId: 'eVHYNBdT5D2lDxNj5jtJXsWT-MdYXbMMI', + appKey: 'waM3bwf1ftpsMLjRBqqVyJIQ', }); // test Appid // appId: 'fQCxN98zS5thYY3AceKdI8Pj-MdYXbMMI', -// appKey: 'Tdi1DcLlVYrTabFiBaA00pjj', +// appKey: 'Tdi1DcLlVYrTabFiBaA00pjj', App({ - config: { - host: 'wsw1999.xyz' + towxml: new Towxml(), + client: new Client(), + string_format_init: function(){ + //使String类实现format方法 + //@todo: 待测试 + String.prototype.format = function (kwargs) { + return this.replace(/\{(\w+)\}/g, function (k, v) { + return kwargs[v] + }); + }; + }, + enter_login: function(){ + wx.navigateTo({ + url: "/pages/login/login" + }); }, - onLaunch () { - login().then((user) => { - console.log(user); - console.log(AV.User.current()); - if(!user.get("name_setted")){ - wx.navigateTo({ - url: '../user/user', - }); - wx.showToast({ - title: '请修改你的姓名', - duration: 5000, - icon:"none" - }) - } - }); - wx.cloud.init({ - env: 'test-tkkvk' - }) + onLaunch: function () { + console.log("onLauch"); + console.log(this.client.get_user_info({ + success: res=>{ + console.log("userinfo get success"); + console.log(res); + console.log(this); + if(res.data.user_id == 2){ + this.enter_login(); + } + }, + fail:error=>{ + console.log("get user info fail"); + this.enter_login(); + } + })); + login(); + //.then((user) => { + // //console.log(user); + // //console.log(AV.User.current()); + // if (!user.get("name_setted")) { + // wx.navigateTo({ + // url: '../user/user', + // }); + // wx.showToast({ + // title: '请修改你的姓名', + // duration: 5000, + // icon: "none" + // }) + // } + // }); + // wx.cloud.init({ + // env: 'test-tkkvk' + // }) } }); \ No newline at end of file diff --git a/app.json b/app.json index 0e4c5f5..d529f77 100644 --- a/app.json +++ b/app.json @@ -1,6 +1,6 @@ { "pages": [ - "pages/classes/classes", + "pages/my_courses/my_courses", "pages/setting/setting", "pages/changeuser/changeuser", "pages/user/user", @@ -9,7 +9,11 @@ "pages/classroom/classroom", "pages/classsetting/classsetting", "pages/about/about", - "pages/createclass/createclass" + "pages/createclass/createclass", + "pages/login/login", + "pages/test/test", + "pages/courses/courses", + "pages/course_detail/course_detail" ], "window": { "backgroundTextStyle": "dark", @@ -22,8 +26,14 @@ "selectedColor": "#00C7B7", "list": [ { - "pagePath": "pages/classes/classes", - "text": "学习", + "pagePath": "pages/my_courses/my_courses", + "text": "我的课堂", + "iconPath": "images/tabbar-icon/tabbar_study_default.png", + "selectedIconPath": "images/tabbar-icon/tabbar_study_pressed.png" + }, + { + "pagePath": "pages/courses/courses", + "text": "课程列表", "iconPath": "images/tabbar-icon/tabbar_contact_default.png", "selectedIconPath": "images/tabbar-icon/tabbar_contact_pressed.png" }, diff --git a/components/icon/myicon.wxml b/components/icon/myicon.wxml index 53de1e6..0d1e28f 100644 --- a/components/icon/myicon.wxml +++ b/components/icon/myicon.wxml @@ -1,7 +1,7 @@ {{ info }} diff --git a/components/modal/join_course/join_course.js b/components/modal/join_course/join_course.js new file mode 100644 index 0000000..0f9cf2f --- /dev/null +++ b/components/modal/join_course/join_course.js @@ -0,0 +1,23 @@ +// components/modal/join_course/join_course.js +Component({ + /** + * 组件的属性列表 + */ + properties: { + + }, + + /** + * 组件的初始数据 + */ + data: { + + }, + + /** + * 组件的方法列表 + */ + methods: { + + } +}) diff --git a/components/modal/join_course/join_course.json b/components/modal/join_course/join_course.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/components/modal/join_course/join_course.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/components/modal/join_course/join_course.wxml b/components/modal/join_course/join_course.wxml new file mode 100644 index 0000000..dbfcd17 --- /dev/null +++ b/components/modal/join_course/join_course.wxml @@ -0,0 +1,10 @@ + + diff --git a/components/modal/join_course/join_course.wxss b/components/modal/join_course/join_course.wxss new file mode 100644 index 0000000..daf1971 --- /dev/null +++ b/components/modal/join_course/join_course.wxss @@ -0,0 +1,9 @@ +.code-input{ + border-radius: 10rpx; + border: 1rpx solid; + height: 36px; + margin-bottom: 24rpx; +} +lable.identity{ + margin-right: 16rpx; +} \ No newline at end of file diff --git a/data/client.js b/data/client.js new file mode 100644 index 0000000..3cb9395 --- /dev/null +++ b/data/client.js @@ -0,0 +1,182 @@ +import {Account, Course} from "./eduapi" +import {Session} from "./requests"; +import {Cookie} from "./cookie"; + +/** + * 客户端类,其method实现客户端各种操作,将接口Promise化从而使其调用更加方便简洁, + * 要在此处实现网络数据及cookie的缓存 + */ + +export class Client{ + constructor({session}={}){ + if(!session) { + this.session = new Session(); + }else { + this.session = session; + } + this.load_cached_cookies(); + this.current_user = {}; + console.log(this.session); + } + load_cached_cookies(){ + try { + var value = wx.getStorageSync('_educoder_session'); + if (value) { + this.session.set_cookie(new Cookie(value)) + } + var value = wx.getStorageSync("autologin_trustie"); + if (value) { + this.session.set_cookie(new Cookie(value)); + } + console.log("read cookies"); + console.log(this.session.cookies); + } catch (e) { + // Do something when catch error + console.log("there is not cachede cookie") + console.error(e); + } + } + save_cookies(){ + for(var cookie of Object.values(this.session.cookies)){ + console.log("client save cookie"); + console.log(cookie); + cookie.save(); + } + } + require_login(){ + wx.redirectTo({ + url: "../pages/login/login" + }); + wx.showToast({ + title:"请先登陆", + icon: "none", + duration: 4000 + }); + } + + login({login, password, autologin, success, fail, complete}){ + return new Promise((resolve, reject) => { + Account.login({ + session: this.session, login: login, password: password, autologin: autologin, + fail: error => { + if(typeof fail == "function") { + fail(error); + } + reject(error); + }, + complete: complete, + success: res => { + this.save_cookies(); + this.current_user = {...this.current_user, ...res.data}; + this.get_user_info(); + if (typeof success == "function") { + success(res); + } + resolve(res); + } + }); + }); + } + logout({success, fail, complete}={}){ + return new Promise((resolve, reject) => { + Account.logout({session: this.session, + success: res=>{ + if(typeof success == "function") { + success(res); + } + this.get_user_info(); + resolve(res); + }, fail: error=>{ + if(typeof fail =="function"){ + fail(error); + } + reject(error); + }, complete: complete}); + }) + } + get_user_info({success, fail, complete}={}){ + return new Promise((resolve, reject) => { + Account.get_user_info({session: this.session, complete: complete, + success: res=>{ + this.current_user = {...this.current_user, ...res.data}; + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); + } + }) + }); + } + register({login, password, code, success, fail, complete}){ + return new Promise((resolve, reject) => { + Account.register({session: this.session, login:login, password:password, code:code, + complete:complete, + success: res=>{ + this.save_cookies(); + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail:error=>{ + if(typeof fail == "function") { + fail(error); + } + reject(error) + } + }); + }); + } + get_verification_code_for_register({login, success, fail, complete}){ + return Account.get_verification_code({session: this.session, login: login, type: 1, + fail: fail, complete: complete, success: success}); + } + get_verification_code_for_reset_password({}){} + + search_courses({limit=20, page=1, order="all", search="", success, fail, complete}={}){ + return new Promise((resolve, reject) => { + Course.search({session: this.session, page: page, order: order, search: search, complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); + } + }); + }); + } + + join_course({invite_code, professor=null,assistant_professor=null,student=null, success, fail, complete}){ + return new Promise((resolve, reject)=>{ + Course.join({session: this.session, invite_code: invite_code, professor: professor, assistant_professor: assistant_professor, student: student, complete: complete, + success: res=>{ + if(typeof success == "function"){ + success(res); + } + resolve(res); + }, + fail: error=>{ + if(typeof fail == "function"){ + fail(error); + } + reject(error); + } + }) + }); + } + search_exercise(){} + start_answer_exercise(){} + answer_exercise_question(){} +} \ No newline at end of file diff --git a/data/cookie.js b/data/cookie.js new file mode 100644 index 0000000..aa6e1ab --- /dev/null +++ b/data/cookie.js @@ -0,0 +1,45 @@ +/** + * Cookie类,用于网络中cookie的各类操作 + */ + +export class Cookie{ + /** + * + * example: "autologin_trustie=8acaa2b09d5056c0e9d82519052276b9d4a524e9; domain=.educoder.net ; path=/; expires=Fri, 29 Nov 2019 15:32:53 -0000; HttpOnly" + */ + constructor(str){ + this.origin_str = str; + this.analyse_cookie(str); + } + analyse_cookie(str){ + this.string = str.slice(0, str.indexOf(";")); + //console.log(this.string); + let idx = this.string.indexOf("="); + this.key = this.string.slice(0, idx); + this.value = this.string.slice(idx+1); + //console.log(this); + } + toString(){ + return this.string; + //return this.key + "=" + this.value; + } + + save(){ + if(!this.key){ + throw new Error("没有键值"); + } + wx.setStorageSync(this.key, this.origin_str); + } + + static load(key){ + return new Cookie(wx.getStorageSync(key)); + } +} + +function test() { + //used to test the class Cookie + cookie_str = "autologin_trustie=8acaa2b09d5056c0e9d82519052276b9d4a524e9; domain=.educoder.net ; path=/; expires=Fri, 29 Nov 2019 15:32:53 -0000; HttpOnly"; + cookie = new Cookie(cookie_str); +} + +//test(); \ No newline at end of file diff --git a/data/eduapi.js b/data/eduapi.js new file mode 100644 index 0000000..51f3b16 --- /dev/null +++ b/data/eduapi.js @@ -0,0 +1,213 @@ +const api_base_url = "https://www.educoder.net/api"; +/** + * https://www.educoder.net的api接口,通过其实现用户与后端进行交互 + */ +export class Account{ + static login({session, login, password, autologin, success, fail, complete}) { + console.log("login"); + let data = {login: login, password: password, autologin: autologin}; + session.request({ + url: api_base_url + "/accounts/login.json", + method: "POST", + data: data, + header: {"content-type": "application/json"}, + success: (res)=>{ + if("status" in res.data && res.data.status<0){ + fail(new Error(res.data.message)); + return; + } + console.log("type of success:"+ typeof success); + if(typeof success == "function") { + success(res); + } + }, + fail: fail, + complete: complete + }); + } + static get_user_info({session, success, fail, complete}){ + let data = {school: 1} + session.request({ + url: api_base_url + "/users/get_user_info.json", + method: "GET", + data: data, + success: success, + fail: fail, + complete: complete + }) + } + static get_verification_code({session, login, type, success, fail, complete}){ + let data = {login: login, type: type}; + //@notice: type: 验证码用途 type=1=> 注册 type=2 => 重置密码 + session.request({ + url: api_base_url + "/accounts/get_verification_code.json", + method: "GET", + data: data, + success: success, + fail: fail, + complete: complete + }) + } + static register({session, login, password, code, success, fail, complete}){ + let data = {login: login, password: password, code: code}; + session.request({ + url: api_base_url + "/accounts/register.json", + method: "POST", + data:data, + success(res) { + if("status" in res.data && res.data.status<0){ + fail(new Error(res.data.message)); + return; + } + success(res); + }, + fail: fail, + complete: complete + }) + } + static attendance({session, success, fail, complete}){ + session.request({ + url: api_base_url + "/users/attendance.json", + success(res) { + if("status" in res.data && res.data.status<0){ + fail(new Error(res.data.status)); + return; + } + if(typeof success == "function"){ + success(res); + } + }, + fail: fail, + complete: complete + }) + } + static logout({session, success, fail, complete}){ + session.request({ + url: api_base_url + "/accounts/logout.json", + method: "GET", + success: success, + fail: fail, + complete: complete + }) + } +} + +export class Course{ + static create({session, data, success, fail, complete}){ + + } + static search({session, limit=20, page=1, order="all", search="", success, fail, complete}){ + let data = {limit: limit, page: page, order: order, search: search}; + return session.request({ + url: api_base_url + "/courses.json", + method: "GET", + data: data, + success: success, + fail: fail, + complete: complete + }) + } + static join({session, invite_code, professor=null,assistant_professor=null,student=null, success, fail, complete}){ + let data = { + invite_code: invite_code, + professor: professor, + assistant_professor: assistant_professor, + student: student + }; + return session.request({ + url: api_base_url + "/courses/apply_to_join_course.json", + method:"POST", + data: data, + success: res=>{ + if("status" in res.data && res.data.status<0){ + fail(new Error(res.data.message)); + return; + } + if(typeof success == "function"){ + success(res); + } + }, + fail: fail, + complete: complete + }) + } + static get_user_info({session, course_id, success, fail, complete}){ + let data = {course_id: course_id, school: 1} + return session.request({ + url: api_base_url + "/users/get_user_info.json", + method: "GET", + data: data, + success: success, + fail: fail, + complete: complete + }) + } + static get_students({session, course_id, order=1,sort="asc",page=1, limit=20, course_group_id="", success, fail, complete}){ + let data = { + order: order, + sort: sort, + page: page, + limit: limit, + course_group_id: course_group_id + }; + return session.request({ + url: api_base_url + "/courses/" + course_id + "/students.json", + method: "GET", + data: data, + success(res){ + if("status" in res.data && "message" in res.data){ + fail(new Error(res.data.message)); + return; + } + success(res); + }, + fail: fail, + complete: complete + }) + } +} + +export class Exercise{ + static search({session,course_id,page=1, limit=15, success, fail, complete}){ + let data = {page:page, limit:limit}; + return session.request({ + url: api_base_url + "/courses/"+course_id+"/exercises,json", + method: "GET", + data: data, + success: success, + fail:fail, + complete: complete + }) + } + static start_answer({session, exercise_id, login, success, fail, complete}){ + let data = {login: login}; + return session.request({ + url: api_base_url + "/exercises/" + exercise_id + "/start_answer.json", + method: "GET", + data: data, + success: success, + fail: fail, + complete: complete + }) + } +} + +export class ExerciseQuestion { + static answer({session, question_id, exercise_choice_id, login, success, fail, complete}){ + let data = {exercise_choice_id: exercise_choice_id}; + return session.request({ + url: api_base_url + "/exercise_questions/" + question_id +"/exercise_answer.json", + method: "POST", + data: data, + success: success, + fail: fail, + complete: complete + }) + } +} + +export class Ui{ + + +} + diff --git a/data/requests.js b/data/requests.js new file mode 100644 index 0000000..1c1cb4f --- /dev/null +++ b/data/requests.js @@ -0,0 +1,72 @@ +import {Cookie} from "./cookie"; + +/** + * 微信网络请求接口的封装,使其能够支持简单的cookie保存发送功能 + */ +export class Session { + cookies = {} + constructor(){ + + } + set_cookie(cookie){ + this.cookies[cookie.key] = cookie; + } + get cookie_str(){ + let cookie_strs = Object.values(this.cookies).map(cookie=>cookie.toString()); + //console.log("cookie_strs:"+cookie_strs); + return cookie_strs.join(";"); + } + request({url, data, header, method, dataType, responseType, success, fail, complete}) { + return wx.request({ + url: url, + data: data, + header: {...header, "Cookie": this.cookie_str}, + method: method, + dataType: dataType, + responseType: responseType, + success: (res) => { + if ("cookies" in res) { + let cookies = res["cookies"]; + //console.log(cookies); + console.log("request: this:"); + console.log(this); + for (var i = 0; i < cookies.length; i++) { + this.set_cookie(new Cookie(cookies[i])); + } + } else { + console.log("request.js: no cookies in this request"); + } + //console.log(this.cookies); + if (typeof success == "function") { + success(res); + } else { + console.warn("requests.session.request success is not function"); + } + }, + fail: fail, + complete: complete + }); + } + uploadFile({url, filePath, name, header, formData, success, fail, complete}){ + return wx.uploadFile({ + url: url, + filePath: filePath, + name: name, + header: {...header, "content-type": "multipart/form-data", "Cookie": this.cookie_str}, + formData: formData, + success: success, + fail: fail, + complete: complete + }) + } + downloadFile({url, header, filePath, success, fail, complete}){ + return wx.downloadFile({ + url: url, + header: {...header, "Cookie": this.cookie_str}, + filePath: filePath, + success: success, + fail: fail, + complete: complete + }) + } + } diff --git a/images/avatar.png b/images/avatar.png index 05d6370a4ba131a347da51785c9ab4ac482cd726..b8c1b3584f0b283f68ec3fdf4fb19c81850bb41a 100644 GIT binary patch literal 1210 zcmV;r1V#IaP)C0000sP)t-s0001r zii(eqkBNziii(Pgii(Sii;9YhiHV7dii(Pgii(PgiHV7ahlh!YiHeGfii(Pgii$<< zJ52xp01YG3VrG&nMyY8RHXA z01dlB;z>wj)<1X}4l|&B#}nb=u=;N@gXQV4TKP9JFvORD3@Cr)i?Es-<>L%c{X3h& z_B&RGWF2aSS^nqJ_L#6>9PAYN)ZSa#Xaa+DD!yfZ_C$*Kxjr60;*0fw9n)zQy60~I z@Xulj1L*Js`wS#e!&;2mmCe%1yi#exdw_00D%~0T#^t>=DofIs>iioi)j#}J-*EG| zDRrw}#*5YH-bH@|l8~;ssIX>vlpk0`>&Jz(!5fPRY7caO|GPeowtxTPaDD2xVCAQ% zimkZmJfJTy9`LPA85TFjEnp$vayk`Q1!2!G;FV9r6~GB|@TN#Cj4BNY{nZc~1XXIX zvWyMeucT1ws>y@6lf@p&irlDZ2TTMb@8P_YL*ugdS7IK@mRaqHt2|m56;904!Dg6xL`m6C^FS zkD&$+R~AXj33dRpq5%_j0|HX$rVq6%Tr{ro$0-T=6s$(TM?ZMGl30NR?gW{n6`myW zwz7IF^fg4R0zt&9SWVf5Ee#wVyIlA2z+)UM;W~BkKSeG$WL6`~1&tz_$s!6EzhH=> znQ||>=@BID?Q)3QfW0KDZ<7P(CTY<#4t%u{uWSzJ5E4y%Jk^k-f-0B@JdZ1IZ)f%O zVZ5r(9PS_SxPQpy{xP5X2c15_ zsMr0&Za-nl*>S(GKJeHlPW7E&F>1IJdkp=0F6{H&^Bp?3X zdwlGXykqS7spwG5IO^Np5&162jrU+vR z&gH@TqOgY60o9xW+QNG-_~~3|bx2vC*kmc87vHs%#s_P;*QwF>A`%`(=#IgxkOa4XscFylaeo-ux zcSvUJnBR2myUU&Td9)I>iW(FOA)f_@^KKBl952T>;yq1n#G6&F9sdq5yI-&-)pScq z5zId)vLEMpCGKrUqasEvSnzDz79h%JA5N`@akBD$Cm#~zcsR7)po0I5v%c^x@OE0@ zmQuJkP^QWaNSMF^OCbwLR)Ya6(xtBWPP+$mJG*}doeW|d=AiD{e9ub;UDl(Difq%Y zII~+5?tntp&`s2EXQDpLume`UA)8;tb~luD?*HP(AY@!)f*M}Fq0bW!aX_G-E&x=$ zD>ymVtNNN^iL0xL&egs#*+{OZf=Hx1Z~iQotcv^pY$0pJbcq&yClycRDq)OLMb!VJ zMQ0Hrer4d411gmOF+%s@>`9YqED=A^Q)CxW_wmwHzA2cXM(cc0sbXU?zqlT?e2($- z+FXaAjdJMclxF$ZMa7%-wg4akmv4d%FHnv1%eNtY0w1D)RG=<>v3jQY$b!1FqiUZ#$^jxiH2|a>uNvcbR&WO&tKFTYG@r0K8 za2FBt17MpMe1^#hWOrC6&WVe_2;Dc^5Q`Is=Ebw(<(8iL#)lc|xy1ocTSLFlA5j>6 zVLE{)@N%M?w=DHBZstS-OqrJ2cxvSmsGwCCTqZwJrZ=p@ zp_^{6X+7-HDR^`t3h8jS_GOM)(3n$6#!M1}OOgApQ;Vx$dCm+}g%T^#rtGxzDz=rl zS-~ZIu0w@b_^`+26ru|YPQ)dh+(91(C!x>Q=iKTgOpB(MMvjf`vp8+VkH9%3vE?l- zZpbhu&b+b(TRU$X=I;2Xz$=9;E*c{}Suq(_IRGYL@3bbL9s{rYzF3|_PHi9ooFv3b=J%ixFvz{-VBi(G725G4J+ zU@FVt0m{$T^U;!A7_0Wzn}?@App&6=bVj7L=P1TKkXvv?-IA~YS*C7$5!WIiwx+-j zH{|3XL4se;H;Y{Db;WS7p)*ZEtS{!G&~$gLqw#4Ctcc?&`thV+f^(I3jV=58xdCi} zAJKsWx>}rM#yEcbP?q}2-8In3!e><0`#476T7&Y2yL1A_I0zzeZw-*ZvjCJjCn+Ge z(`^H|%hl1-;dXk)47k=H&-noaSARETLYOI99U~cD39CbO@xen$kr*U_etR_qHjp2N zLhmmRW(B1Q)aD?q9?ehDE}*_cwo4pWaj*K_q> zNNODI*;m@B_^Qf|SVY|Yi|ej@UJ55j9iv^VEc((!)*~1Jw^QtW z5kAkjR$FEsvm5;4PPWS8?lbl4-la;`dvnmuOTyj}XZ^zIpKSwdWI}?ASCNFmg_fL* z|;X6Ry$8jhgj zv!-f;ESlqz6fjZ(jY{V)Hqhg#_&>r?v-oe0Q!`Gzy&M?{5=KBbo$8+E&s!08T2_hZ z_`+r7it1X(VtHy`*NX|y}-szylg>Cp>J*DSlavrq>Uj4;6M=c1p32UtOflMv}yCO)AJoEh4tl2MS z!EKXf3w6^g@CxJqP`ERzO0f)zgJGf=-!D%gMO`g zEqbRLTN(r~)Mt;a(%KUbrgS9_e4Q1S8>umS(2#`4_Tc%{Dtrs$+ zMN4cbXv_V?6w@u3`@2f9K~NCSQs>^e(=4tpsz>DU(&n&!IA1X=OXbCmy6%ESab4Nk zo1X(ZH-3BF-M_b@G&#$vb{tJhEz{>NV#NQgLGQu#HbFvVyxvxP3djtVaepUD7cL@d zMxM8*7v;Ki^jd|%Ylw;&l{wih(CZw zbWIrdkInlCRqU|3ip&VEzrTD?e^TH235ph4_Pn88!xg@sz@Xk;hRd;N$Nnwr9^WQ| z&UkF0a~rNlXqry{I&=dL@G^fVGtZ!WtdhSM3{(S~b8jm&YG z0!QM(fPv>VW~N`3pi{N40*XU})Y4&2ffd@TZ$^@GM&%P{7lWF->_i#?%5lqkn2lXI z*sn~1Rkrtn+*VO!!WlizyZbr`ey22XdCA=UYES4);+Y;L)nUJ4HbdLOn_#;qoE7JU zICdWo)v}K}MD(AE`zh(#634sCxe(FU=LS~251!(Uf5bxx)FIQJ3I@ZcsEk@AX6POn zM))Q46mIczDzhK30R`?=EQqtB#`+gffqN3**mFJ;r$B3nm9}D>Vc;#K*#QOl*D27p zR?PE*mBhwSl$>23nOuuI3UdoCYAZy!_~>V(Ct;g--fMN!SP#9-Qw4l+yR5$q-<*Z~ z;$GI6$yp~BvL_ud0D32|VWt_)F=~qj9AfX)C_SGx;y=g3C95xWVTE(3e@qAP4xET;WEceymR@Ab_z6kqFkhdZRipv><4< zndxTx<=kBGNRtn${mNeeem*qw;uIaLr^}3_hm!!7atRA|Tk=CsrazO;p!>Ys(Ci&) z(~%#Z{uca~(MujnGP z#sV(>shXU{SNgBYG_|Q`lEkO2=8+H1Euqb2P@pO)MPfv_S5 z&Jb#Gm)kz@7iJQ)2*!IAvO|QwFh0y(_eC*6Q~nNO zZGjV^QA18g!(u)q+?x7^=>(Z1XO31W+J~KMtyM-Ue zR3_WH``IU7O&|Y#CHjV>G_sAN?>nFb-=u~l^e{{Ejibdx!Dua&?e94C_`noh-^Hb3 zqd7`fsUP-X3}JN#6N07Nr@8JL;LpPEm{K2`U--LDL*@o-I?(Q?P`-v_`Wd=?+O zm>DZdCOtj5AdFfxQaxerlzZRT&BjP-Z#t>1>)w&h?g8}Y<9%3)V!A32Pb$ZyKh>oh6L zw(;A^Oa-gJ{bdO3zpiKC5yN!qpP{NlN8dfI@58VPn08fMuP z`7ZlcsWBPau@UTh8I+&i3k0Hupvr9)b1HmJOdY)&d;UfilQJxo%Sm*8w5$Z@l{*YO z_K)^!w7Y!jMp}GycgwRWD?BA%xhK4n)= zG{j7Cbr8sOf#93#pp1^=c3(6=prkpkB zeCUkE`H*F5F)h-B=3H+odKIEC=MtZWb&3Z0a#HX#nYvW2+MArr+Lsw;BXVhSXO*y# z#ka#+UYvx_Hz^1Yqwq!!l|M9%U{%+lZ2ZQxr>G$rHKTVjL zTbQkb1?H8Wd~x>5rZGr$*Aj1fJ_ITFUSrjknDnu(Jo{zoeht(8Zsu{%F4{3*sh4<= z*UJrSgpF*5ja3^sf=YRTi_%IAri_be>iPJ>xN^iY=nCUyd=v2{_J=+qoM)4|*y^fI@740b+ zG}_d@$(lp%kz=0-3SF79KN!-&5(pH55pU*zb`5@#_T~a*%Pn5@mlDNz=fs;D(${>8 zIMoEUfpk1QdnBE@Klo<#m^Q-uyiM-q0sh|zz*o{&4gF>RYUxU)#?<*53M90fLg`Yp z#w_FH=vMX2%PN5-XBJ@N9;dIoY22V}PLr(ga>ZK`dh{~KSFIL~eHrDx^c!@Q?_2px zn&N)@Sh#;1;;u2WI)>z1*^6oHaxY0Dog3>MQZe@*bZNb8=@U8^;22v@Bv+PDa`pqh zl?dv9HNdA^;pmZ2*&F}V&~oa8sZ>K_YV9k$PW()#vLZhWcC0Ql@(>N*R+8(I3;BO` zvaD3|)$?^@gNz4rSRU1h(6sITF{oq3s^@Fsf|ri*|IrqLg0o7`%WxBS^c9&W%8fa+ z5GqnKUk(;#%y*F~6`lK}ku?Py&AVI7uc3PNOoXV(Yu-Yww9gHO_2*@^L&L<}lykB5 zI(wivg%Ib`V)U4j$JQmY|7}=um&9ik-AxCxVUf2ICZeA;y2hKGIR$iGyJ9;8UKot8 zj4`K+z1d|yI%WF8SXYPo+@#u5@XJF#vN%AH*!cosU#;70E0i;seVKtY35k&GfzP#IdLvr-U85$>AEqoKq+^VokGFtTf=%HtdG7<^#(GxK%QT!W=2MW&%a1WWKQ#1^GqeC0T19IY{>96 z^s4e}mAc9<4Mi8fyMs?LICDEJNB4{`S>c}7C(b%wVUNCoIcYKjPr5D0g;5$Gw^E<_ zX+v|?8MemE+@4dRb~eCDNZ*TRGrPM4_BvG*F?DXRbcuE+QHk72+w z(SkgaDFUF_FcS$J@7{a(wIVAQUmHB@Q)}!Hkd)kvs}goGXkuZG8;%DUvqbmJt9RM~ zzg$3^vz7M$+#|V^HaWg`kHM^|>+W+Z1T8d?eqW7?z66@rRle>YLEQ1``eqRaec0Xp zaoH0S9K4%lFo@y32g!PCDN&C1%9K{S)g>1#cR&10CU}JbnelAl+%MK}#Z$?TcAQ7{ zu{8*78?TL!b{nhHJxP+Te39;C4duw{y?0#vlHV*vF#hzWVl{(!@08V`FIP|jyF3p; ztftLNU1>yToVMXqL4_&%&IC&}MXX~ez^kDX;{z?x9jy~YCzO_`e*rmcM0eSc3l z*HtfZ6G!}-W}TQO8|p31>+-`=+*3=j{&bKL#+AU*Pt!! zM1}B5v7>a}O5o|Pawp3tt%=_M#q@52xF;Hc-DzlG%Cj^zPdG*&6bXb^Ox%z#A-m<|?y(C2! z>1rL>3z+-M?wdB!oU8&A)DMoYRep!V9uq=ZeK)8r9I`~l7vRk;1tt$KR$BtjI;&jT5po7n>6?tKAcy)VV)E-u*Tx~~%lnIuD# z7^%r->|FV_B`dNyxJ0muFkVdwPwe;Ylms2-@c%lejcVhcvA-Xk`IZB3tMy#E+`oJK zp~~(C6{UK9Uimx5k2nY>N22D@B0iTsjAw8^|DD~rd~YVJ3 zjk0Xib`=PIp#uZ%L7Qp4LA$0%Z$z7i`>@XdJH>G70~0gHxuUV~#eA8*)!d3U&>Qjn z(4M{f5zCs^$VX+Z6>&$&#jkxu)P%T2=`dRLUWwUh1Q=UoMHu@;xq6|&N&QN>9Q=qn z4==>`-GAy}8c=z#c4LK-w@8VdTqOnuUUnKSk8hUDdEPT>W~uQ^cpI?Ceg>L7c(iL> z*OC?25g)RC5HANNidgYkuHp0JDs7aTh&p+<1W(8%(mmcYFtz>qGs zm#lWIRe8gX3rmO3IFyP&?NY|r#slxDIrfc!??W%RdRGW|oj4Bq6;X`%P^HD)^*-&b zB`1ARPS-fGCl%suSh3L41ECVf`cw){Osk|g#b|Sa2{U2pUAP0#tJ>zTHZnLjTEc}5u zDEWw;CxIYbOvPrY?#|+)WXYF|ojMtg)_hk?cD{?O z#jqUA_`{aIQomCP#znS9Ds6!k zRwVHpA;jqy1!wRRXRYnseOlICq(KP#ZD6Tdp?mew-4A?BvHx77R!6MVud5c+G7MF6>(P{mRL_&AX3=^xiwBKS1{KTE4V7OhrGh(^UA+sKYb;~gA;zgG><39D@adptGxsx*w)8sImv8&S&A&bcNp_=>qL z>ljEiC|m~Ei7(urgYus+?VpJTiy;oOKqPCtz^wIeLTaVi}MDhoCm z85#V7<>7I|^sKd-w>QyGTKSDO==U-iRsuhdu{tMl_;DiST%hr68!1N=s1|)7)cH<7 z=O1dFm@KCqgzK=uzEH3zFuEvg-xWLRy9xq}PP!)N>JT1{j7lYcoTHem-HAjHF@5ho z=(Ca);Ky5YpKo`RcRgc^4OCY1p8NXs^hFXJb!6u|rHZ?!i|klW5s@3$wiijlcwd5g z;zNQeQtOfcZw=W)kzEbF4upK64d_rF>lxjbY;AmEH@T=VV?i!pA_t$LUD}zdQ}ar` zI;L1A$_XYQMa-=j({4w71VO`Ur~B0LcVCw6Ad)c&pi5>Qxs!R3tinjD2pcqy^R3Oz zD^TvXp*KHd%7*Kq*{=}R=*zv|+>&t^AQkexKK5^Q`Bpe=8{DR-)wAG+wXDYzf39$D z{={bgc{pvQ3)0bx-v0Y9-^{Vg(>aAKkMFx*kYnBUG1BK6bCS0{!}pW>QG(H zV?G8~6)N9FV4HLdEOFX~wDe697NsZaT{5E^GqQ1QcFDpkGmK@Uh}cC0^v#9 zQQfXS?VLwut))1WsUY)>$;FdI)sh-GF>%p3E*5jTN;P!Gku;XCgedOu=I5%s*0cI2 zRo^Abt9QmQg-XA-v@?Vx z{OWpLO(0Sb)ulpKipm%5Ss%KUixyM17uBNE$+^qOl5`Ak20svrs`IiNl1;S4R zE7Sj?NYM~KebFEWxMUL|^!@BRfi!WFf!dVsw^Vd?*B(t(xSsgJ9CKLuM5XSUSL;RK z`AV4R>$+7odUneI1te~|E!c3fV6mNc#d&F^$A4!MZZn6jps7y^t!i`uuQJ^nwp^0V zZX4nCX*_vjzacVmkRR6xQiHtMg#>N?A+@;4{dbrjXo{=-k6}*0)-pa8Hs!0^7vV}X z%g$M7gH zQ{@FD3L<&D3J2}v5~B_;UoIckExqyZBIy$~xiBgyS|^OSsg(Yv1E(HgB^ zL_l)Z#^1uZp%_-bkcI*t?p6?${fto8K&tr>Sp1t1mn?1maJOc(vyc9HYk^T;4`bnB zzKyw5w!io)SFeH(zl}#OK?KB6;U}vs6%(=`j}iW7^fy2sN*`3hJgt$e?TK|y`G3Dk z(?J?%&_rlk5gu82QhJQWV?vT+!>ojd3X&}*EKSyLnzCa9N>DF6KGG>+EUou#~U9e_olUS_Ypk1AM%zcDI-Siv16g_EEg`lG;X$~22n)YzR?|3qfcv( zj&`d2ASLKP4lF!2CapuscQQMyJ>`#cvhh39llMo2T`MM$mh^1rCpCpbnd9S zqOduzQXm0J(I$jP(kcQ?{Zjygi}m&eq0srccc^Paxx0ocJ)R#3eAP15)7a6;9{{>YB_c`rb>(+hm-`x zNS)(K>4NLAh6=GjPp17dc33(AIu9Nonf@O22h^$9NK;`)8lUf>7f zCSO1K{@k@04Ny7SHt^jtZ#=HxNH>hY=OoW3Ud(Bs`Y6N8kWQ*?j*YymZSt2!+b)PY zH)ak6k1cAQH;9!JA5R|XI>K)i`^=w-6#Uem4`B#S9Wcd@5hy`FZk{!yMRPG%Ey4|= zX5^VWXm@ytZ$kh~w*^HCL0v5rjQ`646u%2(7*zxf$(VFol2_156A1%#tk<=+sPP0m z-D%(EF$Q8jWnTW%A^<+T0})aLJ}$2h4Ze2J+Jw9dHj9CerrR3482FB=WP-twbtDii z%WNdU^QkIxNGFus^E2i_NV@XA4!8Nc_b91B@}wyA2zJu=Qt1Tl6A-lz%PbeVsqZIf zYL7e?$`BJ|xQ%B=JtFi8Z0sT;K*<%pp%O*(NSd&1EktNtg-cf`D?g|N@iwynsVf1YUxzWYwHuCxC0i$ z^HF_g*F9oUBvuzG-F1P*_}M;ZDVh>u#6YD1#D#NzYDmvp(A~CrFr)0*TR%y$~+`7r~=*BOP$cN*+MYS{#a^`yzARBJA4;Rp;1|MP-NG!T+2jJN?p6t=))DX#wz1|P+UW%IEt8y-4@&)l}u zq8cY$NJ0evIq>OrBEw7FN``I&YRo-dd|l3}ut7n!?wCHe4+K7>pvn1Z*W z?Cp@2qYHM^QwxlmzLtM>*~QU^l98?c#j<<5qnX`0 zI}_$X!*SJijUxj6i>!sOR->SpPM9q*yDn?S_huA9J@$7d-q+YkUS9RLj+TN@RnRpf zz~84_0#Rv%wiARdIbJl+zNy;aZODpwK$R}bukxC|xaDHq0+=@tBD>XkZNXM<_b3-4 zyLjurpP>izaEAFI1Y0|_Tbx(DE<1xVIXTo*aDykbTlLG8 zkMdaUMgNYm|2vb%`U~YoKK(E~s}_I)wE&F>1IJdkp=0F6{H&^Bp?3X zdwlGXykqS7spwG5IO^Np5&162jrU+vR z&gH@TqOgY60o9xW+QNG-_~~3|bx2vC*kmc87vHs%#s_P;*QwF>A`%`(=#IgxkOa4XscFylaeo-ux zcSvUJnBR2myUU&Td9)I>iW(FOA)f_@^KKBl952T>;yq1n#G6&F9sdq5yI-&-)pScq z5zId)vLEMpCGKrUqasEvSnzDz79h%JA5N`@akBD$Cm#~zcsR7)po0I5v%c^x@OE0@ zmQuJkP^QWaNSMF^OCbwLR)Ya6(xtBWPP+$mJG*}doeW|d=AiD{e9ub;UDl(Difq%Y zII~+5?tntp&`s2EXQDpLume`UA)8;tb~luD?*HP(AY@!)f*M}Fq0bW!aX_G-E&x=$ zD>ymVtNNN^iL0xL&egs#*+{OZf=Hx1Z~iQotcv^pY$0pJbcq&yClycRDq)OLMb!VJ zMQ0Hrer4d411gmOF+%s@>`9YqED=A^Q)CxW_wmwHzA2cXM(cc0sbXU?zqlT?e2($- z+FXaAjdJMclxF$ZMa7%-wg4akmv4d%FHnv1%eNtY0w1D)RG=<>v3jQY$b!1FqiUZ#$^jxiH2|a>uNvcbR&WO&tKFTYG@r0K8 za2FBt17MpMe1^#hWOrC6&WVe_2;Dc^5Q`Is=Ebw(<(8iL#)lc|xy1ocTSLFlA5j>6 zVLE{)@N%M?w=DHBZstS-OqrJ2cxvSmsGwCCTqZwJrZ=p@ zp_^{6X+7-HDR^`t3h8jS_GOM)(3n$6#!M1}OOgApQ;Vx$dCm+}g%T^#rtGxzDz=rl zS-~ZIu0w@b_^`+26ru|YPQ)dh+(91(C!x>Q=iKTgOpB(MMvjf`vp8+VkH9%3vE?l- zZpbhu&b+b(TRU$X=I;2Xz$=9;E*c{}Suq(_IRGYL@3bbL9s{rYzF3|_PHi9ooFv3b=J%ixFvz{-VBi(G725G4J+ zU@FVt0m{$T^U;!A7_0Wzn}?@App&6=bVj7L=P1TKkXvv?-IA~YS*C7$5!WIiwx+-j zH{|3XL4se;H;Y{Db;WS7p)*ZEtS{!G&~$gLqw#4Ctcc?&`thV+f^(I3jV=58xdCi} zAJKsWx>}rM#yEcbP?q}2-8In3!e><0`#476T7&Y2yL1A_I0zzeZw-*ZvjCJjCn+Ge z(`^H|%hl1-;dXk)47k=H&-noaSARETLYOI99U~cD39CbO@xen$kr*U_etR_qHjp2N zLhmmRW(B1Q)aD?q9?ehDE}*_cwo4pWaj*K_q> zNNODI*;m@B_^Qf|SVY|Yi|ej@UJ55j9iv^VEc((!)*~1Jw^QtW z5kAkjR$FEsvm5;4PPWS8?lbl4-la;`dvnmuOTyj}XZ^zIpKSwdWI}?ASCNFmg_fL* z|;X6Ry$8jhgj zv!-f;ESlqz6fjZ(jY{V)Hqhg#_&>r?v-oe0Q!`Gzy&M?{5=KBbo$8+E&s!08T2_hZ z_`+r7it1X(VtHy`*NX|y}-szylg>Cp>J*DSlavrq>Uj4;6M=c1p32UtOflMv}yCO)AJoEh4tl2MS z!EKXf3w6^g@CxJqP`ERzO0f)zgJGf=-!D%gMO`g zEqbRLTN(r~)Mt;a(%KUbrgS9_e4Q1S8>umS(2#`4_Tc%{Dtrs$+ zMN4cbXv_V?6w@u3`@2f9K~NCSQs>^e(=4tpsz>DU(&n&!IA1X=OXbCmy6%ESab4Nk zo1X(ZH-3BF-M_b@G&#$vb{tJhEz{>NV#NQgLGQu#HbFvVyxvxP3djtVaepUD7cL@d zMxM8*7v;Ki^jd|%Ylw;&l{wih(CZw zbWIrdkInlCRqU|3ip&VEzrTD?e^TH235ph4_Pn88!xg@sz@Xk;hRd;N$Nnwr9^WQ| z&UkF0a~rNlXqry{I&=dL@G^fVGtZ!WtdhSM3{(S~b8jm&YG z0!QM(fPv>VW~N`3pi{N40*XU})Y4&2ffd@TZ$^@GM&%P{7lWF->_i#?%5lqkn2lXI z*sn~1Rkrtn+*VO!!WlizyZbr`ey22XdCA=UYES4);+Y;L)nUJ4HbdLOn_#;qoE7JU zICdWo)v}K}MD(AE`zh(#634sCxe(FU=LS~251!(Uf5bxx)FIQJ3I@ZcsEk@AX6POn zM))Q46mIczDzhK30R`?=EQqtB#`+gffqN3**mFJ;r$B3nm9}D>Vc;#K*#QOl*D27p zR?PE*mBhwSl$>23nOuuI3UdoCYAZy!_~>V(Ct;g--fMN!SP#9-Qw4l+yR5$q-<*Z~ z;$GI6$yp~BvL_ud0D32|VWt_)F=~qj9AfX)C_SGx;y=g3C95xWVTE(3e@qAP4xET;WEceymR@Ab_z6kqFkhdZRipv><4< zndxTx<=kBGNRtn${mNeeem*qw;uIaLr^}3_hm!!7atRA|Tk=CsrazO;p!>Ys(Ci&) z(~%#Z{uca~(MujnGP z#sV(>shXU{SNgBYG_|Q`lEkO2=8+H1Euqb2P@pO)MPfv_S5 z&Jb#Gm)kz@7iJQ)2*!IAvO|QwFh0y(_eC*6Q~nNO zZGjV^QA18g!(u)q+?x7^=>(Z1XO31W+J~KMtyM-Ue zR3_WH``IU7O&|Y#CHjV>G_sAN?>nFb-=u~l^e{{Ejibdx!Dua&?e94C_`noh-^Hb3 zqd7`fsUP-X3}JN#6N07Nr@8JL;LpPEm{K2`U--LDL*@o-I?(Q?P`-v_`Wd=?+O zm>DZdCOtj5AdFfxQaxerlzZRT&BjP-Z#t>1>)w&h?g8}Y<9%3)V!A32Pb$ZyKh>oh6L zw(;A^Oa-gJ{bdO3zpiKC5yN!qpP{NlN8dfI@58VPn08fMuP z`7ZlcsWBPau@UTh8I+&i3k0Hupvr9)b1HmJOdY)&d;UfilQJxo%Sm*8w5$Z@l{*YO z_K)^!w7Y!jMp}GycgwRWD?BA%xhK4n)= zG{j7Cbr8sOf#93#pp1^=c3(6=prkpkB zeCUkE`H*F5F)h-B=3H+odKIEC=MtZWb&3Z0a#HX#nYvW2+MArr+Lsw;BXVhSXO*y# z#ka#+UYvx_Hz^1Yqwq!!l|M9%U{%+lZ2ZQxr>G$rHKTVjL zTbQkb1?H8Wd~x>5rZGr$*Aj1fJ_ITFUSrjknDnu(Jo{zoeht(8Zsu{%F4{3*sh4<= z*UJrSgpF*5ja3^sf=YRTi_%IAri_be>iPJ>xN^iY=nCUyd=v2{_J=+qoM)4|*y^fI@740b+ zG}_d@$(lp%kz=0-3SF79KN!-&5(pH55pU*zb`5@#_T~a*%Pn5@mlDNz=fs;D(${>8 zIMoEUfpk1QdnBE@Klo<#m^Q-uyiM-q0sh|zz*o{&4gF>RYUxU)#?<*53M90fLg`Yp z#w_FH=vMX2%PN5-XBJ@N9;dIoY22V}PLr(ga>ZK`dh{~KSFIL~eHrDx^c!@Q?_2px zn&N)@Sh#;1;;u2WI)>z1*^6oHaxY0Dog3>MQZe@*bZNb8=@U8^;22v@Bv+PDa`pqh zl?dv9HNdA^;pmZ2*&F}V&~oa8sZ>K_YV9k$PW()#vLZhWcC0Ql@(>N*R+8(I3;BO` zvaD3|)$?^@gNz4rSRU1h(6sITF{oq3s^@Fsf|ri*|IrqLg0o7`%WxBS^c9&W%8fa+ z5GqnKUk(;#%y*F~6`lK}ku?Py&AVI7uc3PNOoXV(Yu-Yww9gHO_2*@^L&L<}lykB5 zI(wivg%Ib`V)U4j$JQmY|7}=um&9ik-AxCxVUf2ICZeA;y2hKGIR$iGyJ9;8UKot8 zj4`K+z1d|yI%WF8SXYPo+@#u5@XJF#vN%AH*!cosU#;70E0i;seVKtY35k&GfzP#IdLvr-U85$>AEqoKq+^VokGFtTf=%HtdG7<^#(GxK%QT!W=2MW&%a1WWKQ#1^GqeC0T19IY{>96 z^s4e}mAc9<4Mi8fyMs?LICDEJNB4{`S>c}7C(b%wVUNCoIcYKjPr5D0g;5$Gw^E<_ zX+v|?8MemE+@4dRb~eCDNZ*TRGrPM4_BvG*F?DXRbcuE+QHk72+w z(SkgaDFUF_FcS$J@7{a(wIVAQUmHB@Q)}!Hkd)kvs}goGXkuZG8;%DUvqbmJt9RM~ zzg$3^vz7M$+#|V^HaWg`kHM^|>+W+Z1T8d?eqW7?z66@rRle>YLEQ1``eqRaec0Xp zaoH0S9K4%lFo@y32g!PCDN&C1%9K{S)g>1#cR&10CU}JbnelAl+%MK}#Z$?TcAQ7{ zu{8*78?TL!b{nhHJxP+Te39;C4duw{y?0#vlHV*vF#hzWVl{(!@08V`FIP|jyF3p; ztftLNU1>yToVMXqL4_&%&IC&}MXX~ez^kDX;{z?x9jy~YCzO_`e*rmcM0eSc3l z*HtfZ6G!}-W}TQO8|p31>+-`=+*3=j{&bKL#+AU*Pt!! zM1}B5v7>a}O5o|Pawp3tt%=_M#q@52xF;Hc-DzlG%Cj^zPdG*&6bXb^Ox%z#A-m<|?y(C2! z>1rL>3z+-M?wdB!oU8&A)DMoYRep!V9uq=ZeK)8r9I`~l7vRk;1tt$KR$BtjI;&jT5po7n>6?tKAcy)VV)E-u*Tx~~%lnIuD# z7^%r->|FV_B`dNyxJ0muFkVdwPwe;Ylms2-@c%lejcVhcvA-Xk`IZB3tMy#E+`oJK zp~~(C6{UK9Uimx5k2nY>N22D@B0iTsjAw8^|DD~rd~YVJ3 zjk0Xib`=PIp#uZ%L7Qp4LA$0%Z$z7i`>@XdJH>G70~0gHxuUV~#eA8*)!d3U&>Qjn z(4M{f5zCs^$VX+Z6>&$&#jkxu)P%T2=`dRLUWwUh1Q=UoMHu@;xq6|&N&QN>9Q=qn z4==>`-GAy}8c=z#c4LK-w@8VdTqOnuUUnKSk8hUDdEPT>W~uQ^cpI?Ceg>L7c(iL> z*OC?25g)RC5HANNidgYkuHp0JDs7aTh&p+<1W(8%(mmcYFtz>qGs zm#lWIRe8gX3rmO3IFyP&?NY|r#slxDIrfc!??W%RdRGW|oj4Bq6;X`%P^HD)^*-&b zB`1ARPS-fGCl%suSh3L41ECVf`cw){Osk|g#b|Sa2{U2pUAP0#tJ>zTHZnLjTEc}5u zDEWw;CxIYbOvPrY?#|+)WXYF|ojMtg)_hk?cD{?O z#jqUA_`{aIQomCP#znS9Ds6!k zRwVHpA;jqy1!wRRXRYnseOlICq(KP#ZD6Tdp?mew-4A?BvHx77R!6MVud5c+G7MF6>(P{mRL_&AX3=^xiwBKS1{KTE4V7OhrGh(^UA+sKYb;~gA;zgG><39D@adptGxsx*w)8sImv8&S&A&bcNp_=>qL z>ljEiC|m~Ei7(urgYus+?VpJTiy;oOKqPCtz^wIeLTaVi}MDhoCm z85#V7<>7I|^sKd-w>QyGTKSDO==U-iRsuhdu{tMl_;DiST%hr68!1N=s1|)7)cH<7 z=O1dFm@KCqgzK=uzEH3zFuEvg-xWLRy9xq}PP!)N>JT1{j7lYcoTHem-HAjHF@5ho z=(Ca);Ky5YpKo`RcRgc^4OCY1p8NXs^hFXJb!6u|rHZ?!i|klW5s@3$wiijlcwd5g z;zNQeQtOfcZw=W)kzEbF4upK64d_rF>lxjbY;AmEH@T=VV?i!pA_t$LUD}zdQ}ar` zI;L1A$_XYQMa-=j({4w71VO`Ur~B0LcVCw6Ad)c&pi5>Qxs!R3tinjD2pcqy^R3Oz zD^TvXp*KHd%7*Kq*{=}R=*zv|+>&t^AQkexKK5^Q`Bpe=8{DR-)wAG+wXDYzf39$D z{={bgc{pvQ3)0bx-v0Y9-^{Vg(>aAKkMFx*kYnBUG1BK6bCS0{!}pW>QG(H zV?G8~6)N9FV4HLdEOFX~wDe697NsZaT{5E^GqQ1QcFDpkGmK@Uh}cC0^v#9 zQQfXS?VLwut))1WsUY)>$;FdI)sh-GF>%p3E*5jTN;P!Gku;XCgedOu=I5%s*0cI2 zRo^Abt9QmQg-XA-v@?Vx z{OWpLO(0Sb)ulpKipm%5Ss%KUixyM17uBNE$+^qOl5`Ak20svrs`IiNl1;S4R zE7Sj?NYM~KebFEWxMUL|^!@BRfi!WFf!dVsw^Vd?*B(t(xSsgJ9CKLuM5XSUSL;RK z`AV4R>$+7odUneI1te~|E!c3fV6mNc#d&F^$A4!MZZn6jps7y^t!i`uuQJ^nwp^0V zZX4nCX*_vjzacVmkRR6xQiHtMg#>N?A+@;4{dbrjXo{=-k6}*0)-pa8Hs!0^7vV}X z%g$M7gH zQ{@FD3L<&D3J2}v5~B_;UoIckExqyZBIy$~xiBgyS|^OSsg(Yv1E(HgB^ zL_l)Z#^1uZp%_-bkcI*t?p6?${fto8K&tr>Sp1t1mn?1maJOc(vyc9HYk^T;4`bnB zzKyw5w!io)SFeH(zl}#OK?KB6;U}vs6%(=`j}iW7^fy2sN*`3hJgt$e?TK|y`G3Dk z(?J?%&_rlk5gu82QhJQWV?vT+!>ojd3X&}*EKSyLnzCa9N>DF6KGG>+EUou#~U9e_olUS_Ypk1AM%zcDI-Siv16g_EEg`lG;X$~22n)YzR?|3qfcv( zj&`d2ASLKP4lF!2CapuscQQMyJ>`#cvhh39llMo2T`MM$mh^1rCpCpbnd9S zqOduzQXm0J(I$jP(kcQ?{Zjygi}m&eq0srccc^Paxx0ocJ)R#3eAP15)7a6;9{{>YB_c`rb>(+hm-`x zNS)(K>4NLAh6=GjPp17dc33(AIu9Nonf@O22h^$9NK;`)8lUf>7f zCSO1K{@k@04Ny7SHt^jtZ#=HxNH>hY=OoW3Ud(Bs`Y6N8kWQ*?j*YymZSt2!+b)PY zH)ak6k1cAQH;9!JA5R|XI>K)i`^=w-6#Uem4`B#S9Wcd@5hy`FZk{!yMRPG%Ey4|= zX5^VWXm@ytZ$kh~w*^HCL0v5rjQ`646u%2(7*zxf$(VFol2_156A1%#tk<=+sPP0m z-D%(EF$Q8jWnTW%A^<+T0})aLJ}$2h4Ze2J+Jw9dHj9CerrR3482FB=WP-twbtDii z%WNdU^QkIxNGFus^E2i_NV@XA4!8Nc_b91B@}wyA2zJu=Qt1Tl6A-lz%PbeVsqZIf zYL7e?$`BJ|xQ%B=JtFi8Z0sT;K*<%pp%O*(NSd&1EktNtg-cf`D?g|N@iwynsVf1YUxzWYwHuCxC0i$ z^HF_g*F9oUBvuzG-F1P*_}M;ZDVh>u#6YD1#D#NzYDmvp(A~CrFr)0*TR%y$~+`7r~=*BOP$cN*+MYS{#a^`yzARBJA4;Rp;1|MP-NG!T+2jJN?p6t=))DX#wz1|P+UW%IEt8y-4@&)l}u zq8cY$NJ0evIq>OrBEw7FN``I&YRo-dd|l3}ut7n!?wCHe4+K7>pvn1Z*W z?Cp@2qYHM^QwxlmzLtM>*~QU^l98?c#j<<5qnX`0 zI}_$X!*SJijUxj6i>!sOR->SpPM9q*yDn?S_huA9J@$7d-q+YkUS9RLj+TN@RnRpf zz~84_0#Rv%wiARdIbJl+zNy;aZODpwK$R}bukxC|xaDHq0+=@tBD>XkZNXM<_b3-4 zyLjurpP>izaEAFI1Y0|_Tbx(DE<1xVIXTo*aDykbTlLG8 zkMdaUMgNYm|2vb%`U~YoKK(E~s}_I)w1b2tQ-GW2rh#|Ab}7vxI=)! zEd+bye)o63_s6@h*XpjS?z8vV=hRuXdUbW8o{kzmfChkuhK8@9u59qoUOb#9I9LzY zh-itWhlbiu#njIb;^-F$@&ThMI6&;cOd1{_C$Iq+R!NH;~E2K^ABtsx7GPr37|%Q4jF} z8;0l@*@w8U#TEj;J13;Z8Z zrrLT;N)R6~lPJF!pS_TX1e3TVzmTY;gz!^dCSgG#F#$nI0imaSf~O#eQB z58iwn9Hk7DRsZelVI&K5_Ve?S5)cRs4CD_K;fMG*2?$9_N(u-H3kVDIJy`Jh27CH} zg7`drS^i;A2K(CkxOn-wKs=fLGJ@1cdkn z|AzFBp|=UaVAa^7f%OBpfA_IFxuKu8lJv>AWwU+hO#X1fra12 z#X(9%Tt!4wRYF``R9IO^NJTBQcJ`fM4e}ygO^53?_Av83`5e;Ppqo6sI6>dkC{hx@5K<eIqt#R$q0{(kv+bV`Fj{ z?kMNfbsM_89bSCdS-*UE5hk^K!u#`F?mApt7~rI5Wwl5*Qg3U~BNpvJFi-XZ(+zVT zrxsDW_+KV&WAEVP_r%8p>QcvS?t~5abUaw0CxNyiw)KLs-{il| z7=t)e`ac|6*~;23+RB2}>D9u}L&-0IC>wY#(KRy=X_QXMhhr7rsyP# zjmGmy>m3}q2}^mA2#|g*~sUDbSrNn z!9lwDPVVbmY!L+){zc&^_)hMzBAJi@<}5FIV?R&A^O=ug&FQ(_Di%*-DS zWM9Y!L3K;U{ZFYaMOCNzM1?P_Tap;C^ zuFNn*V-&v;8iNy}#rjfYsp5%>&#@HBC?PZpFz=zz7*>V2vlDK|F<|u#lGBXa9$Pmb zHcD0*UllvNU#cv9QC>n4Am>gXK{8)E4y6L*fu)9mc$UUtLr^+Xmd?ux?{?Jv|v2{qNp)zTB>{X}|FDaXtMFK=CZQb?#{El6Xd(H_Eg~ ztret;6xnAU*SZiJY_|_|Mi|MVw$Xx5ZAuUX0dnKvJ8xhRK+@aKS$&pLkRl)TX}*l- z2KqdTJ#ui9-d-ys_kd!y^n}bG{=6wP?K}?Gw(dAR}fYnmR zn;Ie2GI!3>6b7O|5#)3=y;5y*b@ibrO^LxOR*;^nNW%39XJWgsU8x-Ph}A=s_P@wP zy{mw%t{2mvYpTgpqZDY=T+?o~^cfR36v&$p-l!z&b|3)HHIta=JVKqF%8JvlA6=ID z08Dgw)(^0FyzE_UUS`U@79&S=8BcUMpO|m2H0_ZtLttSN{5FC4;PDWlIt;GAf}gzo z&d$)|rONYOo`JMid+ltBNT2i9zPt2I`{Y8{i`Mc46D9-Z$TgbZjH(b9uGi7EwrP>q zd;P6L3;=2UdGicG6lVL6Ekbh(@*&cs&QA>F#;oL_M#jeB`W6<~A?_jWxKQ!I{^7J% zMg7N~Q4|-6v2bvMd&eZXS8No|CaF7b}K5L5__%V`U>wdK!keYcFD0chP%#|0L0igi|T_bloz2 znnF}CgeD}wEuX7_?~Lx{gJhKkYH>8CMW%vUrh*hOMh61m`2|GH62{$wRrR4wtMcWE z*V3B>KwDlH&Rxp|USbYxZ!^}-#_Fr^v#6>5s`?wI@A8@|fzdy>FUcN7u7w+EPcHqPGim6q)i*zl07-51&{dO-4;r73lI`!D^6<%RmQc!Xoh^ikbZzd~+bjduj7|bc)aWFN_1_cevB7eBt zFHhf0d9w=KpZ0ciJ;8kQ*fTRV%8IaymoGYB;gz*Xi&dCG>-ry`5I5_guw@KN2?(R4 z_X{0{9h?29>xE{^?4`=<%yj&NVa%Pw*)H|jIK^Lp+q z8o|=_f_8Xdzj8AGoxN5}RX>P351`!>|y@`AL` zQ}4VJUR^(z7PE+}WkKs|t?^;cdt%GthvLJ5{Iq8pc^~k+ z8tUthJ?B2*GaVixth1`5zP5MoIT6xgsu%JTh039;i4jMB51`z$T`d`n-y}n_(wtn` zKU;W0GEJ$ZA@AzXnW}0(u+QkVTJ)@pj_#?#COb|13wlsH4)N?YS>yRp;;|+7ck5?e z-J;Ov{)Mj@3IoqB$=x8D7RlyZ=W^JCeXKGc&PaBi0<40}>C)ONc1@Q)F0GtOD{kUamXN=A8T=L^L9_iOU!9YqQGNkM!SMc*m^Oi^NY zM~3t55hiKUzt75DR(*|4oAeP~fAHD^H@~mWGi$d28*tGvWkXzotsltx)$ETXgVkaK za)QrTv4r3grz^|plUSf8d}PD}R7G}OVz4D@Vp`X~4(3rUNl=7n^D{uMoCGpgUkV~9 zmRAb-DBovZ%s~^*XKH!x*}vM*Q9GoCE2w8mKEEnYz=>-;YRAO0kSU`hGbp)$wRS2J zZwVIAEr@g!*B{U;KUfZ*OMOHJ$0@Fsy&vw(V0N<4sYhg?(+$O1R$GChVRq1TL3If# z_CL>(_HR)Q!HGZs&v%ogDvDTyBSd?`ioOK<`4u87`mQ@gy(CC+r|4~887G;`4ad&| z;scdO=owZ1V-(HD6knQ?^{g&qtmArK>s>)T3^KAOZU^{e9rqpbKFFSN2EJ~KSv{cMs zwZmdj$EEtnYIR)yEO)HOxlGxBVPIDz>zMJ5o>Q&Qg?WzkxW-tb;yQ(XLAto0Kp! z;|&V`!iZ7Dl%DKb@r)9R5O9b zwCe~`DPH$tdK$EGL;JNWzx0qX+gUgVTq}m4qUk)}mQ?(lK>zo%taULy5zjjW$g^cCqbJS^So2)^uZi1GoH zj-*`oR_QEYvjnldDj_L4v$-172EX)zGugx90Gl)2lR|IcR?@0}=uzO!Vjxqxg%29Le@$07u1Ita{d&ytIaa}@#9BFWox2+?!EF=B|HW*bu&=OIph}R z{eArC@n*iFbjAng{P&D+q~i`BUZpn8JwcGV%v!yEs9UWe!9;zc)Mh?{#Ii%SMJTp2 z7hq8`3}vMMa#~3iz=JJfUGm_@=Mu?JFks<2&&6Bv4lvI!W7zf3%dJ6JFZU*!a4nN% z!Aoiobw(f_vIdd>@aW`~tMp$^F@M3YZfUT#7DUIJ6KxRgd`pgtNhpe7R6G_S&68I} zSBnaG5Z|_0@of_1_*7HUa`l>Xn~VZpR-@!?GN~n5g+oF`-Yn+H&>CQlyyiJ4lj2S; zhF|uO`fF_#0iU7voV#9D!mYaI!xDUSOUe-Uh!fa4x%{)%Djctf&YCeL@9a>Nr}HZh zSR541E2b~l=AaFp_$D*@VFc?7z851v$Ti6!-YTws7c3|WZI`f&VI#XR7@CjtE$M@$ z0vNs9yyvxac|+XS6gNu|RZDrP)_u~{0R0s z10C+LU$tM;6!ax}DIMKIz*Szw)6$&26%&nMBU`PuQ;KYCs*Tl9r zso3E}QQcEx*sJcm-$C8CFhmid1!);p8$j2_KcJek^7B@}PKFTol+(MsJeomvbE-1M zS^-^~*is^WU!CyKWauZNytXbF7Kj*6?Z3opudLj{V@go#|KbtTj!smaGjB|nM;XeewZlNjtCi$X$cTPIu5G_=7 zfId_|ki0ZdQ?H@wXLq%;9`ypcmL|%@^O)Yq&``t%OvIyL0&K;(P%{NbLFEW7J+t2p z=@`^&AF(5Am=q~9mE4ubCy`o%zHR!s@U`yrJ9!O?fZKxnzLQ={Nn;lYo?rg9+3TD6 z@Cn@7xNTqD>nn^G>ZHgNcp}qKB{%7|ayaMfSvZgF9%~DC#H786Lv?jpI;+2yvyeL{ z%KD4ROtm|Z&zT=;g}3*v2_*N(W`1M0AyEUjj>&qto%Vt^p|Smh?RAtR?8ng2i75Gb z_pwpm%VAd3h`DYh_6IDCHqz#%7iz2+i}V*5^O!TbZmgf-BKQM4mpioU^nFHDr=%zy zB+ipS3TJ;)a*?0%ci3W7&Dk^RsvkDgNf#`O43P#Uh8ZzCuZmA^^atBHCNMMT%PAKH z`mratkwHlO>V6ZLZX_VDp^++O-N@94;_1scS&xo4?uWg<43e)0m2A5KLNNVE=UAME>M5OMkLQ+Mrj}45NDos&NqI>;Ex6tsmL1w9dooD2R z7c!AKkULk3I>dZ6YIp6)RoB-b%IdioSa)LXosdP^__M&`Jg>)Z@D(tZa^f+E7f;c<7``7<`6j>3HPkAM_=JD3;BNNP zSfn1#*0?~qN2BN{%~DoRp`Provf$@SdO<%A0i_}CMwn?wkD@ij?ejf=b_W73jR|0H z(JBl07{EgbmUwzk&Af50ve95sDZc^D6JllsQPSNSa^F2RLQ$>rdF|5xnZ;ni%(Vo; zArw1g7aQ8a~sF6Ww`(Q6;R21(2_(rjLR^JjjlIA$l` z6NeTlMRPc@UqMVYC7QWZU4L_LGR#P66?7fvl)L<_$YjuHxZ`rdzVJ+ZXsJ9DBXl#a zIy&W*mEoG7>uq}6>U!gC15lSmJADwXjG)+N2L}ry;RjiAb#Yf(_4t z=9l2H_n=A(J&SrJJ1`~{A4hT7w?k)iuaS312KgN3Vja`}r71ZdY`Vyf=-Ul@EB@72 z|FdD(+6Rw?%)PWLih>p@hfwLNDn=V1{@~I&?|N$4;CT5>)#x`bqv@FF5Gy{GQpZ$i zNQRf4c(L+6ty2=3s3h}G+7q!SMc)?cn|8XgedD!-_o=fa57!lv zLnpfHpRU&0QACTBa=X4W^wcQYPk1}K|Zu zB?tz*>(LXhu(z?R4)iE~Q*0Neq71@o(_iPqU!Cfz%{@C(0Ft!w8uRB47Ml5ULC7bc zWS&%E4UuubRV>yiD6@8LAS&*e+mx=N?J>+zV+fv%!Hbi&VCNiZ5gonB^u}2;fbN4s znLSd!hzA#4yN!XjUL3~@?>5HDmleF^+(=1*{x&$UB4|Pe%?~elbZjytV5|mAoS)4^ zo;f2M;I+IrH+^-9=DR4ZY4Xr7>wGs0itF@P)U+pScJgDTTP2lIN@NvK=MM9AdeeqP zW@geXHF<$7tOeS^-@1nwzuyp21$x`OTE0!4zFiUy?2>pajn&*5ob3!>X>}LsBV3A% zSVqbUx9G|ZVXd9V;<0OiO`Ew_KvbW{gFdEIowS5>mk`>FdF0@`>&k|GAT6p~pN-y< z3!_h)@oCCU#jk|*=CesNW*})?%JhmOeH@7}Fw``}y z?dv6KBE+R~5E=~I^rdj$+(yF<+Va_TA)*UqYB7Ed5oj*YRubg#|VHVo3X*;-}OqRjA& z&Sf#L?DJNLCM4-| z#rmVzW5=X}nArJhxMn5YhEOg=#JemND-IeSTsDZskC_?%n)mNZzaBDB;LTHaOVV^( zWpD3D0S-gan)#QcwI$yT_hj(&q#eWgdNMSEm&Qbi{;)fH3MI*G-+eWZx2$v0wJwJT z*R>jVNn+EK0B{$3Pl`}p#}4oH%6(%BsQBrqc?(8j$6`X8k8+*IVu0?)Bq1f60o1%1 z6pfMbc)O6Zqw)zr#mCY|FL1<@y})Lv@o24LNT0j7%uvVzq0PdXuA?s-?0dYl-fBvt zj5|_qag%Fai*lZfT0&9hj3m|XYe18sL_mB)=+x_Z5Bt$u5*vctVQ}J4UXz|p=X7~) zZSqG1vs^bke0Qv$m87q{36?0CXCC5y_`bNtu+l}rQ-T+9Ds*#^jrmj$b7}s`;jP(D zo^y#9I^l~*?AVS#%5|&JhFP;o#(CL@u#94m_iw*^NCQdG&dPzi(g_w7wgoQ>o{F%_ zc(VyWwTh(L)Etxvt_7QfAc_zl=@P;&xfu zY17edT$cOR=}hYQQFHR!25D}m3dV3s40D>|AyzY z`JGu^1S4tr;VDz7J2ZcZ%>xqYP3R*-<8D$>3rwpX$v9?jZ-4*RE6%x3g3Fy){B!pK z+|pYH^OB6Fu5ijELuGpYH4B0~zlA=pMf?||h8g!4$-#&)-od-P7_0>Ymk-WNu0D1j zz53ag$oO(hacFfpvGSy+ktz2oNAF~`2Wp*}c3lwo`L;2+cUg8&v%Ll`&ye>rQ%J%P z6M=);%$Y>W^BLyEyaM^hG&ztxY(p`v_^3&G2oi z@~ttXYzz`{XP>^K?2mPyRuANK-=<1%a>`WdGv~jS)(Ni9uTF^55;cg@qA!tzjL4|M)@j^J}%?wDjE{9 z(<`rebvqKoAhpK2>*p=sBmD6L^R&SHnZL`rU{4=M{G9otG#FfEp#ygi&FNHe6hQzt zc@|Rx(&o$Xw5Kk`7eB@xlTa9SFZ0a*$TwR#)eN$IgnG8xtWo{|O3v+fjxUadVgC7K z=XKr6G@!3=A^7_sdedcTnH8INPuk#uN$pujwxG$}N8$31ulqVT73VQ-(nH3ZnR-xffw*__vdRZ4QC z<1NFWZ5*Q)AhNkqpk4o4w4m(JH#iR4vQ(eB4g>~7lG0P>c{?zCl^^*RVt`1)Onua1 z6zGe&HdhmuOGIKK2a`6Nl`xz)lbYQ>X7dFoJ^%p))izmGpi2C+%z;{I_-7+U$6c(6?6hM%{$I{pYg&Hr=Ys z4delH@EaG?`~;sIr=@P8B58}k$hEuu7x44Z-xI8Wc4jJ9CuaAG;{#s9ZV@@Fbj*wYygo7`2m|&aFxmK~9l(6?m|J0$4}1PldyQdJWT zNtEIymAZW$p>k6-FdHb57gtbF6Hl&ot5IV$l6X)$9sWGH5{_{(acf1=;fNlhuxtrU1?GXHz7D0IRJ6q}_8w|nT?);@L7fn9%w@u*U) zE>m^{q{A&+%aSkVy8=q@xF*BW(8_AOtcZ}homh_i82z#W`<016n{~Poow*WCDLU#N zmJcOSIPgn|uC`}!C%&|!lKoiV==Z}?Um^?F=?}Plp$w54*AtxZN<6ZX%ZWT#P&;I2 zGGejQ1cc3Va5dPD7hZJiiOWT{!^9Dn&ayH(Scb6ls_GUjYa z@y}AOOyr{(=p?UrL>Spas21`jF%=y<*6JHG!uANHNCL>$)U45rKB+sjNxuCJf*$oW zcM&uj8YmZXf|6RY5pfL}pfv7nd&1`93FlKh+r&987g+y{D$Dn@t5vF^%V#07AIwFG z>e=H8ourA1E|8PN5{vXAt{8pS6UMR#-oaGdE5lrQk|K=ec>PO|F3pOn(rbW0bOxh#y3b*~H0JKAvyK(^H7 zom?p6b@NTS literal 0 HcmV?d00001 diff --git a/images/tabbar-icon/tabbar_study_default.png b/images/tabbar-icon/tabbar_study_default.png new file mode 100644 index 0000000000000000000000000000000000000000..375fa1c40ed549aa3a9e7e7930b810d83b3f28f1 GIT binary patch literal 1142 zcmV-+1d02JP)+zS=wRVdp-LmE0LMobXQk>UsrWi zO%LHBf9N8|kA}d1?ZL_(NRs4wX1)u+24=pbE&@a}3*c0mrk_{QS&4v@@*se{07k1A zsVI9uDYZXzO)vo|<;wt`2vt0w-1|zYZ6P{>2qZ~zyD{bqr|`5f=6IH6@7Q-KIx0)hQXsRO-?cJn~KMoP({-n4Q-9`KF!A+YKYY6yh7 z{r~QP<_t84xa=%6S;*U!rVbQBB(#u)R^mDfS>KFSr4ly;yjG#K8!c%i8V{@-mkQlz za|XOhyfz^ugqS3v&es`$o*r;tc5ef?(tWf{X|3}QrH+C%BOrv>97WMVW)_9id~|Vf zaqs;6{9pcf9LGDE`ORXbCn9Z(*{8MsbWI2_^KC@*B7mEEwctdwGfmUCtc(!i7!gf* z@-{6OZywGu^V3B1m6N+LAyfj|-se08Uaj)69Gs5na_OIz&HPkV>idgb*8v z=n()9blHgd2*h!G4>O-E7&_0)&z8jSJ^(M2fchqiq9(f}2(gKXb_2NEA19)% zX_|h}%ga?NvE9`loU$cmK4gqJJU2J@OPK*7!~_vN2Vj$%KQ=l#`uOzp^q<`T#c@2v z%)0|?e>k`!29~_U5|aw?~r=gisSeOX8zV?rv|DKDYyEnNp>8r#%8vouo6i%`mNZRIgzBtBz$z6&>>;98JOf9R zQaeHo7Q*H`0M~lppGniy)|lX@G65G#_U72XxBN&cb$_T;Ddp7w=6!i)-l4TV5~^c` zbkzm9yi1kmy!EGshljV$%*^~|$HvFUFJE3>Ue|87&B(~e!tCtqA9g%RlFi1LPYQN} zQf3*}Re2y+v%0kl5u&*i7R;whuaCjMy(EXy0hy71TUf!dG-D!L#Z2((>`SVN$eZ5%+!Kfk27Pf!F|lK=n!07*qo IM6N<$f^h&EEC2ui literal 0 HcmV?d00001 diff --git a/images/tabbar-icon/tabbar_study_pressed.png b/images/tabbar-icon/tabbar_study_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..2711d5b08607c7b31645fdf516c2ab42009b5e33 GIT binary patch literal 1104 zcmV-W1h4yvP)8#?_c$= zs#ovT8{r~<iEw!u zC8=b?@E{`_57^GJCs3Ms9`sRL;11>9#`Pv_Fzg5vgWC~4ssNq_PT+cPM88YHt-zj>w6IMrK98fET6@;5ddLsP14m z|7JD>lEAK4OFBuwc-Hj}wp7|I0@X>SK&_(*mis_bX)6Mqq)?AQtGHh>5$LUfsGRl| z@$%Jh$*h518ST~@u-%EXjDSr=v)+k&1QK<@_AJzkK(d(jQt1DkLZ*v~yR&vx$aHq- zF+{GdP}+&>#f?(^ak}ekpcLGRa0q2}-PZj&qLbwE=WE7`!ES_Cmu>UH8I&np@54%K z8J~r^MnL2?RG$Ubw(Puw-Q>L2Dn=a#OwU_=Oix^Y^Du|VepEl{E`fTh&3z8?IHLW8 z`U)_R5cvYQ3RoGB$?8GZO;3fQQ3Kt#fLk^;yz74R~m51=vyY^_uH66jAL&((}O;SlRKR?BDF z0Hi3R&7g}jSK{cqC>tV?_;6N#z-usD&q6qgyXl+MRwpKO7J;PZ^2{+*@3S=KG?zKs zSv&TlrF>Jd>&&hKOO zJquZ>&7Qzg1=72~8Ho)I3;f;hbIWM;K$w;NU5G$trr7~?Cjxf5Gm+{M$i$5ufcyjF WFjG$@pxqz<0000 - -# 功能介绍 - -- 学员可以在点击右下角”加入课堂”选择课程加入,教员可以在“加入课堂中”新建课程 - -- 长按相应课程可以退出学习 - -- 进入课堂界面会显示在位,头像为彩色,若退出课堂界面则会显示灰色头像 - -- 教员在课堂界面中可以直观地看到学员在位情况,可以选择学员让其起立回答问题,并且对学员可以进行加分、减分操作 - -- 学员可以收到教员让其起立提问、回答的提示,还可以点击“我要提问、回答” - -- 在课堂界面右下角进入“更多”可以查看本课堂的课程文件资源 - -- 教员可以在课程的设置界面中更新课程的名称,还可以将学员移除本课程的学习 - -## 其他 - -- 用户可以在设置中更改姓名、用户名 - - +