From cf8c5048524f5d55bde59109e5ddb9d625c1bbf0 Mon Sep 17 00:00:00 2001 From: jepiqueau Date: Mon, 3 Aug 2020 13:58:17 +0200 Subject: [PATCH] update iOS to pass through SwiftLint --- CHANGELOG.md | 14 +- README.md | 22 +- .../buildOutputCleanup.lock | Bin 17 -> 17 bytes android/.idea/caches/build_file_checksums.ser | Bin 643 -> 643 bytes android/.idea/workspace.xml | 23 +- .../aar_main_jar/debug/classes.jar | Bin 36343 -> 36326 bytes .../compile-file-map.properties | 2 +- .../database/sqlite/CapacitorSQLite.class | Bin 13486 -> 13482 bytes .../sqlite/cdssUtils/JsonColumn.class | Bin 3837 -> 3829 bytes .../database/sqlite/cdssUtils/JsonIndex.class | Bin 3304 -> 3296 bytes .../sqlite/cdssUtils/JsonSQLite.class | Bin 5701 -> 5693 bytes .../database/sqlite/cdssUtils/JsonTable.class | Bin 7629 -> 7621 bytes .../cdssUtils/SQLiteDatabaseHelper.class | Bin 36125 -> 36129 bytes android/build/outputs/aar/android-debug.aar | Bin 59637 -> 59622 bytes ios/Plugin.xcodeproj/project.pbxproj | 36 +- .../UserInterfaceState.xcuserstate | Bin 84925 -> 100081 bytes ios/Plugin/DatabaseSQLiteHelper.swift | 1002 +++-------------- .../ImportExportJson/ExportToJson.swift | 551 +++++++++ .../ImportExportJson/ImportFromJson.swift | 285 +++++ .../{ => ImportExportJson}/JsonSQLite.swift | 45 +- ios/Plugin/Plugin.swift | 449 ++++---- ios/Plugin/ReturnHandler.swift | 72 ++ ios/Plugin/Utils/UtilsBinding.swift | 61 + ios/Plugin/Utils/UtilsJson.swift | 212 ++++ ios/Plugin/Utils/UtilsSQLite.swift | 335 ++++-- ios/PluginTests/PluginTests.swift | 13 +- 26 files changed, 1892 insertions(+), 1230 deletions(-) create mode 100644 ios/Plugin/ImportExportJson/ExportToJson.swift create mode 100644 ios/Plugin/ImportExportJson/ImportFromJson.swift rename ios/Plugin/{ => ImportExportJson}/JsonSQLite.swift (66%) create mode 100644 ios/Plugin/ReturnHandler.swift create mode 100644 ios/Plugin/Utils/UtilsBinding.swift create mode 100644 ios/Plugin/Utils/UtilsJson.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index f3047b3f..055876ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## 2.3.0-beta3 (2020-08-03) + +### Bug Fixes + +- Rewrite the iOS Plugin to pass through SwiftLint + +## 2.3.0-beta.2 (2020-07-28) + +### Bug Fixes + +- Fix iOS issues due to the move to capacitor-community + ## 2.3.0-2 (2020-07-25) ### Added Features @@ -18,7 +30,7 @@ ### Chores -- Capacitor: update 2.2.1 +- Capacitor: update 2.3.0 ## 2.2.1-3 (2020-07-15) diff --git a/README.md b/README.md index c53f0753..d82a688e 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ - +

@@ -307,3 +307,23 @@ No configuration required for this plugin The IOS and Android codes are using SQLCipher allowing for database encryption The Electron code use sqlite3 + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + +

Jean Pierre Quéau

