From 4e8655d0b9c8dff751cf82dcdc1fd073d8ca73e0 Mon Sep 17 00:00:00 2001 From: James Jiang Date: Tue, 12 Jul 2016 12:13:04 -0700 Subject: [PATCH] need paginatiog --- .../jquery.tablesorter.pager.js.coffee | 150 +++++++++++ app/assets/javascripts/tablesorter.js.coffee | 9 +- app/controllers/administrator_controller.rb | 14 +- app/views/administrator/index.html.haml | 240 +++++++++++------- config/routes.rb | 1 - public/images/first.png | Bin 720 -> 642 bytes public/images/last.png | Bin 737 -> 661 bytes public/images/next.png | Bin 736 -> 658 bytes public/images/prev .png | Bin 0 -> 663 bytes public/images/prev.png | Bin 745 -> 663 bytes 10 files changed, 318 insertions(+), 96 deletions(-) create mode 100644 app/assets/javascripts/jquery.tablesorter.pager.js.coffee create mode 100644 public/images/prev .png diff --git a/app/assets/javascripts/jquery.tablesorter.pager.js.coffee b/app/assets/javascripts/jquery.tablesorter.pager.js.coffee new file mode 100644 index 0000000..c6f91f7 --- /dev/null +++ b/app/assets/javascripts/jquery.tablesorter.pager.js.coffee @@ -0,0 +1,150 @@ +(($) -> + $.extend tablesorterPager: new (-> + + updatePageDisplay = (c) -> + s = $(c.cssPageDisplay, c.container).val(c.page + 1 + c.seperator + c.totalPages) + return + + setPageSize = (table, size) -> + c = table.config + c.size = size + c.totalPages = Math.ceil(c.totalRows / c.size) + c.pagerPositionSet = false + moveToPage table + fixPosition table + return + + fixPosition = (table) -> + `var c` + c = table.config + if !c.pagerPositionSet and c.positionFixed + c = table.config + o = $(table) + if o.offset + c.container.css + top: o.offset().top + o.height() + 'px' + position: 'absolute' + c.pagerPositionSet = true + return + + moveToFirstPage = (table) -> + c = table.config + c.page = 0 + moveToPage table + return + + moveToLastPage = (table) -> + c = table.config + c.page = c.totalPages - 1 + moveToPage table + return + + moveToNextPage = (table) -> + c = table.config + c.page++ + if c.page >= c.totalPages - 1 + c.page = c.totalPages - 1 + moveToPage table + return + + moveToPrevPage = (table) -> + c = table.config + c.page-- + if c.page <= 0 + c.page = 0 + moveToPage table + return + + moveToPage = (table) -> + c = table.config + if c.page < 0 or c.page > c.totalPages - 1 + c.page = 0 + renderTable table, c.rowsCopy + return + + renderTable = (table, rows) -> + `var l` + c = table.config + l = rows.length + s = c.page * c.size + e = s + c.size + if e > rows.length + e = rows.length + tableBody = $(table.tBodies[0]) + # clear the table body + $.tablesorter.clearTableBody table + i = s + while i < e + #tableBody.append(rows[i]); + o = rows[i] + l = o.length + j = 0 + while j < l + tableBody[0].appendChild o[j] + j++ + i++ + fixPosition table, tableBody + $(table).trigger 'applyWidgets' + if c.page >= c.totalPages + moveToLastPage table + updatePageDisplay c + return + + @appender = (table, rows) -> + c = table.config + c.rowsCopy = rows + c.totalRows = rows.length + c.totalPages = Math.ceil(c.totalRows / c.size) + renderTable table, rows + return + + @defaults = + size: 10 + offset: 0 + page: 0 + totalRows: 0 + totalPages: 0 + container: null + cssNext: '.next' + cssPrev: '.prev' + cssFirst: '.first' + cssLast: '.last' + cssPageDisplay: '.pagedisplay' + cssPageSize: '.pagesize' + seperator: '/' + positionFixed: true + appender: @appender + + @construct = (settings) -> + @each -> + config = $.extend(@config, $.tablesorterPager.defaults, settings) + table = this + pager = config.container + $(this).trigger 'appendCache' + config.size = parseInt($('.pagesize', pager).val()) + $(config.cssFirst, pager).click -> + moveToFirstPage table + false + $(config.cssNext, pager).click -> + moveToNextPage table + false + $(config.cssPrev, pager).click -> + moveToPrevPage table + false + $(config.cssLast, pager).click -> + moveToLastPage table + false + $(config.cssPageSize, pager).change -> + setPageSize table, parseInt($(this).val()) + false + return + + return +) + # extend plugin scope + $.fn.extend tablesorterPager: $.tablesorterPager.construct + return +) jQuery + +# --- +# generated by js2coffee 2.2.0 \ No newline at end of file diff --git a/app/assets/javascripts/tablesorter.js.coffee b/app/assets/javascripts/tablesorter.js.coffee index e846777..c0126bd 100644 --- a/app/assets/javascripts/tablesorter.js.coffee +++ b/app/assets/javascripts/tablesorter.js.coffee @@ -6,8 +6,11 @@ $(document).ready -> "columns" ] - $("#myTable") - .tablesorter() - .tablesorterPager({container: $("#pager")}); + $("#myTable").tablesorter() + .tablesorterPager( + { + container: $("#pager") + size: 2 + }); return \ No newline at end of file diff --git a/app/controllers/administrator_controller.rb b/app/controllers/administrator_controller.rb index 050df40..5840987 100644 --- a/app/controllers/administrator_controller.rb +++ b/app/controllers/administrator_controller.rb @@ -1,15 +1,21 @@ class AdministratorController < ApplicationController + + def new + end + def tabledemo end def index + authorize! :index, :administrator - @users = User.paginate(:page => params[:page], :per_page => 4) + @users = User.all + #@users = User.paginate(:page => params[:page], :per_page => 4) @usersAdmin = User.paginate(:page => params[:admin_page], :per_page => 4) @usersEditor = User.paginate(:page => params[:editor_page], :per_page => 4) @usersBasic = User.paginate(:page => params[:basic], :per_page => 4) - - @characteristics = Characteristic.paginate(:page => params[:characteristics_page], :per_page => 12) + @characteristics = Characteristic.all + #@characteristics = Characteristic.paginate(:page => params[:characteristics_page], :per_page => 12) @CharacteristicGroups = CharacteristicGroup.paginate(:page => params[:char_groups_page], :per_page => 12) render layout: "custom" @@ -87,4 +93,6 @@ def sort end + def changeName + end end diff --git a/app/views/administrator/index.html.haml b/app/views/administrator/index.html.haml index 4cc9d7a..99eb547 100644 --- a/app/views/administrator/index.html.haml +++ b/app/views/administrator/index.html.haml @@ -17,12 +17,16 @@ // $('.tab-pane[data-link ~="'+ link +'"]').hide(); $('.tab-pane[data-link ="'+ link +'"]').show().siblings(".tab-pane").hide(); }) - $("#myTable") - .tablesorter({ + $("#myTable").tablesorter({ // sort on the first column and third column, order asc sortList: [[0,0],[1,0],[2,0],[3,0],[4,0]] }); - .tablesorterPager({container: $("#pager")}); + $("#myTableTwo").tablesorter({ + // sort on the first column and third column, order asc + sortList: [[0,0],[1,0],[2,0]] + }); + + //.tablesorterPager({container: $("#pager")}); }); @@ -38,23 +42,23 @@ margin: 10px; display: inline; } -%form{:controller => 'administrator', :action => :sort} +/ %form{:controller => 'administrator', :action => :sort} - %input{:name => "sort", :type => "radio", :value => "name", :style => "margin-right:5px"} - Sort Users By Name +/ %input{:name => "sort", :type => "radio", :value => "name", :style => "margin-right:5px"} +/ Sort Users By Name - %br - %input{:name => "sort", :type => "radio", :value => "username", :style => "margin-right:5px"} - Sort Users By UserName +/ %br +/ %input{:name => "sort", :type => "radio", :value => "username", :style => "margin-right:5px"} +/ Sort Users By UserName - %br - %input{:name => "sort", :type => "radio", :value => "email", :style => "margin-right:5px"} - Sort Users By Email - %br - %input{:name => "sort", :type => "radio", :value => "date", :style => "margin-right:5px"} - Sort Users By Date Created - %br - = submit_tag("Sort") +/ %br +/ %input{:name => "sort", :type => "radio", :value => "email", :style => "margin-right:5px"} +/ Sort Users By Email +/ %br +/ %input{:name => "sort", :type => "radio", :value => "date", :style => "margin-right:5px"} +/ Sort Users By Date Created +/ %br +/ = submit_tag("Sort") / BODY .row @@ -62,84 +66,142 @@ %table#myTable.tablesorter.tablesorter-blue %thead %tr - %th Last Name + %th Username %th First Name + %th Last Name %th Email - %th Due - %th Web Site + %th Permission + + + / %tr + / %td{:colspan => "5"} + / .pager + / %nav.left + / \# per page: + / %a.current{:href => "#"} 10 + / | + / %a{:href => "#"} 25 + / | + / %a{:href => "#"} 50 + / | + / %a{:href => "#"} 100 + / %nav.right + / %span.prev + / %img{:src => "images/prev.png"}\ + / Prev  + / %span.pagecount + / \  + / %span.next + / Next + / %img{:src => "images/next.png"}\ %tbody + - for user in @users %tr - %td Smith - %td John - %td jsmith@gmail.com - %td $50.00 - %td http://www.jsmith.com - %tr - %td Bach - %td Frank - %td fbach@yahoo.com - %td $50.00 - %td http://www.frank.com - %tr - %td Doe - %td Jason - %td jdoe@hotmail.com - %td $100.00 - %td http://www.jdoe.com - %tr - %td Conway - %td Tim - %td tconway@earthlink.net - %td $50.00 - %td http://www.timconway.com - %tr - %td Smith - %td John - %td jsmith@gmail.com - %td $50.00 - %td http://www.jsmith.com - %tr - %td Bach - %td Frank - %td fbach@yahoo.com - %td $50.00 - %td http://www.frank.com - %tr - %td Doe - %td Jason - %td jdoe@hotmail.com - %td $100.00 - %td http://www.jdoe.com - %tr - %td Conway - %td Tim - %td tconway@earthlink.net - %td $50.00 - %td http://www.timconway.com - %tr - %td Smith - %td John - %td jsmith@gmail.com - %td $50.00 - %td http://www.jsmith.com - %tr - %td Bach - %td Frank - %td fbach@yahoo.com - %td $50.00 - %td http://www.frank.com + %td + = user.username + %td + = user.first_name + %td + = user.last_name + %td + = user.email + %td + - if user.admin? + %li.dropdown{:style => "list-style: none"} + %a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"} + Admin + %b.caret + %ul.dropdown-menu + %li= link_to "Admin" + %li= link_to "Editor", :controller => "administrator", :action => :changeEditor, :id => user.id + %li= link_to "Change to Basic", :controller => "administrator", :action => :changeBasic, :id => user.id + - elsif user.editor? + %li.dropdown{:style => "list-style: none"} + %a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"} + Editor + %b.caret + %ul.dropdown-menu + %li= link_to "Change to Admin", :controller => "administrator", :action => :changeAdmin, :id => user.id + %li= link_to "Editor" + %li= link_to "Change to Basic", :controller => "administrator", :action => :changeBasic, :id => user.id + - elsif user.basic? + %li.dropdown{:style => "list-style: none"} + %a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"} + Basic + %b.caret + %ul.dropdown-menu + %li= link_to "Change to Admin", :controller => "administrator", :action => :changeAdmin, :id => user.id + %li= link_to "Change to Editor", :controller => "administrator", :action => :changeEditor, :id => user.id + %li= link_to "Basic" + - else + %li.dropdown{:style => "list-style: none"} + %a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"} + None + %b.caret + %ul.dropdown-menu + %li= link_to "Change to Admin", :controller => "administrator", :action => :changeAdmin, :id => user.id + %li= link_to "Change to Editor", :controller => "administrator", :action => :changeEditor, :id => user.id + %li= link_to "Change to Basic", :controller => "administrator", :action => :changeBasic, :id => user.id + + +%table#myTableTwo.tablesorter.tablesorter-blue + %thead %tr - %td Doe - %td Jason - %td jdoe@hotmail.com - %td $100.00 - %td http://www.jdoe.com + %th Characteristic Name + %th Characteristic Group + %th Updated At + / %tfoot + / %tr + / %th Name + / %th Major + / %th Updated + + / %tr + / %td{:colspan => "2"} + / .pager + / %nav.left + / \# per page: + / %a.current{:href => "#"} 10 + / | + / %a{:href => "#"} 25 + / | + / %a{:href => "#"} 50 + / | + / %a{:href => "#"} 100 + / %nav.right + / %span.prev + / %img{:src => "images/prev.png"}\ + / Prev  + / %span.pagecount + / \  + / %span.next + / Next + / %img{:src => "images/next.png"}\ + %tbody + - for char in @characteristics %tr - %td Conway - %td Tim - %td tconway@earthlink.net - %td $50.00 - %td http://www.timconway.com + %td + %li.dropdown{:style => "list-style: none"} + %a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"} + = char.name + %b.caret + %ul.dropdown-menu + + + = form_for char do |f| + .input-group-lg{:style => "margin-top: 10px;margin-bottom: 10px;"} + = f.text_field :name, :class=> "form-control", :placeholder => "Change Characteristic Name", :style => "margin-left:10px; width:130px" + = f.submit "Change Name", :id => "add-set-btn", :class => "btn btn-primary", :style => "margin-top: 5px; margin-left:10px" + //%li= link_to "Change Characteristic", :controller => "administrator", :action => :changeCharacteristic, :id => user.id + %li= link_to "Delete Characteristic", :controller => "administrator", :action => :changeEditor, :id => user.id + %td + + = CharacteristicGroup.find_by(id:char.characteristic_group).name + %td + = char.updated_at + + +/ = render :partial => '/shared/tablesorter_pager' / .col-md-12 / #tabs diff --git a/config/routes.rb b/config/routes.rb index ef3c92a..4184032 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,7 +7,6 @@ end resources :characteristics, only: [:show] - resources :tags resources :method_case_studies root "application#index" diff --git a/public/images/first.png b/public/images/first.png index 6f11fcb086b1bfa51bc5070ca45fac0a988c624c..7e505d68e3ba4d8aed703db339b33d8a29ff9034 100644 GIT binary patch delta 618 zcmV-w0+s#H1%d^TBYy%(NklpyfGy(?D!%f856jKNqAu)}<~d(Fcrw0~y3FBFGlrU1pQGAWVH zgWDeg@eh^0Y1YhOEP6NqQqio^S(4dY5%9_6OAtvGAj~S2E75PsOdi%{f0Ff61_nI@ zz`n3-%>3W%j^w}-&4DkPN73gYiJybaE{XMzI(&E0i-5|(4F?~~#s@QAs$PK`LiH~5 zHNFa*p)AGdtbbnM^-1{XMZhWXFT)1*jHQMW2v{ZnRx-ev&oOcW*n?S!r;8AXW}vxe zd;`4*sQRN+hjCbF4#x9viCKp00u}J5?D!c)0INSkRpg6X(9zWsMlS(=D^v(TGwI^n zMKTDc9lHQ#U*=yG1!!(<=K!Zx<(iFXG6#uF5&SU(EPs%}7RX>#9KhsF(`JmWDDdjL zxE3nA7EOG+I|Su2;NU3u3Xd|Puqyh^;7&uKRE8y~1{l#KH^hpk-NCzyYchQ}p2Yxe zeMV0jg+}~N2~2GEueELZt0E(}qBuJP0IWX=5|kGItN;K207*qoM6N<$ Ef+%<@4gdfE delta 697 zcmV;q0!ICU1<(bMBYyw{XF*Lt006JZHwB960000PbVXQnQ*UN;cVTj606}DLVr3vn zZDD6+Qe|Oed2z{QJOBU!Vo5|nR5;6}lS^+BQ547f0sI7f4p_Q$!@|Vwx--6F!p6i! zQ& anYDUW`HQBO=|;{NKLAi)JR+D2+}kbI#7m(KwIcg7=LgW7#N@&=Ug6wy7MOg zWaj4lf9G-UodSTVaowyfZj$hhNQy4ph z3;}vHbMYT?vwzhAT#DL-irfZKQ@zzCd$OX!ekd$Ewh{=@69D#wWn<={IbUf(q1pnW zsuJP%MzA=7Z0`j4M{5GMqeFnf!=5r&HZIIKJ--JJY|#nxJ%)p`a+AcwGZ#R+gA95R zU<`auu-G$}TCO2rmjJMmx0?ATbwB{QQWK;`2QI4$EPt=RXVHs*necH`#9^ViB&je> z?ZSO42h3KEe4`MMDJrB2wQ~h)&UF#J1aK7L2msBfTTgw&VD+9(0MddosG<$aE3ZcY zT!vT6W8eRsOC$ z*+0hNMWWwDsLfA)S*X-WV71;M{bCzj1ubPQ{| zd;7(%o<332I-t#{AD2JRG~VV6XSWM%koTvl=iYSnj}9)ZSbt!1df^KM30NH-%q|+C zZ|xb3tr&g7S#q`ugpu4cFlKYPecTylk3#Q>SFn>M|A=4lymjcK1?L%62W>k_+y;n=9N3LNJGonipr~?I7tX^0gJ}jA> zh)XZhl1qULo!z}67mEWFpd)eivjOtbNt}FBhpUPnFx~Wu3m#tp$*JigxgmV%=<1;W zIKZwXpZTN%ofTzMIPtm$SLAB~lglnCg%@!NNt*)48h@Jmv?iMyR;LeiAepXAG`{GR z1gb#+E-ZIuc*X=FDs{7hEVX7tJ~_LBU=VbW$Tc8&bioONpsdBYyw{XF*Lt006JZHwB960000PbVXQnQ*UN;cVTj606}DLVr3vn zZDD6+Qe|Oed2z{QJOBU!b4f%&R5;6}lS^+BQ547f0sI7f4p_Q$!%lo8-5FmoVPoQ= zsVgVd*hOQ6%m7hLo7M&@3DuxNYNSOv1!)=!1_jv-@! z63yY*ccInp0e>E`(}$|i1zyrwyHD-}u>;$IpkQ_$Aw)?4*cX={c%)0M|wNgi1D7a_~HB)}E{R2p5VH-CFjs)?|)_MSyA0;Yop5gvzy z0SLg1sO$57V4NAyP+M@v5GK`~R9evKox`eSjYls5?1#bxfC1Pmny)?GA(;)XW4Qdt z4Y!#gAX9EhRdiu#`LzsCf7y+)HK7d+u}3lxvy>GpN)<&3@RBDbKj zxD!k!SAT)Q07wQ6-Gn*`85iZ>7zVE#RF?u>-GjXzTT2IfyTsX z6XN-%yiPPHr0n_^E8Hzpe7MH(L!#e?D90zSP^g}fN@{04Qcb!flJ%iEo~?q;Y!zl{ z=dXt}`IHwd0cyqO;QYY^WD0dM6YM#f=E3C+!9xPQ$j#_K{QZh9svG8A2m88bV(Q}VKl+d{Eh$pJ^wqgr-aVs*Yh*386ry4 zCy(A@a|mXuUC_OE>My+vD3@H$&EO1Ye-n_&y)J0u>&y)WC5y@Y<2pJ)mjsLD)km}#RdckrCN(WNuqV=-h3_|x$mY(Cn&&P zj7{gCWN)I3)R#Jv;&-@XWyEqdS>(}kqigQjXRL&%P?ZE;fUt&($d{W) zixr%>ct=kz1xA0i*aR+Cw$K0t=tzv%YJw+T#*lR{Bs|0L%?9v$z1fYk=PwH6eiQg) zwo(9$&#oj7-(mn=DLQ!VGuD#cpYpquqJa~q&d34-Uw^%|>&0RXg-R3bNitnI97t7U zG7Y#ho~Q`Lk@IqeuJg~l%1|teb{hy~s$g7_eaQ-l!E2s^yTXNSwAy(7+KzRad-5W7 zEVz)F@l5;1CFHB}PLRm$WM`7OpfvDCMeILx+BHGrnL)06kQ6t}>ux{R7L&Q}gJP-4 zGzg|EJabHRh9{cCz9Sck%M|zJgY?Hy-g*Aby3?0$yG)e||djJ3c delta 713 zcmV;)0yh1U1>gmcBYyw{XF*Lt006JZHwB960000PbVXQnQ*UN;cVTj606}DLVr3vn zZDD6+Qe|Oed2z{QJOBU!a!Eu%R5;6}Q%i3WQ55bE@E7nqVCm8gyH;z`orxP0HYP5b zy0Me`=%O(~W-L)mo7M&@37XW}rlwS!4j`tnP@oJCf$}I627ep|hR0Bjb1o0@vGXS1 z;@+I^JLfy++z9}f7{|3`(5TR<(5sjkKtFiX{24z^yrM#T|E*|nxHF9RIL4iXPK7`) zEF2z1xHqmOGi$FHFa~3P6Bv-M+Soi5I8E?{vIvsg0p+qsP;0aySFC{ND9EquB`Ay? ziVOv`NDfB6OMlIl0(j(h7b;Q*1QqpGm%K@G8xDPb$+8ng5iJowUsyI~9+Knd4JiI- zL!sJ7G}nM!r8N@SJMi##HwtJ+g917ScgA4ZcuHa$ZaiWM3Ca0t3#Jxa5Xwl9DK|+> zBzX?B-OC^s1@xY8Q4T$0sYts1kX7M=NUjc9p{WXdB7X>;Ngy^9xTwmoy7`_%E(*-} zPeKAVt6b|40nCWFx#)#hz5!E|DnL15`mvkb+sY+uST_aa5`p7DkO*M;=oQJ+PuwIc zicZcuiLJ@`eR3BY9avp^JrdA={u<`0QVVLbLVOZ3)h8#5@`#KHa5AxM6=;ifWI<{g*9DE4_W&SW~qUN5hWN@-RUJ#q3Ngxr& ziJp;+4aEd;HM{A>I)B?7>yL4`Nc6h^we^ve3YC6fwXTqAQWr8=Cd?emR={YnNptkh zuSFVP{Q?6Lt^qC!{rS=094t33Xh?z~DF7GCZ$PnXv? v`ng$nW@3azqlKF@I+$Bb00000NkvXXu0mjfBtJS( diff --git a/public/images/prev .png b/public/images/prev .png new file mode 100644 index 0000000000000000000000000000000000000000..7d1d049e9c0cf58d2a270cdb1d2afa846debc10d GIT binary patch literal 663 zcmV;I0%-k-P)ITKv{EXl2&fg9m6lMJ-TmCewX+E%}XS}h0a9HRY7!n#fM;g;=rvpExOP(@^x&OKC z@S&9YCELE?$wCV2n&JBOtvckSq;OHg}ITa%Q$VyROA0hk6=d zQKG}-iUw!D7SMp-L9RApO{zgmYC$7e8r%xGTxP(oE zlXdMwjZ&o!3XKs9f;hitk2pd%X4W(WXeO!?6U%DwmlA|N7pa|D~@s)@ka#SK_2 z00Fjn+oun#NU`->-n|%GRKsAhpt^Mkwjo8EOSF2Mvi`KHzHL;HYr!DI>Z~}vqy|Ag zv%tiH6n5%{D$gf3&4{0<$Y}a3`F3XhuLueIGmmqDMda6>gsLzJI1ikuy*2!%G6ag5w$k xfITKv{EXl2&fg9m6lMJ-TmCewX+E%}XS}h0 za9HRY7!n#fM;g;=rvpExOP(@^x&OKC@S&9YCELE?$2vBUu{U z=_TreBQZHuAp6Ilr*D7;*iaa7)2kO3 zepP}7G`!-}i1R;6an+@T-TdpqfS9<1O@otl?L&=HrGE|zjS&liIKO9)I6^mO)-(iY zCaMz?%WCkK8DEehAR>8l1e@fliNM*#4OlDy0k(PDrw^=1vGrTty%<|m!(g(Yx^)P) zAw`=@w0fJe{5%{D$gf3&4{0<$Y}a3`F3XhuLu zeIGmmqDMda6>gsLzJI1ikuy*2!%G6ag5w$kf1hlor)=Ec^h7>5J3?Bj(D1WpJ2m=GdP>yphA5wMa zP2NoA&Uv46&Yg3I0AOfPXJ$YqNg+uoN!69IyC?fIe$aSIl6>qDrFa*fW-zI;z8^hfV^>6dMrF@o?^*g8=YbxhBG4iGPQ=B?paO1gQKwyDT17{-*#J z$3IKjAO_5QcFZox0aqV;$U9ach{v#KUSiQp0KPzw01A~RT$}R4g$JJq0D+eu(Qy9$ z2e>lfCe?JRXu{n5t3E*aWh+FNxCT^s5z?&G{}Z3o!ZsuiI|hUePkJGCP$PdPnl6FC zWbU`1Fn_Pbs8pr^?KThtmU&}3Kr*7R^y^Rk5Xsb_*=oc3w-9KI@B4=+yK6a8uQ@#o zTkf1PnlL+NjAm=Zh)+xqld|idFEF=^(avw|4U*w)Kx6;tw)?@=DSOt)Vq z)#EQ#sHvHG+VITCPU|UlLT92!bvEiI75?{S`k(9k3(SNGJn76jE&u=k07*qoM6N<$ Eg0a^}6951J