From c094088b5f04ae85934dd102f76a91a9344e865f Mon Sep 17 00:00:00 2001 From: liangzhenying <867174124@qq.com> Date: Mon, 3 Jun 2024 16:59:24 +0800 Subject: [PATCH 1/1] init --- ...\350\256\257\345\215\217\350\256\256.docx" | Bin 0 -> 200694 bytes ...\345\217\221\350\256\241\345\210\222.xlsx" | Bin 0 -> 1012913 bytes .../Example/AbilityViewController.swift | 57 ++ .../IOTBluetooth/Example/AppDelegate.swift | 24 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + .../Example/Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../Example/Base.lproj/Main.storyboard | 298 +++++++ .../Example/BaseViewController.swift | 36 + .../Example/ConnectViewController.swift | 127 +++ IOTBluetooth/IOTBluetooth/Example/Datas.swift | 93 ++ IOTBluetooth/IOTBluetooth/Example/Info.plist | 10 + .../Example/LogViewController.swift | 24 + .../IOTBluetooth/Example/ViewController.swift | 98 +++ .../IOTBluetooth.xcodeproj/project.pbxproj | 821 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../IDEFindNavigatorScopes.plist | 5 + .../UserInterfaceState.xcuserstate | Bin 0 -> 213692 bytes .../xcschemes/IOTBluetooth.xcscheme | 66 ++ .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 + .../xcschemes/xcschememanagement.plist | 27 + .../xcschemes/xcschememanagement.plist | 19 + .../IOTBluetooth/IOTBluetooth/IBAbility.swift | 505 +++++++++++ .../IOTBluetooth/IOTBluetooth/IBChecker.swift | 291 +++++++ .../IOTBluetooth/IOTBluetooth/IBKeeper.swift | 104 +++ .../IOTBluetooth/IOTBluetooth/IBManager.swift | 75 ++ .../IOTBluetooth/IOTBluetooth/IBNotify.swift | 268 ++++++ .../IOTBluetooth/IBParameter.swift | 180 ++++ .../IOTBluetooth/IOTBluetooth/IBParser.swift | 329 +++++++ .../IOTBluetooth/IOTBluetooth/IBSender.swift | 111 +++ .../IOTBluetooth/IBSimulateParser.swift | 24 + .../IOTBluetooth/IBluetooth.swift | 389 +++++++++ .../IOTBluetooth/IOTBluetooth/IOTBluetooth.h | 18 + .../IOTBluetooth/Models/IBAbout.swift | 24 + .../IOTBluetooth/Models/IBAddressBook.swift | 71 ++ .../IOTBluetooth/Models/IBBloodOxygen.swift | 42 + .../IOTBluetooth/Models/IBClock.swift | 46 + .../IOTBluetooth/Models/IBCode.swift | 45 + .../IOTBluetooth/Models/IBHeartRate.swift | 45 + .../Models/IBHistoryBaseTraining.swift | 113 +++ .../Models/IBHistoryBloodOxygen.swift | 36 + .../Models/IBHistoryBurning.swift | 36 + .../Models/IBHistoryCalorie.swift | 36 + .../Models/IBHistoryDistance.swift | 36 + .../IOTBluetooth/Models/IBHistoryGps.swift | 40 + .../Models/IBHistoryHeartRate.swift | 36 + .../IOTBluetooth/Models/IBHistorySleep.swift | 86 ++ .../IOTBluetooth/Models/IBHistoryStand.swift | 33 + .../IOTBluetooth/Models/IBHistoryStep.swift | 36 + .../IOTBluetooth/Models/IBLanguage.swift | 58 ++ .../IOTBluetooth/Models/IBManufacturer.swift | 37 + .../IOTBluetooth/Models/IBOtherTarget.swift | 41 + .../IOTBluetooth/Models/IBPeripheral.swift | 55 ++ .../IOTBluetooth/Models/IBPhoneInfo.swift | 25 + .../IOTBluetooth/Models/IBResponse.swift | 77 ++ .../IOTBluetooth/Models/IBScreen.swift | 46 + .../IOTBluetooth/Models/IBSendTime.swift | 30 + .../IOTBluetooth/Models/IBSleep.swift | 56 ++ .../IOTBluetooth/Models/IBTargetStep.swift | 37 + .../IOTBluetooth/Models/IBTarinState.swift | 26 + .../IOTBluetooth/Models/IBTrainTarget.swift | 46 + .../IOTBluetooth/Models/IBTrainingData.swift | 48 + .../IOTBluetooth/Models/IBUserInfo.swift | 45 + .../IOTBluetooth/Models/IBVibrateSound.swift | 39 + .../IOTBluetooth/Models/IBWatchInfo.swift | 46 + .../IOTBluetooth/Models/IBWater.swift | 45 + .../IOTBluetooth/Models/IBWeather.swift | 70 ++ .../IOTBluetooth/IOTBluetooth/Tools/Any.swift | 181 ++++ .../IOTBluetooth/Tools/CRC16.swift | 44 + .../IOTBluetooth/Tools/Date.swift | 145 ++++ .../IOTBluetooth/Tools/IBPeripheralUUID.swift | 23 + .../IOTBluetooth/Tools/JSON.swift | 115 +++ .../IOTBluetooth/IOTBluetooth/Tools/LRC.swift | 29 + .../IOTBluetooth/Tools/Logger.swift | 33 + .../IOTBluetooth/Tools/UTF8.swift | 16 + 77 files changed, 6249 insertions(+) create mode 100644 "Doc/230\350\223\235\347\211\231\346\211\213\350\241\250\351\200\232\350\256\257\345\215\217\350\256\256.docx" create mode 100644 "Doc/\346\265\267\346\200\235\350\223\235\347\211\231SDK\345\274\200\345\217\221\350\256\241\345\210\222.xlsx" create mode 100644 IOTBluetooth/IOTBluetooth/Example/AbilityViewController.swift create mode 100644 IOTBluetooth/IOTBluetooth/Example/AppDelegate.swift create mode 100644 IOTBluetooth/IOTBluetooth/Example/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 IOTBluetooth/IOTBluetooth/Example/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 IOTBluetooth/IOTBluetooth/Example/Assets.xcassets/Contents.json create mode 100644 IOTBluetooth/IOTBluetooth/Example/Base.lproj/LaunchScreen.storyboard create mode 100644 IOTBluetooth/IOTBluetooth/Example/Base.lproj/Main.storyboard create mode 100644 IOTBluetooth/IOTBluetooth/Example/BaseViewController.swift create mode 100644 IOTBluetooth/IOTBluetooth/Example/ConnectViewController.swift create mode 100644 IOTBluetooth/IOTBluetooth/Example/Datas.swift create mode 100644 IOTBluetooth/IOTBluetooth/Example/Info.plist create mode 100644 IOTBluetooth/IOTBluetooth/Example/LogViewController.swift create mode 100644 IOTBluetooth/IOTBluetooth/Example/ViewController.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.pbxproj create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/IDEFindNavigatorScopes.plist create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcshareddata/xcschemes/IOTBluetooth.xcscheme create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcuserdata/apple.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcuserdata/williamtrillgates.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/IBAbility.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/IBChecker.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/IBKeeper.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/IBManager.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/IBNotify.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/IBParameter.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/IBParser.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/IBSender.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/IBSimulateParser.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/IBluetooth.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/IOTBluetooth.h create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBAbout.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBAddressBook.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBBloodOxygen.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBClock.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBCode.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHeartRate.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryBaseTraining.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryBloodOxygen.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryBurning.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryCalorie.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryDistance.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryGps.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryHeartRate.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistorySleep.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryStand.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryStep.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBLanguage.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBManufacturer.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBOtherTarget.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBPeripheral.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBPhoneInfo.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBResponse.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBScreen.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBSendTime.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBSleep.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTargetStep.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTarinState.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTrainTarget.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTrainingData.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBUserInfo.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBVibrateSound.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBWatchInfo.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBWater.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBWeather.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/Any.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/CRC16.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/Date.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/IBPeripheralUUID.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/JSON.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/LRC.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/Logger.swift create mode 100644 IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/UTF8.swift diff --git "a/Doc/230\350\223\235\347\211\231\346\211\213\350\241\250\351\200\232\350\256\257\345\215\217\350\256\256.docx" "b/Doc/230\350\223\235\347\211\231\346\211\213\350\241\250\351\200\232\350\256\257\345\215\217\350\256\256.docx" new file mode 100644 index 0000000000000000000000000000000000000000..0ab76ca1ec8b7a208e27857894a7a9cb4a39a4f5 GIT binary patch literal 200694 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

8Y2m#M*we|V56g5FX^j&hDHHNS zlEB&rR~V9k@u;;$`o*6TZZ3o=pXn}yDO1Pv*ZFvv?2?%R%b`TsY7wsl6P(;*$sq+ zI~9H;{xI#_sB_uRYJjL*v^8H%+ICk}W+aQM9VL>Hdh+tk=`OzIBORg^>u6 z{6x;GV?|o!F4HkDgUIEZTzBskG+h91&VY~am+5wlygdtDl|YY!@<=8ZMl&~pUFJE1-b9-GR28-bH>nzM zFnMt$BZkYhafBD0u+DiP> z$aF}_zC^~?*B^lyDgf+K{d!e({d|4hsc^r5F^dw2V>w&Ocl%&HT_QRXZb%IY8a@By zS<)-Ztt*~jJ^QfUe}&SNB4d!ZRZg7mN0ru^`0)vtlbTXpl!YaJ1<9byC<6gi2VV>D z$X0f15SCpzCSM^YvsM3{vJk&Cp6DN{yzt8aJeQ>$Pgb@(C6L+D=PtQoTR5a9Dd30g z)>puzaeB06hMiTX-A^Vu*9)z`SKb4*<8RM(@K$^50KHL4Ez^~g^E33z3Xlv z7T&)j7MA~(SV%Gae?csyLceuEEc}GA^f$!9EUte}EZk?nAx9tm6M<zR12u6QT zU^4wz1g4k2B`}E*UC`D)L!r5c$}2%ZVR#Z7pv#&wpx@>6v&{aH`^r7JyY)5{^8@>(fKqSPU^4G>#w9f8rOdMB zXR@gD3X)YB4aqD(=mC4RqLWTJ0xiBp)ugf&?OM)ch{P;!GZCq1&UhXj+9 zuaSF+BYXX>+G=S#G@e-*u6E^+_3-&ygeEc8Ls`7k3xuY@E5v2FXQfUF8~jx#cif(V zVw;4Jj!$d3&o+Vy*cGeCF_P>jSVhoC{mV)HQALb#MMU_Bccx3LkIMYY1Vh3!Zi$Ul z#Wz0iu|>#>TEX;?E4U@E)Ywswg_M1)iJs#rCvRT7qqJ9tsZI`3z>$qR>dbxCZK!~G zC+B%XW!_f1l`fq2pi%8mV#VA>HKMBX!4%d`AY`^_EiPrFVEW$vA_wv2UHjD=@GR*gll~Ppkiq7NkqCYDax?;^+ihb05FK%U*~G z3HXSQ=Wc)3tgq7sAFo2eY7jBInM?i|i%>dj;W6=j1|eO|3U+B=gVmG&kwB}1@<#%# zqt_hAb@`H~kPVjCAH2a%%81QNq|2s9#@Xhtcbv+P9P%Rgg7Az+b3xt!EE@h$H^=|-4|QM(KCvN1hS+Uvb9g!51<=1k^s=xh5rLy0KC6Bw^ftGz!P5Na?NK0majWhM%)Uu36^jaMqV_=UM$+^omny*+tyTz_67veX;k{Nh8q~d|8oW-V5IeV_c`SP zi`1=@^Q${PD(bJ*_e*l>zq(ZN{-D`oT;U@91sd*mGu8tJ5AOdz?uW-s|Lvk% zz62<`IbEm(h5k2+?ptO59sd2#MYrh7Oa6Vq-xb|ChX0&@|NEl*EbFg}?$4uF+MpN3 z(N%`;|3=YG(FcDSZUc3T_h~j26chqqXvr<0=+1a1@bYI#G8mr3uDgOyw!s!&7cEJ+lOz$+L^4V{fi4Bz3=qwdxzklN{4Zgp84Fvcc-zIOtdR?E|tAeirg zQ%p?p6%3P6pLp(xLf>Hz7h2Ryj;y)mnC%1ArO ze_&LPs?mEULj2Vu%!O>EluXluF2I_@t6X9>@b%Djs$$_IxhMzK$SsT?1+n@I!lMFS zCQXTQW+6E%u;-U0?oNnVh#A`rgZr`00nTkn1Kw<3%I)8X)(X_lVWoIjZ&Pnm2gsw& z6HjHa%sigJjdki=X6Wp|joe#V7G5%IYqBo=Zl*wg`m>p$ILbJk;0_a(F|QZc+g4M1 z5mPMLw~vQAv%cO@l4LGxT_J}R ziJ|r{n301>cezn?NfXQccr}Y}(hU5BNkX0I`W;WaR3iBMgyy$&-g&hVU|WPys|fgC zir0F2)dlfSI7ve?{|P54bmBWFiAMHkPSR1Yf^ynl2Xrvk46^;r6w&KTl$@T|gH0&> zkFfT%Dook<*il$c11#OW9H5K%NaWwfM=sV^-$I8>WiBlIe`yg0hiv5z;NYiz#C>md zXFdyAgIWIYg!uw)4=kNJ2G=J|DJV*o?&u6;szHti+7Tw?ldWelzVd}i(W`qZia z%F4CJxo?>V;Yk6YV0gW^CMp0FoE9!&Pjht9#s)<5%7ITFON|xa7Pxux|aN$_u)0qQ6;tFuv+J6$3t!K?kDgK_=67c))ts_w zqTN%wQ5G4NtUv{219yO`pj>BBph#L~(eK4tCFhYg6YXg#W45#yxgMyXXd1>a0I4KKW z{FX5|OWw(WH<)eZ+Xr!U@^?G!qIU2TkoqO961fz%tM7ARTn5fq7txB!qRv~dV8IN; zK=NkzYQCv_Q|aWx7ABn{oGQ`>w)t&p!KpCt_73;c_P$(0l5853=U}!MzOEOP!;F8A z?95~&!2UE)YOOY!Q-S8J1!z(UdEVlYH0>7=|A}@kBIlPn0{C%f}Z+EzMnsiKwc6S8Z>NDP6>S&5r8DuurSagX1B{Ua%oI5rNGkzAoJ~vDIyYu-nxYe6#^?&@f`}~?Y zRFLvlTAajz=k1SwvRaHq_-`9hmo*Jel<%b?m=u>>FKVbP__!`#W#-y5_`hcP#WTG|FvU@1f~P8X8hEEem@~`eNp<5z2}2#;h{cs=jd;qJ-?@55_(VaMt{(p%t{%_CKe>9u zSO@=eR}bG$t{!>q3s;Xk4F6BJ+CA^9uAZEcf9vWYy{8##{%0E);OZGfYo7br1NNV} zdfKeDAg&$-xJ{WlR8@*SGFdOfXB~yIL?)lWx6ZFFFv%}p!M1ZgSreGO3){Jv0Mg^8TnmNr?DoC60{;+ib|@yK`eGSGJFT zEjzEW7Vv&adELuG@j3@^AQM{=k7}kk%vT$;Wp7IcQ}SrUWS@<()_mHw!T7w^u>L^9 z3lWOhzSAv_#T=}-B}}nT7ZuqjS{#&#t+S2cJxQb4~sbyaX(uc798u^=E*s z9I!mbv;Aawv{43I9!t!0UhKZCg%_K+BQ|1Zuw@-?r&+*MX8R_W28aS%DWX);QdQKj zqa3MmQ6ju*a=i4ZF{RXy;AeOPz_jF02@~Swrb(K!gSN`@oIcD!@aW?@`;YL6xpBwE zqoyAw#|y{f)cPcdz9nk)=bIe&oyzckVsw<#29`fOV{^A_;5&L<(F+x_J{Endf!yN@ z*fH?n_0$Vd;#xCcjr;)jjv&>X70IrmzC-X;2AIc}S2bAl4gai{%F!iuPM71U!();> zaFq?n-1tP0knR9m@vYt>Kr;qp$kBPECK6qQt%}SzGD^Er6KVgYq47dJLHNhOx8?7# z9#{auV7otf`SS*l1_lTBJq@g-5V*fkISM}`74|0;_Mf+#3E9T{B;YCf&FzK3*4`|Z9`fIeQhW`mp9XeeHL<&|6q-2 zi}xXr!ip1aZAc`=vhTW7$D`Z$R8Wx~XJZ!ZlKsOntLGFySNi8Ix4fk7402cbR*gF` zV|`u%wp@;hrCP^FW?J?VQ@o-Z91NT{o)AHp!AQ@qXz3W+J!L4iC8h%-=;qQhT*Yxh< zC2_JoW^K}pAza>;n*-oN??*Ug_UlvQQBk9+*#&btboy2l|B+4JhOvXNTz8) z71W5QyX8yJcr1w8`Dp%x6-RH@*od9uU@Y%+sH!w}Et170GJlELvCwQf!+Wu%X|LkE z|M}GE%o}J1^1HlbLK zwFfvzc2qCBgJ00)BX)4u@7D#Ao}Yk5Y7+?$F+sLlYq#w_ut3UR(i068HCGxlaPn~p zCq41-SSL~;NtLOl*X&4ldmoG-LjnbT)B3>xV_%nu)tw!!Nz>?ewb;PlY+|T(Y`B?^ zcP6SHXsCFB*y5hRq_q1cEYIfR4N$X5+FfLEpo3 z3wT+2`7&k|p7dAy+nT~aBlMn|gw()Nr(bu2_~4crQ36=fguN-dJhm`Ybe+_vGQw0N zQ=QyCE{z=5gUCDuJ*d0!y3kj6T!V0;-7*gpj-&>31_~RP;PJHNyJ#y_apYC)e`KWgFYg&_TCa&O!X!* zzZTRjdQ)Wl6$eE`r7BH&$Ox@mPe%6tiym(}3v)!%Xyl(4D53_#T^pl1=Ix|MR zB&kevf0V=hpS~JK7d)_eMva$+adcqv&>m2_0p%qmT9vG$AVK!6{a)aj$>_@ zy_O>(8H2`TqO<{tNSjw$tEEFSQc1J%7W+UE&vt$< z{dhu1=CoBPW~;@R5LYs$;8RmES(vw_hJK4%;Se1nGvSjlWy-*Y0B|iYk98uIW5(DQ zjYIEJnNu|1DmI*9%OlvlI6+^DqgHE5#zdtnEB-#lJ*aEzgNt)sT?izV1q;7k+kOE@ z&BDobhj+E^^Cs{Kj*(5RqX?AAKnHnRPM_w@P8MhKPSkH(oN;!w3xT?v^3BVN6Fu^h zCUfefjWsVO=v;Qz9FadDKW03_r+;P6Nf_mLXGGQ_g68Y_j@O`}+?n zy0!i7MrRQnuq%WxVRlpB*4kjDaQ&ZHfaQ>^XudPgz!!P4&%J`#!7-u1!p#g?){^Ss z=O;R`QiDq$mce+rq8L9RU7{_c5C-+*hG?M=V^e$G9D%bylcITx6~B4b9yb^ujO^io zbP8UWRtJ`EF;6y)+2feant(5C-&L>fbRd2{t(b9C&e7 z{Z|*-nVQfF{J^*B-sY7EaT-$jxe z!Q&rXb=1Yf7{ZoS{ki@9JqDHL_U)N2t)q9kQ67AR47yG2^7K}wpm(P1$Ce;sLJHV^3(KXu)ao^&4bP7P2sv&WX4HOO{guiAB4_uaVI>mYl7GwaDa zg5tWI);d$Bd&OsJF@ePvW#KWo4F-kP3S%9k!XXZE>hn0CxmUO?~8U2T#*gcihge-~y8q)HUsaPsAGA0~EoV8zU17k4MprHt7Dz zqB6~~v!@$;^PY(5*@H8=xjab#LeG2cRR%vl1FU@qx^LDqbdPkSm8}}lfb?t=QQCX2 zgCpsz%G;g6^c8>AFaLgZ(Uy<-oB(bHwpo5}1}-8P?*4XJnfiR(|6?`zzO<~_+K&Za zE+#d=gzz-5ZmXQ(Y%P0X4emzgE)b;>L<_6O3nN?rhjM(z?+7d$c)CV3;N=8ZH}*A+ zz$*#UmDS~^i#8J=WbfTzZvT9XD+J!!uq+!Lp4E{qt8$^ef;hF3KU1k`x+Z@%WPhz8 zLR;!a%Y;Ll3gCQ%^2+wwWO$Ioy=RMU9+eMD@9L(+d;r!NCaA<#Q|lb;YaP$c>+HS` zi^_k(yebGwU8d3-dph{U2M$L=fAjg*7|=KY`7ftfa6bn0Ih)ru)s=WPhEjsCxNj#b z>_x9|1|BZHJeu^I&}~Rl5>QmP)B_=R!*AF#B9P<)PEX2!<47pn98lR%2ZaWQ`=jL7 zhQ)J#S(|9bqY5`ZTL2vf6!Dy_%8&y_#W z@Hi)*e#lHIF;6!xnE}F?y~EGBsW-6v4DYEa(LWQD`I%@aD+$}`$|sk5*`W7TO1|hI zvAb5=0E|MvTS}#Y-$tdsl%5ei;ZSY|GYWHP_mdT;^pi?g0ax$0#4DTkppigT+j8pb zEE83&Yu3&|UAc=^E{!^1Gj9`QtDf5QAKQt(p#?$*HfpTNFFwFf=<$oCb$iG)LaxIYOWzO z^YWiyC=1AC_w4A0uWr|n?uFgyJ3b7HD|8i?}+=p!4cuQ+;-*@g>$4OK3ZZUAde}h3Ej@bR0(fvdo-jrtGdD1M~Kfdz#m{_P3 zt8tXsrsej~E8F@<+?4VrGhSm=N!BS@MWe1_;}55ymn``FHHfidWY*C}M!CM4Lm@j( z`b0U`Rt`@fMZh8>cP%2+y959zM|X!PFH2CLb(s#nbOe3wn{6FJ1V2`zd4*qqX1V1S zho>t=PSNM~Dc*B4koKd9!wtVLnZiqb@y;$D=WptU#)d!w!Ob$JjR5XrK8+NUQT-9f zbbpW@rXUZhq%tm;zjk1G^yFppEIQ8EcJe#Dlef7QM?UPO+OcX1(n`4!XWXgMjm;Bc z$6<=fsCIp>b2l>OI0l#BN>|^+YdfdO;OCH^(LbzId&!s89U;ex9No9X&Wk=;bSoW@ zAEF==ttFzYDf$(MWEU<;QS=OkV+E=rl9FimDKkYdbE!9{5ypx7nad(XaJi*$;-{vP zhn|EbUnh?QT=yJ`t>suDsQ6dv?Qnx8`_S ziURaPD#zp-rWslaI(raRvKL4|RWa?+x2bZ3UhS=Aj-#b80N>cixV;fQ5^pW88}{^5stKK*q}~Fc zr+2nn!Br&w&%{CA`4Cm%?jl79WRu zkIPDIyJKS{zDjZW3sJB3_)lkjYkrR##_@nhUWgXesW7$8#9(b$)b+K{Rz@k;GS^so z&^dVxl1{K6!Z5y+d0d3b(sYW4D{fy>Em7;5(x z8+Und*H4pO$g$1LzH#khvJ2TpUetppyY@dOyVJlq&aQS^)FSSF@WNL04wo6@Y#}>P z90rv+UWUS|;A>89#t;YIoyoEsA_cV1_hI;D2|pXZm9?U~DVInABUuh3xv#3sscNF) z`K8+ss3od&=0!2t`=wV!@D(wU-&dcIn5pBxx+n^-RESooGuY1k$jc^6F8u6q$jMH} zS-VpN#WUm35T|j(cMjvcXuSOnncYbhzGM2&#UU`xuAQyB9nt>h;*fcAJ+%A`a=H_8 z90NC)rw(!4IQpg_`^{G|_2lelbmrjghLR|8O7i=5qxHw}ZFKpsPji(IRWMVUQ*9_q z*^1Pw+tz9s3)u&BQw?{>2O=PLcOshnfU&L&+5m<3QyB$ONJQ^Z#MTJJI^e_r0MlYf zw#gYVJa~dSeP|rpmRpKebC3L@z08|Y6tFArl@N)ret?AQ^o8OOyfxjyS}+7LOYr2$ z`WjObbuGOqM>1OJ-g}e$362$;6Z6^mfe?jN0TIt38ANhubpVP`J(9|q`f`3+cG0|n z1%!&~0V~^KLy?jpsd*@W9&)ssT)8kPUbs`ZTct%x4k|m!Z`=^UB#ASAw@*3rW!0f z+-y7*_){WCCTKFNAs38kH1ZE zN}d|SC_rle@KFoxk&j z8;kz!`0}OQ;~oe6{C>K7m>$$@d=u6J~It91b{_xx+$VKh1gM_>y}1`a0uI5I>Vx1Y6dk z&Cf3Xfg0I;gk$>c3H8C+J#e}s9#32vU>@LS%xUHGE|T?z)Zf8ZQ+)VamwqV+LrhU=)fh^W997M$?mpJcUY2aO~ z)e9nxOotgnz_9P+l{F`k;K8ok#juY~krDHM5H6zwzU^DGoOY4z}F*JMs^$P`1%08mq9ms0Rp zaII3}62-p&sBxZ}`Lstuv=C@n=S?L#gXs%tK4TV_DTq3nR~qQe;rSJrWc+O5hR;4! zc5}P&o;*hAT6b=l(SW5wibIG&h&v&Yo3Sum5NAGf*-yt~E0qP*tZn_WrkZ55@i3SiGeraI-E`Zp*qsEyDlPO0zkabyZZ-LA0K+4q6odA}% zju=-eZa>L`#@1LKP_z2mvk`T-j#W~iv-1X{u`7E!S@!%(lD!kr!9nzLCuY^M+mx$( zo#tAprEu*DeY9)XQAL*Xll`qbtx|j4V=7v61d)EBYc{ zytP+wqsZ4VRB}Z_!RMn}Nj(00fh5Q1&WY}km9nx|v+iW~IC=e1AEq@r=b5+!e-8#Y zZv9_0tdi9nnA0eMJ=23n>|P8&j5&PnozBJ9*1Wq-^4@II@4J!eG~9Qe6LWb+Q+ujh z9+HsS+XM@szK3K{{}XZ%BDWEkTm)dRkI5o}I7!>7Ao2}4t{?J^)Kx&faRUnqRs-s` zJ2Wj6+(#(zg|%%8U%}+#U#&WD-GAh>u=@MB-9StL`>MkPwgJQRr$Tu!fOx1&k@6Lc z6fWP}b0`NmS$BZH5_3z92mAt>LiX7M_zNXGy6h$pZ}(M=;=cX04T?{wa5uexuiu43 zt`4}ik>)O#!Skqp!FKXR-;|!)Xo!sHH5aT!d^miZ-O@r*2vnGmoQbtZ)}zvGX_=ha zAVMj!(^3SbSDDYz*mFraoYTs+WVTfGo4hl#h0>8%qMx~Q8Qaa08hUE!K-Gv6fpyQU zVUWY)X?(c6Ud*Kv357OS8biSjp@Gw>^XBJNTT`e*qGLP`bp_lJA@tID)N?&g#anAy z%j5YwUW7*EO@MTi!j_42~0dmLUnRojtK19 z;Q+Vn`!JXLZpjyp@pO+lwVO&dV&a2*c=Pi=v0U?ir}frT;o4|#tVJP6YpRjElEJ>n z02<2`=ffmFjUF<)IrO8C*L^J$m%_0i{yho7C+p>^NBMR}$)6aex{X>r1l48Ikb7CB z+`R&QUX|#tx|)6DSbWpTBRYYAZtQ2u7%5aZPC{<%OH=(SrEcJ;C?z76w7NDAHopQ3B>5Mqq5!j2+V!)$m zI6f|%+`3;PjrpX!XQ(4DTxk@qV9_3#6M zlB6))ePKfiIk^8;#gscB7@>}HuP<~y=uur--q&?V%=+v~-5z+rSeriX%ya??S`Ul@ zrfI0t_A}mV_gMB4i@UkZ%g%e3f67n!Gz~!xCM^S##b<#85+D86tv<_}vHai%{f;rg zyy4{y_6~gvuv8-}Xo2Y5z?TU2QYR03{zaHo3IxXHgGD&~ z?e{Fg3$zgHWLAF9L;rhb*QM_Jd-?Tlkak_HmyAymV8BafV(2Zfhab4eNbtN&V88eZ zG}y=i`3m@LPbq+@c`ABbDHEa^q{e)3y>vZ6`GCCi9Q6E%=bY$-Oe`l zgmSq$t?LVX3;gp?DKQ`rcg3;7R|TyGA@PT@0er)ne)w3qOg993~t{0 zX=IS~xb&r7ACI?50rW6f$+QO?V;&ANZwIh61h}=B5xk9f2iD1hFkK&RC}-kWaOl4e zYgyejUL}rXM1e>+UtX1PZf^oQDCQKTtkfq1grHh#P(j)^(W4G8>Di2L+Nntm*&E-| zB`uv;tZsGahtwHPo`zJDrwDBAWSx?QyA_d5PPUw#rB&`U<{eL! z#}Ak(I_2VqZq&A?O}*gGqnLW*a_VI%`->zXkbvXqQF(_OwW~rU?beH`67>&0tNVuY z_0cm^uB|k=I^5%5YAQpV&I1(B1&&a1b;>Q(T@MA1tYn@VOiPUDHxl^a-=wT@QMLr| z9K9clUMIe9`xzUP5l0D}U$T_HpI>A|zn@60%BXHw&)JC|9jDV|36=khgi^aNM7p#&(dbgZ_VKaB#TyyTO6{*>zxW z;63uO3Msf&P%cOT-D9By_M*KrCwJ>gx$qzMc20k(C|h&>s-mQlfsFP4qN4nFGk;)6 zSBD8MAJ%A9is`w^Y%~7x6k%N1=)Th~LQ%h*4MxbCx7N;~%sYptka>R_U<5g8Z2sW& z5XfaofaJxJ2~%EQD!fTFA*T?Fphueh0rXT{F@@w@IQ)EJ>$Dt1hbek`kX_gVnI)({ z6UE3*mG1Bs5}FMeQOb?l3>`4cEGo;BAjvb5lN)W>nDQg7d&fOgKHPrPQ;{A}y4Zi~ zNt7Rmn}fxY&6Wu_S3aX+N4VOFH1s6ZZE#?5cf8;HX-aycd@22JhZ^TZq4IU<(!B~O zL&;5eLrA6N+tj^MUnvrOg*YppWw)wGO|_PvoI;ZhRW1*QIweng>zdZpvGflSEHa>Q zocUyeHf1ZSMOpGiSz5zfHXj{~i8@#*7>LcgIfp#0+YNVZpycL3X)`N6sguvg^RGTV zw~C6(LB8J~tjxdZ6zqMQi2H5q<2Md+f%{x*?y4KSy+=q#cP*y|uhja^j0! z_){83hg|uG4^_mQ=a;5S^%3O;WeMq-lI7$+2E^v5DupR%_kr>zX=-G=Zx!3Vd`O7k zw|%P*Kk2k$Y!MYLD?fUGC4anzQlY*_SYYp{^SJngN5;!GNMmEuz8>4ToGDEm2wo1iaiA94c z3rXm#^`OJ*u#;Vt^Ymzu$hLJU0A0-?2cWCf(N9LLhT2agf;Uz-RuCOs&fg3?i;wqW|AEf-y*DCIV-_K#({4xXl?lsn5-c4%I zye0gRWI%T?2$cq3Z=XfKbtD_#pmn5dQomKHZWQ=XW(a&J)zxq9d7DhGR};nhR3homa_Q@}kPtNxyJ!+iO{nHq>Drj5%8Kue}BNi9f(GA&k{KYjc-SYGq1k_aZ z?lxQyg>>zrM1EH`$j{a1=rMnzD4mGKcKE9j<>g4dhlG3aso}34?W?a=4W~~%l_%87 zEcEXTN9|o5Yq3F%bC?fS*US+{1ja9PWpaVBkU1%&fg!PDdwC#t8nb%;iQrxH4Y-!s zv7l??CN6g6iwof6_^<>|cEFC!1L-P*M0H~W7ZqiWMF|PgO)~t_G@%I{A@jF~(h}5j zwv)OtEPz1HwMbf-TIJk8!SzrcI9wkUY{=Z<6v5;ADtCwT{L#*|#QrDdKzQLrGL*_P zF(D0TG`9-hbd=J@Z9nt6V@@2b?wZhC)47 z%v!r20UAq1`AY=GosVYtI&LoEN1N)b=;<@ElpK2_s$0_>z1rh}Rk3gIyE+4(2dN?o zeF?Q7T`#d;eJI+L$vS`}A-*2ZDiFt`o`Z8|iJrN69z*`aX&&<) znbNS*OTvwI1RSL7HTm|dRg@v>Jj@-``;QhKyi#qpTJg27Rb zaK_uGM40#(bqQSGn`pdb{+`ktdAnGE1|FeU(@`gG3&MGdOpd0wzzpTU(FV%Pv!w)c z*-)M5w;T;LyZ%j!zrASyk(Gl=U8!~==YST`^NeZMUBa8hFZEpx3|dn-RN8_8?OUOY zB5ljhYAXho@=B~$HTjhde1u4i#SQsqP;Y`}*nVLew9`Ai7iwK&n0lsb2CPGz4_a>< zTu>BH!jRx7;}!T)bUB9u^!(Q-vD+4e`2q>@Thnh8Yk8ZMYu3z+<(RKS-rqIUd{9Le zad0A;LcqU>oX$xyB7Q}fG8Y|y^B+%^e`oLOF6Z+iN(%)+i(T^ioa=s8CZP;Zj%egI?z#%=sUy+Vk=l;KIcz z+J|qxf%`0@g29X%03WbLVd%O?^Bm*F*YLoiSBm6<7lrmgup*56{DK2iG)Wn9r#mK=G&!P5SAfnVqj-rHC_L zEqFwo_8$JkGEA=+IyPQwk^j&;i+F9tmjFJS=S#qSP1TJRwWi@A!B_eyYe`IJsbBF~ zVF;hb@vvEYg;yZ)pm8yKE-`z)wzF){^*&QAm1d2y_f*Ko@?)(KL%&BU1-wO$>bn~c z0%1AQ2is|^pJrsB-~9!;WmSubUD1inMaE8QbL=*r*0GwMBQRdgL2D+!FZFJZP(|YD z?p{qYU@SGy?=X;^I`oi}ju$H);g{5sPx=%FQp*yIr^609f0iK@7t=#R>f5Y9hPJc4 zCW>ve7!sPWEwEL&DDg}cgFgb}3aK`UxWDjgK?TW`qTSnd__birucuH={RO6{W-25s zn6v>$$~f@H$Rq`;7(+4A%1YrA&*y@yddRG+t+4gC44F;1+sadzYg>5(jCr$H*wB59 zoUr^9X!Y=4Vfs9ICn`6pY3`P!@5u8M4jL*rnR-c*_-3;nJA}6y*vdvhkNh&^14@tS zh({NFkV4lc+gEHupRr2xBB$~hd46orhyohi8}Rl+i%-^a&wmaHDy;iQL#>}?`YfxGc;T8OV_he zU^c%i@Nz{F)eDm_yl<0s4r|-jlO_n$lQe1+&{IH}XRBPVtA)z>khVh+%RLS%$KG#U za`~-4dM~HtCCclN$GSeQO5jahK%->J$Or9SU1`O2&vvc)fBhWc8a(@z!i@TKjImtC zHtuZi7|kvN7kmEq(JgYxnD~U=po#8}QSN1k2)Qv4VmN}z#_rHW?=TT+Y>iizjma=5 zy7gTKF0S!a!DDK9jtoye#9KsKCc;HB%!%9~0M8BX6ZJ3N+#+CLT#)!KmS>=yh z`K;dHt9eJQE6ry^S#;ErvGP(AH#Pe^HxXx7^h;|wRE)$<4m@emH3KX#M7book0rl@ zj$HM!T*TMY=`B)Aj!;D$ZRh0PQb{CLEJdV}FGaXYC#&N&eUKP~zCeuqObWeiVTmQL z0ls_$CB20DW(RyjH?6cJNjsvCv6gqiwx0cy*HODxo4Mz@knolH*l6zNLigsCb~JeE zut$%Kac$pWJGkEzWJY6vjZ6?cwpOS|5H0cAsM_8xl>?ZRRJ8H3a#Gkve6}`KDYvUQj2W@{QSVy8Y#+7#;bfXx+BiCwt~I8J|Qj+F=7l3j1(x?0qAY# z`GHR^V0AzB(`SMt@8)Tr)9|QPZLJ|p-s-98Nc?maK8eN=U5LIo-pFtuoWBljMu=~; z;#y&>npK|1aM8pLDIOwNKM(GSpWev>rXR8S$Xg^srG6k)h}@0A)12B&Nyb*z+pu%w zcCI4p%$)0&(y6u}p9s7uXV~ic$9aknbpif!r``Kdx^Crd%26 zn3c3zb;oCFEJaIJoUR{eBo75BJn<~-ybpo-MAtOF^iUs|PqC_7sxI2VNwsQs)s~8( zcn+X+EAzcox)qdRL7JWu+?~P*qT}xl#@$vP6F(@&n@uws$;L2*H#g69nUo^@D!`vs zw{%E4(3Kt~Ko+*k%?l3n)?0QKM@`T2Wk)H!86Ur1a)$Rzxj9#?AkVBl_q{lf8Wv{@ z;qge0Jiyt#$gJd~%>awNMe>?_GobHxPG#zNWv$RlV<~D<`_q~0!@;o79DDad-pQKM zik_}Ta*yy=?ciAziWlIGt@`R~7+US{m}(%jkcvKkD;6xBssPqPc(pL8?DE-9Kj<}R z>NDvEfhEA@;{hP`tg+ol7o?gQ&%*gzcdUov1=lG~}Vg7@p!1`c}E62a`(VKXut;78&w#6JB3o)lj ziMidS1{oU$Jx7pfa9QeI2CPQMjwU%CNkz6J4-6Wf7!-ex zcY>_zkj1rZYP6?DUfQWjI$^6U7^Jm#AjRy9W9x7f@nC8>qgptDSy4&a`n|0bZ*2Kn zG3GUI+5#H(h-HMT5tw8O*py|BAz21B-hT6r`KhjTIlDb6GBoJ~L0v=}qWT=-z~Qhq zj4Tm(qoam}mJ}ET{HkcK%#X6=&&$OVwFVF)b?0AZ7$9e0PBafT~yZ!58 zr}l>WR8eACaBYjZ0XC;WPfeyY%dmNIq3cyN1lEvJEp0eHR{CMV5Vnj^GYRV=`i7Q1 zMb6AYfdY@x!}zpJSS^RuOn4Uh_UAPahpL|k;v$O)iGU*BY47xSp;C`8P#xkmG1p8G zXiBY|;=;M6H5JlWze%S@y9Fmif%Lz8K4X+@1tII31B>v(!8w%}=H(F7CPKfMSW!yG z&q{FPKMXxWJ5P@GBj&n4Z*Iu!Rx#zN+9If zEYmBDyNjSYJeL&AlDN2O3;7+eiI$@HO>fYuEo;eN-+aC-%Ildwz^NIt z@$-8+1B~JmSZPnX?Nf-};o1v=kR62ux#v9fkF`74+W3_51jDo9JyW}6=$ z>(5M1f*GqPx5jOAO3MvX&zC;mA~Bra8}tE%8sY(kvGX!uUdnW3%A7zyYDwGNsHjlZlgJIQyDqc8 zo@$#;JvoEN8*vW3WB4KDnydN@znJU+HAOk> zay}VdR@!I?OF=UC1KSN;V}*ax$E41KYQS^G`5U&kN;UIy5bTWd5SnH}LN;{@JqNTb z0?&8O#$VmD+AEW4OQy?h6WXis9yVT{zYTi!y%h)a$pZL^KgJa3*(D@-Ohgz|*X^Fo zVbsk{Bsf$P7b-3_Lc>xQn`Vn3 zAtyWV6!chf0|qPx1?>I^KnL9o@`UsKpQWEPGC52;Nxvv}kiz71wQ+cS;R9DH#(Q@E zh!#IB*6thw4Z!zMCb0j&JQdc}(9It&NgB0pJmZ=tJKzqP`#gq)*^v?T}vURntDvdB{?h- zOLJ>=i`o2G5(1$h?z4iN$uGYo2$}0MN?9~WHPy>CxV@#z!!tyvFczX~tJPLqqGHa@ zC+gd;*2;~=)`P-*(qvDGAa7f9pr4&rK!ur!U?&?=1@(;dJ;}MTc#sjyqmH3 z%_*++LBVBkZr1_5+P*)F_q0Kb-47PIU>x#~A6X~c{hiKglbTdpz|$EkShcvUO~m|9 z_I3IH%umFr54mT4fTSF4C5_14I4@+?V~>u@uqu)l+7zwrHew2bz!Q9VLg5PX>{K+# z;5dFVEvvLPBS`Hd*ZJ>r&!|qSr15DoTh%2^yfRW{0AoQ4n#dCE zm6PUSVqgw_E2rL7Gvn|$IXpKHjzjehyoYL~3?f0Ewo&Em2Rzi+L!YsR4E?L<7%rV^ zSk}+q)Ca@TuQ@t#wja%;8n^F9%D6$3B%40ZOD2-wp4F9{{Zc=JB9dXt|0v33Y@fo} zvhWKjcf@CyeXW)MgDR(L<cubZgSI+;Z(4ORqw`>Le7o!X85JDZQleBdNoK>veu47-}`eIotGRB ziUhd0ndOu(&m|-q|2c;lA3{4W;|I^hAO+Ig01#@_$HDaNG;_h(Cq}b$Fq5UdI?pB>;O|F7?V0is@Se>k)n_u_vq*98l3qe{ zv#&x&9m~F_`fFC#Ir3!j?AF$I`}vTz@@P zZCxS2aCl;ZZotj9gTGh59jf=SfjG3mMzubtk@1Ir<**2($$u+nm`SPWG1mDN$|{wI z9xy({>Y1BlitEk)NS*zTEw8z3N&j~Cu(GVvU)$7=Xk^cnND=n|1h1_!C&qs zlUA9VFydd6sR13BR7NuP_s8l<$fWwup@=$Mx%j=zD2bi zni=KA!SlNm1xsz~ZtDk2Ebyi=OhxZXMNY3FtZEG&i)?H5td1|GBde~)g!Ba(=S%`X}%p)eeF!4dx`t;oua)l~rn_ZzgOmOh+PTFe|*& zo|8~zQay28JZDw9n#^GCH;1;LrdLx&=GkQ4VBKK9XiJXrCnhFuDb76{W|1aI&o>HPYPUa7QUHCkhB(p~VV0#(de@Ov53&L5t0PV~l|pJPuZ@I!2VX zbuUVcNgDcU5ehou%4%s3@!C$n4vy-?Tj&_F(9)H)t-wWI2eMu0BhoCsDa$1uc5dU< z-QLCZoxUbzV?GfYA2l&HITQqC1V4Arl-9!Qjg-bZ4jQ8KCz53Ao!MsgxR~Q2O5-`@ z3^@Tz`lpz3CeP#;#|)v$VFm^aJKWfFdN~snOcW z#QYi!;`do-8<)Y_*=%1Sz30WBSg=)nB#>p_321ne1mhKPMf`eocai&{lW2$bY+}Ri zMU=23k^pZ4mX;$Eq_+Qh^sm}pYZH$3=FJli7gd!vzaMCWCR*cmWoGt--u^nVT^PS=V5OzFn=LW{&iQO(G&P0aP{f-Qx%UYAs=V(H;&t3 zSn15kOD%VPaSvsJ9c%IgoqpjF95pUfE+X}KQP2BXE!NNarL`Jo#ZCvIfrLPZ<5|*j z@3Y&Pl0dZ5xgMxXO+{t|!2mhn&1)KL6X{Q?alG9zx@hLSy%7@pCk!16XfC;1NnAMD3U3*# zw@W8>aH{Qi9@bWmx8L}MqeJUHQ{uTb#Bu`@4lQXVVlRr7-M~(njWhVL;SEckXuBsd0s+NN_M7ajEL(_W^ zXjgb>iolcVCocOs;$1!9zBsFk+O(lGIdFL6wDNwm7?!%IAW zN4VbRe`kcZ%!?gcDoh4OTEjZ_&GWf8qOsLKbc|tlFB2k*$H2YF(-%I?9-$5goGZ*->?bvk>nWdJjzS%OV^u-K+iX;9M+adVgZm{%im&|2e~OwQ$usb0c(OnN zVQ%6M)&1f&;7#0J%W3RPp@EBn65`9Fe0VG9rM=`jwVw;{g@>*Fyt6ND9%GyO@mB0U zWqB0X@c!5P+mpAz>F!frJFX`Ck1f-PYxdSHwas&XvgdDCLL;GA710tjQ4>iS8;aWv98w?u_fBb1?K$VDJT{%(3g}l zC_8o)bS@4Y32#TFU97XEZXzmx&H4FEDoIm~_Kb@eh{)O3J-goLVz4=nvKxpn)sQVy zk&NsvWmr0QL5j7 zGjjEnVzPjRtl|N(Vshv5YEj3s7 za>g2q?g1QdvHL{chLhD6YWf@fEd242huywM$dtAXBcF9VS_X#xH6nPP64U-W8WCUbIHsL4{#ZJjRQdXS3^jDt%Z&b zfx?4NHK)9K_VSgXeP**m%Oz2@kxCWs6AaTL)uO@ShsTJ~VA?`zAZr7~=mptwh`4jB z7Qm{BG25?sb~?8%^EbB?p-9(fgo8WVTfV}>l!H9H{m228gy(YfR+;r1`EC$n@P$*7K-N*i&v=VwzHq$iJ>6ZT=R~I-gTKAORX&C z?5=!Cy7ostM#dO)GX7|pC1t5ep_19^3dBY3$uohYhUo5(VW(3=$G+$+-z^@+HsE8b zzdmz^;&M=c5bQvjg`{BQOO6#31o1p| zcWJ6E$$A0~F(I;cyzlboS7kO#Qw5k&Fb2DiY8sN2cEK(9rS8$TIDr)0AfG?e@$GUY z6`~n_5(82)@Vm>%jw}8Dk&#Je|I3X0d8_k{8vLKD6mT_bqrajhRRXoa~?)XlDU`PO7Mf(Pd==l*n2X!O6o z+kotFpPCo%l64T|3*QG%Th9W_*_QTrj`yml&Tu2+hG6_wLc}X@jl3|%gU`NWM4%Vn zE=QSkSp)hRO1l0z_#18+!wQychYm7Q+aJu@-62o?L|}QUGg$=*l^Ta@UU7MvH`pd@ z+$k%krZ2!pL-3L<9*ES|$YOR9Z7J!233d$#&IDKpv4vNpNy`H^az(2MNc*?2@xyYe z0noV$^TeQv-nUTJBai=rMn+73{?U%p(-}XqoHOtO!aWedww}=>{aarBY4S&29UlIx z2Nc{2LMOy?Q=&0;*jqkod^94hIOTOaDs9>htV$4cqxn7Du!TAq>u5QHI>(-SjR-*j*xit zguLN-+%`0%GbCSum!-$;+4#O|@nuE`=s)pea9X&A>{2bhv%MnXqrt2|wY6Wxmya2W zIC}l2pCU`JzIlcK{hr=65m}0knX{MuKM2(kg2f7G=)gjRxa8U!IJF3^nKQ)UUvOu~c_ZJ*o$#~9qdz@oA4;T$9?Rdl6K zHW&`%lw-_lQ~F^b>R)VOSYeZ)7h5+hh82hVm{jPYiTlC zmUy*St`+pSuWp7&-bb=j;D0A|s!eCgafr7)p{g$N?p7=ADIF7o$^kgRUvQDBb!q9( ziKGu34;+IXb#-vaH>tszw39JHubS84chszDix0>yIxA|*l4s_3x382JcV8Y^GZu&x z`|w=z5IpDSb*(IlLTYzIo3H%Bm2&-}a&hslEi51${&ci$&WNqENT0Tp!IHi`|A)_k zbF5&>83{2JQY{I)3D6FH=gb)ReC^#-%D`3R4J~HCwf=|Gsi5O^@|&v-ja=kBx~1Lu2w) z`RmuKhRg-5Bg6Pw5mY!cnmeuHiDgtfN<;_x?;->ZuYm<%jY)pJ@Ks+y7~!Xdpd;mx z{@tnqCyXJIbGFPK{a_Bgg*C3}hQRJ^A3|62ZW1KAStaZRK+ zQV@y@HEd7akxvyGwDw92_l)0nDEK}VB+PTGiaOv{wh#BT-}hos?swYiNSFhqQfatT z-z{!<1w5-L!$nWW?I49Bf{i?YXYwq!Rg&O;qb)m@N$o`tK~LR{};xn{y`qhu*-ck<~l6Pmfxq=_N%H4 z2Us;gGaR&ZmfR628tlSy*{|}8f~2GA@pMbgqfa75r-&yn*b6BQ;4r9}b4Eu^>7;7( z^lvMt!Rux?O3sOrN;yMkt#eWdb>Fi2GE7|zVNL!FDr2(&y&0+<@|3EPBNswC4}VEr z^$bckH1?+6bwiH`ER4?%bc(r2D+`C49eAkCxslN~3e;nv_`lF)N67Tc!z`B<;)?e7 z-HN6~+)JoYj*~3HjH;A*B+Gb-STF3ziY4^yD9@X86Z$(fy4hx>CK95Zo`Xj{R{4Hr zk*rH-sg6%(!8x|PHIi+Pe@skg73aV9K0JhS@1kVi=KY0@V)SK@Kx<2vgPu12)rBLv zp3VDdo!Hhd*;9Rj_1twybbKhD;Om zr{br#@s#dACZ;ywY2---jhyF2Jf5`%*2AG0G)_XFuzt8t9|xO3Wgl@DOq|q67)`At zk8U3*GU8_u$MKFD`>d{fZyBo6GjY9(w2hqVfj$el^f!1sy4}Mv*}46|^SpktW+}#W z`-A51e^4h926MFk-qWm)pCOO4qN`1LFu#nr>-ncnq?8Xc#aj9~;A8D{U}BW%zr6q6 z`-tWQzW47x!n+%Bexy3OR(5ZpX!HWtF@Gr4w}g$7v#T$LG*4xpyEUAsb2N-}+PR+voh$1}Kj7V*MB6N0Ld3GqO9f zL<2KdsIYrSFZ_&m4r+WG($MZ^J01 zo)!aZ-d-W0dPm*itpd~?a}wa!r3QocRb?wff8n756dC`ek=}*77VWxC(*Ng9m83Sh z!~d>c2w5rmzEhRO$6D2S+o^irSgd#hUZkuQ6%V6^@kmi!_(MoRtkDTHs`wS}8&%_f zcatG(RF3wTGDcd=~407NzUzCClO+idXmylpgi~~X>7FDW@6uohC09VO<&sCOxkj!1B zuyKoKnU@fg{CBz%sEYviz!BUTu;n_S5c*%g$^-L>6jaIoiLIxjyth7Oa1Q$rL z!%;|F@i%KJheLKx>_An1#{jsVxDD8+*p1BmyKbL|cqjGF`%5f7*b$mL zG#z5Lf%O>&(INl_@cteF-rsb34G)13TASST=X#F);BuK%SuHK=9z0b3Hx`xaSS&Lm zhju;8QW}JIvQD$N{pYd{V;kC-)JO6pTA`P)AhnzFGxrTsT*Xv-iK?6ZdXJ`lXDrOV zGUt9eXaC1f>O{yVE2qtcoVX@V7}3k6wvzW;(E}0I(XHQW`bxeNV?qzi`AO2p5!pCKbu4sWNwc7Rg{w^QdTh}{4@V2LLA0*`f2)iRM@{F*Zhl4NZPPR|bYYVVILZF(W#_|B!o3 zdT>nzvd>axHbEw6YB!-OKJW>}TG1FE<)LH_y>|3ZC!q6!A5X6Y>n%`2@{7DhkQ;mk zXdr9orR9ZtKbz>NHWe!M^POd3i#$ZGMx0BLZ}rqvC#Ejw}BbGK>Qkl|(g+%oz`rnz+MT<=W<4+k_l%W%Z6rIlBvCGREj} z?3?wO{Kb&H%~L;{@+`p~ADqOrvYqx5?T85K6E>gb_qGzY`*QZVEYp0B&on2dp~%)6>9#&ImF==J$HJ&I^(=)m1n)70ZZD{Jtc93qHC$@KdfC+( zyg+xR6jNdX=4Fr;wyEy9yk<1T(+O+7bVLGp6zx7`5{ z?=Ce83 zht>}nfTQC>>*@!X4G$;FzEw{?K$!i9;Y9T9RyC7&&N2s4%_v8FOMs=(hOPp`-U{Q1 zMU*nwrUVR)Gpv@Eu$S7U?Cgbe$l`ub!StS#R!GH5x;$mD>rsCy<8YaQWU@RZFr@E2 z&RN@UKFzs~ynvCl#f$t{@R86X!;HsOLq7y82QiowwjF)*>f_cspN~8WPJ&&E09)ib zWFdy{@LP~*RCs}!RT7WKl9g-nl5d4JHS3|j0h#>$^BDb3f0}v6&Lc_HN{G_R5ORufK|&Omw=SD@8`#GY$6hp2-Mr^Bp6gEVLp%n5Y1JyH)2q<9T)- z&HA={l_ylSwISni5!!s@lfk@TPW{(v>o{5QiD1^(3u>0)7fOZb($n35pf49$kVSU* zxRWY1G9ztnk-a*!HkQvZroE;r-1eGBur8RO|3dCB;j@oGVCm0{Z)IAqQ1mdx+x3m2K6vF0?Ol@=kGcJ8_?!Llifce<^N&$@^pH!(r*D$gHQ+ zs`aZY9&?;k7wlE6N43Xp9alECt4EEV?~#qpFD^aOH|p1BLM&Y=p9@5DFAV4K0NWj@ z44tcl-3n0;Oke<2n18{oyC96T{S|QxbVcm5lU7Y{o%^}jhds_|e|I4rehjMdo(JGY z`xmC7;I!BFHLx=?#;s?5JrIWLG1K1+7s@y@r!oCz6Wed24m`%bl3fx&7sko>$0!dn zLxkLzh%a%qz_g@;!IVtVlkf+L(t>!vndp!U#S~CHm?u5(tzC~yQ$pS&lJ0;ADYCB{tA6#hxUE`@={p4 ziaxbk`=yTUb3)8I%s0;wdHvO|MtEHvp__f`k_x&mUEEjkrmL(m$G30s4ry<2&i<{$Tp1@5f&qYk)N+RY5S6fFykGTnO;vMMfw?t1t$x2S4 zldl-!W8W^c_yMrb3cs&3S(8UF0 zV$>b{y1F#jwDPOPHMIWqF&_EXyiNTkG?=+&0a8n|r2%>82}+u~a;!YRW@-IiywB-; zs(3SJx)icEltCI9bt&65-Fbb^a-@rYWx^P)purc*=+L7?kGjj~uzl!A7OC(xp+;)n zx@Dc?nKEZGUkTXo)yMwBra-SjgK$@dlob}SxcMcRst4^)+nhplOo-w+=Yw|Y^k`9;t_@hdEdi??#+ zidGKgAxPJPGagF68XE5(z`i-&Qm)_42n`(YEid>)5|s1{1sZ3;H^Kadml<0N0a4xS zxsgXKculLw(Km5U`!ssVwzU_5Y~7;7RL&s`pUBD!YkU-;pvkP995(wvqQbTCri{o~ zjRJH0QC^3MjsmiDZl|Pp^) zUAfq0s_F4FeZ!snYcSSVeIWGwP!3~@KYN5mHBvR#24k8hd&I-im9F%m43BY%U*a`F zRnoIxk2NMZ0@skM&V42kjGHEQ={k%3%lk(uAb(ktx^nZf()!@*r3L%F#in))tnJe)qnoG~K5r7_3M4uzY!3BKRXtL^fTI11={$r>99!TOAb@R{1q_D-1dT zcZt@VzW9+Q%XWG-&( zxX=qz>CYOpj5$Xlc480*(H`l_fy8X7(pbE`OBu^qa_Z~~e@xd94`+tu?31ZZ_P^et zYZ>O;a=z+8yuKCKwdJ%+i#k&Eo=pEqxy`|o1m$~-K1jc|pqR)8r8H&lD z-RueWHwezoJcdNP9?3Iqys)%+O1!hX374^CZk$c@PY`N%e)YKQMy^0XIl>%Y*4l{3 z<91W!eZ86k1O0EQ1d(d|^76ry@X}}1j==VsW=M6{r{2s=wOj6i5>XYLSHcVQ^ykob z*1mPhTWeqc>*IZiP3@#ePbF;evefP&s}iLsLoWTXr`1N{Pk3l_4v3{_wNv%dXk_+K zo|%SM@GH=g&-EPA=(m9B+N8vjv>S4#;7x{gEUCe*jbw<)Y@&&o#!zusD8gRn5t;b! z*I)0*8@_0^pJ&~hrek0x4!VS>AaM$(n7Vk&uwFt+DRst}_#{FAk?2D)g}PSK^dUj9iU%^)bMuAG zoC3}GuAkebbAngl{ILPuVX*C@OBo-D;In`=@#)|m!`nXRMyDzGt%^4MbC8Uuhg(%Pje4^f^>xhasAo*$uFvh$__x$y&kbSe)>Qvo%a)Tn$-!vbJv#GCQWX=Mo zM4D-2APtF<%M;^W_E=1@QJxpu=s+$9W;&~yZF6A-sEOQ%D>&n*V$20^Q9Mzq znVflTro1JvlR%jx!9zwnz4F60X3gFWyIPU^93ey3&#dNbZ?4;QlFd4G|jm=*D1)KEd*#Z zU?12!{8?gdRe6LoDrY}|pwPdk?#u-7$KqV1BwXm^sGFwYYmzCVlG%`rr9brOEz8*; z2hgbF50-JHV)N1x{>%SFqhjd^W-XBZ>;JrZv^RYEdKCbu%utS$jJTXme`y5nt4p~} zf?ZDbLuPMa*Fwa@Pl$&IE>3^5VXbIcCWA98^fZb$Le9f}tt3Rz+@#sOk;B;M9LkSV zhGA0fS+F&NrpZS19QnW_Y1G)EWP>jeGW{eCQ-T%rWCC3GNYwNAZ&+FjDv@3iLIRqu zBEkc~{v`3E3wI(`t2+^E-(Mou%{X~^vJJS}sRG1{--nd;O`J#*W=GPWL+DE-4CJ1n zaOKAHM4SO!tbr}zs_Iuuk_hckrIfdz^nsCb z!_+_2j6fmzUzUxU&_2xybXEe|TpmPW@=}AP`)O;C*Bx+$7P{*Rs(NkM~MQC|U1H-t)@E zFo!IXNnt>)${tpoA&4f1IFx1y$`w;6Df*D@eFl_$vhTWDmnFb1u8Q9)VDLJJ0j${K456&^+A2k-euJ67XOSG zx#3G5sc0?IjwX2BkASV5O`yUXiil4wbMgz{tKtKDxdUlmL?X?6BVv(64Z2pz57z(f zRi*KRoYrvb1LsyFedyOB5v5l}aBEAtx-ZXqw>5U~H6%KID=H_p#Q}d4@%{o{OPaRy zy_6hI+4qMJ*y@vZ&S4&uXgJFGHHo$MSCj_#L$--5 zWuv$kC!#+FOyKWx>Z?XmhcyL?ntik$ZfpIlHT}m;NF~#1(Ty@s0R?XI?Ixtn(*O&E zYH1vuLB4s*YXA6))s|H?EvG(o_@lsN+mw&LGG~+0@iZg+eb7@bVMA_|GcG~A9ekb^ zeC5n*+x%f86f7BlY+@xIEx}b(1xbtAN0>bN!5sx;drSS)eRGBZ>P_B;_!cT9{Ms)6 z$T>}$Xs~Q+XKG~Wf~F0cl9pw}9@Rco4IFtfRHqG^Et--?{kB)x!Xn%g<> zc!lQU^cwr)y7&D=?1Xz>ZDBrn41Nq< zwk|ra!a_+|0ET4Qqf*rfp9jl)uq$`yg=X{UJIYt`UZl+^6SJF#qhjl4bj^GQxMeTo z8=^$3v? zXCjNcG*M__EHI^k)Pqm^?`yncT=csFubYi)LC2C&Zp}#rU#$^R@^#k)NHul4gGNH$ zcQ+wXa+^m#N`J$e!7_;yxJ@XcmKAS*Bv|KJKWBUzTY1_#1A85DZb9yN;@K5HQPmi)*j5|VQfF)AWqTBT3kuQxqH)w-(Hr!@O*G^Nas_nYMlQ30Bcli`48BKmV4m74-}^LUxEt5zdGbjM^D z@aV0(Eu7v9v;j5aosz6_F*V~t%$|%Qwjwhrih z*?+gPX+W%Oe?pth)>~*JdbEHG7*5*)aS*eddi%TlT1H~Rw5=i5QjI1Sj9%6yOzPjE zP0}sVhPC<|(T1Z}%79{r=R{w6mHcG#**;*&m-^u3Bor-+yl49V%(q?L%eAF3qp1H_ z53|f6>!E3v*b2eWEx<`1hDpB%I9Y^fifzlW5R$@V*>Ba+CdLX8UjG6% ztR?p-M^ZQ61A_?iR*%e7aSU&!!jtUVw|XGV{kbOo_EwKNRh;ABM{dtGW1`2Ov>U*< z#fJPB%$xq31PJqX&;!@oNJs%&jK-beDfr-y3%^|$Tfdz=x+lq@fa8CT)2s&x0%SV+ zuIuLB^)`vJ&a#i}i2CA?S0j*bU#>xV=hFcd3xaL^K*R!ANfBT5Grr2}Wk%fkbWZ-w zr(+~5G|~}y{`D*m;wRP4!m`1&tw?w|T=}7;RO~;vNq1Tgqd~0u=fM&02`yFje51l}>ByD}yhj02Nsr_YJN+*z=^t;TGdm<9E%c?c9sOd37fK^y<)kyz}aKVGOf#|LtTzANucfGPu(zUEivL zp)h%cDZVzX(ErGE{=p+4#nfU*vP4IKi8i|UaE-6`^T7K)*>`>Sa3Svdzq|~J|65*$ zxw=~~gWK9HZ>`1pn5q=$wqqoT_?OMvU2~+z1ogph7KZySIN)Sp+AS>kUpX1R%lym9 zkQO1ItpQK#SGx{W0MX8^N^@itzNC{t^SkG^`Tf%c-x~&EX#m8+4O{+Be>T4%cfS#z z0tbk@=NIHt52fGUemrB({{U;n;T_uRdXYQrE@2=&fWQIye-y6PDke3H0aBU=-K|lF z?91?MX$;w~5N_jeUHXA^k&5P?drhxdyA5E4-Zyz48FvVXdV2v4%4t!O0Dv0$F_7lW=3 z(h82Bc`cuRYba|V@0j@(_kXEYhx*C$M_l$bL*g={sDKzE%V6?-Qgypt$CzH*JXD&s zAU_4(z%<@MavZ=L^-hxeZ`atJs|I2rBW^G9xDW=`Y3vv2t~f^nS=yemPPd(r-?YCG zmP}2G5B_k}+=XKd^Lj&@-Qa&{)xXgW>A_>)YcF1PGCR&4s3YDQYr+a(tO5U+>gKI~ z?2`Hz*1A#AV2&&v+YI40!VqY_+{YTi^z>>Q5N|6L9I^=ozMynshnh_C@?9HFl3G)B z>?oLJ7uz8g9a7~L@LDFlV89oa6%DntHD}h;)kxh=kH5Al)I|ASopvC9y%eq`Tj1 zZ*WE&XP%iSzVH98cX_Y1H}`fN*UY}J>%5NhIDRL_@<{P^oseu0Pp(v5O2D*wnBPKj zCGhz2BbVQsq-5E{gPPE}6k?AW*22vu1nOrhQ_uQ97l~25sym{9;bTw2F7e53`t5UG z+moYKH?QMY(Lb4W7P3KqQO!w=JIj$fv)te~cu5ssAvIm`WCgv%-Jf(kDYtkM#WAmk zMsa#PYUOzZ^SV{04y<;KIp!BLYXuXtZ#{~l=4Ro3%p&t@WWLb{_|CF&v`?Il5BW&W z57lj%e7XOgWdrx?0|asNN-UKeerhEj`1EEf#Fy||&-&bm5IA+74SBPp<`N>*!_nWT zdhiTAsI;AH~Vq_vbXdF0wKcRTg4!r@c!T4I+B91v(h<@BN)5MkOFS=rgqgJ`TYWpAU!Uv+aP>gTy+k z!s~dvKig41^)c1J)Jxds-nW~MS9lIEz(=PqZv{?% z2U`I=?B-Qz|6{@#R|z}1jD(CTr2GeVIjD{7uq}18dyJ6K1S`eDsqbpbh(dGpqLjMCUjkxXLgLPocWq~e$Pi|SZCjKf8ydo z4*BMkhq2qohaN^jl$Cn2%0pw1h$%-O*V*oJ4(j`yS5W8z$)_f4^$-!wujvQpCMx$v z8;3F~s`%pC>ZuODQGHSnpj(UHjIrJak)|&oIZ0;Jl0VS)`RQI*Y*pE9gn)2oGVUXp zOi5iAf(|kYwU`by9LwgkAk;bI7_YbdzF8}*9NuY>ZGuL^q|<96Z3R7VKuSrp5fnJK zybTW@NTlD0aG(TCv;DSD%XeVByu7Ns_bPcU^%+Ag-4wt8+BTvFQdHvYPKS%5lSdmv z#c5dpSqO+c2i#el>cMOoisfX7_rWYrwL@D|1unkvLQYZwr@6%tkhbDe*!%uaX`}5sUs+m-n4`zl_i^5r|*%pRp-RO*E9boZ9tq8|0$zJ&v z$K^)|6PM(SpwT{PYa{t?aZI|hF>L=k8fcKrSzVooRgn!jWAQ~5NNe5X`3^-p6?dF9uelNL#f?7LAZT}fhve|i z_Tt8O03nfs^To-J$cS(|2cA_6#BiN~9*gwoVt7JnV_t;~)EgdE7sazM#9`rStGY+h zF-3qlX2u1x@+|xvD-Rlr?7^Znm$XRAJxpt@WreYQpR(e%ZX6pJRN#yrE4q)$HTt6% z3*P@zJ(d}@1FFZ`>wC^bm@Qv>lBZoWd5^x4Wtj+mhCF%*?&#l8iw($&8iq@_0 z^~5=qYkYx#Q`h>fhCy8r+!@og(Zr+miD{*#NpansGuKeN_Fe}-r4EIJ9LtLdUF$}_ z&6=C;cZT7&{;1=aj;t~FixL>dP^cd38Y#0U3Ac&7{`NB$GoQ(d6qd6Bbiz1I3#F5q z>?+MT&GPxPHCfJmWe~Jt&Z(-PECzL$v$k3O$Vd@_g6tt~x1_n6OwD_2ocC>s@7wlb zhF-p4K2v1Lp18yiphecHOUyo$ud6!;776q$6onmyr^%~wTe2~SLUX`(>A|STtk@FJ zRY5-g-&6Tp`EoGY@Yp`U!Nrbt+8!dnDd)Yo+4%U*gu(Dy#4L*Qm2hR^@Dt`9;sXFA z8UpJb^a$L{+yB+Y;qOa=z!*02`X^(U2ea#^&ULgi(tfVF^;XBOVhPS!aeufz*zp}u z`-i84p&TWk?B9eeC6-f3tJkf(_0KMgvDLFf7j%;jZ@j4LnkC-}(*L1|tK0jgs;GZcX&QTmgS+?FVoa_s?_^?`NGUk+bp?d(3Qa;k5 z%6U7NXMK z?KIVOp$U6yWzTJ^2HfhBm@H999U}Z+E|n~j#vAb#^!US=N)jAEf4_q#wM{mPjKz0> zIqi8cMr%v-3-LtYQ&%Pt>{9?8i+|?s5+i^7zr6EBY?|VL2;anGS<1`=f=0pk!N}1U~0GK{-_(5EA2?PyfCsa zm24UmEudmwb=Xr34eO$-N^jP6b5vTl6E!oq6kv-FD(6C%eX09DEc>$;pMVJDi+J`< zfEKt3hw;(fX(2$LjEu{=UEc|9VVmS5fE7hW?bM!wz_4dfd7dJUw)6yh26KL)Za}eT zyWg>Ar%$f&``8+c!_H;WJ-=!0PT<_+IPYMJdI)oa#l0q>z=iv|POz8l3U^;jo~MD8 zTKBr2iam~V9PK%o1q2yb%BfwO91vIT)$Tz_8EQqOVwncmU(Lve3Bt(Ye^aA=^M$F) z4Q7maz5*Zt3d*@2!Fb7Uhk%DEy&Y=5SNpRcEEEMK9)INr({49Eqt$yoy(+Wh2G#GQ zWR?Ib18DVLR^>rU+5Glsb(ZX9^9~~sV{Et=1Rvi^nB53OhGTs;g#9E8sRsUf%_553 zW$>)}KjZMxtq^yJAOI`+3PVP|>IwrKq9$AsT@5J-DG5}w*9{dBgu{Ji3YQxcbOpu? zqaLBCpRN!dHk%X;0frF0Tjs`8SKn`55rdjKs)m6)FS&nC$61X^!zmxT0FTIsyq_~V z^>H#)HoIg&jD7Hzw^U|x?1%tOLlx$mQY7Edm(ezek%aUP|A>ZVZ^n`DWU*h}LunQP zP!{!9B0zqeW-D3Dd7#F+?gC;w;yf8|kou2q$oHa1$%l;4cd&d?9K`| zoas){aZ+XGwNf`>j6e&TjgScq?2;p1{XpE~H_jEjPRuHY@1z#h{e>Irzm>n*F6s3{ zrjRk>;7lB@m@>}p#J`gj+2> z`t*Scfo!bULBoFAUMps&jN5eP{o>4;ws|uLeYrm~52XJs^T4B*X4|&lpy{$&_G)Bq zp1o)#oeB{#yM>l+B;(k$qOxVdI2)Pev&}YIpMuASy-yAuWgMpm&8Ck~ro|e30+)x6 z`JTtC(Z0M6?nG`#D|acC3+Lv7vB=b`A8L+6=CHTyBGcWR%N*Wb1+`I&lkmNyN|??t zwiW)~pA;P)(7wNz?7vZT{I@LSz$>&C3uzvaNaSwUQHQi}x{{EOehivzpG`w*Nx<4& z4IKY`m9VsnwwlF?^!4on|F!U#DIBsFyRwD960v3q0^(*_#sYXDX}3_Xj|91Pdpt4N zX{?FcCLCb9e6;4I`EI!;rW$A2kV?m@5i7k18Wqao9Cc|;`d)N&;93FX z1@H9_?RsBUy@m23sG?nAJfqhWTYorgc05&dn2+q(!S6E_gFc}wEUO-JeNf^8+G+p) zX)H`?y$?Ma;LSoo_iNul_s>sU>it?guydx!59iE5_siQ8Q*r%5+5T@e;huGv&z2v- z!_g?!Vo&4-TQHgJ>YO=ZGD#r=B)0S=#qBg4r8WEhg5jVoK23wQQ zXBFFuH_5jdwiZqXqGYQw#2n>DkGPQIwT(#V^ts&T8XUR!^tdy4X`&HcnvP^xsIxvtcuK0^B!UsrPQbu~$YeO+T?KJBtsDk}l@5ywjN zJh9m9hCG|G!I6*ubWrA~@WQ)SeQsH0l@|$8i0>KA=GVM`LM^tf|5Yt?J3F4b|AT2; z9`ex#^s=DIEIC?YRk>@Lg^0EH=ja}`?%e=HN@mh^gRXNobvIfe+)RUOTTVlUNq%I3 zq*rxivGi}l0}$ntZk)D^x(ZLGck|va0Z%UexlAgF^p?*%zKrF3x#9?W({oW)^Q7pd zle}`aUCkF)cRh7qu)4GkG_5AgFsu^S(=N;_#vec7_=8@s%1-jPa-BC9VrPz05&hrEfv=i{wq%GDis&ju#J<^6z08$+8MR zXGzC$W%|=Cd?9TE;$#CX875ug(tOZM2=<)&XhBpuSu5f|AmVP}bbS=j-)n;Lx`yCvHv5L7 z$V6+y=(7OgF8!w#N_EAd8`YHKbij>j{Sy3n20hpC3td%m`7w0^ot`Fsdf-AAK*^v zJHIw0yWe<&Cx<>L78ENxNShr8Ya@fPzFQgk1;p-fBDNy7Sq>8^n@4Ro?sv|3Vw5Ho zR%Eb7*ME3IcO4ZeKir*g^qd|XqqcC?_;XZE@ZSz32Dk+~5~TADdyb-0J(ibQru?h~ zJKRg7>0y68Sdj|#d`#Hi5bvT)HfR}R_{4yU%INTE;p5G*#>CNam!vD1I6EJJ>5qiicr7E7fQ%Qw=ijM5gHW+5s3J7bI*DsIP%r3JuyL zOT0?o4#RE3R61^FL2=v79T6F$mP`cGA~b{d$O*+Yojc6=*#mw^1JWE~1Nc*1D!LVb zKV7UrSi3RmFsZ`s_`>_0!niHqkQ>!R-vDz6%mv10`hz3nt`Ps{7O>wbqz_2i!;^FI zM-7@))o{I%d=o;w$3=}XzMm=EQE+>_nK2rG*MSA?ROs=|{xhMc&}s7`dtt!sN{#7Q zH{QPXh%SP-=l79FKE!EG>aFD0nl$Lo?*1zB$4r}Z{%qtAeX2cW7y)|kUdr&MM+e3n zNd4JRR3^2;Gjbv&)ZET|d@Y)Y0UiiBL+6&xK?NNG1ea&aGRI`fR=tNM_}QKr1O2^! z9r}Box_5s5Oz2Pdf}Xr>H%A6wHtek8$>~R=uj9%ogtGI}#PvzW74_^eodo!xARNIE zneW3&hVvq`LufbS)}TIo)Q&g2R^`>*+$tMB{c;=j0j0$81;$yAI+KI{eR%kEP56@ZS+j9(g>XG^Sv|J zT5IT@M8pA)CJ=e-fid$pRUfM9+eHv6HUdTH#H&fOo`=0FuV<@zu!FHWk>7^F!HSEn zCxm1?)Ku1UnF~Cslp0ImQB84%&#M9tsLO)uSA;2J&j;+Zq~Qz~-`0{vB?k8TV0#ZG z;oN3HLl9x(Eh55dVhoA+95gTqY@Xawwf`nT^6;A zUY_Qt*BwR!q7lYuJCG3f(7)|EuErESzY03n?B1u&%(1%uIf$$I7!3vP#s8um zD^3AxY+lr1A8AtmIi*G9fs^L}Lx!=IKGBuPcUo`BYi;iElDR0faef+!<#!`b#Y(x8 z%V+9cvE!Aub$K`9o#!c^ zhh&mLu_~1)fk%ffdfw$X^ir=j&2>aCyDL2c))FVIbl0Kp@0g;DgisY%({AV^-UpPZ02@@VMn&2|FD}wg^r5v%5B(i#SG9$>aGC!0VDnjY~S*@Wu-dOGDhTC5_ zPUP`_cQXE_9TN>^h&nP4KTLCAqyN6?KmWz1kE#79n|_G=WzVxNZ?84%M}J>AesiiE z<3PQOLpV>i;j5$$!{{31CXB%LuScO^31tBM@!FY#*&0#e=dY&zWNQppf=Dc9QU>LZ zH|fhp>!yFwmQ_=lzgYM}nZsl7(L^_NLdKI)ko*_Gmy`V7~R3=~5lMy%t4k~r(P!Q>$)UXbak(H zQa;cQCb|ULA;0{&*AGKL-(>s>xDkDDA)6t7kU%+db%=Znce9DF{?^i~Xe2G8=>_v+ z^6iw-DhbmD0Vh>b?eT3xF#TprL_8DHa&Rwu$?1LeQF&2D%*|D0qDM=W;^sMt_fn?t z05*E^Pka4mGZ%9`DIo{?wt2Q!)1(+96p9%-Mqf6wtdTk_*v|uMvw%xQV#&sVpxH(% z;PQ$PU#d>vOs3ctu-D|~qxsbeoMv)zj(upGe(_((?A~uJJSdsx0V|!Vqj*%)@Ou+> z{TiTMCUfXQLR`Pd_>42Xp3sHUUJoVy_qzO)!YUi=BpP_SjIcMa%erme4c?Qmb zK1H7Vi%K1$=DmjRIb&tjyIH|lXGwR-x7I|kYmV$H+)2y|1NPKnKVbnaSsHj->{h!7 zarxid`k?oNaoYRw4GZ{f=l=-Z``gf|i`!b23(dML-m&8Q#} z*pEYKq4wkMDmW#L{uZ3-O`a9EHRie-(Kwjm*UzJJPYNCjo6iE^#x-infbxg8?8PzA z1-JukOMX>intPn+d$l?5<{AFF#MC?w1d|)5g2_@$m1K^5pL;n6=TTs}bCPZO!M=v# zPRv!`2*~lysCea@h&R zCC0Z=5>k5hxc5s5B>M`el|ZnUO3L!6Mc#lCT=Y|*n2{5Krq9~hw(f z^GLi>%&Q11^m}_?@yYX^gi<#PudpHpxQOeNhXv@?4bi0xA3v z?&hl9JB8L#5l+E_r4$-HJ-Xj&fs}K-^_nprQA)V6QA1)^@4ul7w^_;Z4abCN6GBJ$^+o z@6$wR(bR1v)DN%036tQW0Y7LJW1xwOEdKe#+>83Y$vdtVKF!`>jHAKlYu29`B#MmQ z*H#zwCsrSBq_tNiAhj72N(QBE)0!zLML#7Dn8t0VM|mS&E7a}7)Q@UCUU2Xs>k=K_ z)%@j;mRXbG{JyiLAn7mEh#IzL#|I1hSL~FUo~(6Ig^L}y?oa%kVy5BR;f?S6mvWS_ zJ=}W0l1JZtsn0tLaj{ukurWYyYRKrxgJm3wi9SV*kZqqJ(O@1Vw_jS0Xtu8I#1ZdB^H+Bb1H%!LgV+7)l3-^- zob3rLBt*X-q~J^{PYYQF|3@VCMm|bsTp@FwN%5So;rcWo4*w`ICR?dTciOoT=d(C# zGs?`3@BXvSjo8DVP$Yc+e&^0ZBt4i$i`R_A(0c!dGh_wz4uA1J$723J34W@9Fi&iq>84uxFs+ zP1NE1gKB^PRSnSoPpSqnKd1)gr>en5985KMsu7Gd&G>88pyltY1|NS^4bXm94V0m& z&S|MoO|S-jz6Vnc%1%?AC#u2ruTq^Eny0FP`ERNLw!(iwHRw1^b>^N`4W>?0opM2E zRRc6J0ejYqpxWR3N7epnasMVi8F)~8yel<4mTBil7^F15{4Df6GXImBKePX5w3pVO zp}ij4NkV6;aGc0}ZF<+D)xXPqYrrxBg?#ap`0l42W73ovea2R856zyY22(C{J*Qy` zLEAjcDR@#btbzBFFi8RFhpgwResCu_^DqWh`HyR|h7*DTV8jcL_%=YXpXvlH_M^8h zeB1*i{!Z4h8%A&r9^zcZ8_n?>nkzS1_JkZxY$4L#!ycH;+73@{uLV@pVg14tVo&9Z zDo~C5`kKoHxiGgn$2Ie^%jjsMxU3shBpgV!8Zj8C8-!ohx5v3mFObk>KfEAvVs*FL z-mrEk%p)3xjID-&;bF_MrB7<-h0d3AE&12Zye7tcORGQ_P@+Xmih0#rVj%Q}>|4E5 z;bVrBgBh!>UDdr22>u|7eQbSlZkmyas6+*{koW)!2_;;c-hwvylR`pAf&1H~^4e^1 z_=3YlQO5LdQbD&usm&EkN!p`!D@SZdxysO=ax!krvhOBaHh6VL^`RqJ(iQ8iX{pCs z6zpBks!BfP@(iYND5GVSrc+#sXZE@ilX`r~ww_R`n@|nOsq2pWUCZVR^hY=M?UE)n z3B0fG?eQ0cMT)lH&TvBJ5r!G)j`lh5K`iFI#Vns1v9g$3}KKxeNUd5u? zzCZxm>0|O3reaY1Ebu3=;UcW6rwnP)%!REq_rA(s2>10KuuUwLe=2@Ua6@&zJCsD* zQ%rAPYfF8rf2JXU@q|vc7|_h4jjG7HW*>>*OH&+zgozM8Q}z}Q{wN_MqvFHD1WQl5 zMZPedJ%18FKuG%W&%MB~7KbXcKT88iTdGgfbr_!wU|(9NNbN>}g=mCLySc0!GMq$H zHVVW}=4(=ZN1`g}HdOd$e&$vpi*ap{m<8C=?;~qIYi<0Y!#kQTwAF@KiCG;r=pv1< zblx5enWVzxsZMUoe6>^ZUvqu_q!UyHF+XwEWPNF&d40-vBD^<1GL`F0#}{fUCK7`C z$EMWO8V65*p$~wyYpeC1MUguCC5agT;#I5tKvg@ zASb}Tf)#^u%4@G(P>9Mt4NF(Pt2hEPeB}jG_@T?n&SPQ{ELSiO4iJ!xjJg3 z(?3o*ZwAwtqGjo29|lnhpG?@q76U|q1-du?2Soz&CTJkw)q$Oe#oTV{@NC#90ej%m zg$jqOaV&`}jjuq<*eCv1?hF>Lzi$bx@cZ2o$|#7C|J|PP`Z?5|krqP6Xc!b#AYlfz zXWT9R(VhXB{)IgwUH84<(1_>}WL)18>L zDf|CembYE_$7T87134I0{kl<5B}!%fhw>cd9~i5ePmNWr2+$`NJi&{=yIoB3^^+DJ zZBX;8@AgpNFcI2?T9`Hf-SvOD)5~Y6Y|JX?nySHeJbhT34=|MUgourYyvlpRng6t1 zAi+*c7tVbRH~6F9(TDGG`0Qs2EZHM(h;F?aCSA5XYx+M)2ajAPISFEp^2+J|bvpP1 zI5@vshnxsAf|AVC!^XKqWS<@%9d^A;U<&D7l)q0i*vHIz|i+RsV=#h^{ zkLwT2Sk5^%70?X{N^%ED@h#&P>BO-PcRn&R;AvtUps7O~;c?fuBQK{HvFWZU7kPr# zpH%9pC)1UQ&cvy_4~LR_UaJfbf293JA7;yhAAXr=?^xT;HEs{7h-W%TJ3W*9TStse zmtt#EGR5)`oL<4+QcHrj>3vS=={FfR?rCdeS5z6E3b3{~$cQ;g^hQD9 znKl0=-ClQX4^ey!QnYQBC#^cnJ75rPdybw76%Bx_@XZVolS)|c`unK#H9WES{0Q95 zN9)AJH#F4tTz)+9h4r4lpY}v@-YUMJv5gg;dZU5Ftp^B5##b>fBBvPo-xczF0gQsa zt{=J8?_9yUE=55a_%@o-yE#1E*_Ib`+ubJ0nb?RSM-%>@!`)58)_{*?U}pSDsna4W zZqE>+HYk3a7kT(t2sQ_~JGAwXu~CLrh+E3idpeMrwP}=anCa07S-p>|f#pOBcSCTo z7*mkAG!IQeo}9$3JB{BaHow*KN%$6A$()S4P$(a!(WP`wcESO_3~JacK$UT0$Y#e7 zb3HVtG~Sq0kK$^?so{g|PUat+wnAz`z<3pZYP<>~``TO13)r(cGSbKVRWmB@AaiO4D;&g$Md!QTdc&KQ;EdW{RNTFm6y{ z!iZu(;{Ib7iuGCSrLWL2xc5@I!*))_;J!;a*RJGdrsNjU3)%RT&cH_H;w0FslswNV z*c+1M|4=NoP$rdzSyl`>4azv?YnGdt?|Vw$Bn-kevY5qh(dGkUKe@c5hLmf0;pb6ua8pWY>) z-xZAEH+PiadPtP@@pag>Fe1V!nA2qJ>%{!>=c}P3Z({JVb+7CmB>$?Gq~QJAPTxfM zADzBsLni~)Quo~Epo2^Obl`cEFOr+yRD`yi5N`a?a$-7y{Lv7m#3v%9wvMM!x3_l@ z3c!J;{+NpYr;@XoO^O(XzYrMaXvC*9a z+r*pG9J8%dj!^M5LOF-?QSvwI{WA7#ANku|$b$W42OeO*D7)vXCRBH>_05&ZtSgh= zyz;Mk)1oO_vTQ*`^=-l$&!>K#7Yz;5Fr1JqI45!*+EX&XAoBDg3|m1XH*w^8Dj#r-Jox1i^ke>X1)QRim(Z^tnK{=tz8R_9$@P<>weUYeA7y*6O`$> zg$wGtF&Xlk1Mu7-<_2Rjpy1P03nct1GYNZZ0exFIEh7iNzM1;F(<;pbfyt8`ZSh%1^d4o`pfrl5_+YIp|_R0j|ZQ2h!D=(ok*TbNuYXli_KAv0iyR@{`KZW%r_!T`38BvH8SD>e)v+Z_O7vo(0EE`UXe}S zj5ziE(D8y6HzIo4=qytr+4$bH$x*!dc$w7mhLUjZ1x+!(DFv3nSL<0W z(}I^KBc&ghdWk_3&^Ske^Rqg+V3y0D^{$$$vq@k`niG&+>*vv=;`5;RNyxa()xmQ8 z?1YrjqYqDZ_MK2jzB{H0Z~cpYeGQ-`QA#PtJ2j? zsnXbKiF2k~GxxKWchT^wqJHNlDVOy^A*qi&Oy98FT+52Y=r{S_r5e7LbNeU>7o^ca5Q&kp2b>HpDz z{7ljb^vTKzVUef*zctL{yhk^UVrljo7APH3G8VqnW@O{ymQYsL*yS7*uWnK1sK9Fr42^$Ms&HKUX);;>`Hh`NZW zWGiDL&eF$(`M5%4`pwrppE~Aaye;0Br8(y)`cW-UANxZ3{uNYXQe?ws{dWm1!tYc< zV=dX=)X8T_OxYB`)8uCPrPD^_?>lYooN?O7{^qpdy8tbF4s=!plx@jPAuy-SI{6P} zkJa$6oHj=xr%s#h-<&o|)?`J_B|d1-Mz*Pc)d@`FAIoPH#3%BZ9N`)HOpoS7K67Y3 zBcB-(p`0_$ExPhwCun5mejNIBYnzy=@TVs=D*W%G{=&Ya{y1UB5tSMUA$W7j&tOop znD`BRI;R``J51v@v+Z|;MyalPUwUc0s}ex#QBu)@J~Aw!hy{q_-)6N<_n(B}=R^4! zXX8xfhZs)poZ53mW-cIhd!2K~EbZd?a>_hyom%Sm1J#e$%UdkX`@gJySn5x!pW=tT z|DyWIg;HGJo>o8Go&J)CVcfYx6K2b|OUt{}jEaY=k3Bq=(_9WRhbES8J00!77wnGr zT}h@w6s=`?JQ&=LHZF`Z@lsJOHBKaeMY`=$etKhO&#+T9okMcwa(-;UV`T}ttZ(kb z_2$N+TK70Cs>#det+W-sVA<#*z9ZCBkXm|09A;chRoLaN_E_Od2=X(VXKD@DpF7m$ z^D>G8rfHTQn$O^Dr(U15(<>30n*6|2*nzHKUVH@vZkU5`)-nAO1Ud+>&wUI2AYlE) z&KY8OstSFvGd8XGWF~l8bC?`3nN)Z#^`}!TC+>#`*Pu}>lq3cbyT=dVIT{yL2CTBz zw2D7HOphwP9q{per&jJz&!iyp z0P~1~$Y()LJ_MzcDw8Tj@0qBhp`Rx9o_{;35+bOY8a0s|qup343S!5}_|4tTOo@Nq z21}e_WK(&p&TK9D8EUNuh8Fx1=w_`PDqXc}P4~3-p$IAKH8lQs3X@4W6TPmF`BEep z9Xt?|ThMiY`yr9(tASE{_9w%CJpZU{%2o{gMIfdSO#l&^Hg1jo_c#lCr<0{~Sm_KV z&m+J&x$uo{V!-W4_SI~%Q2N9*8yfy< z{OtA(AfQDIjlW(MG};%!{(Dhn=mw7P|Nag98f?zioQ8ZzLwSm`1x;G_iP;4bAto73 z+G`jy5M9rt{J7EPc~xYlXx?2Y$X^wPM5p?--DSHS*j*%~{x61PqJFTun4H>O>OVko zD53xuC5yHNZoSm-S0_p-tiaj%(1J?nX#d;9GlrVN^AOmP7o;k|J)89 z{ii#)3vA!c{PZLGiUek#<;Wdopf&C-6Zqi~fvJm>V0y?vSJU9u*j;8l2_Pu8Kn2B7 zLyc#dImS~yqkF_V_je;72Yo_8O~$x@NcJ?rHTS#H-3rMeP%sz9xFTQ{xLx{7$Lz~f z$E@)zD5z#bvU`SFLG9q776E5~^hM6(=HWM8vhvSJ zOMXn+G#?$zi5L@mANcEg-prD8*-GAO*8gz5t^IXr{>#R$^l*dXiiBRam*-D$=luTi zGc_mxW&#~=b(Kvy+8yiEWQ)IKkiy#6#;Ks@<=4;h5&@=KfI`AN%delU7Vv`0pnsI$} zwU}Abwy}nGn9!D`w0vyI-^O;zRKlBs{cE86yO4g(x>)b>S#yaxx0(K8|qArCPp!OYm~u|8J=Pn zdt#xv_+zn&wxJ?B^iz=xWY*?lO0J6uX8tNgF}?FtAvvXyMx;^{*NvH&qm`6@oz9Kv zs9o}y>M0*~Ffz@mG$kp_IvN3ki(L*7p3ZMyH^m-4V8<;rN+ms=TXb)Y@?O5dlXjcp!c zHU=sZJ-TngTZ>@)oAN4cyk|697HX`ixf{8N3w_#$y$$4rcU1z(5TR1;AFdS{c+N1@&OXH68BEtz?);;?^Bc17 z*r+;bsOV0(Y2^A1uRBuNTVhiZIKTOjQVzOtZFt}+RtFOVtgkS_~1_L8~fkSX&~TEVd)4D>lpPT%f@ z^ryHfO}*-rM(Gzy7;xz_do613kwp7=>eSHrPeW4a0 z?W;3PUEX1f>-AjJkuv9ISZI14Bte~8>T(xP0Y>?Q5_GPZ@@7)@JSb#JQ-)Fd_(75r zbk?+Tv7>Yay#HsT6rvTyMxJ~Kejoe7O?bjjW5eukVZ)H~l#=U< zri`B<**z=fSqa=a8HT(9hp}RVs1Al9uf%*GhWr(t=<6az1@;W`8Xd;^mi~xAqdR-5 zds&ure`rG`aSp5c(?n^EQu&F?oD;7Ef{R{8##m&T<0;ANI?7$KljK9BpDtQu|U6VenxY#tkDi$4wsvAKkOe{a31ujE*avAm2vOO_)zops|(>HckIj$ zvzrFDQ~Tc)T`@+UN^u-CPVadx=b$}1?{-PTITD*OXne$G4`Sr7g+zZOe~=e1&h;k8 zvf0i^Uz!Lr|FvbazHFH;6_>-IAp8X5VBf@=ovQll8I|Hz$lO!u;?S%iW4Abzu`1rp zy+IDnBs1;K6$1gZLt>O3{y15O(O1K>Nz12QIgll;9%=3+_*{O~$026TS?jE)E2nct zb^~qRBLlE-7CoK_bEIsLS28YsUCQ2?uqh^F9b3h)h0b^{A%V?!FH5)yN&0QZyH(gz zvBVgaTcb!#MkQ#0wrDkoCN=k{zA)34A`RuD4JGS+UrmdK1o6vXGTJ+BhQdLnQ_3Y{ zIMmb?Y)R~isz&;s-(O7pApFqKg|eN{G6#eI@ioE6J@vju2}AXDwrNuDt=0mBoiaIu zw&XbiuCOsA4tZPUPkr1Sd&sX@V#OLZ?O&tQOm`_^T2Hn$uyCIbw5q%j2OesW&FF-L zklHB7IEu-JG-tGsWXvD$x~7r`DFi9V%j^wY;*Y3KcS_&&GfylcwkQv>3byJ&S7Y0q zi8mmxO{yzpvYo`DdfjcV0TAC;AKk=yBq5&eGQ>z9<_Br1_mAj%=@dt2B5yjDaPN%2OGSWlMYgz$CMP1$(+JmeoYDEu(dn?i6}Lpv zB+7P^#${$nP!6OfnJ;72sddRBbH% zJ#(JDSY0Qv@4a1rFwaKF-#j%`op5Qo|HDVQ1if1y;tXzJCLy=hT9g=5kyt}%p{LXO zm=k-U13Wlob4tM;oDM;leYR9^4Pugd%GSFtdEd*DwHSS-u`C&i)jM6b61kv^Xmxnb z8ia~yHz-!G0*2K)c;8)q4ti7VS^qfa1ET52BS&on?RF25tREIL&z};aT^tgcGb~;% zPv*ElecS??SCDApdv2!zL`etDd($+8PP$>yocpMP zVL!2U|F@Ox`!e^I1WREm3mt?YeFbfF#Z;;af~Fi%m@pWkgvSb9-SmoHNMd|n z-6{a$RMV6t69RqxvrEm_8cOk1N$UtWJfZmZq}^kbi&Dud@)McrD{ot_z9Xd{(yX*P z!I<7Y**nc9YpQEVl8dRBMXV@>76Z*|ktAhR+kKzY-au1K?R=;DdIcEWg?BHmWvTq` zVm?A0%UW#cGTSK5K#uX@i@mD7yBU=U>t9f0Bp7}mzBH*h!b*b0d8=<_0f?364ONtx zUu*&T#qxyv@?}?xr*F&p?_ogn?yJCq&O%3zG;r35< z`fo?*Gj*6sK3|@**DQUc6cA&CiRTxo%8(5cX+yjS9^C>%_m~l9%S`B1fICT1W+8%5IAzbnaJXW>~DjBIHS~>{jX5d6VfYl+YmShrJ-=DYzj71v9A4 zy^qqe$@Wyg2!(4CrT41>xOVRnyw!acjpY~l5BnL?J*}BBJIAhnYX4~eSk4%l>PCP* zZ-;JS1t;^|VYLV23Ur?P_V;=2p#Fd}cl}z(D)q+8KD?M`U67He=K*1lsbAT>6);4H zbAInjbHF8*IcFEX=FQPW^XAX-iZ3ou$6NRe#8b)&d^ME&Dgp&Dq}cDB4|f|_J9#Dr zLc@{P^k&@778}q zXbeUfD}6gHH1@Pf2v=W>u>9#c9@ECa01yIXHcmJ#<9Qo6(~sxT=I$x+%f@W}bYRj< zn>cvs*RB12Jnd<8rAWg|_rXZk}dw-h-y zibEF_&S0`C7P%QOinF zLvCz;znyjNLM!Qy-vcOjB-$=i_Q!7lcyC7k+ZO>kZgI!ce5Z(F6jpOSf!3V*FHTlv zXw8YOhzL5P1bugD&;CExbJNWQpZt6+?B#wU!zr+)+GNYqsOZS7rgmfR)k`+AY&E(X zb2rw zqm87trz;@RuVeQ@HhPGV^V@~OYbDUd_*TXU&KXlcda3-7uqC8eS_A9eJjamB)@uO( zd5I_%_vg$K( zDNGE0{C+TZxBd0Oyx2oZpVdblw&5M_7efXo7}6?}w2AplL}C^FDvQ6kFD}M~5+I@) z+?ONu%UaG((_O<=b~-tqFP)yxZDHs0GUKgsmil2yPvmeMMqp~+iREM~# zndQ;siPGFH733SUD4V--?up7d$*?Y$FljwQw!>Db4gAM9 zL-Q{?_&p4%Ja;uB1v^qTAx2qVEkz9({1XmkbIi}pW{apG8~E@5SCP_x`!yKS)n}1t zjb}*pAQ{KJ%lL(dVlD41Gq0SVLT}BAUq$w$KY+v?*3Lfa-j2A<({7HQNvZH{Lsx4k zpb(wQ;ld!-Jow8kGAYrcJL(q5u_zI?a;eEZ!Px#Z5hF?6SxmMkXQRc2bHKaZmlWg5 z)AjDQb$7790>OLXN(fQ4$&SO?5@lk*po_iTqf9B4G>D-ogvnV7wubF?sLV~xsXmQ+ zVT3N%c3*R4D7S3KUgdCea{c=1b7QD-^`epf&|JpaqBxPkvRTCTF5704*1e)P1LYah zyJY&DLCcoA+}kCSjHBN_1{lhk;%woi+rbDu{xR$~YEgZ)GdQE%4|Us|2Qy0!2yr?Qz@ zf+i2&he|C&Jnh9TKEn8;_mIFS&%Q+t~|VN zznA!On-@#0;p1MfR;AT>2>zN-ZwHM1leSd7$**Ley(ok+-N)yZ>=l1rO}faB=L=;~8PKHuuXzu4bM)UT`suqp#qZzg@2G?7c z8(sHaqwdG9bL~(QlHViq(d44>Tika8=~wp)#AWlOw6qrGr;9DDXMC(TM+?<9QN8=u z-n1!x9->NXH?&6_zzr2D^c4_4Bq?0aFQXW(j&sh59IlE|=!Q6bs1MRTjQAQ)cc;(h zC&G^r0f&a2?!23cS{RC{gL%n`@d#6C*kw^6sA*$JUw}nl4LPp@pgdTR66_b?yosX;T`n{F})wjg_?(H`wRrb}BF)%IZ>B!l>Es$@7 z@wZxUle#uPZvCOmGsl{hv@^<1@1cv8?uBFfZ%a$GzUTfQ*1iHNi}m{&ML=34lopWg zZcq_Wy1S*jJ4B?r8$`OhOS-$eySw3=7xZ4e_xF!)ecxJx%nT#0<@?Ne&e?mPv#A5^ zZ_6BRXWC{{^6fpc^|8LULgy7col<-+jI0zcg#{|W5@a9}ep-n_6VZ!-(bJT}tb%-0 zQpZC$3cmA#*=^yODB*bhM3?^F+AUHRvuZ{b07 zJ9|wMdsY{OM9)pKyu86cjJvKo30?D`6B>XUKW5&cnp&au(7k?A+{d`SqU zz3WAAuzs@s z9WqzWZR`pLOTr~0r~Z-K8$?vyT9_KH<1y3aYBkqJi8E7O*s|~Tw}BA)-^IvkKYcVl z9{f2za51rAZ^+>s(8H?gi>v6Nl@WZh%;a$RPt5W;NgBY5#=ln+~O z$Cqya5DA4(xI2TXTh!p`T8NnqRptKPoOLJ@4|~Z}ptV&F1|Iqc*WuW9^sj;uiE-R`k9v>U~S! zQ=z}0Kgx`co-JIb9SHA6pMNx)^?LM&E4YzEQ2Twl_#Z-u)JTjHt9FjR5OP^G+!a%(!Kjm-1Qkp54S1C=^&pX7(EJe-| zFjyj7O|b>+XTv-tcte5ee5Z0*3L4s9iZRmpn_wWEaJ-U6`^O!FyvAcfAz;XH9 z+H}K8)x;UwPl-{V=%Lq3p`8NSx4MijB>lH}gFG0!KpS!g&q)kmNtQgx`59qd1XJ9E zY53=;!B@nfx<%3R=&w;Yp{x^V= z%9)x~Vtr@B<_Jr(&7o{P7Y$Z3eu0-8nz(+Llo2hobQ0O)z?D(wd}M86|2jx*H7?XB zkfD5phT!23AGAlyxt{+QxOzQ$I`aMWfS{FMqvEZ5DP?eUoNJssX7&CKcK3nr2-&4K zz2P6I6Z{mV#uWI^A{R7Zcn$!bPM06*-Cj$n>TjsvI-qj58z^`22Hi>_3aF~5MHWiU zp6zCTJaGaNHPbzYT~4YBPX}02Q4E*wrn~>Fbsnmpt*ZNq2bd2mU-plRr|ZG~@WJk( zQAkA{C%LinIUfySlmd5D1co`t?tx!ms`*OC(?`*m_G*+(t5Sk-j2LsnkND^Z(2#gP zSE}>GvAqbogrL+gOp~1G*lk&i4i~Y>dd4%oWH1}1dph-Wm9{G zAfVP*6x{!dmbah}VMRn^GJ-YHMz>OPOyJVWOgEZvX4+YgizbiFrAlt&f*%PesP(q$@h zu3gss))B~u>;dnJ3@c3UW+lMH%H*@tb-MXpDlh{Pa2xEH0C2RC+sbr9mkK~^bYy%M9w%;H4ybdnrz@i)k&BYV0CXopsb zeC`=4U`Qdziow)v3M6y#)29R~H$F~>d5k&m0p$WPNXa`__8#OUr~{cm&HgfhTEMJZn6h>>5RZF?u=vWDz1g3L zMU#g~bIRLr$941SpbARzQVG6>wfE=|OCxk50!z|tKS~UKXPiXX19F5J!9f=fw%xc( zT6hHz{fw6iAxqMhPoj(&hy1$^`Z4W!OxEFRlbDY^X74W$1{K50sj?DiJ@PbD)(dts z8qWY%wo%W)qoxY-Uc@1a9~&kB*KVS@XVC&N^cFqr?ZjgeXWn;NZoan#yd)EN8Um>%;N%v$yXc03s@=@LqgS$WBq$2Uq zASq*Np<+hiq5aoU$VqA~&0_`txzt2Iz1Y$+lOjfgrZVvE-N)g^TC8%Hs#YSrs2CG? zXLPgsm@7<_uY{2QvN4b2$HJ57L!%w9}_vHdl*OfCfDoKfr*?#a}%e< zAZu~!vtzIOHDzbXTw0q%DHNnq6AttSI3_yO0F$@%-dAgTndrWvIX61L!>*hi18W(P zA|v-nkCE{w`U`^98V)xdUG_(r0ls8Uk`=mu z#x3zaoC*(vSR17%e?vklT;TbbD+`|hZnroh^UI1vNxz&^mfL2&%l^C`bHG~Gq3s2K* zzP9GJc&7EEh_8ly7kaQH>o*&BSI+*qCgtwX(&SChe_MtRYjX5et+d@%BOp4-g{=w+ z{%%yA3^O<9vRND|HNe_}0UG4a1Q}=50<172SGqzBz$L8pb1@w=i5uN-hdE#f@fo;L zge{h)iV3VmbP`!snAGI1XSB&;rhrKg9RdJe2JjSKkZ>8JMqY238uBk81Q;qc zV~cLi_kckI-sKp=*t3i6jS zr^IR?y|pWX^`wSsZEO->lDj(@P*Zh{|87E(!#x+rxGQP{vMXhC?v_k1clCuV@OgUB zj&;z^rakH9q5eAqwHyj!pwy%cKn&F81o)V#(NS9RM7zvlQQ`S_b))xVJ+>+nqew$4F!ZsKxAO3 z5eKc29wi80}X~Vlg=T^7~?-BVm57g$P<5Q;)PROMyrg?`j^N zEXGy^heQtp0T|9vEP=)2EV7`)25Ll18gGYaaM3^kW35{?o3 zD{78xJqDLudGT^@?FR$@D-hF-w zbI{EqICPCb=uaUrxveeWWx5d!8f2~l;OXGbKb65tZS~f`cpP_s)YNw0?x+{?Z9

zjRTL19`?)rynn}~IXD{32?c8Prc1J?V*rOo^rNbvBpcMv{Bs)=tdNhvzTXf*nP|(8J>V*Yzj zqC`)VkH`F91|^f$4FS1Apz#e9fnczKXhSJRBm){k{nB*Q3`$E3^0&kIbtew!Mj3eL zu>r6Y*}+%H_>(Lx(ebrWU=Tio%e6jYlMlr9Ng7{7DYk!&!c#axdRp=AC2(UB1=%+V zIQjGF;XQaj^lW$Wk{+LIP}GW*^xICbGG)@yOGmRuDxCw_StfDlSSbJK&=_Z`@wSAh zb{27dPWpp^bOu?dY`AD?9eAnbW<8&8-u2Y(-B$g@t;rL8bJsFKS3ni>#^JX1D~lfX zARB`oZeUG@LF#n&aD^f;AcszPK|$+cMPNk9*C3@O(NrrrQ!o03PqPvg`rdCQxr58; z0(=_EuYVtpky_5f544%Zsv*(Zh5R$9g#*eq1C^i3wyW03hi3Wp^M+l}d}bxh3zo$| z^rb-1o+tn5kI)wQ@6hJpsZF4GKM++{E;h&%1WG*4f!$)c*PPb@>&vLE{44uCz1{#? zPX6a;0KIPe%eC(7L#md`Yxa)C%dKMP8FS1$pm+;1A};#nTE{VQ=@kaBd2LR4kh54O z9YxVBUpBCl%(_axlQQszv8Iwpp3+kDZ8cJD$HdHlaGim+!F8IMX)MHlt+Cbrxbc~^ zc2M8zhNM`2>4s28%h-5a=z+*&aXK(>;JLrAXi$GwjY7k zA^SI>dM03v(u?JpqX_Uv;%V?D%>x4zwXnVo@nCss9Es=D)tFK~LuV7R0#!HN*+1e& zbOG71QD9{o1h6S`b$4_?kN$fj98EnRjtGI=3=vxkft{@Kz7* zzQezwNqd-xs!o(o6DY2(1x*n4TtGPHS)?Ls%`gq|!T<V24tM8@Nr!6O0)8TKyP4*wt+qtcA|5au+sb#ulK4+!T{N2^k<{j_M4?4# zo_&2ZHUIS)6qX@!TdQrO8bVQKr{KhZ{>Q*$H0SIQO1y%v7}#RCT+yWE>%b&9g}J`7 zs?nq|`w$jK^tr_Fxgfa1PS*62`_lF1h8ke#cg!U)8t93u<5Rx>Ydy-X3X=W-fvklPIf%T?C%Ct1$Jz!zS$#~KNq{NdXjD~miy#F^dHvy_rNYu>_Km_T4fR65$-?Rp#SZ`} zZ;5zm(E=jnZ4`#0CP1Wo7NaZDPg34`LXFUzwvS@whJh=pS=MEP~}=>}P}jLm%_Z#CehWO3n}+1mgXD zROcBwr~x;oA`D$%ev$G%Ms9A}F;isrTv2c7(K zsu7Htei2?8<<;}Tl%GF5#Jh9tZnT(Uc&?Azl*d`QP57?Ape{S#MVG~q^9Y*@5yHCY z2MqVuYur1|=P-94{plyO@0KnK`oTL;a_nGbsGA<$vV-^->UGL`$mP6J~&f!Yr z$xw_f+}?FWWS5urtQk--@O^nDmxzDqf=1%IExi$4HoY!8hrEpt2nBw@9Wa$FYiIw( zeuXX{CnOV33sLnf(37vR@{`leC)Zg+_}6=IoBr99JjPa$_ z2hA@MIETwSj7&33Rwc}B8sz4(q!QQ_*<#saGdYId$iN5QkkP2{CCjxkf?*asn#xg& ztOY{`=`mwtc9yfTSE{R9CXBHdkJ}T*)(ISz4_YZ7RrQG4xO0?O)a0G&ALc|TVdIyE zUZyn+UdzR>ub(1*{Uy`;gi(@Z!iIK|@`*grGX8*p-J7n2r`qbdRw-t}E4T=Rw!!JQ zay5=owg(J#XVf3ur9LpyW_EUE95&TAH^#k>c#YnwK8^6Ph%GI+ANKz7q{vat2b{H( z$k$&-!+{Ii*QYY|e5x|xU>|)zx-YzRVEBYw)Pl=iemhGjJ|SLgg!P1;K2~WC<;Yip zV@FxJ({0AmaB^sNA}pW>#j&KJo#%cEz!q3 z%;tpjC@&GNJR65Kqp`qja&@``+D1e6cFDW$-{B`yGnl=J`$WR%-bgA>kft1Qc&WHk!7g+Z*Z0@=vFZR9RCp3JhI_cV@*h<;y=t=jTLVlA4zpiomCJeQKQq@kZ}oGzhUXclGM3x)e+H^H%5u+YeK zUZ{A$J^ke`xf>ct?ne2!^s;Cv%|-W|VRd4x(#_Q5^~hNR=X6u;P{mor0?sbw4^F-7 z%0^a@_Tt}%tcMj_+4o$>%)X-91GdVe6tGQ{*l3>~N?*#0ZJm{YFLbr9>TbLr)7!b) znM25g(R?9o7`|*M=?@~e8bWs5(>EA*vEDTIrPNmKC*5+9XJqUoi(b6g-V3G5FQO>+ zo3S;dyx6UitB7TB%)EBMFJvWOH6bRr^V@SGpW7enn<_2$zG#useCNQ!hUUN5F?mZMq3f5p(OJ;11#j)y=H_~xSiI6TM4J`|Yiw2;Z`Y9}bq&tE3~df7dPeJ& zUTB>T^CfbDUmh##R}DLEoG}X9be!}wBhKjwNU4aD1~;7#RM8!fVaHlua2>bHaeb18 zR#EaQ2>t3Or{o|TDHX^-uB9yl^TDowd}UE@&k|h%wnZXYL)>{vsxCTm!bX4NL-xA9 zU)PuCq9){lGNIL>9m%8zr*%=$SIbA#%eT$GFAm%?yhMED-gCrC4< z@hVL@N^WMDb4^#Ewd#Dft6OI-Ep1h+Uyv*Q1J|vz&>dO*`~1|tY1s%>G+$Ty2*QUg z7?$-`hI3{IdK1;R28$sSTjw94?=;%xUJr+9K7|B>BP)ZETV8(9j2(aT?Tv5wcXTFs z;~=*9%uUPDK)4azi~%x|&cix6If~@q)_=aVvH1tB@)-u`(jy8Q(CelMYud{k)lwDD zS;O)HS^cBg+aH3Hl7jq;^Q1ojb=(xXEv*y3$60glCnUw^M<(|i!tDHlb zs}>`_1gew8Paihkh=AWW-cf^=hm9BS<)0gG6YFmq?TNcv%_w!ZZPY67AcL-${AEI07R z=5QhWsZLdv{p*G0b_dDj6pMDKTFM&U()Spla^iM>L#KEoNaIOZV(WeUuI2HPNlKr@*=rv@d%zD)4n#576QHJcAf5Yr>#R)~eQ>=)lVwe|-FeO0Ar5+r4Uc z#J?<|vT~HixLZX`IZwc;t7R%x8cssq*L&QNjVV6Po~le{@rr&?MQVEnEgR~f*1vhH z$;OPr%$Sz zmKxsNqB3l(0rdN~xV5?H_7G0T8Eza5=(T{8lRyajKtzvss#@>*`%TY_`*lzAMi!3} zXG85I`AJyJ4d#chW~W%6U3Q_~z1j2Tbm^KKiYi^4#?G>rRL#nc>Dn7gmhqLnOBLNU z);A_Ash&{YpXm{HpWQhqVZv7BKRqVqxAs@*_@HuCD&l{re}EB(L27}#*QSEzlPOI! zVx4+4$w-$8v*bRJTRs?MQmZEE|9Z{0h=``|B^8>rI@;*Mj$yriY^NHhgkX2~s!fi) z++st0_?W?>r%mT%SkWop=wRmo6Qe=%)IL*9Ph1N7&{UXbb*3jfYJ~zaIwoKZ869p$ zTpeS3A*Q0Sd7y8;s;XtHn6`poQcYu0Z4KngP8h?$U(IEjO*_G&G9q>!C)?HcPliau zcV!)Su1M|~94IR|7(%uPlyQE(ie9~k>|Egqy_ks-7 z2aLLsgc{v~@urD!l=x1PlkgMaWSEq6{JiUOX2^0!o{^@N7b~$gj0M{6czg-Fo_Qya zQyP?o4nN7rfPj@?YG;>l?{zjsA&x`MY3+p5`imQtZZVe3x#lyIt^sO{Qh&Z4%eJiB zVWNCLB*sjoiV|XlgAh`a0%piakKh$0O4{XtTQ2aAb?gf(iali< zt92C+RussP+G-Y)!O=+9rXu-@QMWDaFoh5(mZ>KQ9qvJ$-4qe7TF0N7MoB1zQ8%4} z@U`}i0KQk7919~Zn^Dts&Dm}@(prdrD$Z_C)uFj(==G8*L!Hh1^PxFk_v%bsTyn%Q ziEJd=`Y0bEFL#qghrZJA=U&6wsLZ4TVnF9*ZUzF%xr#G{{J+A+;4c!T$~ zE>(@1DId+&>w6v86c=5p&=I@|COP~rF=38FI#0T}=_%ieuC5<7>Fyyl!_zZCn>1s=>~m+Riq4iT7d5H zI7WksZ$0~3CLM*+n`y+lkcFd;kWKn%B39aMYdU$CeTMO7F>3^@E?id{3w%)W#>b*3 zKf}q!l){N-K5@p{h#k5d5py?A-7YSo|5uB)%geUMwQW#5N%?dimwyJ72x;g`(Y=nE zOac_FN=DO7r@bAlr#CA;F5k|Y6Y5v?^t#z(b`hktha;JnWt(ahd z*BZIoT*U;4MsWrnBxL}(X`3KCuNA65X#MSL8cPCMTcF4)a3OK*6%g&v_e3V=w8l== z&u$(R$_zXCBFGrhb{HYtVN0QHZAQs5mS=5wPD9@fN6(%euDwTda?V~z6KPu(ufX;k zO0)|IBI3V-$dZv(WlX+U8%7>qB4(a8WNZ9}{-od2&Oz%%&)krimuq^FN2ROhx$ml{ zBa2Wjq4*xZ*z_Z8qmvs#-Cf!K+n8ENsUS<3EcS_@b% zo`ifz;nJJ#?v;1mrz{1}<3p@W(S_^IuP6C)y~oWpjNaX@%zqZ+z<4jpD5qQhX>mXO zT;=_3#ofUiLDGI=9Ts{-+4tHs?ylDZO=&msC9X(PLgK9I>N?pd3oReUg=`#^I*KnE zdyfGxMze2yFUCp(wqnk1`J-v3OSIgWnj)R*R?X4kQ@VoERCJh5VqWNM`-$DZMhjh( zMO1m^VNf?sO*g9gF1ocy#}&^#GA}26>^SoMY;$~$qh9Vz6-NA;;APO6Q7F~ONzVF*$~w7E6R-?fb2rY< z+aIHsVi*n%ENpc9OdpbR?%Fp@7~W^;MK#oDXk8g8)rz(5%SraaXWzJGw{hM;9oxG) zXUQzf4TrBwU7IGuwcqD^qYI9DiqTWg2R{A*wnWxSQG+r*Machk#%HjVxh8H#t$=0a zbl$7$En?r4U5aVuRh5I`%PaQ-zf(S=qF_-BH4A@#n0)`W3a$@-v9utK9TRwzYo!WJ zWT~U8-qDW`Kq7MDS!4g7TQBLyM+PRP29CTKI0*RGN~E>==5$*1U@=;aA&QHzuwdYz zJn9e}gOp)vT}S_eI%MKMs6(uNQ-=iSqk>@LosRNqlqpE4-j^zv39k3Bi?*OHsm_HS zKBt^2!{}yLKKa00ZLriF)EOWX5m}n$squ6m2Z==T{!5XFPk~6AOv$}S zgjt2yCIRJ5yav5wVWn0fVd6~=hk{tzi{^4}aWx`p8qvHTKEFgFX!jzKFX{Q#`vQAn zx%tK8WT);F<^}8=INhvnVX;#)*-qAK%QCWzRHZE=r*E4kYMq&H{w}Q$<+gA24N6BC z#y(-5pcjbGrKSl|Mmnn^ANgjse~nV~+2a(=Ga+(57m<(n*lm2Rs~l|`9w1!ph->e- zF)q~cLoT<7vzoj7vHYs?y!(O?u{^qWF90h@h;PVAMMsC5OWV&4}Oe*+?~z4h&`N zDk2p8y>`5p`$9K+{jpExc5F78ySXDh!>UD}dr~j`*Cp33hobn($RKX;)TF!jh_F$8 zjYspUq2r#`YO#r=^_Ye_w0)W7AHZiU&vN`*>D6~$x)%I6ybH+|F5|b9woATo&pAvynwl62FP6U z@*XK!qtky`joJ-kX-Yza_41N!|E={!E~G-8I_~N3M{e(}7B0EYe>w8*P!u#xVtO^K zT2Nf2wLfmP%qPK0TNi=PRXnPPM4{%dLBD`O#J#o4{lMR=2aA^}EK@1}tetfIMl^NU zA4YI2S$rd>lBJ{V?FQ8O`%BO`2_ ztg5mUDzq4H1}czMgkER#)yA(Jb}9%pufp0oA%Is7)Ta=SW8)w~9_FXzO53C*e8T}h z+{XW;`RAfJJ69t)mTo=p@MubO=PR!Nob};ugEN}h>gyMRa!8Tdz1n#2q0`gw2Z!#HW^~X`5@{bn-Dwf=IJT%U~zdoC9FD8KpIrW27J2!)TpdD~Y>+C!5+w^s^@zYMSrr^tI?)r-K7!8=oAddyn)atC?BsqF9#y|@c)o=zHjZ^_+V)6j5O z0B_5*36M@LI(TNb&FLAxm~)7hyC6DPbdOT--QyffungbhP80UxF&>wj_KL>Tg{5bN7596+%Ytv(k@?!B`CLtyuN9m zhl?bJ)qT}D1DiZbvGDo*=lvD!S{=MP=E&~`D$;u_ebyS=5I!yT}qj8 z#r63tFF7uBO}<{6{HCm>r^pr;6)kvk&f=mDMaV{2CX+(od~i`3sDNC!(meSjkV4H> z?%N6_7;HCOqQzFz+VGvNWdqY{doparYbtr{NWc16&KU-U3|3s;@9nM zZ)P7JyreCX>(7@CmvMI@pRThMhYZ=ba;?FJX0*2{fs=8h32e-4R2)?n4pg$MV|RrZ9D`E(}i`ng>Oul&e!7KQrexYz*p`(g(%%K zwAlLSUkcjr2$lk0me^Y0a$g~VpK$CEYpS|De_0hwo(iCD4*I`+cgvPqtZY-}9y zOhWkw)373xpA0%|&catfo1n-@B|!d>WPw`&DjD*IUULB}Qo0h8h%lbN1dX>7^f1CxkJ_rPTTU%+JK%w%IEe2HTd*Y@v+V*E`P7rX_D z=bwJ*%!DgApnK)4D|vyAxj_gULB=+NGpQuhpKL`e6nTF$Po%^F%oEE|=6~g=KR`L^ zA{ZYTgbs!5SHN9~#as)Eq42+QQxTzi_QkeLBA}?o(Ek!G(Fzy0zRJ`nX^6 z^D4!ga*7|z#fjnku${+W&QFPbdg*xAI#89xf4Qf>bE_Q|7TrI#LIf=`R-%!RQ$~Y1 zTStC3S$oecQ)0n?eLm`B`R*^2CX_3e1}z@AOzMCOTDU z0(SYLHEJGMw3!V>Zqz1`xss`+Qc2fr+D@Cy4T-JPxv}PJ4Klici4$2Z`Lv+wgJdhM zMQJvsokOQ}J%KjuWxOzD(f;i#>0u$ z0d66F6;E-|eism6%N{?OgN+3+du#x+_jXYUi0V)&{>S^o-p%et_TuOJ6iANj59p9> z7Xw7NSWGX~UC~T|Mm|ogsmj_izWpCmfuSqR65bt|m zUNvWyp~o$9h$NkaN#({zSU!&ZL1d_lJTWpI-k#*>uR8zY9Ku<=kvc^_<(@mgeq8^9 zdf)fEGaisbF5~}tcYfY}?wq8Bp7K%-GQw5srBUM#Qd5|?$LS=yD3cZh0F)p94tJeh zLBrG|pAqWaiW~iAkq8aKCsI$=we=bdZa>#!tk;}hVhO(}-e;4FrC3o=#ruzIetcKi zKN!Inao-Bbim-gi(I|vthL=fJ^gg2fxjeq0rZ+_};lqW(#|X%)7!axcEQ-$wMUW=} zTU(u+qsyyKOg-s>SNEcgh6WA}aQ^)5Te7`}*@Ucqv}MjCgC7_Lkbivh&={R>c(`dh zhr!kIa7t28qDE>!!vc&u&i%f2iEiMY95pK*w+vsgDxWv8NEq38VammR=zkQy;z)(t z>v^=`XuXWN#@=+U-t2wrxD4l>~tE`JYU#NBrlo{2)XHxxL zsg9WqaWmxXZEoRWAgJ~^diF_*G)$E~MJl3NZY+Lz)8-QRwb4aF5_)IkP7mPc{rH$r zI3Ba^SjIeFUbt0JhTBCP_!3%5GhZKm0%2tF4k6t+RkGgQwmjVNitMB*rKYJyb@_OA zX>R2h>12$xun!;gwEnI#`)Y5tzM5Lu=4)*6Y>tB2(4Z$b z3&_1&2TJ<-M#cwB)v#~BPE*SCx8H_a#NC7pD9KbSlMlQuUdJ?uV& zS6Y@EwA$l{Zmk>@c(%BFEynh-kXTD!{b!@o`wglDT-mBgpdU%`lseJ7B*;H9 zdsfc4cqx|mm;8ZH9(ElaF%fC%>O40|ovQTzgjmfNR643eo_$mX3kQ)CmdwEyyPyEjq7k#d~mCR7ujcseostaVx>hj z#aTR2u`@&5zyks@ubbk;)+gC@2od`nFzO$$Ir9*>s=4CI6;zq}A3Ylgx|fk&gk=2@ zh#xLe!!`8^@-s^_zeBm|4f7W=EKjIQ1bY-JHsoYMc|LA(P09zyRkHStL=2sqHU74O z`$u5D57T~=0SxznMB4?Ek#3F@XoAHRIr?pE=bKA+{ToJ2Bt_%Jq%2 z*C(7?6&FZYd?>L}TX+&&$>lmxha<6>Z+M#0mGQ6GY@SVJ$aA)M8mVE9LzbCQP3<$N zV~%^I8oIH4*a?MZ&ihP0+>Z*Ge~f^w>UZkB%@xWHNdpFs7xL_*S2HTsHq29;26ln{ zuMJ<+X|NRsWNt>*D(7tDr|l$OF-UAOky({focx~cbWY8#>~w_Nh}U&IX@7zh0*!(( z2lQ@z(V3QjukI3=38iR^)tU)r%&!#*P$snDN<_4=zLA!X=omHTD2s5kQKgs`#;TLL z@F4R&cgs|zx!x%yLDbfzU`=!<=s}r# z5<{tFg7x_yFXH>hA*R*gclii)EtId%#kz$F5fYS-v6aQ5TkZjojq#GMv!rxZ?AQx} zqE|Qgx2GfrYDax-m|W{!f1@&Ep(A0qW3Yw_0supV_)1`r0jDr$J9s)B@4eb?M?l4?uM#8vyY4Z0 z2n7FW6)N%dwFACjHwp6&=!VGrO{#)HAvCF`eq$@`fBGT! z5}-tV-QRiZWtM#arF~*jP@uH$$^0X`pnUGb^hpwI*xHB#>D(>XpOdyD%fc%u1sG78rQ$oC5;d^{%&<_%zCvY63M} zD1qA95k7}0m~w7bH--0Vt4OPk=Yla16|vA~n_AxgERvEqOLRUsXjx{IFi9W3C-et- z%;&039IY{$M5j~c{G(EuK!wNDz3^}v_x$ZBXS<4YN=2jiN1fz($R@Gt3aXuAC2vW? z0E}@e&fJEyv+HHd(6r1zaW7m?0|^aGF*>jBU%nZRKYcSedw!lM8w0pvEO2wfAWo|xvHfibID0kXkb%lZKocV!Si)(OmTp`cB+{5*0h?}7Cap3VU zxkjl|=9RLjSRjQRQCMNy_QKZfLH`F9o1Al+fBmkoR*vee=wHE6#|+`X>?q$)zb=i zk>0S%N*Ht3kb&{w$~RNty#{0L5Lpqh<1@iKxYnhgvmxfrXO9j?cYEciwB6;^Wul~e zda|}xROm=wF}Vw?OO8vy8^FNh`;08rF|G_xRsGQ`TZ- zComb7b3h2_E`TS>XbiKen5=dtM*4 zOL}t12XJD&x84{VYbD?IZUub4fQi}pWl4602fo{xZLJ%?SK&bxkZ-dqxZh~9V1T{? z_^#eLAxi>JGV3p`+AhW?J!7h0Qb2U4si}bE!P9kY!Rm=V8KxY|9YYDc+fVs4a6aoQ zDC9zowwvbci1mv|1@x15Na{ggkg^tT7VnK_KN@R)59z4U0dE7uT~az|8zW(bBG*xvBehlLu9$-1 zZo7hEDvnhnZ@1zm2vrQ}shJuamGm)X*wA_sulRNk^_8Ozf3UvRx6z7eri)J-jT6y= zCy9~FAWrXZhP^lwa@?ydBd)w{Ziy1Jkn($p>@&1r*&1t$!3l>!=V>uv*B?Yc(f!d{ z>v?srB_?YTRboJHinC)%j}@>04^aSh+CZK1Y;Q3={mg-` zzvrv+ikKpEou`NHu>`eiGUo3rSiTHNRGn8(3~{!)XQ7e6r%Gp(6e+wyuMm-YO)-kA zmL476P_Q0{#>^mV(G$*C@mYNA$%n_9H;=4ip=p%?h);KY)@)O-TLJT-OkizK*Cmj4~^HGl^R#CHu=zNPN z(>o~IDdOVgS^A2)E!$f8Y}vRvV=~*R#8OUTh!!@CRtB<|2AHUg9^Fg=8Z^F=F7gp2SGEj z^N9*)=gE_kulUr*nqM^j*k4#~w@<{@vxSbaFc4hOFnS_N>~U|09Oz6opF;2(!^hdr zIj}>$bE#a!UFR%ZGr4fUC|(J!<~i|{RhFtLqk1(^~|;oJ@K z*pTUJk_Z@aUw~Is3lLdx5E=={gK%bPPY*}K&bROv<0wqhdBRR-0u&r0MA4+BXm6L+ zD~UCAjjF!!QL#~Faw-h%!MxfdIiugZ2`t*B?c>*28m}ldg2O~qJ=Iv^Xy7LxWinRA zY--hFQmIR(rK!3M;Bz1Yvx@uaQ> z)NR)M9-p~^S|_}^&*zkt?G_2o0!4b}Rqj#<`52eMhuJ$?+9Rh-1hcBQ?X>N*-F^(L zeCI_)Xvl?j{6y&KYv-m#|LILRvOK5-mml$6<*vrJv9l0NOyv1)Et~d{Vn|QFXG1C; z2`^ntR3yp!#o=D``K*PJsQJxD`6Fc7f^V0o1dwR+mMrlHL|vZ%^X8^1z>F z@QwH932BTa?+L?ipezBbuLL(2S=B2xy|46@IiEzu#VI4W16t0XkNSPebbj{^H?*ba z*;01pL1CxBO;>|n47ou#Dx~_eSI|KxP~&>qyq|MiSXqQEHWlLYfY@iqDd5B%y;UDt zJp$cZTpU{+wx`lj+i^miSq^KzS6ozs>tYk;cv^g@o3w9uW4Sqy$^WhNGZIVB@zatM zYAC>Uy6#ixlMj~xwB%h;;U6#8`Q-OP+u(BXWzx0KbV|&&ZrV3nF?{`_PcHSdQ}qWe zdUa~Fhg;D8hLyJgkr}A0(%7QLkcZFP5#+2cI?*>Znq)JS0m>?c*(wW46}Kh9;iH;F zFqfN;YU_L=gugU9n?fBh?#S8nM%dU1y+l{iI{VkKB748X#FD)KA@kYf4{%rU7HL6b z?)(vdpZoAG-se6@@&E6+kMl!Sg&Ko>xcuYW@97V<7W6StUC{uu_oK{EfZ6*h53~2B z?tY~7pemM1g{`RpqnNh>PugS+q^ffSBjg4te#{6}$WjZw{})P}#K|*Bp3IX9lvc!K zdc%C*MGS8`6S(v3x;Tu~;Xjpsk#|Kvfban4QHA2F*dEmuGW@oJ`3H%rKDW88da4)o z4;GcDl9cr94Qm)rWe=&1)3SlPd;*(UOV(A3s4)$Z1e)_O9(!7rer|RfX)P9 z#re4Z0W0Rh0t32c#Ow1KmNFz}$|MDpguLVW!HY;i1$v~Ow1tEeoM=Wxn?D z(K_iH3$$;FXljQOeVxe=TJ~=puaJ3lqQ4(4`{a>WeN}ju8~@HIsX+xumTWJp01^&i z*ya5wejx6cy6&{_|r4`s_)0(lpm_bjS~ zq_>+66J^!!+VYYVkah`e(ZS-NoZlNN7C47prsn-54$rSBrFMAoG@>OhKd*{amddd% zryPJ8Fy64CNo#|EhfX);OcGIt^c?TrsG`Hgl3!W~t5BfkA7yyeC0G?tL3eOmcBso( z$sWxS^W0?5H@Z@k>+apIXpJorx0la)iWhHlvHZ${f<7aD8F2`=XcjxO^{`9%T;?3j zof3}3F4sq_I={WXPLmHgjs$^Oo@IMp(W;9k^|EKv(I|>nlXfjKQg)@s{L5w5>Kay( zQ`Gr*g{+tW#dxtjH9TCyko>zE!rDLjs`F6r;^52TAiZeifJr^^xytvo%@J~N&bPIb z;gLx?n+Sg}+w@qaHJ7A^#+ZHeT%8octuD-3h#4xsDA zh{KG(6&F+QK!zckyvso1ib-#03h*1k@HcqSP24&aijmM#jufmKpP+#phi2Svo%tD{ZxRsQ!f3YDV>yUE6TJ=0_Czx7P5 z`K}Qre^fx8PT9pS0P-Df{7h*f6;EQ2?SFrTBoCUD zX_>=WY_0K4Sy?^W?tz46GpxSV09jqbuT>k+F$-0`l&v#SwIyH1m~B&S)+>Te0ynOx zb|**5l^p%dY^7**u*C0??pHC(Z$dF|2sj&d_ibrR7k%ul_O_rm#fkcY=wzb*P_GAY zJ8*)kq0GOlq2m9c8cGJLp%#$eEEF|R4J|~ZG3_XbZl5w#JGom|E5ruYvtGHkwpmtk z8oM1)YUO2r2~wfUV53VZSKg?x_774i1&BBLQkUal4Xp`Zd`-vaK<4B#g|hmUH9U4w zXYisZ!n$2k|D~jr|Hfo#Ha0d_^-JW7(0Gc@*EWuZiZ5nv#qyt+FGY`24R?y&hKhO+ z6XunK2vwKw6pO~jI6mqY*7)q#0psf?HBT8}O6Rmon!j=P%B`nCj_6%} zRxKJORcp{_AC{hcL4_b&2h!F_&~5dErJ=iz04n}aslj@IK(0JP8!`iQOzD$x9Br-V z#iQVvs2I!H&U2cGL?|g8#hzKd{X7mStVK}OW&AOp6gac(6omCx-6xla{lj&Pa_&w> zm?Wem`Pbqg)IlsB>FSH2LS3L`=unLrJNC51hAH(EJ;V_j5n;Co{dii>bKTNf|Kyb( zpYcV;aT!(Hn5BGfXtu%e}45Fcm-~MknZm#?OxG!AmZguqip#Hf3!`oYcMYXH%-D}Ht1w6q!`M@Pn$F*kyJjQMGv^k z>Bwna9p6v4FE%GpwgOJ*7Cr)hD&~^TWAW9d{Ls%Cb;EWNFw)OisUELZh_A*tDLV+$ z5*UfYMXPrcqx~;ka3L*=-9N5#FTGm2*bg$D4KD&C&q%LNTleZXBxzuJ!AC)zJ| zSC-w-vfv{P&sHYD3i8iUS^^an&!x|lpIv5ywgM!!^oqZ= zf8zp@Mgv;R5A`7f5i_?wbgKVPJ+`i8d%eb7X;zZ8k&#jfF0ur5haZbH8`Z}y1FNr{2P@PN^Q^NBk*9MtGfH=O*%-hZCb zmTdrTIJb;?ImKu|t=Z0I;a@*gn>0&XA8u1Sy?TNVGQqXAhnG1bNnC_--dvzY!#Em; zS(Jfi6K`{j&%!6gD~Gs7VAc?hRfH+f978*ja>>IhR5-}&i^#zKH<2_{H0C7VsFlE= z09sU4It$hnu{NKd(#zr;U(c$RlAYplXEL2;zy^mF5?B$oY;2rE0Jz^4jn{N%2J_4J z#Z0j_hdC!-xW;S1Hs{#kiJU6s$C!J`0IoK}7cH-p@)H0*+Y;bs^FDm?%*D6=wO%C5 z{zFZeCF+zuZO0e2#B07UWax{W{KZe?oRHATjCvQ|;X=!zE*T1{rmBlfP zyNp6=E?iDrkT=E85I-+ikIt_Yn%N8*cwy1d&Zacje=lsXO3P6gWr&9hi$TaH3M!p~ zI-h)d@2k5n*X%JLkGS~AXz!aP`(9Jfy6~=br;1Y>MbjI#d^MY$kft+;aCG22XMVYt zuL^D()f(ur60^m(o+4*6g#;45mB*+OQdV12_-p2Cb_&$nzq)I)6+VGbt z<-GhIfnvPjTCf*Dh0IJr#e}D9vXIn?daW;$DQIjj@>A(%CJ^6Q%fLtXbWd;c#g--q{g-)w@ z)n5(}8?<90p!9-E{_I`Eh`Sy1C5G4D3FxOB%Bzl3`vBFu&PE#c`#mRs4NCo};aBgS#$pH`bjhxuIS+O*t3(Ft=Am6dZsyCMZszAi zM=$1uznK&zG@@J$>^?oW8FdBbR*4SxkA8VuoL#m0{>#bLgMa}ldi|t-T*%cP{BJMh zr%_gzKH%Q_^WS>!CJ0lk0|!VKg($ym7Ir7}7ymhv@xPyBed76VCt3YC2;qx>oDiPC zCFt$pQ@^R(!42)=>lnXSF0I?n(+vHbRP*&{6K&!+0XtT^D?mIPM z&Hb{#59wl-Px?eo)phdI{R^^(2fTb6%`qlu*E`dQS;>L?#DzKr$I+%%P!NR43&)$o zl$%P_Ygw1$w%kVgOAUyIF?YWVD(F5p=j5JRS$+Mm(GPxb8FCfk`E+^hmG5EHl46k& zVC532tXt13hC-S9xiNSbVCI~gMX8bYpbCT*)52ig@;d1ASfUi7d*rA)Yb;tWt(PjA zTNWj|nrBCv2~omVchR>NIL~8N8CRqIu@vX(P(U~OZx5)s%EhMQTN7STLIvh|g*MKTkv#$GV zn%dOaV)O&fIyM!F$6jMGDw&(n87a+l*~H$tPUzMFPDXW*z`haJmd@SoTibMF0mfO{ zu|5m?+{>A|yh|50D@RSIQW4dFfVy|(xKqa2dD(qz$L{vh7&tn;I)NrVuT(+D2xBoV z4;DzpOx_z(fNoG&i71aA?2(zU2pzBBuDQ+*C>@M8H_R`};~h{Fun|9&AGOL$S&i-o z_QWXHX~HUibx;i&`0|7tjq*WzL{ZB!4&IY0U{6ZPs*ahge)P9g)c67W0IYa&UkGQ> zbDN)gdv()PwQXaps*l~ysxHoE^64dS-ma=y`seKQh$_JRrAPU`Q$D<0bnq57biHQe zZKvzTY1ySv*HDp>;;=WJ0~ed@bFc7+GkYHHdxrxF-sdhkiA*tg6Gd7xu=i4WL+FsG z3H-|)>?i?siP}i^hbLttbxJ)>^5q!aV0p>Lgb3h`0yhLoUz3-S#Lp=Z=8-v&hrE(q z+HqxMKJ8rB?6~s9qF;iOMvX%+@^NHy;g?Cjj>=c3zAz908h9sy2kXMe<+sIE<@G-5 zhdxvvf6_eAsONpSL$pmai41E&JdZ2XsyyGHdM}3L7I~wvLaOv>v$J(BuPu) z`ym4yd1bKBdPIOThsGTwWGdX#0D1eCf>x*ZJUz{|S5f`)%Rma&i`lWvg1n6QSFLr1 zo%_itqt4~yJ_37&^qA5U#9hv%6^Z|10G+xIHh{XnEqlq@TD|g)6v(FALUB6&_iQ?Y z!kiSKak7qT1WMmD$^kV_7`u3A6~T=Y<=+}7nDj(s4Ry26w^;sg1I^KIB3Uie!S zlGhGb(ayVD@W&M;2n019Z00~&j)WX-1PIZ73r1)axC=(ew^p!#0Wm;ib$0$834R9# zf15j8guz&pUHeuI!osghOlVcXp9&MTKT;HvygUO93)d_KXdWNeOlgZoj*k=PH58to z^%MX-g&z8J9qFH<^IM1T96$llS{Y)!Rh{1wKFW?Z4Z_=PV|qxanw|e>D}U=P4t0Pn zTN#bm9NH#GS|~bZyImi1xwNPP>tmy2C1&sYdfE5&TpjXWe#HsOBb}dB3_orCs*OXL z@pnoayC&5p&7FPN_*evrE4H}`hqFK5AxjYXuc%ggg;L-Q0zzA-s7`*ajQ<0nZG23& zKV=E1wQrt3j~aXwcLdlof~j{?3%Zkaz{zRO-7`s4Kyq4^;({LpkLg{%efkKTnm0{!b+ug{iE6J0V7W4bDtJfoOkiJ6t6{&xW1zj`0USsqp}i z4cY+INqZT2>kPgFvQ0rL<=kEyC3WIm2gZ7CODSMRn8rs{V0HjRP2Aqen^IA%VT2fqrY~^R1|+6K*v(mn|YWL+7=PBKKeSKAdYjO8%swL24%Odz6^tVE&Q6tX{s_pZ(6DWU){-)<9 zq;F>34C1&8o`86- zqqUXD9;2}q_rebQr&q&-q(VdC#PRPbby^FRX4IKmpJLzUiPy!%{Zi|66*@y1}l()#OG zob63Rv+Qq9g1DgUnW^mJ^?s92Op@L5f9D%^YyVe#!xG%z;D!L#@PE!Xe0aw<%z+0D zmK`tF!P}JMl1d(cv$Rua5471nl+E6y4I-O>!v|*z6$ta2SkvbFBW#%NxI+g`)5| z1%kQwMDq|QK|Q7Z-;0h=b;{wl3t1WUZ#5+7JmqtDolJwE1Y@9+x$%&?@L`e|MpEu> z{%8jahSL-p*YX#M{#~c=5l!&!k~~?c9QkU zQ8bW;=T~M&-+9MvdWR|+?@!+j7=_8VrxHuv(ah5`op7ecdY46c{?qgJN}Y&;StU7S zZaiAndNuCIPWkHt|3VKTIg3FSInV6-JjV}se8;_)25AHW-r+>jq8x$*46?eEvX2Yw z{ymlm(cTUu+~grf>h~GsG?Sk^1Qw^&2$-+`mOoU%wNI0d_&3Ow!7s?xKdE>iBinsu zOIXpyM?G)gX*B@Yf+~c`&oX}xsLa1O_d0w29tgG&xI71aYH0!aU3j_QlhvR3Lm6+; zZO}EDAZl_WkcoXu!Q|!?1WS!$4=mY_Exom17Rv9{N_jU_4=V8US(UMx*6{*Y(r_8z zM3Gi^6FjEH+Wn$$FXWn32|{6J0JR&jA!$9mWSR4ZV;Y3x(?gKuCIZDp^9CpqIINBHb4Q`x+AMYLl*IYSM+nwC) zhk{tIe~mYx6Tir)Uz)S%++1%it;@62hj~gqb=Ui*sOJ>?qL_=l1Fy%_r@;^N0BfV= z!@J}bE?o7#QvGDe7PIwj(HhPnAdA%~ruI&a0!xgT};vEYq(<@f-!osGBPb809 zo6AOw1%b&5G1|riBGRk$!KRxO8ZlW+Km!h#2*I*%fO0~bB<-dua#@%%+BFo@)h}xt$_BiP@;s6 zpjvmBu9@YQF#$k~!massH|?$J_uK;)fX~FWk2GmxWbyj4kUXbg!n%z~?^9!(*2^706BORgmgej0EUh-c3q__$kqHJ7#R|7Dpu^Jh8O0AI+ zlKZ(G4+wu^vzdsuQv1q_~&DdH6lMv8kt-92W^k+(Z_fHB~M?7sE!y21j(0Feo#9 z`kGmVW9PbZQkqH9B+4fzo{hM>XI>@8d6>v+g-u7$msYjRP<8jVZndadY=Ci#>||BY zKqv|Q$SP?_OfH&xDHx-f;!|{t^y#ZP=CR}_)WA%vTtXpN0#3N&cE>)8s{Gn9W*;cv zcVHS7v9+?jz+xakPOthv=gSD*lROda9$SpUo!8~P;n*hK;SX&ghZnT~Kx;7e?f>DC z4lvEDdD=Faws5~Dal?|Om%zUDXI=HZ9Drj*3(3xH6*PTT@37bKMSg!+y~v?P`f^Xf zbm!V)r9IfUqrr{Slt}rqVJeZ>?$sTmPtRnycUaR^wvO7b zkpf_=>)yK4Bauef-L8?&Ie0xnlL3S0A3!s)T3{wNJT@mT-UqbHZw!mpx z0u|i@*|nf4*ko*6i%v%)Q%;%4Myigq-HR!>8W}o3dPioHxA;j(>`C}MTbRY#a8ZwQ z?O@iA#h3PVyP4&wR@M$oPAsHzb6Cta32(1GXA&IuiQOJz3<{(A`xua8wJ;y|+wQ1L z@`Y3*pZ~{Y@F;8i?!QjGa=Lpg`r1x4^q*a@v67Z#{e@WB#2vy(qGSd<-w|OnH#6hO z;~$NyFKuFK2AKNO=Ru~cs|`$x?<58l>mZzw`nNxsv+KF3Tv=)3d&Ci7fnfSJy>Ras zr*thY>mgc=2=d5{+(yZod@4-3gTJ*zg*cCrKF5Tr+51ZyrpzM23g24-wDN* z`tYahclirvK9EOs+{AFavyhWU@|fN0X;h=XU9V`XAN*f4juOVP_2R>Gz~x_>-^#x~ ztygxqOF*acuWjzK1rP^X0!!FGHv71VlSbgRa@xsjbkN)kl>7(c9QCr`sfT{K7d&vTFO4_#SfJt?7ScuDfX$M9Wtf!DojE-@o~)8(cu-5bT>a-v{SL1J=wHBimD7CVL3d}#HF032 z+mZK9cGtyX{rNX~#Y^Zq@{>zicS)VGbZdvquPOC%SnNQ3mHr?Alq~=)LkY~TM zq+K7>sWS}aT)%kpaaH~GgPvIQ$XWV4={m+?f`mXkJvr@Kt|CVq4X=nOFH-|&|`u5`IpM1+{d#*RF(Zc(SYr(RHuO9F2(eEJjL z;Kol@_`Dgq7f3fho`!?l95-_)e}LL{=tTy~C1J-~>&3cCWfF$?t~EgbxYx!e$zoUU zb7=o4rY2BD#VZKmmIMlDMZk<^S?5+FxQ10mmJX^6uv6o*3E(8ZiK-Pvq6RM>t#QMl zB%Z}lB)ySwdC%T7oxGp}kTViW9k91ynMM=aYP&LhUqWjrVN^v^aV2O>)l}=g1{ytG zJ*L*KvVeCIIvtoHtJ1VHGlWX8&b+)*iW1oPgs3Om9>NZk62!eGaFl0)r73l3>*Nc2;eb3nM-tt!pdzCRy<_E6KY24$o`&Pa@HTH#xNUI zTqi+R@3**z+gmd)D%pcK+3yI^4mAtE2+>t|z&M3cLhA#d(Z6py?YyI>HgDnr^9=n> zHqo3cY9+q&PZfblBv7&4Ds+(p1g3|Q5Rfor0KUj+ez}+La#lBO`F)os4fr4` zyA4}XSANAtDM6@B6F_p1srvp~7e=pPOjG50Lf92HcElm;EO>Wl*W~sz0#6OQifzZ# zf$DhIEIFW%ElN8#0ay*j=L00rYhoLFh7uSW_+9ogU%oiT%1VMO4Z+D@toH$77KW_9 zxjJx35R%;E_5XGu6ZC}l1+U6Fjtkj}?jOGIx!knhp(R1g9={f5xMsk@Y!=r zD)N3DiR1wWRrgeyaHNr04$p1nUe8IBh9+Ek&)?3T_|c$Z@XuoUFam9T*v8=rsX z*eH2+xR^wF$s8J^#VwBD=MSZ57YWvgc9g!Idv-? z2|BQxI@ewTU%wtOh{KPTeVnO!Bm)NCEml|N+o@GdJR0I!T=837oj-h>%OPYH$!Qu)lHVmAK zfdBQ57V_l#oWeD43`cDNfTC+pR~IL8)|&x&T>;jme*>=w&%`BwEZ;E~rLb~rh>IcqLkeZQ1zd-%1Y5zy8==Z3}E1xea(Rj z0Pb1whqXLtI)CdVj;VG4R00%I z|MHzbfLV}X#RC~afru|qeW~j<;!6Rs0<_cQx#yDJV35t+*cY^lZroa6< zK{@_7K@qXimEZm|{q4UxK}pdOtZ##rFma%P5G9zd7GuDMi3i=sG@FRn_4_s|I0+4U z!Tx!ay%~^uV~}WSi7sNJD$#NqKiJLj-2Yenp!i+LqXC_vT&*pjr#Z6QOwX;ZtC#i=`^Of~wvSgO14DsHOZA$3J;!Y^!cqv!q`Esh zi$tOGs;??tEWSUk?1!KP#aZ{T1Bh{7>u*_8@^Tz)B!D3(8nO4!DGPhI=p0UQcWZ)@ z)ZC8wpv4$X4c;ptXW4bFd;at(=252TTPqhTLMn6<9_?W{wSzr9{II{Pkj3QrD z$$D1|z8UczG3p%pr(2zhqJ_v?h32ouTDP2v8t$!1A+MgK@tkdE6<5ODK2dvH6Yh5j z%3I({gsu*F!FO)3^j*%HH`$c$gPoGM-9>Ty`Kr*tEVoYR7QswP+SrhJuTkZLI4hd; z0B&@9Z|m?)#)1|6Dg_jvS^OHg^9kou@0HK^w@)}FtzoAX5a~~p1+z*M5?|s~Fm7Ql%TO*c&jicLc|VD@(; zb=4wi^-Y`-8C4I%k@Wp1waeL{a7$P%Cbh~zKOp(P_yIPf>IafGr9-5Pw)!0gxV%Sk z!n_kqyJEvnjeui^LI3EmKQl5G>><98p(7(lL%Bu*9Z0tHw@xBG4Ie@3xC@#1Phvjb zn7{_(2y4c(m||xsye``J)}18@0oJ}j2`{T4!o&^umG}1GDG=(O1a(5S(}#BId|Q#9 zr}?PHN$@;f$>0;V?gh4PxhE7=2tESL2eK!%>|~XBl49ZbgnjP(ARI63BcqBF8?$&>8B~?S*s2pxQI`^0`j= z8ZBNAW=X55**zA0leyw1Q^x66UpMs&xD#&f=8fga?GNpwNstVxg3CrCjOjXqC;4C{H=fH^%>B8SpU|Rt2*W!*Yl)mHiguv<>OfNLc8d z%j>hj&1CobXLbtcMY!$7R9-{Qd+_&=-w7-{6pAKdfc*ri(}-=|R(Kbn(i-rBsDWL@ zI7>kh15PNkYUGjE61D*6dS%7Id;G5gj)F`kg2i_ogR?xLcsmGytj2Q=f`*ip(-~!w zC|;Ikld8SO^`k%~O%@FGc_d9NBItYjWDP5=37DvF4GoJ0X&B{{^wJ1{`?9DgKMidi zbo-;vRi9mZ@NrBMQ7P@9kT=3xLQQi(MnM6uEuaW7!w^M5NqC?w+~a`!{SO@Sy}OqN zQouibhf2=C;h0rL+Ya#|g5mQ4(#m_YX2wFSq8IHm4VxAK35^gDp}F{8A-2Mg;vD$q zuZ0XWq7eRXJn1jgura+n-zY;VA&TlNnFH_oT1W#)<3)<(4}P2rJQf1p@J1;d60?~Y z{5QLSzxf4t1v^~NqZd~p=|womxmNuY1Q%gd$a;N;B_Z{Dz4=`~-vd`t^EhjZn>Tc9 zbU59$T;;>N+W|m@_Di*7W5Mp|UWP<6I9iEMuP5_*L+K8EL%L$LYf6>=cyk7t=M~7e<&VvmAZCCzO9U%Kb{_1kvy+uWrJQtd~a2oqWO`f3b z4Sw5B=Z~LV4g)o!AXb&+lG*iaZ37o|g@jf-niV9^Hoj5ENcv6dPt`s=fR^XB&+*|H z$XU!2-3RqKICDi|m4@&Vr+I7@>7fOkC{R|DctX7oqzJnNz)xzKLk$XLQvtn!1Zs3T zY8o_dS@HTV^Xxs0Vg|5D%lS9xG*#}q6B8h-C?>H_CJ}`H`VjpCX*2Qr{So>LpLyVg z-#09nGPullxS2aJ#~Gm4&FC{l?QL=J=Z9v(LztIULFBae8UssD%A1*aracW5(RjcQ z*2%)PJPjPnk@|C`9`x^-lEl{m6O}zvym;S!;K9ja)DJ{}5Oda2T+jzqVcsTB9@3@h zsR1HQ@T7YhDbJN2$b9B+76ll61Bg{Jv@@-r+@>P0vdpl$dw!UVvpGj?1R}K;;_n0N zt-_xrm>kZU2QC1S!p!MqB;&U~Rh@T4ij_ML);zy_?tkOKDqH=&2bxuHirSSqow-i& zI?b9n>vC49(ucR9CGc=Qv^WxhmD+hJiPU8RWQN#M*<7D4qvRZokVaU#P>GQ}aBmXQ zMFU^!v!#5e6aq+&RbYtGXuC4E9PRk`>1q*nzt(Jq?^2;S0LeA$Zox~r_xi?-_p%-c zz~djzEWJ-tD~#m~M-tL%@dk5e*NhyyR*BbyZ8&jRrK2YtrK9BD9d$m9S}_!2F2RJC z1xE(6^@#R8mVL>u^#jN55mfBgONm7q*+%r{2z5Y%w6s@$uq+94Av;KZo@-%FcMO7A z=MEUpeM55{jah~8#9#U zHf5T>q_Fp>8SU(BnUT5NQCpg<3(n*8^nORQRbu@j`|dV-|7g2uDUcrYXQ>Q;vb)CTO&tBz^u_sKdiW<1`Kt||^m{1h3@1j-N#wHCQk{;E?xk#sQ_=ERUYg<`rm zo>X|=U`93H)BTjM%r+Ig1c_!B=Jm~}2z!;&Ior8180zSv+0)~CaE4{=zSQdf#LL=bIN*F1||~* zFm&euufD2It`h@dZd0|s5?DMXlCF90)W7@D;6ISvh6TY{bKUWCabBjn!v271ODOms zrmgMJU8GX`-)W@4V-S$EzF5)r{oh?7Q?eS?RxiO&QjXQ1K2!Rt`0A!b4lgW4eGcR` z4^E|Kd=(x+_ghZ4G1MKf+a6fxL06hVIzR${{&V}$3K1WeM^SS6$eS;nY`rDt3aS!| zx*A{}+R+IZU|?AzY1)fck&RUZtKxNxuC#ipHAnDrR*@xK#d4^jht%vh>j4R1%Dj(@ zh>MDywB-#M;%^C3Ds%j{jnrwneQR| z!;N6xv!F33pof0>M!ReaR8qSre+d~s0+=lEbvdb7gpTcT169bY@~pSa^fryaSp${< z7|uOCe)``l8SSmZ&}DDL#`D9jn198TIZxj*vvO_LG42aud_5sxJQTg$IrR;*XaQTY zj0AsKvWOpnFj-j<|1~C`<*tQuunZF*(%-o9vLP5CWx-3R+CQ3!Pt>^T=$2#VwEc6& zd<)7FF2AeE^Q9PL|2H6$EPWsX##{CdWKu;Xe+SktA+j(6WREgu!LBsB!o9;Rtdd*n zXrqR@w=S+}uqYZg?AFDlp7ER4vScb+qpU;MN!~<&tV4jOB_`$vct))d2o_a<2BrkR zrgZ{1{pAHn_K)+;ADB$9klz9Lpzq$|e|698o3|VJU_#D!Xx;(nI)Ow@RY~3;KbOI! zfvsl4SE9D(7b-T<`L)9hbUDO2prN{%*AY-ZfYp?F-9)i}F2xg_r*ht@BLehIj@!X- zed#e$Q5qx61#_~QoCwln-cs+sQTF4X?BHw*8UX^FPGQ{QFKKA1wIBh`5R>GEB3OWv z_*cNFC_LN1)W2B(MDoy)K`YnaH@nmsXz*$_<5Ctpb~#tS%Y@?L2ZHce%)N;1P52CO zB~b$Y-rrDwg|-P+bNxs{to?rpkC${dVOB5iXt8Y-@M`y>7~FrH@&T6!yHdf9+}s zL){sqD)v`YAN=FyrfDW#8C~vTTKEhab_>uJXYKr~H#47Y1{|E1Py7&?bW5a74gqp3 zqMzA14HrcneiXNPP)wLOEiCntxSZ@MFp2|(rfaH0fsQIa2xekKmH8b;_hhRi&*N6q z=A`*kV4NBW(zTKQPjqeFbpQX|;0)!QVaeFf!vF-asO4pzv&;R#WETfo?LrWKhC4ea=|2#69wiQ0mCr+py5rWBP`{%FMT7pt zd;f2&&&jPx{l;N%(uG~sPqlY=Fx`YK}UA&jR`XGHrCq4>k5B-bS zlJY+wwlGil4guLSAt5ZfB%-!+nIx9|8?U9PkpomR`fIE5 z{e^3}LGJ==(Pk1=HR!9b-pec%@<(FK%~lL>Jx!)-z%t+*R2{{%R73;aGN-XD>F@sh zS9-T&0HgzEH@Hu^sAsRmxuxgnb)Fd$ueDE%TRY@3sAs3mc%~96$J*UyikkN9H2o#~ zYDF)gL5+%%S3m*Ag0{12y#x>kqgf}dF^`GhFkF=RWAV#Gq$qHoi$~!F_(LyEFM$f; zK*T6bc`(~lErl88c^%xX8X3Ocl-o>f^|DXAmzL<8yY0*o3R1%L>S)5iZ^O5rDi$Fp zXe_x^dOfg^Gh>#0uTM7PFgWg=?Y%#mIcl3v93+84IsJR1bd4T(~gXLwxWn zi;~P__mDvF%(v4iG@d;EiX2HvAHa0B85NPHdyw(x@+78L642_Md*7MPoXuBGzWI*- zt8r(N#G;Pw1BnH1emcKXCD^s2R=mb(;H<&)f{eGq+1b3Atl3|zP5q@zns$^#R+n9y z@Z2~Q!UKLb-I({=Q9h1W6pSVGbK*X)5nDjjbgv&^&EJP@v3e9xQGM+x_t`BmxESvh z5-)*CWnjFKs-q_VQP>OK5luiSRFDtE!@y{>9r5pa4yuk3XM1f<prr*0 zuXIY*UQ>8L`IWn31ySLnYhIZAMZivuEx@((jGoX{eZJ zVcF+((&e%4nFzTV<#C$louzh*njoEMak?ay!OAOBef!K}{06Y+P#TO18ovd0>DVh` z40pm)-J}?J-=)eIO%;VY7+<3LVO-PDaaoa-&-!?8zw$qOQG%4sq<6$=B5~Za zrOlifqG1f#1^QLAW}99ENVDk~FDWyMUM z4@C#I#JB?>(M;+-Z( zoo>mTf4|WTo+IxSPHj!~K}=vMsKsokZMHNM@G?b_i8K>F1or9nN7$!wdI<7gJjeLN zs@izOM;Mdvs&`(qBfV}!nql*dfqe>5LAt>5IAASa4GrvgKI<hZ{oSow=gBYt+3**~oi_&IqPnoSh14+bHzROT4_^0J!+AryAGChxY19QzV5^ z4uE2blE%t_?re8A_|^1*#)`3A#~%<0JWEq$`! zYMezT>CJ48oGvM#VJdrCPDuLQoLr&)jKsReV|s*Ofj@%rHh;$*OEckQ^4%BJD9LsA z66b@1hRLf{V>bPAM1eN2#r|YhAk0?5kUA3KlshFdx`;WrjX?2CleSlyL8k zTVBl2ZYHRFw|T2{G0XI-EX1IHJhQ&Sf#)!p{b;p=Hfl=k`UXNu6#5=I1O&u=2*yvm zO0SW%rHv6GAiOA`AW(o;9W1PM>1}MCO!aK&9L-F3;#6($+EG1k9w10|3Ve#H`#?IS zH@rF_U%o8TxqqmkFVynb10s>)Y}~*qg@X36fVa$mwClkKUl>TJ=?qEDjEhOd0&{XK z`etp;c<}<*YXtVn`@_y-pEBt4VH=*^e79&_(5|A&5a)~%ZysH+Q$nskKL9?q^|AA# zaID$xjPCA>oTgr5)&_j!h-2|e+6c{_wKr3|<9(PFtJyAF*ZBC z8K1>}npdM5W_NmUU2LlOrpTQEr(pNZcFNTU_c`%ugwlB%;= z)m)AKnuvlf<40q=l~tDlHmsIg?)z)y65Z2QyuZHmU0+szyEv}lo z&DBnY+hNqrH}k$V@9(honr&wDHjk#lt~ZU#ReH^j$LZVX&Exmh+lN;x;ph2|k*?F~ zoA%745sCaW=dN#7$3yo0;X23POeNXg3^{u@A;n5~szw*kv#Nf!Zz!!q;Jv)6)&J1h z3hM=j>d1BSl6#xBdFRK4)$qrS6RZsO*?@~3GBNj^xk~RoqI8qdI?efX?}Fi4Dk817 z1Y{uzU9EUWglD4!Tr~!D)W|$H9t|V~^UGTuc!=}Y3>GV=N&J-BAGIYY^pYNy5WVPm zSOUSW*bKSGk+}Z=js+EfxKZFgT!65_|4fYT!tYDv8JU8s?G?#~Z$3wE*@(lbr9sz) zHE^jjFWR|Zpr)CfK5$B^Ll?(_eS~zesFevUQaD&$DwZSdbQ%9;Ck!W zy-wG}>hYvXZHVbrp<`9((ki})S1?TFs*E!kIWP1KI!a?2)J$!+2c9L`1nrkkMlz7> z3+Yuuee9J(FV!|8Lqj?(hvi9ZTYLgTt8|~}&^*PINz#QQjY(Ze_Y4k@vQ|qX8Kcsh z6Amk$&>=4h5uw(Bhf`XHP+YE^KojvVW7(9hP9fAga&iv6UUm%Ke+SL8Ujyg(EO(cm z^1#Wsi-SJ+kjW2S(@9VQzA~$g>}e|fQ=P-mqgI!eLHa|Iz(d^-Vq#&N7yb@c#QT(H z3`(zQQf*J(w|I79Pu92{V{khWa!=~Y3=BQ*lqwD`4?U-wf~tgMZ-rh^s;#1Egy~$l zH&krtAqSHvqaOrK%+Kt?|7D1Is|f8Oa|?|w^hMZ#>?MRYg)N1<7Te29bX(mbGDVIx6F{aavQMvlCgcq42tmrG9-USK% z<1k`kjz)aA77l}xk3;GATVth&Sz6}p}>D<>G(`X`FsD7MDD?>aNu|{`)8pXL1 z<+QAOqGC~LaZf(Vh@jmUdBF0pWCp2GMT1%x5s0#I3B`x`s4Y%0CkiR{qL_%AlJy#` zF>=|1?!7ceqmU&8equ|v*fw(qBo03#XC8GDW1E;9Rv_7w@P&L_hL2N_kh zspKoeh9%M<%Z^;9&NI`xxNlN#FsnddOe^)xeQ zUTG6`k})h?<_m+_Alv&~{VWn9(cLq}2)H|n3z)`~&7IY+7sysQ&XJ-sQb#zrfdN>l zH>C6-)cT2KNS7xfbSajE!}rQY$ie#nRVma41%JG>9kOhMO^(3<8Tqp{NAR>V_X6z9 zy-InRro>c9n93}I&3Jipg$J-sp3O#mi#@(j+wf^$&N-Lx?uC z)MJl#R!*Xg$*GMV3q>UX#}JBrhRKESIa%4be(CsE$Okizj8M$J5~?huH}=|ibgVT7 zH1fcaOfv0;Q8clv=V3WcGhK)9zT zRlEZEnpvF~*vl1Tr<>16*EdettIGaxT7A$1`kpT5tBJall5M$`F8H5?Rm+%EN*5uF z29Tp5fak@yGx1Wj0u*Z>WnO5We0;R1IE5wx?;3^XXW*L7n^gH_giv!JPw-wkTbtur z-_z{3$rziV6%*^bB(kF-0k+iH&l(IOB5Lp|FQ5|c%+^ilkxDxDF*nyVkJd3u< z%aD&!DI`a4zbD|rZ64eC=v)$fOrDVFSK7;kcWLb2>QFLnLJaP*Vq!_QW<0eyKs*H3gdc+$}g z6;^KE#TZ{qyMcYPd41Ds? z%&<$5^veZBk+I?g@n>niMKI=#;*6X_<^uiZ0t;l~dca-kJtK_ykS|0sz6-Kl6YN75 zeoA=W9r!e@z$D%zN6-f*OqxLR6UCu1kfaD)UICp-u2DQ9npM@9;NxYV8sPWW=Dz~m$Y$(fc62aHe{BWv4xGafM`i`|cC zT%@1V#T|BYI77m{mUZj67r6|vn@W*!47z?*#(knHk8ID8tfLWw3tF2xi| zW9%N9a>Z6U??Or8ue{-TLT%|E3sv#nMzm2Jx8bo_+homtBT}WSlD$B*j)oBM&^Q0+ zTP3yl*5rlSh9r~1(CF2oboJsnnaTB+wQW&>`{188ipmIt-KeJO zKw{u)4M~t)!N^Q>9*!`?ji?cZta=BpqBR&cpzb(SvBWUwSUsI8Xv`auVA2Ej4c?ME zjmAk>7^hNryKO|sg))QZF}e-E5h>qe9S!IfnpMar`oLfo6nbY=;aO z(I$)l9i$a#ADC^cMxUl!;A_EtV=74@{9dXDUhgSE*C(7lF9Z^yUKu!b2{;1FkVj=# zIPDpqVu_^@fUg0A#dPY>(s)L~g+J^5z&3oV@Sz9(j<}L&C#TNy6kg=lmTyesIgPMS zlI-H#liv_s4H0=m^x53k8cC?Jem}hwMIA5=P_2x5-9ItjGao8MG%|KWhh|?OYwQ*M z&`1mie8WRy9KE%JgpUV=Grlrv-C zO8CH}L2%$pL1c#Vpp+3e-1vRtp@}xFo6Hi9I_j&mGP!77-^UX%NAG>Oxth>Ldf5vD zBOeIwK{&7Nc&hKUd{xLkGnYTWqs_s#m3vMjWx+LomhL+ z<=)NY>6`gtWYsMWXoMoU*)+Z|^l)1X3|S2&>FCX?D|#<~RUm^xL}+$7ecEpi%Xx zR!vrhqP^a)NNzZ$A<{{kG1W69SAJjOP>U@{Ob$*6!!ILwio)_)=Yrp9T*at$l$7)v zyu8Y>cBwUns&(i=e&vtQbdjzc?`}MmwYm@rX(K-ceKE-8v>vbGQnPHcj4s#5`z}tx z)pWh>Wb!Rx;rcj%BWQi%2LdCqj|z9T*U=xlR-!F4U`wVJ?O(w&%GT%lA@;%@!tOrM z2fz@sy*T7$Bxi)*dsMpT;6>E9;f zWy2|~Bb>%7yds&Gm9!6$-%^MX=0=)6ArWYnPsd;j-KMBk#-(myyN8EO=B=Md%!D$ zMio#+Z+8a4DS8u%?b-daRs3R?J9BFP8g- z8ND5qsV{y{ojdEXPqf-w;Wo2^hT7pGM*$O!`8Xtqz;-B!+;<>O+MBL@ z$6BzCvMBy?DQ>c#9UgA)CCUNj=ZH@O(}hJ>Cw*Q#><)-Z{cgog>SJ7CCcZa1$gfm< zI^5b8UB6G)HeoZzPc@W(E81zTqqc6cp4#0N-k6P=(_COXH11zF--rJ5n~Cmzpm`3Q zI5NPu^Xp2gV_^p9@@&CZQt`k#iDm|LPfgNl7vm5pDur0{9)hl~`kZ7%=+j>cnhL|< zv~;N-sYgE4UU!voM2PhmpSFt-DeS9zSYA{5VCvQNqO zMRE{q(24D?o{;?$r3VA2u0vS9RF=Lm&<8EC&Y2A)H2iBW^aVC~dKImrThGiw)Q6K3TQ}=ImRt*G zdX1Z|@_i~vq+9Gq+p_rcxUuJ-_GJUd3lBJU4}U*yZ!9fA*N3>ErUzdc9tygXu9(a6 z`h=DWJ?tmUKK*Pu{k#OeQ|15c)_(J#fb(+GXI8$M{PvNWnX}KeS-YHd@}4*> zop@y9zb})RGi#qQ3hxw`k}%J$ZvJV`Jk6*0gV?8o`3FjtAGy9^>3j9#-yg*>yW3u7 z`nf{J_IK#1t#+?N(hX&wHePKK{~mFeRdeaGMF$^LF8%t|tG>UxajK2x!pUc*x7r!& zNp1bVb4lv4{&Txi`u}PFS=-$0e4`dV;*1$!puhl+IAaU7=#nXkuYd~lnHd;lP!$3* zT`8yl10@`2FrLl=XFAt2`=(8v667@{$4l|{qq+vAet8!u&P<_K``3F#A8$<9^`Yq9 zf@1!jZNL4~kFqAevek?bRpn55{CZv#tNhj5hmAXq%*x8OUD(7Z{HFYN`IcFqCtvxh z*m-8bk_E|p`ax=!7hYcZfl)JGN`CG$n`2>YxqiD`cj}#1mt4-XBelzUt%BSucY&({ zAMA7Po9sOpo_~(7^L>cN5=k-78jg9az+#db+8u zVWWD&RsBky*8T5QCg^C1++y;su6b|!_p24F zmA*T%&Oi8E$y~0+sIDz)U2d9w^sIZu6XtAQ{&$z!sz*j{*;CGhi1~)fTvgp*p>U_- zZ}U2f2~(HkTz_!NWsjxGp3BEn7B`+vIhB8D;@lrxp4=^SGTS%Eu-Q%$e|1aag5z3Q z&r`>Amn~qJ_-Br;_4CUdmFW+q7}mZIu*po`@^~q z3|7zi9JkcpeIgy;&B$cW44OS*U@!pAo`4xp0vH2u@ZS-{1gC6-7D)Z^(^Wt9z$Ye# z2QEF}`U9qCTca{e3v%j4*N#44gU~MYnF)RN23<3HuL_}g<$suFq&^n9cJ#I=Li;8r zW{BM=EmL&;=#4~#{zzu1ev~F7x_+R z!(QRTv~6p2M%D(a{?WCg*Lw)<)$B;NLTf>UZcI0WY8M#z?-_y%?b_|e&FooBw$71#{(o70Df&N!2kdN literal 0 HcmV?d00001 diff --git "a/Doc/\346\265\267\346\200\235\350\223\235\347\211\231SDK\345\274\200\345\217\221\350\256\241\345\210\222.xlsx" "b/Doc/\346\265\267\346\200\235\350\223\235\347\211\231SDK\345\274\200\345\217\221\350\256\241\345\210\222.xlsx" new file mode 100644 index 0000000000000000000000000000000000000000..517995f6b8fa7533e71d3bed4f10aa2d40d3fb2d GIT binary patch literal 1012913 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%0D8$2It@{bxfyi}+0a*}=~;KP&#MLA)ql zb#Sz1v3vS(sj-8)w_s_a@M%-g=c>%nnx*bRBczWzsQU5Dfv0GXs{I(vTKDvk(&io2{RK-83LATh z_Ns=A(QI%J8YS)6Q9V$gJ1G2{r)ZxlVvJ^sd-^D8ua4@$g6e}pp{HoSNH8hkLj{3{gzY^=U#Jd_(d=|j|4QREg!@?n+qC=|oV>Ms6 zr;m}wc2tiREIlk7=_xv_8ZuUM$USJR^l(S@Sb^@aaJ;AJh$>>NCdoa0tn^$*b%>z) zuyCrU=%`9PR&&BVXq@zFNA(0j;1OYjrzlBvaIEIEd-^!3v7>sTVCfOzd{0rbDs!wx z=N=RyecVwk6X=czKk*bDQx%WZoOe$Tk=ArnPZ3lf5&pwdbX?V7oaUl?(0HkPC-pQz z;8CI4Q*=Vrew^mAd-`~3^G@pNf~7}=8c)$l)sS(TEcc)Z(vF?f;R4-J;isOWQ>ut@ znjH7^3DRDj)H4OuM}@mRMJX!vI8B~=P^k3%PU=~Lz$D>8Ptj@B!Eu^f?&+b@&`#<( zf~85qjr%0!2AENorJ$;fiwv$>eSeh)%^%R{`4GGaaau1S84|h^8 z7U+_NcRWRURYZuU#64XmJ=aOC5L71%?|F*8RH;KW&)kD1ORsiPFBJqH6Bc`l&Z`cF zXv*EwCrgc;)XN1+j|rc8iY}-!Lp0UyK~toUJE>O+bjO5Mo}x5Wafrs@o<2od(@Cuq zR38(*mhHH3EFmzxEdt#MVNWkn zhN^hH#>XRlx^!7*b(Em`gs`8NC{xv7f~KWMP?&UMXZ1Eg;7Q>SFHx4N{RB-LkMuBU zY-e?}VChNWNH5V<)sP9A4jw__(!-tAI|aIv!tq|BY*oYrjh{z)xb$3Sb&R0;q;RU2 z$e>bB(7fjnG(&o|vsx<%JSB|q66L54PSAAsNS`4!c2>s;mYx#M_Y!@h%ABAH^az?M zecV|cFVLM5e&Qv%rYfGG>En?;Q(Dtmogk<_CH#k%C|A`WR3r5WijcbdsrLv1Q-o?S zQJ$)OsAix?dW5vOpL(BQX^K$eCAzK}5~>;M5j0EM(NFz_K$jx?)Jt?j6%ncl_DG*4 z?d7LV6jY}OcYBF$s??#HQ653FrSJQx4+#QK3lDmUZmAB2YQ}n`&z6SzsgDSjo)#YW z65Up1hH55w1kI7o_ERSbbf<-9y+rw{;!usuBYlo^nVzdPY43f2s6DzcUA2tYQjCzKbFS&sZR-(o)PAHiHxct6E(9uf+D4d{nV!gx--H% zUZMh3#6(S`M|!06oS!;XP<=*t&r4)dsV8a{cm&OrUiDM!1c9l-VlRNG)hs_-Rm z(LGgzNt)FjLGz{V{_2Z@z_Y>z-lF@e_LDSgJ<{h(oBOLT36`D}Hue@hPz{-++29eh zK-$q?eOaJ8EBu?cs8AI#NwdWxeSx%>zdA!ueO4&+7Cls{Cuz2M1TB=l@2}1h1nPwC zy+z-t4o=eS^hjSQ4fR)N3zq7H?|O@@s?13mtw)etI@@2JBhcxDJ-tOms^UqSc#m|s zbeX^UnxI-I?B^{iRyB}m_ILy>l5X@@=LrJO35R%#9;w>PG+%h6FOtUkt8WOFo)eDr z7ClxCk!cQj1TB^x_E+B$=*|hpdyAf^B4nB*kMzaTbN=dlLG?M|RBzGuDz!{=!Xs#j z^s2x5t{_k^jPMqfs1C|Br#;e_NR9sL0>M(faK5+5rplCQbWg%;y|nt_*5qi~QXD7= zs2HddP)DS3P@l0FZd<0+PqrqrzrapgiUTD96$5nw>WDNBTpo*?#EMZ?|Es2fT77%D zcerh@LAFCjMhXZe0~G>w2I`70)?(pfx$u$|L#v-)ox4jHM_Y;mB>@!!bpq;$G!9%Iixb0aURwP?>)dTR+EN@S38)yT6HrH_ zap3w`JR(+%wI*LRjn(Qq%0t3!hYhlwIxf{_s54Mke6c3NSnJ%Kx{2YoaauiX zDGrnbR1DM!s3X!iaD6NWTjxgW3c_qXw0hc794HB>7^o9aN2GD!`dE}%=f>y?!fi{m zdfHMPC<&+-s1r~}q;cT-SnO}LX>`5AY>l*f+EN@S38)yT6HrH_ap3w`Y%9+Xv&9-@ z(YiTeMX)tF%hX+~CnE)fl7R|=IsPK5`J9MqRLI@(ekC<&+-s1r~}q;XJ>u^4WftJP1m+IH#mw52#u5>PQvC!mf< z;kLDh0Fu)w1cirD7+O;bicU|xGyS&zQ?Q6~Q`F_^-UeEp9>t4S<-Z%7y&8jdy z<$2&mzz+lO1iT~i>%it~(G;WN|NFm^0h8_vwQyh2U@u68d(sG@UM}P*Ocg?z@Ss8{ zR#-y>i(t?RYQZYhBnYKKrDBv&B2-Jwa-oWGno{9T7s1b3A><2%!ovp%LV{2%lw?{X znOr9|y9wt7y-r9J>U4r|vWq$PK%LZL67Flh{aD)Dk~7-u=VvW8-Vy3ehXtdep`~zB zYMm@p2-Wt&e!;2<&)Ke3ScC+RbaTG2wW6IcS}!%TSeofpKWXg&#l44B63e$*;m#dX ziJvspJm`upvBo&tw75W#uwIu~Yx>wa$XDZKtjMb}Ra*yHEQ2hW6?syPm+q|^&E+z- zNQhjVcDbTZQ(L0bTaR`TYRmoFSBB`UNB>DvMWw=2dq7&RS!~L;x9Cn<%5tnBx(BBf zZ7)}7o|0PRQj7jUi6TEQq=i(FyIb_{eO9rcA!|nyU2*l+q0gV(f6pz_F5E58%iykz z(B&?x_<)Je>Qqc@d2$95JB24+3TZL0uEic*heZ$KJv9BRe{heEklj5c?`qMr1%t8R zQ!FUCiv<_4U{^wsyshOVbDIcpE5x=C4LiuqcPP23m&5IOxV3;=Yb|L@dyaNUvzW=z;U+K<$B+btd=1ra&b? zLx+%i+6!>^guC-nENO`)bHyc1>N6IP@2m-78+jUNJD}@61KI@WQ$V*0b(Ful^R)M` zq}aQ;lJ#h#MMrwfW0a_jo^bXMW_Oy4OI=G*N z`_+M1QjR47;*v$?+b5?)>D*WnYk=+s+7zf;DbTlodVUJ`bh!8FguGW`$>-vdx3PB} zmQ=1!C`v1?G_B|qp4kyeEC)IVXg_ys*+O<7Q%f$+((N`?qSKl#U%sSCmMF1 zK2h_Jfo=m@(t+H!>VduqbY_2S{k99!b;ztvyGdXp0;6u7>-Sb+q@OU@Z9vOTyZ-PZW$#bgmyZaunzepjq>P`U7nR z_x9J|{w>_k^~I7TEcsAeG6zd0lsFlK=HPJd1X}BgjeG^v8L0DYpd;bl(++vhh5J%* zNgpiPh9%`|6N=p8@rh2iLlU!q1_JF4)a?tPs6HZ+{-_Ndvh%D5tn?AB`wZ*8MdCnCwdvE=LbOl z0ko5eQJ_H+;l2; zQ~|WC6}cB~1N!g`eWFk&Y-9l3vsTe-I*-AU5GW01d!jdWCl7C~#I4oKA3Ol1-x6no%v5{^-y8$g91#~#j_OBp`8{i%R z_p1(A(h*DUtfak{k6@qZ`bxCXbwK@rHU;X|7U&_Mp2Ok(I^6rbjJ&VHl40VKuGo7^ zTGC`ltKoTREh?)v-}H(6&f&sKCl@~FI5zS@($LPU-uXPFV-t@FU32>_E_#@DYX-7?d8)c>JF<$5Q zJi8tz8;!K>4cgx0r|1`+`jByZ%e=lWJK!uSDg7&HXP(1~$VQ=Xc|hCy{jc+j(2x9- zy4{_xB{*L5^YK5&s_W5T{7*brt|S|)b?T@e+4gL#qCfD|c-%ZBy?02%Hk7dcaVzuJ zo-Z9b%xugS)d$zv_Wsvu7d;g*O=c-xnWbPyMLPNS4#lrSKQf;?1DQ>|N%mn1z2zeg z+Mjz`yDz_N-F=ykbVRaEhxd;?&*U?kDr0GrdGwZ#(-3|Gn>}AhwRoh`kv32L-R6rZp7m`cNSH+k>u;>%9eE6wjQ#Ci2Xi9EjFSz`B3kJtJp`W|A7 z@(#c6B+H-e^9?gP=EDBJq-PWnr}aI*>Mf;uy~7NNyyL8MY<-J$O!?A|VgKsKu#bY@ z)hCzy@C5@i2;2qmeB)jimNM`vTj6a_`zwzk(>Cc8yuCjKZ+)18x0ph~S5fek;lLe$ zZv>tpz84djMOHLDTY+bJu=ofTZ^L3cS-6fR3%ee`Hvzvu7UKh0L>5SVwOTw|L(dYk zU@-?4Y1qY7vM6vNi=R`6arre{3P%X31<`&nS~b5 z0x!JwDY0tM*&XFz6{TX(6hYVu(*s} zl#zv9C|P)_$>LlwSyTaE0{jf&jAA0QjmNV~uqeYWYLSaDvT#00R6iYA><=Nl82Cfr zCg4`W;YI0eLIvX5g#6={kVW%TB!2Y+S z!fqp3WTgYYO%~%9u!uirtQODK(6dBO6}`yUu$YWp^dgIbEo70DNfxzt$fB8y@O8j1 z5Y8wjvS<77>>4bBv5S9^822Svtji{9W+_>mhQ&SLb-*JCXA~3JE}GI7XD`PthLVN% zP7;GIlEu}#M1_4!5r-cqygTsCz()iB>Sr(dfL`>>ZZAFayi67&?vq8Ig=Db<7879c z4K_U)_&30>imxWVWkC`>bIzw{sbyqQ1`7);mcrsRb}^kS3Jw9k4*W;L=Z3O~KWD6a zIX&A&&l0ELy$`~o0J{h#i?}qhXpRJTM|K>LX|_)9l3w(TQr%hB*59yH>zkYHyFt~g zK-EklAL1?_qIU@_{WZW;CjHkc{*Wi+=Mv(@z>9$w1M8*yApBoE2+6UkvH-&(rFxp4 zPkA1A5%9ynI|1*A{5r7xS`6NxYVU7os#Fir^C`~*F9LoTcqiZ;kzWV4UyCjmiiRuI zugls77uW0xAx{V|27VBDXW(7&$+{6nDAi;2!JAa=0}Oo1^T3OM9|qnD zct_;df$i5~wAMFTHCiI~(7R+5byKPxWwHJS{*Whx7Xv>Cyfg5w_+;G(nMDCgbuU?L zfZ?##cZ(`hBA=pn;SYI2croyUz&iu)ici#y&|Rta&<97Ww)z|Rl;?pL0Y4196Y!46 zuLIk!#hFU=6n*d()z$z5pYlBLBH)LCcLLrK`E_9Xwb(|f9WTW`%_^S&1E2Cd@FL)cfp-Gl5&3ms`?c6lsrJ+d$EXVZ4SdS; zz>9z%2HpvHN95Om?bl+cQthh`j#U)~82FUuffoTk47?NYj>xYA+ponIO7&2^VS~!u z-@vCl54;HYVc?yBcSL?2*nTap*7|N#^_0km>yy)qS}WCEWt064{2@;WF9v=PcxT{U z@rk+-44YK$0fsS3^>{s>@;vY&;D>>C0^Sk%b?_M1Vzf%_Z*WnnN9zrI%JaaBfFB0l z33x~3*MaTV;ue)Uz!0od`{)gP%JaaBfFB0l33x~3*MaTV;zm`NzoC;-JyLJrQ=SK2 z1pF}YPQW`NzYc7_7B{QH0u0lX>dATopYlBLBH)LCcLLrK`E_9PwU~UNXrfa6hHP?x z;cKn$X4QU)e4?H|&TcJ{6jueWe<~0hV&=4hLYJ`LmjnGo4 z5~?-kDB(erP~FAiXRQ$Og+fKc1A8Gs$P;!22$e!zlweX=bV8Y;E=|zuEDGU!ox<8m z7;1W;u@)-K=M`1Gg?xo6#Ck_#$`Mjby@hJO6zM~IVZ2^rI?(5zN?M(-?4(qfrRIF) z5T&567#3iS6dEel3jM31Xj>t|4xvWT>fgehmX=Jx?AKR_?Ja18F4i(lfA&I=RSL%6 zXRniBz4p+O5+M!Jd6|rPm6i!76S6B3%S`vI5sOYH+^9%wuvD8O8l;P*mIO^gfkV0U zN^OFr<<%R3x)9;=H;Qeh#O{_VHvLjzEl-Ghn4__b?_;e`Q@ruLRH*fuSXZjE?)#@; zZf`xC7JJ>OdDeO*O@7@iQc+(%u{P_bpCT+~vF!E1VH+3A_6`n)3oq*qX%) z%6rsWR&+{|b9TFC_ zSjNV=7-wUgg)so*42&OQ^uy?j(FfxcjFZ{+rqs~(MqZ%}IAMGiW9emV31cG0NQ|>E zj>PDM@mY+edEoQd_Qqg){Sm?qV_%GYFusMcH%4cSJu&vc=!CHwMhCXNRn@e;XD^X? zjH9l@qTCkI;q1NLM?TEj@of2P86=Dsg^dt~LU;~BD^b`0K?8S!gU-NcQDBxBl1Ns z??5nhAlGCWge(XW2x?JS03o9?<7i9=lw~@Y4q#@08S@b$pMmfq1P4)=58*oq=5zE> zO4?JnF(DAXWv=S>D9htu^kCM2F$5uUDuk;LMvKBc2!|n@gV0PA=CT6%_8iJ`E&?Qh zISA&69YtP02f{uG+abtAVK#(45H>*QBMO1cbp>2q0uea@%px#_?a0+-7KE)3=0Mmg z3Nss&CwA0qPSU|N9bDGDDz_zZ&eEPa%+w&WV@2O%7S;Vdi5X(*t(U}C_un1;x5FxMcA z7X@DkG6?AqT8Y9`2q6%TG1p)pxE=)(Sg1j0WcRJ9`4^E9*oQ#cJXrZm~iWDKlOkmQLmq-AIJL-@{`AOUiFUo=>ArtcD|xW@hrdp zbj12e;=kJ}*uSC!&jCGN2{crc>>=xw<3kPecgo?&lzR= z<1=nOp006vriR7&q4aSU{%)9CW7!tZ7)zUs6Sw*p8~LrDZubwD6K-FocTCv-*e~{9 zek&(fSh{ry%_dro?wRFyWkYK9T9&yj+cr)ZT5zck%bCxj5#yTA9-YII7<8|lN8jDf z107gae+yT+^_W-V6jYPHWm~1}k1?A(yRIM`jkN8VhPgI`ew1fv$hg5}UhkA0a2{B~ zzNF2s^Lw7dJ|-K5!sT1q-s7j}m!7)a@8u^<$oKPEbS~$wq@8)LJVrKF>(n1;d%yp6 zei`~vpHky7E%Pr#%xh-xW=|;V-@{@ry}P28H!6Y6l_D% z$&Xu^|K&M7fZ5cWWTy_(TmFyLE_zzKKa*{B%(k+l5|R9ShvJu^1^ZO%%voDM$ZC-? z=Iqz44qj;bbb4y_h+!i}SVvl=Z_b_a+-t5QLi4^HwB&f|#Ntmq=WOuKNi!zPJ*Uqv zZuW?S$6~B}y+Evh*UJBf3g~iF+T-ZoQUR4@!z$n(g?~c@EDcgb2mLJ-&^1J?fE{Un zLj^3qY2AI(whDOE!DHRz%xz{OH#*6nw8 zVMO5AUJMFa&A9Co4|SHcP3hUj->`Jc*`-?F+|>6ssG3b}8>4F0=r(3;M$t3tX~?Fb z#X2^Op1c z<}89vA!br0F~P)myAW0wKs!7^hUKvYKXZh3_#t2|gB#rfFA%d%NlbrYTmy;eo<)Xx z$uO=j8J?a=h6RAP68tH_jD%IezliBMizyvDVa?>97KlA_mbiB zM`?#U0bgb?BViRdnwX@0#0(@RWiK)Pu8`r^WLPkf$jmup=mU5^!HWSOB)HM7&s<^x ziSbM#<`9CW5z{oE3~!U6oi7<40sINz0}N)NVU=sen|?q{`*~!zoS5>1WY{g0c6gQy zuU;d=PCm@g+n?aAfHxD|==RlhV*W);+$>_A3L?Xu#H>ppLnRryUM9n@3J885@LYl$ z^PGjC1;m6F60?Aqf?#6GV5lKO=VN5pJdJjE3vdy^(F8ZTWvPf6LX7J@Vn!4b^9?a} zp@iiH(+-QsFiTDF62O%NH|E(rgqVB81f3w}D1sV^X`>@UJsEm0CPOvgdcYcjYY1+1 zi~EcihxugKl&ZA(DPnpYqa8LSO#cHJcAm-%<31;N7vMHOmo#HiZxS>16n_igxG# z_%^|t2xcU#$}@-=PE1M>VRO=PLVhkGUJSe#crmbE$`8W-$%7EB8ZD7~=v^|3x+&F;vRHpZwAPnDmAM%9oV&DgXcLv@SpR609w=6%is74|`q4nico(En8{4nrNz&j$p4s5>``5*A& zf57XB`U76c{Et-fKhVklVk!S?t-tq|YMV>s%e2LvWp3$3e9H5{i+~>n-U)a|1MdX9Bl7FO_G{5oB9GA)JIdTLiujc0ffoTk47?NY zj>xYA+poneiTsGRxR=Z=vxrZ59(WP(!@xTM?}+?5u>D$emdMv=i@VCw(u??%=Ybai zKMcGR@Q%o@1KY2~B#C^#w)hQM+Jz!M<$2&mzz+lO1iT~i>%jJFF-Ricsx9s=OUo$Y zQ=SK21pF}YPQW`NzYc7_7Wto%=6^=|$@(+WUu%6g^EXPqP{fZmKid2t{OTYSyU5Zq zi^?T(wU$qL9(WP(!@xTM?}+?5c#LbYi%gzg)KMaj)E4t8&jT+4ei(Qs;2n`)2ew~} zJ!J9=Me!1OqPCb%c^-HX@Wa460q=?V_E6!}WzvD#uj<$2&mzz+lO1iT~i z>%jJF(OD+XEGm}B)3n8W%JaaBfFB0l33x~3*MaTVqJzwsUNlf5kJ1+NDbE8h0)7~H zC*U2CUkA2di#=t=3q>a+@&nppKIM7fMZgaO?*zOf^6S9%Ytc(@aFQ8gRHlp~i@za4 zB9|)F3EE=*`2RyrtZsUP&YCYg6f9oC4oiZf%1I8csGg7D(toBwvXH$+)s<2AUCZR+lBns8` z)+#~pt24zaZVA<1LapD)&vRny>Z7gfNuIS*xN1El)JrW@QXx`dlCl*KLWC-f**#t& z7!>gt>1MT%rO6XU>k|Z{V9`vkuaKI~EAHK_3NVK&t#>jtrc%M$GE3)`Y0PV|q%4+R zsYtY#?$t#M&?F>RB$`b3>LV6u5+Zb7LTp8%P-Yw-_O7LOO~YiN<=l{c6={m<62DUG z#SIEex&6Aje4X{;XEaq*Vtk0P8e^@((p*tjyR^Yt@m<2n6A35#n=1>;?rlAtpg9qL zvj3~wPkec@|Ag%)ww~<2Y5R$|ll?DmKcO6?s`YP(7}~O6*}bi7lwq8KaXiMM82ey! zz}O1oQy8o6(y9`Sc^FUMjhS1qv%;-<`-#;j`?GNs#+4W&F|NS49OLI0mtkCraS6uH zFe=#g%=NUrl2Qtkhw(JVBN%sKjKR1JqYUE=jN>s5#n=al`3Mn$F&JYI z#(5a$Vw{6-Xpm`@|LRV8!zg9B;?Wb$jQejxFv2W-*xjA;c6n1=9|KFNDdW@HB*%Aq*5(491Ek z^|uRpY@j#p*aS>dFfW5~0@Lvy5UeG%*UBh*i9{(a?r5!}m#Bqs5rUH_nCosAoQNV< zUlW)zFnhqr2hn2RdI%*DmP0TOgkXeF2q8dRF>sJ7^lFKz`M|)DVB)L6CXLKM=O>teY2o(Iz&OaK`9TeR5s zEQD4NhC?vE3E?z^W)QlGE8b)U)Kn}>F!A4k`3IQ#H7K&)v^f4Ggt}XFgswvvDGJ|0 zcmP2qu5e+lWw)rM1;T9{)9w?wM!OR8|*@G6x?*X$3f(L|WMPV0&wGeuUD_+Nn9S}Ze zu5PcxbqN^DDioO$F~!@!d?+wKyx+qWWxxqaP*7S9=F`{OfiJ)W*{dZvcO`Jwc27XEIS zTVvT4&lpRaj1#x|7#sPmpKkXLmlJMZrgu!(|JX0~Uw$hmSXjDs3C$*2jt-yccx6Ls z`dXH`Hp-0?h8A?~!*b^1KVn?-*=w{ci9s9NdGy`wEOB62{ViPO)?;3cQ&3HQ8)c>J zk1?A(yRIM`jkN8VhPgI`ew3#^WZd8~uXoB0I7>>{m$dnHe$R8*$7G{WxO_|7d;Apr z(o?tlz5Ij;`F=kB=W_l^+L`CdV`O8sPW^$l_xoSxm!Ti^DK#EL4oW=^YFHhx>U#7S z{}a!bUOvQZ%of##YixTqR?#1LDq_B$p|~_d!8RnF{J53*U!Kzgm`%M&cIq&_<^Ndi zqNla{Guc+hY%4n|5y`)IDE=$-qw+cIBD1M7mVO^dZ~2IW_UE2v&lmPtJoeF%Hcz$b z@cyyq$^*$ko-&lEGy#Ex{G>VIo8KYPCXDcP{bb>i=6TrV1( znj8O?#?_r{SmWA6+k4bO`_t~h8rNqAucd~+rE#T@4QpIeX?uSf`jHnwg8v3pGl_hN z-X*w)z2u^+kFppmbFdk z)yChjH1+IKt?v)VztH+Ny3L>duHI$7KMgZ!2&7>S4fALSreQt}3uyS5hEO&zbETSW z2a@g8^UOBa`aU!D?o7LE?@xPJPJ1ZdKzrzRnBd`n(+Tc0gf3ryerceOacPYSE85H1O6d=xt0z4H!yV*&*S+|K`CEy8wFEF?<8G#3gao$2q z7Iy4SOlT$dcttJIJs{3hi(O8R~P%uruIc1poBOxBC*4vX+?Ci^L2dreGv7&1RFK z0~sdmCc}8Zn*d)T*qh)+H_xw#xrm@!iCK|H%*Vvoc@b6x!@*?extHLVkJ1iz5!{$( zpE(rNlbG^-#0)1UWgjtcxGBU8olAyuh*_6Jj0!=I zkzx0IGQ3NMalQnf2E2&i#yr=8Y2w3}f)9x4Igbn@iE%zehR&(9!*gU8XsdTS82q z`DFMUWzX{z8NPLlcK9sCZF-Xo9RV*V_z1y_gjGs&Vy=Q2M2z=JV%mR1hTRA&KSPFl z$S|cf;9F!k4e(lme{$P?9YH$~^Hm8kpAZulMa)wR$nYI9T$fIU?NqcwN5Hok%t%-T zdJ*G%ff!F>Qr;jY^bQ#wCc}a)M3%wO53rWtb$}%VH@c0NQP6qBWMvU^3PJl5Goq9X ze>egIQ=;`{bMp*MNH5|GVFVtb~uvAHuuP|JK#M8s{tzs zZgkUw8B9#vUSb>;lHpgxG`~WI`^eCB5*h06li>$|zah9W&&3Ejm6+5rViploaDbR* zp=5ZP43n;rVMp9m{(yfZIF8^(H_rlM#uDQ?mzWjh#H0{omqu6>41XX)PkNE<8v#>t z1}N2I^vN-*GI8oIkJtJp#?!OBY+ol?{_N8Kh`-?Y^f#&FDd8#k62qsWdR00 z<$2&mzz+lO1iT~i>%jJFFztr{(nd+1#aqIZO{(?*20rC^;6=a>1MdX9Bl7FO_G_`bQthD+j#h2; zH}EOX11|!87>C0^Sk%b?_M1;zpH^zoCs%JzO8mr#uh52>4;( zoq%^lejV6;EpAr%1Q;eM)f4r>e9H5{i+~>n-U)a||4Qthh`=2M;rUIhFw@J_%xBEJr7z7`D|RPO$U7E1L{ zJ)iPC@FL)cfp-Gl5&3oS7}w$^m3x3;j8Z*bZ{Sm&2VMmHFz`;mJ0iahY`+$xRce2O zi&8yWZ{Sm&2VMmHFz`;mJ0iahY`+$_sMG<5V5QneZ{Sm&2VMmHFz`;mJ0iahY`+#a zs>1vYos{a4dIO*GJn$mmhkleu;ddoZE3qP*q`_Xv&l}v=kabtQk_%RzlF=tLaA^^6J8f3m^Ae|@7fUdYY7qVY3dRcRdV6J z&Z<*@W39Dc@lat|X06l-yVeUenL<_X zTlVJ?1&wBk)f!@r(O9->%pX=6^B!7KBBVh&FOxB^((-YH)K}+aH0D)VCTJ3FR3z$* zdBOurwKPI{bYy{IU%8*9+1!wniZqRD*#Vhi_9Z`sX|&ARQ0N!;FkffAv{qxSjqPf# zNz+WYc|c>?^G}7Pxp1>E^G8$85}~@>w>ImhG$L&CVp&~|?uNgv!wb37*!V{7jTyQQ z|IVGp#yPn+rYB4dTfJDb2#`+pkD>2@~coXAwj2AIxU_4cm zanyL#*nUy&G#_1uMY%V;X`F`f#uUsk-gqB#j5j7@j`7AM%rV}W$hJ2L+ZzjW4~#=F z_Q&`Z#vT~EU~Gr+WsJ{b{3pixYP>>q#?iDqY;Oz&y5Wg%7;n6bImR2KF~@l0-86vx?+1vVD6aV7TGCfnIj?D8^dLHhq#Y;NKs#fFjN#aKzIkj(-58#g(wJv z9%dXZbkK#|9io04j3J#|_dAel@Oom@|AKG>!dy{U2f-CWHiVv{ur_=_`I&Tj;}&ZX zpf{LfVDh?>Yl}4ydP3L>Ax0EdLvVud1%&aUu!^~^himdmMD7A+DHu~1a!rne&=JA{ z2x?JS0ihj)=@7!YBusU0`_QtYQ_2i5W0oWGt6<&*;~)y3LwE_o+Ym}RQ@An9AiM~n z7ld7%6Q-)4hwBJ!TbP0CJKuo)Ii9E&_@))Ayh*6j=37b;CdWPVJC8R2}9&EFkeI1Dhi7r zltPGu;3Ep3LMW-sINGNZ6_EQaFrR~Y3QV>fk#9iw7{cj}6fQdyLIDJS2+KraA%v^U z)u$uM@-mn)V0wZH{uq&SAq;|0)`47uWe~IwTp;Whg$1mD9M7XH7a+iSFt33b52nRO z5KcpQ4niwYm=8e%q3#@giM;j{u0;rQHJl^YOF00>(kOghKPG5`hi9+*C0*83y!MlgdRRJ}&7>t{e% z2jNW!M?_&dgjEnaGgrfhaJ2*D1IFb;L|z8w1qkg$;R6T?2n}cHqZGEKa4voj!dL+v zX^XO41m-rFWni*>5jhmXWe7t>VJd_L5Y9k&N)&t`1T)vdHYm$^V3NV?Z$puTy%9MO z!ZrwVMPUjAe+cU#^c02nSpj{17G?Q90{DUX1WaCQa&0jgf)9j12r;5C3BqIu??V_b z3KN;@7`P@+K;*Gt-T`BJm0Xj@L-2$kfuI(JaS%KpbcGQ1Dl5y8D4-c&#*9VeVPIYa z;~)y}K^P3de1<+sNh=CB#tXvR5Pl@V+$C^l;GD@$gA}(DLKil%AG<OSB2?{Y4#hI;obRM!%y$14+k;|IS|UYD0Vrt_)@^X$n^8zu}L z7H>`2-%6Lz%-teBD7f;xiq_XD>aGE14~LDJK4W5Vqa!hQJI&|BCB=k5A^$M?N7eiZ(v2t(hn4lr>yKd zQ+?U|`F~@?YGvh0ss?r@SJAJHb@Y2iDSJvo#(nZ*RP{9~(}evt73A+5vFd&4&|y{$ z^(NUV`u+3D{zD^n49uP{d}-PEFB2=%O4cbJeMBB*#13EA)wQe|6bhHM^!uo@_9sT{ z6l*-X9F>lnLuDF~{Ktp(&yCpOJCo0!x+o>A$CW#ZWb{=Cz4_|7!F4N3s3$$N!$@weY9r zMZbTsdBwaakq^MU!U(zA`fVd<8$OSQhasqb%4HJjQtM%Ap*ZOqz?qG#6AkWE92b!-?z!+ILBX=t&Y zp3$(LhHM&?YUa#rQ_qua1KAeXlW8-5+QTy1L(&G?L&w9khhemb)O3RFrV#8v@EU^g zN{n$GP0Wf6VqA%_b0Ve+hTF-|a}ybEBtzHnfG-d{f#AmXDc?-YSp=Oz%%n_Wf{F2V zA*?Wfc6fpe%VP=FH@XF0AZDGCnEu4L1`^XfiwyUYVO(D_JUx>P3jl8= z_)~%z39EvC5z})PF{Q*f#}ku;prK?~n@xtd$gtpTg7*V90#0CXqg$?-7`ws5vHkDGMjcdhzy(WCBx^B(hhe5zRX}o!YXhy zF-iM~8AwdZUSj%PA;Yi9uwWvQnRCd{2k?G^7Xv;>aHCtFxx@q#HG35uzuv;qa@GKc#y+($ee3+rPKfzl8 zZzfo&7S<%GuV3#t>cHtmJ(mW5x1qzc9-W*0>+JMHb$*U(Zg17T=rBq$zr*|MWu|@K z&Dk*{*`wu3%eLTqg)w&D%z74^am}JA=dM$fw<(HUAVp~vL|fWTQL<8KOFL*wu2%pT z5ImJ&M&dICr4n-m+b$$#OCd3#*mekECK#R~!=PgXw@#yXECF1^;6}H=Y+{-pC&q&q z*ZaiGEGEN)WEdAph9$wY!yACVC3qFVj1*7Ar^Jj7A*PI&q!YxPK+rle?588c`(#+K znBYvnCcqj7H@f9MJ(V$bONi++pA4U)I`=$9hHo9C9X?BOo8BZtN5IPoK0+`f#S_t- zn5$q05#zm*nD!r$VK>6c&ye9BGE8X=_!b#X1H6{t#uITJK|2uhRS7Yl5EBYUS!h`0Hl@9J?;ytgV=`PtOwdI# z?0cMcIFiUV_sFn2;5`JZ0V@e^bklce|G7A#9wfH z`kU18l<<`N@+k3o;Pt@k;ir4$i9QT27m9`})vwFi1{ii~eK)DrNaSPn{2@;WF9v=P zcxT{U@yWUo7Ae)!^vSWRvH%00@;vY&;D>>C0^Sk%bzu9o7_IexYA+poo$O7#?d@D|n900W=$ zJn$mmhk>C0^Sk%bzu9o*iWhU)Cb3?3jGay%JaaBfFB0l33x~3*MaTVVyIH> zs}GJ<6$Tjil;?pL0Y4196Y!46uLIk!#noEhjjEm!`EY%5dQoeox~pumzkxsG3E{=S z4+8HDyemFYH-ce<%H7}4La83A=Tn{sUIhFw@J_%xBEJqE<67LLat|9z%2HpvHN95Om?bl+oO6_lOQL0Dl4SdS;z>9z%2HpvHN95Om&DUb`g`$Z{^&7Iu z0fw)&zMED1CGv@S{*Whx7Xv>Cyfg5w_+;G(!AiA{-mpcb4lwX3&jT+4ei(Qs;2n`) z2ew~}os{a4dc#Iln7@Hfc^-HX@Wa460q=SGG!E5{0;o^|A(9ybzi6zH3`-dp(;wqwU&ff z^E8%1jo_v*xe3)FLaoMBsHry!MyaJ#sI$MMFnb9%b(T_vDNSLFZCS6dNUdptMH5k% zD3s|e3CuvKACW}BC*^wTZni==XKtgS8w@vvGhtsqRDixK4Ot3AwuURR2lPx zhnCBo#tTQMDQbj+wObk@OrxdN0mj%B=9)B(>#YMC%btHKEaklwl^SbpthC-wVal|( zu*Y|DtogbJks-bJRtO#I^3sfXZjsW6uz`zZbyaC;>>o{1V%hjYikywFq)cX`U5ZFWQ=YY+hR24ucLcsqPS`MN6FUfXQij4=ya!kC6J7NZ>FWQ=YY+hR0o!DCF*vh7K*y>v2n z@Axol$Ft@0(+N4!Mb}|b?)nuF+ClgLf=m>aLud`*JqUe7;d8db5$VSEi*j8)Cq~^8 z%m6TjoypZ@8H8pK-hi-G6qZ7G7J?lFpUw$W-Jf|#Z#)!C_GgIP1kBT5o)QHG1ZyR| zMD=-kiPQEJE;|B31BBZUmf0svRU0eGbuO6T#fV%DCL2soQ3!|d0K!QKWu3@1I1Iv% z5R%V3yeNDMp#;K82(3in69_s8pD@>8Ib0WjQFo-s z$)SjR9n5qHVWO}Q!W9VPAh?Ud#}F=7W*lwRkv_P4E||B$lyo51F)~EfLg)oymnbZN zkPe{(gc+jn5ri|$)x86`s=o)*6ihQPh7d$P38D5JeU!}h6wVL~;Wz|6gf*fN#0seB z92L;|AOtuHCKpT}Fze?*I0WH42vv6Ex_&N%BnSr~91(>%%=Ig{y39f3L@;q+e89NO zhOi65Y6$H`ArL|Wghdbv+p)5YM**E~N0GBx;4tu z8_Y~FYrq&LBJv~%lOT*1g$WSGK^Os{nJA2B1@!h=l;wB?@C5TFm?N)JpD+}hZI4fSblEE%_Z~T!r#}AjUk4lZ_I>sil@`@!mlOWVrr^3VWZeAwQMchF zo%}fO^y^KDiFtWn150?g!ev5DqO-(d--?vsGaavNNKIe6+wM{uB$K^xn#wEhmP@%V7R^wJ~+TM?1`SBzNHGY73H!}S$8&m3aE|MQNp{VKN} z+iOO?Q|9I4e=g^Le6_|rth{?QAvN7>Q9YpF{~Ml7M$?#qu`M=i9ltk$U>JK4W5 zVqfNEV?$mWrAFGej(&fw{mEDR4XoSU`I^1QK`HyrR9`lK{@)m}TIo8SRYR4r^d0)O zwT^zzC}?B-)>k{390u01GA${!tssBjh*j^fZ+>LeV6{#?NWXtx*?(xnj)5Yk$t;Cq zHkB!Libo%jM;Wohw{j;{gD#=jF8Y1cS^EjVh1YR6u2#u>X$_?VlR4!}n6< zQC1E0CfPqzsVaW|^xI;@`ij}}g;dMNc_vn-m9pP$BQ_eb!`Jm8Rf9s|Qcb^qxp^Iv zUYh^+G_Tt~HLp8=NAntN9J$o+w=}Q7VzGJ6r{BNWyd0NleK)9@N#sNHE>!w$cXZjo zzQL*$pEGMmyI1JA2aaNd_p1bLozA$xiM`T`o+)4bj8eTl;815-+Z5+E{)Q&`XZ;OJ ze{x&WYKBC<#DRuBGz_I-JPk8wkkPP=h8P-l(Qt$f%$zwh+j7_rVzx_b&ok59CR5lR z3Odssdiv8IB54oK8wqwkOnVpsIGy0G1UI^6MHBNOF|MA(oXa5QZDQAQ{H>Be(?c4T6U46J-{E7^lA0@+m zfUg2BV1|r@Rp1d~l2VB&M$jT+QVS{QA~GxpA+lL88J-4wjNp!Gw8Ps3H@eBdU*$k0wshE;%n0Q@b3840W0Y`p0rVthg3-meGog%~j$7qMoQRwbB34R^$a)KN497Ie? z3u0=)yhBXEN@99`M21de=zNw8lK{5?e2WaH6Wr*Qb&i;u2-=aDb0x%t6Jxi5uvQDm za2Oe8r4!smMLX<9aATgsz>Fm(=mIeliAm{6%$7T3m`aA;v1Dih{2^d1!J7$gbc>54 zW`>M{1{2dfo0tp)9YEO3QZjr%hH={nE&&`taAThP-6iG)Dyo7V#Ekx!4A&5obdd}P z9;Y3SBEx?72z~?b9)dFoZgg|?BBts6?}f~3n(|T6dsZp$?0>1IiT}1EcJrD{H}xt# z^8Oj$Wr14l@RrYJZQGV_pR@YSmTq~iCw>|;YOndY=dfzop?HI8yF?z+u==>0Qth_b zqj;;fcBz=Zp0r2e96lkM-?;#QKh*SlF({T-5{r3u&yT z|Ky&n;}3b3em>T`717C+bFs^*2OoeWO*QC2|kFOGZ&QrP@)(AM%9oV&DgXcLv@SpR5~U ziryu&C_t(1C5sI(9M<}7QDsWx{2@;WF9v=PcxT{U@rk+-Ci6eU$Nw^6GXJZL{4Y}S zKheqmJn0kvr&;-bznT9Bt@(eY z^;N37%lJc{5MB)YAn?w>yW*2|Bb?Cs_Lk*m7S%}Pe9H5{i+~>n-U)a|Xp0?XZW%?M5;>ppJn$mmhk>C0^Sk%bzu9oxL;fRhAizuQIbT?r#uh5 z2>4;(oq%^lejV6;EwVo#(p{F8Q4}PR^C`~*F9LoTcqiZ;kzWV4UyEvOv5PD%v#4Am z=Tn{sUIhFw@J_%xBEJr7zZN64#a(3b^rDUuIiK=8@FL)cfp-Gl5&3ms`?Z*;E$$(c zUnq)~$oZ7#ffoTk47?NYj>xYA+pon~ZE-i5Jfp~0BIi?{2VMmHFz`;mJ0iahY`+%M zw8hRcd1g_uM9!x?54;HYVc?yBcSL?2*nTZWX^S0X#`L0r5;>ppJn$mmhkhsB#txD|8Q~LT`m|tfVqZr?-}`7eW^) z>Q0v?#JX19*)~&auFM>8Ctn$2yj3!w%$T+~>`qm^U@_(hGKsFKVzfRd!OKz}Wj|7J z?AuuXX|t^6fcU)&r$vA2TiUXB#s~UtO23(doT~2ZE;F`jIJUXm)bm|^NomBOy810b z8H??e5x&*bGUk+awB$ga0~uyXRS#uU+G0<=mvDy#87~oDGdnAL%WKO`7ZpzJwC4H) z33+S2`1I2Yf%>_UxcWHlfj$W_^_ON@PUaf@Pih{jRx85V7}?8>mna%)I|wJ9HAQ8Z zXBeda9?{1SaWvWHFSN$A6OL8qby6WGBfLFDu&*gh7_{CRmho-2xju7b$D`S?UT@9T zXAYRsr+0>V!5|hyGC|Y3+DBp^d&)oj0ek(3R@U*qyM1O|`b+DQ|5)GAgfG7EZT7c= z0^Y2OesSi>%kM=DEcMDT-^uJ<-(dMZVzhq7?CvGYShP&aj+Zh-CVVLQ;!_X(LVaJ# zWw)xz)L4J(_40~@K|u;l_%N!5u#E6;9u#W*PEMV6d4S);cjM|84EoQ$k6T!BLNdaq zHjSw~m6KtPDbz_VtqT3J!c~dwDCrN6kZp-ybbYFy=|tk~(nM|Iy5iVEp*AsUm*&oc z$lj*-&yHMH|DW%V_)7LUsO_ti3P%cciWehwY(%y3O;mINkMY-N; zxb|DeUCIL)^ocdu;VgzjQiR{#Fp17@tVH~@R;M(L@P#QVf_rZMySy}Pc~KkU&xD}0L6T&m9OQkleW#eL&)miiLO z7i(KajL{dKd}s`=k75prAEgSlUvEY4T}oEn`SlI;oBi_ZH)+ooP7{+=C48yv-Civ< zSL&?W3{igBW#u`#mcslcy>r^VXsOA3s^@||vGWdI%Jj>gzo)n7rl=hunz1JZ=i7do zw}r9;LlqWlTVHl6UM!70VyZbXP*d?h8d()2uQ$0_O@4P5Dy$1tQcFyhxx&qgD8XEE^+A+h zt&&P)zM*%hyr$)m7f5-IVzYr-=tnOP}z+%Ow6Dm5HWcQ0PHvQC{zsxz)4SXRjJSLHZ;_*MCx& z?{9sW6TDq`t1ighSh>GEGikA@{6WjMbpfvj-aX)F%(Yu|eVFWS*_M?<{Z7}v)=)b| zsNG*adQVOM4*Q6sixtCfnzK)N-8A3PT^}LbOjGQ?Z+**{xmZ|P`^#kB>2Y?)fvnkg zyB&|BWtN6ZWd~9<;e~yyH|*oQO#2isT5B~0CpSH;wcKT~ql?bJpvf}VjCLAZ7T%-t zPaQ&KVI3l2JPK*hAcnTq*M77vp=CsNc|y@r;m(Yf=0eM&bxr&9&id&fMCI(OkXrBb zuL(-4%js5ClKL>pZ_v3kO?U@(5?KF?uP@BEq_J8(5=MQhXgG?Yfy ze>Au5d~f@Ug?_B(&Ht1bW_xFNQdP9JY(Q^y7n-ndJw{*Fw88X_hT4O4a^+kJg$Z%b z)2Z*UPju~+b-tJ8)p+YtWpAVF3~EqU>2O@?oe^I6jQK{r!g{tEH5e@XDpFZf?=tqS zk7u)^TfZRtPJTj7e`RkcUrhq_sa{!Pe+~UgBhQp}t2(sIa&y~B$7OT`XHAQ#573X7 z*oTm9apr7||_$jp;(*BqXCvU^pT zw$%S*^%T~@2P!KLysp&suj`@ISlxX}S=%^Yq$#enH{8qjcdhE%j>@o18$-( z)y~z#niCVXeu|=NmV24|G>fGTr|+;9f9U)F$BvsoHF<6C|81?ctp&ACRf}_dZ57lw zRjkGV2kL-|h=8cApr{3u7}7crl{&-`M;d9wp-P=l5z&|`+BzXYQB0@|#WA2rP>?Ys z`JMgb;_YpFZ}GPO@4A22S?jKy*YkYNbI!ZpefFU@xVzj`GHGM1we`e91}gTXAA)?Ql#1jR{`IzFUV+`q7UWv{C|k)E$t#OGSql!c z8#VdPgXp2%ip#pV9ayPMk9j9dKZ2!;RRQa}pBf6MSUTVQqt2VOkTtE7F;hl&F*pAG z*EeSrs;s$wVR)IA_puPWx?{BY+MGnXKDxNk!7UZh31*-3TWzGcZplANK>4fo$U1px zG&{MGe$*TciD!P*;8~UZdYuvW!E*D*ENhFDZ+%l?ihR~~`s8R)xmOoAFd*G5 zrEbc?VAjDh!wSkaTAyvM$Xw4l`y%zRUtO^|i3@MCgJ0q0+I@;XX&bwjBa10VJ1ZCM z%-L9R@*Ugdop8A7w2$SUyCJxh=~|94J-O7AK1J+5o13k&WEOVQ&z)8lLuWC^b{1Lw z*`IHx%sOYxh>N`LJY`l#b`O4PV3$TkzU`{I^e?yVufDn6pM3KIxheC~^;S-WtU`(0qc~x+ZrP<@0Te}u@dU#k~X^QUObyivayVlBJYvehxT>brtLiT6rlP=LC z&T13GvfrC#@Sk>2*(Grh>k1d29;M>y83ov*oPBvIak{m)J@AP5!A)&Yew#Pp-?#ANO5Y z?$FwIQE$8=A&n>opfuRNtYx1VL)M@AZ-t}`U?T60mx-0wz zh6dGX==@FUxv%Xz%0PF?4Tsppp3zravqhl6=jht%ohJn{OuRrV9+9oZHB0z-rAv~d18_1tp% zUh|IZ47YRmB5&#o3|&9B&OUVBk=@}A4v+Ju4y)7G`RAGs+0UD^BfOTw`+2tq)T!hA zaq77x_AfBh(Ba#>+b(qk=Z~+SQ`nE5H)mJ)3k(ga)71H7>bYh1PV?sM46o}jDev|R z3|&9B);?(7oZaCq9J2Cm53SSN`DD$9TF!g2BfO5oCwaFA)~V>&P#Jj_zUwn8+yMSE*k0J)8?_3r;_#NLB%}?3)nddM+&-wN1 z(vG|GBV2}Mx@5UzyZqvk<8s^Oj>}z_doK4~9=I4>a$WM;KfI}Mmd1@%9dQ>5ZYugp zi$<%?x(iQlDn5~l+*GOVLdi`bAR3aZ}M>8t0~Z;x3qPD#X$vH`OcSg;#Zo z0aDQzRsHcoZJlDEG-Qmb^?2beonnwQZj7qyc)?Dm7%VLsqZ%+?XrNQLNJV2+W5x@O zb&4Ukt-$X%5>Ug)V)jFN`9t8R}M`sfs+rE%`6 zC*y^FI)$6G$X)e{hcHm57$X&pSJn3rhUgSyr6J>0tvv)+ono9cZoI0ihcHT~aF-U1 zR}JtG#_AN~r6Ld27!Scir|^)5c&Mg&2wpnH1ZkXyYL18Ct5bMNi#$||J%rD6iiuLu z1XYBG;IC77Nkb;6c6bOgbqa53+yvDT4WPQ2NT--0E%H>oGC^3PQ%seLCaUUB5SHl_pGiX|s#;GF6gtJ{ z(zuDLt`mf{I>j_;(L~jN3Bm@Q!cQvlQjM7)Y|$zFr6FFbsS^aHPBC2?=cSr6K~U)w zGo(dcs>Kt8ojOH;ROGFSm>}%YDP~GTyj43U2>W!3S<*Of)sYFpA)R8jw8&d^c7kwJ zr}#oD@=>Ku5RU5!!JoJh!(hz^uR4>6xuh=S$^HMb1CD-KCRW~**{3u?V0RvI^3^~75^tydhD7R^?@;v<~XD~?D- zU#RN)2p9BTxgAk|qP;i+EngH#l(O7#&+^orBckYLqqAE838I3tYB%yY?;+!;Oj;i$};jMJVkJ7j~s;-j+yL81*(xN%40h5FV z>5B7G(cEln^r6ICw>nHbR_l=a(MPWz45>9MBJiQ&@|rbO>o4ato$gro)$og#gSMp! z5wm@UN5^NmO)?5y${K!S za@Cq$3}GUPc&9r0W|rF*Mxl3E!*5NlSIsWDVQ~`i9d-1xEVqS5L0r~whsib7?2;EI znkQ~^D!Ng&+Zv-VtgPX8Cf6Hgmxp0-^TeN>itdr^_N`HHD{J_@$@Qk$17 zm+D4PX?+DrdQz5DB;$`f54;HYVc?yBcSL?2)cjgJt@Z69Nl(ry5y|)?&jT+4ei(Qs z;2n`)2Q|MIT@6l2Ssy4h?In?Z#*JFvjp`9186V^c;l;oY0`CmGE51}WLhs92b|P80 zHoLWiKk_{ABH)LCcLLrK`E^k9YcbN_7^n5!s!kTkybMmsS^i2*X9*wV3E{=S4+8HD zyeqz3H^Odhc1KC?D_LtrGXBW(z>9z%2HpvHN95N*&9B8x+U)j{-bq=bL^A%!^T3OM z9|qnDct_;dLCvqlW7_P_lHSQ#DIytv!9Y>;%aSnTgi#bS&kwZ zf8=@KMZgaO?*zOf^6Q}H*Wv+f_D7NvSF#R?Wc-omffoTk47?NYj>xZrnqP}i+UyRJ z6G>TtA{l?=dEiCB4+HN6yd(1Kpyt=2Mw{&M%o(En8{4nrNz&j$p4r+ca z4l%@D&T6dGw3T@J8CPk2H>f*_WPFe(gck!p2)r}!uK04@2>!xZrnqP~N+UyS`vZO3uk&Hj`Jn$mmhksW-V%E z*|*3N+^Wc0Vtpz%C0b9^V^1Ywv)HFJ+UjPll9#u#Tq1*eiR_<=@;hZ+tmmyyqb&uA z3*U&QWd9CNTm zb!UpmT9s%mv^Ff3TW^Ui!`4T4Ny|;H>N3TWEw+})11iG26QdIfW6Y*~3&py^n0uy& zRbi*jL>miZa!n7-VU?z^O0isQo^mESW7?xcUH%la_~7Y1XL2mp*UMF=VS_CtC*(cu zPLZ32)uP9$3s#Crh}RKsSxb6X-N~%`$Rw|0c~)S4mU3r(&SbZo_bpWg1Ml=^E9nZan?TN{J zdw(o}xV;~q5x0MWXT8GmhpEmdBx^3`-y~4XZVbV&rVF}Zkr&& z1V2o;%sx#2i}Ydi-Do&)8V&ng#C}%8r!jmwz-I`27Q9FM(Ram!&oJRfObCCPbiCOb zI(ciS(s0yS>}N52EO+SulwY6^^Kdo2*H2B!XL=X%SvwgMe!zq;F~NulKVJ~i6P)P7 zB+SEbE{3nbXDxi{!l%@cd=B}LPi6x4^93fPW5Rw+7`56hc9b_xUMhya#c((HxHqBw zEbmM{DHF-3#Zm0%Gx(gvgoT*!bQQfoT4PM;)L)(8gAb#_a1@4{bRwSu5AyLjfc<#D zXCHhs4m6~NdkN&@I2se8FrgPF%)ZN7 zVnejVZLsf-VL$kshtCrD6u(P87e64MQ6tEw#a2w{gbCv@;X6zis9-J86(434hPPt) z1NiiX&xH2m6F8iFd?K))R`BVE389$qU?shPrU7e-YjN@dFr0+p@CLLWLtFA$JA{0q zR$)Jl;L`yp~1J?U3oG)zy9!D_K6AhOWMEv z6#sZvoUxbvGkSMpjLx@>Hp4$o+5X{xe^lZh``hdq&Hnk+tUi*)JX`Nu9xr{fy)J@T zeAoPjzD>mV!5Pl4Z=5yUXT^YVb~D*>``ZLMyyn{TyFY->xVHH|y3tMATW-x}{9AjM zPadV~+nf0B2UkqSh6i0mYoV4=S#^Kd%keS zf9=FRTZ6L7aD+}%sw``e)~6-S)&45nXREW{p)3RGi=^-AkSN8XmSvR$<%ywk`EoHXDaXUGu&`#p#(^8?=Xlq5Z2-_$!of1vVtMQEKv4ohRsl>eF&6wtc2y+i0!*?8+ zVaiT|2Le_QT>VBGFwKYw+)a#>nE3U?G`T^BL&?zFl??mNB*PB@?;-d&!PRctMiR3d zOfO>WVu*Q&MYofoA&m?dli{{81h<<-hC>NP;V>rQCNbNH$#5rTH5hkd4(%sH-{Z8y zgJhVXBlr|xPlD^twj~E{J&qBxTu;nRVw(F9BOxYW4jGP$CBy4v*h2$2o#1B#GZJ|& zI803K1X}bQF%y0!#@>f9-k%fZ^932MCBuTF1P=k61o#$%tK9;&5wrFfF<%kWBbAsA z8Duz|47bfB!@+@MxF7Iwg4F~w5>^>s5OV;`31S>i5L19fe<8!tOfpO`2Xom%4crlv{e*pX?!3~3L$$?dTF)>?zAx2M( z_X1)T5EJl}30cp)26G0pDRTBViTLf|x@;5wnPx`1-{3x=V(il3|8|$PshNuoK`51fK@{-t$y5 z<`|fdi5Yc?n5S5@6)|tzC&RDFu=xfu>>fgf!vQBTm@UmP#%w3XdowXnU_6K^xI%{h zYTBVAk@^P&p8@<0!7U_Y=udF9+g<}PKNGVpikNUPA;he`N`|+{u*WB4xHp&Ja=_69 zSLfO86fHW4n9w|8-lgni>>_6NJX&-;89Lq|!%=`g1^kd;(eqR@CMAuSCB*a?OU%$m z#Ec}S`F=8Vmy+Q@GEC7Cd=9V|!PQ?)14d0uU^+1+Sab?8O&*isax(NjN``$y$uJ4< zErNSKPc@|_o|xTW^u*X@5;K#S9zkSiC?LbLWVr1l!R;tB0hF8}N=-*eQ-9+wt?y>_ z>J0U2k!);V*;s?qtX!unSwjkb12EM<?5AuXOFCktGycl>fuwKd!!vEqykcwm~ zt*; z1MdX9Bl7E@=GWpOk?epr`yG$lDy{DZ zbtjQ*h#~fJ79ZpZ;l;oY0`CmGE51}WLUsqqiKMJRkt|BfA9)^l5%9ynI|1*A{5p7n zYtcz^A~~x-B-3cK`6JH*F9LoTcqiZ;kzWTjzZTm_WS6rXM6wmyZ2rjez>9z%2HpvH zN95N*jju)DE$RaznTH|vN|uLG^O3~U-?(4P2YEtxG4O-HI|J{EFV~Hr63Jq;*&j+| zSF-pc&jT+4ei(Qs;2n`)2Q|MIeMPcJZT1HeSyC2%!9Y>Vzx+j zLYwU1pF}YPQW`NzYc1CE%p=1)@!rdNy;u~@kgEqUIhFw@J_%xBEJr5 zel4CB$qs9?J4wo}WbsFy2VMmHFz`;mJ0iahYJM%6{fuEEnOLcb)@HjIjDnm# zCckqn$EuKD?_U*@$ks_pth!`<$Rx3)x7_OXliVC*{ocI6`oucjQW|akX{3u`N>#D^ zn}-nT~&}%^~#MvD`SAc-6eeRcycUD;7`8nXwikjWf)HmRPDlJ4aWbMe;snHTh@%ld zMI6eu*YF{-_Z^uFu4no@+u_i@g1vX>y8BUs>t%G?NJ7kT2yG!OhtL3mU=vzH2!rr+ zgIjEN%Ze~I`N0O7EE`6XeI39^z+8Y(HWWe&2(uyVvCXgv%^*y>ziGBGl-@XWDwwap zTpB`?RZYN5gy02Xm`!K|VGM*mwizy%@h*hn%vI(B*CAl+z%&JuT@Oq@2n7-J5|M*x za<(0Wo)A(XG_?tJEAD5gBMN)7^wkCP5tyA|W(=aq4sStd3tr{R~VJm^wDW1mQ7+eGpdk$BYUH_aP{3Gx{^v9Jr?UBPP2P%q=j!U_5QYGYHoq z^n;N831$>QNP^(7-Yr)3w44g40T=;{!xJ!Pz&u@tvg}Kf9gGkXAY6wa*o4OrVj&z| z$I9{%T=#&HIn!j{hhTPtSq7o34}@F@Q4suXGi<^G2%GM)vh0HbiU89G%%zWMvg$6F zl@OXi7-kc0Ls$%uY( z+Gf~<^z!=|U#&%1ri1YY^BI^KJ!!Io4#GGH10m%0fRF~^QwVKrGi<_j=4uC5-&8PS zFePhHWZh}9?^OuBA?P6Vwh3AYT_7B{%@DBy`p8z6BATp90@EIh0!$s7a0$Zu5N1MH z(G4>$KxhQP)i$FWbFF79%dW&^{|M$SFb-fmZNgayuR<`drk6guj3E>umVK(6)gd-5twizE` z#(oIjGgsM1aNPrDEtsZYvSYxgAOu2){E#MR?}4xd!YJDeo3NV|P@h#O%iUmBfoTI~ zMn{_LuoJ>k2(LoO6(B@Im=EEOg5GWh3AgJFY&gVS6zcUgQ1dQEGtD*ro}0#bN&CvDF}|t+j>89thvo=9Hgo&LzR{)YW5rRU3X2YJXdZgk%`Yq-z+q2ugk zj<_~_f1ALE%~;YL`?cG*Jbup%mc@i;YrboKW9#+}EUmwXE20`DRJIE&iE-?AFZZt) zu~l8($#?UaZ?R0OPrv`|j%?ePZ+gvJ-ag*K-l1yJfA?z7^RP0=%yPrNWH9}{c#fVM z#qY@t9`}9z`tj+}EUVE6UNqUiGGbq*{@lajz=stk$rAegSM5)}+V9}1QEx9bZ+P95 zwsrecR$n##{J%3|wbHh2DXRv#+^IeN*07HL$cPnPqU)Wb;v3VbOv7SpRFMD1h*j_T zE36uF3$N8qrmFbU%KrC888?c1e>kUf*xkphOfRxd@t=>#e==f+Z)L{}Rt;5VbyxcR zPiO5X4O#4niu{4<>s~A)XuK#Z)sj5jke}BhJOEY^O`4bpZE7PFa1B7 zSNdOXUT&hxS+$j#){>@v#zCy~t?hcWr=xT|B9&E$%V0J(^j*8RM6!XaKObmt3UKet z_(QAMlpVfD*{t}^P5g{Y6D};(`rbbEjn+3pU6-*2r#YXGWWkTZbP53!W>NTpLJ);H z6hbJ>qY%nM^=9Jxk*)p`vrV;3WTxJ&$+v|c?O_@1p&)|x@If5yVF=*M1h@1exV>!? zaNFTUOplSo>`fx(V`8=m#MJU9!(C*!b~70&0gnfKg~8SD6L6Rq$F0PqU{P;kLX*ib zgbXvB$S@y`idB+o-+7T*snO#4JxEW*#xk-3Tj&;Q%rm^*zB2j?)fz6I`8VpINl%C}Ils z5i^9C_NroNL$uN%$ zxA_wM6X5v-SLeAD%xgZ3$(Tw^r!UBG1u>3C$*RiRtl(nCaPMc!UhMg_7aDAll(CfPWxZK` zmGKoZBZ7&^C+5&;VoslUVm%`5(l@=!h=Dr}nv85cArBWeF7{=MOk&mW{~ScJuaEk!%NdX$Kh#$^8J_%gEg^k=zULN*3B~ z_4_oOLpyk#(w%aam^LTrm1@&QFW#nCdVdl#Z2mPFZUWp0@Q)0xexKA{#CWeD#ssDf zF@fjFa0?m6HzdQYcgb)9;MD{#m`kg7d;YN*GyNVhbBNitj+lF3`V(V!nGD}j(+=B` z;q?0iM*!YPaP<-GM@)Q2VtPFwWV)S`r*pe#D z`#Um>0=xzA4TAj%u6ElNLrg6x8SWxx?M-5o#Pk?X*xpBEIFSsu9UwRya2&zaUoAAB zm=IzzVu{HIlSqu?&tzyv-#7kqG7No8@J7IK1kVm-t5>`Am`Tjg0%8sl(>#HgG-3j> z2usN%!zEbydi+~>n-U)a|f;Ox9BhLdb0)7~HC*U2C zUk5e67CVV#LkzK(vl=TkZ6%(5##LJ14Qf8f6T*vu9|YbRcvpP6ZUk3D&_;EXpRt2d z!ykDbcoFc!z&io&i2ORJ`L*a}2->QS@;6RbYWO4111|!87OgDc^-HX@Wa460q=siZ-?(4vyG4CKB=a!DUdi%MYWN^e2rmYH5O`byd zi+~>n-U)a|9z%2HpvHN95PR3tWr-#?eZRyTQ0w-IqV|Jn$mmhka@5;}-P-{>bydi+~>n-U)a| z3qr|Oct z_=NRdq9rr2B8DEbb1W%|Cb{LI*t|j>ZTU%FRc0*}o1+rVro@Gpt(n$}L~ASSgP+9a z9BZj{)~!TqwACUnPcM*J%j;QpmxHpPc6QSuq(x!N3SnYBpV&6<48QY4;VweZ8} zE@@(Ug{R!w#hO}Wj$bG~l;c)nnrRBlNQ_=r7*lL|SQ&OIF?xGpOquCnnfY1bLb3U9 zj$1*uk|~c$JgxO+2k$F9k@)Q1VTpX^co1)(j31vX&`gxW<($K6}g8~1%3%sXJ(ff>CRE58Dv>Jshs zUMpH|v>Za!Q+kQV5O&*yFbL&Ola4QFMXs7sFnTZ}z!(=|bm(@;31eDU?gDHeFfnGga`=TZNirj?m$=!q1b_3*U6Y`C|sRn zSUD5SEHF`EoI)X_L-2;+V-uth(ja^ap@l>Aq`udmQa#oJb5(+suY&0T=BM{*<*OkO zu0UuHA>1a+g>Vr{2r}r{2VKzGZL4B;yXw;@Puf-iH`Um#Z}U#u(va|KKbFiw*o z1VcClA+rfB=i~!nHiZ2UqMER>oQVPo2Xoa6D^CZr8O>FcHG%5Wa>`%O-e2m<(Ya zgr6F-vh;!LfyT6Q&;+bJ5zJ&Tvu%P0gz*qYL+E4^#zPnbq5lO|mhLE^kHMrhB3FBN ztULltM+lp2!Z--SAiM{`-6o8MFc`v{%r$5XTweoYYDliJZdkb=n4Xz@K zEIWYN3T6Zt<8Z9p7Q%7}b#1~h2rVImLP%~v%Nd8V0{Y@S%5o?cXa;5~7zvnlLm)JU zFa|<*o8SVW0fYe%it97iCo6U+cJ1?BQC_u4o*{j6p-VGMe184myX@&-?Z>VZ7dXGZ z@%!_wGWLc#ye1yj$)+}idVLMlyo=FHbB({}rm>5Zb(_#lNlsi3s zW*eB9-X>!FU~<((5a07Va5Wmf8`WrOWxLuX%<1g47oYx{#m?`hx5$aEJKS8O)qgYn zUtgiTL+u#L@X_S-MDil<^hd7sH|%FAJzthP$U~mdw)@6e!+rdQj@0#CeqTImJ`g^z{s!>8^yTFndN7239zhcBzb$KV>&BxDT znN**C|JxnewlClGnzy`tyoJ3()ujLK)t={JWssTWhJDFk`hD>nJvWLUVhA4heg69K z>Cr5!(Fa~M*}pPkU#9-t!{WdV6(-3N`u$h!Prlmk;Hpt?FEwv?-IUfu`IOaHjX(eI zj99I-ZClE!K`wV{Pro&+qdziYMVIJ$=cxF`G%C}u*cuh&zcFIfd;SWm21DVs+R0QE ze_Gl9-YBDOaqkc3ln%T5n3d^8)+zq;5&2I>?C`DZn8B){%B=26zyIm1{fQAf#g-1s zZd!)#qcSa5|NBGx=SJ-CHJC!xkSK0Cm45&D^w-FU&dzsJGg~DkP??H7|EP`B)QBCv zw!y3#idplb-@n|vmYdqymHjQvYoyWEyvES)Uv6IW&?qebUCZG zQqx+})XzAGmA=<&CLGd3p@iQ)+aAB#|H#K%* zgu1SGle!|=z|7AF8l2|%jx;z`yM5fPgQV%lA`0Cp^q|m_LN5xvDSS+!4+UomeOX}U zT3=?H(UNTQr!m_Ad1q$o7{PYA!!C~YFo^aLdYSg{t{1^=37+jo@Or=-t6zzj&crnD zKuj8#Z;46SM21Vqu*X<39D0S|k$^uU*xjEQR=-cYCoxTuiJ4A}w<9qcVgl4;7#K;0 zCD`ETr1MWufKiqbFc#IaEPK*J}4q~?TAZGV;GSriyT@)G41RMl7g&8suRsr{j zIrJ?tDq`a25tDG07R?~TjJ`y!oO4Chr$zS?QwnAmF&X2D zIWUVB^&~^b17sKoI2N#u41XlJ+AZZEF*}Lrah#ZodSbGOX+DXtO|!{x9vP;@5_|{n zX@aZsYyz`{n7|{%G)|x${zS~ypUJR^4>R^F25VMDv z_!46DV16OSdm&*_!DLuMh6QH`egN1EIENWly9K;Pds};!m}Vzw(bp+^dvDXC?@eOZ zws0~GpF@W40{)R;FM=5ftBmEu ztKCw+Ag1{`V$#5TLQKjfGJI7{J8VOSL+_K}8o(O~b`P;72UhU{F-;y2vzHj}EyQSu z3GgDrz+^I%l3{!ozy^XZ0#*`SeL(hM(O$$Dz}zNg+qcB*mXKj68QNVV!-s(T1I}fJ zjD%G{I5CG(iE%hZi@Fe#kVlI)M>F3|}}}#CXRNlL_WDF$L*lSevl;&xoAxm<-nejw9G7 zlnhe{u6FBCK+N~VY&%ZOPhc{LS({0QUy)&tIb_&@UL^H0U`ozdgVU9)Axce0NmGC0 zu2ADHt?$jNzMIvnGt{e@+V?krmPsaS`Kf4!#~T)P(wQK||VajJ`PyZ5JXq>#M`6r2u@%q)@DGkyJDEH)J!(SMym7ujr@`4ffoTk47?NYj>xZr znqQ0Tzc1N;T>kdIJNe)r{C76b(y#uX30@(*LZ1KMRJ<5?G5r6d7?QF+P-@ysBK?dT zwZ0qGBSbP+gA*U*3E{=S4+8HDyeqy`H^LiA%|Js?gt~>Fkw5Z0@FL)cfp-Gl5&3mc z^J_6q>$_E*ERuN{oRYKrm730yNPiL`CBf8=@KMZgaO?*zOf z^6Q}H*J2Z;W{4qZgWAW>$RBwgcoFc!z&io&i2ORJ`L#GfsqrubZBhI98~G#811|!8 z7en$St^T3OM9|qnDct_;dLCvqlP^HG#5EQA-^f&TH zo(En8{4nrNz&j$p4r+ca+AB4K4aNv{Uq2&%!9Y>;%KGD-C*3T z?(1*lk30{&2>4;(oq%^lejU{OT69usMi`76)fzt|f8=@KMZgaO?*zOf^6Q}H*W!My z?-um|k<7yodnL<5srg9a>2KtNJR!Uo_(9;Efp^81>P9ebRcri>K}wB}fj{y*@FL)c zfp-Gl5&3oS0@vaO^#VU*OQmL*!N?zZ9(WP(!@xTM?}+?5sQI}L!U$;3)cv^Lw#VC2L92RX5>RhuqZ@8no> zT`ae9s&-q;4_o(|OL8nztWU*elRVO5mY2({2C+Fmu_7~Z;bm*G z)skolwm$etUM04sSg*&)O=3%d-0Eh%AT~!OnmnzgR&zs3mATc^E}1K=RWj@2Xv+b4 zRkYPO#e7e0DwCfu9hR51IxfC1w#b!<=3HynhMOw{>-|>C=P$FYkbk4NQngzCjq8=F zWcfGEEd7g5SgV39kE|u)icI-8SF9y&m6zn!dVMYFU95$PtE?URo2}-QqB41LqA4@6 zBDqyBx!5tsEx#%T+l^Vo*yj#@W&}~(}>2F%FHRvpQPtJ zX?5mw${FkXaSx&jaSP&F#AS$!5T%HLi2fx>$5-gEJr68_xP3gH5x2YJ8FBkKJR@!&i)X~` zWAKc)-HmOpAGTNUjJEdxF&j~bn1Xl#@igLb#6yUC5LJjoDSPP*$ge#YY^mS_%(g!&YrWTm1tFf{Zn0N?3wWZ~*u7dCp zgzq4P+XMxK4iGjoS0@Er*MaE-CTJyAZVe_3LVg=^4O#)=eF#Ai4%md{5Z)_FIv(C8 zCzz$LDVT|1+`-r{!^#aI42RIrCVUN{9)yn}q_w8y?870{Wv&NWldI+}Fm1ss028|e zE7ykbE`+`|VKIbPA-o2`)QVhVo_ z6Ba>u20;s%x{&WG>_!d?igZNgU&3=pTfa!Yv3>AxIopS?b~H1I9^;mD9j{3Z{ik zm3ITA(ZsgEM~T5CP#62>0Hjg?SfEfYCI2FQD2yZ~BYZInG2!l|1fxbj?Q&yG>Q9#F<(#q>5W96^F+y*1D z3BC}d5KWP&ngP8~6r^dA0)d>*1A^1TEw+S8)CO{a^T%A1NIvPwTFhS$7 z@)$7vA>=nA*C2NYBOy3JIA9aTK^V>oD7+EMau}HRz_^34AB&X-LwFNHLz^%Lf*3;i zdHN`64QV-hHzu5GwY0;ky`i$Z#ltK!Wx|sN{^e=L(XAEERqS68E^RFFnuf!7y(it7Db+S$EZc|&xnb!XLI&p#V^^JL#qC;h`x%PCq`Or<%_o-QZB+WMPUAAh# zI6HD3KbUx31h^UvD}u+p`DlHko8%<+eBtT8S**eOO7@NmmoHBLC5d9ll)wtQv~Ta(|@X|8&;=%!r+xs7B*V?e>(iGQF4k z?+@*t8?nRZvao93Iy>nrk2O9SQYGpS6gCjC(xsi_e=d@FyTYGBRl z^xx6E-ZQT6k@fd9FZDl~7ybU_=9OyRu!G9++2ZnvYuzOkGXnil8>!#GK+XV0u zf$JE^{I$N!ZRUc5Y({*4JsZntMT^9NZ-XyZP2aB&@F#s03$fCzMve@<^@GZcv5MKRi1sH3ROk+|0v zE_}(ty9-$qM3O}lE#WPu6W;jPb1ydLjKTNm0DlC$4ERFA;YI1RU>A#NY}){` zSi6J7>8WHfIDjlZjHgY%=S{f%Axhm!;4XwS3K@%EO=I3eX)JIzS?I5mXoAHuSPX^5 z2V@by3HYbL_W-}~+>2R^+Dl_Y(`fA2OxndASj>aPC)h3Aq1rFZv=WG}e3ujinqTi#IaJqG2FeY=Ff`SbUF7>wwP&e%$tIwztgqg2oOd z&{$|DStP@v02cFMk%(Q~CX0+Yz)u3tB78&;Tk(0u3>XWiu^87A^djHGLXTZMCW~#M zWU*F57KUuHs1;1Og7D`V>x;2Hu+YPz0J|t73-5(w5qO3yCghNX2KWQurNGUEGm439 z7q3sEbiPjhJ!;X{ZN8MmQRm3w;%%ZNb7&U>PZHi9cq8C-pBDpJw4kwgdm77FK^BhZ z$)eX?vgkCIEL5-<2a8U?n*d)8{37Ai8QZp&#_TT9*xq|&aSs+1uviR>LD)rGve>o( zcoOjYwpX*gWdX*TJfN|t5ZZ-@nqDLp7GBteBUyMyl0`u>Su`;a-a%qwlZ4E?h{=*hLnHt`k+7 zM;5E+(Jn>-{|I;_@R85GDEr&7i!n5|?R&CVdy_1tKO&34QnJ_wi;1v^1wIk@LBbhj zYhFGy<{e98f$3zS&nM9Yi`poe<*>MbT}%TW2mBWB$Irc(#i$G#8(KhP$3kfrpTQy? z7FpOuFj+J|Nfx7!ouSxHcPfSmbzPBcpuy>KR&Awbhf330(llPu)X%sy)VNgZn|k$M z0j4tPH?#O4PssBU`X4HWJJ!$gCx^z?xsl&BXVs1t_5Cg_X?XdyuqIxeTdwkZIwmVg z+jVLCT9=kQ`1nNh+q;@L8@fMy^=N61C3O-D&ne6bqjyvP^D(9 zfj{y*@FL)cfp-Gl5&3mc^J~#5DeD8JroAN6&$v1pF}YPQW`NzYc1CElyBsJPbiw)IR=3{>byd zi+~>n-U)a|1MdX9Bl7Fu1+K+Nb*8^DRH^Yb1o20n2VMmHFz`;mJ0iah zYJ4pkBh-EUjP^>+U;}^TdEiCB4+HN6yd(1Kpyt$^pLKqT`p#9qnrP-;Gsc={XpAWsM{ z27VBDXW(7&rMeM}Tht5ujgyrcPXmACdEiCB4+HN6yd(1K;03NlK~lC!ZA!{A`x(PT zGOb%f+^pR!G1jV9R>uVFOJY6iGr7fN-R*C+$g50N%M@#-+Xx;#h2=>>?Gkfh zEqP^WSf$~~rQpLc!S-@XX=tTk%;M4z7MGL;vADE!7K`Df(<|?1YlaXOZ?Jv8 zfNOgwu19o3tcQ5*JB%Z`A=X2@wj1M!Ziw}EyTzVfeI_S0y!4|=1B)FH+ak6^Y>wCj z@m)lF#J3UOKzt3+QgJ_{IG47!KAIMCL#&5*Z9A4mbVIC%cuj?IL^s5Gh}XWw__u6( zbFsZ2D`UiYI0 z*UPvbL4sft-hto*;V6WdL74G2gbolkM7YIfzgZE+CNBe1Hjo(KI$&CW@rNL@3AG_K zgfPT5V*qB8JVrr9wA=#4|)1k()6FfgiDz`O#XVm&*o8o`_ZqgzKW+8d1TV+e;K z9EWhinI`)_f)E2?i*1H;e|6}td-TEUfKlaw`4-GfFf01dWYq%*n<2PDsACiEL0ALf zL)(mxnd=I;dVWlkvu}f00>-?S_L|-s!Y>fMf{+ct(CO{a=T(fV&bqJWU9>n;jff)hj0|+vka2>*6 z2(@i9x?{#Q2z^-r#dJpjeGKN-8hX)TU{qQ#T_LC;ToTb_)fEUGAt-G#Y{F#-t*I=# z!PNmwAehK*G&%bMn8pxBL1=0deu7{J!O=FOD`uQy1=MT}%JLkT*TB3ACbtVQ4v7#d z@6t)RvzlIFhD|sPp$Nh`2)Ry}p<%9vR--IWfyo841x#-+z9%8%K#)Q>;YgEx6Ck8R z@UYErWCe8NF3J*&>KGU;m=D3M=uDGUMKr6ab{AXl$Z)pOrqpmBFSMwML8$U3^C*|7>vU>%$UP( zt?B!HzlXiQ`(OLJum838d#x_-tjGO)p3ieX_qy-Ty~cIDGr&#Bgqma`K{Da|W8#Kn zVy$E%@W%=zctxA6(ULuf3l$g_GB}2+q)yB6b5J__uwJ7m}L1=Bi+CU~ye zf)UnKB?NzVp9J?)=65<9XN`eUeFzgJ?U$GT(`MH}A$-PSj9di2;oorT2kWqzl(~@n z5MgR#{mPmC$*CWKS!)G{^g5?DC{>iR$4R9z;#I}1B>B(FW5`ELn$~WGgJ$En*HY%p z%_=yG=gBMgZ%b0&q6~-iKY~YfHl7;;oBAwl96!|lJ4EoV*H?U{ys8ig^VcBP|E@=kB81N{ng8EA+8=RP)WUCA9z(^*wIbJFkI^4Qurti0Lo~&dObi@VjPyeyzyl9Egf)v{q*hs4@7XT?B3lE zXM;#|avyU2$vpbch~T6n-7R$>C6yy-DmeL53HdLG;OxB~iDUzlA{~WX|35SPUlZl* z>2|kl>kog&K++UeieC)&Ki1PiYz~|ayeSWRVa_(_xQ)U9|tz z(f*KwwZ%v_kVqPDk?Vh6{Xazn>k4&$$t%pA^GKQ!GygLg`B@^k_;$C#+0YG(7jpf> z+yAb3&7T0}2meRJ>;AVN;`Io*{@dc!BidK@KOlcK<`#h9~VLP_Nu#0X7yE8l5?pN8C ze?)+Z5@0zDg!#KOVOWmAS9rwbBNXG62!*s00+)G-I30?>VH7+G+crvU_aziH5-(g3 zidb!gA}kg`IaMPRWfF=r68LKgycL1ND0mX4{UEV*Nxblo#6lODJRgTpe62xH{?5pb z?jM+n88z)BKE8Vo-2Vj{W#i>Q=Wf?*p4UwUnE|z5ej(- zp)e~zC_c0x6r&P&palL7fx{?x5~hul*gi`r*b*-xTTO{xi z34BTd7a?#77ZT1HNP=k3K=@+=5ek_SWb$bnLg8=$q1gEvaeB>31in}Tmy*DP5IBtb zAzm_w?L-J-8z@64mVZYk6)qwakrE1X3B^W<)-993Z%W|rCGd_vxL}Iv4~Q*TVr!64 z3`-~iBow?7<9wU?I>k*2tJqXI*6WMXk8w9>y0*{oyO(pQBe{dl; z&;qf^KSOM0Ul5ADeF()?FN7jNLUBYwkuGuCS^`g(z`y=D+K*EBr%qUnVM&XB{8wKE8kcaWKC9$%V3klQXRg74FcCX0A2ZS}ORMe(cDB60Y>NQ48kpTdS|n z@wuDtkN*7chydC^|KXA2-zk%Sv&zur=(F74KmDSqh(5ZYk1qeis<^>J4nO#~%JyFV z%`M*8ZjDdh_QVvRMl>L3GN6TkDg&yDf2xjPy2X2cx5meB>tYI2Jfa;3?^M~|$w!T7 zK+t4B3jtLIR2BbR9bvOaG=4C<$~G#$a*OxzZjH)s_?QCJhz0~r2DA`RWk6N&Pt_4N zpML($b&;KFCu3Nm# zx-&n1+ZIy*|F49OgRxb%ck@vr8W1!Y&_Y0!0ae96S4Xhx&Wz4y;|Kj>3eX`M2Q&%L zVnCGuRYbHM{Crz9>UN9BS8yEsEv5h+qH#cz04)Yo2~b5u+riJbMQpd*y?h1y;NF-5 zbcn_QO#-wSP$fVW5p4%Q-xl|GyWPou;5fKGrT`tHaX^y*Ee2ExP(?)B!OyqFM0aXH25z%(= z^KH?p+buHR20wT-rT`tHaX^y*Ee2ExP(?)B!Oyovvu?M$`OS`l+hYpQAsPoX3D9Cd zl>k*lv>p6>TeR(Vi_UMx4?-~o=n#zqngnPuph|!$BH9jqzAc(`4@TtcISwv}DL{v4 z9MB{{ivd*vR1wj3@bhi)aQEQ7d_DZ2c}xL1MB{)a0a^^G5}=BRwu7HBR!ck&Ay z2Q^{}&>F&aYG^;oi$KZ|5<0Ob&b&kL5*+G{vGUMLk&(p+@My!W9)qvu?)v z9zR=JrHHG!ON#f^=;&Z=rV6rI%FJRBRW!~PZ;xfQWz`qX8lGgA*Jlw6qa|)UDSnh- zQQ!8_aL?5ki~4{V-y7Xs_-LG6efbu)X87;1;i{tXwmegDv%9A7flIuH*h%|7Z)r6v zrWOYC*2jk9#^tM-qM_z2@dFo;;iRiJi8nq$>xfRIE(voI4PAQtD1qjpJt`mOWS7YE z?Oqof?YxQlus7O;=-b(>AsW8@jo8tqQ!g0cxruDtIXG~1BA>KLzPfNP;*dap)Jq#a z20R+h!-@0i_2-bny74c=sf1O+BA4GsL!xg2o{ytd;nVN5_*|9jQe5~b+QsfE61#1& z;fmMlC)?mvn1$3$v8->@l`>9-dq#b`J+yI7#W%V;q6wkhIO5b8NukNHV z2$D4As{}(K?#%2f=G=|)4|}?1uZv@?3lWS~<<$#@M(lCKoef#_0s5H4;S%>m-Y60r z?|;SbPn|0sc%WITIYkm&;!Zr~?I^R}iYXKX7^(7?${-t56&CggMm>slkMj3SMq6`T zwG~-T+J=+owVAv)#dps!(@pH)uRgC?&^r= z;qH%d=f}FjeizAXr99^8kM4}s+{)ZNI$R0gw02qMl-Z=>U24ECA+PH_hG-yYw3xg! zy>$n-j2&%nUKCZ9K=a(eZK^4+Gu79$IA-`kG*W4BMmVO_HEIJ=ds!iv09N#O(tME( z#cGwG**+7BJbwjW_i=c+=tW>Oj^5&o9GlV3Y`f@oMyl4K}`Gm}#(K@!p)X7iL3GSQtlR=bCeni?-2Ic#c$63^6B3{>2 z<;%z6WjNtIO^Q{mh4%cSr14wuZpx)~tn0sX%cC<4<;L-SJhNdMX{M+=nz^plA}id3 z(EJY6GUQuUjczRVpef>P#3Dx$kx>VaL#Tf5Dc(YNSp)B|gxZ1+bu3$lxdoyvV*-|S z0r5<4K0DmQmuAS%X0vGZoNr^b%wX|kIA&^cv~o42Qq(nRoyEiV9pC=cjwE2c(Hbjb z5nTI5OSg^j@72Dc-VzS;N+ugW;qLeqgChNLw&GfS&9dn7VnIoLrQXr0j6}`ocAgbq zPqVB%dXS_d&c4gCn%n^=$}n$jz-oSn>B(BxA>X;t(@ZE?(}FKdFFr_kAgDAY4e~oq znzw?~ma)-r0emJBMKIRg*~Rh`3{|!>o3{nqQ6K#l-`n+h?}DPjr|;mCiFkVm1?*_m zbZY#~0#VnTsqvo5OcHBvXLES9qM=AAz`P;yq(;AumA5ln##jk7*)~=tMwT#m!i3@- zw$+}7ds^HwR+%4PAlgC8YZmYvMs;o%_w#vQ#|RuHOn`7etf|Q~r@+&Kf&!5~mmf3q zZH%SVFK?nb^oodv?)F1=Mk+rnj1uDe9^l25EO#A6)<`yi+l&_v7jX894SAI02EMI66tdhx#=&w;6g1VduSt zzCAcYf`5ICA%{O2^W1g*Uvn_c4@rNf+bFA`p1A`l>R2;IS1lNd%t3_}@~PS|aS{ zkJho=H_H3*ipKlpol7&R2az&xzX7M$!^(p3`e<8>dm>yxIOYW*yOQ(bFFB}n4e!wB zL0`cyJU8E-0q4H$c%@u2D;rbOg`euF%%q6n?YQZuuzF#gC`N#+$>FMWqc)4F_j{HILB9)7R(JcDbRDeq zhTZ*3sV0kIePfMe61aF;ZSrJ|Ek>2Z`#O=O>Fxp_ewC;N-p@~{;P=-;^QEmo!eb!j zu?MQyKZ4wv8xGgFZ|!JYfrvlYgTuArB^BPdiMZ0Qqb`}MS)CF+QCoqe#m&-eB)I+2 z;o`rG(}X@8r!3BG*y|9I##F~pRwYrm^%IPcC5UD!&R6QMbuP6&H@~P*uQQy+9Z1C) z3Mgr!9g)@piOfvC1(U#QvG&scBe6y)6Kx0SW2~)&niEJ;JnU<>r3S1v z@D>hVLlR4`{6}J`*CL7aAdyOZ;~{AHi!`#BaRI~Xn6@LwwwsUb{9ArFS9>si)B~PT zYZK2oIUfBWks_Wwfx{W<$K%D91m3i;6l#&+R3NLg_@c&_jE(1DU1D-RQ2B-xiD=*w*r>`P`F*fSdqvtK`dey7Uv(Sko@w+BDZVHD<{=AZS_J^h8 z87a{o1{nQqL1Cno{`*B;%Ip|eRB&Q)O>KD5Ug7X|ahG-BYC`_}+NmT?;e6cSGeeCs z)0En7(oRu9^z_3PX2ZR4b`F~EGszY=@>a)5Bl?&}Yah$%($6Y`<>_RIW_XbszvG8Q zif&KUu!kNBx?DTqi0~L+V-J9Tk%cTZP5PF!ZB*IKzUdn2W;L;?`jC5PxBr96E=O88VYmD82 zgSri@XC%W0+5=HL+zpoZWhH-4CHZb+t|lBG8y)PMdMt|0;*^Q_pFemsDu$4}8z~`% zFAqGN2YXHVQCzDFfckGe|Uq< zVa+TyFF0)DW=T+FgUC z%OAes!Y=&zT2uJ(#(J8Grn8^jEMJ;Kz$HHgmP#p!{J?4xS7@p}?nyH8a5-67p&1kY|)g?}5K-tCeyk)S`f=eBRo)PN?lXyBD{df(15A7j1$uz6%Yr0q zC?{#2ohYMFA9nDppBdUUkB0EMbcNN@KAXS4xKyIn1o|+f#rIvsAQ{0Kc zr5?$#dR^aAScB|G7@~(4wR5U5XplH>fITO2ck+7OJ@qM}=Eptz9v@y2_o?UJ-sJ7N z@9R@;oBMk9B_3WAC*}JrBIMtDIjrQa)@c@0m=dA0Y~-nN>ye5FQog@tRCyNh$oPuX zJhfjRJeInlrji=*%=p&_DG^D=cck{Ksr>RFTk4~lN?Js^@h=aOo<%%14wc%d_UnUG zsT8%O)QD8$Umv7IJT;D$I-{2K%LBh{42UP0%;B&ZA0sQu$UD8OFb0@?JKQ zY20d6Q6S}Ot;A95v<)gui}*z&@rV*8HA2y(o*Dml%#@%9G^l8lL#N|=<0|Askf>zkKvwidiB*jo6qaBI=aqOHX*i`h#}ok`A@odcb( zIA3+X<{ac4>>T2J-T8)dsPj$dTVNQC+~LLb0gUWGGL78nrR@t~?Z8MHxy#Gb7qGVj zV`$`VuN+_Cq8%7VBeT4?zCfTIm_Q@?Q!+kyEs@}O6aKQL?u7SYHYFRni@9S4@s z$U|P*0l*?0_?|`{_VNq>lyKlj8hOMkCjijGfz>qfs24W?Fv5ZLG&0vqn*d;OU?Yt@ z=H*EM>~SE2MjrRdApjR~U<-{r;l(8YfjF?8MxON2CIVy}*hM4rygZ3O0uJn@k@;RZ zMBoJu9H5b>ytqW51P2b&$O12I5>Sr=$7p1smnR8m$ALT=S>%;N0)}y*kVY1JaY?}R zQ{Z$uc^agB8CY}*oJ}WBhdeI>N~geibn*-+=Q5ym3Y4LfXF}Y|fYB*%5uH2>(hdZ$ zr@&=&@@&X65U@W5uB4NHgK`3ai>E+U6R+#JvKPoC3AzFd8lYqk?x&L%Lpj#~Eql<6PF@0WuK`B( zAeK&E3TX!cSbNZlPF@Ci1_Ac=;Bh*6Ig}FwT(k#m>0~*G8w3Q}gZ6at3P?K`Alrj@ zI(a4J84M)YgJ5`S3%k#K)pTaMJEH0X9&=45Bk!{ ztD&3_VAvic(8-DrHw2h|8Vsb9*Ff6WfkmgmAUatI^1Kcxod$2v$!npU>wwm2FpN%C zhPc-OqthUnPF8`mZvfcSU?iQq4)VMK*q;Vt=;ZZK&JEz=X)umXR)x4XfWXsW0-d}8 z(hdd4r@<$5@11`t z^Cr-K8qBAYHK3fE!0>6Xh)&joxHp064qyqL{5zz53s~d;zNeG5AkSNXk^}gWPTm6L z+yb;5z-l^qE5yA87&(CTbh0+29R^?>z(zWG8{`=V*gJp>I(a*k69!y#09)u}9f%tS z1Ui82bn*^J`!+y!0K4eqosj2kAi)9brIU4`oZG+)2XKH+)`PgWff5IBm`>J*w8MdV z2XKr|Hh?_Cfp!OwM<*LXIpM&t11O}EF%UN#nC=KpXOMS6+7ZAaM{qWSYy^2m07{PF zJOc2ahwzN1>cZ z;36KhWst2QZX^(h2kjZ;V~}Wl`2cz=sU1Gt?Oa5S+kA46F;J5(|Vmfk_PP8OSjfh;ss;F|cQ$q*x%s2~1~T zU7^lcpvVb)&cL37R2~4;PGAlLdmeIp0JJ!PuNhc3DCq$(-~<*ju5mzGYx9 zKq?Ob8E5bv1A7s2d&WFmndKFtA>b zV;o@X4AL1`2ug|r&O3wO7+7zpGY%j)gKZ3~52O+gggJwq46HBY7!SlbgFOtaACwdi zWH^KU46HxY84naWgF_5#0Hi_zs+~bD151D$DL{)eILW{gp(F}0;0y{FSQ6Ap0ff%r zv?lCjNaYbA;{wiV!UjT)j{v|0oZE!G0wp~H)Lp>&P1vhY=Oe(t1zgyKy#}cy0A?=W z(k5&W)n>wERt-vD}FsV`*C#)QAQIO$M|OP-Q?>@lVwe zj=rfoAa|nIc$2Nm6X^`kgh-8?&q1gW4G5YHXd$4=fU4r3t0N>zpZ81%)5xh0+Ww|) zuUu1)v4X7&YD5EqCIeass4}3c_^0X!3p^8M+V<>{)2$0ahiDwoBtVM+RRUBI(RT3j zZSl5eg0gMTJ~`dbLFf>T1DXVAF`!C-Dk9nre!eZ5dnPQg?b$7-TOWiD(Kw(@%7|Xq>3qprz z9MB{{ivd*vR1wj3@bhgk(=%a{ZO;L@H=l#hAsPoX3D9Cdl>k*lv>p6>TXgeGP_XUU zEBB^82pytvK$8G122=@9MMT@d&$q=v&jdZ&9&@=j4MFG-jRTqlXfdElfGQ%|4t~BZ zuJ%lTzlhmL&aW;A9inkSlK?FSR0&W;MBBm7x5aqR1XbIf{c?VvgU}%w2Q&%LVnCGu zRYbHM{Cr!q^GuMl?b##eS0989(Kw(SRlnxIdgUUTJ~JvA|66NSBJHxYe4(3XaU+R2K~+7*Vhl3(7R9jbj|*WY@$S zQLh|qyt`T$O(_oG@IrB;hLfs>{N#yt%0 zn@K!gT-#RFNrCxL%#r}2>SWbCL+X-%?pYM(JVTEw?#y|`U9*_5i;%!gX^O1vMo6?k9a>?rZ(%wk@=!hv1vn8k!$ET30QQk{%n5+F7oGEkiq z#kKjH4+-^3CLXp;!3%blB;yK|1NgI@C%HGhuUk;tmQskrw}*S>ViTwMA-8E5aow3W zg9VDZ)nAKp`;S!)X5h|S6xmD?SqAO1%J44{A_Ltvcj#mo4Zh0BS%fLISkJ?mL zo#@Vsipi~VSKsRT56gZMDC#BgpZ|}s5nX?B+rI(-Loh07n5AQ>0iuLwQC$U!p=Xb` zo>=}hyD)ciI^Ngy__4~7ui4L|x-#(g>XkN?r6;2DqJnZayQ@pP{@(^N*A^+ij^cEA z&!vqN32wKa_?ks}mWme&Osv$|-k2ke*~Pi(>3D+c@#B^Jui4pAV;Ok7I@_l5(}}Nn zQIWan?&_Odk26mk{rZ0!SiHv%yr9mk4{eyqDv|smc(O~ z<6pC1L=9x%9n_m`DnFcfl@}G3d(K^5!IjZ^V*A(ZqTF-o|F?kwH@UalP83Hol_XN} zf!R315{t^oqRwy;FPt=-Oy!li69qSM!tKJz0@7F-M$oQ98fM`HBAmEdR^@#b@j9iI zx|s6<(=6`Gql&)EipMoc!g99*`6h#Ay z;{FG)r2{A8dsF#ku(g9CZ|sqDSj4LvpVDWn2Co0yfhq1 zC@aekCyrAEpuuNrv8F!!@(kp^7rzAk#4E(a#9|RVp(7qr7Mf^|Qi?GTypc2cil+v} zRB?Twx4pQdK;$++ntH$#w>#qm@T71!tAHu$(-d{Vryl3kGni=fA55G0_Lm7NtC(0z5XMjOlRv_^zx`@3G3Gz`VB(t&C*Qr*gIUNb z_N^t1#!qz{OjQ4MqL!2Y*B>E;IfbE4kcb?ypjABJFV5o#nZ*;NDUl(wm|B|$voJlF zuz!SF!c_d!put3o|6swyH*Zcp2d0Pp^RFdL{B>e#;@bo~0k41^BGnSa@lzs$38DYs zkBPhon3h6S<^hrCXguM;WJ9$-zrn)dJu8dYgArFp)?x~?-dj)z{BB`?a`ITil(62v zPgreO#0)Fc!E77md>-rNWRKq@jfw(AA2r1zn&N2jAXUs1vBd2pp}VMAEF=jiqF#)@ zCW-eR!)wL~2Mjo55`W?q%r^R1JX|9ry}3G^rum(Qd*@z!okG3NBrc*(ttE>01bF{m ztha&*+~O=K?jm7Yw{jMI@Sf9AaCNw)WODG--%bC;OvwKJuP5O(hH=A$@BhX6e?j{n z%Tu7;(`@SnrgA8?O(>WxBgSeub3wdYdIwpXt>BX zT$FQ@Q|&*QY#ZQiNOgZh8vRCPPZY1;>nlQ0z}_pgM1TRElw^pEv_+3jzW|K)D~KcL4Y0e;ml2{2v~ zV0C|raDr};HeS3OW9x4{P&7{DC2LYin5o{60&b%Pvsb|73UfR;Y;Hqzk?DjtQz$5U z;!h2P6WrguSkT*@MsX_^^>%Zp>aMfJc08h3mBfwaDD-mEm_nX=t9KVu#IJ3oM2p{( zcp|;;H<`ljTJd`^4}M2C8BH2>n!<@EL*Q|isJnqQ>?X=$a`Z^UxZ)6Tf4QP~h(jC} z-5X}MMvJtuS9z5_lr|Ic}KabZ$ zU`t`cTnX$Ne`@~Z>}k`AS4^9>!^IkT)usPI8o}hV(yL4 ziym)&A9msP9v?5Ua3b@O!OD(VbJkEo4Zh5E*!Z$24$!)0ucDDXKY8eUmCqHG!jX?P z*AutaJ*bPjw6qagy!-R-`>-?4a^ktA!l0T3v)`vIJ$q`Ouf>^no8H#vBpKe!cfqcH zxVCAo(Zuz*vEi93e_J|lo}#>c5~;mL6ba-+OJnnmzTRQ?;WVP9Z#~5us8Z&K?%x!7 z_6c;Thc-=(b}`N``D@BDzVXK z{gi9I4U~(}N(`~{DLUM@I>%#j@$7ROo;`WG;^h&)8&Qv@Zh5z-8DmxU%UAdYm%Gf( zIj?l!w}-Pp$Hk`G<}{U6@ZExgPoLjsCU;#)HRjwkMW?w^_9wdb?53K+TEV=>pK>2_^oAi zBd}8Mt%ApH!t3?WRqqfJ@zC_F>Os9%})mJ6flmwDvf@Xt4J4 z4bmmUmlyLE>W)>n7^mEAs@Z%sbAN!EjTTg;pRgg)<;vmBGsnWrw8nkB!xyS%mOEC& zoN`$CP1$J4BKLiK$F_xMHhS(`Tv7SWc}-H&jq2gJM<1WnvbP(0kq<4r?stph(06TE zK6d}T$s^-f+K5WPq&w>V@LAF`?1Z^?E^F=&!fj>tpAxD+9RB>LB zaQSootvA0vyT&zIA~)y7=3vn3!=siGvmI)V>(|n>7a4t+wMw=uEcMGAT~oK)<=sBV zQ>_zSv;qz9lwR|DbHgx2<49E14Ua@ShsSrOn@V3jrM&R%c*3G6_TJUzbFP0UZ_$c= zE__bGH6;54OH(xNrCnGm4uAc`<;9%~u}!_nXD0Z{&$rx zPP6OhophMLPREz9q}cIf#rDN7KE8Q+=Qyx z=0a58aq>$)^^ndwi^G+%5L;%nbWQZcKW)~zj=OeS9)}I zqgvzA5ODX~VXFM}xG&Ntt*tisj%nUlbzwbc@ydzQ_evtmqHYJdELS$My?@#SFSou| z``FhjX?E5*S+4OH^`9=B`+DcKO{FutuE#DMlm&+_Z6xVq&mZ;A9m-38cyi3TN})Zd z(5u@@|FQ=?mGks_EB$-vFkT~d%rbZ1p59B2c6O@E#v9{8r|n2K#yiirg1vV+kX<3y zeXjEAgXo9HuHHBybzWYVZHILYmQkRU4;X(^cs+4vZ#_QJsbSIVJLTsbgH8QfKDlPz zx6$jadfu~nQ;K@;{biNyr?py2p~}=f*X_shGPXRN)%4cq*4`ZxM%ylQ%-lR|s<^f> zqtNiRYhitAqy{ttx@SG()x#<+v*U$xlkiQKzHB?+zUD%SOqOfYtAX+ZDrcp0H(i`! zpPx=Yl$1)(Us~ikS~I)z=y7S2j`!mhFZYNuPKjr~{cR$lGN=8M*WM?;1G}z{i)Z~~ zqaYM5`+7@e+O#aUY17~f(oZ}*eb3=NkQUKm+Y;V>CsIu`cv=C(S3V`ewHyP+G?gd z`i}ZGf1;_FrAxc5dRMjSk#1q;S^}be{RE{h=Rj+Vv=>h_kdQ?rO zDdcG0w%2{*8LI6mop;z3Ur>VJ?dH4ybTV*Hm;)3?)bqQVQ zny*^is9nweuN{#SCA)(;B znai=vNPYHgvvh~0+iCt~nT)YH2bzI#LD-emEtYg0ch5Gb{728tby^lYyJ*7;zSQ-= zI`dgxB&}jhHgvLqM$-2b(n9+&P2b0w4!(`K*lrjYX8 z#gVTU2YyLAn@$o0zZEv+a?SfLik5t`WCwjyEtcWOOcFx3Jb7F2fIa0Fu6JD7ZoT(* z+8pBY0r_gXwB92M?=)zrx}&b-K3ijny9!i za;HD?un;jQ{QA9wK9Hj?BdN{`s!Yy%ZJ~3-;Y%7!1&8t)Lgh? ztz1g#8K+B&ygEJg4=$n~vdSgPELk~wuVHLI5co*f+Wzn^>_^9sm%h@o8{({WKH}Ds zSDxSKnRQ@?^nHrQ#H=&-CO#)ArO#qG)DTRK@bA;_k2RHk3x2bF*3L!8j;}IbKRecD zEN=FPxZRKTi>e!vHi~TQI5k%EEx|qq%G);P>ErUA%-tFr5zCUFol<(X@%_Z+3$&Bc zx6==g2F)hKD!jd#IIyGMC&5xV{LTeu58#7Fao5tkUl7aE+*%e_qw+**EFp=l%e@;>z&BFvBZR5v9i?O(Whb zo|4t3`bRca*cK-sf1kAmO0JTo7s z&iKx5Jezo8yLM4w&(ehzI7^+hpvE^VKjLmYAPXX2#~5zaFpPEG1Z}-TU96+b+jP-` zP_j*PpZwUeg1>>x(_xVPd6y@-f7pEYhfjNc>y@Qs&DJ|4Bb^2<-72a6e7iYcPez^s z$eY!(Z62_1=W@#KH@=iz@KIdctg3vBHepY`cILF8L`Y%-q7hX8Go5`D!S! z1`MySa(s7NddZ@o8|Hh}{A{h+epYE(51a?==&~`=yr$hp<<^Ft)7U+0rS0_%-Swbh zR(x*w^|dyNaKkfP8#+4vqGN%*p7FKv8;vuMYbJj_IPRf#BPsdtne1_|1N%O8-Cw`i z=CjqDefXE}o@iTM^P#jlC-}z78@&nYY%4aCjU~`ey6+q}%5oh$b@g%=4|;G;)1?foOuWH&!F)KHtnmBOVXG6uVvloI z0@UINGnP#zpFa^e$;vn+OJoPL_(z+Q6|NrXY0bBK;=fZPDD_Z#vfd`ey-x~mY6M}u z-q`nAJ`26FZ2jrQS0Z_0o3g?9t{6{ih45t_jFKSj;GIFHPqhwQKjjv`aC)=0)jImI zea_PRj#WJU{W8^Yd(exXbq)7bY<-U(+*2Z@oN?>2bo8p%5xt);Z+cdEtgZCx?tCkc zq_rv1TguB4&Fs?eC$04{co}Ny^Uio>+QHTHXQmnNX`^3De!etP?$+Lsxhpoz-Wa)Q z_8F4bfrQ1H8*(j86Vw)@JhYJ-%&M{6k6$>LyaBJVmAS6b;59{V88+dn>0lGrF}rAT zk^BKg`TPZIBk$!uJbNQmA;oiN<6^7uEhkw=OppA&Z}|1B6UJ9+QljV`r4j3`wQlDw zjbC)>$+{0u4pBVPo*a7a@nqe&57AZj^PMjV4?pZEeGi%K)1^H9EtOSev<$aF7KKyd#_(%5vqt#iRdE=+l+jWy+^QuhEK={w)2K0_iSqAG0 zx72>^tzT?VxNez^X~>1z=Y9S;81@N+@8R9*-}kTYtbLkBk2TOvzH99Qz1p1qR`E@| zaCv%2!oZA`It$l4slflH@oC*6m}h^IzUyWjen3`LUq>cVNsrRXg3LtHVH3gt}Y#?Y&o}c22q` z{_ZCdaC`MGsGR!!(c$snS2H!Yzi0=}*;Cf|_;9*zh9u$yg8m|Au;WlqPz8PXKs#}0 zS4}UKaywqEt+M8A$0hnjH?1qyB*Cg{x5TUGDFv3E=~1Acc|*Vn?Kgz&3OoEc+OOl@ zL4(~U9|j%<7c1!+jZ&tZ!wnV1{QVn3s@g8eL$__xtrIN_4GnnT`-eZKO|)g(Sw`H)+{M9PM+!ToJHRvQiP@0cC&E@EHa+zXGhzqn3c^l0On z#afn8Z`9XZc{-guH$3}``}9THGS_zpJolLMy+&6ksP7?OThKG(m2P_P$HLhvvW8(v z*RNlmy?y1!j}%;-{_TCc54v!-rM*7g5k7cZ%yr}rc_&Uyd{7KnULX3pF6s8^2+E@; zruV+#E*K{5ZXCua-r|UKmVz|tMK_inPE^%=JbwCXT~fpf!llKza`lh)*I$4poHZ$! zoBMWecCp-i%W#UzRh*dCk?0&=YZxHrMk{*IO9Nut9M3Ft?W5g$eCN~NcT!a)rs*jb z&dT5CtpB*~+}Q@k_4}#&wAS^SFO80!n;yFK*o~t%=ygx#E?5EO*sp57akTy1>8=Bz z1-sKOY`+kcy@2vTFT_pqGoZDr*+i zJhVm}u==Y58J3+RR;zq+IID)eHzy2!R%ky{)qkv^XV$BsLrra~x)w)BRZq|tRcRkM z@2UPA+xVs_$!x~7A47b^`3;zlM#!ZuPk7{9e+@7ORfvLM(o+{6e{hB$-!?wH0M#w zvQnJ<1C`({)rv@*M0f~Qx1{}g|Gp{acGjIGgHH`MR@&u(BZ z%UsA?FrM=E=B3-4dCnSoDJLxx_;@YPsMm4t;kN*%=Cz z%+TU*8-~~l@v|`u%lx9o_27%QKH4sXvf>W@y~e$PxR+l~e38F7KWdicv59#Wei6Gb ztXMHWqm32%HF*2ORik%PU%a$+b*VmWrNez(T=3H7TWU(!|S=w9Hyx4L)Vwv>EM=>qL zx$NiyLG1h)L7(lZcf4i~9?LkYb2iK=@z~btxW}#OUqWrFo$_7!-6E^wE+t~myFJ+n zea42mC~OA*Lfk5!iueV) z&ifpc*2Bv0rfTQ$NdNS)8vdm?HOz37pJ5)Jz9^YsDJ-0_0$GvE#GP8hwa6eWKTIf*!5Z^ z-E3d~60<*AR#c<^(l^=pTV`_W#k^)6-nZ_Y=BaacGv|djZrMIo z+M$p$K2chvslS9oy}&dHO{CW9YPZF$kROt%56Ab_Zb)0XGkeUXQ_gbYZfEw|uKhmv zx7`Zz&(D+(ZAe+aKfB7Z>!my+Ec*)uJSNrhEaJ-+Q!A-$3dg^l{-_P8n)>dvREnNH zXtO0nJ9P6h$Gi&i?`Bj7>Z2{s?iWJ4bxd_WP#t9J!?91EFJOMDmhIP>I!A4|ban6J z1ERUNlxeSmlaqHYpk7^aEUBRj%GT~|IM;dR(Ocrn+9qIzeECe3z8Bx7Z9KHf@#B7O zdDXSr>g<_hzhmOv$*lyB%GOzw^yU+xWZh;+<}G=RTHOC6xCQHtSuxbJJ?^jfSzcVWzmgcIs*a zL0ETRQoO)2JYYOImh!#&=5M<{I%DKg*H}>RZ~Ua0MM!eqIca6Ge|*&`_m|r0Yp=3$ zmIm*7bVIpOagFJ5yy%L-9J=Ch`O_ao+jky6bLD{ULTRYN%zd(!4f%sII)gym26MUMm} zEj5o+Mo!}U_Vaw&fr1EXl9r~basRxj^sAOR{u-$1*X>HjoYZ?LkbB_8DG*__bRQXN4+$V zmv@j-nA^CsLT_>YF}VwE2iDAE?dld^ygqqG_ey}z0)vNw0}dgxWcTqdt90KQ$tw4v zZKrb<{EoIMOh347w zF6|{AW?$)&{ylb+P2?zX_Eu^lGfp{OD;NZ|rXD32eYV{+C;tHN|21kIP)%h`IEVy6 zVn74|=~AQ$nuM-|_R~cvN)Zf2l$H>>fC8aOZ_=B9N(mZSKm|fwB5MJWP!=~*l+X1>a1K4akmC;uUa z`>l^~DNi7WBV+-*IN=&r#!W#Z_cj9@5$h?;X|6n|1y$xY;qQ*1WK8k0Wa)?CgG7#n znRX}3F}ydnH=Q(oKo)Ib`jvbJcA|EjVYW_+Q+_?1g#fVfI9RDAcOuGXaU`PZwle9M zmJ&vgkjwL;Tlf0@a**(JC7`{Z*(_ZadIciS3^q`&&_9?wGtu7B&EJLEuD2P0j5#R9I)!>}9 zQk2i?0DqN|-l76H9TUXL7rxn04oWII=%%{2S0~M<-D;G*{}=xNsVsPnZvv(wo5h3M z&g%A!S~)p8f+K;insj{Julo0tDI2D`HhgB;_!5F6SJb2^J83NtI)KJ%&-GVh8Q!Kq z$GN&wkXzZ@gQ{1Hy{w40u*!mOT#w|t*7n+uSnJCUZCXI1?|_5Lnh(gRyja0v_1rxu zXFT6M6y-v^m^memGKCFkSXVVP3-s~@%C%BVdpQxKqIgFA5P&w!*_B+uyt2{_~Lz=uC)7p{zB5y|$F7kQ1>h>@yoFLT*Aora(? zV7skLql6}z$VW-_N|xs7hhHD^ zZAf49v1Lrt`=&B|fg-`-p0+fx!OYGE-qn7l=nu}r*Xv>&8*ED&_nV=|Jb47WYL&t+ zSqH})0~V_?Mp<%vKR2ZDSJr+l?QNz`$AO?Fu@l1)Gpk~@(f8SPeHHww#tu>}yo% zk*d0p{Kqxf*L7-4+K-pb4S+6pj-1L!xTyP4d~#}x7!0hVhz{p+shm+?jZx$a$0{CF zs|+zAzn=<>J8~%E$#E`;>qmb{MO`1*NAl1x5RtnaubX=K9bv<}cQD z>rh}LP%wB*Z>aa{L`A&8#B1r3J*xj-2}6%ntiIJ8{w!%0$ciRFJBigUk8gI zl#9$LRLGSbY2F^l47Fvf>0S8breMw7 z8c``QfHja(Mxuou}m6T?yJbuHzRhk|wtX z+|;)sY!cbx1F$CVU3mU<t4Ij!N)%IUW&&8hV*vP~b`K03iR zfo4Vwdk$@%fp$6{=siPq4uAn5O#R&S0{_fUI|}|e<_E#ZC77dVNNRiK6+gt|t*4Bp|B{1%2lp=gmv zkA4Rg;Wne9kyJFtHqn>aMp3{0O6r6}yZj7pmA77;B zu7aOin2PvYXwPB4cRSzwcPrsM!Mh2H{yFJ08I5RXqJ!VUe#mR|dP3wkZCzcbs=FYQ0yM+kib&@N;Cx3JxIAo?lOZ)bKDfZexw zzct&xP5J;0xh*sg-`Mdm4eWEp#l`o>*k+yZ^3N~?1M(3*0BZNrw(NMV>Idw$itTPD WGb1M2{(u_K8~|qOxC|6+5B3)u)mu*h literal 0 HcmV?d00001 diff --git a/IOTBluetooth/IOTBluetooth/Example/AbilityViewController.swift b/IOTBluetooth/IOTBluetooth/Example/AbilityViewController.swift new file mode 100644 index 0000000..f390f9d --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/AbilityViewController.swift @@ -0,0 +1,57 @@ +// +// AbilityViewController.swift +// Example +// +// Created by yaozuopan on 2024/3/11. +// + +import UIKit +import IOTBluetooth + +class AbilityViewController: BaseViewController { + + @IBOutlet weak var listView: UITableView! + + override func viewDidLoad() { + super.viewDidLoad() + title = "已连接" + IBManager.currentConnected!.name + } + + deinit { + IBManager.remove(self) + } +} + +extension AbilityViewController: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + datas.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let data = datas[indexPath.row] + let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) + let label = cell.viewWithTag(10) as! UILabel + label.text = "\(indexPath.row) " + data.ability.description + " \(data.label)" + return cell + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + activityIndicatorView.startAnimating() + let data = datas[indexPath.row] + IBSender() + .ability(data.ability) + .parameters(data.parameters) + .response {[weak self] result in + guard let self = self else {return} + if result.isSuccess{ + //请求成功 + } + else{ + //请求失败 + } + print(result) + activityIndicatorView.stopAnimating() + } + } +} diff --git a/IOTBluetooth/IOTBluetooth/Example/AppDelegate.swift b/IOTBluetooth/IOTBluetooth/Example/AppDelegate.swift new file mode 100644 index 0000000..983bdde --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/AppDelegate.swift @@ -0,0 +1,24 @@ +// +// AppDelegate.swift +// Example +// +// Created by yaozuopan on 2024/3/11. +// + +import UIKit +import IOTBluetooth + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + IBManager.isDebug = true + IBManager.initializationSDK() + + return true + } +} + diff --git a/IOTBluetooth/IOTBluetooth/Example/Assets.xcassets/AccentColor.colorset/Contents.json b/IOTBluetooth/IOTBluetooth/Example/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOTBluetooth/IOTBluetooth/Example/Assets.xcassets/AppIcon.appiconset/Contents.json b/IOTBluetooth/IOTBluetooth/Example/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOTBluetooth/IOTBluetooth/Example/Assets.xcassets/Contents.json b/IOTBluetooth/IOTBluetooth/Example/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOTBluetooth/IOTBluetooth/Example/Base.lproj/LaunchScreen.storyboard b/IOTBluetooth/IOTBluetooth/Example/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IOTBluetooth/IOTBluetooth/Example/Base.lproj/Main.storyboard b/IOTBluetooth/IOTBluetooth/Example/Base.lproj/Main.storyboard new file mode 100644 index 0000000..5a59854 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/Base.lproj/Main.storyboard @@ -0,0 +1,298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IOTBluetooth/IOTBluetooth/Example/BaseViewController.swift b/IOTBluetooth/IOTBluetooth/Example/BaseViewController.swift new file mode 100644 index 0000000..c7ab315 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/BaseViewController.swift @@ -0,0 +1,36 @@ +// +// BaseViewController.swift +// Example +// +// Created by yaozuopan on 2024/3/14. +// + +import UIKit + +class BaseViewController: UIViewController { + + func showAlert(_ title: String? = nil, msg: String, confirmLabel: String? = nil, onConfirm: (() -> Void)? = nil) { + let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "返回", style: .cancel)) + + if let confirmLabel = confirmLabel { + alert.addAction(UIAlertAction(title: confirmLabel, style: .default, handler: { _ in + onConfirm?() + })) + } + present(alert, animated: true) + } + + let activityIndicatorView = UIActivityIndicatorView(style: .large) + override func viewDidLoad() { + super.viewDidLoad() + + activityIndicatorView.frame = UIScreen.main.bounds + activityIndicatorView.layer.zPosition = 1 + view.addSubview(activityIndicatorView) + } + + deinit { + print("deinit \(Self.self)") + } +} diff --git a/IOTBluetooth/IOTBluetooth/Example/ConnectViewController.swift b/IOTBluetooth/IOTBluetooth/Example/ConnectViewController.swift new file mode 100644 index 0000000..53ec0bb --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/ConnectViewController.swift @@ -0,0 +1,127 @@ +// +// ConnectViewController.swift +// Example +// +// Created by yaozuopan on 2024/3/14. +// + +import UIKit +import IOTBluetooth + +class ConnectViewController: BaseViewController { + + @IBOutlet weak var dataView: UITextView! + @IBOutlet weak var dataPacketView: UITextView! + @IBOutlet weak var newLRC: UISwitch! + @IBOutlet weak var oldLRC: UISwitch! + + var peripheral: IBPeripheral! + + var dataPacket: [UInt8] = [] { + didSet { + dataPacketView.text = dataPacket.data.joined(" ") + } + } + + var isNewLRC: Bool = true { + didSet { + if isNewLRC { oldLRC.isOn = false } + if isNewLRC == false { newLRC.isOn = false } + + if isNewLRC == oldValue { return } + makeData() + } + } + + override func viewDidLoad() { + super.viewDidLoad() + title = "已连接 \(peripheral.name)" + + navigationItem.rightBarButtonItem = UIBarButtonItem(title: "查看日记", style: .done, target: self, action: #selector(onLog(_:))) + + newLRC.addTarget(self, action: #selector(newOn(_:)), for: .valueChanged) + oldLRC.addTarget(self, action: #selector(oldOn(_:)), for: .valueChanged) + } + + @objc func newOn(_ sender: UISwitch) { + isNewLRC = true + } + + @objc func oldOn(_ sender: UISwitch) { + isNewLRC = false + } + + @objc func onLog(_ sender: Any?) { + let vc = storyboard!.instantiateViewController(withIdentifier: "LogViewController") + navigationController?.pushViewController(vc, animated: true) + } + + @IBAction func onSend(_ sender: UIButton) { +// guard dataPacketView.text.count > 10 else { return } +// showAlert("将发送以下数据", msg: dataPacketView.text, confirmLabel: "发送") { [unowned self] in +// activityIndicatorView.startAnimating() +// let bytes = dataPacketView.text! +// .split(separator: " ") +// .map { String($0) } +// .map { +// var result: UInt64 = 0 +// Scanner(string: $0).scanHexInt64(&result) +// return UInt8(result) +// } +// IBManager.sendInfo(dataPacket.data) { [unowned self] isSuccess in +// activityIndicatorView.stopAnimating() +// guard isSuccess else { return } +// showAlert(msg: "数据已发送") +// } +// +// IBSender() +// .ability(.battery) +// .completion { response in +// +// } +// .send() + } + + /// 组装信息 + func makeData() { + + let data: [UInt8] = []//dataView.text!.data!.bytes + + /// 分包数 + let packageCount = 1 + /// 数据包总长度 + let dataTotalLength = data.count + /// 数据包长度 + let dataLength = data.count + /// 数据包索引 + let index = 1 + + var bytes = [0x73, 0x01, 0x07] + packageCount.byte4 + dataTotalLength.byte4 + index.byte4 + dataLength.byte2 + + dataPacket = bytes + data + [0x00] + +// if isNewLRC { +// dataPacket = bytes + [LRC.calculateLRC(data)] +// } else { +// dataPacket = bytes + [LRC.calculate(data)] +// } + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + makeData() + } +} + +extension ConnectViewController: UITextViewDelegate { + + func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { + guard text == "\n" else { return true } + textView.resignFirstResponder() + + if textView === dataView { + makeData() + } + return false + } +} diff --git a/IOTBluetooth/IOTBluetooth/Example/Datas.swift b/IOTBluetooth/IOTBluetooth/Example/Datas.swift new file mode 100644 index 0000000..a72c68a --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/Datas.swift @@ -0,0 +1,93 @@ +// +// Datas.swift +// Example +// +// Created by yaozuopan on 2024/3/19. +// + +import Foundation +import IOTBluetooth + +let datas: [(ability: IBAbility, label: String, parameters: [IBParameter])] = [ + (.userData,"设置用户数据",[.userInfo(IBUserInfo())]), + (.language, "设置语言", [.language(.english)]), + (.about,"关于本机内容",[]), + (.find, "开始查找手表", [.action(1)]), + (.find, "停止查找手表", [.action(0)]), + (.message, "开启消息推送功能", [.action(1)]), + (.message, "关闭消息推送功能", [.action(0)]), + + (.takePhoto, "开启手势拍照", [.action(1)]), + (.takePhoto, "关闭手势拍照", [.action(0)]), + (.restore, "恢复出厂设置", []), + (.reboot, "重新启动", []), + (.shutdown, "关机", []), + (.fetchScreen, "获取手表屏幕参数", []), + (.screen, "设置手表屏幕参数", [.screen(IBScreen())]), + (.fetchBattery, "获取电量", []), + (.fetchClock, "获取闹钟设置", []), + (.setClock, "发送闹钟设置", [.clock(IBClock())]), + + (.fetchCurrentDialId, "发送当前表盘ID", []), + (.switchDial, "切换表盘", [.dialID(12)]), + (.deleteDial, "删除表盘", [.dialID(12)]), + (.fetchDials, "获取所有表盘UID", []), + (.checkDialID, "获取某表盘ID是否已安装", [.dialID(12)]), + + (.fetchWatchState, "获取当前手表状态", []), + (.fetchVibrateSound, "获取手表声音与震动参数", []), + (.vibrateSound, "设置手表声音与震动参数", [.vibrateSound(IBVibrateSound())]), + (.fetchAuxiliary, "获取手表辅助功能参数", []), + (.auxiliary, "设置手表辅助功能参数", [.auxiliary(.bloodOxygen)]), + (.unit, "设置手表公英制单位", [.value(1)]), + + (.sendWeather, "发送天气数据", [.weather(IBWeather())]), + (.disk, "获取SD卡剩余空间", []), + (.unpair, "发送解除配对消息", []), + (.sendUnpair, "发送取消解除配对消息", []), + + + (.startSport, "开启指定运动模式", [.motionMode(.running)]), + (.trainPauseResume, "训练暂停", [.action(0)]), + (.trainPauseResume, "训练恢复", [.action(1)]), + (.endSport, "结束运动模式", []), + + (.heartRateMode, "开启自动获取实时心率", [.action(1)]), + (.heartRateMode, "关闭自动获取实时心率", [.action(0)]), + (.heartRateHigh, "设置最高心率提醒", [.value(240)]), + (.heartRateHigh, "关闭最高心率提醒", [.value(0)]), + (.fetchHeartRate, "获取手表心率参数", []), + (.heartRate, "设置手表心率参数", [.heartRate(IBHeartRate())]), + (.currentHeartRate, "获取实时心率", []), + + (.fetchBloodOxygen, "获取手表血氧设置", []), + (.bloodOxygen, "设置手表血氧参数", [.bloodOxygen(IBBloodOxygen())]), + (.trainFrequency, "设置训练实时数据采样频率", [.value(30)]), + + (.fetchTargetStep, "获取目标步数设置", []), + (.targetStep, "设置目标步数", [.targetStep(IBTargetStep())]), + (.fetchOtherTarget, "获取其他目标设置", []), + (.targetOther, "设置其他目标", [.otherTarget(IBOtherTarget())]), + (.trainTarget, "设置训练目标", [.trainTarget(IBTrainTarget())]), + (.fetchSleep, "获取睡眠设置", []), + (.sleep, "设置睡眠", [.sleep(IBSleep())]), + (.fetchWater, "获取手表喝水提醒设置", []), + (.water, "设置喝水提醒", [.water(IBWater())]), + + + (.syncHeartRate, "同步心率历史数据", [.value(30)]), + (.syncBloodOxygen, "同步血氧历史数据", [.value(30)]), + (.syncStepCount, "同步历史步数数据", [.value(30)]), + (.syncFatBurning, "同步燃脂时间历史数据", [.value(30)]), + (.syncStand, "同步站立历史数据", [.value(30)]), + (.syncCalorie, "同步卡路里历史数据", [.value(30)]), + (.syncDistance, "同步距离历史数据", [.value(30)]), + (.syncTrain, "同步基础训练历史数据", [.value(30)]), + (.syncGPS, "同步路径坐标集历史数据", [.value(1654012800)]), + (.sendSyncEnd, "发送同步数据结束消息", []), + (.addressBook, "发送通讯录", [.addressBook(IBAddressBook.test())]), + +// (.revokeFileSend, "撤销当前文件传输", [.file(.mp3)]), +// (.fetchFiles, "获取指定类型所有文件", [.file(.mp3)]), +// (.deleteFiles, "删除指定类型所有文件", [.file(.mp3)]), +] diff --git a/IOTBluetooth/IOTBluetooth/Example/Info.plist b/IOTBluetooth/IOTBluetooth/Example/Info.plist new file mode 100644 index 0000000..e999718 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/Info.plist @@ -0,0 +1,10 @@ + + + + + UIBackgroundModes + + bluetooth-central + + + diff --git a/IOTBluetooth/IOTBluetooth/Example/LogViewController.swift b/IOTBluetooth/IOTBluetooth/Example/LogViewController.swift new file mode 100644 index 0000000..246784a --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/LogViewController.swift @@ -0,0 +1,24 @@ +// +// LogViewController.swift +// Example +// +// Created by yaozuopan on 2024/3/14. +// + +import UIKit +import IOTBluetooth + +class LogViewController: BaseViewController { + + @IBOutlet weak var textView: UITextView! + + override func viewDidLoad() { + title = "蓝牙日志" + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + textView.text = IBManager.logs.joined(separator: "\n") + } +} + diff --git a/IOTBluetooth/IOTBluetooth/Example/ViewController.swift b/IOTBluetooth/IOTBluetooth/Example/ViewController.swift new file mode 100644 index 0000000..1d6af06 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/Example/ViewController.swift @@ -0,0 +1,98 @@ +// +// ViewController.swift +// Example +// +// Created by yaozuopan on 2024/3/11. +// + +import UIKit +import IOTBluetooth + +class ViewController: BaseViewController { + + @IBOutlet weak var listView: UITableView! + + private var datas: [IBPeripheral] = [] + override func viewDidLoad() { + super.viewDidLoad() + title = "IOTBluetooth" + + IBManager.subscribe(.connectStateDidChange, observer: self) { object, userInfo in + print("connect notice " + "\(object!)") + } + IBManager.subscribe(.takePhoto, observer: self) { object, userInfo in + print("takePhoto notice " + "\(object!)") + } + IBManager.subscribe(.didFindDevice, observer: self) { object, userInfo in + print("find notice " ) + } + IBManager.subscribe(.trainStateDidChanged, observer: self) { object, userInfo in + let model = object as! IBTarinState + print("trainState notice " + model.description) + } + IBManager.subscribe(.trainingData, observer: self) { object, userInfo in + let model = object as! IBTrainingData + print("trainingData notice " + model.description) + } +// IBManager.subscribe(.weather, observer: self) { object, userInfo in +// print("weather notice ") +// } + } + + deinit { + IBManager.remove(self) + } + + @IBAction func startScan(_ sender: UIButton) { + title = "正在扫描蓝牙设备..." + IBManager.scan { [unowned self] peripheral in + if let _ = datas.filter({ $0.uuid == peripheral.uuid }).last { + return + } + print(peripheral.name) + print(peripheral.macAddress) + print(peripheral.softwareVersion) + print(peripheral.rssi) + + datas.append(peripheral) + listView.reloadData() + } + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + IBManager.stopScan() + title = "IOTBluetooth" + } + +} + +extension ViewController: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + datas.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) + let label = cell.viewWithTag(10) as! UILabel + label.text = datas[indexPath.row].name + "(点击连接)" + return cell + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + activityIndicatorView.startAnimating() + let device = datas[indexPath.row] + IBManager.connect(device) { [unowned self] isSuccess in + activityIndicatorView.stopAnimating() + if isSuccess{ + let vc = storyboard!.instantiateViewController(identifier: "AbilityViewController") + navigationController?.pushViewController(vc, animated: true) + } + else{ + print("连接失败") + } + } + print(indexPath) + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.pbxproj b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.pbxproj new file mode 100644 index 0000000..5ffed27 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.pbxproj @@ -0,0 +1,821 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 180B01982BFC831300524729 /* IBHistoryHeartRate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 180B01972BFC831300524729 /* IBHistoryHeartRate.swift */; }; + 180B019E2BFC9CF400524729 /* IBHistoryBaseTraining.swift in Sources */ = {isa = PBXBuildFile; fileRef = 180B019D2BFC9CF400524729 /* IBHistoryBaseTraining.swift */; }; + 180CE2652C0D728F00A7006E /* IBAddressBook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 180CE2642C0D728F00A7006E /* IBAddressBook.swift */; }; + 184431322BF3720E00546E4E /* IBOtherTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 184431312BF3720E00546E4E /* IBOtherTarget.swift */; }; + 1849DC8F2BEC8007002C2D2D /* IBVibrateSound.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1849DC8E2BEC8007002C2D2D /* IBVibrateSound.swift */; }; + 1849DC912BECD131002C2D2D /* IBCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1849DC902BECD131002C2D2D /* IBCode.swift */; }; + 184B94CB2BF606CC0042BEB3 /* IBTrainTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 184B94CA2BF606CC0042BEB3 /* IBTrainTarget.swift */; }; + 1859DFA02BFF5A2700112E8C /* IBSendTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1859DF9F2BFF5A2700112E8C /* IBSendTime.swift */; }; + 18993AA22C073FED006742D2 /* IBBloodOxygen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18993AA12C073FED006742D2 /* IBBloodOxygen.swift */; }; + 189C15892C05E0CD00676A80 /* IBTarinState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 189C15882C05E0CD00676A80 /* IBTarinState.swift */; }; + 189C158B2C05F27C00676A80 /* IBAbout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 189C158A2C05F27C00676A80 /* IBAbout.swift */; }; + 189C158D2C05F58A00676A80 /* IBHistoryBloodOxygen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 189C158C2C05F58A00676A80 /* IBHistoryBloodOxygen.swift */; }; + 189C158F2C05F85200676A80 /* IBHistoryStep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 189C158E2C05F85200676A80 /* IBHistoryStep.swift */; }; + 189C15912C05FBA100676A80 /* IBHistoryBurning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 189C15902C05FBA100676A80 /* IBHistoryBurning.swift */; }; + 189C15932C05FFA600676A80 /* IBHistoryStand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 189C15922C05FFA600676A80 /* IBHistoryStand.swift */; }; + 189C15952C05FFC700676A80 /* IBHistoryCalorie.swift in Sources */ = {isa = PBXBuildFile; fileRef = 189C15942C05FFC700676A80 /* IBHistoryCalorie.swift */; }; + 189C15972C05FFEE00676A80 /* IBHistoryDistance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 189C15962C05FFEE00676A80 /* IBHistoryDistance.swift */; }; + 18C9589B2C082FA7006A5DE8 /* IBWeather.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C9589A2C082FA7006A5DE8 /* IBWeather.swift */; }; + 18C9589D2C08600C006A5DE8 /* IBHistoryGps.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C9589C2C08600C006A5DE8 /* IBHistoryGps.swift */; }; + 18C9589F2C086A9D006A5DE8 /* IBHistorySleep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18C9589E2C086A9D006A5DE8 /* IBHistorySleep.swift */; }; + 18E7AC922BF44C6800CB9393 /* IBSleep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18E7AC912BF44C6800CB9393 /* IBSleep.swift */; }; + 18E7AC942BF4B31000CB9393 /* IBWater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18E7AC932BF4B31000CB9393 /* IBWater.swift */; }; + 18E7AC962BF5E39900CB9393 /* IBHeartRate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18E7AC952BF5E39900CB9393 /* IBHeartRate.swift */; }; + 18EC6E282BFF4C6D00757CA8 /* IBPhoneInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18EC6E272BFF4C6D00757CA8 /* IBPhoneInfo.swift */; }; + 18EFF59B2C080F14001B1E0E /* IBUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18EFF59A2C080F14001B1E0E /* IBUserInfo.swift */; }; + 8A0A39BF2B980BEF006A3B18 /* IOTBluetooth.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A0A39BE2B980BEF006A3B18 /* IOTBluetooth.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8A0A39C62B980C88006A3B18 /* IBluetooth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0A39C52B980C88006A3B18 /* IBluetooth.swift */; }; + 8A0A39C92B980CC2006A3B18 /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A0A39C82B980CC2006A3B18 /* CoreBluetooth.framework */; }; + 8A0A39CB2B980CFC006A3B18 /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0A39CA2B980CFC006A3B18 /* Logger.swift */; }; + 8A0A39CD2B980D53006A3B18 /* IBPeripheral.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0A39CC2B980D53006A3B18 /* IBPeripheral.swift */; }; + 8A0A39D22B980E4C006A3B18 /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0A39D12B980E4C006A3B18 /* JSON.swift */; }; + 8A0A39D42B980E93006A3B18 /* Any.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0A39D32B980E93006A3B18 /* Any.swift */; }; + 8A0A39D62B980EC9006A3B18 /* IBPeripheralUUID.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0A39D52B980EC9006A3B18 /* IBPeripheralUUID.swift */; }; + 8A0A39D82B980F58006A3B18 /* UTF8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0A39D72B980F58006A3B18 /* UTF8.swift */; }; + 8A0A39DA2B981037006A3B18 /* Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A0A39D92B981037006A3B18 /* Date.swift */; }; + 8A1DFF522B9EB4F800B735FF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1DFF512B9EB4F800B735FF /* AppDelegate.swift */; }; + 8A1DFF562B9EB4F800B735FF /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A1DFF552B9EB4F800B735FF /* ViewController.swift */; }; + 8A1DFF592B9EB4F900B735FF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8A1DFF572B9EB4F900B735FF /* Main.storyboard */; }; + 8A1DFF5B2B9EB4F900B735FF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8A1DFF5A2B9EB4F900B735FF /* Assets.xcassets */; }; + 8A1DFF5E2B9EB4F900B735FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8A1DFF5C2B9EB4F900B735FF /* LaunchScreen.storyboard */; }; + 8A34B9252BA2A069000F66BD /* IBWatchInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A34B9242BA2A069000F66BD /* IBWatchInfo.swift */; }; + 8A34B9272BA2AB66000F66BD /* ConnectViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A34B9262BA2AB66000F66BD /* ConnectViewController.swift */; }; + 8A34B9292BA2AB86000F66BD /* LogViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A34B9282BA2AB86000F66BD /* LogViewController.swift */; }; + 8A34B92B2BA2D446000F66BD /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A34B92A2BA2D446000F66BD /* BaseViewController.swift */; }; + 8A34B92D2BA2FA02000F66BD /* IBManufacturer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A34B92C2BA2FA02000F66BD /* IBManufacturer.swift */; }; + 8A5822CF2BA1A67700590AB6 /* IBAbility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A5822CE2BA1A67700590AB6 /* IBAbility.swift */; }; + 8A5822D12BA1C80700590AB6 /* LRC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A5822D02BA1C80700590AB6 /* LRC.swift */; }; + 8A65F95F2BABEC4D005C1EA4 /* IBClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A65F95E2BABEC4D005C1EA4 /* IBClock.swift */; }; + 8A65F9612BAC0810005C1EA4 /* IBSimulateParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A65F9602BAC0810005C1EA4 /* IBSimulateParser.swift */; }; + 8A65F9632BAC1018005C1EA4 /* IBTargetStep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A65F9622BAC1018005C1EA4 /* IBTargetStep.swift */; }; + 8A65F9652BAC271B005C1EA4 /* IBScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A65F9642BAC271B005C1EA4 /* IBScreen.swift */; }; + 8A76B6092BA84C2B0016F2AB /* AbilityViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A76B6082BA84C2B0016F2AB /* AbilityViewController.swift */; }; + 8A76B60B2BA851730016F2AB /* IBParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A76B60A2BA851730016F2AB /* IBParser.swift */; }; + 8A79D2252BA4278E0096A98C /* IBSender.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A79D2242BA4278E0096A98C /* IBSender.swift */; }; + 8A79D2272BA433330096A98C /* IBNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A79D2262BA433330096A98C /* IBNotify.swift */; }; + 8A79D2292BA43F5A0096A98C /* IBResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A79D2282BA43F5A0096A98C /* IBResponse.swift */; }; + 8A878FE02BA93CF1008C7F26 /* Datas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A878FDF2BA93CF1008C7F26 /* Datas.swift */; }; + 8A878FE22BA9444C008C7F26 /* IBParameter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A878FE12BA9444C008C7F26 /* IBParameter.swift */; }; + 8A878FE42BA94D09008C7F26 /* IBChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A878FE32BA94D09008C7F26 /* IBChecker.swift */; }; + 8A87FBB32BAA7F3900096761 /* IBLanguage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A87FBB22BAA7F3900096761 /* IBLanguage.swift */; }; + 8A87FBB52BAA85FB00096761 /* IBTrainingData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A87FBB42BAA85FB00096761 /* IBTrainingData.swift */; }; + 8A9F6ABD2BA0463D00DA520F /* CRC16.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A9F6ABC2BA0463D00DA520F /* CRC16.swift */; }; + 8A9F6ABE2BA0475100DA520F /* CoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A0A39C82B980CC2006A3B18 /* CoreBluetooth.framework */; }; + 8A9F6AC12BA04BE100DA520F /* IBManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A9F6AC02BA04BE100DA520F /* IBManager.swift */; }; + 8A9F6AC22BA05CB500DA520F /* IOTBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A0A39BB2B980BEF006A3B18 /* IOTBluetooth.framework */; }; + 8A9F6AC32BA05CB500DA520F /* IOTBluetooth.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8A0A39BB2B980BEF006A3B18 /* IOTBluetooth.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 8A9F6AC42BA05CB500DA520F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8A0A39B22B980BEF006A3B18 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8A0A39BA2B980BEF006A3B18; + remoteInfo = IOTBluetooth; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 8A9F6AC62BA05CB500DA520F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 8A9F6AC32BA05CB500DA520F /* IOTBluetooth.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 180B01972BFC831300524729 /* IBHistoryHeartRate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBHistoryHeartRate.swift; sourceTree = ""; }; + 180B019D2BFC9CF400524729 /* IBHistoryBaseTraining.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBHistoryBaseTraining.swift; sourceTree = ""; }; + 180CE2642C0D728F00A7006E /* IBAddressBook.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBAddressBook.swift; sourceTree = ""; }; + 184431312BF3720E00546E4E /* IBOtherTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBOtherTarget.swift; sourceTree = ""; }; + 1849DC8E2BEC8007002C2D2D /* IBVibrateSound.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBVibrateSound.swift; sourceTree = ""; }; + 1849DC902BECD131002C2D2D /* IBCode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBCode.swift; sourceTree = ""; }; + 184B94CA2BF606CC0042BEB3 /* IBTrainTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBTrainTarget.swift; sourceTree = ""; }; + 1859DF9F2BFF5A2700112E8C /* IBSendTime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBSendTime.swift; sourceTree = ""; }; + 18993AA12C073FED006742D2 /* IBBloodOxygen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBBloodOxygen.swift; sourceTree = ""; }; + 189C15882C05E0CD00676A80 /* IBTarinState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBTarinState.swift; sourceTree = ""; }; + 189C158A2C05F27C00676A80 /* IBAbout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBAbout.swift; sourceTree = ""; }; + 189C158C2C05F58A00676A80 /* IBHistoryBloodOxygen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBHistoryBloodOxygen.swift; sourceTree = ""; }; + 189C158E2C05F85200676A80 /* IBHistoryStep.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBHistoryStep.swift; sourceTree = ""; }; + 189C15902C05FBA100676A80 /* IBHistoryBurning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBHistoryBurning.swift; sourceTree = ""; }; + 189C15922C05FFA600676A80 /* IBHistoryStand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBHistoryStand.swift; sourceTree = ""; }; + 189C15942C05FFC700676A80 /* IBHistoryCalorie.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBHistoryCalorie.swift; sourceTree = ""; }; + 189C15962C05FFEE00676A80 /* IBHistoryDistance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBHistoryDistance.swift; sourceTree = ""; }; + 18C9589A2C082FA7006A5DE8 /* IBWeather.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBWeather.swift; sourceTree = ""; }; + 18C9589C2C08600C006A5DE8 /* IBHistoryGps.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBHistoryGps.swift; sourceTree = ""; }; + 18C9589E2C086A9D006A5DE8 /* IBHistorySleep.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBHistorySleep.swift; sourceTree = ""; }; + 18E7AC912BF44C6800CB9393 /* IBSleep.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBSleep.swift; sourceTree = ""; }; + 18E7AC932BF4B31000CB9393 /* IBWater.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBWater.swift; sourceTree = ""; }; + 18E7AC952BF5E39900CB9393 /* IBHeartRate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBHeartRate.swift; sourceTree = ""; }; + 18EC6E272BFF4C6D00757CA8 /* IBPhoneInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBPhoneInfo.swift; sourceTree = ""; }; + 18EFF59A2C080F14001B1E0E /* IBUserInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBUserInfo.swift; sourceTree = ""; }; + 8A0A39BB2B980BEF006A3B18 /* IOTBluetooth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IOTBluetooth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8A0A39BE2B980BEF006A3B18 /* IOTBluetooth.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IOTBluetooth.h; sourceTree = ""; }; + 8A0A39C52B980C88006A3B18 /* IBluetooth.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IBluetooth.swift; sourceTree = ""; }; + 8A0A39C82B980CC2006A3B18 /* CoreBluetooth.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreBluetooth.framework; path = System/Library/Frameworks/CoreBluetooth.framework; sourceTree = SDKROOT; }; + 8A0A39CA2B980CFC006A3B18 /* Logger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = ""; }; + 8A0A39CC2B980D53006A3B18 /* IBPeripheral.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBPeripheral.swift; sourceTree = ""; }; + 8A0A39D12B980E4C006A3B18 /* JSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSON.swift; sourceTree = ""; }; + 8A0A39D32B980E93006A3B18 /* Any.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Any.swift; sourceTree = ""; }; + 8A0A39D52B980EC9006A3B18 /* IBPeripheralUUID.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IBPeripheralUUID.swift; sourceTree = ""; }; + 8A0A39D72B980F58006A3B18 /* UTF8.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UTF8.swift; sourceTree = ""; }; + 8A0A39D92B981037006A3B18 /* Date.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Date.swift; sourceTree = ""; }; + 8A1DFF4F2B9EB4F800B735FF /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8A1DFF512B9EB4F800B735FF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 8A1DFF552B9EB4F800B735FF /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 8A1DFF582B9EB4F900B735FF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 8A1DFF5A2B9EB4F900B735FF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 8A1DFF5D2B9EB4F900B735FF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 8A1DFF5F2B9EB4F900B735FF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8A34B9242BA2A069000F66BD /* IBWatchInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBWatchInfo.swift; sourceTree = ""; }; + 8A34B9262BA2AB66000F66BD /* ConnectViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectViewController.swift; sourceTree = ""; }; + 8A34B9282BA2AB86000F66BD /* LogViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogViewController.swift; sourceTree = ""; }; + 8A34B92A2BA2D446000F66BD /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; + 8A34B92C2BA2FA02000F66BD /* IBManufacturer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBManufacturer.swift; sourceTree = ""; }; + 8A5822CE2BA1A67700590AB6 /* IBAbility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBAbility.swift; sourceTree = ""; }; + 8A5822D02BA1C80700590AB6 /* LRC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LRC.swift; sourceTree = ""; }; + 8A65F95E2BABEC4D005C1EA4 /* IBClock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBClock.swift; sourceTree = ""; }; + 8A65F9602BAC0810005C1EA4 /* IBSimulateParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IBSimulateParser.swift; sourceTree = ""; }; + 8A65F9622BAC1018005C1EA4 /* IBTargetStep.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBTargetStep.swift; sourceTree = ""; }; + 8A65F9642BAC271B005C1EA4 /* IBScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBScreen.swift; sourceTree = ""; }; + 8A76B6082BA84C2B0016F2AB /* AbilityViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AbilityViewController.swift; sourceTree = ""; }; + 8A76B60A2BA851730016F2AB /* IBParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBParser.swift; sourceTree = ""; }; + 8A79D2242BA4278E0096A98C /* IBSender.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBSender.swift; sourceTree = ""; }; + 8A79D2262BA433330096A98C /* IBNotify.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IBNotify.swift; sourceTree = ""; }; + 8A79D2282BA43F5A0096A98C /* IBResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBResponse.swift; sourceTree = ""; }; + 8A878FDF2BA93CF1008C7F26 /* Datas.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Datas.swift; sourceTree = ""; }; + 8A878FE12BA9444C008C7F26 /* IBParameter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBParameter.swift; sourceTree = ""; }; + 8A878FE32BA94D09008C7F26 /* IBChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBChecker.swift; sourceTree = ""; }; + 8A87FBB22BAA7F3900096761 /* IBLanguage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBLanguage.swift; sourceTree = ""; }; + 8A87FBB42BAA85FB00096761 /* IBTrainingData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBTrainingData.swift; sourceTree = ""; }; + 8A9F6ABC2BA0463D00DA520F /* CRC16.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CRC16.swift; sourceTree = ""; }; + 8A9F6AC02BA04BE100DA520F /* IBManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IBManager.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8A0A39B82B980BEF006A3B18 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A0A39C92B980CC2006A3B18 /* CoreBluetooth.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8A1DFF4C2B9EB4F800B735FF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A9F6AC22BA05CB500DA520F /* IOTBluetooth.framework in Frameworks */, + 8A9F6ABE2BA0475100DA520F /* CoreBluetooth.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8A0A39B12B980BEF006A3B18 = { + isa = PBXGroup; + children = ( + 8A0A39BD2B980BEF006A3B18 /* IOTBluetooth */, + 8A1DFF502B9EB4F800B735FF /* Example */, + 8A0A39BC2B980BEF006A3B18 /* Products */, + 8A0A39C72B980CC2006A3B18 /* Frameworks */, + ); + sourceTree = ""; + }; + 8A0A39BC2B980BEF006A3B18 /* Products */ = { + isa = PBXGroup; + children = ( + 8A0A39BB2B980BEF006A3B18 /* IOTBluetooth.framework */, + 8A1DFF4F2B9EB4F800B735FF /* Example.app */, + ); + name = Products; + sourceTree = ""; + }; + 8A0A39BD2B980BEF006A3B18 /* IOTBluetooth */ = { + isa = PBXGroup; + children = ( + 8A9F6ABF2BA04B5100DA520F /* Models */, + 8A0A39D02B980DFD006A3B18 /* Tools */, + 8A0A39C52B980C88006A3B18 /* IBluetooth.swift */, + 8A5822CE2BA1A67700590AB6 /* IBAbility.swift */, + 8A878FE32BA94D09008C7F26 /* IBChecker.swift */, + 8A76B60A2BA851730016F2AB /* IBParser.swift */, + 8A65F9602BAC0810005C1EA4 /* IBSimulateParser.swift */, + 8A878FE12BA9444C008C7F26 /* IBParameter.swift */, + 8A79D2242BA4278E0096A98C /* IBSender.swift */, + 8A79D2262BA433330096A98C /* IBNotify.swift */, + 8A9F6AC02BA04BE100DA520F /* IBManager.swift */, + 8A0A39BE2B980BEF006A3B18 /* IOTBluetooth.h */, + ); + path = IOTBluetooth; + sourceTree = ""; + }; + 8A0A39C72B980CC2006A3B18 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8A0A39C82B980CC2006A3B18 /* CoreBluetooth.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 8A0A39D02B980DFD006A3B18 /* Tools */ = { + isa = PBXGroup; + children = ( + 8A0A39D52B980EC9006A3B18 /* IBPeripheralUUID.swift */, + 8A0A39D32B980E93006A3B18 /* Any.swift */, + 8A0A39D92B981037006A3B18 /* Date.swift */, + 8A0A39D12B980E4C006A3B18 /* JSON.swift */, + 8A9F6ABC2BA0463D00DA520F /* CRC16.swift */, + 8A5822D02BA1C80700590AB6 /* LRC.swift */, + 8A0A39D72B980F58006A3B18 /* UTF8.swift */, + 8A0A39CA2B980CFC006A3B18 /* Logger.swift */, + ); + path = Tools; + sourceTree = ""; + }; + 8A1DFF502B9EB4F800B735FF /* Example */ = { + isa = PBXGroup; + children = ( + 8A1DFF512B9EB4F800B735FF /* AppDelegate.swift */, + 8A1DFF552B9EB4F800B735FF /* ViewController.swift */, + 8A34B9262BA2AB66000F66BD /* ConnectViewController.swift */, + 8A76B6082BA84C2B0016F2AB /* AbilityViewController.swift */, + 8A878FDF2BA93CF1008C7F26 /* Datas.swift */, + 8A34B92A2BA2D446000F66BD /* BaseViewController.swift */, + 8A34B9282BA2AB86000F66BD /* LogViewController.swift */, + 8A1DFF572B9EB4F900B735FF /* Main.storyboard */, + 8A1DFF5A2B9EB4F900B735FF /* Assets.xcassets */, + 8A1DFF5C2B9EB4F900B735FF /* LaunchScreen.storyboard */, + 8A1DFF5F2B9EB4F900B735FF /* Info.plist */, + ); + path = Example; + sourceTree = ""; + }; + 8A9F6ABF2BA04B5100DA520F /* Models */ = { + isa = PBXGroup; + children = ( + 8A0A39CC2B980D53006A3B18 /* IBPeripheral.swift */, + 8A87FBB22BAA7F3900096761 /* IBLanguage.swift */, + 8A79D2282BA43F5A0096A98C /* IBResponse.swift */, + 8A65F95E2BABEC4D005C1EA4 /* IBClock.swift */, + 18E7AC912BF44C6800CB9393 /* IBSleep.swift */, + 8A65F9642BAC271B005C1EA4 /* IBScreen.swift */, + 18E7AC932BF4B31000CB9393 /* IBWater.swift */, + 8A65F9622BAC1018005C1EA4 /* IBTargetStep.swift */, + 8A87FBB42BAA85FB00096761 /* IBTrainingData.swift */, + 8A34B92C2BA2FA02000F66BD /* IBManufacturer.swift */, + 8A34B9242BA2A069000F66BD /* IBWatchInfo.swift */, + 184431312BF3720E00546E4E /* IBOtherTarget.swift */, + 184B94CA2BF606CC0042BEB3 /* IBTrainTarget.swift */, + 18E7AC952BF5E39900CB9393 /* IBHeartRate.swift */, + 18993AA12C073FED006742D2 /* IBBloodOxygen.swift */, + 180B01972BFC831300524729 /* IBHistoryHeartRate.swift */, + 189C158C2C05F58A00676A80 /* IBHistoryBloodOxygen.swift */, + 189C158E2C05F85200676A80 /* IBHistoryStep.swift */, + 189C15902C05FBA100676A80 /* IBHistoryBurning.swift */, + 189C15922C05FFA600676A80 /* IBHistoryStand.swift */, + 189C15942C05FFC700676A80 /* IBHistoryCalorie.swift */, + 189C15962C05FFEE00676A80 /* IBHistoryDistance.swift */, + 180B019D2BFC9CF400524729 /* IBHistoryBaseTraining.swift */, + 18C9589E2C086A9D006A5DE8 /* IBHistorySleep.swift */, + 18C9589C2C08600C006A5DE8 /* IBHistoryGps.swift */, + 1849DC8E2BEC8007002C2D2D /* IBVibrateSound.swift */, + 18EC6E272BFF4C6D00757CA8 /* IBPhoneInfo.swift */, + 1859DF9F2BFF5A2700112E8C /* IBSendTime.swift */, + 189C15882C05E0CD00676A80 /* IBTarinState.swift */, + 189C158A2C05F27C00676A80 /* IBAbout.swift */, + 18EFF59A2C080F14001B1E0E /* IBUserInfo.swift */, + 18C9589A2C082FA7006A5DE8 /* IBWeather.swift */, + 180CE2642C0D728F00A7006E /* IBAddressBook.swift */, + 1849DC902BECD131002C2D2D /* IBCode.swift */, + ); + path = Models; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 8A0A39B62B980BEF006A3B18 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A0A39BF2B980BEF006A3B18 /* IOTBluetooth.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 8A0A39BA2B980BEF006A3B18 /* IOTBluetooth */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8A0A39C22B980BEF006A3B18 /* Build configuration list for PBXNativeTarget "IOTBluetooth" */; + buildPhases = ( + 8A0A39B62B980BEF006A3B18 /* Headers */, + 8A0A39B72B980BEF006A3B18 /* Sources */, + 8A0A39B82B980BEF006A3B18 /* Frameworks */, + 8A0A39B92B980BEF006A3B18 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = IOTBluetooth; + productName = IOTBluetooth; + productReference = 8A0A39BB2B980BEF006A3B18 /* IOTBluetooth.framework */; + productType = "com.apple.product-type.framework"; + }; + 8A1DFF4E2B9EB4F800B735FF /* Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8A1DFF622B9EB4F900B735FF /* Build configuration list for PBXNativeTarget "Example" */; + buildPhases = ( + 8A1DFF4B2B9EB4F800B735FF /* Sources */, + 8A1DFF4C2B9EB4F800B735FF /* Frameworks */, + 8A1DFF4D2B9EB4F800B735FF /* Resources */, + 8A9F6AC62BA05CB500DA520F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 8A9F6AC52BA05CB500DA520F /* PBXTargetDependency */, + ); + name = Example; + productName = Example; + productReference = 8A1DFF4F2B9EB4F800B735FF /* Example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 8A0A39B22B980BEF006A3B18 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1500; + LastUpgradeCheck = 1500; + TargetAttributes = { + 8A0A39BA2B980BEF006A3B18 = { + CreatedOnToolsVersion = 15.0; + LastSwiftMigration = 1500; + }; + 8A1DFF4E2B9EB4F800B735FF = { + CreatedOnToolsVersion = 15.0; + }; + }; + }; + buildConfigurationList = 8A0A39B52B980BEF006A3B18 /* Build configuration list for PBXProject "IOTBluetooth" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 8A0A39B12B980BEF006A3B18; + productRefGroup = 8A0A39BC2B980BEF006A3B18 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8A0A39BA2B980BEF006A3B18 /* IOTBluetooth */, + 8A1DFF4E2B9EB4F800B735FF /* Example */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8A0A39B92B980BEF006A3B18 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8A1DFF4D2B9EB4F800B735FF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A1DFF5E2B9EB4F900B735FF /* LaunchScreen.storyboard in Resources */, + 8A1DFF5B2B9EB4F900B735FF /* Assets.xcassets in Resources */, + 8A1DFF592B9EB4F900B735FF /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8A0A39B72B980BEF006A3B18 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A79D2292BA43F5A0096A98C /* IBResponse.swift in Sources */, + 189C15932C05FFA600676A80 /* IBHistoryStand.swift in Sources */, + 1849DC8F2BEC8007002C2D2D /* IBVibrateSound.swift in Sources */, + 180CE2652C0D728F00A7006E /* IBAddressBook.swift in Sources */, + 8A878FE22BA9444C008C7F26 /* IBParameter.swift in Sources */, + 184431322BF3720E00546E4E /* IBOtherTarget.swift in Sources */, + 189C158B2C05F27C00676A80 /* IBAbout.swift in Sources */, + 189C15972C05FFEE00676A80 /* IBHistoryDistance.swift in Sources */, + 180B019E2BFC9CF400524729 /* IBHistoryBaseTraining.swift in Sources */, + 8A87FBB52BAA85FB00096761 /* IBTrainingData.swift in Sources */, + 8A878FE42BA94D09008C7F26 /* IBChecker.swift in Sources */, + 189C15892C05E0CD00676A80 /* IBTarinState.swift in Sources */, + 8A76B60B2BA851730016F2AB /* IBParser.swift in Sources */, + 18EFF59B2C080F14001B1E0E /* IBUserInfo.swift in Sources */, + 8A65F9612BAC0810005C1EA4 /* IBSimulateParser.swift in Sources */, + 180B01982BFC831300524729 /* IBHistoryHeartRate.swift in Sources */, + 189C158D2C05F58A00676A80 /* IBHistoryBloodOxygen.swift in Sources */, + 8A79D2272BA433330096A98C /* IBNotify.swift in Sources */, + 8A0A39D42B980E93006A3B18 /* Any.swift in Sources */, + 1849DC912BECD131002C2D2D /* IBCode.swift in Sources */, + 8A34B92D2BA2FA02000F66BD /* IBManufacturer.swift in Sources */, + 184B94CB2BF606CC0042BEB3 /* IBTrainTarget.swift in Sources */, + 8A79D2252BA4278E0096A98C /* IBSender.swift in Sources */, + 18C9589D2C08600C006A5DE8 /* IBHistoryGps.swift in Sources */, + 189C15912C05FBA100676A80 /* IBHistoryBurning.swift in Sources */, + 8A9F6ABD2BA0463D00DA520F /* CRC16.swift in Sources */, + 18E7AC942BF4B31000CB9393 /* IBWater.swift in Sources */, + 8A5822CF2BA1A67700590AB6 /* IBAbility.swift in Sources */, + 8A65F9652BAC271B005C1EA4 /* IBScreen.swift in Sources */, + 1859DFA02BFF5A2700112E8C /* IBSendTime.swift in Sources */, + 8A65F9632BAC1018005C1EA4 /* IBTargetStep.swift in Sources */, + 8A34B9252BA2A069000F66BD /* IBWatchInfo.swift in Sources */, + 8A0A39D62B980EC9006A3B18 /* IBPeripheralUUID.swift in Sources */, + 189C15952C05FFC700676A80 /* IBHistoryCalorie.swift in Sources */, + 8A9F6AC12BA04BE100DA520F /* IBManager.swift in Sources */, + 18EC6E282BFF4C6D00757CA8 /* IBPhoneInfo.swift in Sources */, + 18C9589F2C086A9D006A5DE8 /* IBHistorySleep.swift in Sources */, + 8A65F95F2BABEC4D005C1EA4 /* IBClock.swift in Sources */, + 8A0A39D22B980E4C006A3B18 /* JSON.swift in Sources */, + 18E7AC962BF5E39900CB9393 /* IBHeartRate.swift in Sources */, + 18C9589B2C082FA7006A5DE8 /* IBWeather.swift in Sources */, + 8A0A39D82B980F58006A3B18 /* UTF8.swift in Sources */, + 18E7AC922BF44C6800CB9393 /* IBSleep.swift in Sources */, + 8A0A39C62B980C88006A3B18 /* IBluetooth.swift in Sources */, + 8A0A39CB2B980CFC006A3B18 /* Logger.swift in Sources */, + 189C158F2C05F85200676A80 /* IBHistoryStep.swift in Sources */, + 8A5822D12BA1C80700590AB6 /* LRC.swift in Sources */, + 8A0A39DA2B981037006A3B18 /* Date.swift in Sources */, + 18993AA22C073FED006742D2 /* IBBloodOxygen.swift in Sources */, + 8A0A39CD2B980D53006A3B18 /* IBPeripheral.swift in Sources */, + 8A87FBB32BAA7F3900096761 /* IBLanguage.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8A1DFF4B2B9EB4F800B735FF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A878FE02BA93CF1008C7F26 /* Datas.swift in Sources */, + 8A34B92B2BA2D446000F66BD /* BaseViewController.swift in Sources */, + 8A76B6092BA84C2B0016F2AB /* AbilityViewController.swift in Sources */, + 8A34B9272BA2AB66000F66BD /* ConnectViewController.swift in Sources */, + 8A1DFF562B9EB4F800B735FF /* ViewController.swift in Sources */, + 8A1DFF522B9EB4F800B735FF /* AppDelegate.swift in Sources */, + 8A34B9292BA2AB86000F66BD /* LogViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 8A9F6AC52BA05CB500DA520F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8A0A39BA2B980BEF006A3B18 /* IOTBluetooth */; + targetProxy = 8A9F6AC42BA05CB500DA520F /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 8A1DFF572B9EB4F900B735FF /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 8A1DFF582B9EB4F900B735FF /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 8A1DFF5C2B9EB4F900B735FF /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 8A1DFF5D2B9EB4F900B735FF /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 8A0A39C02B980BEF006A3B18 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 8A0A39C12B980BEF006A3B18 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 8A0A39C32B980BEF006A3B18 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = M33X987285; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.thisiot.IOTBluetooth; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 8A0A39C42B980BEF006A3B18 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = M33X987285; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.thisiot.IOTBluetooth; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + 8A1DFF602B9EB4F900B735FF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1001; + DEVELOPMENT_TEAM = M33X987285; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = Example/Info.plist; + INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "扫描智能手表需要开启蓝牙功能"; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIUserInterfaceStyle = Light; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = com.thisiot.IOTBluetooth.Example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 8A1DFF612B9EB4F900B735FF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1001; + DEVELOPMENT_TEAM = M33X987285; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = Example/Info.plist; + INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "扫描智能手表需要开启蓝牙功能"; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UIUserInterfaceStyle = Light; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0.0; + PRODUCT_BUNDLE_IDENTIFIER = com.thisiot.IOTBluetooth.Example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 8A0A39B52B980BEF006A3B18 /* Build configuration list for PBXProject "IOTBluetooth" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8A0A39C02B980BEF006A3B18 /* Debug */, + 8A0A39C12B980BEF006A3B18 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8A0A39C22B980BEF006A3B18 /* Build configuration list for PBXNativeTarget "IOTBluetooth" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8A0A39C32B980BEF006A3B18 /* Debug */, + 8A0A39C42B980BEF006A3B18 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8A1DFF622B9EB4F900B735FF /* Build configuration list for PBXNativeTarget "Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8A1DFF602B9EB4F900B735FF /* Debug */, + 8A1DFF612B9EB4F900B735FF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 8A0A39B22B980BEF006A3B18 /* Project object */; +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/IDEFindNavigatorScopes.plist b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/IDEFindNavigatorScopes.plist new file mode 100644 index 0000000..5dd5da8 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/IDEFindNavigatorScopes.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/project.xcworkspace/xcuserdata/apple.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..943a3449bd053fbf202a4ce4cc1946178813377d GIT binary patch literal 213692 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 + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcuserdata/apple.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcuserdata/apple.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..c296514 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcuserdata/apple.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..d0682b2 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcuserdata/apple.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,27 @@ + + + + + SchemeUserState + + Example.xcscheme_^#shared#^_ + + orderHint + 1 + + IOTBluetooth.xcscheme_^#shared#^_ + + orderHint + 0 + + + SuppressBuildableAutocreation + + 8A0A39BA2B980BEF006A3B18 + + primary + + + + + diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcuserdata/williamtrillgates.xcuserdatad/xcschemes/xcschememanagement.plist b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcuserdata/williamtrillgates.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..8d574d1 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth.xcodeproj/xcuserdata/williamtrillgates.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,19 @@ + + + + + SchemeUserState + + Example.xcscheme_^#shared#^_ + + orderHint + 1 + + IOTBluetooth.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBAbility.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBAbility.swift new file mode 100644 index 0000000..655ac55 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBAbility.swift @@ -0,0 +1,505 @@ +// +// IBAbility.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/13. +// + +import Foundation + +/// 功能指令 +public class IBAbility { + + /// 命令类型 + let type: `Type` + + /// 命令ID + private(set) var id: UInt8 = 0x0 + + /// 指定解析器 + private(set) var parser: IBParser.Type! + + /// 指定参数检查器 + private(set) var checker: IBChecker.Type! + + /// 服务特征 + private(set) var characteristicUUID: String! + + private init(_ type: `Type`) { + self.type = type + } + + private func id(_ value: UInt8) -> Self { + self.id = value + return self + } + + private func parser(_ parser: T.Type) -> Self { + self.parser = parser + return self + } + + private func checker(_ checker: T.Type) -> Self { + self.checker = checker + return self + } + + private func characteristic(_ uuid: String) -> Self { + characteristicUUID = uuid + return self + } + + /// 短指令(不大于20个字节) + private static var short: IBAbility { IBAbility(.short).characteristic(writeCharacteristicUUID) } + /// 长指令(大于20个字节) + private static var long: IBAbility { IBAbility(.long).characteristic(writeBigCharacteristicUUID) } + /// 文件指令(用来发送文件,比如表盘、MP3、OTA等) + private static var file: IBAbility { IBAbility(.file).characteristic(writeFileCharacteristicUUID) } + + public var description: String { "[\(String(format: "0x%02X, 0x%02X", type.rawValue, id))] \(characteristicUUID!)" } + + func isAnswer(_ data: Data) -> Bool { + let answerTypeValue = data.bytes[1] + let answerID = data.bytes[2] + + return type.rawValue == answerTypeValue && id == answerID + } +} + +extension IBAbility { + enum `Type`: UInt8 { + /// 短指令 + case short = 0x01 + /// 长指令 + case long = 0x02 + /// 文件指令(用来发送文件,比如表盘、MP3、OTA等) + case file = 0x04 + } +} + +public extension IBAbility { + /// 设置用户数据 + /// - Parameter userInfo: see ``IBUserInfo`` + static let userData = IBAbility.long.id(0x01).parser(IBGeneralParser.self).checker(IBUserInfoChecker.self) + + /// 关于本机内容 + static let about = IBAbility.short.id(0x03).parser(IBAblutParser.self) + + /// 切换表盘 + /// - Parameter dialID:Int + /// 表盘id + static let switchDial = IBAbility.short.id(0x02).parser(IBSwitchDialParser.self).checker(IBSwitchDialChecker.self) + + /// APP删除表盘 + /// - Parameter dialID:Int \ + /// 表盘id + static let deleteDial = IBAbility.short.id(0x1B).parser(IBGeneralParser.self).checker(IBSwitchDialChecker.self) + + /// 发送当前表盘ID + /// - Returns: Int \ + /// Read from ``IBResponse``.value + static let fetchCurrentDialId = IBAbility.short.id(0x17).parser(IBFetchCurrentDialParser.self) + + /// 查找手表 + /// - Parameter action: + /// 0 = 停止查找 \ + /// 1 = 开始查找 + static let find = IBAbility.short.id(0x04).parser(IBFindParser.self).checker(IBActionChecker.self) + + /// 开关消息推送功能 + /// - Parameter action: + /// 0 = 关闭消息 \ + /// 1 = 开启消息 + static let message = IBAbility.short.id(0x08).parser(IBGeneralParser.self).checker(IBActionChecker.self) + + /// 开启指定运动模式 + /// - Parameter motionMode: see ``IBMotionMode`` + static let startSport = IBAbility.short.id(0x0A).parser(IBGeneralParser.self).checker(IBSportChecker.self) + + /// 结束运动模式 + static let endSport = IBAbility.short.id(0x0B).parser(IBGeneralParser.self) + + /// 设置训练实时数据采样频率 + /// - Parameter value:Int \ + /// 单位(秒) + static let trainFrequency = IBAbility.short.id(0x14).parser(IBGeneralParser.self).checker(IBTrainFrequencyChecker.self) + + /// 训练暂停/恢复 + /// - Parameter action: + /// 0 = 暂停 \ + /// 1 = 恢复 + static let trainPauseResume = IBAbility.short.id(0x16).parser(IBGeneralParser.self).checker(IBActionChecker.self) + + /// 设置语言 + /// - Parameter language: see ``IBLanguage`` + static let language = IBAbility.short.id(0x0E).parser(IBGeneralParser.self).checker(IBLanguageChecker.self) + + /// 获取手表心率参数 + /// - Returns: ``IBHeartRate`` \ + /// Read from ``IBResponse``.value + static let fetchHeartRate = IBAbility.short.id(0x1E).parser(IBHeartRateParser.self) + + /// 设置手表心率参数 + /// - Parameter heartRate: see ``IBHeartRate`` + static let heartRate = IBAbility.long.id(0x12).parser(IBGeneralParser.self).checker(IBHeartRateChecker.self) + + /// 获取手表血氧设置 + /// - Returns: ``IBBloodOxygen`` \ + /// Read from ``IBResponse``.value + static let fetchBloodOxygen = IBAbility.short.id(0x1F).parser(IBBloodOxygenParser.self) + + /// 设置手表血氧参数 + /// - Parameter heartRate: see ``IBBloodOxygen`` + static let bloodOxygen = IBAbility.long.id(0x13).parser(IBGeneralParser.self).checker(IBBloodOxygenChecker.self) + + /// 获取实时心率(实时训练数据) + /// - Returns: ``IBTrainingData`` \ + /// Read from ``IBResponse``.value + static let currentHeartRate = IBAbility.short.id(0x0F).parser(IBTrainingDataParser.self) + + /// 开启/关闭自动获取实时心率 + /// - Parameter action: + /// 0 = 关闭自动获取 \ + /// 1 = 开启自动获取 + static let heartRateMode = IBAbility.short.id(0x11).parser(IBGeneralParser.self).checker(IBActionChecker.self) + + /// 设置最高心率提醒 + /// - Parameter value:Int \ + /// 最高不超过 250 ,如果需要关闭最高心率提醒,可将最高心率设为255,开启则设正常值即可。 + static let heartRateHigh = IBAbility.short.id(0x15).parser(IBGeneralParser.self).checker(IBHeartRateHighChecker.self) + + /// 手势拍照 + /// - Parameter action: + /// 0 = 退出手势拍照 \ + /// 1 = 进入手势拍照 + static let takePhoto = IBAbility.short.id(0x23).parser(IBTakePhotoParser.self).checker(IBActionChecker.self) + + /// 恢复出厂设置 + static let restore = IBAbility.short.id(0x25).parser(IBGeneralParser.self) + + /// 重新启动 + static let reboot = IBAbility.short.id(0x26).parser(IBGeneralParser.self) + + /// 关机 + static let shutdown = IBAbility.short.id(0x27).parser(IBGeneralParser.self) + + /// 获取手表电池电量。 + /// - Returns: Int \ + /// Read from ``IBResponse``.value + static let fetchBattery = IBAbility.short.id(0x07).parser(IBBatteryParser.self) + + /// 获取闹钟设置 + /// - Returns: ``[IBClockInfo]`` \ + /// Read from ``IBResponse``.items + static let fetchClock = IBAbility.short.id(0x01).parser(IBClockParser.self) + + /// 发送闹钟设置 + /// - Parameter clock: see ``IBClock`` + static let setClock = IBAbility.long.id(0x21).parser(IBSetClockParser.self).checker(IBClockChecker.self) + + /// 获取所有表盘UID + /// - Returns: [Int] \ + /// Read from ``IBResponse``.items + static let fetchDials = IBAbility.short.id(0x2A).parser(IBFetchDialsParser.self) + + /// APP获取某表盘ID是否已安装 + /// - Parameter value:Int + /// - Returns: Int + /// 0 = 未安装 \ + /// 1 = 已安装 \ + /// Read from ``IBResponse``.value + static let checkDialID = IBAbility.long.id(0x0D).parser(IBCheckDialParser.self).checker(IBSwitchDialChecker.self) + + /// 获取当前手表状态 + /// - Returns: Int \ + /// 0 = 空闲状态 \ + /// 9 = USB存储状态 \ + /// 10 = 运动训练状态 \ + /// Read from ``IBResponse``.value + static let fetchWatchState = IBAbility.short.id(0x19).parser(IBWatchStateParser.self) + + /// 获取手表屏幕参数 + /// - Returns: ``IBScreen`` \ + /// Read from ``IBResponse``.value + static let fetchScreen = IBAbility.short.id(0x1A).parser(IBScreenParser.self) + + /// 设置手表屏幕参数 + /// - Parameter screen: see ``screen`` + static let screen = IBAbility.long.id(0x0E).parser(IBGeneralParser.self).checker(IBScreenChecker.self) + + /// 获取手表声音与震动参数 + /// - Returns: ``IBVibrateSound`` \ + /// Read from ``IBResponse``.value + static let fetchVibrateSound = IBAbility.short.id(0x1C).parser(IBVibrateSoundParser.self) + + /// APP设置手表声音与震动参数 + /// - Parameter vibrateSound: see ``IBVibrateSound`` + static let vibrateSound = IBAbility.long.id(0x0F).parser(IBGeneralParser.self).checker(IBVibrateSoundChecker.self) + + + /// 设置手表辅助功能参数 + /// - Parameter auxiliary: see ``IBAuxiliary`` + static let auxiliary = IBAbility.long.id(0x11).parser(IBGeneralParser.self).checker(IBAuxiliaryChecker.self) + + /// 获取手表辅助功能参数 + /// - Returns: IBAuxiliary \ + /// Read from ``IBResponse``.value + static let fetchAuxiliary = IBAbility.short.id(0x1D).parser(IBFetchAuxiliaryParser.self) + + /// 获取目标步数设置 + /// - Returns: ``IBTargetStep`` \ + /// Read from ``IBResponse``.value + static let fetchTargetStep = IBAbility.short.id(0x2B).parser(IBTargetStepParser.self) + + /// 设置目标步数 + /// - Parameter targetStep: see ``IBTrainTarget`` + static let targetStep = IBAbility.long.id(0x16).parser(IBGeneralParser.self).checker(IBTargetStepChecker.self) + + /// 获取其他目标设置 + /// - Returns: ``IBOtherTarget`` \ + /// Read from ``IBResponse``.value + static let fetchOtherTarget = IBAbility.short.id(0x2C).parser(IBOtherTargetParser.self) + + /// 设置其他目标 + /// - Parameter targetOther: see ``IBOtherTarget`` + static let targetOther = IBAbility.long.id(0x17).parser(IBGeneralParser.self).checker(IBOtherTargetChecker.self) + + /// 获取睡眠设置 + /// - Returns: ``IBSleep`` \ + /// Read from ``IBResponse``.value + static let fetchSleep = IBAbility.short.id(0x29).parser(IBSleepParser.self) + + /// 设置睡眠 + /// - Parameter sleep: see ``IBSleep`` + static let sleep = IBAbility.long.id(0x15).parser(IBGeneralParser.self).checker(IBSleepChecker.self) + + /// 获取手表喝水提醒设置 + /// - Returns: Int \ + /// 0 = 关闭 \ + /// 1 = 开启 \ + /// Read from ``IBResponse``.value + static let fetchWater = IBAbility.short.id(0x24).parser(IBWaterParser.self) + + /// 设置喝水提醒 + /// - Parameter water: see ``IBWater`` + static let water = IBAbility.long.id(0x14).parser(IBGeneralParser.self).checker(IBWaterChecker.self) + + /// 设置手表公英制单位 + /// - Parameter value:Int \ + /// 0 = 公制 \ + /// 1 = 英制 + static let unit = IBAbility.short.id(0x28).parser(IBGeneralParser.self).checker(IBValueChecker.self) + + /// 设置训练目标 + /// - Parameter trainTarget:see ``IBTrainTarget`` + static let trainTarget = IBAbility.long.id(0x04).parser(IBGeneralParser.self).checker(IBTrainTargetChecker.self) + + // MARK: - 同步数据 + /// 同步心率历史数据 + /// - Parameter value: + /// 0 = 今天 \ + /// 1 = 前1天 \ + /// 2 = 前2天 \ + /// 3 = 前3天 \ + /// 依此类推,取值范围0~29。 + /// - Returns: [IBHistoryHeartRateItem] \ + /// Read from ``IBResponse``.items + static let syncHeartRate = IBAbility.short.id(0x40).parser(IBSyncHeartRateParser.self).checker(IBValueChecker.self) + + /// 同步血氧历史数据 + /// - Parameter value: + /// 0 = 今天 \ + /// 1 = 前1天 \ + /// 2 = 前2天 \ + /// 3 = 前3天 \ + /// 依此类推,取值范围0~29。 + /// - Returns: [IBHistoryBloodOxygenItem] \ + /// Read from ``IBResponse``.items + static let syncBloodOxygen = IBAbility.short.id(0x41).parser(IBSyncBloodOxygenParser.self).checker(IBValueChecker.self) + + /// 同步历史步数 + /// - Parameter value: + /// 0 = 今天 \ + /// 1 = 前1天 \ + /// 2 = 前2天 \ + /// 3 = 前3天 \ + /// 依此类推,取值范围0~29。 + /// - Returns: [IBHistoryStepItem] \ + /// Read from ``IBResponse``.items + static let syncStepCount = IBAbility.short.id(0x43).parser(IBSyncStepParser.self).checker(IBValueChecker.self) + + /// 同步燃脂时间历史数据 + /// - Parameter value: + /// 0 = 今天 \ + /// 1 = 前1天 \ + /// 2 = 前2天 \ + /// 3 = 前3天 \ + /// 依此类推,取值范围0~29。 + /// - Returns: [IBHistoryBurningItem] \ + /// Read from ``IBResponse``.items + static let syncFatBurning = IBAbility.short.id(0x44).parser(IBSyncBurningParser.self).checker(IBValueChecker.self) + + /// 同步站立历史数据 + /// - Parameter value: + /// 0 = 今天 \ + /// 1 = 前1天 \ + /// 2 = 前2天 \ + /// 3 = 前3天 \ + /// 依此类推,取值范围0~29。 + /// - Returns: [IBHistoryStandItem] \ + /// Read from ``IBResponse``.items + static let syncStand = IBAbility.short.id(0x45).parser(IBSyncStandParser.self).checker(IBValueChecker.self) + + /// 同步卡路里历史数据 + /// - Parameter value: + /// 0 = 今天 \ + /// 1 = 前1天 \ + /// 2 = 前2天 \ + /// 3 = 前3天 \ + /// 依此类推,取值范围0~29。 + /// - Returns: [IBHistoryCalorieItem] \ + /// Read from ``IBResponse``.items + static let syncCalorie = IBAbility.short.id(0x46).parser(IBSyncCalorieParser.self).checker(IBValueChecker.self) + + /// 同步距离历史数据 + /// - Parameter value: + /// 0 = 今天 \ + /// 1 = 前1天 \ + /// 2 = 前2天 \ + /// 3 = 前3天 \ + /// 依此类推,取值范围0~29。 + /// - Returns: [IBHistoryDistanceItem] \ + /// Read from ``IBResponse``.items + static let syncDistance = IBAbility.short.id(0x47).parser(IBSyncDistanceParser.self).checker(IBValueChecker.self) + + /// 同步基础训练历史数据 + /// - Parameter value: + /// 0 = 今天 \ + /// 1 = 前1天 \ + /// 2 = 前2天 \ + /// 3 = 前3天 \ + /// 依此类推,取值范围0~29。 + /// - Returns: [IBHistoryBaseTrainingItem] \ + /// Read from ``IBResponse``.items + static let syncTrain = IBAbility.short.id(0x49).parser(IBSyncTrainParser.self).checker(IBValueChecker.self) + + /// 同步睡眠历史数据 + /// - Parameter value: + /// 0 = 今天 \ + /// 1 = 前1天 \ + /// 2 = 前2天 \ + /// 3 = 前3天 \ + /// 依此类推,取值范围0~29。 + /// - Returns: [IBHistorySleepItem] \ + /// Read from ``IBResponse``.items + static let syncSleep = IBAbility.short.id(0x4B).parser(IBSyncSleepParser.self).checker(IBValueChecker.self) + + /// 同步路径坐标集历史数据 + /// - Parameter value:开始训练时间戳 + /// - Returns: [IBHistoryGpsItem] \ + /// Read from ``IBResponse``.items + static let syncGPS = IBAbility.long.id(0x4F).parser(IBSyncGpsParser.self).checker(IBSyncGpsChecker.self) + + /// 发送同步数据结束消息 + static let sendSyncEnd = IBAbility.short.id(0x2E).parser(IBGeneralParser.self) + + /// 获取SD卡剩余空间 + /// - Returns: Int \ + /// Read from ``IBResponse``.value + static let disk = IBAbility.short.id(0x05).parser(IBDiskParser.self) + + /// 发送手机信息 + /// - Returns: Int \ + /// 0 = 指令校验失败 \ + /// 1 = 手表未与任何手机绑定 \ + /// 2 = 手表已与该手机绑定 \ + /// 3 = 手表已与其他手机绑定 \ + /// Read from ``IBResponse``.value + static let sendPhone = IBAbility.long.id(0x10).parser(IBSendPhoneParser.self).checker(IBSendPhoneChecker.self) + + /// 发送当前时间 + /// - Parameter sendTime: see ``IBSendTime`` + static let sendTime = IBAbility.long.id(0x02).parser(IBGeneralParser.self).checker(IBSendTimeChecker.self) + + /// 发送解除配对消息 + static let unpair = IBAbility.short.id(0x10).parser(IBGeneralParser.self) + + /// 发送取消解除配对消息 + static let sendUnpair = IBAbility.short.id(0x2D).parser(IBGeneralParser.self) + + /// 发送天气数据 + /// - Parameter weather: see ``IBWeather`` + static let sendWeather = IBAbility.long.id(0x20).parser(IBGeneralParser.self).checker(IBWeatherChecker.self) + + /// APP发送通讯录 + /// - Parameter addressBook: see ``IBAddressBook`` + /// 0~20 + static let addressBook = IBAbility.long.id(0x0B).parser(IBGeneralParser.self).checker(IBAddressBookChecker.self) + +// /// 撤销当前文件传输 +// static let revokeFileSend = IBAbility.short.id(0x20).parser(IBGeneralParser.self).checker(IBFileChecker.self) +// /// 获取指定类型所有文件(当前只支持 MP3 和 表盘) +// static let fetchFiles = IBAbility.short.id(0x21).parser(IBGeneralParser.self).checker(IBFileChecker.self) +// /// 删除指定类型所有文件(当前只支持 MP3 和 表盘) +// static let deleteFiles = IBAbility.short.id(0x22).parser(IBGeneralParser.self).checker(IBFileChecker.self) +// +// +} + +extension IBAbility { + + +// +// // MARK: - Fetch 获取数据 + +// /// 撤销当前文件传输 +// static let revokeFileTransfer = IBAbility.short.id(0x20) + +// /// 删除指定文件(数据包为文件索引号) +// static let deleteFile = IBAbility.long.id(0x22) + + +// +// +// /// 发送OTA文件信息 +// static let ota = IBAbility.file.id(0x20) +// /// 发送MP3文件信息 +// static let mp3 = IBAbility.file.id(0x21) +// /// 发送表盘文件信息 +// static let dial = IBAbility.file.id(0x22) +// /// APP发送文件校验码 +// static let fileCheckCode = IBAbility.file.id(0x23) +// ///  发送单个表盘文件信息 +// static let dialInfo = IBAbility.file.id(0x24) +// /// 发送EPO文件信息(04,25) +// static let epo = IBAbility.file.id(0x28) +// +// +// // MARK: - 私有 + +// +// /// 获取当前数据(jSON格式)【不使用】 +// static let var681B9E92 = IBAbility.short.id(0x06) +// /// 开关多媒体功能(播放手机音乐、通话等)【不使用】 +// static let var681254AC = IBAbility.short.id(0x09) +// /// 进入工厂测试模式【不使用】 +// static let varD3D21DC8 = IBAbility.short.id(0x30) +// /// 同步压力历史数据【不使用】 +// static let varA2A25CD8 = IBAbility.short.id(0x42) +// +// /// 修改手表蓝牙名称【未使用】 +// static let var8FA46D73 = IBAbility.long.id(0x03) +// /// 同步基础训练实时心率记录【不使用】 +// static let var6CFBF636 = IBAbility.long.id(0x4B) +// /// 同步当天任意时间之后的基础训练记录【不使用】 +// static let var4D0264A9 = IBAbility.long.id(0x4D) +// /// APP发送靶心率区间值给手表(暂不用) +// static let var7EE39B21 = IBAbility.long.id(0x0C) +// +// /// 发送模块升级信息(04,26)【不使用】 +// static let var1FFA68BC = IBAbility.file.id(0x26) +// ///  发送模块单个文件升级信息(04,27)【不使用】 +// static let var9AD723C3 = IBAbility.file.id(0x27) +// /// 发送EPO文件信息(04,25)(旧版,不用) +// static let var4F791698 = IBAbility.file.id(0x25) +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBChecker.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBChecker.swift new file mode 100644 index 0000000..43f0f55 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBChecker.swift @@ -0,0 +1,291 @@ +// +// IBChecker.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/19. +// + +import Foundation + +/// 参数检查器协议 +protocol IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] +} + +extension Array where Element == IBParameter { + subscript(_ key: IBKey) -> Element? { + self.filter({ $0.key == key }).first + } +} + +struct IBSwitchDialChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .dialID(dailID) = parameters[.dialID] else { fatalError("缺少参数: dialID") } + Logger.log(dailID) + return dailID.byte2 + } +} + +struct IBActionChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .action(action) = parameters[.action] else { fatalError("缺少参数: action") } + Logger.log(action) + return [action.byte] + } +} + +struct IBSportChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .motionMode(mode) = parameters[.motionMode] else { fatalError("缺少参数: motionMode") } + Logger.log(mode) + return [mode.rawValue.byte] + } +} + +struct IBLanguageChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .language(value) = parameters[.language] else { fatalError("缺少参数: language") } + Logger.log(value) + return [value.rawValue.byte] + } +} +struct IBAuxiliaryChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .auxiliary(value) = parameters[.auxiliary] else { fatalError("缺少参数: auxiliary") } + Logger.log(value) + return [value.rawValue.byte] + } +} +struct IBValueChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .value(value) = parameters[.value] else { fatalError("缺少参数: value") } + Logger.log(value) + return [value.byte] + } +} + +struct IBHeartRateHighChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .value(value) = parameters[.value] else { fatalError("缺少参数: value") } + Logger.log(value) + return [(value == 0 ? 255 : value).byte] + } +} + +struct IBTrainFrequencyChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .value(value) = parameters[.value] else { fatalError("缺少参数: value") } + Logger.log(value) + return value.byte2 + } +} + +struct IBSyncGpsChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .value(value) = parameters[.value] else { fatalError("缺少参数: value") } + Logger.log(value) + return value.byte4 + } +} + +struct IBFileChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .file(value) = parameters[.file] else { fatalError("缺少参数: file") } + Logger.log(value) + return [value.rawValue.byte] + } +} + +struct IBTargetStepChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .targetStep(value) = parameters[.targetStep] else { fatalError("缺少参数: targetStep") } + Logger.log(value.description) + return value.value.byte4 + [value.ring.byte] + [value.vibrate.byte] + [value.notice.byte] + } +} + +struct IBSleepChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .sleep(value) = parameters[.sleep] else { fatalError("缺少参数: sleep") } + Logger.log(value.description) + if value.sleepTimeSet == 1,let sleep = value.sleepTime,let getUp = value.getUpTime { + return [value.sleepTimeSet.byte] + [sleep.hour.byte] + [sleep.minute.byte] + [getUp.hour.byte] + [getUp.minute.byte] + [value.alertBeforeMin20.byte] + } + return [value.sleepTimeSet.byte] + } +} +struct IBWaterChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .water(value) = parameters[.water] else { fatalError("缺少参数: water") } + Logger.log(value.description) + + var data = [value.alertState.byte] + if value.alertState == 1 { + data = data + [value.alertType.byte] + value.drinkingValue.byte2 + [value.start.hour.byte] + [value.start.minute.byte] + } + if value.alertType == 1 { + data = data + [value.end.hour.byte] + [value.end.minute.byte] + [value.frequency.rawValue.byte] + } + return data + } +} + +struct IBHeartRateChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .heartRate(value) = parameters[.heartRate] else { fatalError("缺少参数: heartRate") } + Logger.log(value.description) + var data = [value.rate.rawValue.byte] + [value.state.byte] + if value.state == 1 { + data = data + [value.higherOrLower.byte] + [value.value.byte] + } + return data + } +} +struct IBBloodOxygenChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .bloodOxygen(value) = parameters[.bloodOxygen] else { fatalError("缺少参数: heartRate") } + Logger.log(value.description) + var data = [value.rate.rawValue.byte] + [value.state.byte] + if value.state == 1 { + data = data + [value.value.byte] + } + return data + } +} +struct IBScreenChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .screen(value) = parameters[.screen] else { fatalError("缺少参数: screen") } + Logger.log(value.description) + let data = [value.brightness.byte] + [value.duration.rawValue.byte] + [value.wrist.byte] + return data + } +} + +struct IBOtherTargetChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .otherTarget(value) = parameters[.otherTarget] else { fatalError("缺少参数: otherTarget") } + Logger.log(value.description) + var data = value.calorie.byte2 + [value.mileage.byte] + [value.stand.byte] + [value.burning.byte] + [value.ringsState.byte] + [value.vibrateState.byte] + data = data + [value.noticeState.byte] + return data + } +} + +struct IBVibrateSoundChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .vibrateSound(value) = parameters[.vibrateSound] else { fatalError("缺少参数: vibrateSound") } + Logger.log(value.description) + let data = [value.systemValue.byte] + [value.ringsValue.byte] + [value.mediaValue.byte] + [value.ringsState.byte] + [value.vibrateState.byte] + return data + } +} +struct IBUserInfoChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .userInfo(value) = parameters[.userInfo] else { fatalError("缺少参数: userInfo") } + Logger.log(value.description) + var data = [value.age.byte] + [value.gender.byte] + [value.height.byte] + value.weight.byte2 + value.step.byte4 + value.burning.byte2 + data = data + [value.stand.byte] + [value.hourSystem.byte] + return data + } +} + + +struct IBClockChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .clock(value) = parameters[.clock] else { fatalError("缺少参数: clock") } + guard let data = value.encode else { fatalError("json解析异常: clock") } + Logger.log(value.jsonString ?? "") + + return data.bytes + } +} +struct IBTrainTargetChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .trainTarget(value) = parameters[.trainTarget] else { fatalError("缺少参数: trainTarget") } + guard let data = value.encode else { fatalError("json解析异常: trainTarget") } + Logger.log(value.jsonString ?? "") + + return data.bytes + } +} +struct IBSendPhoneChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .sendPhone(value) = parameters[.sendPhone] else { fatalError("缺少参数: sendPhone") } + guard let data = value.encode else { fatalError("json解析异常: sendPhone") } + Logger.log(value.jsonString ?? "") + + return data.bytes + } +} +struct IBSendTimeChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .sendTime(value) = parameters[.sendTime] else { fatalError("缺少参数: sendTime") } + guard let data = value.encode else { fatalError("json解析异常: sendTime") } + Logger.log(value.jsonString ?? "") + return data.bytes + } +} +struct IBWeatherChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .weather(value) = parameters[.weather] else { fatalError("缺少参数: weather") } + guard let data = value.encode else { fatalError("json解析异常: weather") } + Logger.log(value.jsonString ?? "") + return data.bytes + } +} +struct IBAddressBookChecker: IBChecker { + static func check(_ parameters: [IBParameter]) -> [UInt8] { + guard case let .addressBook(list) = parameters[.addressBook] else { fatalError("缺少参数: addressBook") } + if list.count > 20 { fatalError("参数: addressBook,最多不能超过20个联系人") } + var data = [list.count.byte] + var des = "[ " + for item in list { + des += item.description + //性别 + data = data + [item.gender.byte] + //姓名 + if let name = item.name,let value = name.data(using: .utf8),!value.isEmpty { + data += [value.count.byte] + data += value.bytes + } + else{ + data += [0.byte] + } + //电话号码个数 + data += [item.phoneNumbers.count.byte] + if item.phoneNumbers.count > 2 { fatalError("参数: addressBook,电话号码书数不能超过两个") } + + for phone in item.phoneNumbers { + //电话号码 + if let value = phone.number.data(using: .utf8),!value.isEmpty { + data += [value.count.byte] + data += value.bytes + } + else{ + data += [0.byte] + } + //归属地 + if let value = phone.location?.data(using: .utf8),!value.isEmpty { + data += [value.count.byte] + data += value.bytes + } + else{ + data += [0.byte] + } + //运营商 + if let value = phone.operator?.data(using: .utf8),!value.isEmpty { + data += [value.count.byte] + data += value.bytes + } + else{ + data += [0.byte] + } + } + } + des += " ]" + Logger.log(des) + + return data + } +} + diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBKeeper.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBKeeper.swift new file mode 100644 index 0000000..53b8a37 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBKeeper.swift @@ -0,0 +1,104 @@ +// +// IBKeeper.swift +// UnifyBluetooth +// +// Created by yaozuopan on 2024/2/5. +// + +import Foundation +import CoreBluetooth + +class UBDevice: Codable { + let uuid: String + let name: String + let vendors: Int + + var battery: Int + var rssi: Int + + init(_ uuid: String, vendors: Int, name: String, battery: Int, rssi: Int) { + self.uuid = uuid + self.name = name + self.vendors = vendors + self.battery = battery + self.rssi = rssi + } +} + +/// 数据保存 +struct IBKeeper { + static let saver = UserDefaults.standard + + private static let serviceKey = "IBKeeper.Services" + private static let connectedKey = "IBKeeper.Connected" + + /// 记录最新的连接设备 + static func lastConnected(_ peripheral: IBPeripheral?) { + guard let peripheral = peripheral else { return } + addServices(peripheral.peripheral.services) + addConnected(peripheral) + } + + /// 保存蓝牙服务特征 + private static func addServices(_ services: [CBService]?) { + guard let services = services?.map({ $0.uuid.uuidString }) else { return } + + var recordServices = saver.stringArray(forKey: serviceKey) ?? [] + recordServices.append(contentsOf: services) + recordServices = Array(Set(recordServices)) + saver.setValue(recordServices, forKey: serviceKey) + } + + /// 记录已连接过的设备 + private static func addConnected(_ peripheral: IBPeripheral) { + var recordConnected: [UBDevice] = [] + if let jsonData = saver.data(forKey: connectedKey) { + recordConnected = JSON.decode([UBDevice].self, from: jsonData) ?? [] + } + + if let device = recordConnected.filter({ $0.uuid == peripheral.uuid.uuidString }).first { + device.battery = peripheral.battery + device.rssi = peripheral.rssi + } else { + recordConnected.append(UBDevice(peripheral.uuid.uuidString, + vendors: peripheral.vendors.rawValue, + name: peripheral.peripheral.name ?? "", + battery: peripheral.battery, + rssi: peripheral.rssi)) + } + + saver.setValue(recordConnected.jsonData, forKey: connectedKey) + } + + /// 从已连接记录中移除已解绑设备 + static func removeConnected(_ uuid: UUID?) { + guard let uuid = uuid else { return } + + var recordConnected: [UBDevice] = [] + if let jsonData = saver.data(forKey: connectedKey) { + recordConnected = JSON.decode([UBDevice].self, from: jsonData) ?? [] + } + + recordConnected.removeAll { $0.uuid == uuid.uuidString } + saver.setValue(recordConnected.jsonData, forKey: connectedKey) + } + + /// 已连接过设备的服务特征列表 + static var services: [CBUUID] { + (saver.stringArray(forKey: serviceKey) ?? []).map { CBUUID(string: $0) } + } + + /// 已连接过的设备列表 + static var connected: [IBPeripheral] { + guard let jsonData = saver.data(forKey: connectedKey) else { return [] } + let recordConnected = JSON.decode([UBDevice].self, from: jsonData) ?? [] + return recordConnected.map { + IBPeripheral(nil, uuid: $0.uuid, name: $0.name, vendors: $0.vendors, rssi: $0.rssi, battery: $0.battery) } + } + + /// 已连接过的设备UUID列表 + static var connectedUUIDs: [UUID] { + guard let jsonData = saver.data(forKey: connectedKey) else { return [] } + return (JSON.decode([UBDevice].self, from: jsonData) ?? []).compactMap { UUID(uuidString: $0.uuid) } + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBManager.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBManager.swift new file mode 100644 index 0000000..765644a --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBManager.swift @@ -0,0 +1,75 @@ +// +// IBManager.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/12. +// + +import Foundation + +public typealias IBDiscoverHandler = (_ peripheral: IBPeripheral) -> Void +public typealias IBCompleteHandler = (_ isSuccess: Bool) -> Void + +/// SDK 管理类 +public class IBManager { + + /// 初始化工作 + public static func initializationSDK() { +// IBBluetooth.shared.scan(.default) + +// DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { +// IBBluetooth.shared.reconnected() +// } + } + + public static var logs: [String] { Logger.logs } +} + +public extension IBManager { + /// SDK 版本号 + static let version: String = "1.0.7" + /// 默认为 false + static var isDebug: Bool = false { + didSet { Logger.isDebug = isDebug } + } +} + +// 蓝牙相关 API +public extension IBManager { + + internal static var discoverHandler: IBDiscoverHandler? + + /// 扫描设备 + /// - Parameters: + /// - option: 扫描参数 + /// - discoverHandler: 结果回调 + static func scan(_ option: IBScanOption = .default, discoverHandler: @escaping IBDiscoverHandler) { + Self.discoverHandler = discoverHandler + IBBluetooth.shared.scan(option) + } + + /// 停止扫描蓝牙设备 + static func stopScan() { + Self.discoverHandler = nil + IBBluetooth.shared.stopScan() + } + + internal static var completeHandler: IBCompleteHandler? + + /// 连接设备 + /// - Parameters: + /// - peripheral: 扫描发现的设备 + /// - completeHandler: 结果回调 + static func connect(_ peripheral: IBPeripheral, completeHandler: @escaping IBCompleteHandler) { + Self.completeHandler = completeHandler + IBBluetooth.shared.connect(peripheral) + } + + /// 断开与蓝牙设备的连接 + /// - Parameter peripheral: 蓝牙设备对像 + static func cancel(_ peripheral: IBPeripheral) { + IBBluetooth.shared.cancel(peripheral) + } + /// 当前已连接设备 + static var currentConnected: IBPeripheral! { IBBluetooth.shared.currentConnected} +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBNotify.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBNotify.swift new file mode 100644 index 0000000..a7c5a57 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBNotify.swift @@ -0,0 +1,268 @@ +// +// IBNotify.swift +// +// +// Created by Harvey on 2020/1/5. +// Copyright © 2020 姚作潘/Harvey. All rights reserved. +// + +import Foundation + +fileprivate let center = NotificationCenter.default + +fileprivate class Weakly: NSObject { + weak var owner: NSObjectProtocol? + var delegateObservers: [NSObjectProtocol] + init(_ owner: NSObjectProtocol, delegateObservers: [NSObjectProtocol] = []) { + self.owner = owner + self.delegateObservers = delegateObservers + } +} + +extension IBNotify { + + fileprivate struct Keeper { + static var observers: [Weakly] = [] + static func remove(_ observer: NSObjectProtocol) { + observers + .filter { $0.owner === observer || isNil($0.owner) } + .forEach { + $0.delegateObservers.forEach { center.removeObserver($0) } + } + observers.removeAll { isNil($0.owner) || $0.owner === observer } + } + + static func append(_ delegateObserver: NSObjectProtocol, owner: NSObjectProtocol) { + guard let weakly = observers.filter({ $0.owner === owner }).first else { + observers.append(Weakly(owner, delegateObservers: [delegateObserver])) + return + } + weakly.delegateObservers.append(delegateObserver) + } + } + + public struct Name { + fileprivate let rawValue: String + init(_ rawValue: String) { + self.rawValue = rawValue + } + } +} + +public class IBNotify { + + init() {} + + private(set) var name: Notification.Name! + @discardableResult + func name(_ value: IBNotify.Name) -> Self { + name = Notification.Name(rawValue: value.rawValue) + return self + } + + private(set) var observer: NSObjectProtocol! + @discardableResult + func observer(_ value: NSObjectProtocol) -> Self { + observer = value + return self + } + + private(set) var queue: OperationQueue = .main + @discardableResult + func queue(_ value: OperationQueue) -> Self { + queue = value + return self + } + + private(set) var object: Any? + @discardableResult + func object(_ value: Any) -> Self { + object = value + return self + } + + func subscribe(_ value: @escaping (Notification) -> Void) { + if isNil(observer) || isNil(name) { + fatalError("observer or name must be not nil") + } + + let delegateObserver = center + .addObserver(forName: name, + object: object, + queue: queue, + using: value) + Keeper.append(delegateObserver, owner: observer) + } + + static func remove(_ observer: NSObjectProtocol) { + center.removeObserver(observer) + Keeper.remove(observer) + } +} + +extension IBNotify { + static func post(_ name: IBNotify.Name, + object: Any? = nil, + userInfo: [AnyHashable : Any] = [:]) { + center.post(name: Notification.Name(rawValue: name.rawValue), + object: object, userInfo: userInfo) + } +} + +public extension IBManager { + + /// 订阅通知 + static func subscribe(_ name: IBNotify.Name, + observer: NSObjectProtocol!, + receive: @escaping (_ object: Any?, _ userInfo: [String: Any]) -> Void) { + IBNotify() + .name(name) + .observer(observer) + .subscribe { notification in + receive(notification.object, notification.userInfo as? [String: Any] ?? [:]) + } + } + + /// 移除订阅通知的观察者 + static func remove(_ observer: NSObjectProtocol) { + IBNotify.remove(observer) + } +} + +public extension IBNotify.Name { + /// 比如电量、信号强度 +// static let deviceInfoUpdate = IBNotify.Name("IOTBluetooth.DeviceInfoUpdate") + + /// 连接设备发生变动,一种情况断开连接,一种是切换设备 +// static let connectedDeviceDidChange = IBNotify.Name("IOTBluetooth.DeviceConnected") + + /// 鉴权状态改变,通过object 获取状态,0准备鉴权。1等待手表同意连接。 2等待手机确认配对请求。3鉴权成功。4鉴权失败。 +// static let authStateDidChange = IBNotify.Name("IOTBluetooth.AuthStateDidChange") + + /// 发现设备 +// static let deviceHasFound = IBNotify.Name("IOTBluetooth.DeviceHasFound") + + + /// 连接状态发生改变。通过object 获取状态,0断开连接。1连上设备。 + static let connectStateDidChange = IBNotify.Name("IOTBluetooth.ConnectStateDidChange") + + /// 远程拍照动作。通过object获取状态。2进行手势拍照,3退出 + static let takePhoto = IBNotify.Name("IOTBluetooth.TakePhoto") + + /// 手表请求天气数据 + static let weather = IBNotify.Name("IOTBluetooth.weather") + + /// 找到设备 + static let didFindDevice = IBNotify.Name("IOTBluetooth.FindDevice") + + /// 训练状态变化,通过object获取状态IBTarinState对象 + static let trainStateDidChanged = IBNotify.Name("IOTBluetooth.TrainStateChanged") + + /// 获取手表推送的训练实时数据,通过object获取状态IBTrainingData对象 + static let trainingData = IBNotify.Name("IOTBluetooth.TrainingData") +} + +extension IBNotify { + + /// 处理手表推送过来的通知 + static func handle(_ data: Data) -> Bool { + //拍照 + if IBAbility.takePhoto.isAnswer(data) { + let result = IBGeneralParser.dataPacket(data) + let code = result[0].int + if code == 2 || code == 3 { + post(.takePhoto, object:code) + } + return true + } + //找到设备 + if IBAbility.find.isAnswer(data) { + var bytes = data.bytes + bytes.removeLast() + let code = bytes.last!.int + if code == 2 { + post(.didFindDevice) + } + return true + } + //训练状态变化 + if data.bytes[1] == 0x05 && data.bytes[2] == 0x50 { + let result = IBGeneralParser.dataPacket(data) + let model = IBTarinState(result.data) + post(.trainStateDidChanged, object: model) + return true + } + //训练实时数据 + if IBAbility.currentHeartRate.isAnswer(data) { + let dataPacket = IBGeneralParser.dataPacket(data) + if let model = IBTrainingData(dataPacket.data) { + post(.trainingData, object: model) + } + return true + } + //请求天气 + if data.bytes[1] == 0x05 && data.bytes[2] == 0x03 { + post(.weather) + return true + } + + //配对 + if data.bytes[1] == 0x05 && data.bytes[2] == 0x11 { + let result = IBGeneralParser.dataPacket(data) + let code = result[0].int + let desc = ["拒绝配对","确认配对","确认解绑其他手机","其他"] + Logger.log("收到确认配对消息:",desc[code]) + return true + } + if data.bytes[1] == 0x05 && data.bytes[2] == 0x1 { + let result = IBGeneralParser.dataPacket(data) + let code = result[0].int + let desc = ["拒绝解绑","确认解绑"] + Logger.log("收到确认解绑消息 ",desc[code]) + return true + } + if data.bytes[1] == 0x05 && data.bytes[2] == 0x10 { + var result = IBGeneralParser.dataPacket(data) + let code = result[0].int + if code == 1{ + result.removeFirst() + UserDefaults.standard.setValue(result, forKey: "IOTBletooth.mac") + UserDefaults.standard.synchronize() + + Logger.log("收到配对成功消息",result) + //发送时间 + IBNotify.sendTime() + } + else{ + Logger.log("收到配对失败消息") + IBManager.completeHandler?(false) + IBManager.completeHandler = nil + } + + return true + } + return false + } + + static func sendTime(){ + let date = Date() + let model = IBSendTime() + model.time = Int(date.timeIntervalSince1970) + model.week = date.weekDay.rawValue - 1 + model.year = date.year - 2000 + model.month = date.month + model.day = date.day + model.hour = date.hour + model.minute = date.minute + model.second = date.second + + IBSender() + .ability(IBAbility.sendTime) + .parameters([.sendTime(model)]) + .response { result in + Logger.log(result) + IBManager.completeHandler?(true) + IBManager.completeHandler = nil + } + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBParameter.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBParameter.swift new file mode 100644 index 0000000..23dfa2e --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBParameter.swift @@ -0,0 +1,180 @@ +// +// IBParameter.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/19. +// + +import Foundation + +enum IBKey: String { + case dialID = "dialID" + case action = "action" + case motionMode = "motionMode" + case language = "language" + case value = "value" + case file = "file" + case targetStep = "targetStep" + case sleep = "sleep" + case water = "water" + case clock = "clock" + case heartRate = "heartRate" + case bloodOxygen = "bloodOxygen" + case screen = "screen" + case vibrateSound = "vibrateSound" + case otherTarget = "otherTarget" + case trainTarget = "trainTarget" + case sendPhone = "sendPhone" + case sendTime = "sendTime" + case auxiliary = "auxiliary" + case userInfo = "userInfo" + case weather = "weather" + case addressBook = "addressBook" +} + +/// 参数 +public enum IBParameter { + /// 表盘ID + case dialID(Int) + /// 1=(开始、启用、开启),0=(停止、禁用、关闭) + case action(Int) + /// 运动模式 + case motionMode(IBMotionMode) + /// 语言 + case language(IBLanguage) + /// 通用值设置 + case value(Int) + /// 文件 + case file(IBFile) + /// 训练目标 + case targetStep(IBTargetStep) + /// 睡眠 + case sleep(IBSleep) + /// 喝水 + case water(IBWater) + /// 设置闹钟 + case clock(IBClock) + /// 设置心率 + case heartRate(IBHeartRate) + /// 血氧 + case bloodOxygen(IBBloodOxygen) + /// 设置屏幕 + case screen(IBScreen) + /// 设置声音和震动 + case vibrateSound(IBVibrateSound) + /// 设置目标设置 + case otherTarget(IBOtherTarget) + /// 设置训练目标 + case trainTarget(IBTrainTarget) + /// 发送手机信息 + case sendPhone(IBPhoneInfo) + /// 发送当前时间 + case sendTime(IBSendTime) + /// 设置辅助功能 + case auxiliary(IBAuxiliary) + /// 设置用户数据 + case userInfo(IBUserInfo) + /// 发送天气数据 + case weather(IBWeather) + /// 发送通讯录 + case addressBook([IBAddressBook]) + + var key: IBKey { + switch self { + case .dialID(_): return .dialID + case .action(_): return .action + case .motionMode(_): return .motionMode + case .language(_): return .language + case .value(_): return .value + case .file(_): return .file + case .targetStep(_): return .targetStep + case .sleep(_): return .sleep + case .water(_): return .water + case .clock(_): return .clock + case .heartRate(_): return .heartRate + case .bloodOxygen(_): return .bloodOxygen + case .screen(_): return .screen + case .vibrateSound(_): return .vibrateSound + case .auxiliary(_): return .auxiliary + case .otherTarget(_): return .otherTarget + case .trainTarget(_): return .trainTarget + case .sendPhone(_): return .sendPhone + case .sendTime(_): return .sendTime + case .userInfo(_): return .userInfo + case .weather(_): return .weather + case .addressBook(_): return .addressBook + } + } +} + +public enum IBMotionMode: Int { + /// 健走 + case walking = 0 + /// 跑步 + case running + /// 骑行 + case ride +} + +public enum IBFile: Int { + /// OTA 文件 + case ota = 1 + /// MP3 文件 + case mp3 + /// 表盘信息 + case dial + /// 天气 + case weather + /// 闹钟 + case clock +} +//0:运动 +//1:心率 +//2:血氧监测 +//3:训练 +//4:训练记录 +//5:指南针 +//6:天气 +//7:音乐 +//8:电话 +//9:录音 +//10:秒表 +//11:计时器 +//12:闹钟 +//13:蓝牙 +//14:睡眠 +//15:设置 +public enum IBAuxiliary: Int { + /// 运动 + case sport = 0 + /// 心率 + case heart + /// 血氧监测 + case bloodOxygen + /// 训练 + case train + /// 训练记录 + case tarinRecord + /// 指南针 + case compass + /// 天气 + case weather + /// 音乐 + case music + /// 电话 + case mobile + /// 录音 + case record + /// 秒表 + case secondTimer + /// 计时器 + case timer + /// 闹钟 + case clock + /// 蓝牙 + case bluetooth + /// 睡眠 + case sleep + /// 设置 + case setting +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBParser.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBParser.swift new file mode 100644 index 0000000..97e3ea5 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBParser.swift @@ -0,0 +1,329 @@ +// +// IBParser.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/18. +// + +import Foundation + +/// 蓝牙数据解析协议 +protocol IBParser { + /// 解析数据 + static func parse(_ data: Data) -> IBResponse +} + +extension IBParser { + static func dataPacket(_ data: Data) -> [UInt8] { + let dataLength = data[7...10].int + return data.suffix(from: 17).prefix(dataLength).map({ $0 }) + } +} + +struct IBBatteryParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + var bytes = data.bytes + bytes.removeLast() + return .response.code(.success).value(bytes.last!.int) + } +} + +struct IBSwitchDialParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + var bytes = data.bytes + bytes.removeLast() + let code = bytes.last!.int + let desc = ["指令校验失败", "切换成功", "无该表盘资源", "切换失败"] + return .response.code(code == 1 ? .success:.failure).message(desc[code]).value(code) + } +} +struct IBFetchCurrentDialParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let bytes = dataPacket(data) + let value = bytes.int + return .response.code(.success).value(value) + } +} +struct IBFetchAuxiliaryParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let bytes = dataPacket(data) + guard let value = IBAuxiliary(rawValue: bytes.int) else {return .response.code(.parseError) } + return .response.code(.success).value(value) + } +} + +struct IBCheckDialParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + var bytes = data.bytes + bytes.removeLast() + let code = bytes.last!.int + let desc = ["指令校验失败", "已安装", "未安装"] + return .response.code(code != 0 ? .success:.failure).message(desc[code]).value(code) + } +} + +/// 通用解析(1 Byte) +struct IBGeneralParser: IBParser { + static func parse(_ data: Data) -> IBResponse { +// guard data.isEmpty == false else { return IBSingleByteSimulateParser.parse() } + + let code = dataPacket(data).int + return .response.code(code == 1 ? .success:.failure) + } +} +struct IBTakePhotoParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let code = dataPacket(data).int + let desc = ["指令校验失败", "操作成功", "进行手势拍照","退出"] + return .response.code(code != 0 ? .success:.failure).message(desc[code]).value(code) + } +} +struct IBWaterParser: IBParser { + static func parse(_ data: Data) -> IBResponse { +// guard data.isEmpty == false else { return IBSingleByteSimulateParser.parse() } + + let code = dataPacket(data).int + let desc = code == 0 ? "关闭":"开启" + return .response.code(.success).value(code).message(desc) + } +} +struct IBFindParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let code = dataPacket(data).int + let desc = ["指令校验失败", "操作成功", "手表已找到,停止查找"] + return .response.code(code != 0 ? .success:.failure).message(desc[code]).value(code) + } +} +struct IBSendPhoneParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let code = dataPacket(data).int + let desc = ["指令校验失败","手表未与任何手机绑定", "手表已与该手机绑定", "手表已与其他手机绑定"] + return .response.code(code != 0 ? .success:.failure).message(desc[code]).value(code) + } +} + + +struct IBWatchStateParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + var bytes = data.bytes + bytes.removeLast() + let code = bytes.last!.int + let desc = [0:"空闲状态", 9:"USB存储状态", 10:"运动训练状态"] + return .response.code(.success).value(code).message(desc[code] ?? "") + } +} + + +struct IBDiskParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let code = dataPacket[0].int + if code == 1 { + var value: Int = 0 + value = dataPacket.suffix(from: 1).map({ $0 }).int + return .response.code(.success).value(value) + } + else { + return .response.code(.failure) + } + } +} + +struct IBTrainingDataParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + if dataPacket.count == 0 { + return .response.code(.success) + } + guard let model = IBTrainingData(dataPacket.data) else { return .response.code(.parseError) } + return .response.code(.success).value(model) + } +} +struct IBHeartRateParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBHeartRate(dataPacket.data) + Logger.log(model.description) + return .response.code(.success).value(model) + } +} +struct IBBloodOxygenParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBBloodOxygen(dataPacket.data) + Logger.log(model.description) + return .response.code(.success).value(model) + } +} + +struct IBSyncTrainParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + guard let model = JSON.decode(IBHistoryBaseTraining.self, from: dataPacket.data) else { return .response.code(.parseError) } + return .response.code(.success).items(model.list) + +// let dataPacket = baseData.jsonString()! +// guard let model = JSON.decode(IBHistoryBaseTraining.self, from: dataPacket.data!) else { return .response.code(.parseError) } +// Logger.log(model.jsonString ?? "") +// return .response.code(.success).items(model.list) + } +} +struct IBSyncHeartRateParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBHistoryHeartRate(dataPacket.data) +// Logger.log(model.list) + return .response.code(.success).items(model.list) + } +} +struct IBSyncBloodOxygenParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBHistoryBloodOxygen(dataPacket.data) +// Logger.log(model.list) + return .response.code(.success).items(model.list) + } +} +struct IBSyncStepParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBHistoryStep(dataPacket.data) +// Logger.log(model.list) + return .response.code(.success).items(model.list) + } +} +struct IBSyncBurningParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBHistoryBurning(dataPacket.data) +// Logger.log(model.list) + return .response.code(.success).items(model.list) + } +} +struct IBSyncStandParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBHistoryStand(dataPacket.data) +// Logger.log(model.list) + return .response.code(.success).items(model.list) + } +} +struct IBSyncCalorieParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBHistoryCalorie(dataPacket.data) +// Logger.log(model.list) + return .response.code(.success).items(model.list) + } +} +struct IBSyncDistanceParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBHistoryDistance(dataPacket.data) +// Logger.log(model.list) + return .response.code(.success).items(model.list) + } +} +struct IBSyncSleepParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBHistorySleep(dataPacket.data) +// Logger.log(model.list) + return .response.code(.success).items(model.list) + } +} +struct IBSyncGpsParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBHistoryGps(dataPacket.data) +// Logger.log(model.list) + return .response.code(.success).items(model.list) + } +} + + +struct IBAblutParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + guard let model = JSON.decode(IBAbout.self, from: dataPacket.data) else { return .response.code(.parseError) } + Logger.log(model.jsonString ?? "") + return .response.code(.success).value(model) + } +} +struct IBClockParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + guard let model = JSON.decode(IBClock.self, from: dataPacket.data) else { return .response.code(.parseError) } + Logger.log(model.jsonString ?? "") + return .response.code(.success).items(model.alarms) + } +} +struct IBSetClockParser: IBParser { + static func parse(_ data: Data) -> IBResponse { +// guard data.isEmpty == false else { return IBClockSimulateParser.parse() } + let code = dataPacket(data).int + return .response.code(code == 1 ? .success:.failure) + } +} + +struct IBFetchDialsParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let num = dataPacket[0].int + var list:[Int] = [] + for i in 0.. IBResponse { + let dataPacket = dataPacket(data) + guard let model = IBTargetStep(dataPacket.data) else { return .response.code(.parseError) } + + Logger.log(model.description) + return .response.code(.success).value(model) + } +} +struct IBSleepParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBSleep(dataPacket.data) + Logger.log(model.description) + return .response.code(.success).value(model) + } +} +struct IBScreenParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBScreen(dataPacket.data) + Logger.log(model.description) + return .response.code(.success).value(model) + } +} +struct IBVibrateSoundParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBVibrateSound(dataPacket.data) + Logger.log(model.description) + return .response.code(.success).value(model) + } +} +struct IBOtherParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBVibrateSound(dataPacket.data) + Logger.log(model.description) + return .response.code(.success).value(model) + } +} +struct IBOtherTargetParser: IBParser { + static func parse(_ data: Data) -> IBResponse { + let dataPacket = dataPacket(data) + let model = IBOtherTarget(dataPacket.data) + Logger.log(model.description) + return .response.code(.success).value(model) + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBSender.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBSender.swift new file mode 100644 index 0000000..d9527d8 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBSender.swift @@ -0,0 +1,111 @@ +// +// IBSender.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/15. +// + +import Foundation + +public typealias IBCompletionHandler = (_ result: IBResponse) -> Void + +//public typealias IBCmdSuccess = (_ result: IBResponse) -> Void +//public typealias IBCmdError = (_ error: IBError) -> Void + +/// 蓝牙消息发送类 +public class IBSender { + public init() { + Self.all.append(self) + } + + var ability: IBAbility! + var parameters: [IBParameter] = [] + var completion: IBCompletionHandler! + +// var cmdSuccess: IBCmdSuccess? +// var cmdFailure: IBCmdError? + + var data: [UInt8] = [] + + var dataPacket: [UInt8] { + if isValue(ability.checker) { + data = ability.checker.check(parameters) + } + +// let data: [UInt8] = data?.bytes ?? [] + /// 分包数 + let packageCount = 1 + /// 数据包总长度 + let dataTotalLength = data.count + /// 数据包长度 + let dataLength = data.count + /// 数据包索引 + let index = 1 + + var bytes: [UInt8] = [0x73, ability.type.rawValue, ability.id] + bytes = bytes + packageCount.byte4 + dataTotalLength.byte4 + index.byte4 + dataLength.byte2 + + if data.count > 0 { + bytes = bytes + data + bytes = bytes + [LRC.calculateLRC(data)] + } else { + bytes = bytes + [0x00] + } + + return bytes + } + + func isAnswer(_ data: Data) -> Bool { + return ability.isAnswer(data) + } + + func parse(_ data: Data) -> IBResponse { + return ability.parser.parse(data) + } + + deinit { +// Logger.log("deinit IBSender") + } +} + +public extension IBSender { + + /// 功能接口 + @discardableResult + func ability(_ value: IBAbility) -> Self { + ability = value + return self + } + + /// 参数 + @discardableResult + func parameters(_ value: [IBParameter]) -> Self { + parameters = value + return self + } + + /// 执行与响应处理 + @discardableResult + func response(_ handler: @escaping IBCompletionHandler) -> Self { + completion = handler + IBBluetooth.shared.send(self) + return self + } +// /// 执行与响应处理 +// @discardableResult +// func response(success: @escaping IBCmdSuccess,failure:@escaping IBCmdError) -> Self { +// cmdSuccess = success +// cmdFailure = failure +// IBBluetooth.shared.send(self) +// return self +// } +} + +extension IBSender { + static var all: [IBSender] = [] + + /// 从缓存实例集合中移除该实例 + func remove() { + Self.all.removeAll { $0 === self } + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBSimulateParser.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBSimulateParser.swift new file mode 100644 index 0000000..4f97eb2 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBSimulateParser.swift @@ -0,0 +1,24 @@ +// +// IBSimulateParser.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/18. +// + +import Foundation + +/// 通用模拟响应 +//struct IBSingleByteSimulateParser { +// static func parse() -> IBResponse { +// return .response +// } +//} + +///// 闹钟模拟响应 +//struct IBClockSimulateParser { +// static func parse() -> IBResponse { +// let str = #"{"code":1,"alarms":[{"id":0,"repeat":[0],"hour":10,"minute":0,"enable":1},{"id":1,"repeat":[1,2,3,4,5],"hour":7,"minute":45,"enable":1}]}"# +// guard let clock = JSON.decode(IBClock.self, from: str.data!) else { return .response.message("数据解析失败") } +// return .response.success(true).items(clock.alarms) +// } +//} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBluetooth.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBluetooth.swift new file mode 100644 index 0000000..2ba56a0 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IBluetooth.swift @@ -0,0 +1,389 @@ +// +// IBluetooth.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/2/4. +// + +import Foundation +import CoreBluetooth + +/// Max is 482 +let dataPacketMaxBytes = 450 + +public class IBScanOption { + var values: [String : Any] = [:] + var serviceUUIDs: [String]? = nil + + /// 允许重复扫描 + @discardableResult + public func allowDuplicates(_ value: Bool) -> Self { + values[CBCentralManagerScanOptionAllowDuplicatesKey] = value + return self + } + + /// 扫描指定服务 + @discardableResult + public func solicited(_ serviceUUIDs: [String]) -> Self { + self.serviceUUIDs = serviceUUIDs + values[CBCentralManagerScanOptionSolicitedServiceUUIDsKey] = serviceUUIDs.map({ CBUUID(string: $0) }) + return self + } + + public static let `default` = IBScanOption() + public static var custom: IBScanOption { IBScanOption() } +} + +/// 主服务 +let serviceUUID: String = "18E0" +/// Notify 特征值 +let notifyCharacteristicUUID: String = "2AE5" +/// Read 特征值 +let readCharacteristicUUID: String = "2AE2" +/// Write 特征值(发送字节数≤20) +let writeCharacteristicUUID: String = "2AE3" +/// Write 特征值(发送字节数>20) +let writeBigCharacteristicUUID: String = "2AE4" +/// Write 特征值(发送文件OAT、MP3等) +let writeFileCharacteristicUUID: String = "2AE0" + +class IBBluetooth: NSObject { + static let shared = IBBluetooth() + + private override init() { + super.init() + centralManager = CBCentralManager(delegate: self, queue: nil) + } + + /// 2AE5 + private var notifyCharacteristic: CBCharacteristic! + /// 2AE2 + private var readCharacteristic: CBCharacteristic! + /// 2AE3 + private var writeCharacteristic: CBCharacteristic! + /// 2AE4 + private var writeBigCharacteristic: CBCharacteristic! + /// 2AE0 + private var writeFileCharacteristic: CBCharacteristic! + + /// 中央管理类,管理蓝牙的扫描连接 + var centralManager: CBCentralManager! + + /// 扫描到的蓝牙设备集合 + var devices: [IBPeripheral] = [] + + private var option: IBScanOption = .default + func scan(_ option: IBScanOption = .default) { + self.option = option + startScan() + } + + /// 重连接设备 + func reconnected() { + guard let connectedPeripheral = centralManager.retrieveConnectedPeripherals(withServices: [CBUUID(string: serviceUUID)]).first else { return } + currentConnected = IBPeripheral() + currentConnected.peripheral = connectedPeripheral + centralManager.connect(connectedPeripheral) + } + + /// 当前连接设备 + var currentConnected: IBPeripheral! + /// 最后消息发送实例 + private weak var lastSender: IBSender? + + /// 开始扫描 + private func startScan() { + if centralManager.state == .poweredOn { + Logger.log("开始扫描蓝牙设备...") + } + centralManager.scanForPeripherals(withServices: nil, options: option.values) + } + + /// 停止扫描 + func stopScan(){ + Logger.log("停止扫描蓝牙设备...") + centralManager.stopScan() + } + + /// 连接蓝牙设备 + /// + /// - Parameter peripheral: 蓝牙设备对像 + func connect(_ peripheral: IBPeripheral) { + currentConnected = peripheral + centralManager.connect(peripheral.peripheral) + } + + /// 断开与蓝牙设备的连接 + /// + /// - Parameter peripheral: 蓝牙设备对像 + func cancel(_ peripheral: IBPeripheral) { + centralManager.cancelPeripheralConnection(peripheral.peripheral) + } + + /// 发送数据 + /// - Parameters: + /// - sender: 消息类 + func send(_ sender: IBSender) { + if let _ = lastSender { + sender.remove() + Logger.log("有命令正在执行中...") + return + } + lastSender = sender + startTimer() + + let dataPacket = sender.dataPacket + Logger.log("\(sender.ability.characteristicUUID!) Write:", dataPacket.data.joined(" "), "Bytes(\(dataPacket.count))") + + var writeCharacteristic: CBCharacteristic = writeCharacteristic + if sender.ability.characteristicUUID == writeBigCharacteristicUUID { + writeCharacteristic = writeBigCharacteristic + } + if sender.ability.characteristicUUID == writeFileCharacteristicUUID { + writeCharacteristic = writeFileCharacteristic + } + + currentConnected.peripheral.writeValue(dataPacket.data, for: writeCharacteristic, type: .withResponse) + } + + func sendDeviceInfo(){ +// IBNotify.post(.authStateDidChange, userInfo: ["state": 0]) + + let mac = UserDefaults.standard.object(forKey: "IOTBletooth.mac") as? [Int] ?? [] + let model = IBPhoneInfo() + model.mac = mac + IBSender() + .ability(IBAbility.sendPhone) + .parameters([.sendPhone(model)]) + .response { result in + Logger.log(result) + guard let value = result.value as? Int else {return} + if value == 2 { + //通知连接成功 + IBManager.completeHandler?(true) + IBManager.completeHandler = nil + } + else if value == 1{ + //等待手表同意连接 + Logger.log("等待手表同意连接") + } + else if value == 3{ + //手表已与其他手机绑定 + IBManager.completeHandler?(false) + IBManager.completeHandler = nil + } + } + } +} + +extension IBBluetooth: CBCentralManagerDelegate { + + /// 手机蓝牙状态更新 + /// - Parameter central: 中央管理类 + func centralManagerDidUpdateState(_ central: CBCentralManager) { + switch central.state { + case .unknown: + Logger.log("unknown") + case .resetting: + Logger.log("resetting") + case .unsupported: + Logger.log("unsupported") + case .unauthorized: + Logger.log("unauthorized") + case .poweredOff: + Logger.log("poweredOff") + case .poweredOn: + startScan() + Logger.log("poweredOn") + @unknown default: + break + } + } + + /// 发现设备 + func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { + + guard let manufacturerData = advertisementData["kCBAdvDataManufacturerData"] as? Data else { return } + guard let manufacturer = IBManufacturer(manufacturerData) else { return } + + let device = IBPeripheral() + device.code = manufacturer.code + device.isBind = manufacturer.isBind + device.rssi = RSSI.intValue + device.peripheral = peripheral + device.productID = manufacturer.productID + device.customerID = manufacturer.productID + device.advertisementData = advertisementData + device.macAddress = manufacturer.macAddress + device.softwareVersion = manufacturer.softwareVersion + IBManager.discoverHandler?(device) + Logger.log("发现设备", device.name, device.macAddress) + } + + /// 连接上设备 + func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { + peripheral.delegate = self + peripheral.discoverServices([CBUUID(string: serviceUUID)]) +// IBNotify.post(.connectedDeviceDidChange) + Logger.log("已连接", currentConnected.name) + IBNotify.post(.connectStateDidChange, object: 1) + } + + /// 连接失败 + func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) { + Logger.log("连接失败",error?.localizedDescription ?? "" ) + currentConnected = nil + IBManager.completeHandler?(false) + IBManager.completeHandler = nil + } + + /// 断开连接 + func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { + Logger.log("断开连接") + + deinitTimer() + lastSender?.completion?(.response.code(.failure)) + lastSender?.remove() + + IBManager.completeHandler?(false) + IBManager.completeHandler = nil + IBNotify.post(.connectStateDidChange,object: 0) + } +} + +extension IBBluetooth: CBPeripheralDelegate { + + /// 读取到信号 + func peripheral(_ peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: Error?) { + + } + + /// 发现服务 + func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) { + peripheral + .services? + .forEach { + peripheral.discoverCharacteristics(nil, for: $0) + } + } + + /// 发现服务找那个的特征,然后遍历所有特征订阅 + func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { + service + .characteristics? + .forEach { + if $0.uuid.uuidString == notifyCharacteristicUUID { + notifyCharacteristic = $0 + peripheral.setNotifyValue(true, for: $0) + return + } + + if $0.uuid.uuidString == readCharacteristicUUID { + readCharacteristic = $0 + peripheral.setNotifyValue(true, for: $0) + return + } + + if $0.uuid.uuidString == writeCharacteristicUUID { + writeCharacteristic = $0 + return + } + + if $0.uuid.uuidString == writeBigCharacteristicUUID { + writeBigCharacteristic = $0 + return + } + + if $0.uuid.uuidString == writeFileCharacteristicUUID { + writeFileCharacteristic = $0 + return + } + } + } + + /// 来自蓝牙设备的通知 + func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: Error?) { + // 读取特征的值 + peripheral.readValue(for: characteristic) + } + + /// 蓝牙设备发过来的数据 + func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { + if let error = error { + Logger.log(error) + } + + guard let data = characteristic.value else { return } + if(data.count == 2 && data.int == 0){ + Logger.log("收到0000指令异常") + return + } + + let mark = characteristic.isNotifying ? "Notify Read" : "Read" + let uuid = characteristic.uuid.uuidString + Logger.log(mark, uuid, "->", data.joined(" "), "Bytes(\(data.count))") + + if lastSender?.isAnswer(data) == true { + deinitTimer() + + let result = lastSender!.parse(data) + lastSender?.completion?(result) + lastSender?.remove() + return + } + + if characteristic.uuid.uuidString == readCharacteristicUUID { + let info = IBWatchInfo(data) + currentConnected.battery = info.battery + currentConnected.macAddress = info.macAddress + currentConnected.productID = info.productID + currentConnected.customerID = info.customerID + sendDeviceInfo() + return + } + +// if characteristic.uuid.uuidString == notifyCharacteristicUUID { +// Logger.log("Notify == ") +// return +// } + if IBNotify.handle(data) { +// Logger.log("通知消息") + return + } + + Logger.log("Other handle") + } + + /// 写入完成(发送指令完成) + func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) { + if let error = error { + Logger.log(error) + return + } + + Logger.log(characteristic.uuid.uuidString, "write success") + } +} + +extension IBBluetooth { + + static var timer: Timer? + func startTimer() { + deinitTimer() + + Self.timer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: false, block: { [unowned self] _ in + deinitTimer() + lastSender?.completion?(.response.code(.timeout)) + lastSender?.remove() + }) + Logger.log("创建定时器") + } + + func deinitTimer() { + guard let _ = Self.timer else { return } + Self.timer?.invalidate() + Self.timer = nil + + Logger.log("销毁定时器") + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/IOTBluetooth.h b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IOTBluetooth.h new file mode 100644 index 0000000..98258c9 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/IOTBluetooth.h @@ -0,0 +1,18 @@ +// +// IOTBluetooth.h +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/6. +// + +#import + +//! Project version number for IOTBluetooth. +FOUNDATION_EXPORT double IOTBluetoothVersionNumber; + +//! Project version string for IOTBluetooth. +FOUNDATION_EXPORT const unsigned char IOTBluetoothVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBAbout.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBAbout.swift new file mode 100644 index 0000000..2e70140 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBAbout.swift @@ -0,0 +1,24 @@ +// +// IBAbout.swift +// IOTBluetooth +// +// Created by incar on 2024/5/28. +// + +import Foundation +/// 关于本机模型 +public class IBAbout:Codable { + /// 标记码,有数据更新时为1,无数据更新时为0,暂不用 + public var code: Int = 0 + /// 固件主版本号 + public var major: Int = 1 + /// 固件中版本号 + public var mid: Int = 0 + /// 固件次版本号 + public var minor: Int = 0 + /// MAC地址 + public var macAddress: String = "" + + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBAddressBook.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBAddressBook.swift new file mode 100644 index 0000000..fef7b43 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBAddressBook.swift @@ -0,0 +1,71 @@ +// +// IBAddressBook.swift +// IOTBluetooth +// +// Created by incar on 2024/6/3. +// + +import Foundation +/// 通讯录模型 +public class IBAddressBook { + /// 性别 0:未指定,1:男性 ,2:女性 + public var gender: Int = 0 + + /// 姓名,不传手表上显示名字为“未知” + public var name: String? + + /// 电话号码,一个联系人名下可有最少1个最多2个电话号码 + public var phoneNumbers: [IBPhoneNumber] = [] + + + public init() { } + + public static func test() -> [IBAddressBook]{ + var list = [IBAddressBook](); + for i in 0...10{ + let model = IBAddressBook() + model.gender = i%2 + model.name = "张\(i)" + + for j in 0...1{ + let phone = IBPhoneNumber() + phone.number = "1300000000\(j)" + phone.location = "深圳市宝安区\(j)" + phone.operator = "中国移动" + model.phoneNumbers.append(phone) + } + list.append(model) + } + + return list + } + + public var description: String { + var phoneStr = "[ " + for phone in phoneNumbers { + phoneStr += phone.description + } + phoneStr += " ]" + return "IBAddressBook(gender: \(gender), name:\(name ?? ""), phoneNumbers:\(phoneStr))" + } +} + +/// 电话号码模型 +public class IBPhoneNumber { + /// 电话号码,长度1~255 + public var number: String = "" + + /// 归属地,长度0~255,不传手表上显示归属地为“未知 + public var location: String? + + /// 运营商,长度0~255,不传手表上显示运营商为“未知 + public var `operator`: String? + + public init() { } + + public var description: String { + return "IBPhoneNumber(number: \(number), location:\(location ?? ""), `operator`:\(`operator` ?? ""))" + } +} + + diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBBloodOxygen.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBBloodOxygen.swift new file mode 100644 index 0000000..99f6639 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBBloodOxygen.swift @@ -0,0 +1,42 @@ +// +// IBBloodOxygen.swift +// IOTBluetooth +// +// Created by incar on 2024/5/29. +// + +import Foundation +/// 血氧设置模型 +public class IBBloodOxygen { + /// 监测频率 + public var rate: IBBloodOxygenFrequency = .min30 + /// 血氧提醒 0:关闭 1:开启。 为0时后面区间阈值无需设置。 + public var state: Int = 1 + /// 提醒阈值 90~99 + public var value: Int = 95 + + public init() { } + + init(_ data: Data) { + rate = IBBloodOxygenFrequency(rawValue:data[0].int) ?? .none + state = data[1].int + if state == 1 { + value = data[2].int + } + } + + var description: String { + return "IBBloodOxygen(rate: \(rate), state:\(state), value:\(value))" + } +} +/// 血氧监测频率 +public enum IBBloodOxygenFrequency: Int { + /// 关闭 + case none = 0 + /// 30分钟 + case min30 + /// 1小时 + case hour1 + /// 2小时 + case hour2 +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBClock.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBClock.swift new file mode 100644 index 0000000..7b12f33 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBClock.swift @@ -0,0 +1,46 @@ +// +// IBClock.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/21. +// + +import Foundation + +/// 闹钟模型 +public class IBClock: Codable { + /// 闹钟列表 + public var alarms: [IBClockInfo] = [] + + public init() { } +} + +/// 闹钟信息模型 +public class IBClockInfo: Codable { + /// 闹钟id 范围为0~4. (即闹钟暂定最多设置为5个) + public var id: Int = 0 + /// 小时 + public var hour: Int = 0 + /// 分钟 + public var minute: Int = 0 + /// 0关闭闹钟,1开启闹钟 + public var enable: Int = 0 + /// 闹钟重复列表 + /// + /// - 0 不重复,响一次 + /// - 1 周一 + /// - 2 周二 + /// - ...... + /// - 7 周日 + public var `repeat`: [Int] = [0] + +// enum CodingKeys: String, CodingKey { +// case id = "id" +// case hour = "hour" +// case minute = "minute" +// case enable = "enable" +// case `repeat` = "repeat" +// } + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBCode.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBCode.swift new file mode 100644 index 0000000..3711401 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBCode.swift @@ -0,0 +1,45 @@ +// +// IBError.swift +// IOTBluetooth +// +// Created by incar on 2024/5/9. +// + +import Foundation + +/// 状态码 +public enum IBCode: Int,CustomStringConvertible { + public var description: String{ + return "IBError(rawValue:\(rawValue), message:\(message))" + } + /// 操作成功 + case success = 1000 + /// 操作失败 + case failure = 1001 + /// 参数错误 + case invalidParam = 1002 + /// 解析错误 + case parseError = 1003 + /// 请求超时 + case timeout = 1004 + /// 未知错误 + case unknow = 1005 + + var message:String{ + switch self { + case .failure: + return "操作失败" + case .success: + return "操作成功" + case .invalidParam: + return "参数错误" + case .parseError: + return "解析错误" + case .timeout: + return "请求超时" + default: + return "未知错误" + } + } + +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHeartRate.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHeartRate.swift new file mode 100644 index 0000000..554758d --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHeartRate.swift @@ -0,0 +1,45 @@ +// +// IBHeartRate.swift +// IOTBluetooth +// +// Created by incar on 2024/5/16. +// + +import Foundation +/// 心率设置模型 +public class IBHeartRate { + /// 监测频率 + public var rate: IBHeartRateFrequency = .none + /// 心率提醒 0:关闭 1:开启。 为0时后面区间阈值无需设置。 + public var state: Int = 1 + /// 心率区间阈值 高于或低于 0:低于 1:高于 + public var higherOrLower: Int = 0 + /// 心率区间阈值 30~200 + public var value: Int = 100 + + public init() { } + + init(_ data: Data) { + rate = IBHeartRateFrequency(rawValue:data[0].int) ?? .none + state = data[1].int + if state == 1 { + higherOrLower = data[2].int + value = data[3].int + } + } + + var description: String { + return "IBHeartRate(rate: \(rate), state:\(state), higherOrLower:\(higherOrLower), value:\(value))" + } +} +/// 提醒频率 +public enum IBHeartRateFrequency: Int { + /// 关闭 + case none = 0 + /// 1分钟 + case min1 + /// 5分钟 + case min5 + /// 10分钟 + case min10 +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryBaseTraining.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryBaseTraining.swift new file mode 100644 index 0000000..b93cb22 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryBaseTraining.swift @@ -0,0 +1,113 @@ +// +// IBHistoryBaseTraining.swift +// IOTBluetooth +// +// Created by incar on 2024/5/21. +// + +import Foundation + +/// 基础训练历史数据模型 +class IBHistoryBaseTraining:Codable { + /// 训练历史记录 + var list:[IBHistoryBaseTrainingItem] = [] + + enum CodingKeys: String, CodingKey { + case list = "recs" + } +} + +/// 基础训练历史数据模型 +public class IBHistoryBaseTrainingItem:Codable { + /// 0:手表开启的训练1:APP开启的训练 + public var source: Int = 0 + + /// (仅W4)0:健身类1:舞蹈类2:休闲运动3:球类4:水上项目5:冰上项目6:极限运动7:其他 + public var otherType: Int? + + /// 训练类型,0:健走1:跑步2:骑行以上适用W2/W3,W4该字段表示各训练大类中的小类,对应训练名称参考 自由训练176.xlsx 表格。 + public var trainingType: Int = 0 + + /// 训练开始时间戳,单位秒 + public var star: Int = 0 + + /// 训练结束时间戳,单位秒 + public var stop: Int = 0 + + /// 训练目标类型,0:路程 1:卡路里 2:时间 3:步数 + public var targetType: Int = 0 + + /// 训练目标 路程:单位米, 卡路里:单位kcal ,时间:单位分钟 ,步数:单位步 + public var target: Int = 0 + + /// 目标完成度,单位% + public var progress: Int = 0 + + /// 训练总时间,单位秒 + public var duration: Int = 0 + + /// 卡路里,为该数值乘以0.1,单位kcal + public var calorie: Int? + + /// 距离,单位米 + public var distance: Int? + + /// 平均运动心率 + public var heartRate: Int = 0 + + /// 运动步数 + public var step: Int? + + /// 训练强度(仅W4), 0 = 较低强度,1 = 中等强度,2 = 高等强度,3 = 超高强度 + public var trainingLevel:Int? + + /// 圈数(仅限跑步训练) + public var circle: Int? + + /// 最高海拔高度(仅限登山训练) + public var elevation: Int? + + + enum CodingKeys: String, CodingKey { + case source = "src" + case otherType = "bt" + case trainingType = "ty" + case star = "st" + case stop = "sp" + case targetType = "tgt" + case target = "tg" + case progress = "pg" + case duration = "du" + case calorie = "ca" + case distance = "dl" + case heartRate = "hr" + case step = "stp" + case trainingLevel = "tl" + case circle = "cir" + case elevation = "alt" + } +} + +///// 训练目标类型 +//public enum IBTrainingTargetType: Int,Codable { +// /// 路程 +// case distance = 0 +// /// 卡路里 +// case calorie +// /// 时间 +// case time +// /// 步数 +// case step +//} + +///// 训练强度 +//public enum IBTrainingLevel: Int,Codable { +// /// 较低强度 +// case low = 0 +// /// 中等强度 +// case medium +// /// 高等强度 +// case high +// /// 超高强度 +// case superHigh +//} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryBloodOxygen.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryBloodOxygen.swift new file mode 100644 index 0000000..e922be8 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryBloodOxygen.swift @@ -0,0 +1,36 @@ +// +// IBHistoryBloodOxygen.swift +// IOTBluetooth +// +// Created by incar on 2024/5/28. +// + +import Foundation +/// 血氧历史模型 +class IBHistoryBloodOxygen { + /// 记录 + var list:[IBHistoryBloodOxygenItem] = [] + + init(_ data: Data) { + var historyList:[IBHistoryBloodOxygenItem] = [] + for i in stride(from: 0, to: data.count, by: 5){ + if data.count > i + 4 { + let model = IBHistoryBloodOxygenItem() + model.time = data[i...i+3].int + model.value = data[i+4].int + historyList.append(model) + } + } + list = historyList + } +} + +/// 血氧历史记录 +public class IBHistoryBloodOxygenItem { + /// 时间戳 + public var time: Int = 0 + /// 血氧,单位% + public var value: Int = 0 + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryBurning.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryBurning.swift new file mode 100644 index 0000000..33f1466 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryBurning.swift @@ -0,0 +1,36 @@ +// +// IBHistoryBurning.swift +// IOTBluetooth +// +// Created by incar on 2024/5/28. +// + +import Foundation +/// 燃脂历史模型 + class IBHistoryBurning { + /// 记录 + var list:[IBHistoryBurningItem] = [] + + init(_ data: Data) { + var historyList:[IBHistoryBurningItem] = [] + for i in stride(from: 0, to: data.count, by: 6){ + if data.count > i + 5 { + let model = IBHistoryBurningItem() + model.time = data[i...i+3].int + model.value = data[i+4...i+5].int + historyList.append(model) + } + } + list = historyList + } +} + +/// 燃脂历史记录 +public class IBHistoryBurningItem { + /// 时间戳 + public var time: Int = 0 + /// 单位分钟 + public var value: Int = 0 + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryCalorie.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryCalorie.swift new file mode 100644 index 0000000..b6e2e87 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryCalorie.swift @@ -0,0 +1,36 @@ +// +// IBHistoryCalorie.swift +// IOTBluetooth +// +// Created by incar on 2024/5/28. +// + +import Foundation +/// 卡路里历史模型 + class IBHistoryCalorie { + /// 记录 + var list:[IBHistoryCalorieItem] = [] + + init(_ data: Data) { + var historyList:[IBHistoryCalorieItem] = [] + for i in stride(from: 0, to: data.count, by: 8){ + if data.count > i + 7 { + let model = IBHistoryCalorieItem() + model.time = data[0...3].int + model.value = data[i+4...i+7].int + historyList.append(model) + } + } + list = historyList + } +} + +/// 卡路里历史记录 +public class IBHistoryCalorieItem { + /// 时间戳 + public var time: Int = 0 + /// 单位kcal + public var value: Int = 0 + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryDistance.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryDistance.swift new file mode 100644 index 0000000..0c876bd --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryDistance.swift @@ -0,0 +1,36 @@ +// +// IBHistoryDistance.swift +// IOTBluetooth +// +// Created by incar on 2024/5/28. +// + +import Foundation +/// 卡路里历史模型 + class IBHistoryDistance { + /// 历史记录 + var list:[IBHistoryDistanceItem] = [] + + init(_ data: Data) { + var historyList:[IBHistoryDistanceItem] = [] + for i in stride(from: 0, to: data.count, by: 8){ + if data.count > i + 7 { + let model = IBHistoryDistanceItem() + model.time = data[i...i+3].int + model.value = data[i+4...i+7].int + historyList.append(model) + } + } + list = historyList + } +} + +/// 距离历史记录 +public class IBHistoryDistanceItem { + /// 时间戳 + public var time: Int = 0 + /// 单位km + public var value: Int = 0 + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryGps.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryGps.swift new file mode 100644 index 0000000..78eb6fc --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryGps.swift @@ -0,0 +1,40 @@ +// +// IBHistoryGps.swift +// IOTBluetooth +// +// Created by incar on 2024/5/30. +// + +import Foundation + +/// 同步路径坐标历史数据模型 +public class IBHistoryGps { + /// 记录 + var list:[IBHistoryGpsItem] = [] + + init(_ data: Data) { + var historyList:[IBHistoryGpsItem] = [] + for i in stride(from: 0, to: data.count, by: 12){ + if data.count > i + 11 { + let model = IBHistoryGpsItem() + model.time = data[i...i+3].int + model.lon = data[i+4...i+7].int + model.lat = data[i+8...i+11].int + historyList.append(model) + } + } + list = historyList + } +} +/// 同步路径坐标历史数据模型 +public class IBHistoryGpsItem { + /// unix时间戳 + public var time: Int = 0 + /// 纬度,该值除以10000000得到实际纬度值 + public var lat: Int = 0 + /// 经度,该值除以10000000得到实际经度值 + public var lon: Int = 0 + + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryHeartRate.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryHeartRate.swift new file mode 100644 index 0000000..ad3248f --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryHeartRate.swift @@ -0,0 +1,36 @@ +// +// IBHistoryHeartRate.swift +// IOTBluetooth +// +// Created by incar on 2024/5/21. +// + +import Foundation +/// 心率历史模型 + class IBHistoryHeartRate { + /// 记录 + var list:[IBHistoryHeartRateItem] = [] + + init(_ data: Data) { + var historyList:[IBHistoryHeartRateItem] = [] + for i in stride(from: 0, to: data.count, by: 5){ + if data.count > i + 4 { + let model = IBHistoryHeartRateItem() + model.time = data[i...i+3].int + model.value = data[i+4].int + historyList.append(model) + } + } + list = historyList + } +} + +/// 心率历史记录 +public class IBHistoryHeartRateItem { + /// 时间戳 + public var time: Int = 0 + /// 心率 + public var value: Int = 0 + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistorySleep.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistorySleep.swift new file mode 100644 index 0000000..ebf1904 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistorySleep.swift @@ -0,0 +1,86 @@ +// +// IBHistorySleep.swift +// IOTBluetooth +// +// Created by incar on 2024/5/30. +// + +import Foundation +/// 睡眠历史模型 + class IBHistorySleep { + /// 记录 + var list:[IBHistorySleepItem] = [] + + init(_ data: Data) { + if(data.count <= 0){ + return + } + + var historyList:[IBHistorySleepItem] = [] + let number = data[0].int + + + for i in stride(from: 0, to: data.count, by: 8){ + if data.count > i + 7 { + let model = IBHistorySleepItem() +// model.time = data[i...i+3].int +// model.value = data[i+4...i+7].int +// historyList.append(model) + } + } + list = historyList + } +} + +/// 睡眠历史记录 +public class IBHistorySleepItem { + /// 睡眠ID,0~255,表示第几次睡眠 + public var sleepId: UInt8 = 0 + /// 睡眠类型,0:小睡(无总时长之后的所有项目)1:睡眠 + public var type: Int = 0 + /// 入睡时间戳,Unix时间戳 + public var startTime: Int = 0 + /// 出睡时间戳,Unix时间戳 + public var endTime: Int = 0 + /// 总时长 + public var totalSleep: IBSleepTime = IBSleepTime(hour: 0, minute: 0) + /// 深睡时长 + public var deepSleep: IBSleepTime = IBSleepTime(hour: 0, minute: 0) + /// 浅睡时长 + public var lightSleep: IBSleepTime = IBSleepTime(hour: 0, minute: 0) + /// 快速动眼时长 + public var remSleep: IBSleepTime = IBSleepTime(hour: 0, minute: 0) + /// 清醒时长 + public var awake: IBSleepTime = IBSleepTime(hour: 0, minute: 0) + /// 睡眠状态 + public var states:[IBSleepState] = [] + + + public init() { } +} + +/// 时间 +public struct IBSleepTime { + /// 时 + public var hour: UInt8 + /// 分 0~59 + public var minute: UInt8 + + public init(hour: UInt8, minute: UInt8) { + self.hour = hour + self.minute = minute + } + + var description: String { + return "IBSleepTime(hour: \(hour), minute:\(minute)" + } +} + + +/// 睡眠状态 +public class IBSleepState { + /// Unix时间戳 + public var time: Int32 = 0 + /// 状态,0:进入睡眠 1:浅层睡眠 2:深层睡眠 3:清醒 4:结束睡眠 7:未出睡最后一笔睡眠数据(资料上报结束标志) 9:出睡最后一笔睡眠数据(资料上报结束标志) 12:快速眼动 13:取消入睡通知(睡眠不足 60 分钟出睡上报状态) 14:结束小睡 + public var state: Int8 = 0 +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryStand.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryStand.swift new file mode 100644 index 0000000..918a8f8 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryStand.swift @@ -0,0 +1,33 @@ +// +// IBHistoryStand.swift +// IOTBluetooth +// +// Created by incar on 2024/5/28. +// + +import Foundation +/// 站立历史模型 + class IBHistoryStand { + /// 记录 + var list:[IBHistoryStandItem] = [] + + init(_ data: Data) { + var historyList:[IBHistoryStandItem] = [] + for i in stride(from: 0, to: data.count, by: 4){ + if data.count > i + 3 { + let model = IBHistoryStandItem() + model.time = data[i...i+3].int + historyList.append(model) + } + } + list = historyList + } +} + +/// 站立历史记录 +public class IBHistoryStandItem { + /// 时间戳 + public var time: Int = 0 + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryStep.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryStep.swift new file mode 100644 index 0000000..538bc4b --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBHistoryStep.swift @@ -0,0 +1,36 @@ +// +// IBHistoryStep.swift +// IOTBluetooth +// +// Created by incar on 2024/5/28. +// + +import Foundation +/// 步数历史模型 + class IBHistoryStep { + /// 记录 + var list:[IBHistoryStepItem] = [] + + init(_ data: Data) { + var historyList:[IBHistoryStepItem] = [] + for i in stride(from: 0, to: data.count, by: 8){ + if data.count > i + 7 { + let model = IBHistoryStepItem() + model.time = data[i...i+3].int + model.value = data[i+4...i+7].int + historyList.append(model) + } + } + list = historyList + } +} + +/// 步数历史记录 +public class IBHistoryStepItem { + /// 时间戳 + public var time: Int = 0 + /// 单位步 + public var value: Int = 0 + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBLanguage.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBLanguage.swift new file mode 100644 index 0000000..722f730 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBLanguage.swift @@ -0,0 +1,58 @@ +// +// IBLanguage.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/20. +// + +import Foundation + +/// 语言原始值从 0 开始递增 +public enum IBLanguage: Int { + /// 中文 + case chinese = 0 + /// 英语 + case english + /// 日本语 + case japanese + /// 韩语 + case korean + /// 西班牙语 + case spanish + /// 俄语 + case russian + /// 克罗地亚语 + case croatian + /// 德语 + case german + /// 葡萄牙语 + case portuguese + /// 法语 + case french + /// 荷兰语 + case dutch + /// 意大利语 + case italian + /// 捷克语 + case czech + /// 希腊语 + case greek + /// 印度语 + case hindi + /// 印度尼西亚语 + case indonesian + /// 马来西亚语 + case malaysian + /// 波兰语 + case polish + /// 泰语 + case thai + /// 越南语 + case vietnamese + /// 芬兰语 + case finnish + /// 罗马尼亚语 + case romanian + /// 土耳其语 + case turkish +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBManufacturer.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBManufacturer.swift new file mode 100644 index 0000000..6300d84 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBManufacturer.swift @@ -0,0 +1,37 @@ +// +// IBManufacturer.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/14. +// + +import Foundation + +/// 广播数据包解析 +struct IBManufacturer { + init?(_ data: Data) { + guard data.count == 14 else { return nil } + + code = data[0...1].string ?? "" + guard code == "JH" else { return nil } + + isBind = data[2].int + macAddress = data[3...8].reversedJoined(":") + customerID = data[9].int + productID = data[10].int + softwareVersion = data[11..<14].joined(format: "%d", ".") + } + + /// 识别符 + let code: String + /// 是否已绑定(1=已绑定) + let isBind: Int + /// mac 地址 + let macAddress: String + /// 客户 ID + let customerID: Int + /// 产品 ID + let productID: Int + /// 软件版本 + let softwareVersion: String +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBOtherTarget.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBOtherTarget.swift new file mode 100644 index 0000000..fd0aaf7 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBOtherTarget.swift @@ -0,0 +1,41 @@ +// +// IBUserInfo.swift +// IOTBluetooth +// +// Created by incar on 2024/5/14. +// + +import Foundation +/// 其他目标设置模型 +public class IBOtherTarget { + /// 目标卡路里,单位千卡 + public var calorie: Int = 0 + /// 目标里程,单位公里 + public var mileage: Int = 1 + /// 目标站立次数,单位次 + public var stand: Int = 0 + /// 目标燃脂时间,单位分钟 + public var burning: Int = 0 + /// 铃声提醒 0:关闭 1:开启 + public var ringsState: Int = 0 + /// 震动提醒 0:关闭 1:开启 + public var vibrateState: Int = 0 + /// 通知提醒 0:关闭 1:开启 + public var noticeState: Int = 0 + + public init() { } + + init(_ data: Data) { + calorie = data[0...1].int + mileage = data[2].int + stand = data[3].int + burning = data[4].int + ringsState = data[5].int + vibrateState = data[6].int + noticeState = data[7].int + } + + var description: String { + return "IBOtherTarget(calorie: \(calorie), mileage:\(mileage), stand:\(stand), burning:\(burning), ringsState:\(ringsState), vibrateState:\(vibrateState), noticeState:\(noticeState))" + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBPeripheral.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBPeripheral.swift new file mode 100644 index 0000000..02fd72c --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBPeripheral.swift @@ -0,0 +1,55 @@ +// +// IBPeripheral.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/6. +// + +import Foundation +import CoreBluetooth + +public class IBPeripheral { + + /// 信号强度(分贝) + public internal(set) var rssi: Int = 0 + + /// 外围设备实例 + public internal(set) var peripheral: CBPeripheral! { + didSet { + if let name = peripheral.name { + self.name = name + } + uuid = peripheral.identifier + } + } + + /// mac 地址 + public internal(set) var macAddress: String = "" + + /// 广播数据 + public internal(set) var advertisementData: [String: Any] = [:] + + /// CBPeripheral.identifier + public private(set) var uuid: UUID! + + /// 名称 + public private(set) var name: String = "Unknown" + + /// 软件版本 + public internal(set) var softwareVersion: String = "" + + /// 电量,连接设备后可用,默认为 0 + public internal(set) var battery: Int = 0 + + /// 识别符 + var code: String = "" + + /// 是否绑定(1=绑定) + var isBind: Int = 0 + + /// 客户 ID + var customerID: Int = 0 + + /// 产品ID + var productID: Int = 0 +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBPhoneInfo.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBPhoneInfo.swift new file mode 100644 index 0000000..0387b03 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBPhoneInfo.swift @@ -0,0 +1,25 @@ +// +// IBDeviceInfo.swift +// IOTBluetooth +// +// Created by incar on 2024/5/23. +// + +import Foundation +/// 手机信息模型 +public class IBPhoneInfo:Codable { + /// 手机名称 + public var name: String = "iphone" + /// 手机类型 0:安卓 1:苹果 + public var type: Int = 1 + /// 手机MAC地址数组(仅IOS,配对成功从手表获取,未获取时为空) + public var mac: [Int]? + + enum CodingKeys: String, CodingKey { + case name = "pn" + case type = "tp" + case mac = "mac" + } + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBResponse.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBResponse.swift new file mode 100644 index 0000000..27891f4 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBResponse.swift @@ -0,0 +1,77 @@ +// +// IBResponse.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/15. +// + +import Foundation + +public class IBResponseModel { + var data:Data! + required init(_ data: Data) { + self.data = data + } + + var pkgData:Data{ + if(data.count > 18){ + return data[17...data.count - 2] + } + return Data() + } +} + + +public class IBResponse:CustomStringConvertible { + /// 状态码 + public private(set) var code: IBCode = .success + /// 反馈信息 + public private(set) var message: String = "操作成功" + /// 当成功时为 true + public private(set) var isSuccess: Bool = false + /// 当结果为集合时,应该从此字段读取 + public private(set) var items: [Any] = [] + /// 当结果为非集合,应该从此字段读取 + public private(set) var value: Any? + + static var response: IBResponse { IBResponse() } + + public var description: String { + var des = "IBResponse(code: \(code.rawValue),isSuccess: \(isSuccess), massage:\(message), " + if let v1 = value { + des.append("value:\(v1))") + } + else{ + des.append("items:\(items))") + } + return des + } +} + +extension IBResponse { + @discardableResult + func code(_ value: IBCode) -> Self { + code = value + isSuccess = code == .success + message = code.message + return self + } + + @discardableResult + func message(_ value: String) -> Self { + message = value + return self + } + + @discardableResult + func items(_ value: [Any]) -> Self { + items = value + return self + } + + @discardableResult + func value(_ value: Any) -> Self { + self.value = value + return self + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBScreen.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBScreen.swift new file mode 100644 index 0000000..26d3cbd --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBScreen.swift @@ -0,0 +1,46 @@ +// +// IBScreen.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/21. +// + +import Foundation + +/// 屏幕参数 +public class IBScreen { + /// 亮度 [0, 255] + public var brightness: Int = 10 + + /// 亮屏时长 + public var duration: IBDuration = .second10 + + /// 抬腕亮屏(0=关闭, 1=开启) + public var wrist: Int = 1 + + public init() { } + + init(_ data: Data) { + brightness = data[0].int + duration = IBDuration(rawValue: data[1].int) ?? .second5 + wrist = data[2].int + } + var description: String { + return "IBScreen(brightness: \(brightness), duration:\(duration), wrist:\(wrist))" + } +} + +public enum IBDuration: Int { + /// 5 秒 + case second5 = 0 + /// 10 秒 + case second10 + /// 15 秒 + case second15 + /// 30 秒 + case second30 + /// 1 分钟 + case minute + /// 5 分钟 + case minute5 +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBSendTime.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBSendTime.swift new file mode 100644 index 0000000..5cb39eb --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBSendTime.swift @@ -0,0 +1,30 @@ +// +// IBSendTime.swift +// IOTBluetooth +// +// Created by incar on 2024/5/23. +// + +import Foundation +/// 发送时间模型 +public class IBSendTime:Codable { + /// unix时间戳 + public var time: Int = 0 + /// 0-6:周日-周六 + public var week: Int = 0 + /// 0-127,年份减去2000 + public var year: Int = 0 + /// 1-12 + public var month: Int = 1 + /// 1-31 + public var day: Int = 1 + /// 0-24 + public var hour: Int = 0 + /// 0-60 + public var minute: Int = 0 + /// 0-60 + public var second: Int = 0 + + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBSleep.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBSleep.swift new file mode 100644 index 0000000..04e703a --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBSleep.swift @@ -0,0 +1,56 @@ +// +// IBSleep.swift +// IOTBluetooth +// +// Created by incar on 2024/5/15. +// + +import Foundation +/// 睡眠设置模型 +public class IBSleep { + /// 0:关闭 1:开启 为0时后面所有项目都无需设置。 + public var sleepTimeSet: Int = 0 + /// 就寝时间 + public var sleepTime: IBTimeItem? + /// 起床时间 + public var getUpTime: IBTimeItem? + /// 就寝前20分钟提醒,0:关闭1:开启 + public var alertBeforeMin20: Int = 0 + + init(_ data: Data) { + sleepTimeSet = data[0].int + if sleepTimeSet == 1{ + sleepTime = IBTimeItem(hour: data[1].int, minute: data[2].int) + getUpTime = IBTimeItem(hour: data[3].int, minute: data[4].int) + alertBeforeMin20 = data[5].int + } + } + public init() { +// sleepTimeSet = 1 +// sleepTime = IBTimeItem(hour: 7, minute: 30) +// getUpTime = IBTimeItem(hour: 15, minute: 50) +// alertBeforeMin20 = 0 + } + + var description: String { + return "IBSleep(sleepTimeSet: \(sleepTimeSet), sleepTime:\(sleepTime?.description ?? ""), getUpTime:\(getUpTime?.description ?? ""), alertBeforeMin20:\(alertBeforeMin20))" + } + +} + +/// 时间 +public struct IBTimeItem { + /// 0~23 + public var hour: Int + /// 0~59 + public var minute: Int + + public init(hour: Int, minute: Int) { + self.hour = hour + self.minute = minute + } + + var description: String { + return "IBTimeItem(hour: \(hour), minute:\(minute)" + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTargetStep.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTargetStep.swift new file mode 100644 index 0000000..5666ca8 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTargetStep.swift @@ -0,0 +1,37 @@ +// +// IBTargetStep.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/21. +// + +import Foundation +/// 目标步数模型 +public class IBTargetStep { + + /// 步数 + public var value: Int = 5000 + + /// 铃声提醒(0=关闭,1=开启) + public var ring: Int = 0 + + /// 震动提醒(0=关闭,1=开启) + public var vibrate: Int = 0 + + /// 通知提醒(0=关闭,1=开启) + public var notice: Int = 0 + + init?(_ data: Data) { + guard data.count == 7 else { return nil } + value = data[0...3].int + ring = data[4].int + vibrate = data[5].int + notice = data[6].int + } + + var description: String { + return "IBTargetStep(value: \(value), ring:\(ring), vibrate: \(vibrate), notice:\(notice))" + } + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTarinState.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTarinState.swift new file mode 100644 index 0000000..9e048fe --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTarinState.swift @@ -0,0 +1,26 @@ +// +// IBTarinState.swift +// IOTBluetooth +// +// Created by incar on 2024/5/28. +// + +import Foundation +/// 推送训练状态模型 +public class IBTarinState { + /// 状态 0:结束 1:开始 2:暂停 3:恢复 + public var state: Int = 1 + /// 训练时长,单位秒 + public var duration: Int = 0 + + public init() { } + + init(_ data: Data) { + state = data[0].int + duration = data[1...2].int + } + + public var description: String { + return "IBTarinState(state: \(state), duration:\(duration))" + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTrainTarget.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTrainTarget.swift new file mode 100644 index 0000000..bbc1946 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTrainTarget.swift @@ -0,0 +1,46 @@ +// +// IBaa.swift +// IOTBluetooth +// +// Created by incar on 2024/5/16. +// + +import Foundation +/// 训练目标设置模型 +public class IBTrainTarget:Codable { + /// 目标类型,对应的类型,设置对应的值 + public var type: IBTrainTargetType = .calorie + /// 目标距离,单位米 + public var distance: Int? + /// 目标卡路里,单位kcal + public var calorie: Int? + /// 目标时间,单位分钟 + public var time: Int? + /// 目标步数,单位步 + public var step: Int? + + public init() { } + + enum CodingKeys: String, CodingKey { + case type = "ty" + case distance = "di" + case calorie = "ca" + case time = "tm" + case step = "st" + } + var description: String { + return "IBTrainTarget(type: \(type), distance:\(distance ?? 0), calorie:\(calorie ?? 0), time:\(time ?? 0), step:\(step ?? 0))" + } +} + +/// 提醒频率 +public enum IBTrainTargetType: Int,Codable { + /// 距离 + case distance = 0 + /// 卡路里 + case calorie = 1 + /// 时间 + case time = 2 + /// 步数 + case step = 4 +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTrainingData.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTrainingData.swift new file mode 100644 index 0000000..270c59e --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBTrainingData.swift @@ -0,0 +1,48 @@ +// +// IBTrainingData.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/20. +// + +import Foundation + +/// 训练数据模型 +public struct IBTrainingData { + /// 训练开始时间(时间戳) + public let startTime: Int + + /// 实时训练心率,单位bpm + public let heartRate: Int + + /// 实时训练卡路里,单位kcal + public let calorie: Int + + /// 实时训练距离,单位米 + public let distance: Int + + /// 实时训练步数,单位步 + public let stepCount: Int + + /// 实时训练强度 + /// + /// - 0:较低强度 + /// - 1:中等强度 + /// - 2:高等强度 + /// - 3:超高强度 + public let intensity: Int + + init?(_ data: Data) { + guard let dict = data.jsonObject() as? [String: Int] else { return nil } + self.startTime = dict["st"]! + self.heartRate = dict["hr"]! + self.calorie = dict["ca"]! + self.distance = dict["di"]! + self.stepCount = dict["stp"]! + self.intensity = dict["ti"]! + } + + public var description: String { + return "IBTrainingData(startTime: \(startTime), heartRate:\(heartRate), calorie:\(calorie), distance:\(distance), stepCount:\(stepCount), intensity:\(intensity))" + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBUserInfo.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBUserInfo.swift new file mode 100644 index 0000000..34e8192 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBUserInfo.swift @@ -0,0 +1,45 @@ +// +// IBUserInfo.swift +// IOTBluetooth +// +// Created by incar on 2024/5/30. +// + +import Foundation +/// 用户数据模型 +public class IBUserInfo { + /// 年龄 + public var age: Int = 0 + /// 性别 0:男性 1:女性 + public var gender: Int = 0 + /// 身高, 单位cm + public var height: Int = 0 + /// 体重, 单位kg + public var weight: Int = 0 + /// 目标步数 + public var step: Int = 0 + /// 目标燃脂时间,单位分钟 + public var burning: Int = 0 + /// 目标站立次数 + public var stand: Int = 0 + /// 时制 0:24小时制 1:12小时制 + public var hourSystem: Int = 0 + + + public init() { } + + init(_ data: Data) { + age = data[0].int + gender = data[1].int + height = data[2].int + weight = data[3...4].int + step = data[5...8].int + burning = data[9...10].int + stand = data[11].int + hourSystem = data[12].int + } + + public var description: String { + return "IBUserInfo(age: \(age), gender:\(gender), height:\(height), weight:\(weight), step:\(step), burning:\(burning), stand:\(stand), hourSystem:\(hourSystem))" + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBVibrateSound.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBVibrateSound.swift new file mode 100644 index 0000000..802fdc8 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBVibrateSound.swift @@ -0,0 +1,39 @@ +//// +//// IBVibrateSound.swift +//// IOTBluetooth +//// +//// Created by incar on 2024/5/9. +//// +// +/// 声音震动模型 +public class IBVibrateSound { + /// 系统音量调节0~100 + public var systemValue: Int = 0 + + /// 铃声音量调节0~100 + public var ringsValue: Int = 0 + + /// 媒体音量调节0~100 + public var mediaValue: Int = 0 + + /// 铃声开关0:关闭 1:开启 + public var ringsState: Int = 0 + + /// 震动开关0:关闭 1:开启 + public var vibrateState: Int = 0 + + public init() { } + + init(_ data: Data) { + systemValue = data[0].int + ringsValue = data[1].int + mediaValue = data[2].int + ringsState = data[3].int + vibrateState = data[4].int + } + + var description: String { + return "IBVibrateSound(systemValue: \(systemValue), ringsValue:\(ringsValue), mediaValue:\(mediaValue), ringsState:\(ringsState), vibrateState:\(vibrateState))" + } +} + diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBWatchInfo.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBWatchInfo.swift new file mode 100644 index 0000000..2a7c0c1 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBWatchInfo.swift @@ -0,0 +1,46 @@ +// +// IBWatchInfo.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/14. +// + +import Foundation + +/// 手表信息 +struct IBWatchInfo { + + init(_ data: Data) { + battery = data[0].int + dialID = data[1...2].int + firmwareVersion = data[3...5].joined(format: "%d", ".") + macAddress = data[6...11].joined(":") + messagePush = data[12].int + media = data[13].int + customerID = data[14].int + productID = data[15].int + hardwareVersion = data[16...17].joined(format: "%d", ".") + bluetoothVersion = data[18...19].joined(format: "%d", ".") + } + + /// 电量 + let battery: Int + /// 表盘ID + let dialID: Int + /// 固件版本 + let firmwareVersion: String + /// mac 地址 + let macAddress: String + /// 消息推送 1=开启 + let messagePush: Int + /// 多媒体 1=开启 + let media: Int + /// 硬件版本 + let hardwareVersion: String + /// 蓝牙版本 + let bluetoothVersion: String + /// 客户 ID + let customerID: Int + /// 产品 ID + let productID: Int +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBWater.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBWater.swift new file mode 100644 index 0000000..1da5ebd --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBWater.swift @@ -0,0 +1,45 @@ +// +// IBWater.swift +// IOTBluetooth +// +// Created by incar on 2024/5/15. +// + + +import Foundation +/// 喝水提醒设置模型 +public class IBWater { + /// 0:关闭 1:开启 为0时后面所有项目都无需设置。 + public var alertState: Int = 0 + /// 提醒方式0:每天提醒一次 1:间隔提醒 + public var alertType: Int = 0 + /// 饮水目标 500~5000ml + public var drinkingValue: Int = 0 + /// 提醒开始时间 + public var start:IBTimeItem = IBTimeItem(hour: 0, minute: 0) + /// 提醒结束时间。仅间隔提醒需要,其他情况不填 + public var end:IBTimeItem = IBTimeItem(hour: 0, minute: 0) + /// 提醒频率。仅间隔提醒需要,其他情况不填 + public var frequency: IBFrequency = IBFrequency.min30 + + public init() { } + + var description: String { + return "IBWater(alertState: \(alertState), alertType:\(alertType), drinkingValue:\(drinkingValue), start:\(start.description), end:\(end.description), frequency:\(frequency.rawValue))" + } +} + + +/// 提醒频率 +public enum IBFrequency: Int { + /// 30分钟 + case min30 = 0 + /// 1小时 + case hour1 + /// 2小时 + case hour2 + /// 3小时 + case hour3 + /// 其他情况 + case none +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBWeather.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBWeather.swift new file mode 100644 index 0000000..5409798 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Models/IBWeather.swift @@ -0,0 +1,70 @@ +// +// IBWeather.swift +// IOTBluetooth +// +// Created by incar on 2024/5/30. +// + +import Foundation +/// 天气模型 +public class IBWeather:Codable { + /// 当前定位地址 + public var address: IBAddress = IBAddress() + /// 当前天气信息 + public var now: IBWeatherNow = IBWeatherNow() + /// 七天天气信息 + public var daily: [IBWeatherInfo] = [] + + + public init() { } +} + + +/// 地址模型 +public class IBAddress:Codable { + /// 城市 + public var city: String = "" + /// 区 + public var subLocality: String = "" + /// 纬度,该值除以10000000得 + public var lat: Int = 0 + /// 经度,该值除以10000000得到实际纬度值 + public var lon: Int = 0 + /// 气压,单位hPa + public var atm: Int = 0 + + public init() { } +} + +/// 天气信息模型 +public class IBWeatherInfo:Codable { + /// 预报日期,时间戳 + public var fxDate: Int = 1654012800 + /// 预报白天天气状况的图标代码 + public var iconDay: Int = 0 + /// 预报白天天气状况文字描述,包括阴晴雨雪等天气状态的描述 + public var textDay: String = "" + /// 预报当天最高温度 + public var tempMax: Int = 0 + /// 预报当天最低温度 + public var tempMin: Int = 0 + + public init() { } +} +/// 现在天气信息模型 +public class IBWeatherNow:Codable { + /// 当前温度 + public var temp: Int = 0 + /// 夜晚天气icon图标 + public var iconNight: Int = 0 + /// 夜晚天气情况 + public var textNight: String = "" + /// 风力 + public var windScale: String = "" + /// 湿度% + public var humidity: Int = 0 + /// 紫外线强度指数 + public var uvIndex: Int = 0 + + public init() { } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/Any.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/Any.swift new file mode 100644 index 0000000..64e712f --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/Any.swift @@ -0,0 +1,181 @@ +// +// Any.swift +// MyBase +// +// Created by Harvey on 2021/6/2. +// + +import Foundation + +/// 判断可选类型是否为 nil +func isNil(_ any: Any?) -> Bool { + switch any { + case .none: return true + case .some: return false + } +} + +/// 判断可选类型是否有值 +func isValue(_ any: Any?) -> Bool { + return isNil(any) == false +} + +/// for Array +func isEmpty(_ value: [Any]?) -> Bool { + return isNil(value) || value!.count == 0 +} + +/// for Array +func isNotEmpty(_ value: [Any]?) -> Bool { + return isEmpty(value) == false +} + +/// for Dictionary +func isEmpty(_ value: [AnyHashable: Any]?) -> Bool { + return isNil(value) || value!.count == 0 +} + +/// for Dictionary +func isNotEmpty(_ value: [AnyHashable: Any]?) -> Bool { + return isEmpty(value) == false +} + +/// for String +func isEmpty(_ value: String?) -> Bool { + return isNil(value) || value!.count == 0 +} + +/// for String +func isNotEmpty(_ value: String?) -> Bool { + return isEmpty(value) == false +} + +public extension String { + + /// 补足8位(长度为8的整数倍) + var binary: String { + let bytes = (Double(count) / 8.0).upInt + let offset = bytes * 8 - count + let prefix = Array(repeating: "0", count: offset).joined() + return prefix + self + } +} + +public extension Double { + var upInt: Int { Int(ceil(self)) } +} + +public extension Int { + private static let binaryPack = 0b11111111 + + /// convert to data with byte (max is 4294967295) + /// + /// 低位 --> 高位 + var bytes: [UInt8] { + var mutatingSelf = self + var bytes = [UInt8(mutatingSelf & Self.binaryPack)] + + var count = 1 + mutatingSelf = mutatingSelf >> (count * 8) + while mutatingSelf > 0 { + bytes.append(UInt8(mutatingSelf & Self.binaryPack)) + mutatingSelf = mutatingSelf >> (count * 8) + count = count + 1 + } + return bytes + } + + /// convert to data with 1 byte + var byte: UInt8 { + UInt8(self & Self.binaryPack) + } + + /// convert to data with 2 byte + /// + /// 低位 --> 高位 + var byte2: [UInt8] { + [ + UInt8(self & Self.binaryPack), + UInt8(self >> 8 & Self.binaryPack) + ] + } + + /// convert to data with 3 byte + /// + /// 低位 --> 高位 + var byte3: [UInt8] { + [ + UInt8(self & Self.binaryPack), + UInt8(self >> 8 & Self.binaryPack), + UInt8(self >> 16 & Self.binaryPack) + ] + } + + /// convert to data with 4 byte + /// + /// 低位 --> 高位 + var byte4: [UInt8] { + [ + UInt8(self & Self.binaryPack), + UInt8(self >> 8 & Self.binaryPack), + UInt8(self >> 16 & Self.binaryPack), + UInt8(self >> 24 & Self.binaryPack) + ] + } +} + +public extension BinaryInteger { + + /// e.g. 0000100110010101 + var binaryString: String { + .init(self, radix: 2).binary + } +} + +public extension Array where Element == UInt8 { + + var int: Int { + self + .map { Int($0) } + .enumerated() + .map { $1 << ($0 * 8) } + .reduce(0, { partialResult, value in + partialResult | value + }) + } + + var data: Data { Data(self) } +} + +public extension Data { + var bytes: [UInt8] { map { $0 } } + + func joined(format: String = "%02x", _ separator: String = "") -> String { + self + .map { String(format: format, $0) } + .joined(separator: separator) + } + + func reversedJoined(format: String = "%02x", _ separator: String = "") -> String { + self + .map { String(format: format, $0) } + .reversed() + .joined(separator: separator) + } + + var int: Int { + self + .map { Int($0) } + .enumerated() + .map { $1 << ($0 * 8) } + .reduce(0, { partialResult, value in + partialResult | value + }) + } + + var lrc: UInt8 { LRC.calculateLRC(bytes) } +} + +public extension UInt8 { + var int: Int { Int(self) } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/CRC16.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/CRC16.swift new file mode 100644 index 0000000..0025438 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/CRC16.swift @@ -0,0 +1,44 @@ +// +// CRC16.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/12. +// + +import Foundation + +/// CRC-16/MODBUS +class CRC16 { + static let shared = CRC16() + private init() { } + + func result(_ bytes: [UInt8]) -> [UInt8] { + var crcValue = crc(bytes) + var crcBytes: [UInt8] = [0, 0] + for index in (0..<2).reversed() { + crcBytes[index] = UInt8(crcValue % 256) + crcValue >>= 8 + } + return crcBytes + } + + private func crc(_ bytes: [UInt8]) -> Int { + + var crcSum: Int = 0xffff + let polynomial: Int = 0xa001 + let length = bytes.count + + for index in 0..>= 1 + crcSum ^= polynomial + }else{ + crcSum >>= 1 + } + } + } + return crcSum + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/Date.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/Date.swift new file mode 100644 index 0000000..9fc933d --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/Date.swift @@ -0,0 +1,145 @@ +// +// Date.swift +// MyBase +// +// Created by Harvey on 2021/5/18. +// + +import Foundation + +// MARK: - Extension Date +extension Date { + + static let formatter = DateFormatter() + + struct Format { + + let rawValue: String + init(_ rawValue: String) { + self.rawValue = rawValue + } + + /// e.g. 01:01:01 + static let time: Format = .init("HH:mm:ss") + + /// e.g. 01:01 + static let shortTime: Format = .init("HH:mm") + + /// e.g. 01-01 + static let date: Format = .init("MM-dd") + + /// e.g. 01月01日 + static let date1: Format = .init("MM月dd日") + + /// e.g. 2020-01-01 + static let short: Format = .init("yyyy-MM-dd") + + /// e.g. 2020年01月01日 + static let short1: Format = .init("yyy年MM月dd日") + + /// e.g. 2020-01-01 01:01 + static let middle: Format = .init("yyyy-MM-dd HH:mm") + + /// e.g. 2020年01月01日 01:01 + static let middle1: Format = .init("yyy年MM月dd日 HH:mm") + + /// e.g. 2020-01-01 01:01:01 + static let long: Format = .init("yyyy-MM-dd HH:mm:ss") + + /// e.g. 2020年01月01日 01:01:01 + static let long1: Format = .init("yyyy年MM月dd日 HH:mm:ss") + + /// e.g. 2020-01-01 01:01:01.088 + static let full: Format = .init("yyyy-MM-dd HH:mm:ss.SSS") + + /// e.g. 2020年01月01日 01:01:01.088 + static let full1: Format = .init("yyyy年MM月dd日 HH:mm:ss.SSS") + } + + /// 格式化成本地时间 + func format(_ format: Date.Format = .middle) -> String { + Self.formatter.dateFormat = format.rawValue + return Self.formatter.string(from: self) + } + + enum Unit { + case minute(Int) + case hour(Int) + case day(Int) + + /// 转换成秒 + var second: TimeInterval { + switch self { + case .minute(let minute): return 60.0 * Double(minute) + case .hour(let hour): return 60.0 * 60.0 * Double(hour) + case .day(let day): return 60.0 * 60.0 * 24.0 * Double(day) + } + } + } +} + +let today: Date = .init() + +/// 本地化 +extension Date { + /// 星期几 + enum Week: Int { + /// 星期日 + case sun = 1 + /// 星期一 + case mon + /// 星期二 + case tue + /// 星期三 + case wed + /// 星期四 + case thur + /// 星期五 + case fri + /// 星期六 + case sat + } + +// /// 当天的第一秒 +// var fromTimeInterval: TimeInterval { +// let today = format(.short) +// return today.timeIntervalSince1970(.short) +// } +// +// /// 当天最后一秒 +// var toTimeInterval: TimeInterval { fromTimeInterval + Unit.day(1).second } + + /// 哪一年 + var year: Int { component(.year) } + + /// 哪个月 + var month: Int { component(.month) } + + /// 当月的第几天 + var day: Int { component(.day) } + + /// 当月的第几天 + var hour: Int { component(.hour)} + + /// 当月的第几天 + var minute: Int { component(.minute)} + + /// 当月的第几天 + var second: Int { component(.second)} + + /// 当月的第几周 + var weekOfMonth: Int { component(.weekOfMonth) } + + /// 今年的第几周 + var weekOfYear: Int { component(.weekOfYear) } + + /// 星期几 + var weekDay: Week { Week(rawValue: component(.weekday))! } + + /// 假设当天是周五,表示本月的第几个周五 + var weekdayOrdinal: Int { component(.weekdayOrdinal) } + + private func component(_ component: Calendar.Component) -> Int { + return Calendar.autoupdatingCurrent.component(component, from: self) + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/IBPeripheralUUID.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/IBPeripheralUUID.swift new file mode 100644 index 0000000..285800b --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/IBPeripheralUUID.swift @@ -0,0 +1,23 @@ +// +// IBPeripheralUUID.swift +// IOTBluetooth +// +// Created by Harvey on 2024/2/5. +// + +import CoreBluetooth + +public protocol IBPeripheralUUID { + /// CBPeripheral.identifier + var uuid: UUID { get } +} + +extension UUID: IBPeripheralUUID { + + public var uuid: UUID { self } +} + +public func == (lhs: IBPeripheralUUID?, rhs: IBPeripheralUUID?) -> Bool { + guard let lhs = lhs, let rhs = rhs else { return false } + return lhs.uuid == rhs.uuid +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/JSON.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/JSON.swift new file mode 100644 index 0000000..9c94ed9 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/JSON.swift @@ -0,0 +1,115 @@ +// +// JSON.swift +// MyBase +// +// Created by Harvey on 2024/1/7. +// + +import Foundation + + struct JSON { } + + extension Dictionary { + + func jsonString(options: JSONSerialization.WritingOptions = [.fragmentsAllowed]) -> String? { + guard JSONSerialization.isValidJSONObject(self) else { + Logger.log("无效的 JSONObject") + return nil + } + guard let data = try? JSONSerialization.data(withJSONObject: self, options: options) else { return nil } + return data.string + } +} + + extension Array { + + func jsonString(options: JSONSerialization.WritingOptions = [.fragmentsAllowed]) -> String? { + guard JSONSerialization.isValidJSONObject(self) else { + Logger.log("无效的 JSONObject") + return nil + } + guard let data = try? JSONSerialization.data(withJSONObject: self, options: options) else { return nil } + return data.string + } +} + + extension String { + + func jsonObject(options: JSONSerialization.ReadingOptions = [.mutableContainers]) -> Any? { + guard let data = self.data else { return nil } + return data.jsonObject(options: options) + } +} + + extension Data { + + func jsonObject(options: JSONSerialization.ReadingOptions = [.mutableContainers]) -> Any? { + do { return try JSONSerialization.jsonObject(with: self, options: options) } + catch { Logger.log(error) } + return nil + } +} + +// MARK: - Extension Codable + + extension Encodable { + + /// JSON encode + var encode: Data? { + do { + return try JSONEncoder().encode(self) + } catch { Logger.log(error) } + return nil + } + + var jsonString: String? { + encode?.string + } +} + + extension Decodable { + + /// JSON decode + static func decode(_ from: Data) -> Self? { + do { + return try JSONDecoder().decode(Self.self, from: from) + } catch { Logger.log(error) } + return nil + } + + /// JSON decode + static func decode(_ from: String) -> Self? { + guard let data = from.data else { return nil } + return decode(data) + } +} + + extension JSON { + /// JSON decode + static func decode(_ decodable: T.Type, from data: Data) -> T? { + do { + return try JSONDecoder().decode(decodable.self, from: data) + } catch { Logger.log(error) } + return nil + } + + /// JSON decode + static func decode(_ decodable: T.Type, from jsonString: String) -> T? { + guard let data = jsonString.data else { return nil } + return decode(decodable, from: data) + } +} + + extension Array where Element: Encodable { + /// JSON encode + var jsonData: Data? { + do { + return try JSONEncoder().encode(self) + } catch { Logger.log(error) } + return nil + } + + var jsonString: String? { + encode?.string + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/LRC.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/LRC.swift new file mode 100644 index 0000000..8270a6a --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/LRC.swift @@ -0,0 +1,29 @@ +// +// LRC.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/13. +// + +import Foundation + +public struct LRC { + + public static func calculateLRC(_ bytes: [UInt8]) -> UInt8 { + let sum = bytes.map({ Int($0) }).reduce(0) { partialResult, value in + partialResult + value + } + + let lrc = sum % 256 + return UInt8(lrc == 0 ? 0 : 256 - lrc) + } + + public static func calculate(_ bytes: [UInt8]) -> UInt8 { + let sum = bytes.map({ Int($0) }).reduce(into: 0) { partialResult, value in + partialResult ^= value + } + return sum.byte + } +} + + diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/Logger.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/Logger.swift new file mode 100644 index 0000000..1236c7f --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/Logger.swift @@ -0,0 +1,33 @@ +// +// Logger.swift +// +// +// Created by Harvey on 2021/4/27. +// + +import Foundation + +/// 日记管理 +class Logger { + static var isDebug: Bool = false + + fileprivate static let shared = Logger() + private init() { } + + fileprivate var dateString: String { Date().format(.full) } + + static var logs: [String] = [] +} + +extension Logger { + static func log(_ logs: Any..., line: Int = #line, separator: String = " ", terminator: String = "\n") { + objc_sync_enter(Logger.shared) + if Logger.isDebug { + print(Logger.shared.dateString, terminator: " [IOTBluetooth-\(String(format: "%03d", line))]: ") + print(logs, separator: separator, terminator: terminator) + let logString = Logger.shared.dateString + " [IOTBluetooth-\(String(format: "%03d", line))]: " + logs.map({ "\($0)" }).joined(separator: separator) + terminator + Self.logs.append(logString) + } + objc_sync_exit(Logger.shared) + } +} diff --git a/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/UTF8.swift b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/UTF8.swift new file mode 100644 index 0000000..a88e787 --- /dev/null +++ b/IOTBluetooth/IOTBluetooth/IOTBluetooth/Tools/UTF8.swift @@ -0,0 +1,16 @@ +// +// UTF8.swift +// IOTBluetooth +// +// Created by yaozuopan on 2024/3/6. +// + +import Foundation + +public extension Data { + var string: String? { String(data: self, encoding: .utf8) } +} + +public extension String { + var data: Data? { self.data(using: .utf8) } +} -- 2.17.1