💻
+ + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! diff --git a/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 0e27621b853d43c1d4ef47f9be6efcc92275ed14..ad0e4f11dfb63378381e9f6ea0320afa7497a6a9 100644 GIT binary patch literal 17 UcmZQh7jMmGTo$3p00yjo03p`{n*aa+ literal 17 UcmZQh7jMmGTo$3p00yk<0U?S5P5=M^ diff --git a/android/.idea/caches/build_file_checksums.ser b/android/.idea/caches/build_file_checksums.ser index 0256a76b1d41b94655ec8fc1eb7df24c76d47dd0..f1aba1a40b4eb7d8b9ac170884a1cc3767e140b8 100644 GIT binary patch delta 15 XcmZo>ZDyS?gJp}%rdJ#1JZA&|FtP^T delta 15 XcmZo>ZDyS?gQfA?@vj@_JZA&|HN^*| diff --git a/android/.idea/workspace.xml b/android/.idea/workspace.xml index 02374806..c0c54b7f 100644 --- a/android/.idea/workspace.xml +++ b/android/.idea/workspace.xml @@ -2,8 +2,27 @@ + + + + + + + + + + + + + + + + + + + - + - + \ No newline at end of file diff --git a/android/build/intermediates/aar_main_jar/debug/classes.jar b/android/build/intermediates/aar_main_jar/debug/classes.jar index 284870988c06bddb944ebda7fefa7317dcec0250..7d3d92d8551e6fc2bffb399681ab8cb412211847 100644 GIT binary patch delta 34381 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 diff --git a/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties b/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties index effee50e..aadd3ef1 100644 --- a/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties +++ b/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties @@ -1,2 +1,2 @@ -#Fri Jul 24 19:55:09 CEST 2020 +#Mon Aug 03 13:37:35 CEST 2020 /Users/queaujeanpierre/Documents/capacitor-community/sqlite/android/src/main/res/layout/bridge_layout_main.xml=/Users/queaujeanpierre/Documents/capacitor-community/sqlite/android/build/intermediates/packaged_res/debug/layout/bridge_layout_main.xml diff --git a/android/build/intermediates/javac/debug/classes/com/getcapacitor/community/database/sqlite/CapacitorSQLite.class b/android/build/intermediates/javac/debug/classes/com/getcapacitor/community/database/sqlite/CapacitorSQLite.class index bbceaad0573f2e705d88c0ae095ff593ac47e0c8..e5010a2b1a77328e3d06f1ac934208d34ec2b261 100644 GIT binary patch delta 1196 zcmXYwYfP4P7{-4$6BG@NSiuV@2jwiuS&>7Cq9SC37`!Tor4*ULT0%Q*m@P7vDU#cJK4EGIY0%6Xc z@B-f`CK2t7hF1i}GLd+ukw7qsgp=gVonCAM?)K?TwymEyU=BW{Xf;*PG$xZy5SfIM z#SG?Zah?#_Lga88xhx`&<>XVYuQe1<#{wEDq?Ls{N)eB3dX63FvJy6z*8dT!=^ zBH2h3o22AHU2f3DMk;uSwLI*OMy@h%v;4QnMyqT*A{%YQvW3}fC7JCqw^PD*Nmx58 z=@7wVLUu@g7u}lelZifdbAr8`<{pVjA8 z3HikxiJN6Hzp9q&`12b9{7wje=**v@{Y$ie>jC^rxtTLH;e4_$KIVtNO(ei35n}#$ z>;@t&fE=4jkxgT%-N*_Hq{4z6zeKN9JGF_2mn>G{Sg^K3wC&M$sJ6qj9YM53l4Mb2 zSv2{2JHrV(iAgj}-HlJL}k*HkCEKgMVc&&g2E2PO5(qfC)VnwvuV!CVzJyy)iR>H8Aa?zG^ z+3w()mGO_2o1aygzpb<>c9+Fl?k3jmADBaz zrhS_BYdWCmQB9xGbf$A9t;-ot&27zm!Lzr{fRp1lF-9$5idznfME@GXefGl%7jRDnG-%cMJC#Cp+6;AUYz-T1J*A#~GpAd0nLKTjmkNA%g2`;cO(nC~ zEGJuZ`c{@uMFG{6P~*AgF1Dg=%KVJ1*U9>`vR+T9%+01z`L`=vlgvL)HqA29BG?Yu zZ;@h`zM6P}-E^^s*J#D+lo4ce_8nb!gmSZE&Kt(cvaONRBwmW zTaP+i)i<+&6V zY$1PZEw}OF4&MC3Gy^}=<*~a+v5{ojX!6X<@sGF=J)RNfjhEenw@r}JN6JaKZL*Y8 zSZq_Jo<_d;Q(ys(Z)A~ea4I4@SLCPz%&qBJnhw--kfuX49YLT)5@k^&+HB@qG+7qI zQi~H|E-Nj8hiwk!mPnP}PgxQ*mh3E#+G|6e@1vGk{SE?!P8B*$==u2A0$i3ZQyGNY zA|mVo;%y13mML>t(# zTeg-vw$4Udxp~=RHqIV5mz9mT5PgK(MvJft&(Y{+ORJQZCmCy-nP^+^x2?>uDnhNA zFsmWiYRRx|EVMeZt)4<_V6`=}#x-)KCDque8uzQlE}hY>wH;862c5V$kFzO0)p6g~;@2nj8~9p3Q|u@+ZGgFU zOsY4X+i^ioWkR^)9sj7`aj6ESdRwY@q&gwhNvTf#r|OMw@jETW87a<6@xB!2q!^Oo J{QsPke*sn~1}y*p diff --git a/android/build/intermediates/javac/debug/classes/com/getcapacitor/community/database/sqlite/cdssUtils/JsonColumn.class b/android/build/intermediates/javac/debug/classes/com/getcapacitor/community/database/sqlite/cdssUtils/JsonColumn.class index 5592f30d91da3450cf8fb4bf62a9f0c0da2175d2..d07be85fa8353ba688e3d1edc4ed77bed2fde63b 100644 GIT binary patch delta 233 zcmWNM%}PRH5Qd*mJL0i(j(ved#SvYUpipXH8q%Mrh!wVRRT`9;+jdgBC~!SDBH0~u zAzekw$YJ1_ml@`LnZNKiod3stj}?-*tPxoxG}o zstx%{yxKkD?31BLl@dM5i?h|dX;$z#WL<~b)Y##O1M13S8l2GOluOR((_~1CF>NMv zc;2c1RDt)dPsQSsxbR0?r)Xk9yvcnKSa*+S_53u7*Ep#k0J-730gqEyi7S QfJaOpNb5Ab>OM#BABv19u>b%7 diff --git a/android/build/intermediates/javac/debug/classes/com/getcapacitor/community/database/sqlite/cdssUtils/JsonIndex.class b/android/build/intermediates/javac/debug/classes/com/getcapacitor/community/database/sqlite/cdssUtils/JsonIndex.class index 30f1589ed9d2d4a7a54ee6aba9f0c6275fb605ec..45a3485940921436374ea4fdb26a2ab51acdadac 100644 GIT binary patch delta 141 zcmaDM`9N|*E(ase%vJ9*Ya+|d{?=xB&F<3DeGdMGtFnBYV zGWar>GlT&};u)+N(ivSgx;adxUbWaT%0*c}>d3QWlDo zY_O1x4GSB8fSsLEN=~QF(>dp@=e+01f9Jm}F)SysxJbmpBpDmGt~G+nqaO@g9~(Zs zYNYBn;l0o@efrl((T!%2BM%4p`o&DsCuX4zn_m4Pd=?hD3U#W>tHZ7XJ3u_;cnIR7 zf-)+pr|LS}x>3v3IH?h3Et%AjONe3_256v~M#)VQ&9u`(53LN*#)wqYbg)Dx5xUr* zn|*pYrjJwlIb(ox2Dy^gw+!>hD6fq1&N!b;@WmuQ()(jdsSKu70t+gMS!FP%+{`PR zMU~Fd^^|)@Wi8`nMOI!F^BOZ^+-IFbu}0a{9y?-f$>+AoVFy3E6tJf+?2xL|-*%}L NhXOgL;z$@n^dBIuP-OrB delta 372 zcmWNM%PYij6vaPZk3#%@GsbVsFg7HqDHF9Q(j+EHkPtb zq-4WJHa0A5`~&Rllu~lLi_v0=9nhl3>2FtKEuy3VN34~A2p7B+n!ZP0#&%FCXX8Y z)Y3%YCfk0i!VRR*NU8{#G?PmUMYK^yI{`X`b<#=~-SjX>FJtsEPCs)D5ELcC5bF%H z%Lpfoawd**aa=ILHIv*i#Ush-r(;x>o{ QTyn!L-CQV+gvW6F4@IF+asU7T diff --git a/android/build/intermediates/javac/debug/classes/com/getcapacitor/community/database/sqlite/cdssUtils/JsonTable.class b/android/build/intermediates/javac/debug/classes/com/getcapacitor/community/database/sqlite/cdssUtils/JsonTable.class index a23b2fe5a7b1ccccababb1874daf4ddf69ffecb8..7deacd1859af3676d3f1207db410715b4ee25efc 100644 GIT binary patch delta 567 zcmW-f+e?&D6vcmga7qSb_`VtO(hT)b5|J_nHq@xmRZA`#nCLf9}4?Xk;gap0RQyX9QS!daTRN?EP5 zK+)>?{H`uQ^hdVOtO!+s+^{Vr1n2i%MT9ni$lzDgn!hDgL-k( zAekJMoNA6qF2^OP%_2@o35`<8X{q9j9OkT?;GDG3B<-A+D9v(*78&J&Box1)Ro?6U z2RbB4o6K@aKGQB=xGdkf5>I3dI|{Di-B6-M|PD9;wk|H5gUp6J<|{ z@r;j*@s)A4o!~DqS;(Z09v7R0Wb;z|ypkMVYb12FF7_4jcgYy6Y delta 575 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 AGynhq diff --git a/android/build/outputs/aar/android-debug.aar b/android/build/outputs/aar/android-debug.aar index c84e8ecca5238f352687eac41f8e081bc72afbd9..c6e02c690fe31e7ab6f9088e6181b92d1ab5ce43 100644 GIT binary patch delta 35628 zcmV(vKC!&5`Rt&>awmC?2*PaJG2oe z5iuDJ*~RkoFqv|)gpFZwTuWFT9xsn)&~Y&0VF{8cj*8&R;Zy!rp6mJSeZzrZ z0Ek!cg}2$G(8vfMf5DM6f^}+3rJ1t16sPW=6jKO~@kV>yKlxj{`0jJ#x-XsVHaQPE zaN=LNfyaQEzN#h7;Mej7>~);}4y9dH(R+Z%2r9t6Wv8tUz}?7mm$YU!$vMV{grI3M ztaKfopUldf3d`*ge&yYNEQ10&;vjd_3{ZRigF5374^gp~e-5aC%Oc&u^YFpRXGR0m z83-oZxMi=Bw}|HsB=kU`jH6l)7Y=RC@&pr<)Pxe&7lIZguKPKsO3=pKAKv<;R@H zx_Y^1ei`3PC0=f&E`s1~(l2rY1{1acMXBkP_dE#Ue~-=6CjAek-2`2HSku%i=Mlj} zGj;>YFySskDqLK&+$&}i?lXnGwB}&2e~~132aU9eYQIRUlPidSm%P+CP`&q`C*&kL z>Os-*;4%<^FU2Uzu2@ z1MQ`{f6jyoBSOSdJlZfhl6 zs2#vjWWP+oMkHlzwZb7S+TrGFzrErA;A?MSXpqqgu`hVRkWOyQdk2|*&;Opw&H8Wl z+j4%1-~X+pBGL*Wa7PwVsX@ZBH&wC^{562*e`aigTaWqbwKXH_g>C*_1^CZ#sQ&Wt z`qqhgoO>SZVqPB)rc6)K%F8pq909_Hci24XSwLz=d!yn7NnZZSl`2oddRJ%AvsbKN z?3#D(ctG5QuXXk;OC05;U$CFz>#|xt*|Z$Ppt{fnHIE{C(u!NZ5`n^oH(;LJfZ>c~ zf2l#QLes4tsgB0Ie%ZTxR=@5={F#4dro}s6g3|m_?<%lqo}H(Un1pf3J3k}ayMMmz zS^we;ymxUX#;f0tZv85Ur?2XzjKwQzUe?{9{Kch9x9CMCPSY6e&vmbkMZ<=7+<1of z6%2D#7A~7Z>cg1T5e0Uu#)UhN;r-d4f8ERY&h})vaOxdxlqk3Sg9R znR+uOcTCP=qFgvO*Y|etW1L{Rq*hPtquU`#@xhbO^_P8O2aGGJ&lbj??BC5?rj3{!l z^J8MG;_x@Xc6UmrGE*gnnhI>0>lJ}sQmksqIUF5kT>hNtZ?Ar;K+X!t zDH(3E>5}}nv$#$W9rn45Cj~&Y4T8lYgKO{wCuMy*RO=FEVWOV`SW%^tgyfkm4@27~ z7qi)>kDDYZG0`AIe~e@3M4#bJKGinTVkri_goO(&;yi%Tk7PPoYSQKFVJEmxs{s+U zYT|H=&gzPpXJBukh%>=*91Z(%fkXub+1y99YnLiVIwk7Pg6O}7xoR7Y8+n2)HJcb= zOd9Lxq>Sx~pzBytB|&)@kua7r?m(MlP&wj>`C+v2swMg2e<v3>~j7g(?BAXy8&4o0JIB8!Q% zZ9w4kpiT*CfAY2S?h?R&fxa~gp_$n(7F-2pF<>mesh90R8uf#wxE+Cp^%)06ur%h1Tm z5qCPRhbPxT@Jk|Mzf$`|MrB^NG~!0<&VFZ%rZtbyf6-=+=SO_N2ZSL8>CGv#?&!h` zOeT;pd@zR!2obV16%S-W4#8xVw%YgOita8r)plX zf0%x=e@&udE#hAo@D+D)DP?c<&zQ!!V@$ML+Ia=!}=mcA|D7;U~&E8$3FxtbI!;#55lprr*Hndfi9)M3Q zf8JavQkWV97G;xewmLB!Ib_#x#D`00sWfCJS?Z$($Rt~B1bmp_XuOm;xPUlANH)-_ z6xRUrY<<5!U29d1jWY0LD~An_C7a)W8rpx!$ucqENz9Qz;Q~N!fD6tWSke$krnM2_ zKKTRTKM{A%$mKjn|oFCA<}tJ+I=e?epj#6V=0^_?=b!?R_*wSA6O95l6j1GlioGgW=t+71Fe6d*t$gt2Oc(r&VSAb zovq_*E@3x<2v*K=oX8cg7YaUc3bA2}y8u?|Xt29tc{~`_k$U{*FEgw?g=}o4e+969 z+E1^&65qVXtLcqI*7n;Th=W;ZlydRR+Pr3FW@?G&4onlZXeosMgLeQ_BbFIo{PIYP#UTC97RqmsxTHW^uKOqg?g7 zg=(ZjF1H=nd5EuS(iH_fw~lrDkVVhPtVrtktY(~9 zfl(0K!3nh$o&}WPy<0xTf28nOEb?-lu@TSd`ww1CqN^jb&dr*8GK|j73C6~T72{9k z8Abo+Z3cDGH3mVDi>kg zmTk&7zWFV#bnZ$M3<2xlW3H;MvsUJr{(Mk^5w)&jdpu-f>o^w1Ru~YWPdv@qTwO~7 zTQqVjpv6ud#ScMUorL~dw<=RA3=*^##cgLk(l{od-%E`1G!$6HnqJU zw6O&U$M#63C(xHBpHD{5D5)J^oTmjP>Pc-zO+Qi(aHGae0MM^o^>8hM{KAUI@mHkr zwX%z)?#EMJAa2Vm;MTxKnf2g#6I?=D=DQZAzz4Gb; zbu8lH^yuo;ET3Qr#GE_}L~%0KU}?e&F5N*it7K>8M7AiAr3uRug+&skm)1sU5y&G~ z*gUb+f(Xb>naW?$u{l>+{XE$nk21$V-fG-KW ziX`-YW$I`Af2v1xY1L?nipow2+I57*3R*u?KT}n<`t>`{necx^Ylk+y-PNOOVD9Yb znwXU}&Yjtn^#EN~xna2ZMC0{DP`37Os;>CuQ;HW}r5heOT6*TLf^?l?#6_lqQHp~w zop)oLyPW0I91_#M{-!pEU1E}Q2Y}pybT$O19u%hBfBW2^WVB2)`{sqG=3o8#6E&aM z>BWXys-gEW$g0uR4V?3uK_qq!0VWI$ymI3+bcRSH;JF8B<+M)r0hTxWqq6xp(%963xp!5|H8xf&~i9K~U>bpYnRdLxX9vunJ z6`0adf10pcn@(T&KB{q@%AX@NXndkga<6cPU?p5f^7tf1e>PWlL6RWP>`{rdg zf8u>!E`(A&n5v}IKtMT_SNxx4yEltM=V6J^1*0&l_w=;hxU_z4Z%QkV=<`;!k8_f^ zoN5C~LvQi2hvO49)uSFUm(FQUM)4P0{lDz@CLIUv*GTMN`eXN7{W{j|uEiQJzBcXy z0oCP11LL~4^bA~LsNX(Ko*wo^hA)`qf0YQr2h9sJ5eq*u<6pvdbvM}LOAfM00kXln)};F&)qAl8-b4ydQ~oY^f7&U2 zr@20;{V(8mP^lEiEBRVF!NF(}+aNA3iSSnxkS-(@j3vt}vJY2MvOt8WGGg|ILe*FA zv+WMNjehek4asGH;HXT;Ky2eA#u)etCfvg=0?4JuKmH7U{X_u~i{m<@0LGC!`AfU*y|kITe}utYP^T|p zpf9T3U##6>JC+zn9=*!oj`qz+( zBCQ6G2<2eL@mtNKgEDXWlI9T;yq&ga!;nA0WVT|%isoUX&SOQVzQ$t)UdO;`=TGFx z8|4)|4?O2>N3Olas~ZiMe<=C1r6K-OjAs1&B34}g_}WAA7vbrBS=IH{2JwEldp9fT z(ZG?H2YSBm;!S#PemJ4pFzxpS%rE+JQdvmn*@OEs%~r=Z^kayZm;*zGxl3oa_~Ri$ zjTInbotI!*YBtSCOvLDBum$QeR&rTRWN<-fIu)qR=8yyPgHA|-ewoX(nr0xCdcmm}cb_n_kbGm4tU? zCUN~d<(e#an_O{rl>=$Oe>(6h2f(~>=zP0Gj&;{WiI!7VV?&HX9Z#IM&5CT5Ykx|` z^QE5ogy|`-U|#p_f6C&slwGUIoa_C<+wp+dyVv&AskgUXv?99;(9-xT#^@`HRa)g` zGMBE`QEIp8976M_LC#H6o`pD#L$mpupV56A`m5$it%(i;gE-F#rh zClQaz2}>?Npk?9NE1Xswhw=wNe_ekGtltlU?h~YnI*u*{ zY2T%<8eybKtB!+H*D`NUn|0xago#ks3wL*UNPz50>L-F;{d@^6H7f#!-Bv* zj6#B-jq^)BiM>q8+Q*!{O61ICc#3fRz9!qp>kkDnnpkE(@F2lG*1gL44bT z=Gwi?nQe|9JD)fjvS}9$#k-hgS&E)xm?@>D(OOsaf4NZyq&!H+zt(KA?l=?Rr^hGirZ`qwnn2Kn=?|_lRm35Z9j8*^93!{l6 zLrmnte*+s$g_hhX`*;?M9TfJqe}F$iY_{Vjr37r?mmv}O>%o5WMPZ1W zO1^71cu%Lf@yy*u?Us2+UA><{JI#)BwcAb*$d8!w3@X8{tPxc8r-A)Taffa{im)QA z&s&r`B;AaDzmR^=VBuzi845c(t`L)$-gjyn#PU6YMdRJ~$E%9Vw}KPjXKSa|flIY| zf9FcTvLM2yOvgp6d?zlXv+|8qa8b3uIY2Z3&g(y3@3Lq8hs- zm{Jm~Q0dE3Lape+jqp8pHBAfqe+nl}s0E{SY@og`D7UK@tO}5wq3JG}I3GCMlgQiC zd7DQQR*;_5lng3%o5rH@_#CU7C%+jaK#cZd#|%oC!S%nDR;9obW-g^>4hGTG|7urT zD24~H4`flnx_`ft1h+DaZaFqKyYbX(f)a~$!_hwqS9!h1&d5TH=v3)M;~_%mFF!h3uSGsEH~l;}%@lsh)uI%%kHerW5;# zSk-jwnDFH{^IEcwoft~0<9KmY#AT`*reg)ZOHZm*%V-+d4~@=Oj#KvL7)Qu|2f)7r zu-}24yPpBsGw&h)9u!$^f16C#O(xu7uL4tV%B#DjF%+}RGyC|8H9+!8dngt6$3(Ts zEmOE~!VRM^bnlgMTYHQqa?`6f!pi+TO~q;Lp7u;pkNb=m+2khx|G@S(LTp+Nm@}@5 zBaBu?PEQaQv3`l<&k>jS_7Qanl-n~WNVnRB;Hh3=YeilD#M3;&e^yF>7j$JUNBLUk zkLu?4VsIoPxBS|Z5`-fs3`I^DkD@XiOJhBu#d5KMk)9G6QAr%Gl?KOl-X3rqTVn;g zVhO;J3LuaQ0F&m2BQL-YMXrdlfjHX0nT`JZYe!xfiNrJ-MaFu<#(E-&<$@qp5oI!| z%=g0loh}LF%6e8TfBpygUu^@+OC~uXU?8Bc|7^+sH`~C}%+*!h&DzeDQPR%Q#Mth? zxChFziXhBLztaqKwM32me~LNJj1URfDF9-OxN*W=p0c6j=9-={;{|8InO={OA0@G> zgA;pfc~^cfpBA4_f8P)ep?HZwYBicPM8R*=?YR1|jc5lse?-faSTxg#qa}}(ok*97 zAGY)=Moa-Z)%pFPG?YARZ>d8&f|slxdv=9b*-Z*-XJ)yT-x6eiM5_5xCjTT`OGcrC z{i~27+!?#sh-n#T#?p4}d1x%f%12g0C|VR{Dg!<&d-ROZ;?A~hwC`cFD5k!fOd}KY zw`OUEwJwjlf9=4$2nPU9x{{^U?9A=_-wkE)xMEDAxj!dRc_+6AqgXlvxV!d9Lbz^%LuMtPNN;Tuuk)YFVDr{>8sk5WF5S7B5o(&@4l zWUZIo%g9qG8vQ{3l_U^mDsUZ0AfP`8KtSUEe@T*Ye|2;ab+mK0clcivrD=QxqG_W4 z+rK4a-I7D$fescL62hHqv6ZbO7urSw4klN_Kv_v2HuKz++ni-+X%VW`X&bZD75}QI z?|%wjxE47pA^Zs^{7(6PR33Prw`0knQ*SBQo#1}Y^(8oPz5hNj4E&`H(*LkW5!JF9 z9;t%f#^>f<$R*YXQW(W zth=0`mF|spltt|?IjI&pJ{=_nrtLE_Y*hu{f0?OZ34ZYT%MWswBHng|Y-2RhWHGQ0WQqXzt}kvd$p4(@*=3 zf2<69zSle`#-pnzca}$Fn{iu zjLQTGsod0J^g47|rv`UeG8I9EF_?ojhndu3>kjrhp&oDH#i$+$KG_*Xau>@|e*>;c z!tE|O>7ld0z_ZN|Vr&`)$v(tngm$ARwJnx=NOc6!#j0hmtZOn~V@jBQo+EUQ4Oi5< zpTj7|k+FzI7reo9GaqxSKl~!r{-F>Eo{-}UK~A}g9Vx*oa<67yt=JtkxMh9f@3lB~ z?=?2jb0`=Tz<12f9Mg5%7~S!je;Dog5cnFsJ~ufgE_Lg*Jocv!fEQ$X673~kRLuxK zbIbZbCO`!W?$cTOjnCVkkuJq0Q*|sRg}((IxxuS{yjYk|E)9r$>|jKZo z?}^PnChJ;u2}KvrunR4_OM-4_X0qQf3U0E~f5IOFY5w`8knyF{ z%_xmpQONrd2XW|54SX$JIta8eH(ycsELo z`(0su-uvR8Dyfa&fAMaUDCj$!;`$@sOCGE%o-oA~i>zne+_D5phZ65M3Y}$9^-Ir4 zAO&@-2U2dkHjSiQ;v)LejNF&)BWaTM5p4Tb@y;M`6H*B{15P6389HU>ac2w`fIFp$?_h&V@ZYP7jHM3 zWu@kcvxw1Z@l2d|lyZy%=ehNUalCb(4tie{?#4fV?Vh2*TM-=1zs!MfFE$=e$=MB$ zwED{p=~j1?Bg4r$q5h2eA4t^%yFPxp`nu}NP2*!3;2bU z7m{+PaABV`%6gKKjW4qOVQL@#(Dz5}G=Ou6N9-%=sV!fTtABJ&fEpEh2v}Vw2Dx;- z1=U0YWACu!KWm7-^!mhSIBFLCA1g;x&!Q_Yjk3E}fBn~MulYu}n*ye{8?F)Q_S}{k z`b$s)@+YtLZ8Tx$6?;1hmWPgZwI=qkvvnE)iY~BymJY^Kl(1-9`-IWV@49tR;*`m> zSzRwD2@N9>z`SJ_@0`ac9;gpspoQ5jKMpU0(oS7?xl4m>Z;S)KqGK_b+e{Sd_-rzG zuVYEEf5o%Ze4!^4Aw5Y?y~)*Llch^;lH5|BnfFwN*?e!5ex@11#qJVe#5TVAU!OM8xmwPj92@*D%g!Q>It zZDtb+J*QFB(}`122X*(~|0Ui&O2(!(5I{hOe{euRV*efSmUb{R_xj)3t?P@bj;5bd zn#YzWA}woOXw;dy4-FHIQJd=0L~fs!z8<1eK9#8;O=)eh977Ua=`})YAS8a^bu?rP z^!IfIlki(Q!0(!eHHE_()P`W*yrAWM%lEGB{WM`9;1hh1!4F@Ebey&kp<=XfIumLz zf8q&$?3<-0@jNDBw>ZmogbTPj^EI5@*7IqCAI}2!iIMw)X zQW`U^5Y$P)Y?SwY0ywiE;UFv*>B$(-@bMngJj5f40Y*Z8%2PDhgVQ@Q^w4E0PmM%! zby6gpHuj#>ZJN?r3X7a9do411)*4x@e?T4mD~_|h0c**2ZF;KGU8OlaKX%l0xp-ML zF~4!828U?4{Y?COonKiDjeuz0`Q5V?O;#R9=Vk?N_nP=YwyuQNZc22_MoD)OyjcZh z>ue)WQYjgh{MhPgWcJe7KKf^^^j>PCAdalOBuX~A>WYnAhe{R{_=+};LFA~qe{7zT zJiW<0nY(Pv=yADsE^}s*0IT^X@iKkZHfXzL+Z;VDzh!0b;>jmn&fgi^9L;@n<4FL= zMP|+6UatXo+21y=$I5o0hmAAB)}*_6vsG|RgFuOv+rF?i@JkGXDq4U!abCnYeDUVF zzKaUGSyj`@kIgn9Z8U9BW4o#cf2(p)K7$tJI;W&cj)X-6f_i7RcCg4$3;YB zt9GPL1f+Wcg^Z%BU+d4JpPa0&&$LlU?sts>k++(j&6`fLz%gnN(jfU z*;eN17&&RObAI?_vhm*25}WNP33wI@@2o>g@RqUkrc|LuBV*t!=S-I9f6f{Fd++%H zrfhdO5|)fPEAw3=gVlgdQYo+45>2F0MF;{L^=2>yG`j~irlt0f=w`{GdT;rmyPnb` z)7zw%=n$$`N)ojftRt-#B&PPt3~z7k|x-Pi3OTpSRP8Z zhS1{xOyXG^7A34nmnvkle-BGNGwNBfw;KRmZ+K!Anpa*7N&uNSp!$$iFC9teNM3*# zrvA_s+mPx5MH4*J5ZyRY(Z&gSjZg8zONA9>y>ze2hr9ZTD@tn<2+uv|nqA!K>~0-h zU46gRN-(9GyKpYW%r3MRt-#nZ+BeBIzf{Xb(G3RrS8KXaZI9?re;-*@*j>0o7k__a z9ep;8Z zq1@UM^R>YqvIuCyfBh>t81ZK_o}zKb=|Y(QosRl`=hmOsoX*g94(1&15W6P(@<{W`{$t#skZwC$)EnVh9c(+~7mr4Q8tN20O=OY6tzZ}dRrbbm zEz*CWWM9w<@avt|a|6RxzhZr0r^@S3WQ^c>_+uMr_^cn1@g$yf7C09mx7`vS%g-B$ zCrYnxFNrRVcS>mm3cVxsd{1JKhvyqPrTpAn(27%Jf0p}Ko~eVU+vK5))X*Y|b0bDDe@Tc_d*w1&k@7my}x~ zN+^JqhPI6NaSE$Dv@zD07jfceNbpFI$TTb^!a@SG#xWH!>e?21{XilzOq*~wQ8ZLE z8*nILe<|P3cG`GFagVD%KQF*?T8W>eT1H>LfRb-QrjV9@OiCbt(jUiEu!%>Gs;k|| zZHH|StKo9hmLbc2`REkXiz5b4x<8tk;e};zYRs>2NM`tSay6FdfvWvvi-fN9##%km zEBtRUlTnM?4OQ3CXy;vvv^ddjoY&t1-E%?de|)Ir|JJe#e*bbK7$6{ijQ?gM`v093 z)M-I`>8YdtI$C%$retvBaS*G*l!hnQU1?Q=ub^1T2DhhxC|JWse(-q98)nXzvNDzd zd%{dshoHsipk)MUnBTOPg%Cx<&{Req_7_IN+!wdS{Ofz@o0792nVi^YcyPGL^_>rF zf9LgnUGzr;%1jVN&W*O`ai|}Y^V14wpIM;C5kL{f+BrQgK@JeW5N7qbo!k9&{`nPBH5M$+p0fD5)V zS=_Z7U$L+t%6D_|urMkT`dPN4c*w-IjLRZu2YU@zVcy8{RM8746z`%1i2OQ05z;w&&I0TPs*7n4x`sLjP-L(bns0oWOQQVteYw zo8gJFZb3`GsN|ATG3k8Lj?s0ae{`bd()`Hs}t{>IMcTE*h(GCZ$U1K_N0ak*BB zvf?l=-^k?Fr8%;P$b;u-()zxZm&s2l%v&vqkIdD0ooH=;lW_-!L!rlgQ8UF}%WPmv z{zJoS!>!t_GDGTj4O8$(UC>*ePd$UNt){7NnGV`lf4tjk)+dyY+=3&Gf90=+3`3|M zxf{-wUJE;c7m(8eWZ_l{>wExpRXUu2wrW>}B*4$HKr`(hyO6XEk$?L#PEo;Y?pb9l z%40~O-VroNm%vqKRgBLZu{mT-q0og`KphnV3o0BhW6ErtRB*`-O^J{AbFF)*#M(dTc-yz@ zP0J=1SCRoX>w5DYcCynrF1NLGmcSTDGFY=I!iSSGsL|!k6p85pSsE%z>AV{AW>>|f z%Y}~}HQiDpo?Eh7rRp7(@6Af<1>1To8#WVfk8N*f2LxydZ|yUOWNds zQ-y-ec>ho)Mwzlc8%$}72v_PGH(ej6=gfnP=|v_djCqWp;FZSFL6%&HLpZvk5E`fH zk)^>bEe9j`b({}@e6~kWKJ&x5OID}+U0y;*=0{OJX;b)KOhr@((1k-uh=ACFMwf&H zaZu=2n~$pC0%>8ve+fpoZxlsnIqZ_x=%8T3qYa4sF-NTeT2ZmXRG3`@YqL*nBn3$td2RZwKlEdTc3Bli9T52=4{&@52e7ZbHsGm>@ZZ3JY>yxYe&iVi zM2l(w5#~eqZ)u*_NM^7-$)RLp-aW@NFp_|iI|t@R%kQy4f5WD9^R5p%r}uy30n`V; zd-Py@CEF#f2XTTKrwd&l#F)uOb0Q#p#Mf?A%4RHZ8sec1-Xb!?~Sy%I;&=5 z#zW>87=yLYrvyZ~?9Cx^;j7D9qQPbZ`fa9p5;V!p&|%N-WHUkJ&C8YtBChJ}nO1P!LkjVTcf9R)iTPYQdmNV<0v4>M-%~|88jEDtWbPqq4EzbGpWPJUV)i$@;?8>Jo zc|+m6g4Z*S{`iu9VSDQxF$S7G`EMFoe7b7)2-c(UCE**Ple?@r)Gd!iwfg0wxdx{- zRd<^sUt>1;B&>KEyY4){Js<0jinqKN)EEgeqMj#7e=*8ypsTx&u5q)9Lq^OM5z~sg zc30c53tKP&xl!JbYL8zZXaI+2sF~#v*L@Hs+c(58jav^iSGPVAs`ou&CPBf$vldP( zG0><(#3nTB+D=S!hSJ)d?+NAYc?3jNi*uhn$>o?3_{mH!+wsg@1ld*H*?y2(Qv@al z3yPPUe=?^F8BuGpXO8`|BeR(|D3)kPWpDOObO_IGAS1L5bnb&m;j*MXe#cYEO#reS zoQ>Z@!e7ePhjNS5hpM)&G$kDN?qyo6Z&trkh!@<%g(j0lT(~7spj^1xpRp zf5*jCT8~1V+%6nmD~IFs8Qu&^TU`-%Nouggt@fk4+ZY3U66IxLgl-(V&6? zj_<{-c*>v$utGeN7t&nKy+o}oWBJBl*)`4Km?(j4<4hCMDpB1AzC};&k!Sdfiy7Rwc8ZkS{Pk?5o6{`mw5~x8~G(q8Elzkcf*-9Gcwed9r`!`(wwR zT=ar&vcfr8K^@Hz;#qv}2Yq(MulZwFBA6p7u?iNL(DF-m48_tB8-?+PDTotM+pvl> za>mH?=*mrEtVYR;vzE>4^cJrF!o>>{Ah5Y84l!}Ceh?Th>c`Tz`Xjaxe+-e&<~i^w z)OV0dN#pDXd$O2Wz9|1?I5!p=Pc&rZ^5xtgfr^328-Qal?f=L+ySF=whg$$EUylNX zvg!N=(qYpp3i%_$KOMM&XaWGdM}=CgIi+#Uq7W`SwE=9U@M z2oK5~^iIfa#PS;Hd29*Ke_2qDmp0Iu7UovH!E=f9`8_xe_-hys|DansIxS=lr}@F| zvS!VJ=Uz5Fqd4TIUb>+|t#BzruWs{J1aZa_1Q=*=cd*QntP_Q>Ms7-v+Oa=Pqc+_% zp>r<2a2`dQY#S=}mKB(V@0=UoQFzY*>&d9SwU|IP_aA^BNhCu^f6tm-Qh>pt+WGRZ zzo_Ce3%2QMPPyr*4NlogA_~?_C)E_}ST+==Yo2K7g>rYMxBc*xslwWGrLT!zlQrdE zT$PsK6AnUFg{?ZE*dP=OkHE_el~7-e7iajWHG#%wq^b1~&iMyh={GZC<)z-jisL5x zA6>4V61?7yQ@;~Ye<-7p!}lcBAUZcdaQ}NgJcp0%a@4#P?svBwo(eg0zPFzDuVf1Qf9UCtlJ}m41Mc_S1MZ7* zUj+U~rXbZ(DohKL7*O53$}xYOd(WY0dY49djvez9r>3nV5oiydMp*|hq50eNK1lpb zT1Z50r~Yq&TcH@(1fvQ&g1IqMFFg)LD=!t1A399MBkQg=SIGI4#DT>|$@l_iV>AyN zul4YyO%lk3f2sYKW^dsUM*Ygf74(lZy{|SqgVo1mSoV)NKnDJ1%@I20^{Kf*+QGr} zIXh-R#0I{XC_(@udVng(?@(|D8OA`M+o7V%(*n-#u}EL4a>9U&*PFzNWAl4^?pF`r zBce4!$S>-HRHG+*FQrk|29xOEUgzk*up#Di1n;%qf0Gr{F0(R`qYfEf%-6`1MPMcE z;M20u0^h%3r9$RL5+oEX8@%giNKyB=A+21=+#2Oq29TJD@WLI(j^`Rx*HhC6Mpx*-_F1y zL5#{6e|kjlli=?5H?3Pg8r+&3^q8;;aS{EQVbn4h9j0A^ON3D{o%p82EEKJ&#)d?R z(n!{p7^OGOayfmTJ);W-Jrt`LROxHm0<=@`o2%aGY6~4FozgsvSw}bksJ#9R21N0+ z>~c*KM_}a^A-qgOR?7OvaiPjdC4EIu>6XLU>IReGS3zv2bd7Z8r_hRSrgAP~Ya^paXZwi2c z+4H@nh41h*__Y04&f(RK;;*yt`pd*Ht_nCNyZqk~aetLi@ChAR%NQh&a0Pxw!NjFg+sT^+&2)BI3dq-WKiGwPUm~gqm^GH0I z1Xj|}vDwG+FVdy>Zt__t_ZGhkj;yE>8{igj)movEe|ap@WCpC#WWr|1rw4K}kCG)I z;aNCTzK_Z2M!p?#fs%Qia1l5X8vZc)e+xQn}Q&QrQ04(W3n}|Uv6`P=^f0UW$ zw^lr2i@&M(cdtz>qF2a>+!lY6<(%f9%ZjsBBx0Y;MPlS_V6(_)&SKoecR(y5Mcu}b zv?J5$M?6d#ImiG*;YW=&|HJp?gk zqYsrt%48m-&i%wqK-}F3Rl{J{sfOwC2(K2n8Z-^uy-1ddgmBH63o?dXU4hjAo6-8d zB+Kd=&w3^ieDrh2-A0RLgUCd`Sr*uP);)>d&G3ARjJ&39ft%*kzKCdGmR2gwI+ms2so3@?_#9P5;S1I(0*VG`_? zMnNf9pRc66y*kl@?ooe_}A>Bu^K0P;;tC;!ns>Wd7M|+OXN3n?O znhvSQ#vI3<7Nia$tzmqbf650tNN_Ek{x;&6^$*DL0W=HJpONRd>|(-BevLAzXNKX3 zm6GZsv=f<&Sshjl44iM_qXqrn-wi7FyHLiAIp7z6&h#<#5VNT`bm&usN_~$E!f@4bLRhtuMrX?AcoO4z{qNR`A=je;t=1jJ3wiSoRJh zC1a_RM+hAfBtq`os~0&Xc(lwSy-YAh*~*g3DTt?8*6@jFtkzQkbh0;O2CV;;q|Y;S zcOJD^yNr?p6y12{WHp+AnjN--Vsl9ib;fIvbMmXl35;^B z)vjIuNy{#n@LsQ8?aVSwuUqvJ05mRCPrQNT8-T(34sKrKBdy)%-ZiQ{0NUIk?RJbG zZfyMZCp5_ah_sJ2HqD(lei=Ir#gU*D;)QocwsZ%_#5|eDe}~oPl+W@6l*#G-;m~St zOaXjHH^%xkC zgPQ1l>MN9_K7~qM;SiOhw*YN6H(fbVb)GRlU`CD!f_pjL!w^Ie@NR=vX!J+$;N$1dX!+KiQyUNk5C3V@=Fp{R(Op&R zfgJ<686~}i!}LNUH@NYC^s4P)B7wBAjGM?7s@gbj>YhQt>OvSJ*fFJ2wp}B@O-L-! zD<$sSf278gtdq?D)`^q%uM#!Jzi88?&>goG&z{H^`dgRTid&MU8~@J3hmg=GC3^@9 zoy)X;fJ zq6JQl-Ee!#_RT`UCs0}JeZ%ityh79kF{RJ(MO@S6Op!%p(&U@?clz0=;@|Vs`6&?W zx%SS_tPvnym)X!?XOi;y7R_(7cX*CF3S7?Ot0*c^&T3l_o@8c3ZsBB3QQr7FYZlL) ze_;2g=~-`bpX3)yXGodTb~Y_`uSQ$9-q@|qQhaMNyE%=`FOj!^sHfoMJ7)H8!%M{y zZ*1p#X5hPN(xh<2XC~cFlGM)uVK{MqF1PErziaF>IIixxZ|*J9pFgUg)opP&*8RY9d*us!-TGXu7$yd zJ?&!Sada*A>0yyU0l5eqjm3RnlPj27ZvbLrSOTBjFJsxh67Bu)tF>MoV9Qd|fAS9c zoj8=sm_O#8niMMX#1<&}n;A^s!deqVZAXJ&mjnH*y zHy29Q#tCR9jK?#G5UhxWBj-@oe}+xlyCCSmb%&c~060L$zwB0&IW!}^%g-I8=5@A_ zJ=nG$&z>EGj^)gVOXVwS8ke%7GLs~4U2+|#aPoOL>i7bhX96-Cp9eY=!w7vUY8+#>-7r{#-k-op-2{;Gg|<0Ie#T- zK1E?Mqvv)3{o54m=M@?26>jHM!1s|Tm*`kybIkUl_{@k1S${IP(b6_7r(mipdwToHv`<&Z%W>YFS^Eg*Qr3B%~Gs6w~0j+?}?WT@o9t zSyQ>M?qTcdl&fc2;DdRrkER_?)cVx0Y+Hzy*%SH1lhu$etq;uDWoveokAIp~7LiSG zXSMoE$MnA^POa}XqYQ~;s&`v5l+H29y+iQ$RgqjX50Thz!99C#?{~!FlrsJCmF7Ie zV_eQIWD`eJob!#%j!da%jIMiiZfg>Z6j|+VG&YPy4fwC*m4p^YD(ekTceMLDv#pKkllDj} z84~;AB3MGIqNS2(krb5={3k!EUo&Tl*HcF`L^drEf}Ob&cT6Ak)VLFq#R1Lf@VJsy z*Asl<+OSz_t_0oFEuk1mgt)%|sz@u7UE&y{2gVOb#Ywmp!Y%(3Uw^pt;Fm6*Or|%* zBn8R>VRhAO;*=Kc9kV`leqrBQ_E$!O>Rr8q?MQ4M$GPvj2_)3Z3$w4RiNEIrbEgM; zzrg=5wdI?MIoXH<0TIUn0V(|dQrrKY4x<0pmo&3=G;{u6fNS-G_ElYd{_UKe>5(NT z%}f|*K$t)gHWp-@XnzPpBElLbaRER9^m?F4yQAHxuO{?9#8T5a;DQCzdF7~DCXNwz<<+v78us2qQ9JTdomz9 zN0QP%tXg$%)6*xX>Ab-EJChhR-cMHfy<+pdCv526Rr(CZ)AR37y=7_+>;>9S7-*fS z+xHD8W7EFK6x@T!99mA~(soQIv%L;xmU4%U4;!+#lGA5QsYe!{Z%9VQ{MzU#d&XVI@zFYm@!8m+``6uHQ?g8E3e{_E0 z7!+K7E#4k#$lC5(d^!eiJD+mMZvK8gruhyg1sKkJEq^94Xg?_Eez6$nALTK8o*JAO zbZ*n|zgLm{o|SvQXOS8F{or_eAn*5`P6}v0+4kQe`yEX8@O{wh6PPsVNtYJxn@>l4 zdr;`}ok)*=dtfr)H`3%kUFv^(z!vz)mdSrSh3)g5Os}SWCzSCwo2<{2+`l{3As^P4 z@gH}*I)9$_&*wcTx51uVp9=1vJc=IRA?qxmwNIK!3k5yJ3&Ieb)`h zDHYeD9&(8_QWc>DdL(6AO9FV|FztI)B{Dx2vt z?SCqd>s0M1v(Ty;Rc7jPOe;6jv4vwlO66BQRZ^p^>fXg<{Z)DF{4w}y090c-TOqIe z8CRmd9g522npP&ipB|~YMODeG$*95`Sks}KRS?57Jc!C*k5AKreZ$K|@@s41S*K&e(;~rUBP?={q=OtX* zzG4Qqf9l&A#GvtTO1%)9d0<^esJc!Ny5_T@&^hgv_K{gy*N#@;mx=ow1l^Ix;D5O> zAjhtKnV!}aXyrj-V1G1CE^w{J@o3|?jC$bSnu&d>E@OAN-mZ1&F4L-IU0r(9u#(IF zOe3_{m6j>D2qC0(N>im!PhV4Suc^*i+1SXhy~`+`P(__bO__05*VNisXN0X^n##)F z(xT4MGFM$^fR27rZDng2o3}_!seh`!tGK{~-uG%gNt0P}sZxf5Lw$j!z zV^>@4Kvk2Y7Z)`-_i45GQD(_hi(la3z zIPQ%>fGn^l5elBhEvoGq!eJ5fUBq9H$g@hVU1ckutFULLe5&mBy|ib4xLkKc04wF0 zHm#8bSpzb*2Z=%8!uAbNag&i*elTCAT-eZUuc<5S+6!BUwB0COIe*7?qpLNvF+}k* zwz0jh^l1nh3rjk)bfYPooaP%MyW2^El(DkS*lwxm%zEefmGnu+rhnvETOZThM>I4+ zv^w|`p(@f6Mnzol$LV>0eqSUG$#bF4oNQ!isLIBIeWgCoQDQz~4Imp7cAA#}wwmkZ z<9#|qMgv4taS@(n8Glnc*OcTMt}1e~sINFb90Nu;6&lhyQn6!d7oDA5y&i*| zbfpGI6d0-Ma%^pWJ$7amN~4W~3j^#ZRwE`2X9@`5rs+t#uq3Up8Ao`r1?=0CR7f;M z?y46dJhm}j^`)t?u`Oa8h|mh(eq5%lF&pa2TJUw@adU2gXn!D*!~dix?Ea(mL4Q2> zA~`K0jo|0i?wPH|fs36+d7o5^%WYYInj#r&?XTq8Qr(@&5?kmY3GHQx_7l(#2eR7b zNg^X3Jm9Y`bu+VB%_1+5cTrkE1OnbQaruXp--S5G5XNbz*5VbbB_zeXf;HU?Tcfk7u-99) zZI<7e=ysI@@m*R>dWh>TNJ+Eg3)wBO97Q}>Z#6UF9?r3~3Lh_NEvYNS$ihu3(Sc7C zlPiKe(#{`BQk$iVogI)Oypjda{S1ITi676XFY9Y0QO&gJp;au%WLY z$;~jwtbY%cE;o!?FSVsN<$%gdg~K23cA!w&S{l8~+-zugeSrsJ|0e|)ifZq3H*LUQf2)aD^7Dm%S5 zr>toqC{L(6tPzgjmazWNwgC5eN7qsv>s^2yMLNC`(q;bbMp=*I2-g`oZP*C`ZccDCxT@KR$gIC4zmB zB~PVpvveCj9nwIKg3rN~wrVim?n_GeYyYT+MZqr)0DSkB!%b_a_`}5Zh<9vgseii| z_vQ;Ymod*sPoFzw+9q&eq-5A5T=G#HrpHNba?*Px-^)m*R@8O%97SMyZYSL;=FB8T z=clzyd5HzU(7djcpPY=%-m;Z?%Eq^f{xdNVJ0)sqY3XUIbo80(x=gJpv$551*Nd}` zQZ1VqNhQ@9tFw5emXYj6`>G&j{eL6uoIzuRT>8m~xkk+>JQ(!$>puba4gMu^;qlv? z)i~8_Y-i>@%qBFyko7ZZq)6(-%p{h^7IYpZifL>s;`0N7{2K}*uo>;zc;VuOKx%{T zdwv$H<55Sdu0vO;=00akIqw2O#uX5f2hE-IYA`FRw$|eeKp_}IKyfsKVt*1Q%{ko! z0K|LVz2D$RWJQ;EVmftx0)L8uc&S26*uba}YYo!7`7f|TX~l)#)^v+C=CD(z!QcA{ z1cAE+)c;b8ile5g&#c@b{jUFOqnh^F2Ihnw#D;u=>Vf9iGDSVkARW4Fb5y%0c3&q> zhvy0RI*O(ZwlIiwq*G6>(0|;y94V!!n4}WG3A@FnTy{&-HfLR1qpLjzydROUH|Ju_ zxJj22?&%3%)vr3me$~d-u0E5+R^v1{KxIKMSW62~0Z+v=|B zqP7+{5&KwNc4fJre_EDB7uerGgVxmHbGE;}0xuT06Wt&y@~k?59)F=J;Ui6p$_cJS zrvf+T5Ng~VSNc{S%c#=AM>LOe1x;}uUP_`FFcS?5Oje5=c7-`6S^AJ(sdR%}3Oyqk z?*czJc#{?osKpPOv$JAw4%%P+=QurwDDYt`Dpc+UQ5N`@=OI*BV13XIH;ffWi}eG_ zJ!@yP=jz}*kK`rDLVrt#a}ELC>eq+Ux1g6?&%T0Zm6%}93R^DzE+)fGj-^~zjPCN7@O&N);eyYv|)ZeFZcD1@Ikq%u#EAI)G~lgv1ANRC;53ImbkF5c#Q}0D_pC1Xt(SwU=ujO1w!(9{ z3-DIxo!9><47ZFE7D?eP;8*;Gt3X_p0KRVkKwYa6LVvDMT!sQZQo=tl4fs{_!A%qK zMoR-8PaioMOMNGh?P7sJ$5B$=g#na$Z}>;Ib37v!x!@a2kDBR#59M!)g1(@FiuzTK z2qMUp_6!a0Qp8;D9Cp$PD@2PH&jwzjk=~imy{4$CB`!7KXZ&JwLJTr}qyPX`?%7CL z=6pBLaDRszbnunM5BES(wo`>XR7G$Wh_<0D-J&cFz120eW&I0yOR0(=NXkn17U4oA zH`0Pt7py=Tq-)q5+&PiQv~g_e@d(?o?eq=0p$pYbPkdk)hrQ`z0zdGsS`W&?rtjoo zBMZ+MAIYJk;Fpds0g?f4S#4?b_Z`k_di9!S3xQHlu_Val~8M(%(Rud6lH+EI=6+%;zZ3ZywYvINHn%ul66@)!JU?&=N4VuH4|2GxSg<)UkJ zv8}AQx|*6$e3UvZfrQ~j!Ve7u5to8Nxqmef17kCJV5d4*kw2!Es6Q8JJ@Beu?!K%_ zU8IKvmpbn5n1FN3!;i2Q1KEicvw2@nM{!hKvt=k8et}i z%?f#_Ihl60u-rxP`NP`>UyaPIWe*vdN04+e6R4IDw{4=cwWwF5+(>P)wmTBX2++2U z0X{~h!|c*m-&NaaxFsD!`O5p6@C^KeV6yhQqf;{RYl#4Y;&FFRD~kxQCx1>p{sM~g zNMOAhcaSbo1q{|TC;tsKXoXA`7l>{lPDSmQVQ|}=95E*Pad>+(K4^z3Xbo|l>cYz^ zAyLR$Iwh>vFdV$HCwEufa7x3Vv}va^cAmCTd3B+i1VCP?%0XFY?|-hPehtO+d-@WyN|4LR)p+=!jqxn+(U!D+dF z1i(&^duY+D*0u~#2a@@RV?Dg;1dE(Nb5aScMKgGiio;7pg9GYK-(9(f;vzlqOa;sr z&+zyR(nkvhj6aLH5P!Wv#u>;!@o-A&*HmDFlDO1W;?D%??s)}uIsIn<3M68Y#TKl? zuM?-pP=h(mXiIAZ05NR`s=d)gM3CxAwi5$2gT;$Y8>&Ud4rdR4tlMPnCCFgj(CvC6 z_NEu-===gr5uJG;?8%FELv`g`dTFf=E2Ft&4bqi1?pR?wuYYP`vwP`CyMVr+WN$`O z8PRMI35sXIbRU-oQTHKd?92X-3%h(3QxpZW2$PKS; z8@2`C7BRT(0m63DGyUH)p<`UK1JVw+4QCCy@KB@cv$Z0n%^5IAfej&+OsIkaq3~P| z_m&MIBd!a*x_=>Nc{quGg8~rTDu-ibzTQ-->G(LA%6h>>7zolJW)pZe^uVh+oK;$% z#SfH-u#M4`!1(5PCQX~ZV<_`ryj-2pD4-wqecHPJ(6^$kLr^fF+}${Po&MOmd(z*3 zSxaJPfUniI_1HtJum1bg813{5By*3dW=d`7==9w<4S%(+Jv$c+w-u(ynS?i1qR7#0 z`I9?4Ytw3yaC2#)_6V#TK%u??ERJg%9ym~^hdUU`l5MAU^1?Am6`7OfiF8)?+g~`G z`1jXqh8!NN(jEj*5a<(yGC2&a3 zmW3U*r+>Sv5gXvt&{%>~4wwATkv{40CAPRD`dCOzgMHIzR7whJ*=r~+#hEB7{&Kj5 zJ@f$Slcj6&@W@KZWWea!ALxbsb^agZ=-I!K8&VNVG4YgxV8~LZXt*W!D5Zro8O6IP0W|Mz$#|fm zOwDuKr~?a>0-wJ8Snz(?xSBor$wgB@@FY#ym4c zE{cPCrORyp4GbOeJchDleYYw6Nctw?E?z(wl6QDUQ0i2HjNH=%adj(nNc(q_zcb%9 z>EFRS@wAPZ3e8N3y%0aIjPtYgU!oDddVd8~Sqf6cF|EIaK-*(T2UBP9P9Wm}LPO^EQzNdh zLf02*0E#vM^Zbet`-W;V)B54?Jwc-NRg)mb351>4A6E=*^_BF*uP)HMK;!has? zasJCawDxZ=IS!D`+@`lvDAs_A)z@-zj;N569`Xy4uO;L@Dybph%4O8P&g%k;+jyx- zLQ!vhV7bt1$kkIigMJ%-@GgNTpD&ybxB8yC4VG?{uFkcICmGF3{ME>Nn1NiTQ9~ls zZkfs6!U<$w)j$tbYz>MXEz-t=GJh{7_gH$#Dx?7Xi1-Q_QIa{NSPec703}~+Dim|w zlKk!xnZ;QrsOCmDab;r{bMYqXA0owP6%G20596ELkXhA73{=s?vzCOu@jCW@iEPG+L8AnI~U2!EQKNg!X| z#Nbes`%6t4rIv9=EQ7lPvrMWVjA2fiZGGjL?iOScgI(UbxGCImW#w~_GajdeJj(=m zz$^U6X;%+|<>28GLxa| zN4D06N*{)3x-k*FCyZlIjDMD03dI*i5fPig1Eue(1br``^!cZdS&L+&CfT}g-4J~G znvYHn%9Cur98St~F5}77kv>PeqRZ4%a=0Y&Y6823sZMP3P&--kUxTLyq+2*86?qFG zUyRW~Y(B^=f>tdk?7s&DO~-$O*_)jU`%ba{H9}4Rv7=bo9N<6lg=B6J0SXw6WUV_W>v1wc1z$+|`^a|yd*xvT|(?1$Q`h7*;no+>w#?E?t@ z0s9Kwn_jRV4Tw`BRNa?9)GNLz2XK+H>$(yy+!3C z?$0Q3RbYSWwKX=euzP~LCBG}?g&P}rZkVpOVshwyiG8&y-z(CU`_ZCekVo8T#CQ}b z5XKwd5($|T$+2K&e$>e(8Z)D-9NC(~lWpg`67?LFEog&lHMhxlKuTG??}2 z5jK$xl!%G+EPtUPJ__*xF8y<$1W`1t)JEI|2xo7|O+;%eeE9_S@>KvL=AR{o!u8Y) zc|ZCV?vvO$7lyM5ZigTXa7+MpAe&XFW5*d%g*$T}OF(x( zZz70P@rD8#H-&ELLyY0iiK+||KI_A=)fA$MxUIH|?SB*y?7mR&{6+bW<{!tO2ceDZ z^7F-{`m?%Y5ozv35DK>6Ui8CzFXOULeZ%^yQL5lR>eGh^F5@xE1hgMM1=5#nOpNBm zif@KdOeQu;3=hm|DX!#7O4SxQwp~%}iS$*kq1<;xsw#v4Yz9RZrA!ccfuCE=M z+8RNd(yVkNRUWOZO=rG{(-<*_B6Dur7&I67htnWO3NxblLfG&?*NNZgx}qE1t-a8m zW~yK49XKUG#%8p-MZQN4Gg{#s<(^HC8ez%%qJNmij9ZV4<-*$Vf;m$peVV@lH>68< z1zzl3Gex2hZ}666ra0eNAEc#nKnT%^-h6Ff3FIDihM^HbMi;=1sLr+F1#em-H3+a%MVsC7hSPanC*uBRyf@R7d*WsXh4oEV`dv1POn{T2;6f`~GC)q9Z?b z;m8rcdLdCl6a_Na=xpAVLcxi;u`YyZr_2^VVK0P6Cx@djUdv{kOwxvtffFtMI;B4t zhWY`VrX>QwN@I`!zLCbVTzDsF*f9{}27ezf4i?Rx2Oo855c$Qfq*F-ZZ~JoNBdjA` z79od%*BcvLkwMTNhcJvokk%HMR%fR9GF=P6KGb#xqR#;|-+?WMX$gYWJnM1+97>rYmP#gY2zwNU0wHa`r+)($ z#HT%zecT=^n_cWHW)lKbkHP;2ZXLjG3(n&6yeF#n5N2O~eD)WZuGmYn7?RQwXD6Hu zsMS^AX@H%@H*c4T-M5T|7Xq~(@NOEMO~qbN0#{Crf?a^moQ?KbRP%w9_5`KPkC1-^{p15tn;&BB6BQ=JgfG%BGH)@1 zG7j3Oe}c||WnhGK+A#!`p(kKc)Pc+o{)vssMS|iYiQ}MX#K4pM#19j+%6~U5vT`Oe zqdNtnJ7|T(PF1jP>ngi1mVAJaGJ}LZ7Ty%QbQ0AAVp!=a4%`EI=lJT2OQvF*Lb~F8 zWTrTQm^eQw>r048gM+Z*&!4@%`wFkYP^5g^jP9+<(g z@XxKoz+r?FcL_;k`Uy+BEPpzCluj^OEP2HI+#u44g1n%V!s}(3D1QTF1`U)+t3$Ud zA3dQ14XRUa$KEA!D@v?n7%vx90(J?jYiR{vbxnR*!b=s|M`e7U)Z9Z5(^0i9s>U|j zz`pFPaI@io=Wg zyvw%L-dC$t(e;6k7dUYMWkc>+{KJVS(4ZSGRYg?Gju7mYl~H1SEQpPtacyW@y4j~a zv#T~3r~JekE)|P_XVLCM$-5nq!QDtt(6y^G4_#h9AukzZp7FD<;*D~d9j+cyBhi73 zFvcU#*;`_9%0_Watbgl!B0juLXxD(wWfG9XPcM;hz?OV|P_iQ?$)HsJl7C-xV$lTe zcFq%LNW?kl!ncUx7m0LnJh64YqC(59LcS95H*VeMU)I1r0Ld>I?ODKqhA+6^JDcqf zhb#LH=7N4#P+##sqhF2%|1DX_b9TuM^{3BP#f<$Ty@Yg$(0}|qOki)dl0^YgZa)}< zLzctB-aE_}SQ#i!QT;;WT>d-g{<25 z)H|=D6`dBLfKuQk>qfO5;FlcmZhwlA9mEQYD1*rE0@U;cG^h4AwiH?9T;dxcL|7U* z7Ue)W!eXnuR{89mrcz6AL8t*I|i!MTLPj_~Z8&h~C5? zNTyIb>utMDWNjc8$VM}1mNAyXEsD0!5rq7W3)E}N=5+680jLRESV9L0(^J=61Z2Dk z4NlVNaE?-alyD)lZF^=5$h_t{(mF3;*f|NkCS$grEJ3c5MD$~ zFXFDvKHFP!Y8bC3zj4u;1oRrK@~v1jXIXbB;qB~y8=?|5gxiM!j4$2%0+c8UxBKP~94pD9N)k)G8vl3^AKrAwh8Tq_@Ses45e z5=WD|O$l(rgy8c-?$8$-+ZPqTniLv10avns@P9qP$XTeW0c4f{B|(#1W=*pd{YMuo zCUR}GrWv>NHf-q*!*F+KpXAEsRh5tp2{j{YerpZK__Ve=sFrSj1OtVsPk}U#BHxHA zqE+}6_(G}vS}AdFcHJrcLfOAqcD+k$mHBu=t1Ol!QLF?)_%PspAIi{HYmjqCUCrt_ zAb){I^;{takjC_d`Ppx=5Y@NMvu3wD*hFD?eq2a?Tm`)mu&aG?^+>BHmzGXoJA0vQpM^7_7B3h(ebH~4 ziU81O!r~ttCKX90TyAHCC*#y}x-;yb6My`}53uXC^;7A^bxUzZ4Cxxg!PKJc>C}bl znP!{@3!I-PLva1#zdd0p63SabM1$&diaJd2Vk>mrcsraC^>@g^Gk%*?`$;K|UR*-E z_XYCdJxvz=*s8LO6iE{f@6@2WjWxMxByk{ro9K-PH{t@_cz?)oCbiAP^e2LZ_wx$Dln;2?+6Qrux%h7 z7y^;^h>e{JXqf+t@(uf8s#Z_FydrRvW5I`217n5E`4Z8TmuramWaVA8d2Ffw}08|6x9Mi zIX{7zEZFaLOw|_AKc@ah9De($-fY~HP4EQYNV@HD&<17*yL~lkAMu#INArZ<6?%IN z+<+w>wrS+hmhc-LO^McfYdnHM`jXC~t_#v|f~Uh25Mw=1uEP9>e9-~77)ygx*^yK? z^7-%nhoGk)(G9WihH8Z`ynpMpLB@1G^jdSBAHIEoxOf?HjemZ(Y<`LHVEzfy zgxtz=tfZ}H1^4SC@+gvU%7(0fTl#0qHi~#&UJ_!Lw5iiItpFaR#^gn54xk&*24Hyi zcwuv2;!5)LaHJq2+cK%^*(dkL`At9mReSrT{OYGVY4ypWp#tkCdud3XOKwT_|5KSe z7p@R6h{)Olz*R3k9DgFT^eil)*|MV3#`qDOj`oz?QxJTm49-=QWN|;6{rg;p+HybO zK|F7NITeq2ocN{N1!h(Kp-($!KI>A+0Oi8+XP{kC5a`+%wq?pLC0^0JuCUx+e z4zs_A+KIz;seZ8Nb;-(6BjC?XxVabL2Ao(QW7|mBeM!hSi+^-9*s+69IPH^!ktjZ@ zbAcLm#9?Ie$iukO6KC#*0E|3Jk6(#4+75^uttjGu3Po}bu_Kv$-`O`9HVirFsx?)5B;i`1THvIh;r1eeX zKFTD^8YmdCxPIyQDC=n^mVrEY*{P@D}4pk8N-Dpc7%f{HRl` z#{z0*Fr`vZU|eD|TkjMFp;SYN{sgU|EcN1-oy_$ZOAf!%dOj4K;Fk1A5#cu zvpd?q)9owpKayd*&={Cqcg=Z&2x`J?jJuuD9)8(rM3;A0=geu!!D4965;M$)0x2>~ zS_c^MG)yKm6X3vCyQ4pb7LS{AI)&Z$jCSGxhkxJqo|2Eu+_}OF81*B_3$q5Eas%sL zkjZ>difFIkBd7>uN(Y+)V9YRa$d=(d+$kMg;dT~};E^yUEj0^z<*wsSAH-MEkaNgy z%7x7XHt(XcJ`vbf#0GA<8E0UL*OVOeUWwVaWpj1LG4YPW^2BqgK;>$n|J$zraLe_ zJAJE%(D6>*42VE^o(Dd^mK2*Y;1K($h`y8>W0xJ931l&Rs>Jd};hX|-%OFHG(qW(s z&vJdWvN)Oq+U-N6kv6m}IXROc#RL?{4}a6(((DDEMcQC@n>4$G+nnZ4jy!7B5|5#C1DWg@Z#C!?t2x_YK?9K+HBwK=-j>GRMO6i=YJ#- zE&N>Yp&5vHMQf;wTo@mWh(Xx3&Vtijhz9njk&H^rb$ZL=ZO8`+^N?V^XrJ*dXlLc)q}V)B)zQ2*UN*$u%h)K$%p zhdsF^Cv+dNegsieV^NSRU3|)mRcNlu#0qL;&VP@bFPs}w@<+s$p^ZcYzR{1yiJwmzQEr~-soaCC>K>l& z)RkN~6Ct>VL;1d&?K^7*6@f-@c4X|oVMaE~FWHB&`K>F=MpY$gcj@s(&%N2BZ`0MT z7jy5=gtg5BeaZL!uYOGv z->p`vqH6#;;g*pMDjrCmpM!BBnh~|rGMzFz@rd+$MLEA2Q0~1 zeTOUF<{f>r$@pbRT)m?NW*^!BWSEcVk2Zg%*64PLUwlI!pPqxz3AXusnpANx&r}J+ z2}{&!s#H8qyc~rwy6*uC0z1cQsyj)|0-U)>DAcZOh3Lkg5aI6!)v2WC6_vV>Qk#;+ zrbzPXjaC1P-plin7I=82ih)~Jh|5imjZZS z|IE6(gzYufr|_*wwsvVXs<%%?E(zWnw&)3!<|idq4Ngri-QGLARro9S(iAEYPj6Ss zAFQ5JeSg;~0{85W{=d0cv z)8kjJ)qNJG{M#XKH%ha`Ga(b9OuAifVKQK^aDUs8=IWai(e@XIzF9M_Cp=t-JzTTi z>qoD!eXfS%a3%CTIpsf;jnwa0;M%nAdx6S9e3+k$2>yQjMpRV(;dE|uio^~Rl^Avh zcKV5YM8`nE;C#1|aPmq$Rr!eob;7ruSazh~Vs1(lAA6M#_(y6d4rL(H+U%otymfLq z34h^}JFmNa5gQvK5VJ_0e!TNM>+bzeY0GTR@b@M~#YwOr3S=`dZhI$HQ z-2KOjSO6zv$#GNkH~?v{9hl+uTjDMkAt4&yt8hhe%iX)ZLdHEkR=~RCl{;=_0UMII zzX?>ckd@xH{55(BIe%`T$d;uyu`BBVa(~RUenNgB&wu4rsb~JdU6HqOZk?z%oRb2Bhd(Se(=v`724ih6 z=wEIn8jZaH@H(ICho1dXWDj)OMEhgzFN7=9`-R!3-7Q*u677?SMr!;)#otV{(-coJ zUzok50>S3r9K9s{1)vWCMcH54a0&Yn$PYYBh_7Oj`&>%UjhbGfxerI{gMYq9c&C^g z$9-a@(c5Za9U|bPyVNp01zk}Bm3a4=m-H`H2_yU0iJ4XDSCt5Rrz@3 zAJbBolw4}?3CpX3Tq^KME~<69VBJlkr<2}ns(IxPr`l>n3~Cb7(`to1;_%4=YQv|` z4LlsxCPpq%h9=^JZFm&$@r|sY}W#i&ZmmD#}b=I93;{K;H6037S{Y*d%6EQme$(0&!S`;-o@m6W z?;Fjb^?(xs-pAq=ZP~jqe(mV|!WNXHa9mQ0aKZT5=ywrh`2pqxRO%YSIF3b=0gUs4 z35mQlld?}F6!{1d^wdYo_`(Rp&5!^llLi8#kN|T0F7y{!xhSPd7;BQB*E)r#bZ7#@ z{m_8NNL@2GW7l`FF@GDSU(9^`{Oi(+hcrZB_c3Kt)oMyHUM5z_v8~*ld_xW_V^rL_0_OAQu)6g+KhXI8r~rG(0O5&WECRac;dh`?!r5B~*F| zh^HU3CQsMmqz450!(x=jz9ZmqHS{p>oG%zvoQVJ6{?C5UVJH1fxNJU%`jm$;U zHiy!b`U=$9+XLF{rkFo02m>ks$voxDho1fC-2AGOOMjJnfJ-?Gn0F|_*d;Ml0PUQ6 z_{9Exh@V+W>9d6-+^KFZgvS}4_`pL!s)%wdsp(-MD@x*3eVR>q-(Y zshi0WdQ93jq@!XQn9rh-ep^{EB(mNjiU>6I!V0wsz)i{5tj1}a;5-51O}0j6n(+SE z6Ng3^?s49`mtmfI<12cCV0G5Xx2`dVe%aIgC;_Y!7X*r353~4^{h^O|M0p zFd9EQP_cCk{}p$J5I%aPkPmvS5C^15+F{=PMbf^%Q^|T@$-=i-k+?H2(V zLcXGtY?SzrnF=wxF0?N(S&@6&*3TX|m^e{u2Q+dlcV4P@>Dm=muh>1oy7BB5UB&1l z$bYc`tLYVLAwL!Bm`wDth3)9zpJ+eH5WT85sE{{}HWzxZE%;W>2u%jNE-%9k^}g+t zZV~N-*L;XI;f7bkM~9m5dCeQWiehbAp$k_>0}U!FLs}`(s)S#hSaN2Y^KTA^S8y~9 zh?~17kbmhXlgKF;d#;HOKYJ!00i}hI!hcWTX2J75yxa6q*<$K(ZpEOEr?lb}Jx3Wy z>9lw=R#W91RD4!OdjlD_#)cK>Ra4ETqHN|?JMUE4+tYlk z)n4AHM^2r^qvK%a0RH|PO<_~=G!A-ch zlK3Yj%>Qb=8&@*T*bm)P5o#95zkdt^Lz=vZOYEpzaC@OecOMqQHN6~fAi^aRu>Jx> zzbw;(M_6N~Gw~w?xlwjOQS^X%Q^~xKtXZ*qK6K4|-VU-mJo06CE;Uq+s@ z=yC!`O7%fed*$_3aaZ(urFvI&9AkbFNPFN(zkE)F42yDesygAM$Vyp6EET>wgeq1m0?i|wt>GWjp%XWoA_@JmUl#e#ei&g6&9Q9 z-kFt{>?VM*tcX3^7k{J#r?R_`x8nOQ^6yNdfSN!9d5HP;-hf$huoEE}5F3seHrhnT@NgDVOiT6R`MW#IA zlDK?14dia5xI+FcSIEVQ`iI56YrJ%u7(vkwWkDp~0zH&%Am~Li(OVeI%%TLFJF;tsqRP++msJweRWxLK1AxdqBAA5<%+9++ z;OLih;e*V!BY!cq{;Z4h3ivny9|f}_M3NA@kOUVe zC_gd6T$)sb69A9IgB`_}{_(>*F{G7SDYi3mk+ulLmm79@d>EOsEU71S{5+E(j0JFnyrt3HPaEN^5{(Pw85OSs6S{U% z^udTtJbx}cw0#{^huWD^gVNhjfLuny>cc)i4~9O-j%?aE%O1GaBxf$}`PL%L5QSKS ztPB1pg?)ORv64adKyn5E1Lo#e4AwU_nK)$jy{{4R#C*JvQ$)**pJ0U_6>f z>E{8rDBHnn84e=hG$n)CtvT16H`+;-P?)^8$A26qfwFsVk2d*J8PPSA>)vM#eT7Dn z@Lfg-4c@fu9+jAsYq{+g=X#;(L7Q_f={+nGJRIdM_#RTEA{9kzkmzPTy>v$M-XQEH4jdE^s5#B^}DBBj<+~gVu%YST%zE8C8 zwnQY#K)N8fEQs z``ffYd^-anEql8$*dREss6alXDXztkl8K;u6HDwJcCf%$H?R{^?e4^@j>yXwV>$u{ z?qq*dMsKmEiwlAx4}#Lw9*x~aIZ?A^#?u>DV70y>CCEM%;2{sX!X>+7ec8DB&Q;(x(8r?psc^CWE(}+mC)JG)=7J;&h&|RY1C&?%|==l}dF!esIXSaIW0GsWh{_Q=C{6M;2w3P*g4&p6zs5xnt1cVqe zA0J*znr#)=QfFI%KUB|wO`wrOmKc9fc$=c^)T}kZcgz}5YW4U=`k2p3<&oAeh`sYc z3-F1dA7fObWx0iv{l7;aBbX%14&n{tgjK+SUKvU*>ag{Uk6H=pNwnuS`v{rS6KcPm z?CmzCQy%h7&*o;bj?|J$KkggH;q~D!?qX@dIah0wAU*kA5YBPT z+vSz5B{d0a>Jk~4ptB9_Cc~Jz_)?X!P9-Hiia95We(74aJq?%To^Q0{%!Ff;9sPXe zL_3o%3Y{xpAnS6V`=@*4B-wk#-g*olX*9g49a2e%# z6(aGOYNfMo7X_Eij(#nE$Hy0;F)j<(*Jq#7ilyi-W|LowD)_%%qZ1sivd9I!{EL%H ztJR`Yh$nL6d#g~0yfA+73S(s!%OI#BUah2BA3_uppAyTAdONvJB1wO`^eFtx#|DlHg>^figt@Nkq!rLyogOb0r++l^ImYPIEzx}jeH6c>7uy!9Z(0$Y z)9*x1|6(I-58yqjO|hG+HLxw*XKhP#IMD)T&%<#iAY|YL5;}k3;?vNGF%Fgp-rDgd zh>rE@g1&$|Syg$Z!oCSUTCcD#eW1zRRI+%aVY8F>?QXe*b6%|MzR}|&372l{^lM`S zr+s5~`?Vg>m2AjlUD|WZBM?GJj3FD;7VRl7D`|{i7ah9XR--#wfMQ+?h2%8;>5kSK z+gvomPbBmODYAcbzlO!!F?JqR)w0j=1erzFwn?gVqOQO_N06x*pd@xIGhs&AX3A{w z$#Ysg7lr%Lu9V)AMDfLZwwmFE+cQ+wCT$*C^jr2n46WM~xvTkYNP>lA&1HGZ0EyO1 zw2+h_b7@*D#bQMdQ+a?5QQ8kvB-G>WEIG|3Ur45rJ}0&hKbNvsvD@!NVU;8QW_n zEQU!W`3KVkZGl>Y0nnT$(Qz@)mR2hv7TIW@p)He|1dujAH@@6{2pl!QVkf|RMZO*9 zL7F)&k1~It@@n0UG+y;^o^`C;urS7$M|MY-gza+vQK)V!)X1WUG)_M!eG5y%=v_6+ z;{(CW?@eOyqUQyfwmO*z^0!Xw!1-$ul8DY8vhWYia`Hl+tM#(w7W8Mb_S*ZCE{Kek zw_iSdpVFJcM_}UI)8-WXE`+^$A<-aJVa6rJRKR~&%V21NV+fBE_f{cFJsi;gB9;;# z5(roPRYKG7SB^3 zc-g^{nf6&MsQhrTFIZ<$Cd6nV(Jp%+lFxt4S6+EkjRn9s?rIc?=&0 z-;Y4*)p6iN@mXyI_%n2#N&B?d#iCkMl`?Jf;ipDi9-S^ z75hAYr{~awtuRW|twc4p;!fBT1^j$6+`em!x~Z}k=Iqd^IV2oO#-gae$l7EERpPDu zquUZ>=z?+5+z#ts!yP9a-i`W3rr5F0HG`iGUXP>h2lbI>Pe9TI&L0a~iPim&uWx_h zeOen0-P7Z*hL78_Dn;q`2GH$le*9jWO~ zRkC;rQ`qmO?^vljLd$7xVeT@xE3(|CSS&~~6^JDDKS4MdGE8nlE}c#`k5AGm79_4mxP${CVCcyd=aY-9D8#%s1;E+?!R8Seh%j+Q0@ld$L(vk~M40|}|d{U(u# z008EbALmK|=#y&aF#!ydoaZ1(c42IF cWpgi3O9ci10000A015z20ssJm<^TWy0I70w`v3p{ delta 35643 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
    VsU@?foy(3_PVbLO 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 xynqor%L-PqnsZqs`Y=?NIp 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%0A;{ zGAC2J*cS}ez|%O%2B#4(-?HzpRLjYfi2Gpl76aKA2|-R!*Vwcm3MZ^q!XX|QqYSmC z+YYOz*p`XrWE1yL5_eA2u$zHnnhuMm_Krk_e%2J)HR8VHpHm38a>BK34bhHC*_p8s zgijEmqKSJv#%@nqg6`T72~qByA%(S7f57tl}h{lMF-`W;l_` z(m*I2@%sYdieMzSs^Vmb;>nS)t zg@=0bzy^9prip1VKg8)GjM8qL?9nBriy55k#bMc&I6uT(4UW4<+^hdNII8m_eHGT+ zTfwU&Ob>CErq7-c_nLoBADkYT_#~*LpQep4)%Rgy;1+vq*$u-$rqGIH}}hJ|{s=LY#y-sk&77TI_`L2JlZ@t$@naus;C*I9Z5LOjHe^*BWi> zSdII+u^Jwh7huG7^rWhQNR1Jy=f5WQ*|#JS6B5YucGNX`5|vgv&glhqnj#a7HCM7G zt5ajyC8(rX>u}g+7mwfs_t~{-qj-#RYs8)9ZH4446(&}5Luy)TQ73HKuS~@#4uP&M zwYaIap?%Goitt>2Fj7=p>YWqP#f!v?#r5I_u}j=2ZW1pMFBLBnFBh*6H;Y$_SBY1P*NE4O z*NNAQH;7xr8^xQ%o5fqiTgBVN+r>M?JH@-iyTyCNd&T?2`^5*u2gQfPhs8(4N5#j) z$HgbaC&j14r^RQ)XT|5lt>QLuyZF5Lg7~8NlK8UtiukJdn)tf-hWMuVmiV^#j`*(l zp7_4_f%u{Lk@&IriMT`jRQyc*T>L`(Qv6E%TKq=*R{T!%F1kp@YFr6JN#X_z!z8X=98MoFWk zU8FJ6SSeK+CykdTNE4+=(qw6hG*#MFnkG$`W=LsLx|AVhN?B62lq2Ozc~ZVqAkCC! zNxMnAOM6IrN_$CrOS2`fR45fmKFKc?OLL^TQb3v~l}M#hnN%)SNR`rjDJX@cuv8^g zOADlhQjN4oS}g4&?JF&jBGP_Rt+Z6Clj^0Yv`lJ{mP?J&{?ZDmNm?m2OD$5Xbb!<* zwM!jRr*xonkhDr#EgdW!BCV0uN{32^Ns7d!!=)pnBc-FHqore{W2NJyD|S)1@<{Go`bnb<)|=Inue(dD8jP1=5AmMbgF6dTE2yC2f>8NtZ~MN|#BO zOIJvnr7NYYq^qTCq-&+?r0b;{q%G2o(oNFM(k;@h(rwc1(jC&B(p}Qs(mm3>(tXnX z(gV_i(nHe2(j(HN(qq!&(i75?(o@pY(lgSt(sR;QX`8g2lNwGIak7|`eK-Nnw1krg zC;M>%UTG;OklogE66ItWCk>n|=LG!7{+z7fq=}Q2oHTRN!bvM92XF#Dq@9xvPC7X` zkduQrfvjdVCkJx^OYt?FtmWiTP7dQl;e>N?I2_F7 zp8iBlP#Rw$O$Y% zZ|39{PHyGoHcoEm!xtDL;X$?KfF!O5GP zyv51eoV>%yyPUko$@`pqz{!W4e8kDeoP5H`4o*Jhk8&1CE z(;=J=<#ZUQ!#N$n=}1mTaXOmQT{s=X=~zxvIUUF8 zcups9I+4>!oKEI+3a3*!-Idd6oKEL-2B&G9rgNIXX(p#xoMv;H!)Y$3d7S2RTEOW{ zPGN1i8>hQ-x(BCwatcZ2-ki?n)XQlhr$wClIQ4T{%qhhDxts<#oyTbjr=^^haazu4 z1*esq&gV49X^7J>r&XL*bGm@jg`C!Kx`@-oobJQvzML-MG{WhAoYr!>l+!v+>p6{b zx{T8XPM34q$m#x^uHdwZ)0LbybK1gbE2jr=+Qw-+ryZPja(W=A2XVTJ)76|F%;_PV zuHkeor-yQS7^e!SoYTYMa5<+(!oAm=9?j`7oF2>Rahx8{=?R>k$mvO(p3LbfoSw?* zX`G(U=^31!$>~{~uH*DwvX3oP>mU<@Lcj3YI?J(n!cx0wGJ?Uz1)%;vqeVgGF-vG;kq6s~Sswyihf?>Z8)^gr(aYeAqkoq1njOxx%?JW)XBHqO2KSaVQ#0%RI9oUah z$RCbWdW%XTW!~~Yu^*O*P|Ao@2K~i>g}OSQAkz$k$zN6oI>cE+kw7_cRQRf3u~=AD z?kn}{oS(%y5^K(1?uA8V1eT0GKeXqI1pT3ks$h}d=*XAIkYzO03nerLrU%0Z;1(cn zX=x;^<_y{Ze1q)M`(?+j`NKtXBNag?M(c`xkBlRTmTnnI;+i#~nzF=!`Kb@Gio$t` zWWOTWq+X=W^#*bHU|C&JRvC);0)_&AAWL41rJ_|mf)3+Ty1-i#if9%OEeI5cBhcw` zpEu}>lm-fe-eAD6or$7|^zI@Gs{*AuaZLnJ1FeR_!9ZaZ0yx%xlZ3oudgrZ%R=nk5 zeT+;Nq#f0rc1}@Iq}m_Ef`Bg6)~nDM2nqw?q6(jm6q6Har*{{MW(q(V0tVaXUkH7# z2>K(M0KE|pGLG%e7;6M9T^;Z*FjODhYb!D0FrYtBJ_m{;IAvf~gpFxy8itJ1dbF~z zsI&^s^+z-mM~Xq$NV&HxJ|-iPZ%TK*IsS5g&>M!LOt1oYu+cj5WkB@~j1ylU;pzcB3ADnQ=K z0L<#r8hubEBX4$hO+rQ9@(51Z1apBJ0LhqY#yIVY{NuaxtNsklwxA+d5(2Mfpl1fs z&)PYCBvcZpti%EHl|cVtq*PJ5+8HQj81Y40n_5<5As8G0OqI&mxkawAjRK~1(xph6JaX!FU8EYX)Yz_bM3G~7 zl5mY96s|EsziByAC1Wl|rG>GYvcif|1EDLBdP0)S{teNL3{#RA0+n+s%Ka7K#QH+d z0mw8diK)z6R1sR(H%mt^idFa5#zDxCJbM;+A>Zha=V0U+Pv%Bz;qGKe%ha*b-E^?3 z98R+bis6)kJ_2izeqtZ=FNBD`@_f@p z$T>0237MVNd5EeN3)JMgs5AgwG6sGFawK%z;LsftYNi`@6B3V$i`Qf)Qbr2Ff#~Fy zb(0M{LfZNSvSyszY7o+iHzV<&xNJ}a?xwB`7}Bmrf}wE&G(iNyDdc1Z&2>mKIZlJ- zjw}d-=k}8pZ$X|RaUPiQko-r&HI;_gn~`L2oJ3t3Bx!#eQjAWZPz#m-yKqHCX;OM{ zCsHOLSSxLo`jUw5L81f%8wp{VHv|J7f%OFLykQX6?RP)2B$x+4qxK$jFb4Y}q!|;} zvc&JNgxoGrjj0J{Yr%4Z_EDrQh||J&%&)2dx)_8Z3{_$5))F)$5!Yh0uGAAKBms{> zzkvZGyGq9X)5tMC-fRMgwxFp=rhjhd^ht^OcBD@*LC9a}Ra0#Zlj;VjuKkNhn=n+m zNt1@^6(kxFS2zR%6T^pAt=6)_*O4q?>Qt2*mgsFZywy$W0&lP!mjT^y@-C7k^achg z0Vls9*|hG26Ma8z#`0eA?QN`fc{`bvWY)N#*CdYs;kecKqRD9 zA#@vlip-NpCES8n3kTc4W#bB=CK80eq80|!SeBHHet|6Mi7Z7yKO!_xURGVX>xB}`vx=&q*!6^B|xCYf{shJ?-xI{*y z3za2vP)H&M%wi9f;?poW$eGPZnqLRO)FK>|O*igq}dkMUJFVsH`f4!bQCJ(bJ#> z$dlwVG@q&EF?u`xawyfnaOxJ?4Y`uMz=9wc76z-k!!YlOq*F*JS_@BbO~w27u>`A? z_(EFIsR|I1RCzMbMy3hfnDkH?<4TNx<|1Sm+l?XUU({P&%Uq1advqiA>t!vdQ&vGm z4>Hq)h9CkILg7*kgYoL4InbLVqh|GIB$cA18QpXW)j(oY7O&YPYGk;83gq0icTNr1 zy|M+7ZFDy_7>O8Iz#r&?U4@k0M^GKJe#9?Crc@GwC%&iw5=(uNP+(3uR5HVXaH(HS zv-Bnw$CT+wtxdJC9t+J&kP__F3uU>QK4PxkYa6x5Iifet#3j7B9?3?=$)F-(RCL0A zFWhXc=04^Iq#GBfi`7%1*bUABQV&?ch6Bbb!@NI|13-1XW1IhmRgyx;N+g~dCk9`F zXVWUwYzh8QT|lVPUzFs7T9IoI!DIHS$+5H>fhD*RXxfn=JAnW*kce7615b^HgESbj z3U3G&V8C1K4U|@a|JJ*FAo5QG{#6}m>M_$)D1ok7V+7|gOny}iCSFxWhHhTnJ71t2 zn=?{%BWN4#twFwVJ=)Vu7sm2ylGP4F@~J(@W4Rml$xsh?^-dk$dn2lN$Q}a4HJD}T zD-!cjNIsEN;}djRV$hB)s9|7K1a`|gjzx|!NgOc>HTO$OWlliaNqy65=`}2wi%NC< zPwpwc%o{B6t5yAOs+@+jseOyrG6r4pnLD8lRTamxJ@eT;^@z2OX@KU*bjjx-?YO@6 zP`7X5!SzBUFG)UAKVIRJiR_Nx|x>>LL>vCL_{7Des-XGE#qNAHn3K@9WUfWo?;uj)Qz*e_oV zBvX+4sP&d2-MTjov|E~U0$&JwZ+c>hxlK^t=ri9s&~9m?tZoT_i}-C)O@4tuBj{hAVWY`;aMfCrsFU(2prX zEJf70A4Kk)0dT`uKux6#CQl)((TyVn=0{M#UON$>&BKaHh^m1_+7#47VPeMrILex_ z6Is}mVyHSnWx&{>Fh7Nyc>~}K&xOG03&Dd+!4jZJd>Efa5j&f_*tlLE=^a|zP)x=E zG^r{NR>0O`X+=e)0i_p^d1o_MGbWB@ZwA!|_GJ{+eXe~OdPPY;RH^ClPA}akg`=6B@K6~@UtlgdK2&mBwiU^AE_`Ell*v3CRQz<}L6J3N*b*t-RjWcJWp*!_U0RAubfSnSBOTYu)#Vo2;r zkA6Z!TW!b9ZgHWUZq8J198XnGpRVV8MGF`9Ig2bQD5j4o*oznqO|dCx8G_8--usfw z92<$E%F0+!fZ(iUcNIb1H(Q3IxIU(sE)M-sf-tB{_#x)SGepZM6w=3-_8}w)1y;RF zV~~A8pIy?nNpU|`OQ&&<4U(vGt=5cgQah5P*13%}TdWdobaWgxGH0NTXf-lCh!aw) z&U#dgxpQ6fi72!W4*?zTrg_YUvHF{lo$A7-ps@UbYM3O<=;bt&F>|0Y^j>mNfTfK+*D5zU@+rLhUf)@C_hOK6yq;3-kZfa_6YpH|Ppj!5bvBuUlYQM@t zb3*=dJt$lDKq2MH{puzJCn30GNHFot51t>y9T%+CW#~Ssn?v1jm zlVw-IlQ-ZoInnym!sv2%hEYpf&t)r|AXWEtU{Az9*IONcCgUqu2y^~9#(LONh;1zT z54TZXRa)xR&JpN+@nbvPptPX24XYk-e?C5i2ag4#sc@o#HRi%W1YAm%s$YOBH)hIQ z6xGdV^&<*StHI&RfB~QqWbX!`-r2)yO)KU&VEG2;NQ1!y4_uCtx{ZBIQakt%Z&Ooh zQ!F(!e4yGpb;SZnMr9aEViBCfuon#pL_)xtkFw_`k4xXO4Z9W1^}|tQ*lNTBy11Z7 zs*PI0D79PlV*paUg|J5eu*K8_MEZK>1`AMdV4&)16I?ZgucAoZCD#^VxS~rqd|_FH zVtYqT{}%R_Rl*sT!U~^W?6vIsr!+JSS`5dl)ePQSgy#yN{)3sdaXiGbAByefLn2S5tfls;hO8`3q06!e4tEKfX$WZ@{!_oubh_buS43%H-Tu+3~lnWS z+q-b`B*7+z_+wD~fE{Ny1L)!*wFp<>^4k!5Jc=E#2k1j=xqkufs_0{N63XmWSsTy< zgTu?(W?hxO<7GJ&W&M@Os;Bc>0<5cc#^14`y7UL%u9a(G)5@^oIuu(q(6LXLr|Lm4 z9B}oH1I+E>s~c^jQ`h`lY@*^XG!gPcMY^IC>z{r&1LBXA`NMN7AmvMlc^9DY0f$cm z1u^FWr$K|p;9rcQ20XD6OcBeSdqT7eC3aiz3uC$^G z7N5FT?dec2NAZ6J^OdlHQs!0f4AY1DN|d!^phJzLp(UVzqS(n?IIN+A6=%DV8TU+0 zufevurS*LqH=!-v6ngasvOX{x900_sLC&T4t*b1jAL3hWcQEsVnq6 zO6ykm>PI1{3PHMwr%!sTLB52-`UZrmnlW~m7#kWH^-Nu_R|lY%A!=^G2Pb0;X*y1g zdGrPf>wS%n>&EUT3&O4moZE(-FSujCTUrwe7?R#bNqtAD?vg_Bs8R;I=z8bgLn(dF z>ts7=sbipAyZgAJxERi~RupRok9C0`qQJi0PItAu;R@WpHUeG9KR;4r9Oking3`KG z$NRwql*ls|#!u%Nw)zak^qq9}QZCd=0P0ydJhBfOhP+S?i=REPe2Fsqu7mU?Gvce# zZnHGQm&Srg z_Mo)B7fcD#QsI%HsZiF}_l8tYph|^vX7jDi>*jbhbV-vwXGtL1uVfaC) zAi!xZG>V>i%ESHx@}by|_hb05vL6B0ov`a5k3{(cay`A82v7Pz871I@fK`O2P9Unr zcSq!1Q2Ly*+B$r`RBhAh_6`VliMM0JA$UBF40o|WB^N`TaqoJc2h!zK6q?bGP~%u+ zf><436OcKpBIJ!dvI_Lk9ui?Zqd_}^i4@wy3K9=&$di#hr(br15keB)Y=Y0nFmCvj zcSQkvgy0FbjdiKsX0Qny@WbjneuOs{YP%1s*Q~+YL^XtC-5jE&nhL<7KfNb2P*TMJ zB=ssqJ^6`G?udzvKtUPSRJ!mC6u#%*60VENMp3?=qSS+kUG7W%}~dkN{C*QXx; z!w>3%BJ{v6=b^;HKP|D$Use%>Bd^fJ9Mw7M8qP#{Gyk+afI1dbbt$`}l)eA76r7XZ zVl3t-WN7kUeHcwM7UD&H3>zHwHMVjL%c*V)UWr_+ZV&0|c~Rp0p6U%mV(hN7*yhLufNfRo`)t9D5CehNAEuNqDw+4=lm` zt5rdK41v1ahbwax`te|V0E!OuW7(aHhU1k`F@y9keg}u#fnpc_EwOM!8K_9E5Uom^qaWk zwJ81X4QrzMP<=66yMm(oo8N!VGO&~?s??7F$VZ^?{+#@u6J8BLL_bU6OcOjPN`0&i z-r#_Te$-%+v{fdbg#vPSCO~CW7f4u0O_p#DO4w~c67ZOmR(*)wn3!-ot$hA~P=lsCj$wzUQPHhU5(>W@-;H`l&eGw8@7=@zU`8X?#sZ_eY^` zly8^sz<0UzPuBa3t7DJkmhY19PI{A!e4qRfJ~Di7`2lfHd@MYL2iWetQGQr{M1GXh z%Q?N4)9dg_+}c|flOGBndklL_VSM9)_GEGOnbh)=!uAdFQ=DFr@Gy1xS@}76s|XK9 zy^7N-Io+&2LjC{rLHYO;^=C8AUbK&HqZeg(TWOd4k_gXhg@^af>k@Xzufgkr=rszw zvqu{oz=ih2@E(2FrMxY_qrYEjXQUs8+gJ&gq?;-p%Q~m&;$uU&&v~-^ky}-^t(0KX7_Kr;l;^G^blR-OlL?oW9EGn@O)p zkbhNQOF*}P7g&|H3SV51*3{AfZxfm6_0G!A_7K`l zf*I6J zqgnX{S>C+j;kVWB_GTja|w@aE*^_ASf#*E!Ue}lwDAqotKrLlPGA2Cg`pnf^rIratiW_a?^?nz0jeo-0ZYj zGrdJ=dH%fIyxbzczc@EZqmi1RdwL2g_7(VZbMn)?1(_gdW{x*)rmrwNEhjfW&zqB( z>n-plX*5<7bYBlaGYc~F3uor#rxoTGWvAs9&dN)hS(sgv<}WDBEQZ6hIbLr;4Aa)} z)`{>MB`Z8{`GF1ANt`~2j=^~Pes_n}uDSv1uHXi&(>Q%dDS2LS2|roWgdeTx)(m(r zXO8@bde>{hmC(ha`0EKmyP*6mN+ZC7UT&;Up;bj~{;duZFukFzvTD#G@mvwLSs(oDV z*PU9u)*>`WA*YXTu);H!WY7A z$}D{#!q#eR7alSF%mynwV*1&Ew7VGFg$GbS*IT*_UG;caUhtnlRO=l=v(yR{R!;L+AEZm=H6=}Y}LrlIR#>=Zos`sLm_ zHN*-}zt)U-7pJcn#-zU{8uMuDvGI1{$=I*OUfpax5oN>Uv0v{^_DCx{BU_Vw52tS! zvaRcc+uTxosLr*XkJ2@Wz~i&u(xt;2(l=P)8QO36CVi~+GF|$8oW2u>{uRP)oW83A z{VD)D83{nwEq|>QUM_mAd${#F>-E+ftXr%%T5q!6Y`w*LtMxYP?bbW2cUteV-fg|d zdaw09l5Ty#`k?h8>%-PZIDMbf4>|pq(;b|C#_1QFe#PlGoPNhCM3|pA{e{!tIQ@e& z!WrXC;>@fp73);FwgTHoSq5NA_4+mo{@&Kfye%h@TMt>^3p&K~6KCC)zO>^ClY zxHyH2yK}LOi~Di0lZ!`l@f(S2<_o{!SN9wfKJhi51vVliy>iimU zFCVBnhE@9TF1$XQ;pX2(Gs2ns)Gt?*H>#B+1!iYI=$P+m5nx<Sm_xQ`pC>O1p|f7&?#Mx&6$_LhCw0-Ao#i2I6x>i4(6`qxa`XZC0- z*YtNs+*ke&>)+o9gtQ){{NDxh<*^mIt=d*AOxtW*U|VRbu`RMKw(Vov*S5qKvF*p% zV9thcHk7kroDJt}1ZN{T8^zgZ&UV>sTPjQyCJGZto2|jN+}0>ew5{N5jFJYgb9X2m zoQ>yfB4?A}E$?hHmQF^7S~}b6qPQukmF3foH<-eXNzaSRTMjB~Y;J_f1&`S4^)iYo zYB@0429H02XHxb`6KFoLvAuCAyq38)DNVJjTRJ<8cdP?VPbnQO4Gm53LiXkOesQ3f z(6gPoHh3{TZg@x2Tb3<@mvi;j7Ss|AswUVN>Z{Y<&W`0RZO~9pn_!u|xTUEco?D=n zn{2C~Xk%N=*;obkf}MiPwno^#$+lK#upK5eaFz-$E@k7Ce5J&5{S43bY5JfaWjj_F z+C|pcj!_QeY(f_~mz)R1wAD(+lKPgqPJDMxX|%baWBG*H7D4^bbNwit`Bd8($b6~o zbOmZ7Q~GAs8P2tBLWrGbJKuJJ?Lyl{wu^1+Z5wP|wvC+a%Gor|rgJufvoy}qIm_TI zld~+&vNzi#h<-{Qdy_?0^ZV0j6|AiRTDgFx(y8|J1Cug}j#O^_e z-3t(dAI|a+V(?2TahK`?{)p{y4PK8Syb1szwkP3b-)v?Ne0gk(C(NFzLCif_=ig>~ zK||Q{h_F5S;nz7{vwesVd)@Yi?M>TTwzqBX*xt3hXM5lF0cU%0wl`<9IrDN>$XO9* zKF<7{6>~Ocv+W}TVxQSQw|xN+`--!Emy?y<3#`^6>N4Ff~^9;VoyP^RrUnivvm_@ zr^fslk#zwh?4wn**+(JT!u<%)ImX*(2-B{xPq0t4PqI(8Pq9z6?`ofB2QOC5*#gcM za#q9HBF+|bwhw3fa<=3OdzuC`dzL*L-Yz}Sp2t~4gBfRaoYlh=0*p2MZ(wX-F>dFv zvX{91pLbDqFW|=xQ+q!hKYqkdv3(Bya8}D1Yz*LUa8kqEITP;rQUifLo)z|>2BG-~ zp(r9Cj1XGZ6GCE8XR5L9qrqk|!e)6tOghI>`$}+9_BwmLJ!)TOZ?G@7H`@2Nudp|9 zwm)Z(J;8^SoHcXS!dWY42XNNLS^H*ta|}Ce_I7)gik^cw>(J2yI>VoJ8h{S@-vCh0 zf&c$J)v_OnAUle)P90>&0?4#C#S0B!d+ne8vU&R{_EUwS>(?t8`sklwU#EfWECkuA zF8kT`b2x+C?cg3LQ&Tzn1;Y0A;P6aUx`g%ijT+**5OHhzlc2L)VZRX}x7mKB{VMy_ z_G|3d+OM-;Z@K#PY$^CKZEFasyMO1xa-(mmM{+a!A`xo{v?O)lywtvIfshpk0+3B2}!P%LdoyFNY z&d%lxuzv1l`*(V_W&b&bs^2*~PeT>1880wEbVFOS(?3|q+1C_(oAE+Ed z9V1jwIff&sF2peRD#pg1n2MppG1f6&1(ahP0_x%ca7=aN0G=GXI;J_MJ7zf29O;e> zN2VjokAJ7pMaV*skRf~wa zz8@Z)W4WUp5!L9}-?75cIBa2))94bzlb`^agK(lvk_7EB08X$ z#o2v55p}SRkBc2$8lpBJq8{jnN9VZQu>}!zg=4ehO2<`>s~y)ku611JxZZICXAg1q zFlUc&_9$nMarQW8PjCit`zg+z-t4&1K-6uH+exP|(Qy}N&%_b6m9yuSLvZo;!oP_6 z?;z@NL==q4vpS-l21GfY5gPD^v*)me1;1c<_@O@DFF3Sh%AqDx+YljY+}qv*Rh}v5 zOqi`LC~i`J0vQ!9=-y`23Jht^N=;^;5`V(Y(yEl8&}I4d~&QO8ygu+@8U zR3Gpfr&^j?=Uj}q`WYb7S4mXoSn7;wpsGhu{W<`S70v?@R87v6&Sqzev(~MB+25Y)MxF~RuaFKG6aZ%)=#6=Sq&6}ME8K7FD`75WwMT-F{5!NPJElYI$i>dz( zrcOdkoyw<5HzabD}Z&UwA_2Im&%jn12#H#=|PVhR@r zad9vghj4Ky7l(0iI2T87aU>T%W67s8MZjKFh^jbZl+ISh(H!JpOQT3>U|0zabXRcI&$^&exo8YS?-Mu{921@-|{? zd{1oc`tgL>gSCXq?bku`k#mOzvriCall$Sr*d&uE>7d(bS}=|Vj36IxtPJlOfF_^cK)Wr%tc+yB?=Q=;Mua{Fw5m)0T*W? z%x3)yv;PXrT!R2+F7N|6F_^iAp$lu!{`DxwyT-W2sqk{8BE0ed9t@}1*E-4iBqQwoJioSwabN};&vFF=rdOF3 z&WqMj>zqGfS|??~8vM-?MQ6Ba8#7_r+S)qWx>|Q_J#Bq$18qaChqjR{dC0uLRcb6t zO=QVamb_%CsVsTRl8-F;rfQpfn=qe(uaVkjvgG&2gf;v2HL}Hj2kf62upni?I?9rN z(SQa2?SS>th87H1Z)Ly&l<5dp2CVsC228JNUNj*6v;zu8DoPotmVa|n(HZgDQOZaq zXcM)Aw1c%nv_rMSw8OO{w4C2smfFZtTUlx+OYLPTP?kE#QjpB6o25>v+R@)eYFyz+ zO_HU~e~c90t1f)l)#JY-_0Npdd}XAPWhuC5q!uw!+Qp);LYBJlG=%aWzA%<5>i0_R znu4)ft&CMSWkS{}W7YkyV->i*=%kI>Ed^t>SsAOIe{)jN89TIxl(E{W&Cu@B?$++n z?$z$o?$;jB9+agJS?VoIp|TVvOX0HAN0x{+LY5+Bsb8x0@VBu#p*^WR#n-|!vef^N zv5JjeN-@5 z50$}+QD)?cGFY*H9jsQ1Z9LryA8$=5I{&5imx394rOa5u-<)4`#yg!_nX&iU58B_g zAGM#fpS54KUv)yq-x3L7uq?6tP+1x#OT%SpgeFkv08p}78Rg3vn^uPHD)57V{IqO{W=Sf#XnWypp!5MXRUd)ruT~|+6U)Mm_ zQ0Jj*q-(5eqT}JzL|Nji+hkdqB1=m)^*{R!sP$X(?2s$ot1eCmZdpG^VIF{9$o1|b$trvDO{PSdEDFRB9wcp`G2{$ z(nS?b)Bs&L<6Sd%P&M7)$kWN-6YOrpIZm4dUZn$oQZlrFMZnQ2*mKMp(sEf^AxkS|X;rFj%(r`}iG>rz)UE#R9*S>W7mn1r|Blo@Gg1qck)lm& zibjebpi-XHnqTy!R>{IAwTjxkTDP`fsD4m}YAts;#>hsgs36byk*k{BbwMH?Iq4YR`XX>YtgZY-Ofy$kNWDnYx`nQ@XoFGnMh} ziPB$-W+YGdxL~XvDPy&p` z_fhvr_gVKv_f?km%hCZ^;()!F|J)ju*+dY-9TsV^r>rwWHkZ~6CkRQf9Vs`(S8w^b(U%>O(e`s#X@{E5;# zD-(6@KRBbdz6lehucNQ4ch}d`*Vi}DH`IIR8|fR%(gj(%C`*@QiKlfh%TkssU6G}$ zvc%K5*HiVL-zLhpaH0ZaDf^F!;=9*{6U95({P$&G|G;Z>^c|In>Lg1yiYBVd-#wbr zhv>r!<|$N}r&~;izK`-~>h@nAP3cv^g?Cc={`%;Gks6?k)ZM>1spyOZ{UBksQlBVG z_g3op>s@YAjqbebRqK!e;eiQpyoRk~!8;2S9X~=pL6~jOkJOLSkJcyYW&IfaSp7Kt zcv*TNOL?;NP?jFa(qmbAB1=zY>6tA3xIsTrnLhm#{Z#!l{dD~d;UG)TmD!V}7qaw| zEWMPapJnM4AF2_Y5E9onJR#7hMVH8U->AsG%F6%ky`-BgQ3=I#6?-Z%LaxZvm+_^?-8Xaw(P6Pl11$GU|dELhhsWI$xp(4IQe z?-$_re1}IVFJk;l5Z*D-p>g2};avxWgvP`Vsp;xcvrb1|N6R03>Z*hdN(jr3mbc6c z4T)0TPa!rjAv~@@{vRV^;uAU!saLmW-P&z?@Ou-Q#>DjJZ2@b#Ik^>8dZqpc-epn0 zO21maMwVX7(yy}g+iLw<{W|@6S$ZQIXl3b(apBn79Px7b!%A zCq(k*J-qEkNZinZRtARmRbDkn)ynDFTHVp~w9~d4R5*LyX6W3E$?eC8+9PE&&#PCpI zT~#ft|7FNe=+FF{_)G8ApQH2|?omJIm%g2KQ2sBfDC*c{{k4B{n*O>zTYp0~5VCtqvs7E|57-8p8lc!k!&Ez1_rW$AuBW~d~r-+`1$W(r~gs7 zx6zxe?;RTz8K2f3mRA=oxV8GioM!8Rc#wzF+aZ{NjG(0T-3gMv3#fo=`i-}1{Ql;stlq^-IY{g2}j@4^4^k~$$Y7_4kEnBs2 z6BOK~Ymd-Av4e+<7#(CAofs8$rL?hDr#I=`nm4b`zx%KajS7j6@76ldD}fL6<`Rfc zQYTeT(gX)4hK7cRhlPh-F*P$bx3KEeI?$zm_|W(+{J$`=RprVjNl6B)EGr}#CRIo> z?btfdFD5#HBfVpyV&bkXxhXH#%`$d!cHt{uP=K<-ALo7-wnb8LB~;fs4c64G zrn`E9;E~z~4{#OvC63@4@d+MwSx`VQ|UwDXe=Mxy7 zkih+G{J%RSC?F`F*Gspd3%nb|_p6jETBY!iZ)azj8GANe>6N5QGE;)|@wZy#>zAZY zGFjCuAgN4J*(B4RI!gj5+B}NR$HWDMafcAuCo-I?#{Ao7I}D8t|Kl?}`)8Qdwq5(c zE(N`erj(rvZiXw3^@-%pCnlP^nN{sO(13#XmgkI)oqDtmY?a7+bw!1H#l?jTUEQ&B z2YQ!(n|UiJhf@6fY`Nnt_=xX-*ocsLs#oxFR_fM0zp906{juTdZtXkp>7Kp#Lh!GR zTOHE7!@v13A1Y|iA1!8uu<*jsS{2seTHlDse#ZTy21LgYY$xTb1z9ThsWH*Y-DmzE zn7+W+kWl4I2%pP;f9w2_%>Q6hSK;kyT~nt?vP!bPIxvnOxk+p_r~_|4=@Z0%yuDdB z|Lcmbcv8irN^SJ|2qE+lA^ZXnH4{1@Iw8)#y;pGO;4aoicSJE^&bv9f2yIAce5_a7 zwk?$*jwY6ZVgCNVZ?6lL^5-kg%39xl=0CV?5XJ?=afdN9EIxFA5GoHLjGl(Z#w7?* z+?J2q3{HquZa3q0+5WtDI=8zCQLI$qxqMhuD*81t{^bWSBXt% z+Me6Zx!pUle~=fqow&WJPn=&6w;OZ&MnqyW<#uf$G-kshI&|W8MQ%5b?%lc#w;OOf zA~fE+3%7Zxv}RRAc!1I;YNk0GnGn!{+w7-#85h%DIo?qS$s;V>$G70)QlI`YEtD9l z@bMk-g94S0=f^xO!dr=xy`<~?LYlYbHg{suZ{bn?%JHmYU=f?pR#}rj8~8*=wO01^ z>5qw?pB znizhHOKh*?PL4)?;n6`#4VAe_3W@Xe=Qg!6+Alh)LPWTT5xx0usE8K#g|&zmkz!E( zt-c~e41hHeIKiKzq7lat@uEK;@5}8+-#)MWSvf;FCzj8|h&~({#d$>^wH9HVUvQqX zMhuicDeFGXUpKUHKNt4%uK0sUuyPa`Mipr30R@v4n*R}{ z7g7AH^yRN{{?W67b^c`ql_q~*WoEtdS5YQx0F=&#=l9j0{X^(SJk?HQPL+;?>@O#*uTMLCMp$ps?Kz#lOMbPlNxQpUDRpW@pXgZ@v9UeYj`$cJ`^RUM zK7>zf{kF9jtngg0Wn!TFy!kRzr z)g006$-lKpv!8#{zn%Bz2`{*g{ygEzyoDA{w31^&;Y@u$``=}lU$3HSDaRLes$b!i z`u*%F_5FTgl#cyp5q;m$Ki?x1bSM9+Gq&L;s*Q{t`FUzDW0i4b{;g%~$t@e>D#k61 z&G~FIV|!yCW6N*#D7eOzIF##MnXsb!g+K1ag86LGBq;esFb8q@_gNu@`TlE;)_=-U zxkroq{;E=y=E^MCso*}LXwRa$=1<6(~CDwmBM!6?e?uD30 zRoDC;{+la7swmZz0=Q>tBdjGasgC4Xcw4!*^59?PzN+Bf+gWPDXB$gCQa$B#9Q%ErBWHGN~_AK%Bw1=s;a81YN_g}8moL& zEmiGR!Kz-WzN%T~LA>Rk16^&5@Ql+>7M zDr=lI^)%j^HkvM)KAJeqD9sd2vSyWL3-janirZ6lA%;avX-3bVlyd73Y7** zqoirlVrjjUAsv^lNcW{z(iel$1{Dmd8#FKoFz9U1*I=;01cPLQwFWy4PH+$X$l$G^ zp`jW5ai?#=hW!kO8%{G^YM5qt*zmGpp5YrKBct+0)r}e%wJ{1YN-&yWw8&_a(IKNO zqen*XiJi!L^%SaPw{Vh4+56?;K@=Z&N(1_|W1ri?87q zSzIdqsQAYc`V#gf8kOi!qF)KQ#KIC=cq{5VC4MbgvSgK#^-H!Z8Cf!^TL;SE2$OLZ%iSZYS8b)^oMx>@Si(xpq=mG&&%rF25+8N5*JSm~V7?~Tjws*3>Q zFyqn2Df|R;mhnq%acxztm$nB#x0S5juDzsvp)0Pl(|PMc_*P>I-yzD@z0sG^*VMPs z58yeiRQ(zKQxhW-I}=}%Fq3g6t4)rX~zvz%0sarr9>L>t?^3TbX;Ahnr6}-(sF+ z{;r&5InQ$8<))NND|fBj@8zw_`nQ7m*2k@1RjyFES>?paD=S~D{IQCCm7pqPs-#u9Yg59eo=qQ{ zc{WFFUfEW%ZDl*ccBAdBs>Q3;s~S;tLDf@L-`UyQb+Vgix6AISeL4F8`(gGQ?e930 zc4*=-&|#Is)oO;->Q(DsZE3YkN3~-e#|Xz1$4k}K)$3M|tiH7RWhVot`cBbKtDLf( zOF4Tv4|3k?#5zaoe6H(WH?HoMy3gEg-Fvw& zanG(-wqDzM)9RhBZ&1H!{n7RJ*Z3!Ho+aHu}Btuj4=5|8O&dW-Xe{Zk8Qj6%ZP*A>dVW z_vRy;A8%2rMPQ4?EgrOVY#G;bZ!2}H=B?(oy3@L9>*&_I+K4s*ZRWPQ+t$AAz_$C^ z8MbTNE~VY$_BGp&Xn!iOOkmHz)WEkLns%7k;dYQiP-4*0j@pjhI&SFru9HuvIh}Gl z*XTU5^SNM);K<?manI0BBqIw+YsqGok zb9*m?UY&ZS_WBgkCS+B}o8AGvm-K!W>K(cu^m&+P*u1c3;f=!Qgg@!isLz}}Py06N zJGbw%h$a!q5icUWBNs>h(yv*+<^A6EZ_|HW|F2P>>7ap>fsPlovo`(d~=JaqWc5tT>CBkqs%8o6?mYEMV*N#pXy`;Xr^!FWR4gzSk8CoZ2PO^Td!akAUwMU%fw37c|u zs_WF`sh_5WPCGlj=JbWrzs~40A2?95A}Z7u-0Pj)U}`2MX$?U-+uk^ z4elE@q*h3sxlz3_apSX1-8N-z_Sw99i}RM1X=Z6tw~DQaTYpUNm41C&i)}}@*W12j zN7Wrmc9z*WB}0`lG~?B-h+Vn6gLhxv(|pg-y$$#7+~=}y-Tun^Qx2FOn0c_o!Epz_ z9vXJ&&EeR?FOKv*l6SP{(c8y5AG>LW?xp3{%{_46=l=Nzfe&uy zh2}kf82|9oqj8T*KTdv9>B)wtwVv*O=Jzb~$F4s3>@C(&6QfpFMv* z|Elw=N591V^7Zw!U(5fx?zh^%9evaGP0rf^Z$G}9^1l50^&jeeIQ4s{-=BOO{K@Fk z!q3${@BPx^%bl+SzJBGoo}t73^bF3b;T`_;XO0*-s^}TURU?(>my+cCr+L0T*A`ar z+~%q=Ji)}%KmYo1p0Uvj3;upxE&q{4fM_Y&i9j(#j1uF;3?4MrVVb+mf8dX##idYU>#y)R{fb8r#WbZfl{B?9?wZCLFHK8L2Th13 zS~FHNfyWTjG&3}_G>bILG;1`Qcr>w9v(2=ksg0?tshg>%sjq1()3&BTru|HL_DK0h ztt$Ax7+d)N!vC3$`SuGa^gro&tCF>RyWnU2EBzk*YdzoTcqbbalMRaVeFNE`gltf9 zZOI7nTK`V}Uc45(0Ma(8xol8MHZV?V&cA#Uq{`nv<*z)W`9B`S+gfvw{ok*o92A%^ zRQaaV|8Qi7NacHI9GPXJ5?T|riH50iN#LXW`lvo-jK}>lL^dd$|LbN<3``7p0#aFf zm5G69+@nKG7|)%BBv{vUZQxd0_hbIIUrb7fsVjw^r_YPN(_&(5q7#n!A6sdnmkmq` ze^H1@*>6V{oLNpxU6JHgaGURBr}BF|cJg~Zj+8J=erB|GiNS%>IA8dG`PIchCJ_zW1z2je_XP{hxW? zbCcQy+gtqK`in74>K6o9;s4q9<~31SLtBz(a!Y!mDSW`Qyd`-SxFpZ& zmJCK$bVpBwfM?N5^89?szKFySti*Y|aEVV0p4fl|XXLyaTLYPX>qZ}+y0Todd_Na#Ha7Gi5 zk7+yfLSMvy*i5OV>3pPO6Sjc5nNkze2OwY5$M_i^g)kE+1?Jw2ea$Rkg<9|h`J1u6 z8IKRl#$zHTgS^eA;}A~c3dqeY8#i$qcR{XZFYpeZL9XU1XiypiU|t6e5DaG5JOb3) zJPOp@oY^sFcFdU_b7se!SutOV<)F^y)Y*JJ$l07(G2a7nHa`GrZhj7#ARcpSZvHFY zfSAlb2vM#p!a!fkjRy5Aw+v@+5gb!q4FedVIEcHv6)K@JY~TndxWE{(D33+iG)T`Z`J#Uw1n za!?lw>SDp#7OZWt71YGy01n{@j^PAO;VQ1<25#XAp5Zxu!teNmFG5%{GnVwuQVV9* zvJ9+I1-7sQvuarn4d4OlVA%qJpca-P2t_!ek$|C?iiOyWG^ArYc7ono(pyXNup|#l z@~|WiOX9X9ZcE~}yn`I%;sG9ldRjikk6;!n(7y@}XbJYN!1Y^U2ROe1`B_0{VGzkiqx#)&-lPMZ6#DdH89haYNIadp#i)>tt$B=04>l8{V@p}aUASd z=_=?~rJJ~oyZ8lPgs@gY149%;2~>nVoWONu&2?o>4AxEH2l`{(9Q4OJ5cJ5p6M{i4 ztivz>^u$`mSd7O+%)l(rf9rWj#tLje2KHbd4&pGVpEdQf&H{N@lZQ2PXMGFw$oeJd zkM(Q(hL8A+uR>HNx60&J*$kCHK9${22kxj3Pc(%O$gMKDRqlwMV74m9BN6nr@=zpU z48~yssCDHOtU)@6xAJkE#Az^BmCxfMGC>}d^Y947Uzr)J{2V`l-dCnCmC2*>TOJaX zg#(DE${@_gc3cO?*pQ!%A&P;%*=V6h8JMCb=$Q?DvIzn`vY|&d^vI?=`XB=RK(02? zh{a^A#}1sqeLMy=wJi?Tx3vPX*}9<)sHZKnY0GTddZ01dpf6a{HWAd&mKxd)2lcaM z7Hnr>0hj^XZP){9XiLv+sgvzfA*u?L1AA7rgFncrDl=AcDr?;PIkLM z>~{OXes=6Hw1$jF#6AnGl3*_w( zg9MDkC?tViIjq5EP-6#b>_CkjcH$t&+krYeP-h3~>_D9z=%d3IA*!)wHD}a-9|FOC z)!46EZ&34U)Vx{*;=#;R8w_Tq8Z%RkII7WuYRMp%YFCg8*01&mPw^vOfEri(1om~L zzK+z_k@`C7Q4uz%3VTpjM;A~FN9yY6h9+oDU+4$&tD^P6su1 zT!s}`1?uFu7VD7;=EHFx4&V@u;22Kg49IGtP zB6lb9cIpTE<3xX)=#LZqaiTv?^v6lYB+SD~PzNXK;Isjoum#k?=^ze+8aPn{r_;EG z8@P=ekeAZ~P#33nQ1YO!PG5y^Rzm_kbv8j6kef64I5T6;^wPNwxIUa4qA|SC8r0UA z+?<0zPo2A>J9=Ua7GWpoi8FO{F+(L-gY{jigSl~WfiK#FwOm-sg|%F$nF}>@83$&= zWd>$pDYjxeGQdo@?8hM-#R*Uc7xr}_e;4w1$-`sNSC<#~8L#mM??Fv!P=gx8QiD8e z5KE2mSb!a%wl(hKC8%Ky<@nD+xC&@c3R;-J6y;z6AB@6!+`uEy2iKoKOa0BhAW2JzG+=b9-X=bFp0N{Cv`(FxS2RtUntJk^RuEaEW;LqHE|QJY$K@f+B~ zjhNkt+078d?4|>8yIH~kHQ)hn_#pr-L9gBDk6UMSMR$;!8*#Z&cQ@+ob`h6x73}Fo z{oSa)8#&fC0QuD}4fd=}oobf@`_{ICBb?xZn%IoJApY71aYTqZo@fQ`N9qKl8+xKQ z`hyzO8HfZ7#!zt0)VU!Ly_}Qm_mwu?FjeaJK<*xz`8#yHgi; z>f%ma+}ncn+=<7Xc-*OrJF&P&Vg^#N9n7iw9_$0N>3$8waj*W)~LrC^`7B1SgSrgtxr80(w~O(r{QH>MK*4M zJ~gCA4fF6AoZIjPegCw;s6fg7*660&f^lYa1A$b8#%a-hj@Y?@e^L*SG>gse8N|L=u`~@6hlcELyxjB zhXt%)4I9{@8k|rAwNMB3&=8H`1t0jMIa;AD0?`q{=!Tx?jc`PuKcX=Z2^frF7>Oi| z#RN>oG|a>t%*R5cU>R0o4b~wQo3Rz!k%2wfk3%?$6F7}?xQNTRifr7%UF0GUkMRsI z@H1ZH4c_A;zVNiN3KEP^0;Qot8JM9wDxeaopeh_t9WJPe+Hgk$G=e9*;fDaUL>sh6 z5IUnPdLRU0=!=dV-luf24-U(7GN=!Vg*)XEjC~iwqO^iXOr7_ z2

    >8hDbsXK~oT3FPJ30o_60Jx5{!*w=F#_Td1it0(pJd?$pL73@H5yqFg+=ERGf zyy&+VefACszMxFfabok&K0)$Noog9Q4|s z9Q+>((M*k!C=J$W#yZVdr&$;VAO?9a@%#2YlfVYT0ryhJv29T!Xcs z1})jYB|T}$th0@1#Tu>3fw^mC1J-H9I;~iz75!+%8m*{DtGQSLa%!~`2XPqGq!l%3 zMNL{uAePozxWg0V)VeF^P3u0Gh*_8e`q7$LT4&>n5N(XW_1ne;oZqHCdY~^NF$KiY zWzwwwwjPzuad zJ3ll7^VyD?wxb^HsAoIs*^YX)uS>Y*Drzdbp$C-?T`-k#js z6MuW+Z%_Q~pM&$;zZD{|0;<9u#2iS>fy5j*8Jrh559#2%!2KZaKT#GG_uPC79soyfHlweGYOVfb%;CpglT(JUdUr45VT^b|MS6aaV|7dL3K>^g7rD%t$cv7R>&^ z0}zApV2xmU7R>&^7m*42+{F;Zzx-*Y{veNSrL^D&+Z(W@fJxfkd3;`m-1-;3jWt-)rb;R#;hwGbinC4|0&(3cQq zC?o-ckOAruas+SiMevdnc)%C_7zygwo7j7kTkjJ%h4(^)()&>6HI!O}HU_;5jRLWR z4hHdr5>F`cgi^myVhR0Ch%g&4r(whu7K@=64*C;z5~uN1i11=4fx2h{FARZml3GOW#6b{iBsK2G-u;TB8QLKb)4`to7J^#! zqgMT>RsUA#h|XZ0{;boVbttolVvVShAkQe)ifWF@AigMahTt#&j0XLPp>Hvla9N00b6A68 zWBVWm13{l+&*6d)11(_-J49nJn1g}maSho*#8J;U>KR8p<2WXcW8yd_j`QQLFP8L(DDMbMW7`jS9j68L-q>m;yFq9fc;2YfDZ6q0ZX znV<%PO2Z80Km!JG+#q5av>QjjTn#3k!NfC|cm_|yd@R62{Dhx{7(y?G_<&vvnT}*E z1T`MQaYG*SVp1m%%TRZ4A2XDkhK|PxTm&%3o*h5>^;H-1270fupM0gBbdLD5=ujh_UMZ4ScFwrgP-sg z?}ZrUjh1MQl}N=Vyc2@)5u?=zLJ#!9M(jWaz6g=T^^(M_C$&OHbOy&HaZD1&Bz+b_ zHU#$Blqbxa00cQPW`4&!8F{# zBRmme2KAlM6h4@bWmo~~JL4Ii3o(=PXVQzA96NI;#$X)i+swmY&zbaW7IDwgpaHz$ z3yz&N71MDRS3nPEQ>WP$r~rSo1@k_8B4%L@GI0~Pg_vUvdOfE)nj;YOa}GV9Lo9P9 zfVk&uz(zd9FG9>^pSk5w53NC8=2EY@)O0R2og0OC3<9~$9f7f6y}6S?z2?rqew@H* zoCEcp%N)+VkB6X^bAJ?KUL=^sd0c$+h-)7C%%kq}W@0wxAsN(p-fpnwypuSEGswd$ zA?8!d`4Ws!0;Qot8JM9w9N`RCxS=lU!vjq~U+4Rv9jMoQ>NUSJ=*9fSSOVghzY^EM z-t(D@`Q$R6T#_q+`AMe#$?TEL9?20%#9&abWa^cij)Pzpl9`2Ma!USPhy}#Hpg2mx z7|g_iwxG`onCk_dKz$c10u?O`aS2(tif8yF#6m-`_CnTPSPERf3r#@G z3u~e_sK-L;u#kNh`hxy1?2Bkj#8RYUGqz$oGC*Gzve&}9$OUy-NL?0^)56dADg+^m zMH&#tqB1Z=6;y=-s)M>MqHc>?g4!>l_KTRmMa5n^cw z$a!fj;y{0vslk5B^k5E`nPEA|W7!sL#daZyv2Kv_X_e}$#uGtI;~6xYpl!=VikQ@C4<_p8jndrtfn@rb)X)r%fcLE zFcY&e7s*1bu?BmuseziPje|Ic3%G@?rc%>X zj!(Ud*LVYJmiiH2gxIJ8Grp1e-pG7!EDas1g4y24Ol%~Ujl{Ci6~wZ!F6yHp=*LD+ zbjJv+z)?IFVpB12-X`MMM2?$gVG$V6P0O(osn`yBwP`o@;Q+{Y6YFd`fh;h0o0z*z zcW@thpnjX4;4Quiu~`i*=;>xNlt)F-$IVs1oNp%n&BVKzx@_)@uIPaf(2LFVZ!`Vd zJOHtX2Q#yo`@qf9F%z>f7s()>&E&Ir8OUezY8=KrA+~5h9k&FaKR9p8PF%&W_ypok zBknYMkVfs(h&zqA(=0*kX~dpJ>}kZFRugqm57a)5JkpxN7yjsoVDtvLq*3#*;h+cU)INPEMqo6EJDs@Gi93A?nEP~kkxot1seL+m zr2l~R*o-u6!www7Nn8T6lztBn!HlMJKax&9>Ex46Ptv(Qwh{X_J#1kQM>xY3Zm5g; z@IVu^2lKS86R7{TuIK?~YFjACXJP~4NNl@FJ z?GO*n+sXC6^A0`=kwGsqj8FolU<$5_4C2nH0(z8T2M5#vy~%J#efXgTTA?k1K%FzX zg4{C5B_k1oKpq+7kueF=!E9yB0l8!>#!`?=#un^DCa&N*Zi09-?%@F*;VI}r2D7zG z149%8dF&#OU0TrlUF5UN9OY2~pjX$O7}f_b#Z@UgF;SBVK^|?p7xc3G00_K88A!x z$YUSZ;yz|*Uwx3nK2LbV7ac$h`ecu=m*FNgMZz^VBHs*nO-?s@{uocvP z-wsg!ebj&7ejLORkkh_gd=+B94cK!(*W7;A+@FqX_)Uld#CxCuDuK8U*uojaeSrEO zXaElo{{iAZ&(92dV!->VMD>#X%1a(u0FKkkdg^)IvKXf;|uJ18W}A zz#e`GM>Gb4xDU~fL-gSgaUYt3X_x`xKScb8mV=o&MEr;7$Du8t7l+8@&`uo3NnF7V zkjEiq&j)yjCwPYULL4@L1*~8V`gGV1)!+nX=rB1Pt^;~;nA#t1i}s-YhdZJ(x`G}Y z?uFhUr^8$ihsR+xPJum-lm=@a2?8^BWFdCpFphz^kI;`J^x+6`A0h4|_dx7Ni2cZ8 zJjEOQj!*b1#8C-`D2|dKr=#R_lw6Lwf!L2WKqEAT5Bw1T;y+5fM~7h~k}wt%Fd5YU z=uA-iqw_(`M>m6-AKiu>$iQyU-=hr2QSv!@6emFLM~VHI2KHdjV*|jN$9Cc--V1Tu z9M-S_aUXX;O%V5S;y&&PZ}_1ZnxiFxLG6$CLMS4@{m^mtI39yh;95A&3>}{fayU*7 z$CrXxI=%{P!2BF1?&H^R1GkZb`yl?~Pr&`q@t^PtzY1}p7^wG&($GSWGB87Va9y9M zh{_cay~&=kIChVJNv z-Uve+IKv)iD!~Oc(HPz!hco1GrWM+tJ*fSeP!RW-@tB0E zU~bOL2JxR+fW=^T&aA*{Q1>&`{mcOz!Vw(9NzmUj=W!92L0)HG32~NLIqQZX3`Gh! z@9ZNX&PlL=6KbFqYNHXD{c{0m3F1CS+~UwLI4kQHVhT27x`!4aXEPOXrfY z5I-Oln~;Vb$iN^JsBUgwEYH;2K^1Q%2U6_KoAnpr`K)o)k!DbNmg>-DkPVB;Q zQ2Pt#KYqjIS;U?-05KQ= z8Dl{&vZi7>W`RCrky92qWidlp?3YC!vi9LHj^YGP;X3m09`q=S*}tNK1S6C{Y3NV} zW~dGqxS|%Q|CPF+{#QKE1YYogAL#d$F<6V!pf*>H!FgB7^XgzEV>wpg2du+ZQ2VRY z{^~&-!7&i~Ro1!6>|ebFYI&6&Tz!bgp#E2%gIT)zS%_GZ^0mOW57?}HO)ce{zki)fwNWn6!0Qp>71M<1H0VnZDi0j3{ zp4aL1b=JJT0QBejEqo9nTMYvccQ!r9ruNyyom~;ur~=~8CjM+U)C2KnH$qeRf?To# zK#jA>BfB4>!2D#BLpC{N55;gy0WoB6LK?P#`ruEtVb$#VL!;@CVSqb4>wQa94_Dvp5coSw^Wc|gc4x> zZ|Oh}Zjr;S@}L*DYN9skg8JX0{O8ia>yZv8On)6A_jw8a^`}X=WN6lq+)j@=-KT=vU7 z3T7zx6quo0<|p?Ne#d7a?$e+98W^HDNVLl} z$mc%ue?JUku@3BcpV@rCnh)wA7(+n34_06`i2DJ(ct8&x5ch-qIEcd_{s+YW;4-d* z_#e=V2f3gR56I=g6TAhplt&(UB~cnWkVBq1EKmW}LF{?No=5C?Uhsh*=s{jrQ2)H) z7zJvcHx3gq1=B&@^O&E!WNZM}cOEm8w-wYsF9Ul(9(jjw1jldz#Gm(z5Dz6-g1SDW zZV$U-5XN9KSnuIZu-3y9$ihwB!99@s!)IXj9{!Bi_)UmM_Gk+7coYWa=TRIILERsb z*CX zVDHBRF&N{(%s!rh*kGvTzOL^7%G6@AGr~gje_#Z}1Kug!obs-XM=J)aT0z zFr#16u>%Ki9PIIhHNV^fF?}JXFRcCLN3hnH-|-1wh4`w5gwoK#1Z80b_WNp$YG@2< z{FVK``XK-<(FW}igwE)S?x5aZqYw@1{q>_ziDD>$QqW=;CSo$CVunzuEa3o0IH3ma c;zzu|OHf 0 { - throw UtilsSQLiteError.connectionFailed - } - } else if self.encrypted && self.mode == "secret" && self.secret.count > 0 { - do { - try db = UtilsSQLite.connection(filename: "\(path)/\(self.databaseName)", readonly: false, key: self.secret) - self.isOpen = true - } catch { - if self.secret == "wrongsecret" { - message = "init: Error Database connection failed wrong secret" - print(message) - self.isOpen = false - } else { - // test if you can open it with the new secret in case of multiple runs - do { - try db = UtilsSQLite.connection(filename: "\(path)/\(self.databaseName)", readonly: false, key: self.newsecret) - self.secret = self.newsecret - self.isOpen = true - - } catch { - message = "init: Error Database connection failed wrong secret" - print(message) - self.isOpen = false - } - } - } - closeDB(db: db, method: "init") - if message.count > 0 { - throw UtilsSQLiteError.connectionFailed - } + let message: String = UtilsSQLite.createConnection(dbHelper: self, path: self.path, mode: self.mode, + encrypted: self.encrypted, secret: self.secret, + newsecret: self.newsecret) + self.isOpen = message.count == 0 || message == "swap newsecret" || + message == "encryption" ? true : false - } else if self.encrypted && self.mode == "newsecret" && self.secret.count > 0 && self.newsecret.count > 0 { - do { - try db = UtilsSQLite.connection(filename: "\(path)/\(self.databaseName)", readonly: false, key: self.secret) - - let keyStatementString = """ - PRAGMA rekey = '\(self.newsecret)'; - """ - let returnCode: Int32 = sqlite3_exec(db, keyStatementString, nil, nil, nil) - if returnCode != SQLITE_OK { - message = "connection: Unable to open a connection to database at \(path)/\(self.databaseName)" - print(message) - } - /* this should work but does not sqlite3_rekey_v2 is not known - if sqlite3_rekey_v2(db!, "\(path)/\(self.dbName)", newsecret, Int32(newsecret.count)) == SQLITE_OK { - self.isOpen = true - } else { - print("Unable to open a connection to database at \(path)/\(self.dbName)") - throw StorageDatabaseHelperError.wrongNewSecret - } - */ + if message.count > 0 { + if message.contains("connection:") { + throw UtilsSQLiteError.wrongNewSecret + } else if message.contains("wrong secret") { + throw UtilsSQLiteError.wrongSecret + } else if message == "swap newsecret" { self.secret = self.newsecret - self.isOpen = true - - } catch { - message = "init: Error Database connection failed wrong secret" - print(message) - } - closeDB(db: db, method: "init") - if message.count > 0 { - if message.contains("connection:") { - throw UtilsSQLiteError.wrongNewSecret - } else { - throw UtilsSQLiteError.wrongSecret - } - } - - } else if self.encrypted && self.mode == "encryption" && self.secret.count > 0 { - var res: Bool = false - do { - try res = UtilsSQLite.encryptDatabase(fileName: self.databaseName, secret: self.secret) - if res { - self.encrypted = true - self.isOpen = true - } - } catch { - message = "init: Error Database connection failed wrong secret" - } - closeDB(db: db, method: "init") - if message.count > 0 { - print(message) - throw UtilsSQLiteError.encryptionFailed + } else if message == "encryption" { + self.encrypted = true + } else { + throw UtilsSQLiteError.connectionFailed } } + } // MARK: - CloseDB - private func closeDB(db: OpaquePointer?, method: String) { + func closeDB(mDB: OpaquePointer?, method: String) { var message: String = "" - let returnCode: Int32 = sqlite3_close_v2(db) + let returnCode: Int32 = sqlite3_close_v2(mDB) if returnCode != SQLITE_OK { - let errmsg: String = String(cString: sqlite3_errmsg(db)) + let errmsg: String = String(cString: sqlite3_errmsg(mDB)) message = "Error: \(method) closing the database rc: \(returnCode) message: \(errmsg)" print(message) } @@ -179,13 +124,13 @@ class DatabaseHelper { func close (databaseName: String) throws -> Bool { var ret: Bool = false - var db: OpaquePointer? + var mDB: OpaquePointer? do { - try db = UtilsSQLite.connection(filename: "\(path)/\(self.databaseName)") + try mDB = UtilsSQLite.connection(filename: self.path) isOpen = true - closeDB(db: db, method: "init") + closeDB(mDB: mDB, method: "init") isOpen = false - db = nil + mDB = nil ret = true } catch { @@ -200,19 +145,19 @@ class DatabaseHelper { // MARK: - ExecSQL func execSQL(sql: String) throws -> Int { - guard let db: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: "\(path)/\(databaseName)", + guard let mDB: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: self.path, secret: secret) else { throw DatabaseHelperError.dbConnection(message: "Error: DB connection") } var changes: Int = 0 var message: String = "" do { - changes = try execute(db: db, sql: sql) + changes = try execute(mDB: mDB, sql: sql) } catch DatabaseHelperError.execute(let msg) { message = "Error: execSQL \(msg)" } - closeDB(db: db, method: "execSQL") + closeDB(mDB: mDB, method: "execSQL") if message.count > 0 { throw DatabaseHelperError.execSql(message: message) } else { @@ -222,40 +167,43 @@ class DatabaseHelper { // MARK: - Execute - func execute(db: OpaquePointer, sql: String) throws -> Int { - let returnCode: Int32 = sqlite3_exec(db, sql, nil, nil, nil) + func execute(mDB: OpaquePointer, sql: String) throws -> Int { + let returnCode: Int32 = sqlite3_exec(mDB, sql, nil, nil, nil) if returnCode != SQLITE_OK { - let errmsg: String = String(cString: sqlite3_errmsg(db)) + let errmsg: String = String(cString: sqlite3_errmsg(mDB)) throw DatabaseHelperError.execute( message: "Error: execute failed rc: \(returnCode) message: \(errmsg)") } - let changes: Int = Int(sqlite3_total_changes(db)) + let changes: Int = Int(sqlite3_total_changes(mDB)) return changes } // MARK: - execSet - func execSet(set: [Any]) throws -> Int { - guard let db: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: "\(path)/\(databaseName)", + func execSet(set: [[String: Any]]) throws -> Int { + guard let mDB: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: self.path, secret: secret) else { throw DatabaseHelperError.dbConnection(message: "Error: DB connection") } var changes: Int = 0 var message: String = "" // Start a transaction - var sqltr: String = "BEGIN TRANSACTION;" - var returnCode: Int32 = sqlite3_exec(db, sqltr, nil, nil, nil) - if returnCode != SQLITE_OK { - let errmsg: String = String(cString: sqlite3_errmsg(db)) - throw DatabaseHelperError.execSet( - message: "Error: Begin Transaction failed rc: \(returnCode) message: \(errmsg)") + do { + try UtilsSQLite.beginTransaction(mDB: mDB) + } catch DatabaseHelperError.beginTransaction(let message) { + throw DatabaseHelperError.createDatabaseSchema(message: message) } do { for dict in set { - let row: NSMutableDictionary = dict as! NSMutableDictionary - let sql: String = row["statement"] as! String - let values: [Any] = row["values"] as! [Any] - let lastId: Int = try prepareSQL(db: db, sql: sql, values: values) + guard let sql: String = dict["statement"] as? String else { + throw DatabaseHelperError.execSet( + message: "Error: No statement given") + } + guard let values: [Any] = dict["values"] as? [Any] else { + throw DatabaseHelperError.execSet( + message: "Error: No values given") + } + let lastId: Int = try prepareSQL(mDB: mDB, sql: sql, values: values) if lastId == -1 { message = "Error: ExecSet failed in prepareSQL" changes = -1 @@ -270,17 +218,15 @@ class DatabaseHelper { } if changes > 0 && message.count == 0 { // commit the transaction - sqltr = "COMMIT TRANSACTION;" - returnCode = sqlite3_exec(db, sqltr, nil, nil, nil) - if returnCode != SQLITE_OK { - let errmsg: String = String(cString: sqlite3_errmsg(db)) - message = "Error: Commit Transaction failed rc: \(returnCode) message: \(errmsg)" - } else { - changes = Int(sqlite3_total_changes(db)) + do { + try UtilsSQLite.commitTransaction(mDB: mDB) + changes = Int(sqlite3_total_changes(mDB)) + } catch DatabaseHelperError.commitTransaction(let message) { + throw DatabaseHelperError.execSet(message: message) } } // close the db - closeDB(db: db, method: "execSet") + closeDB(mDB: mDB, method: "execSet") if message.count > 0 { throw DatabaseHelperError.execSet(message: message) } else { @@ -291,7 +237,7 @@ class DatabaseHelper { // MARK: - RunSQL func runSQL(sql: String, values: [Any]) throws -> [String: Int] { - guard let db: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: "\(path)/\(databaseName)", + guard let mDB: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: self.path, secret: secret) else { throw DatabaseHelperError.dbConnection(message: "Error: DB connection") } @@ -299,30 +245,26 @@ class DatabaseHelper { var lastId: Int = -1 var changes: Int = 0 // Start a transaction - - var sqltr: String = "BEGIN TRANSACTION;" - var returnCode: Int32 = sqlite3_exec(db, sqltr, nil, nil, nil) - if returnCode != SQLITE_OK { - let errmsg: String = String(cString: sqlite3_errmsg(db)) - throw DatabaseHelperError.runSql( - message: "Error: Begin Transaction failed rc: \(returnCode) message: \(errmsg)") + do { + try UtilsSQLite.beginTransaction(mDB: mDB) + } catch DatabaseHelperError.beginTransaction(let message) { + throw DatabaseHelperError.createDatabaseSchema(message: message) } do { - lastId = try prepareSQL(db: db, sql: sql, values: values) + lastId = try prepareSQL(mDB: mDB, sql: sql, values: values) } catch DatabaseHelperError.prepareSql(let msg) { message = msg } if lastId != -1 { - sqltr = "COMMIT TRANSACTION;" - returnCode = sqlite3_exec(db, sqltr, nil, nil, nil) - if returnCode != SQLITE_OK { - let errmsg: String = String(cString: sqlite3_errmsg(db)) - message = "Error: Commit Transaction failed rc: \(returnCode) message: \(errmsg)" + // commit the transaction + do { + try UtilsSQLite.commitTransaction(mDB: mDB) + changes = Int(sqlite3_total_changes(mDB)) + } catch DatabaseHelperError.commitTransaction(let message) { + throw DatabaseHelperError.createDatabaseSchema(message: message) } } - changes = Int(sqlite3_total_changes(db)) - - closeDB(db: db, method: "runSQL") + closeDB(mDB: mDB, method: "runSQL") if message.count > 0 { throw DatabaseHelperError.runSql(message: message) } else { @@ -333,20 +275,20 @@ class DatabaseHelper { // MARK: - PrepareSQL - func prepareSQL(db: OpaquePointer, sql: String, values: [Any]) throws -> Int { + func prepareSQL(mDB: OpaquePointer, sql: String, values: [Any]) throws -> Int { var runSQLStatement: OpaquePointer? var message: String = "" var lastId: Int = -1 - var returnCode: Int32 = sqlite3_prepare_v2(db, sql, -1, &runSQLStatement, nil) + var returnCode: Int32 = sqlite3_prepare_v2(mDB, sql, -1, &runSQLStatement, nil) if returnCode == SQLITE_OK { if !values.isEmpty { // do the binding of values var idx: Int = 1 for value in values { do { - try UtilsSQLite.bind(handle: runSQLStatement!, value: value, idx: idx) - idx = idx + 1 + try UtilsBinding.bind(handle: runSQLStatement, value: value, idx: idx) + idx += 1 } catch let error as NSError { message = "Error: prepareSQL bind failed " + error.localizedDescription break @@ -355,22 +297,22 @@ class DatabaseHelper { } returnCode = sqlite3_step(runSQLStatement) if returnCode != SQLITE_DONE { - let errmsg: String = String(cString: sqlite3_errmsg(db)) + let errmsg: String = String(cString: sqlite3_errmsg(mDB)) message = "Error: prepareSQL step failed rc: \(returnCode) message: \(errmsg)" } } else { - let errmsg: String = String(cString: sqlite3_errmsg(db)) + let errmsg: String = String(cString: sqlite3_errmsg(mDB)) message = "Error: prepareSQL prepare failed rc: \(returnCode) message: \(errmsg)" } returnCode = sqlite3_finalize(runSQLStatement) if returnCode != SQLITE_OK { - let errmsg: String = String(cString: sqlite3_errmsg(db)) + let errmsg: String = String(cString: sqlite3_errmsg(mDB)) message = "Error: prepareSQL finalize failed rc: \(returnCode) message: \(errmsg)" } if message.count > 0 { throw DatabaseHelperError.prepareSql(message: message) } else { - lastId = Int(sqlite3_last_insert_rowid(db)) + lastId = Int(sqlite3_last_insert_rowid(mDB)) return lastId } } @@ -378,18 +320,18 @@ class DatabaseHelper { // MARK: - SelectSQL func selectSQL(sql: String, values: [String]) throws -> [[String: Any]] { - guard let db: OpaquePointer = try UtilsSQLite.getReadableDatabase(filename: "\(path)/\(databaseName)", + guard let mDB: OpaquePointer = try UtilsSQLite.getReadableDatabase(filename: self.path, secret: secret) else { throw DatabaseHelperError.dbConnection(message: "Error: DB connection") } var result: [[String: Any]] = [] var message: String = "" do { - result = try querySQL(db: db, sql: sql, values: values) + result = try querySQL(mDB: mDB, sql: sql, values: values) } catch DatabaseHelperError.querySql(let msg) { message = msg } - closeDB(db: db, method: "selectSQL") + closeDB(mDB: mDB, method: "selectSQL") if message.count > 0 { throw DatabaseHelperError.selectSql(message: message) } else { @@ -399,62 +341,30 @@ class DatabaseHelper { // MARK: - QuerySQL - func querySQL(db: OpaquePointer, sql: String, values: [String]) throws -> [[String: Any]] { + func querySQL(mDB: OpaquePointer, sql: String, values: [String]) throws -> [[String: Any]] { var selectSQLStatement: OpaquePointer? var result: [[String: Any]] = [] var message: String = "" - var returnCode: Int32 = sqlite3_prepare_v2(db, sql, -1, &selectSQLStatement, nil) + var returnCode: Int32 = sqlite3_prepare_v2(mDB, sql, -1, &selectSQLStatement, nil) if returnCode == SQLITE_OK { if !values.isEmpty { // do the binding of values - var idx: Int = 1 - for value in values { - do { - try UtilsSQLite.bind(handle: selectSQLStatement!, value: value, idx: idx) - idx = idx + 1 - } catch let error as NSError { - message = "Error: querySQL bind failed " + error.localizedDescription - break - } - } + message = UtilsBinding.bindValues(handle: selectSQLStatement, values: values) } if message.count == 0 { - var fetchColumnInfo = true - var columnCount: Int32 = 0 - var columnNames = [String]() - var columnTypes = [Int32]() - - while sqlite3_step(selectSQLStatement) == SQLITE_ROW { - if fetchColumnInfo { - columnCount = sqlite3_column_count(selectSQLStatement) - - for index in 0.. 0 { @@ -495,7 +405,8 @@ class DatabaseHelper { // Create the Database Schema do { - changes = try createDatabaseSchema(jsonSQLite: jsonSQLite) + changes = try ImportFromJson.createDatabaseSchema(dbHelper: self, + jsonSQLite: jsonSQLite, path: self.path, secret: self.secret) if changes == -1 { success = false } @@ -507,15 +418,16 @@ class DatabaseHelper { // create the table's data if success { - jsonSQLite.show() +// jsonSQLite.show() do { - changes = try createTableData(jsonSQLite: jsonSQLite) + changes = try ImportFromJson.createDatabaseData(dbHelper: self, + jsonSQLite: jsonSQLite, path: self.path, secret: self.secret) if changes == -1 { success = false } } catch DatabaseHelperError.dbConnection(let message) { throw DatabaseHelperError.importFromJson(message: message) - } catch DatabaseHelperError.createTableData(let message) { + } catch DatabaseHelperError.createDatabaseData(let message) { throw DatabaseHelperError.importFromJson(message: message) } } @@ -531,7 +443,9 @@ class DatabaseHelper { var retObj: [String: Any] = [:] do { - retObj = try createExportObject(expMode: expMode) + let data: [String: Any] = ["path": self.path, "dbName": self.databaseName, + "encrypted": self.encrypted, "expMode": expMode, "secret": self.secret] + retObj = try ExportToJson.createExportObject(dbHelper: self, data: data) } catch DatabaseHelperError.createExportObject(let message) { throw DatabaseHelperError.exportToJson(message: message) } @@ -543,13 +457,13 @@ class DatabaseHelper { func createSyncTable() throws -> Int { var retObj: Int = -1 // Open the database for writing - guard let db: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: "\(path)/\(databaseName)", + guard let mDB: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: self.path, secret: secret) else { throw DatabaseHelperError.dbConnection(message: "Error: DB connection") } // check if the table has already been created do { - let isExists: Bool = try isTableExists(db: db, tableName: "sync_table") + let isExists: Bool = try UtilsJson.isTableExists(dbHelper: self, mDB: mDB, tableName: "sync_table") if !isExists { let date = Date() let syncTime: Int = Int(date.timeIntervalSince1970) @@ -561,7 +475,7 @@ class DatabaseHelper { INSERT INTO sync_table (sync_date) VALUES ('\(syncTime)'); COMMIT TRANSACTION; """ - retObj = try execute(db: db, sql: stmt) + retObj = try execute(mDB: mDB, sql: stmt) } else { retObj = 0 } @@ -570,7 +484,7 @@ class DatabaseHelper { } catch DatabaseHelperError.prepareSql(let message) { throw DatabaseHelperError.createSyncTable(message: message) } - closeDB(db: db, method: "createSyncTable") + closeDB(mDB: mDB, method: "createSyncTable") return retObj } @@ -579,679 +493,23 @@ class DatabaseHelper { func setSyncDate(syncDate: String ) throws -> Bool { var retBool: Bool = false // Open the database for writing - guard let db: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: "\(path)/\(databaseName)", + guard let mDB: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: self.path, secret: secret) else { throw DatabaseHelperError.dbConnection(message: "Error: DB connection") } do { -// let dateFormatter : DateFormatter = DateFormatter() -// dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" let date = Date() -// let dateString = dateFormatter.string(from: date) let syncTime: Int = Int(date.timeIntervalSince1970) let stmt: String = "UPDATE sync_table SET sync_date = \(syncTime) WHERE id = 1;" - let lastId: Int = try prepareSQL(db: db, sql: stmt, values: []) + let lastId: Int = try prepareSQL(mDB: mDB, sql: stmt, values: []) if lastId != -1 {retBool = true} } catch DatabaseHelperError.prepareSql(let message) { throw DatabaseHelperError.createSyncDate(message: message) } - closeDB(db: db, method: "setSyncDate") - + closeDB(mDB: mDB, method: "setSyncDate") return retBool } - - // MARK: - ImportFromJson - CreateDatabaseSchema - - private func createDatabaseSchema(jsonSQLite: JsonSQLite) throws -> Int { - var success: Bool = true - var changes: Int = -1 - var returnCode: Int32 - guard let db: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: "\(path)/\(databaseName)", - secret: secret) else { - throw DatabaseHelperError.dbConnection(message: "Error: DB connection") - } - if jsonSQLite.mode == "full" { - // Set PRAGMAS - let pragmas: String = "PRAGMA user_version = 1;" - returnCode = sqlite3_exec(db, pragmas, nil, nil, nil) - if returnCode != SQLITE_OK { - let errmsg: String = String(cString: sqlite3_errmsg(db)) - throw DatabaseHelperError.createDatabaseSchema( - message: "Error: PRAGMA failed rc: \(returnCode) message: \(errmsg)") - } - } - - // Start a transaction - - let sql: String = "BEGIN TRANSACTION;" - returnCode = sqlite3_exec(db, sql, nil, nil, nil) - if returnCode != SQLITE_OK { - let errmsg: String = String(cString: sqlite3_errmsg(db)) - throw DatabaseHelperError.createDatabaseSchema( - message: "Error: Begin Transaction failed rc: \(returnCode) message: \(errmsg)") - } - - // Create the Database Schema - var statements: [String] = [] - // Loop through Tables - for i in 0.. 0 { - var stmt: String - if jsonSQLite.mode == "full" { - stmt = "DROP TABLE IF EXISTS " - stmt.append(jsonSQLite.tables[i].name) - stmt.append(";") - statements.append(stmt) - } - - stmt = "CREATE TABLE IF NOT EXISTS " - stmt.append(jsonSQLite.tables[i].name) - stmt.append(" (") - for j in 0.. 0 { - for j in 0.. 0 { - let joined = statements.joined(separator: "\n") - do { - changes = try execute(db: db, sql: joined) - if changes == -1 { - success = false - } else { - let sql: String = "COMMIT TRANSACTION;" - print("**** sql create schemas & indexes \(sql)") - returnCode = sqlite3_exec(db, sql, nil, nil, nil) - if returnCode != SQLITE_OK { - let errmsg: String = String(cString: sqlite3_errmsg(db)) - throw DatabaseHelperError.createDatabaseSchema( - message: "Error: Commit Transaction failed rc: \(returnCode) message: \(errmsg)") - } - } - } catch DatabaseHelperError.execute(let message) { - throw DatabaseHelperError.importFromJson(message: message) - } - } else { - changes = 0 - } - if !success { - changes = -1 - } - closeDB(db: db, method: "createDatabaseSchema") - return changes - } - - // MARK: - ImportFromJson - createTableData - - private func createTableData(jsonSQLite: JsonSQLite) throws -> Int { - var success: Bool = true - var changes: Int = -1 - var isValue: Bool = false - guard let db: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: "\(path)/\(databaseName)", - secret: secret) else { - throw DatabaseHelperError.dbConnection(message: "Error: DB connection") - } - // Start a transaction - - let sql: String = "BEGIN TRANSACTION;" - var returnCode: Int32 = sqlite3_exec(db, sql, nil, nil, nil) - if returnCode != SQLITE_OK { - let errmsg: String = String(cString: sqlite3_errmsg(db)) - throw DatabaseHelperError.createTableData( - message: "Error: Begin Transaction failed rc: \(returnCode) message: \(errmsg)") - } - // Loop on tables to create Data - for i in 0.. 0 { - // Check if table exists - do { - let isTab: Bool = try isTableExists(db: db, tableName: jsonSQLite.tables[i].name) - - if !isTab { - let message: String = "createTableData: Table " + - jsonSQLite.tables[i].name + " does not exist" - throw DatabaseHelperError.createTableData(message: message) - } - } catch DatabaseHelperError.tableNotExists(let message) { - throw DatabaseHelperError.createTableData(message: message) - } - - // Get the Column's Name and Type - var jsonNamesTypes: JsonNamesTypes = JsonNamesTypes(names: [], types: []) - do { - jsonNamesTypes = try getTableColumnNamesTypes(db: db, tableName: jsonSQLite.tables[i].name) - } catch DatabaseHelperError.querySql(let message) { - throw DatabaseHelperError.importFromJson(message: message) - } - isValue = true - // Loop on Table's Values - for j in 0..] = jsonSQLite.tables[i].values![j] - - if jsonNamesTypes.names.count != row.count { - let message: String = """ - importFromJson: Table \(jsonSQLite.tables[i].name) values row \(j - ) not correct length - """ - throw DatabaseHelperError.importFromJson(message: message) - } - // Check the column's type before proceeding - let retTypes: Bool = checkColumnTypes( - types: jsonNamesTypes.types, values: row) - if !retTypes { - let message: String = """ - importFromJson: Table \(jsonSQLite.tables[i].name) values row \(j - ) not correct types - """ - throw DatabaseHelperError.importFromJson(message: message) - } - // Create INSERT or UPDATE Statements - var retisIdExists: Bool - do { - retisIdExists = try isIdExist(db: db, tableName: jsonSQLite.tables[i].name, - firstColumnName: jsonNamesTypes.names[0], key: row[0].value!) - - } catch DatabaseHelperError.isIdExists(let message) { - throw DatabaseHelperError.importFromJson(message: message) - } - var stmt: String - if jsonSQLite.mode == "full" || (jsonSQLite.mode == "partial" - && !retisIdExists) { - // Insert - let nameString: String = jsonNamesTypes.names.joined(separator: ",") - let questionMarkString: String = createQuestionMarkString(length: jsonNamesTypes.names.count) - stmt = "INSERT INTO \(jsonSQLite.tables[i].name) (\(nameString)) VALUES (\(questionMarkString));" - } else { - // Update - let setString: String = setNameForUpdate(names: jsonNamesTypes.names) - if setString.count == 0 { - let message: String = """ - importFromJson: Table \(jsonSQLite.tables[i].name) values row \(j - ) not set to String - """ - throw DatabaseHelperError.importFromJson(message: message) - } - stmt = "UPDATE \(jsonSQLite.tables[i].name) SET \(setString) WHERE " - stmt += "\(jsonNamesTypes.names[0]) = \(row[0].value!);" - } - let rowValues = getValuesFromRow(rowValues: row) - do { - let lastId: Int = try prepareSQL(db: db, sql: stmt, values: rowValues) - if lastId == -1 { - success = false - } - } catch DatabaseHelperError.prepareSql(let message) { - throw DatabaseHelperError.importFromJson(message: message) - } - } - } - } - if success && isValue { - let sql: String = "COMMIT TRANSACTION;" - print("**** sql create table value \(sql)") - returnCode = sqlite3_exec(db, sql, nil, nil, nil) - if returnCode != SQLITE_OK { - let errmsg: String = String(cString: sqlite3_errmsg(db)) - throw DatabaseHelperError.createTableData( - message: "Error: Commit Transaction failed rc: \(returnCode) message: \(errmsg)") - } else { - changes = Int(sqlite3_total_changes(db)) - } - } else { - if !isValue { - changes = 0 - } else { - changes = -1 - } - } - closeDB(db: db, method: "createTableData") - return changes - } - - // MARK: - ImportFromJson - IsTableExists - - private func isTableExists(db: OpaquePointer, tableName: String) throws -> Bool { - var ret: Bool = false - var query = "SELECT name FROM sqlite_master WHERE type='table' AND name='" - query.append(tableName) - query.append("';") - do { - let resQuery: [Any] = try querySQL(db: db, sql: query, values: []) - if resQuery.count > 0 {ret = true} - } catch DatabaseHelperError.querySql(let message) { - throw DatabaseHelperError.tableNotExists(message: message) - } - return ret - } - - // MARK: - ImportFromJson - GetTableColumnNamesTypes - - private func getTableColumnNamesTypes(db: OpaquePointer, tableName: String) throws -> JsonNamesTypes { - - var ret: JsonNamesTypes = JsonNamesTypes(names: [], types: []) - var query: String = "PRAGMA table_info(" - query.append(tableName) - query.append(");") - do { - let resQuery = try querySQL(db: db, sql: query, values: []) - if resQuery.count > 0 { - var names: [String] = [] - var types: [String] = [] - for i in 0..]) -> Bool { - var isRetType: Bool = true - for i in 0..) -> Bool { - var ret: Bool = false - if stype == "NULL" && type(of: avalue.tValue!) == String.self { ret = true } - if stype == "TEXT" && type(of: avalue.tValue!) == String.self { ret = true } - if stype == "INTEGER" && type(of: avalue.uValue!) == Int.self {ret = true } - if stype == "REAL" && type(of: avalue.vValue!) == Float.self { ret = true } - if stype == "BLOB" && type(of: avalue.tValue!) == String.self { ret = true } - return ret - } - - // MARK: - ImportFromJson - IsIdExist - - private func isIdExist(db: OpaquePointer, tableName: String, firstColumnName: String, key: Any) throws -> Bool { - var ret: Bool = false - var query: String = "SELECT \(firstColumnName) FROM \(tableName) WHERE \(firstColumnName) = " - if type(of: key) == String.self { - query.append("'\(key)';") - } else { - query.append("\(key);") - } - do { - let resQuery = try querySQL(db: db, sql: query, values: []) - if resQuery.count == 1 { - ret = true - } - } catch DatabaseHelperError.querySql(let message) { - throw DatabaseHelperError.isIdExists(message: "isIdExists: \(message)") - } - return ret - } - - // MARK: - ImportFromJson - CreateQuestionMarkString - - private func createQuestionMarkString(length: Int) -> String { - var retString: String = "" - for _ in 0..]) -> [Any] { - var retArray: [Any] = [] - for i in 0.. String { - var retString: String = "" - for i in 0.. [String: Any] { - var retObj: [String: Any] = [:] - guard let db: OpaquePointer = try UtilsSQLite.getReadableDatabase(filename: "\(path)/\(databaseName)", - secret: secret) else { - throw DatabaseHelperError.createExportObject(message: "Error: DB connection") - } - retObj["database"] = self.databaseName.dropLast(9) - retObj["encrypted"] = self.encrypted - retObj["mode"] = expMode - var tables: [[String: Any]] = [] - var syncDate: Int64 = 0 - // get the table's name - var query: String = "SELECT name,sql FROM sqlite_master WHERE type = 'table' " - query.append("AND name NOT LIKE 'sqlite_%' AND name NOT LIKE 'sync_table';") - do { - let resTables = try querySQL(db: db, sql: query, values: []) - if resTables.count > 0 { - var modTables: [String: String] = [:] - var modTablesKeys: [String] = [] - // get the sync date if expMode = "partial" - if expMode == "partial" { - syncDate = try getSyncDate(db: db) - if syncDate == -1 { - throw DatabaseHelperError.createExportObject(message: "Error did not find a sync_date") - } - // TODO Get Modified Tables - modTables = try getTablesModified(db: db, tables: resTables, syncDate: syncDate) - modTablesKeys.append(contentsOf: modTables.keys) - - } - for i in 0.. 0 { - let eSchema = try! JSONEncoder().encode(schema) - var eSchemaString: String { return String(data: eSchema, encoding: .utf8)! } - if eSchemaString.count > 0 { - table["schema"] = schema - isSchema = true - } - } - - // create indexes - let indexes: [[String: String]] = try createIndexes(db: db, tableName: tableName) - if indexes.count > 0 { - let eIndexes = try! JSONEncoder().encode(indexes) - var eIndexesString: String { return String(data: eIndexes, encoding: .utf8)! } - if eIndexesString.count > 0 { - table["indexes"] = indexes - isIndexes = true - } - } - } - - let jsonNamesTypes: JsonNamesTypes = try getTableColumnNamesTypes(db: db, tableName: tableName) - - let rowNames = jsonNamesTypes.names - let rowTypes = jsonNamesTypes.types - - // create the table data - var query: String - if expMode == "full" || - (expMode == "partial" && - modTables[tableName] == "Create") { - query = "SELECT * FROM \(tableName);" - } else { - query = "SELECT * FROM \(tableName) WHERE last_modified > \(syncDate);" - } - - let values: [[Any]] = try createValues(db: db, query: query, names: rowNames, types: rowTypes) - if values.count > 0 { - table["values"] = values - isValues = true - } - - table["values"] = values - - // check the table object validity - var tableKeys: [String] = [] - tableKeys.append(contentsOf: table.keys) - - if tableKeys.count < 1 || - (!isSchema && !isIndexes && !isValues) { - throw DatabaseHelperError.createExportObject(message: "Error table is not a jsonTable") - } - - tables.append(table) - } - } - } catch DatabaseHelperError.querySql(let message) { - throw DatabaseHelperError.createExportObject(message: "Error get table's names failed : \(message)") - } catch DatabaseHelperError.getTablesModified(let message) { - throw DatabaseHelperError.createExportObject(message: "Error get table's modified failed : \(message)") - } catch DatabaseHelperError.createSchema(let message) { - throw DatabaseHelperError.createExportObject(message: "Error create schema failed : \(message)") - } catch DatabaseHelperError.createValues(let message) { - throw DatabaseHelperError.createExportObject(message: "Error create values failed : \(message)") - } catch DatabaseHelperError.createIndexes(let message) { - throw DatabaseHelperError.createExportObject(message: "Error create indexes failed : \(message)") - } - - retObj["tables"] = tables - - return retObj - } - - // MARK: - ExportToJson - GetSyncDate - - private func getSyncDate(db: OpaquePointer) throws -> Int64 { - var ret: Int64 = -1 - let query: String = "SELECT sync_date FROM sync_table;" - do { - let resSyncDate = try querySQL(db: db, sql: query, values: []) - if resSyncDate.count > 0 { - let res: Int64 = resSyncDate[0]["sync_date"] as! Int64 - if res > 0 {ret = res} - } - - } catch DatabaseHelperError.querySql(let message) { - throw DatabaseHelperError.getSyncDate(message: "Error get sync date failed : \(message)") - } - - return ret - } - - // MARK: - ExportToJson - GetTablesModified - - private func getTablesModified(db: OpaquePointer, tables: [[String: Any]], syncDate: Int64) throws -> [String: String] { - var retObj: [String: String] = [:] - if tables.count > 0 { - for i in 0.. [[String: String]] { - var retSchema: [[String: String]] = [] - // get the sqlStmt between the parenthesis sqlStmt - if let openPar = stmt.firstIndex(of: "(") { - if let closePar = stmt.lastIndex(of: ")") { - let sqlStmt: String = String(stmt[stmt.index(after: openPar).. [[String: String]] { - var retIndexes: [[String: String]] = [] - var query = "SELECT name,tbl_name,sql FROM sqlite_master WHERE " - query.append("type = 'index' AND tbl_name = '\(tableName)' AND sql NOTNULL;") - do { - let resIndexes = try querySQL(db: db, sql: query, values: []) - if resIndexes.count > 0 { - for i in 0.. [[Any]] { - var retValues: [[Any]] = [] - - do { - let resValues = try querySQL(db: db, sql: query, values: []) - if resValues.count > 0 { - for i in 0.. [String: Any] { + var retObj: [String: Any] = [:] + let message = "exportToJson: createExportObject miss data: " + guard let path = data["path"] as? String else { + throw DatabaseHelperError.createExportObject(message: message + "path") + } + guard let expMode = data["expMode"] as? String else { + throw DatabaseHelperError.createExportObject(message: message + "expMode") + } + guard let dbName = data["dbName"] as? String else { + throw DatabaseHelperError.createExportObject(message: message + "dbName") + } + guard let encrypted = data["encrypted"] as? Bool else { + throw DatabaseHelperError.createExportObject(message: message + "encrypted") + } + guard let secret = data["secret"] as? String else { + throw DatabaseHelperError.createExportObject(message: message + "secret") + } + guard let mDB: OpaquePointer = try UtilsSQLite.getReadableDatabase(filename: path, + secret: secret) else { + throw DatabaseHelperError.createExportObject(message: "Error: DB connection") + } + retObj["database"] = dbName.dropLast(9) + retObj["encrypted"] = encrypted + retObj["mode"] = expMode + var tables: [[String: Any]] = [] + + // get the table's name + var query: String = "SELECT name,sql FROM sqlite_master WHERE type = 'table' " + query.append("AND name NOT LIKE 'sqlite_%' AND name NOT LIKE 'sync_table';") + do { + let resTables = try dbHelper.querySQL(mDB: mDB, sql: query, values: []) + if resTables.count > 0 { + switch expMode { + case "partial" : + tables = try ExportToJson.getTablesPartial(dbHelper: dbHelper, mDB: mDB, + resTables: resTables) + case "full": + tables = try ExportToJson.getTablesFull(dbHelper: dbHelper, mDB: mDB, + resTables: resTables) + + default: + throw DatabaseHelperError.createExportObject(message: "expMode \(expMode) not defined") + } + } + } catch DatabaseHelperError.querySql(let message) { + throw DatabaseHelperError.createExportObject(message: "Error get table's names failed : \(message)") + } catch DatabaseHelperError.getTablesFull(let message) { + throw DatabaseHelperError.createExportObject(message: "Error get tables 'Full' failed : \(message)") + } catch DatabaseHelperError.getTablesPartial(let message) { + throw DatabaseHelperError.createExportObject(message: "Error get tables 'Partial' failed :" + + " \(message)") + } + + retObj["tables"] = tables + + return retObj + } + + // MARK: - ExportToJson - GetSchemaIndexes + + class func getSchemaIndexes(dbHelper: DatabaseHelper, mDB: OpaquePointer, + stmt: String, table: [String: Any] ) throws -> [String: Any] { + var retTable: [String: Any] = table + var isSchema: Bool = false + var isIndexes: Bool = false + do { + // create schema + let schema: [[String: String]] = try ExportToJson.createSchema(stmt: stmt) + if schema.count > 0 { + isSchema = try UtilsJson.validateSchema(schema: schema) + if isSchema {retTable["schema"] = schema} + } + // create indexes + guard let tableName: String = table["name"] as? String else { + let message: String = "Error getSchemaIndexes: did not find table name" + throw DatabaseHelperError.getSchemaIndexes(message: message) + } + let indexes: [[String: String]] = try ExportToJson.createIndexes(dbHelper: dbHelper, + mDB: mDB, tableName: tableName) + if indexes.count > 0 { + isIndexes = try UtilsJson.validateIndexes(indexes: indexes) + if isIndexes {retTable["indexes"] = indexes} + } + let retObj: [String: Any] = ["isSchema": isSchema, "isIndexes": isIndexes, + "table": retTable] + return retObj + } catch DatabaseHelperError.createSchema(let message) { + throw DatabaseHelperError.getSchemaIndexes(message: message) + } catch DatabaseHelperError.validateSchema(let message) { + throw DatabaseHelperError.getSchemaIndexes(message: message) + } catch DatabaseHelperError.createIndexes(let message) { + throw DatabaseHelperError.getSchemaIndexes(message: message) + } catch DatabaseHelperError.validateIndexes(let message) { + throw DatabaseHelperError.getSchemaIndexes(message: message) + } + } + + // MARK: - ExportToJson - GetValues + + class func getValues(dbHelper: DatabaseHelper, mDB: OpaquePointer, + stmt: String, table: [String: Any] ) throws -> [String: Any] { + var retTable: [String: Any] = table + var isValues: Bool = false + do { + guard let tableName: String = table["name"] as? String else { + let message: String = "Error getSchemaIndexes: did not find table name" + throw DatabaseHelperError.getValues(message: message) + } + let jsonNamesTypes: JsonNamesTypes = + try UtilsJson.getTableColumnNamesTypes(dbHelper: dbHelper, + mDB: mDB, tableName: tableName) + let rowNames = jsonNamesTypes.names + let rowTypes = jsonNamesTypes.types + + // create the table data + + let values: [[Any]] = try ExportToJson.createValues(dbHelper: dbHelper, mDB: mDB, + query: stmt, names: rowNames, types: rowTypes) + if values.count > 0 { + retTable["values"] = values + isValues = true + } + let retObj: [String: Any] = ["isValues": isValues, "table": retTable] + return retObj + } catch DatabaseHelperError.getTableColumnNamesTypes(let message) { + throw DatabaseHelperError.getValues(message: message) + } catch DatabaseHelperError.createValues(let message) { + throw DatabaseHelperError.getValues(message: message) + } + } + + // MARK: - ExportToJson - GetTablesFull + + class func getTablesFull(dbHelper: DatabaseHelper, mDB: OpaquePointer, + resTables: [[String: Any]]) throws -> [[String: Any]] { + var tables: [[String: Any]] = [] + for rTable in resTables { + guard let tableName: String = rTable["name"] as? String else { + throw DatabaseHelperError.getTablesFull(message: "Error did not find table name") + } + guard let sqlStmt: String = rTable["sql"] as? String else { + throw DatabaseHelperError.getTablesFull(message: "Error did not find sql statement") + } + var table: [String: Any] = [:] + table["name"] = tableName + var result: [String: Any] = [:] + do { + // create schema and indexes + result = try ExportToJson.getSchemaIndexes(dbHelper: dbHelper, mDB: mDB, + stmt: sqlStmt, table: table) + guard let isSchema: Bool = result["isSchema"] as? Bool else { + throw DatabaseHelperError.getTablesFull(message: "Error did not find isSchema") + } + guard let isIndexes: Bool = result["isIndexes"] as? Bool else { + throw DatabaseHelperError.getTablesFull(message: "Error did not find isIndexes") + } + guard let retTable: [String: Any] = result["table"] as? [String: Any] else { + throw DatabaseHelperError.getTablesFull(message: "Error did not find table") + } + table = retTable + // create the table data + let query: String = "SELECT * FROM \(tableName);" + result = try ExportToJson.getValues(dbHelper: dbHelper, mDB: mDB, + stmt: query, table: table) + guard let isValues: Bool = result["isValues"] as? Bool else { + throw DatabaseHelperError.getTablesFull(message: "Error did not find isValues") + } + guard let retTable1: [String: Any] = result["table"] as? [String: Any] else { + throw DatabaseHelperError.getTablesFull(message: "Error did not find table") + } + table = retTable1 + // check the table object validity + var tableKeys: [String] = [] + tableKeys.append(contentsOf: table.keys) + + if tableKeys.count < 1 || + (!isSchema && !isIndexes && !isValues) { + throw DatabaseHelperError.getTablesFull(message: "Error table is not a jsonTable") + } + tables.append(table) + } catch DatabaseHelperError.getSchemaIndexes(let message) { + throw DatabaseHelperError.getTablesFull(message: message) + } catch DatabaseHelperError.getValues(let message) { + throw DatabaseHelperError.getTablesFull(message: message) + } + } + + return tables + } + + // MARK: - ExportToJson - GetTablesPartial + + // swiftlint:disable cyclomatic_complexity + class func getTablesPartial(dbHelper: DatabaseHelper, mDB: OpaquePointer, + resTables: [[String: Any]]) throws -> [[String: Any]] { + var tables: [[String: Any]] = [] + var syncDate: Int64 = 0 + var modTables: [String: String] = [:] + var modTablesKeys: [String] = [] + var result: [String: Any] = [:] + var isSchema: Bool = false + var isIndexes: Bool = false + do { + // Get the syncDate and the Modified Tables + let partialModeData: [String: Any] = try ExportToJson.getPartialModeData(dbHelper: dbHelper, mDB: mDB, + tables: resTables) + guard let sDate = partialModeData["syncDate"] as? Int64 else { + let message: String = "Error cannot find syncDate" + throw DatabaseHelperError.getTablesPartial(message: message) + } + guard let mTables = partialModeData["modTables"] as? [String: String] else { + let message: String = "Error cannot find modTables" + throw DatabaseHelperError.getTablesPartial(message: message) + } + syncDate = sDate + modTables = mTables + modTablesKeys.append(contentsOf: modTables.keys) + + for rTable in resTables { + guard let tableName: String = rTable["name"] as? String else { + throw DatabaseHelperError.getTablesPartial(message: "Error did not find table name") + } + guard let sqlStmt: String = rTable["sql"] as? String else { + throw DatabaseHelperError.getTablesPartial(message: "Error did not find sql statement") + } + if modTablesKeys.count == 0 || !modTablesKeys.contains(tableName) || + modTables[tableName] == "No" { + continue + } + var table: [String: Any] = [:] + table["name"] = tableName + if modTables[tableName] == "Create" { + // create schema and indexes + result = try ExportToJson.getSchemaIndexes(dbHelper: dbHelper, mDB: mDB, + stmt: sqlStmt, table: table) + guard let isSch: Bool = result["isSchema"] as? Bool else { + throw DatabaseHelperError.getTablesFull(message: "Error did not find isSchema") + } + guard let isIdxes: Bool = result["isIndexes"] as? Bool else { + throw DatabaseHelperError.getTablesFull(message: "Error did not find isIndexes") + } + guard let retTable: [String: Any] = result["table"] as? [String: Any] else { + throw DatabaseHelperError.getTablesFull(message: "Error did not find table") + } + isSchema = isSch + isIndexes = isIdxes + table = retTable + } + // create table data + let query: String = modTables[tableName] == "Create" + ? "SELECT * FROM \(tableName);" + : "SELECT * FROM \(tableName) WHERE last_modified > \(syncDate);" + result = try ExportToJson.getValues(dbHelper: dbHelper, mDB: mDB, + stmt: query, table: table) + guard let isValues: Bool = result["isValues"] as? Bool else { + throw DatabaseHelperError.getTablesFull(message: "Error did not find isValues") + } + guard let retTable1: [String: Any] = result["table"] as? [String: Any] else { + throw DatabaseHelperError.getTablesFull(message: "Error did not find table") + } + table = retTable1 + // check the table object validity + var tableKeys: [String] = [] + tableKeys.append(contentsOf: table.keys) + + if tableKeys.count < 1 || + (!isSchema && !isIndexes && !isValues) { + throw DatabaseHelperError.getTablesPartial(message: "Error table is not a jsonTable") + } + tables.append(table) + } + } catch DatabaseHelperError.getSchemaIndexes(let message) { + throw DatabaseHelperError.getTablesPartial(message: message) + } catch DatabaseHelperError.getValues(let message) { + throw DatabaseHelperError.getTablesPartial(message: message) + } + return tables + } + // swiftlint:enable cyclomatic_complexity + + // MARK: - ExportToJson - GetPartialModeData + + class func getPartialModeData(dbHelper: DatabaseHelper, mDB: OpaquePointer, + tables: [[String: Any]]) throws -> [String: Any] { + var retData: [String: Any] = [:] + var syncDate: Int64 = 0 + var modTables: [String: String] = [:] + + // get the sync date if expMode = "partial" + syncDate = try ExportToJson.getSyncDate(dbHelper: dbHelper, mDB: mDB) + if syncDate == -1 { + throw DatabaseHelperError.getPartialModeData(message: "Error did not find a sync_date") + } + do { + modTables = try ExportToJson.getTablesModified(dbHelper: dbHelper, mDB: mDB, + tables: tables, syncDate: syncDate) + retData = ["syncDate": syncDate, "modTables": modTables] + } catch DatabaseHelperError.getTablesModified(let message) { + throw DatabaseHelperError.getPartialModeData(message: message) + } + return retData + } + + // MARK: - ExportToJson - GetSyncDate + + class func getSyncDate(dbHelper: DatabaseHelper, mDB: OpaquePointer) throws -> Int64 { + var ret: Int64 = -1 + let query: String = "SELECT sync_date FROM sync_table;" + do { + let resSyncDate = try dbHelper.querySQL(mDB: mDB, sql: query, values: []) + if resSyncDate.count > 0 { + guard let res: Int64 = resSyncDate[0]["sync_date"] as? Int64 else { + throw DatabaseHelperError.getSyncDate(message: "Error get sync date failed") + } + if res > 0 {ret = res} + } + } catch DatabaseHelperError.querySql(let message) { + throw DatabaseHelperError.getSyncDate(message: "Error get sync date failed : \(message)") + } + + return ret + } + + // MARK: - ExportToJson - GetTablesModified + + class func getTablesModified(dbHelper: DatabaseHelper, mDB: OpaquePointer, + tables: [[String: Any]], syncDate: Int64) throws -> [String: String] { + var retObj: [String: String] = [:] + if tables.count > 0 { + for ipos in 0.. [[String: String]] { + var retSchema: [[String: String]] = [] + // get the sqlStmt between the parenthesis sqlStmt + if let openPar = stmt.firstIndex(of: "(") { + if let closePar = stmt.lastIndex(of: ")") { + let sqlStmt: String = String(stmt[stmt.index(after: openPar).. [[String: String]] { + var retIndexes: [[String: String]] = [] + var query = "SELECT name,tbl_name,sql FROM sqlite_master WHERE " + query.append("type = 'index' AND tbl_name = '\(tableName)' AND sql NOTNULL;") + do { + let resIndexes = try dbHelper.querySQL(mDB: mDB, sql: query, values: []) + if resIndexes.count > 0 { + for ipos in 0.. [[Any]] { + var retValues: [[Any]] = [] + + do { + let resValues = try dbHelper.querySQL(mDB: mDB, sql: query, values: []) + if resValues.count > 0 { + for ipos in 0.. [Any] { + var row: [Any] = [] + for jpos in 0.. Int { + var changes: Int = -1 + var returnCode: Int32 + guard let mDB: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: path, + secret: secret) else { + throw DatabaseHelperError.dbConnection(message: "Error: DB connection") + } + if jsonSQLite.mode == "full" { + // Set PRAGMAS + let pragmas: String = "PRAGMA user_version = 1;" + returnCode = sqlite3_exec(mDB, pragmas, nil, nil, nil) + if returnCode != SQLITE_OK { + let errmsg: String = String(cString: sqlite3_errmsg(mDB)) + throw DatabaseHelperError.createDatabaseSchema( + message: "Error: PRAGMA failed rc: \(returnCode) message: \(errmsg)") + } + } + + // Start a transaction + do { + try UtilsSQLite.beginTransaction(mDB: mDB) + } catch DatabaseHelperError.beginTransaction(let message) { + throw DatabaseHelperError.createDatabaseSchema(message: message) + } + // Create the Database Schema + var statements: [String] = [] + // Loop through Tables + for ipos in 0.. 0 { + let stmt: [String] = ImportFromJson.createTableSchema(mSchema: mSchema, + tableName: tableName, mode: mode) + statements.append(contentsOf: stmt) + } + } + if let mIndexes: [JsonIndex] = jsonSQLite.tables[ipos].indexes { + if mIndexes.count > 0 { + let stmt: [String] = ImportFromJson.createTableIndexes(mIndexes: mIndexes, tableName: tableName) + statements.append(contentsOf: stmt) + } + } + } + if statements.count > 0 { + let joined = statements.joined(separator: "\n") + do { + changes = try UtilsSQLite.executeCommit(dbHelper: dbHelper, mDB: mDB, sql: joined) + } catch DatabaseHelperError.executeCommit(let message) { + throw DatabaseHelperError.importFromJson(message: message) + } + } else { + changes = 0 + } + dbHelper.closeDB(mDB: mDB, method: "createDatabaseSchema") + return changes + } + + // MARK: - ImportFromJson - CreateTableSchema + + class func createTableSchema(mSchema: [JsonColumn], tableName: String, mode: String) -> [String] { + var statements: [String] = [] + var stmt: String + if mode == "full" { + stmt = "DROP TABLE IF EXISTS " + stmt.append(tableName) + stmt.append(";") + statements.append(stmt) + } + stmt = "CREATE TABLE IF NOT EXISTS " + stmt.append(tableName) + stmt.append(" (") + for jpos in 0.. 0 { + stmt.append(jSchColumn) + } + } + if let jSchForeignkey = mSchema[jpos].foreignkey { + if jSchForeignkey.count > 0 { + stmt.append("FOREIGN KEY (\( jSchForeignkey))") + } + } + stmt.append(" ") + stmt.append(mSchema[jpos].value) + if jpos != mSchema.count - 1 { + stmt.append(",") + } + } + stmt.append(");") + statements.append(stmt) + return statements + } + + // MARK: - ImportFromJson - CreateTableIndexes + + class func createTableIndexes(mIndexes: [JsonIndex], tableName: String) -> [String] { + var statements: [String] = [] + for jpos in 0.. Int { + var changes: Int = -1 + var success: Bool = true + var isValue: Bool = false + guard let mDB: OpaquePointer = try UtilsSQLite.getWritableDatabase(filename: path, + secret: secret) else { + throw DatabaseHelperError.dbConnection(message: "Error: DB connection") + } + // Start a transaction + do { + try UtilsSQLite.beginTransaction(mDB: mDB) + } catch DatabaseHelperError.beginTransaction(let message) { + throw DatabaseHelperError.createDatabaseData(message: message) + } + // Loop on tables to create Data + for ipos in 0.. 0 { + isValue = true + do { + success = try ImportFromJson.createTableData(dbHelper: dbHelper, mDB: mDB, + mode: jsonSQLite.mode, mValues: mValues, tableName: jsonSQLite.tables[ipos].name) + } catch DatabaseHelperError.createTableData(let message) { + throw DatabaseHelperError.createDatabaseData(message: message) + } + } + } + } + if !success { + changes = -1 + } else { + if !isValue { + changes = 0 + } else { + // commit the transaction + do { + try UtilsSQLite.commitTransaction(mDB: mDB) + changes = Int(sqlite3_total_changes(mDB)) + } catch DatabaseHelperError.commitTransaction(let message) { + throw DatabaseHelperError.createDatabaseData(message: message) + } + } + } + dbHelper.closeDB(mDB: mDB, method: "createTableData") + return changes + } + + // MARK: - ImportFromJson - createTableData + + class func createTableData(dbHelper: DatabaseHelper, mDB: OpaquePointer, mode: String, + mValues: [[UncertainValue]], tableName: String) throws -> Bool { + var success: Bool = false + // Check if table exists + do { + let isTab: Bool = try UtilsJson.isTableExists(dbHelper: dbHelper, mDB: mDB, + tableName: tableName) + if !isTab { + let message: String = "createTableData: Table " + + tableName + " does not exist" + throw DatabaseHelperError.createTableData(message: message) + } + } catch DatabaseHelperError.tableNotExists(let message) { + throw DatabaseHelperError.createTableData(message: message) + } + // Get the Column's Name and Type + var jsonNamesTypes: JsonNamesTypes = JsonNamesTypes(names: [], types: []) + do { + jsonNamesTypes = try UtilsJson.getTableColumnNamesTypes(dbHelper: dbHelper, mDB: mDB, + tableName: tableName) + } catch DatabaseHelperError.querySql(let message) { + throw DatabaseHelperError.createTableData(message: message) + } + for jpos in 0..] = mValues[jpos] + do { + try UtilsJson.checkRowValidity(dbHelper: dbHelper, jsonNamesTypes: jsonNamesTypes, + row: row, pos: jpos, tableName: tableName) + } catch DatabaseHelperError.checkRowValidity(let message) { + throw DatabaseHelperError.createTableData(message: message) + } + // Create INSERT or UPDATE Statements + do { + let data: [String: Any] = ["pos": jpos, "mode": mode, "tableName": tableName] + let stmt: String = try createRowStatement(dbHelper: dbHelper, mDB: mDB, data: data, + row: row, jsonNamesTypes: jsonNamesTypes) + let rowValues = UtilsJson.getValuesFromRow(rowValues: row) + let lastId: Int = try dbHelper.prepareSQL(mDB: mDB, sql: stmt, values: rowValues) + success = lastId != -1 ? true : false + } catch DatabaseHelperError.createRowStatement(let message) { + throw DatabaseHelperError.createTableData(message: message) + } catch DatabaseHelperError.prepareSql(let message) { + throw DatabaseHelperError.createTableData(message: message) + } + } + return success + } + + // MARK: - ImportFromJson - createRowStatement + + class func createRowStatement(dbHelper: DatabaseHelper, mDB: OpaquePointer, data: [String: Any], + row: [UncertainValue], + jsonNamesTypes: JsonNamesTypes) throws -> String { + var stmt: String = "" + var retisIdExists: Bool = false + let message = "importFromJson: createTableData data is missing" + guard let pos = data["pos"] as? Int else { + throw DatabaseHelperError.createTableData(message: message) + } + guard let mode = data["mode"] as? String else { + throw DatabaseHelperError.createTableData(message: message) + } + guard let tableName = data["tableName"] as? String else { + throw DatabaseHelperError.createTableData(message: message) + } + do { + if let rwValue: Any = row[0].value { + retisIdExists = try UtilsJson.isIdExist(dbHelper: dbHelper, mDB: mDB, + tableName: tableName, + firstColumnName: jsonNamesTypes.names[0], key: rwValue) + } else { + let message: String = "importFromJson: Table \(tableName) " + + "values row[0]does not exist" + throw DatabaseHelperError.createTableData(message: message) + } + + } catch DatabaseHelperError.isIdExists(let message) { + throw DatabaseHelperError.createTableData(message: message) + } + if mode == "full" || (mode == "partial" && !retisIdExists) { + // Insert + let nameString: String = jsonNamesTypes.names.joined(separator: ",") + let questionMarkString: String = UtilsJson.createQuestionMarkString( + length: jsonNamesTypes.names.count) + stmt = "INSERT INTO \(tableName) (\(nameString)) VALUES (\(questionMarkString));" + } else { + // Update + let setString: String = UtilsJson.setNameForUpdate(names: jsonNamesTypes.names) + if setString.count == 0 { + let message: String = "importFromJson: Table \(tableName) values row " + + "\(pos) not set to String" + throw DatabaseHelperError.createTableData(message: message) + } + if let rwValue: Any = row[0].value { + stmt = "UPDATE \(tableName) SET \(setString) WHERE " + + "\(jsonNamesTypes.names[0]) = \(rwValue);" + } else { + let message: String = "importFromJson: Table \(tableName) " + + "values row[0]does not exist" + throw DatabaseHelperError.createTableData(message: message) + } + } + return stmt + } +} diff --git a/ios/Plugin/JsonSQLite.swift b/ios/Plugin/ImportExportJson/JsonSQLite.swift similarity index 66% rename from ios/Plugin/JsonSQLite.swift rename to ios/Plugin/ImportExportJson/JsonSQLite.swift index 3814b321..c6ed9938 100644 --- a/ios/Plugin/JsonSQLite.swift +++ b/ios/Plugin/ImportExportJson/JsonSQLite.swift @@ -24,7 +24,7 @@ public struct JsonSQLite: Codable { } } -struct JsonTable: Codable { +public struct JsonTable: Codable { let name: String var schema: [JsonColumn]? var indexes: [JsonIndex]? @@ -32,49 +32,53 @@ struct JsonTable: Codable { public func show() { print("name: \(name) ") - if (schema) != nil { - print("Number of schema: \(schema!.count) ") - for sch in schema! { + if let mSchema = schema { + print("Number of schema: \(mSchema.count) ") + for sch in mSchema { sch.show() } + } - if (indexes) != nil { - print("Number of indexes: \(indexes!.count) ") - for idx in indexes! { + if let mIndexes = indexes { + print("Number of indexes: \(mIndexes.count) ") + for idx in mIndexes { idx.show() } } - if (values) != nil { - print("Number of Values: \(values!.count) ") - for val in values! { + if let mValues = values { + print("Number of Values: \(mValues.count) ") + for val in mValues { var row = [] as [Any] - for v in val { - row.append(v.value!) + for vItem in val { + if let tvItem = vItem.value { + row.append(tvItem) + } else { + row.append("NULL") + } } print("row: \(row) ") } } - } } -struct JsonColumn: Codable { +public struct JsonColumn: Codable { var column: String? let value: String var foreignkey: String? public func show() { - if (column) != nil { - print("column: \(String(describing: column)) ") + if let mColumn = column { + print("column: \(mColumn) ") } - if (foreignkey) != nil { - print("column: \(String(describing: column)) ") + if let mForeignkey = foreignkey { + print("foreignkey: \(mForeignkey) ") } print("value: \(value) ") } } -struct JsonIndex: Codable { +public struct JsonIndex: Codable { let name: String let column: String @@ -102,7 +106,8 @@ public struct UncertainValue: Codable { } if tValue == nil && uValue == nil && vValue == nil { //Type mismatch - throw DecodingError.typeMismatch(type(of: self), DecodingError.Context(codingPath: [], debugDescription: "The value is not of type \(T.self) not of type \(U.self) not even \(V.self)")) + throw DecodingError.typeMismatch(type(of: self), DecodingError.Context(codingPath: [], + debugDescription: "The value is not of type \(T.self) not of type \(U.self) not even \(V.self)")) } } } diff --git a/ios/Plugin/Plugin.swift b/ios/Plugin/Plugin.swift index 31f78ed8..fc06898b 100644 --- a/ios/Plugin/Plugin.swift +++ b/ios/Plugin/Plugin.swift @@ -6,10 +6,15 @@ import SQLCipher * Please read the Capacitor iOS Plugin Development Guide * here: https://capacitor.ionicframework.com/docs/plugins/ios */ + @objc(CapacitorSQLite) +// swiftlint:disable file_length +// swiftlint:disable type_body_length + public class CapacitorSQLite: CAPPlugin { var mDb: DatabaseHelper? var globalData: GlobalSQLite = GlobalSQLite() + let retHandler: ReturnHandler = ReturnHandler() // MARK: - Echo @@ -23,18 +28,22 @@ public class CapacitorSQLite: CAPPlugin { // MARK: - Open @objc func open(_ call: CAPPluginCall) { - guard let dbName = call.options["database"] as? String else { - retResult(call: call, ret: false, message: "Must provide a database name") + let dbName: String = call.getString("database") ?? "" + if dbName.count == 0 { + retHandler.rResult(call: call, ret: false, message: "Open command failed: Must provide a database name") return } - let encrypted = call.options["encrypted"] as? Bool ?? false + let encrypted = call.getBool("encrypted") ?? false var inMode: String = "" var secretKey: String = "" var newsecretKey: String = "" if encrypted { - inMode = call.options["mode"] as? String ?? "no-encryption" - if inMode != "no-encryption" && inMode != "encryption" && inMode != "secret" && inMode != "newsecret" && inMode != "wrongsecret" { - retResult(call: call, ret: false, message: "Open command failed: Error inMode must be in ['encryption','secret','newsecret']") + inMode = call.getString("mode") ?? "no-encryption" + if inMode != "no-encryption" && inMode != "encryption" && inMode != "secret" + && inMode != "newsecret" && inMode != "wrongsecret" { + retHandler.rResult(call: call, ret: false, + message: "Open command failed: Error inMode must be in ['encryption','secret','newsecret']") + return } if inMode == "encryption" || inMode == "secret" { secretKey = globalData.secret @@ -55,115 +64,133 @@ public class CapacitorSQLite: CAPPlugin { inMode = "no-encryption" } do { - mDb = try DatabaseHelper(databaseName: "\(dbName)SQLite.db", encrypted: encrypted, mode: inMode, secret: secretKey, newsecret: newsecretKey) + mDb = try DatabaseHelper(databaseName: "\(dbName)SQLite.db", encrypted: encrypted, + mode: inMode, secret: secretKey, newsecret: newsecretKey) } catch let error { - retResult(call: call, ret: false, message: "Open command failed: \(error)") + retHandler.rResult(call: call, ret: false, message: "Open command failed: \(error)") } - if mDb != nil && !mDb!.isOpen { - retResult(call: call, ret: false, message: "Open command failed: Database \(dbName)SQLite.db not opened") + if mDb != nil && !(mDb?.isOpen ?? true) { + retHandler.rResult(call: call, ret: false, + message: "Open command failed: Database \(dbName)SQLite.db not opened") } else { - retResult(call: call, ret: true) + call.success([ "result": true ]) } } // MARK: - Close @objc func close(_ call: CAPPluginCall) { - guard let dbName = call.options["database"] as? String else { - retResult(call: call, ret: false, message: "Close command failed: Must provide a database name") + let dbName: String = call.getString("database") ?? "" + if dbName.count == 0 { + retHandler.rResult(call: call, ret: false, message: "Close command failed: Must provide a database name") return } if mDb != nil { do { - let res: Bool? = try (mDb?.close(databaseName: "\(dbName)SQLite.db")) - retResult(call: call, ret: res!) + let res: Bool = try (mDb?.close(databaseName: "\(dbName)SQLite.db")) ?? false + call.success([ "result": res ]) } catch DatabaseHelperError.dbConnection(let message) { - retResult(call: call, ret: false, message: "Close command failed: \(message)") + retHandler.rResult(call: call, ret: false, message: "Close command failed: \(message)") } catch DatabaseHelperError.close(let message) { - retResult(call: call, ret: false, message: "Close command failed: \(message)") + retHandler.rResult(call: call, ret: false, message: "Close command failed: \(message)") } catch let error { - retResult(call: call, ret: false, message: "Close command failed: \(error)") + retHandler.rResult(call: call, ret: false, message: "Close command failed: \(error)") } - } else { - retResult(call: call, ret: false, message: "Close command failed: No database connection") + retHandler.rResult(call: call, ret: false, message: "Close command failed: No database connection") } } // MARK: - Execute - @objc func execute(_ call: CAPPluginCall) { - guard let statements = call.options["statements"] as? String else { - retChanges(call: call, ret: ["changes": -1], message: "Execute command failed : Must provide raw SQL statements") + @objc func execute(_ call: CAPPluginCall) { + let statements: String = call.getString("statements") ?? "" + if statements.count == 0 { + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "Execute command failed : Must provide raw SQL statements") return } if mDb != nil { do { - let res: Int? = try (mDb?.execSQL(sql: statements)) - retChanges(call: call, ret: ["changes": res!]) + let res: Int = try (mDb?.execSQL(sql: statements)) ?? -1 + retHandler.rChanges(call: call, ret: ["changes": res]) } catch DatabaseHelperError.dbConnection(let message) { - retChanges(call: call, ret: ["changes": -1], message: "Execute command failed : \(message)") + retHandler.rChanges(call: call, ret: ["changes": -1], message: "Execute command failed : \(message)") + return } catch DatabaseHelperError.execSql(let message) { - retChanges(call: call, ret: ["changes": -1], message: "Execute command failed : \(message)") + retHandler.rChanges(call: call, ret: ["changes": -1], message: "Execute command failed : \(message)") + return } catch let error { - retChanges(call: call, ret: ["changes": -1], message: "Execute command failed : \(error)") + retHandler.rChanges(call: call, ret: ["changes": -1], message: "Execute command failed : \(error)") + return } } else { - retChanges(call: call, ret: ["changes": -1], message: "Execute command failed : No database connection") + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "Execute command failed : No database connection") } } // MARK: - ExecuteSet @objc func executeSet(_ call: CAPPluginCall) { - guard let set = call.options["set"] as? [Any] else { - retChanges(call: call, ret: ["changes": -1], message: "ExecuteSet command failed : Must provide a set of SQL statements") + let set: [[String: Any]] = call.getArray("set", ([String: Any]).self) ?? [] + if set.count == 0 { + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "ExecuteSet command failed : Must provide a set of SQL statements") return } if mDb != nil { if set.count == 0 { - retChanges(call: call, ret: ["changes": -1], message: "ExecuteSet command failed : Must provide a non-empty set of SQL statements") + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "ExecuteSet command failed : Must provide a non-empty set of SQL statements") } - for dict in set { - let row: NSMutableDictionary = dict as! NSMutableDictionary - let keys: [String] = row.allKeys as! [String] + for dict in set { +// let row: NSMutableDictionary = dict as! NSMutableDictionary +// let keys: [String] = row.allKeys as! [String] + let keys = dict.keys if !(keys.contains("statement")) || !(keys.contains("values")) { - retChanges(call: call, ret: ["changes": -1], message: "ExecuteSet command failed : Must provide a set as Array of {statement,values}") + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "ExecuteSet command failed : Must provide a set as Array of {statement,values}") } } do { - let res: Int? = try (mDb?.execSet(set: set)) - retChanges(call: call, ret: ["changes": res!]) + if let res: Int = try (mDb?.execSet(set: set)) { + retHandler.rChanges(call: call, ret: ["changes": res]) + } } catch DatabaseHelperError.dbConnection(let message) { - retChanges(call: call, ret: ["changes": -1], message: "Execute command failed : \(message)") + retHandler.rChanges(call: call, ret: ["changes": -1], message: "Execute command failed : \(message)") } catch DatabaseHelperError.execSql(let message) { - retChanges(call: call, ret: ["changes": -1], message: "Execute command failed : \(message)") + retHandler.rChanges(call: call, ret: ["changes": -1], message: "Execute command failed : \(message)") } catch let error { - retChanges(call: call, ret: ["changes": -1], message: "Execute command failed : \(error)") + retHandler.rChanges(call: call, ret: ["changes": -1], message: "Execute command failed : \(error)") } } else { - retChanges(call: call, ret: ["changes": -1], message: "ExecuteSet command failed : No database connection") + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "ExecuteSet command failed : No database connection") } } // MARK: - Run @objc func run(_ call: CAPPluginCall) { - guard let statement = call.options["statement"] as? String else { - retChanges(call: call, ret: ["changes": -1], message: "Run command failed : Must provide a SQL statement") + let statement: String = call.getString("statement") ?? "" + if statement.count == 0 { + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "Run command failed : Must provide a SQL statement") return } - guard let values = call.options["values"] as? [Any] else { - retChanges(call: call, ret: ["changes": -1], message: "Run command failed : Values should be an Array of values") + let values: [Any] = call.getArray("values", (Any).self) ?? [-9999999] + if values.count == 1 && values[0] as? Int == -9999999 { + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "Run command failed : Values should be an Array of values") return } if mDb != nil { do { - var res: [String: Int]? + var val: [Any] = [] if values.count > 0 { - var val: [Any] = [] for value in values { if let obj = value as? String { let str: String = "\(String(describing: obj))" @@ -173,197 +200,228 @@ public class CapacitorSQLite: CAPPlugin { } else if let obj = value as? Float { val.append(obj) } else { - retChanges(call: call, ret: ["changes": -1], message: "Run command failed : Not a SQL type") + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "Run command failed : Not a SQL type") } } - res = try (mDb?.runSQL(sql: statement, values: val)) - } else { - res = try (mDb?.runSQL(sql: statement, values: [])) } - retChanges(call: call, ret: res!) + if let res = try (mDb?.runSQL(sql: statement, values: val)) { + retHandler.rChanges(call: call, ret: res) + } } catch DatabaseHelperError.dbConnection(let message) { - retChanges(call: call, ret: ["changes": -1], message: "Run command failed : \(message)") + retHandler.rChanges(call: call, ret: ["changes": -1], message: "Run command failed : \(message)") } catch DatabaseHelperError.runSql(let message) { - retChanges(call: call, ret: ["changes": -1], message: "Run command failed : \(message)") + retHandler.rChanges(call: call, ret: ["changes": -1], message: "Run command failed : \(message)") } catch let error { - retChanges(call: call, ret: ["changes": -1], message: "Run command failed : \(error)") + retHandler.rChanges(call: call, ret: ["changes": -1], message: "Run command failed : \(error)") } - } else { - retChanges(call: call, ret: ["changes": -1], message: "Run command failed : No database connection") + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "Run command failed : No database connection") } } // MARK: - Query @objc func query(_ call: CAPPluginCall) { - guard let statement = call.options["statement"] as? String else { - retValues(call: call, ret: [], message: "Query command failed : Must provide a query statement") + let statement: String = call.getString("statement") ?? "" + if statement.count == 0 { + retHandler.rValues(call: call, ret: [], message: "Query command failed : Must provide a query statement") return } - guard let values = call.options["values"] as? [String] else { - retValues(call: call, ret: [], message: "Query command failed : Values should be an Array of string") + let values: [String] = call.getArray("values", (String).self) ?? ["NULL"] + if values.count == 1 && values[0] == "NULL" { + retHandler.rValues(call: call, ret: [], + message: "Query command failed : Values should be an Array of string") return } if mDb != nil { - let res: [[String: Any]] +// let res: [[String: Any]] do { - if values.count > 0 { +/* if values.count > 0 { res = try (mDb?.selectSQL(sql: statement, values: values))! } else { res = try (mDb?.selectSQL(sql: statement, values: []))! } - retValues(call: call, ret: res) + */ + if let res: [[String: Any]] = try (mDb?.selectSQL(sql: statement, values: values)) { + retHandler.rValues(call: call, ret: res) + } else { + retHandler.rValues(call: call, ret: [], message: "Query command failed : Error in selectSQL") + } } catch DatabaseHelperError.dbConnection(let message) { - retValues(call: call, ret: [], message: "Query command failed : \(message)") + retHandler.rValues(call: call, ret: [], message: "Query command failed : \(message)") } catch DatabaseHelperError.selectSql(let message) { - retValues(call: call, ret: [], message: "Query command failed : \(message)") + retHandler.rValues(call: call, ret: [], message: "Query command failed : \(message)") } catch let error { - retValues(call: call, ret: [], message: "Query command failed : \(error)") + retHandler.rValues(call: call, ret: [], message: "Query command failed : \(error)") } - } else { - retValues(call: call, ret: [], message: "Query command failed : No database connection") + retHandler.rValues(call: call, ret: [], message: "Query command failed : No database connection") } } // MARK: - isDBExists @objc func isDBExists(_ call: CAPPluginCall) { - guard let dbName = call.options["database"] as? String else { - retResult(call: call, ret: false, message: "idDBExists command failed: Must provide a database name") + let dbName: String = call.getString("database") ?? "" + if dbName.count == 0 { + retHandler.rResult(call: call, ret: false, + message: "idDBExists command failed: Must provide a database name") return } do { let filePath: String = try UtilsSQLite.getFilePath(fileName: "\(dbName)SQLite.db") let res: Bool = UtilsSQLite.isFileExist(filePath: filePath) if res { - retResult(call: call, ret: true) + retHandler.rResult(call: call, ret: true) } else { - retResult(call: call, ret: false, message: "Database \(dbName)SQLite.db does not exist") + retHandler.rResult(call: call, ret: false, message: "Database \(dbName)SQLite.db does not exist") } } catch UtilsSQLiteError.filePathFailed { - retResult(call: call, ret: false, message: "isDBExists command failed : file path failed") + retHandler.rResult(call: call, ret: false, message: "isDBExists command failed : file path failed") } catch let error { - retResult(call: call, ret: false, message: "isDBExists command failed : \(error)") + retHandler.rResult(call: call, ret: false, message: "isDBExists command failed : \(error)") } } // MARK: - DeleteDatabase @objc func deleteDatabase(_ call: CAPPluginCall) { - guard let dbName = call.options["database"] as? String else { - retResult(call: call, ret: false, message: "DeleteDatabase command failed: Must provide a database name") + let dbName: String = call.getString("database") ?? "" + if dbName.count == 0 { + retHandler.rResult(call: call, ret: false, + message: "DeleteDatabase command failed: Must provide a database name") return } - var res: Bool = false if mDb != nil { do { - res = try (mDb?.deleteDB(databaseName: "\(dbName)SQLite.db"))! - if res { - retResult(call: call, ret: true) + if let res: Bool = try (mDb?.deleteDB(databaseName: "\(dbName)SQLite.db")) { + retHandler.rResult(call: call, ret: res) } else { - retResult(call: call, ret: false, message: "DeleteDatabase command failed: Database \(dbName)SQLite.db does not exist") + retHandler.rResult(call: call, ret: false, + message: "DeleteDatabase command failed: Database \(dbName)SQLite.db does not exist") } } catch DatabaseHelperError.deleteDB(let message) { - retResult(call: call, ret: false, message: "DeleteDatabase command failed: \(message)") + retHandler.rResult(call: call, ret: false, message: "DeleteDatabase command failed: \(message)") } catch let error { - retResult(call: call, ret: false, message: "DeleteDatabase command failed: \(error)") + retHandler.rResult(call: call, ret: false, message: "DeleteDatabase command failed: \(error)") } } else { - retResult(call: call, ret: false, message: "DeleteDatabase command failed: The database is not opened") + retHandler.rResult(call: call, ret: false, + message: "DeleteDatabase command failed: The database is not opened") } } // MARK: - IsJsonValid @objc func isJsonValid(_ call: CAPPluginCall) { - guard let parsingData = call.options["jsonstring"] as? String else { - retResult(call: call, ret: false, message: "IsJsonValid command failed : Must provide a Stringify Json Object") + let parsingData: String = call.getString("jsonstring") ?? "" + if parsingData.count == 0 { + retHandler.rResult(call: call, ret: false, + message: "IsJsonValid command failed : Must provide a Stringify Json Object") return } - - let data = ("["+parsingData+"]").data(using: .utf8)! - - do { - _ = try JSONDecoder().decode([JsonSQLite].self, from: data) - retResult(call: call, ret: true) - } catch let error { - retResult(call: call, ret: false, message: "IsJsonValid command failed : Stringify Json Object not Valid " + error.localizedDescription) + if let data = ("["+parsingData+"]").data(using: .utf8) { + do { + _ = try JSONDecoder().decode([JsonSQLite].self, from: data) + retHandler.rResult(call: call, ret: true) + } catch let error { + retHandler.rResult(call: call, ret: false, + message: "IsJsonValid command failed : Stringify Json Object not Valid " + error.localizedDescription) + } + } else { + retHandler.rResult(call: call, ret: false, + message: "IsJsonValid command failed : Stringify Json Object not Valid ") } } // MARK: - ImportFromJson - +// swiftlint:disable function_body_length @objc func importFromJson(_ call: CAPPluginCall) { - guard let parsingData = call.options["jsonstring"] as? String else { - retChanges(call: call, ret: ["changes": -1], message: "ImportFromJson command failed : Must provide a Stringify Json Object") + let parsingData: String = call.getString("jsonstring") ?? "" + if parsingData.count == 0 { + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "ImportFromJson command failed : Must provide a Stringify Json Object") return } - - let data = ("["+parsingData+"]").data(using: .utf8)! - - do { - let jsonSQLite = try JSONDecoder().decode([JsonSQLite].self, from: data) -// jsonSQLite[0].show() - let dbName: String = jsonSQLite[0].database + "SQLite.db" - let encrypted: Bool = jsonSQLite[0].encrypted - var secret: String = "" - var inMode: String = "no-encryption" - if encrypted { - inMode = "secret" - secret = globalData.secret - } + if let data = ("["+parsingData+"]").data(using: .utf8) { do { - mDb = try DatabaseHelper(databaseName: dbName, encrypted: encrypted, mode: inMode, secret: secret, newsecret: "") - } catch let error { - retChanges(call: call, ret: ["changes": -1], message: "ImportFromJson command failed : " + error.localizedDescription) - } - if !mDb!.isOpen { - retChanges(call: call, ret: ["changes": -1], message: "ImportFromJson command failed : Database \(dbName)SQLite.db not opened") - } else { + let jsonSQLite = try JSONDecoder().decode([JsonSQLite].self, from: data) + let secret: String = jsonSQLite[0].encrypted ? globalData.secret : "" + let inMode: String = jsonSQLite[0].encrypted ? "secret" : "no-encryption" do { - let res: [String: Int] = try (mDb?.importFromJson(jsonSQLite: jsonSQLite[0]))! - if res["changes"] == -1 { - retChanges(call: call, ret: ["changes": -1], message: "ImportFromJson command failed : import JsonObject not successful") - } else { - retChanges(call: call, ret: res) + mDb = try DatabaseHelper(databaseName: jsonSQLite[0].database + "SQLite.db", + encrypted: jsonSQLite[0].encrypted, mode: inMode, secret: secret, + newsecret: "") + } catch let error { + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "ImportFromJson command failed : " + error.localizedDescription) + } + if mDb != nil && !(mDb?.isOpen ?? true) { + let message: String = "ImportFromJson command failed : Database " + + "\(jsonSQLite[0].database)SQLite.db not opened" + retHandler.rChanges(call: call, ret: ["changes": -1], message: message) + } else { + do { + if let res: [String: Int] = try (mDb?.importFromJson(jsonSQLite: jsonSQLite[0])) { + if res["changes"] == -1 { + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "ImportFromJson command failed : import JsonObject not successful") + } else { + retHandler.rChanges(call: call, ret: res) + } + } + } catch DatabaseHelperError.importFromJson(let message) { + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "ImportFromJson command failed : \(message)") + } catch DatabaseHelperError.tableNotExists(let message) { + retHandler.rChanges(call: call, ret: ["changes": -1], message: message) } - } catch DatabaseHelperError.importFromJson(let message) { - retChanges(call: call, ret: ["changes": -1], message: "ImportFromJson command failed : \(message)") - } catch DatabaseHelperError.tableNotExists(let message) { - retChanges(call: call, ret: ["changes": -1], message: message) } + } catch let error { + let message: String = "ImportFromJson command failed : Stringify Json Object not Valid " + + error.localizedDescription + retHandler.rChanges(call: call, ret: ["changes": -1], message: message) } - } catch let error { - retChanges(call: call, ret: ["changes": -1], message: "ImportFromJson command failed : Stringify Json Object not Valid " + error.localizedDescription) + } else { + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "ImportFromJson command failed : Stringify Json Object not Valid ") } } +// swiftlint:enable function_body_length // MARK: - ExportToJson @objc func exportToJson(_ call: CAPPluginCall) { - guard let expMode = call.options["jsonexportmode"] as? String else { - retJsonSQLite(call: call, ret: [:], message: "ExportToJson command failed : Must provide an export mode") + let expMode: String = call.getString("jsonexportmode") ?? "" + if expMode.count == 0 { + retHandler.rJsonSQLite(call: call, ret: [:], + message: "ExportToJson command failed : Must provide an export mode") return } if expMode != "full" && expMode != "partial" { - retJsonSQLite(call: call, ret: [:], message: "ExportToJson command failed : Json export mode should be 'full' or 'partial'") + retHandler.rJsonSQLite(call: call, ret: [:], + message: "ExportToJson command failed : Json export mode should be 'full' or 'partial'") return } if mDb != nil { - let res: [String: Any] do { - res = try (mDb?.exportToJson(expMode: expMode))! - if res.count == 4 { - retJsonSQLite(call: call, ret: res) + if let res: [String: Any] = try (mDb?.exportToJson(expMode: expMode)) { + if res.count == 4 { + retHandler.rJsonSQLite(call: call, ret: res) + } else { + retHandler.rJsonSQLite(call: call, ret: [:], + message: "ExportToJson command failed :return Obj is not a JsonSQLite Obj") + } } else { - retJsonSQLite(call: call, ret: [:], message: "ExportToJson command failed :return Obj is not a JsonSQLite Obj") + retHandler.rJsonSQLite(call: call, ret: [:], message: "ExportToJson command failed ") } } catch let error { - retJsonSQLite(call: call, ret: [:], message: "ExportToJson command failed : \(error)") + retHandler.rJsonSQLite(call: call, ret: [:], message: "ExportToJson command failed : \(error)") } } else { - retJsonSQLite(call: call, ret: [:], message: "ExportToJson command failed: No database connection ") + retHandler.rJsonSQLite(call: call, ret: [:], + message: "ExportToJson command failed: No database connection ") } } @@ -372,108 +430,57 @@ public class CapacitorSQLite: CAPPlugin { @objc func createSyncTable(_ call: CAPPluginCall) { if mDb != nil { do { - let res: Int = try (mDb?.createSyncTable())! - if res == -1 { - retChanges(call: call, ret: ["changes": -1], message: "createSyncTable command failed") + if let res: Int = try (mDb?.createSyncTable()) { + if res == -1 { + retHandler.rChanges(call: call, ret: ["changes": -1], message: "createSyncTable command failed") + } else { + retHandler.rChanges(call: call, ret: ["changes": res]) + } } else { - retChanges(call: call, ret: ["changes": res]) + retHandler.rChanges(call: call, ret: ["changes": -1], message: "createSyncTable command failed") } } catch DatabaseHelperError.createSyncTable(let message) { - retChanges(call: call, ret: ["changes": -1], message: "createSyncTable command failed : \(message)") + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "createSyncTable command failed : \(message)") } catch let error { - retChanges(call: call, ret: ["changes": -1], message: "createSyncTable command failed: \(error)") + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "createSyncTable command failed: \(error)") } - } else { - retChanges(call: call, ret: ["changes": -1], message: "createSyncTable command failed: No database connection ") + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "createSyncTable command failed: No database connection ") } } // MARK: - SetSyncDate @objc func setSyncDate(_ call: CAPPluginCall) { - guard let syncDate = call.options["syncdate"] as? String else { - retResult(call: call, ret: false, message: "setSyncDate command failed: Must provide a sync date") + let syncDate: String = call.getString("syncdate") ?? "" + if syncDate.count == 0 { + retHandler.rResult(call: call, ret: false, message: "setSyncDate command failed: Must provide a sync date") return } if mDb != nil { do { - let res: Bool = try (mDb?.setSyncDate(syncDate: syncDate))! - if res { - retResult(call: call, ret: true) + if let res: Bool = try (mDb?.setSyncDate(syncDate: syncDate)) { + if res { + retHandler.rResult(call: call, ret: true) + } else { + retHandler.rResult(call: call, ret: false, message: "setSyncDate command failed") + } } else { - retResult(call: call, ret: false, message: "setSyncDate command failed") + retHandler.rResult(call: call, ret: false, message: "setSyncDate command failed") } - } catch DatabaseHelperError.createSyncDate(let message) { - retResult(call: call, ret: false, message: "setSyncDate command failed: \(message)") + retHandler.rResult(call: call, ret: false, message: "setSyncDate command failed: \(message)") } catch let error { - retResult(call: call, ret: false, message: "setSyncDate command failed: \(error)") + retHandler.rResult(call: call, ret: false, message: "setSyncDate command failed: \(error)") } - - } else { - retChanges(call: call, ret: ["changes": -1], message: "setSyncDate command failed: No database connection ") - } - - } - // MARK: - RetResult - - func retResult(call: CAPPluginCall, ret: Bool, message: String? = nil) { - if message != nil { - call.success([ - "result": ret, - "message": message! - ]) } else { - call.success([ - "result": ret - ]) + retHandler.rChanges(call: call, ret: ["changes": -1], + message: "setSyncDate command failed: No database connection ") } } - - // MARK: - RetChanges - - func retChanges(call: CAPPluginCall, ret: [String: Int], message: String? = nil) { - if message != nil { - call.success([ - "changes": ret, - "message": message! - ]) - } else { - call.success([ - "changes": ret - ]) - } - } - - // MARK: - RetValues - - func retValues(call: CAPPluginCall, ret: [[String: Any]], message: String? = nil) { - if message != nil { - call.success([ - "values": ret, - "message": message! - ]) - } else { - call.success([ - "values": ret - ]) - } - } - - // MARK: - RetJsonSQLite - - func retJsonSQLite(call: CAPPluginCall, ret: [String: Any], message: String? = nil) { - if message != nil { - call.success([ - "export": ret, - "message": message! - ]) - } else { - call.success([ - "export": ret - ]) - } - } - } +// swiftlint:enable type_body_length +// swiftlint:enable file_length diff --git a/ios/Plugin/ReturnHandler.swift b/ios/Plugin/ReturnHandler.swift new file mode 100644 index 00000000..5f12189e --- /dev/null +++ b/ios/Plugin/ReturnHandler.swift @@ -0,0 +1,72 @@ +// +// ReturnHandler.swift +// Plugin +// +// Created by Quéau Jean Pierre on 28/07/2020. +// Copyright © 2020 Max Lynch. All rights reserved. +// + +import Foundation +import Capacitor + +class ReturnHandler { + // MARK: - rResult + + func rResult(call: CAPPluginCall, ret: Bool, message: String? = nil) { + if let intMessage = message { + call.success([ + "result": ret, + "message": intMessage + ]) + } else { + call.success([ + "result": ret + ]) + } + } + + // MARK: - rChanges + + func rChanges(call: CAPPluginCall, ret: [String: Int], message: String? = nil) { + if let intMessage = message { + call.success([ + "changes": ret, + "message": intMessage + ]) + } else { + call.success([ + "changes": ret + ]) + } + } + + // MARK: - rValues + + func rValues(call: CAPPluginCall, ret: [[String: Any]], message: String? = nil) { + if let intMessage = message { + call.success([ + "values": ret, + "message": intMessage + ]) + } else { + call.success([ + "values": ret + ]) + } + } + + // MARK: - rJsonSQLite + + func rJsonSQLite(call: CAPPluginCall, ret: [String: Any], message: String? = nil) { + if let intMessage = message { + call.success([ + "export": ret, + "message": intMessage + ]) + } else { + call.success([ + "export": ret + ]) + } + } +} diff --git a/ios/Plugin/Utils/UtilsBinding.swift b/ios/Plugin/Utils/UtilsBinding.swift new file mode 100644 index 00000000..3c707c0e --- /dev/null +++ b/ios/Plugin/Utils/UtilsBinding.swift @@ -0,0 +1,61 @@ +// +// UtlisBinding.swift +// CapacitorCommunitySqlite +// +// Created by Quéau Jean Pierre on 31/07/2020. +// + +import Foundation +import SQLCipher + +class UtilsBinding { + class func bindValues( handle: OpaquePointer?, values: [String]) -> String { + var message: String = "" + var idx: Int = 1 + for value in values { + do { + if let selStmt = handle { + try UtilsBinding.bind(handle: selStmt, value: value, idx: idx) + idx += 1 + } else { + message = "Error: querySQL bind failed " + } + } catch let error as NSError { + message = "Error: querySQL bind failed " + error.localizedDescription + break + } + } + return message + } + class func bind( handle: OpaquePointer?, value: Any?, idx: Int) throws { + + if value == nil { + sqlite3_bind_null(handle, Int32(idx)) + } else if let value = value as? Double { + sqlite3_bind_double(handle, Int32(idx), value) + } else if let value = value as? Int64 { + sqlite3_bind_int64(handle, Int32(idx), value) + } else if let value = value as? String { + if value.contains("base64") { + // case Base64 string as Blob +// sqlite3_bind_blob(handle, Int32(idx), [value], Int32(value.count), SQLITETRANSIENT) + sqlite3_bind_text(handle, Int32(idx), value, -1, SQLITETRANSIENT) + + } else if value.uppercased() == "NULL" { + // case NULL + sqlite3_bind_null(handle, Int32(idx)) + } else { + sqlite3_bind_text(handle, Int32(idx), value, -1, SQLITETRANSIENT) + } + } else if let value = value as? Int { + sqlite3_bind_int64(handle, Int32(idx), Int64(value)) + } else if let value = value as? Bool { + var bInt: Int32 = Int32(0) + if value {bInt = Int32(1)} + sqlite3_bind_int(handle, Int32(idx), Int32(bInt)) + } else { + throw UtilsSQLiteError.bindFailed + } + + } +} diff --git a/ios/Plugin/Utils/UtilsJson.swift b/ios/Plugin/Utils/UtilsJson.swift new file mode 100644 index 00000000..52f4963b --- /dev/null +++ b/ios/Plugin/Utils/UtilsJson.swift @@ -0,0 +1,212 @@ +// +// UtilsJson.swift +// CapacitorCommunitySqlite +// +// Created by Quéau Jean Pierre on 30/07/2020. +// + +import Foundation +class UtilsJson { + + // MARK: - ImportFromJson - IsTableExists + + class func isTableExists(dbHelper: DatabaseHelper, mDB: OpaquePointer, tableName: String) throws -> Bool { + var ret: Bool = false + var query = "SELECT name FROM sqlite_master WHERE type='table' AND name='" + query.append(tableName) + query.append("';") + do { + let resQuery: [Any] = try dbHelper.querySQL(mDB: mDB, sql: query, values: []) + if resQuery.count > 0 {ret = true} + } catch DatabaseHelperError.querySql(let message) { + throw DatabaseHelperError.tableNotExists(message: message) + } + return ret + } + + // MARK: - ImportFromJson - GetTableColumnNamesTypes + + class func getTableColumnNamesTypes(dbHelper: DatabaseHelper, mDB: OpaquePointer, + tableName: String) throws -> JsonNamesTypes { + + var ret: JsonNamesTypes = JsonNamesTypes(names: [], types: []) + var query: String = "PRAGMA table_info(" + query.append(tableName) + query.append(");") + do { + let resQuery = try dbHelper.querySQL(mDB: mDB, sql: query, values: []) + if resQuery.count > 0 { + var names: [String] = [] + var types: [String] = [] + for ipos in 0..]) -> Bool { + var isRetType: Bool = true + for ipos in 0..) -> Bool { + var ret: Bool = false + // swiftlint:disable force_unwrapping + if stype == "NULL" && type(of: avalue.tValue!) == String.self { ret = true } + if stype == "TEXT" && type(of: avalue.tValue!) == String.self { ret = true } + if stype == "INTEGER" && type(of: avalue.uValue!) == Int.self {ret = true } + if stype == "REAL" && type(of: avalue.vValue!) == Float.self { ret = true } + if stype == "BLOB" && type(of: avalue.tValue!) == String.self { ret = true } + // swiftlint:enable force_unwrapping + return ret + } + + // MARK: - ImportFromJson - IsIdExist + + class func isIdExist(dbHelper: DatabaseHelper, mDB: OpaquePointer, tableName: String, + firstColumnName: String, key: Any) throws -> Bool { + var ret: Bool = false + var query: String = "SELECT \(firstColumnName) FROM \(tableName) WHERE \(firstColumnName) = " + if type(of: key) == String.self { + query.append("'\(key)';") + } else { + query.append("\(key);") + } + do { + let resQuery = try dbHelper.querySQL(mDB: mDB, sql: query, values: []) + if resQuery.count == 1 { + ret = true + } + } catch DatabaseHelperError.querySql(let message) { + throw DatabaseHelperError.isIdExists(message: "isIdExists: \(message)") + } + return ret + } + + // MARK: - ImportFromJson - CreateQuestionMarkString + + class func createQuestionMarkString(length: Int) -> String { + var retString: String = "" + for _ in 0..]) -> [Any] { + var retArray: [Any] = [] + // swiftlint:disable force_unwrapping + for ipos in 0.. String { + var retString: String = "" + for ipos in 0..], pos: Int, tableName: String) throws { + if jsonNamesTypes.names.count != row.count { + let message: String = """ + importFromJson: Table \(tableName) values row \(pos + ) not correct length + """ + throw DatabaseHelperError.checkRowValidity(message: message) + } + // Check the column's type before proceeding + let retTypes: Bool = UtilsJson.checkColumnTypes(dbHelper: dbHelper, + types: jsonNamesTypes.types, values: row) + if !retTypes { + let message: String = "importFromJson: Table \(tableName) " + + "values row \(pos) not correct types" + throw DatabaseHelperError.importFromJson(message: message) + } + } + + // MARK: - ExportToJson - validateSchema + + class func validateSchema(schema: [[String: String]]) throws -> Bool { + var isSchema = false + do { + let eSchema = try JSONEncoder().encode(schema) + guard let eSchemaString: String = String(data: eSchema, encoding: .utf8) else { + let message: String = "Error in converting eSchema to String" + throw DatabaseHelperError.validateSchema(message: message) + } + if eSchemaString.count > 0 { + isSchema = true + } + } catch { + throw DatabaseHelperError.validateSchema(message: "Error in encoding schema") + } + + return isSchema + } + + // MARK: - ExportToJson - validateIndexes + + class func validateIndexes(indexes: [[String: String]]) throws -> Bool { + var isIndexes = false + do { + let eIndexes = try JSONEncoder().encode(indexes) + guard let eIndexesString: String = String(data: eIndexes, encoding: .utf8) else { + let message: String = "Error in converting eIndexes to String" + throw DatabaseHelperError.validateIndexes(message: message) + } + if eIndexesString.count > 0 { + isIndexes = true + } + } catch { + throw DatabaseHelperError.validateIndexes(message: "Error in encoding indexes") + } + return isIndexes + } +} diff --git a/ios/Plugin/Utils/UtilsSQLite.swift b/ios/Plugin/Utils/UtilsSQLite.swift index 9ccdb3dd..32965bc1 100644 --- a/ios/Plugin/Utils/UtilsSQLite.swift +++ b/ios/Plugin/Utils/UtilsSQLite.swift @@ -20,19 +20,124 @@ enum UtilsSQLiteError: Error { case renameFileFailed } -let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) - +let SQLITETRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) +// swiftlint:disable file_length +// swiftlint:disable type_body_length class UtilsSQLite { - class func connection(filename: String, readonly: Bool = false, key: String = "") throws -> OpaquePointer { + // swiftlint:disable function_parameter_count + class func createConnection(dbHelper: DatabaseHelper, path: String, mode: String, + encrypted: Bool, secret: String, newsecret: String) -> String { + var message: String = "" + if !encrypted && mode == "no-encryption" { + message = UtilsSQLite.createConnectionNoEncryption(dbHelper: dbHelper, path: path) + } else if encrypted && mode == "secret" && secret.count > 0 { + message = UtilsSQLite.createConnectionEncryptedWithSecret(dbHelper: dbHelper, + path: path, secret: secret, + newsecret: newsecret) + } else if encrypted && mode == "newsecret" && secret.count > 0 && newsecret.count > 0 { + message = UtilsSQLite.createConnectionEncryptedWithNewSecret(dbHelper: dbHelper, + path: path, secret: secret, + newsecret: newsecret) + } else if encrypted && mode == "encryption" && secret.count > 0 { + message = UtilsSQLite.makeEncryption(dbHelper: dbHelper, path: path, + secret: secret) + } + return message + } + // swiftlint:enable function_parameter_count + class func createConnectionNoEncryption(dbHelper: DatabaseHelper, path: String) -> String { + var message: String = "" + var mDB: OpaquePointer? + do { + try mDB = UtilsSQLite.connection(filename: path) + } catch { + message = "init: Error Database connection failed" + } + dbHelper.closeDB(mDB: mDB, method: "init") + return message + } + class func createConnectionEncryptedWithSecret(dbHelper: DatabaseHelper, path: String, + secret: String, newsecret: String) -> String { + var message: String = "" + var mDB: OpaquePointer? + do { + try mDB = UtilsSQLite.connection(filename: path, + readonly: false, key: secret) + } catch { + // for testing purpose + if secret == "wrongsecret" { + message = "init: Error Database connection failed wrong secret" + } else { + // test if you can open it with the new secret in case of multiple runs + do { + try mDB = UtilsSQLite.connection(filename: path, + readonly: false, key: newsecret) + message = "swap newsecret" + } catch { + message = "init: Error Database connection failed wrong secret" + } + } + } + dbHelper.closeDB(mDB: mDB, method: "init") + return message + } + class func createConnectionEncryptedWithNewSecret(dbHelper: DatabaseHelper, path: String, + secret: String, newsecret: String) -> String { + var message: String = "" + var mDB: OpaquePointer? + do { + try mDB = UtilsSQLite.connection(filename: path, + readonly: false, key: secret) + let keyStatementString = """ + PRAGMA rekey = '\(newsecret)'; + """ + let returnCode: Int32 = sqlite3_exec(mDB, keyStatementString, nil, nil, nil) + if returnCode != SQLITE_OK { + message = "connection: Unable to open a connection to database at \(path))" + } + /* this should work but does not sqlite3_rekey_v2 is not known + if sqlite3_rekey_v2(db!, "\(path)/\(self.dbName)", newsecret, Int32(newsecret.count)) == SQLITE_OK { + self.isOpen = true + } else { + print("Unable to open a connection to database at \(path)/\(self.dbName)") + throw StorageDatabaseHelperError.wrongNewSecret + } + */ + message = "swap newsecret" + } catch { + message = "init: Error Database connection failed wrong secret" + } + dbHelper.closeDB(mDB: mDB, method: "init") + return message + } + class func makeEncryption(dbHelper: DatabaseHelper, path: String, secret: String) -> String { + var message: String = "" + var res: Bool = false + do { + try res = UtilsSQLite.encryptDatabase(dbHelper: dbHelper, filePath: path, secret: secret) + if res { + message = "encryption" + } + } catch UtilsSQLiteError.encryptionFailed { + message = "init: Error Database Encryption failed" + } catch UtilsSQLiteError.filePathFailed { + message = "init: Error Database file not found" + } catch let error { + message = "init: Encryption \(error)" + } + return message + } + class func connection(filename: String, readonly: Bool = false, key: String = "") throws -> OpaquePointer? { let flags = readonly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE - var db: OpaquePointer? - if sqlite3_open_v2(filename, &db, flags | SQLITE_OPEN_FULLMUTEX, nil) == SQLITE_OK { + var mDB: OpaquePointer? + if sqlite3_open_v2(filename, &mDB, flags | SQLITE_OPEN_FULLMUTEX, nil) == SQLITE_OK { if key.count > 0 { let keyStatementString = """ PRAGMA key = '\(key)'; """ - if sqlite3_exec(db, keyStatementString, nil, nil, nil) == SQLITE_OK { - if sqlite3_exec(db!, "SELECT count(*) FROM sqlite_master;", nil, nil, nil) != SQLITE_OK { + if sqlite3_exec(mDB, keyStatementString, nil, nil, nil) == SQLITE_OK { + let stmt: String = "SELECT count(*) FROM sqlite_master;" + if sqlite3_exec(mDB, stmt, nil, nil, nil) != SQLITE_OK { throw UtilsSQLiteError.wrongSecret } } else { @@ -40,95 +145,62 @@ class UtilsSQLite { } } /* this should work but doe not sqlite3_key_v2 is not known - if key.count > 0 { - let nKey:Int32 = Int32(key.count) - if sqlite3_key_v2(db!, filename, key, nKey) == SQLITE_OK { - if (sqlite3_exec(db!, "SELECT count(*) FROM sqlite_master;", nil, nil, nil) != SQLITE_OK) { - print("Unable to open a connection to database at \(filename)") - throw StorageDatabaseHelperError.wrongSecret - } - } else { - print("Unable to open a connection to database at \(filename)") - throw StorageDatabaseHelperError.wrongSecret - } - } - print("Successfully opened connection to database at \(filename)") - */ + if key.count > 0 { + let nKey:Int32 = Int32(key.count) + if sqlite3_key_v2(db!, filename, key, nKey) == SQLITE_OK { + if (sqlite3_exec(db!, "SELECT count(*) FROM sqlite_master;", nil, nil, nil) != SQLITE_OK) { + print("Unable to open a connection to database at \(filename)") + throw StorageDatabaseHelperError.wrongSecret + } + } else { + print("Unable to open a connection to database at \(filename)") + throw StorageDatabaseHelperError.wrongSecret + } + } + print("Successfully opened connection to database at \(filename)") + */ // PRAGMA foreign_keys = ON; let sqltr: String = "PRAGMA foreign_keys = ON;" - if sqlite3_exec(db, sqltr, nil, nil, nil) != SQLITE_OK { + if sqlite3_exec(mDB, sqltr, nil, nil, nil) != SQLITE_OK { throw UtilsSQLiteError.connectionFailed } - - return db! + return mDB } else { throw UtilsSQLiteError.connectionFailed } } - class func getWritableDatabase(filename: String, secret: String) throws -> OpaquePointer? { - guard let db = try? connection(filename: filename, readonly: false, key: secret) else { + guard let mDB = try? connection(filename: filename, readonly: false, key: secret) else { throw UtilsSQLiteError.connectionFailed } - return db + return mDB } class func getReadableDatabase(filename: String, secret: String) throws -> OpaquePointer? { - guard let db = try? connection(filename: filename, readonly: true, key: secret) else { + guard let mDB = try? connection(filename: filename, readonly: true, key: secret) else { throw UtilsSQLiteError.connectionFailed } - return db - } - class func bind( handle: OpaquePointer, value: Any?, idx: Int) throws { - - if value == nil { - sqlite3_bind_null(handle, Int32(idx)) - } else if let value = value as? Double { - sqlite3_bind_double(handle, Int32(idx), value) - } else if let value = value as? Int64 { - sqlite3_bind_int64(handle, Int32(idx), value) - } else if let value = value as? String { - if value.contains("base64") { - // case Base64 string as Blob -// sqlite3_bind_blob(handle, Int32(idx), [value], Int32(value.count), SQLITE_TRANSIENT) - sqlite3_bind_text(handle, Int32(idx), value, -1, SQLITE_TRANSIENT) - - } else if value.uppercased() == "NULL" { - // case NULL - sqlite3_bind_null(handle, Int32(idx)) - } else { - sqlite3_bind_text(handle, Int32(idx), value, -1, SQLITE_TRANSIENT) - } - } else if let value = value as? Int { - sqlite3_bind_int64(handle, Int32(idx), Int64(value)) - } else if let value = value as? Bool { - var bInt: Int32 = Int32(0) - if value {bInt = Int32(1)} - sqlite3_bind_int(handle, Int32(idx), Int32(bInt)) - } else { - throw UtilsSQLiteError.bindFailed - } - + return mDB } - class func getColumnType(index: Int32, stmt: OpaquePointer) -> Int32 { + class func getColumnType(index: Int32, stmt: OpaquePointer?) -> Int32 { var type: Int32 = 0 - // Column types - http://www.sqlite.org/datatype3.html (section 2.2 table column 1) let blobTypes = ["BINARY", "BLOB", "VARBINARY"] - let textTypes = ["CHAR", "CHARACTER", "CLOB", "NATIONAL VARYING CHARACTER", "NATIVE CHARACTER", "NCHAR", "NVARCHAR", "TEXT", "VARCHAR", "VARIANT", "VARYING CHARACTER"] + var textTypes: [String] = ["CHAR", "CHARACTER", "CLOB", "NATIONAL VARYING CHARACTER", "NATIVE CHARACTER"] + let textTypes1: [String] = ["NCHAR", "NVARCHAR", "TEXT", "VARCHAR", "VARIANT", "VARYING CHARACTER"] + textTypes.append(contentsOf: textTypes1) let dateTypes = ["DATE", "DATETIME", "TIME", "TIMESTAMP"] - let intTypes = ["BIGINT", "BIT", "BOOL", "BOOLEAN", "INT", "INT2", "INT8", "INTEGER", "MEDIUMINT", "SMALLINT", "TINYINT"] + var intTypes = ["BIGINT", "BIT", "BOOL", "BOOLEAN", "INT", "INT2", "INT8", "INTEGER", "MEDIUMINT"] + let intTypes1: [String] = ["SMALLINT", "TINYINT"] + intTypes.append(contentsOf: intTypes1) let nullTypes = ["NULL"] let realTypes = ["DECIMAL", "DOUBLE", "DOUBLE PRECISION", "FLOAT", "NUMERIC", "REAL"] - // Determine type of column - http://www.sqlite.org/c3ref/c_blob.html let declaredType = sqlite3_column_decltype(stmt, index) - if declaredType != nil { - var declaredType = String(cString: declaredType!).uppercased() - + if let dclType = declaredType { + var declaredType = String(cString: dclType).uppercased() if let index = declaredType.firstIndex(of: "(" ) { declaredType = String(declaredType[.. Any? { + class func getColumnValue(index: Int32, type: Int32, stmt: OpaquePointer?) -> Any? { if sqlite3_column_type(stmt, index) == SQLITE_NULL { return "NULL" } else { - switch type { case SQLITE_INTEGER: let val = sqlite3_column_int64(stmt, index) @@ -176,8 +246,8 @@ class UtilsSQLite { case SQLITE_TEXT: let buffer = sqlite3_column_text(stmt, index) var val: String - if buffer != nil { - val = String(cString: buffer!) + if let mBuffer = buffer { + val = String(cString: mBuffer) } else { val = "NULL" } @@ -189,31 +259,30 @@ class UtilsSQLite { } } } - class func isFileExist(filePath: String) -> Bool { var ret: Bool = false let fileManager = FileManager.default if fileManager.fileExists(atPath: filePath) { ret = true - } + } return ret } - class func getFilePath(fileName: String) throws -> String { - let path: String = NSSearchPathForDirectoriesInDomains( - .documentDirectory, .userDomainMask, true - ).first! - let url = NSURL(fileURLWithPath: path) - if let pathComponent = url.appendingPathComponent("\(fileName)") { - return pathComponent.path + if let path: String = NSSearchPathForDirectoriesInDomains( + .documentDirectory, .userDomainMask, true + ).first { + let url = NSURL(fileURLWithPath: path) + if let pathComponent = url.appendingPathComponent("\(fileName)") { + return pathComponent.path + } else { + throw UtilsSQLiteError.filePathFailed + } } else { throw UtilsSQLiteError.filePathFailed } } - class func deleteFile(fileName: String) throws -> Bool { var ret: Bool = false - do { let filePath: String = try getFilePath(fileName: fileName) if isFileExist(filePath: filePath) { @@ -232,55 +301,117 @@ class UtilsSQLite { } return ret } - class func renameFile (filePath: String, toFilePath: String) throws { - let fileManager = FileManager.default - do { + let fileManager = FileManager.default + do { if isFileExist(filePath: toFilePath) { let fileName = URL(fileURLWithPath: toFilePath).lastPathComponent try _ = deleteFile(fileName: fileName) } - - try fileManager.moveItem(atPath: filePath, toPath: toFilePath) - } catch let error { + try fileManager.moveItem(atPath: filePath, toPath: toFilePath) + } catch let error { print("Error: \(error)") - throw UtilsSQLiteError.renameFileFailed - } + throw UtilsSQLiteError.renameFileFailed + } } - - class func encryptDatabase(fileName: String, secret: String) throws -> Bool { + class func encryptDatabase(dbHelper: DatabaseHelper, filePath: String, secret: String) throws -> Bool { var ret: Bool = false - var db: OpaquePointer? + var mDB: OpaquePointer? do { - let filePath: String = try getFilePath(fileName: fileName) if isFileExist(filePath: filePath) { do { let tempPath: String = try getFilePath(fileName: "temp.db") try renameFile(filePath: filePath, toFilePath: tempPath) - - try db = UtilsSQLite.connection(filename: tempPath) + try mDB = UtilsSQLite.connection(filename: tempPath) try _ = UtilsSQLite.connection(filename: filePath, readonly: false, key: secret) let stmt: String = """ ATTACH DATABASE '\(filePath)' AS encrypted KEY '\(secret)'; SELECT sqlcipher_export('encrypted'); DETACH DATABASE encrypted; """ - if sqlite3_exec(db, stmt, nil, nil, nil) == SQLITE_OK { + if sqlite3_exec(mDB, stmt, nil, nil, nil) == SQLITE_OK { try _ = deleteFile(fileName: "temp.db") ret = true } - } catch let error { print("Error: \(error)") throw UtilsSQLiteError.encryptionFailed } - } } catch let error { print("Error: \(error)") throw UtilsSQLiteError.filePathFailed } + dbHelper.closeDB(mDB: mDB, method: "init") return ret } + class func beginTransaction(mDB: OpaquePointer) throws { + let sql: String = "BEGIN TRANSACTION;" + let returnCode = sqlite3_exec(mDB, sql, nil, nil, nil) + if returnCode != SQLITE_OK { + let errmsg: String = String(cString: sqlite3_errmsg(mDB)) + throw DatabaseHelperError.beginTransaction( + message: "Error: Begin Transaction failed rc: \(returnCode) message: \(errmsg)") + } + } + class func commitTransaction(mDB: OpaquePointer) throws { + let sql: String = "COMMIT TRANSACTION;" + let returnCode = sqlite3_exec(mDB, sql, nil, nil, nil) + if returnCode != SQLITE_OK { + let errmsg: String = String(cString: sqlite3_errmsg(mDB)) + throw DatabaseHelperError.commitTransaction( + message: "Error: Commit Transaction failed rc: \(returnCode) message: \(errmsg)") + } + } + class func executeCommit(dbHelper: DatabaseHelper, mDB: OpaquePointer, sql: String) throws -> Int { + var changes: Int = -1 + do { + changes = try dbHelper.execute(mDB: mDB, sql: sql) + if changes != -1 { + try UtilsSQLite.commitTransaction(mDB: mDB) + } + } catch DatabaseHelperError.execute(let message) { + throw DatabaseHelperError.executeCommit(message: message) + } catch DatabaseHelperError.commitTransaction(let message) { + throw DatabaseHelperError.executeCommit(message: message) + } + return changes + } + class func fetchColumnInfo(handle: OpaquePointer?) throws -> [[String: Any]] { + var result: [[String: Any]] = [] + var fetchColumnInfo = true + var columnCount: Int32 = 0 + var columnNames = [String]() + var columnTypes = [Int32]() + + while sqlite3_step(handle) == SQLITE_ROW { + if fetchColumnInfo { + columnCount = sqlite3_column_count(handle) + for index in 0..