From 2c3e68194258efae5584596d620ce14e4eb1bd88 Mon Sep 17 00:00:00 2001
From: wangyong <864072399@qq.com>
Date: Sat, 5 Dec 2015 16:15:19 +0800
Subject: [PATCH] fix bugs

---
 jasset/asset_api.py                           |  43 +++++++-----
 jasset/views.py                               |   5 +-
 jumpserver/templatetags/mytags.py             |   6 +-
 static/files/excels/asset.xlsx                | Bin 0 -> 24181 bytes
 .../excels/cmdb_excel_2015_12_01_22_17.xlsx   | Bin 5898 -> 0 bytes
 templates/jasset/asset_detail.html            |  44 ++++++------
 templates/jasset/asset_edit.html              |   3 +
 templates/jasset/asset_list.html              |  63 +++++++++---------
 8 files changed, 92 insertions(+), 72 deletions(-)
 create mode 100644 static/files/excels/asset.xlsx
 delete mode 100644 static/files/excels/cmdb_excel_2015_12_01_22_17.xlsx

diff --git a/jasset/asset_api.py b/jasset/asset_api.py
index 1e808306..36569a43 100644
--- a/jasset/asset_api.py
+++ b/jasset/asset_api.py
@@ -7,6 +7,7 @@ from jumpserver.api import *
 from jasset.models import ASSET_STATUS, ASSET_TYPE, ASSET_ENV, IDC, AssetRecord
 from jperm.ansible_api import MyRunner
 from jperm.perm_api import gen_resource
+from jumpserver.templatetags.mytags import get_disk_info
 
 
 def group_add_asset(group, asset_id=None, asset_ip=None):
@@ -156,7 +157,7 @@ def db_asset_alert(asset, username, alert_dic):
             for group_id in value[1]:
                 group_name = AssetGroup.objects.get(id=int(group_id)).name
                 new.append(group_name)
-            if old == new:
+            if sorted(old) == sorted(new):
                 continue
             else:
                 alert_info = [field_name, ','.join(old), ','.join(new)]
@@ -198,14 +199,17 @@ def write_excel(asset_all):
     workbook = xlsxwriter.Workbook('static/files/excels/%s' % file_name)
     worksheet = workbook.add_worksheet(u'CMDB数据')
     worksheet.set_first_sheet()
-    worksheet.set_column('A:Z', 14)
-    title = [u'主机名', u'IP', u'IDC', u'MAC', u'远控IP', u'CPU', u'内存', u'硬盘', u'操作系统', u'机柜位置',
+    worksheet.set_column('A:E', 15)
+    worksheet.set_column('F:F', 40)
+    worksheet.set_column('G:Z', 15)
+    title = [u'主机名', u'IP', u'IDC', u'MAC', u'远控IP', u'CPU', u'内存(G)', u'硬盘(G)', u'操作系统', u'机柜位置',
              u'所属主机组', u'机器状态', u'备注']
     for asset in asset_all:
         group_list = []
         for p in asset.group.all():
             group_list.append(p.name)
 
+        disk = get_disk_info(asset.disk)
         group_all = '/'.join(group_list)
         status = asset.get_status_display()
         idc_name = asset.idc.name if asset.idc else u''
@@ -214,12 +218,13 @@ def write_excel(asset_all):
         system_os = unicode(system_type) + unicode(system_version)
 
         alter_dic = [asset.hostname, asset.ip, idc_name, asset.mac, asset.remote_ip, asset.cpu, asset.memory,
-                     asset.disk, system_os, asset.cabinet, group_all, status,
-                     asset.comment]
+                     disk, system_os, asset.cabinet, group_all, status, asset.comment]
         data.append(alter_dic)
     format = workbook.add_format()
     format.set_border(1)
     format.set_align('center')
+    format.set_align('vcenter')
+    format.set_text_wrap()
 
     format_title = workbook.add_format()
     format_title.set_border(1)
@@ -308,18 +313,21 @@ def excel_to_db(excel_file):
 
 
 def get_ansible_asset_info(asset_ip, setup_info):
-    disk_all = setup_info.get("ansible_devices")
+    print asset_ip
     disk_need = {}
-    for disk_name, disk_info in disk_all.iteritems():
-        if disk_name.startswith('sd') or disk_name.startswith('hd') or disk_name.startswith('vd'):
-            disk_size = disk_info.get("size")
-            if 'M' in disk_size:
-                disk_format = round(float(disk_size[:-2]) / 1000, 0)
-            elif 'T' in disk_size:
-                disk_format = round(float(disk_size[:-2]) * 1000, 0)
-            else:
-                disk_format = float(disk_size)
-            disk_need[disk_name] = disk_format
+    disk_all = setup_info.get("ansible_devices")
+    if disk_all:
+        for disk_name, disk_info in disk_all.iteritems():
+            print disk_name, disk_info
+            if disk_name.startswith('sd') or disk_name.startswith('hd') or disk_name.startswith('vd'):
+                disk_size = disk_info.get("size", '')
+                if 'M' in disk_size:
+                    disk_format = round(float(disk_size[:-2]) / 1000, 0)
+                elif 'T' in disk_size:
+                    disk_format = round(float(disk_size[:-2]) * 1000, 0)
+                else:
+                    disk_format = float(disk_size[:-2])
+                disk_need[disk_name] = disk_format
     all_ip = setup_info.get("ansible_all_ipv4_addresses")
     other_ip_list = all_ip.remove(asset_ip) if asset_ip in all_ip else []
     other_ip = ','.join(other_ip_list) if other_ip_list else ''
@@ -342,7 +350,7 @@ def get_ansible_asset_info(asset_ip, setup_info):
     # asset_type = setup_info.get("ansible_system")
     sn = setup_info.get("ansible_product_serial")
     asset_info = [other_ip, mac, cpu, memory_format, disk, sn, system_type, system_version, brand, system_arch]
-
+    print asset_info
     return asset_info
 
 
@@ -357,6 +365,7 @@ def asset_ansible_update(obj_list, name=''):
             continue
         else:
             asset_info = get_ansible_asset_info(asset.ip, setup_info)
+            print asset
             other_ip, mac, cpu, memory, disk, sn, system_type, system_version, brand, system_arch = asset_info
             asset_dic = {"other_ip": other_ip,
                          "mac": mac,
diff --git a/jasset/views.py b/jasset/views.py
index ac8f166d..37023353 100644
--- a/jasset/views.py
+++ b/jasset/views.py
@@ -419,10 +419,9 @@ def asset_detail(request):
             if perm == 'user':
                 for user, role_dic in value.items():
                     user_perm.append([user, role_dic.get('role', '')])
-            elif perm == 'user_group':
+            elif perm == 'user_group' or perm == 'rule':
                 user_group_perm = value
-            elif perm == 'rule':
-                user_rule_perm = value
+    print perm_info
 
     asset_record = AssetRecord.objects.filter(asset=asset).order_by('-alert_time')
 
diff --git a/jumpserver/templatetags/mytags.py b/jumpserver/templatetags/mytags.py
index 880fd2b1..af41f6b0 100644
--- a/jumpserver/templatetags/mytags.py
+++ b/jumpserver/templatetags/mytags.py
@@ -276,7 +276,9 @@ def get_push_info(push_id, arg):
 
 @register.filter(name='get_cpu_core')
 def get_cpu_core(cpu_info):
-    return cpu_info.split('* ')[1] if cpu_info else ''
+    cpu_core = cpu_info.split('* ')[1] if cpu_info and '*' in cpu_info else cpu_info
+    return cpu_core
+
 
 @register.filter(name='get_disk_info')
 def get_disk_info(disk_info):
@@ -287,6 +289,8 @@ def get_disk_info(disk_info):
             for disk, size in disk_dic.items():
                 disk_size += size
             disk_size = int(disk_size)
+        else:
+            disk_size = ''
     except Exception:
         disk_size = ''
     return disk_size
diff --git a/static/files/excels/asset.xlsx b/static/files/excels/asset.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..1b92db891d85cb5736e2ed99e166078360ea90d1
GIT binary patch
literal 24181
zcmeIa2|QG9-#>mV*%@0V#3XBpsceM|$(|@>Un*paNyx-7_B9kmktKTx*&<|LDqq<N
zF=nQ+XQnJC#?1fpz4z~Ze_y}*S?=HOdH&CHdNp%gbFS-L*LB|S&vsqsV{XF4EC{dw
zYybdA02+qL+8zu5(8UY@0stGMoi5tP-_^(8>Ei7hu6_=R81L%`@|hXs@&HEY`u{!t
z2hYIs`+es+kMinm8B%pWDHwmO)@D;#jp*e+d|s=qE3Io3dHdrq?UX=<C0q2x(wVM=
zUca?R_j=PNdls&9Gd!q~7KKZuhnGLT`0~)?H1SZYtFZo+qQUp4-@XjHuKK$9;gOf(
zM+>eeN_#o42R?Qli{P_90ZTtv$Ekm2o11$p-!_2-+;I2rly{T-@UZt>q^T^-Jn=#D
zBq`=)pw#{M)jKn<-am8c2rfU&$9_NX{A?Cno1{&gdgtW-L(N9#k<os;&y*!}EDY9<
zWOZ#Ez7SUGSemV4^ybUKF1IUj*=S|D|CJwKKUVKkERP)=t9z#1=;>POwPzbReU+0p
zNpaYA-;<S`+ifT@{hV~lBb~<WR5D+(VIVVRJ16<BOY**}A3fXr>QBXs`}ybrKSY>J
zM<y9UJz>6suOG3_-z!#Zqc^=kq$p}^Nij<tKEY*(chxvC{3hq)t%X@;_UhiO5;gbj
zJpe$bGXds*!_bglF6OX844r`p$O$pj>89&-KcwQ%&;MoS|6n@))zF`(wi|aH<&9a3
zSmV8kFK$YRyWR-r+myM0xUBl<<)rGPyDoJ*oBA-%CxY##&RzR9ur)t$OKmFr^_94o
z$Dfw-KXGLr^tPA(;k8@aIDbUuh6u||xgWxk_)8O3)A0QVKATi2X;nWb=6`Z9rs>3$
zs@L*zep|R%^5n9_=i{{<kxNhXst)yO@P&GjJ@emg+J1X6q4s#pEmw_hU}t?cPa@o0
z@Wy9d8P2yZ$mcPGS5xiNg5LL1yz<|S+W*2dLlcY3?2*Gt1ynB#-*F3fK3#GiDH*<H
za%S0t-}Dh~)@^^6Ml?-(6j^m$QPgVb+~!;xmy%A%RzgAVrjp{ZANR*tp{e+L-rPy=
z_W2I|(g^WJ1Yl#pTu1(aI)Uh$URTj*ub;Z@Pc&kH6dc5{|Jld$)B(@Vqg*{}k*_0%
zLVSmlj_GGR_T)_{1Ov|UzV25=O?J}ibKmBfKJm}6=gN(0U6XyX`W1RUaG9k@EAze5
zZ0j-~W&=62GAEj3dAp|UPBEu&$Vhz{t5=&=+pj!t_G#PjU=!xT+(S~$eV6^onF+i@
z^XEi|OHcNVzAf$736xWF{UJ9p%(SFrR#ne2JUbidUi>hPzQyA`EsACT;&)~Meo%^{
z{E6XAfko`|IWzbpzE7XQ*h{4BbME+)pH~$RrGNH1I+l49FCq3u;+uz9FaO(D77me<
z&)GYFTqZLgH#ymAz;gSR?*<Zj(ti&botbW{^AKFJAY%vyT>(MnufbAyvCn7vC~q@-
z0ma)qecz=|h07#-nbkATJ+jv5y|SKN)DLr`!>N4h_@?}PWpBkpLC0Q6ooZ65Df@h>
zOe$z@oV`G4e~RRthHJ&V+xH36YfVG@CFh?imMUkufgNHk@9?d5sy#Wdp2vKEdj?^6
z$5SWHS=wqe$+TPL<Nl;eqq^>9U6;~FIvzX@mNw$oQ_3$LY%s9?P=EO$>HN`_W6v$^
zcf`AH8lAeoW_<n?gK1TL+ab?^0F|rymjGYh3!n+mZCKS!D@-b4Wv`t+A$Ir54u>uK
zwIn426pP$2{6_+M|Gg7m56$-#+@)4zhz&j4K7A=e@2b?(@6)F-jxHFMCmtYz^<{<D
z_~{Ps<5~KCXTQ10S18;p^4Q#N9-aaZ7{?TRWq)B~G*DigQ<=1RU^Z=qE`PDjF@xp0
zjvCcK;Yh5{!uq=mvdLtG_(zou>1XA?9DNngmU;hTb>fhVvxow>|DM|t$dJ_;6x&%F
zgNFdA<yk0QZ3jE4vX(uUw4-ntp1<k1(4m|c%G`NFIDe5VU&ekWu_Gf7ClY|%t}(NJ
zYzz~)Uu<z=ef`GBV(t};;L`1Tig$oQZu#N%?FW7zb+=+_PBn-+yTBP$Z#i`_TmeOy
zR@;_**kMh_54gf{WB3Io<qL3;eowFV1r>YEItKKv+x&Ow=a*yOkV&!1kFJmOyWB5q
zdh7ncr{KJ1mQ=x{e@5X*K<e3%PxIf+>(I+sJz;_Z>B_r#-M+G0Rn^Zwq6g0n3n&}$
zyXz=i9x@jeZjt}-kI|QE+^DYvp^py9Gr>Qg&(HnJO;;BS|C=5@Zhk-IRr95G&uMMJ
zX81PjDpGyS>uvn9kkLtIj#obhL)$E;te=%TTx#-k&b=Tfagw=2Ia-L{(Bn{eShlW&
z^tpwBGnO~sA^nSz61i{rD%?xEyJ@6^o^8HYRZXbBuXe&kTv}$(*fsC+Rf}FpZh>YD
zZRI?-+#N|`o{;nhX769x5;n-;?fa~{nxY=Heb&TqNYps2NLuDI$Pit!W3-4w)$7_q
zQTtB*(*1Bpp){lK(t>0P&|S<&V65l3ABU-wY~J1qcRf0AyrIrA1$K_qY07l7k8Qc4
z!!c7EuH0S3ILy&&p;3{Mt$Y5maJYQK&4G&8ck0sEem*vB!m75i_QGN5KyD^?;iG!@
z4Br}|zJ?|?xe1s*J;-RBX3lreGfn?lqB}#_PH*RG4F<inc~#@<CR#Pn2YKsSWc?wJ
zQlG-@t0$c2Bu&$$hCbhM7bp{r@Cr@##mS!xQbXwAEkcx|ZS;=Y9ZsJdt86FFX$m*z
zrq~<EZ5f}CZd6-Lot<z&FK^Got{iHoEPV^C#$lB}?92{r;H27xw7MSdQ)8QA@S@O%
zM~S63Yz{m23%XU56wf{y2AyrJ`j)WIVj6(H13gEPUcw(E%1TcSnb_7@4jaGHlI+fT
zeO@o%v3;oFxt3pgZfBi4oNYx5xldf`j>}qBI$N<FA#m*j&#{Sh<D7GaUvGem{teTK
z11K7vS-<Z%pV^V5cth{x-mVCRcVU?tvulh?Im2QJh=vUaMt?8j_6(<9Nn`<lSdpLp
z-mfCg-`&;Q75VGuv7Z=Qv6=CiRuybPya?p=U)wfIUCldprSDd?ibrD4>bQx1v4ZM-
z_c;Fx1#&NB_Z`g>4N|)Np<nTq#pR}bFD8W5{bzJn?xrdX7iZ84wbhha7~{7wAmwpq
z3T^_eX<X`;taQ$LDqwlSvm$aN&eTwSxpAwfz<4^KL3@$;d^)kBsq5qGD*B@A#86J0
zZ-iKB?zdB;0nQR%g2xW0<n5z)T~D?ERb6c&n47QFEJ^9YFRMKn(=QjgC~)S&gwc7%
zYiP3)sgC!E)?M1SUbnBbciVSQ3p|~xK9D~dUz?P4m_y@anF+Jgx4YNgpUiiFi)6k?
zJQgZtAA3-7PIsdGDXP8^_c~!S!T91zY1x?Q)7E^)^H*+;n|oiY83`!JnGe=Mdpj|d
ze(2%0>%6@0`RXAc;oySDd%gO_Esfo9r^_nlH211g?%bIHOqG*pAK$M(zPZiqm8)O#
zCKwd(HoHUTy*om=wIWY`7WcB+ftKZJWLp-;@T<ndH46UyuuQ_UdapP4hjiteNx=n{
z1xFq84~ULWN@qQ+zPR$Pj`@_!BpbkQc<;bd$#g$WJ-$K;P*Q_rH_nzko+$DCi=6BJ
zcV0<TrQ=cbZ}U%OKl9hd-m`SzXF7~6GvvRCxqt7~LSt^^C96nH>l3VJyQB`=UedoK
z5-XRzsN%T0-jB!QK2taPV3j$cS!#{(^Xj1mcH=C0^+gCr>=t#vDYq4~xzU%KYrC>_
z-2Yi;uT=ZTSJBAFO-I7t+laK4OlFPk>y6u|V$Stap*VI<T@2$DU&=iZ`(deJN7(QV
zH|7P#{l=;In&<=R>FAz#2F+`CHf^p2w3$w(e<4r~W>1O^2&sQnJU##NrS5$Z330_Q
zdF5T#j^C-$`Oc&FR9orsRl*ze3YW9VnmF%OaO2?_Vbb-(k6F7GC9ej&efU@;{-UM2
z6nmGeha}q*RjeNtzo_K7yaD898SdK`XZt4Qn94^?m=L41YMS$X^BIDHVV7#EY~PV#
zUtPrm!%Al#DLuaY-aEj@ZO}<!L5;68Q)Q*s|Ix!YXYVRy^-Fd=Joa+ZW?zAe&*!tl
z*1e%U0|)f(`Ngt}QXf8&Jkz4PUz;Z|dPl2WzX1u42tM#!z38~krwqMo@t+y4eZkld
zAL=l6)dsmwnHdJXYCykfq_?=vC=Oa3T(~u|cJTA-JJzhDgqX0kj$KyQ;4q;@F)m5h
z;HmA>Da57eU3}SQMHP0#*5RF!T;MBXE3ZwL`P2|&xl?>52`LS>b$$=;%Sg&yoMx{p
zu}2fW9McpMWoA<AyZemfau%y|2FqV?^7+cLCzCoUdQmv=%bm^$r@dvbkIud*-{emG
z^w9KMw&!cbz@k@}8&dDSWwt8DI>fvg(kc5GQr=&-yK;6l)r#3=Mor?0%C%H?Tf<t*
zXx?a?<ddLV(nr*VguFdM_ddHMI8gz3E|<1FdmCP7IkEAY$_#8?h$F_|u?XGwBB6ro
z{R91=45g<z3@;+AUA2W5lRq`q1Xl;%e)d|wkelDO@sU)m@|_`O_~cW>BYW598m@-i
zLBo5?hRlcE>+lB8i{h@kGnoby<vsNq3WzL*^<L%644gT%0uqir(*1hl)s&t;%lx%_
zZ@w|mRo@*SXxMi^e4fWDKdnsXH1qrY#;FzZO|9=)G7oc~|G31>8wE?ZXLb3kE6J*(
z7I~+{Vn6$-72EiAe;Nlzu2=L%*)!VaWt%jG10Q86pE^z!C9Wt&2!6K<SZre_-1urS
z@cN|0jnr2{)yL_oGR3EFZ4{h&pnLmd{`Y-*l@b)coV1T$$V?8h+tCh|-{#_(xkXq!
zd+x=W=CY&KC6fV<e4F==VxGOR8Br`=L#IwyKS(QWKb+xH=RH?69$;z98t<7ct@tRw
z$@%nP>4PNUQ7MwQaC)Z0{mjvd8#;Nn4}KujZ|uLa(KY>^YK~U&`pjHqYxS(lDo}j8
zoLM7;jd(2VJAThz`)K~J`;RjxwosW*W^nI2m~y5{KT6i^-o1*QhA&&qF9@*@Y^M>H
z&Baz_wY!cr!{2wWg)B^XMTU~t&mK8=ZYeYre>}oMuJMSE!^I!t{U+7w?oC2fh3`iD
zjW6+8sUbIFR=>C&L0j6#hAn9Fh!mWw8G#+nzJ|U?VcES^B*3!!?f{!z<j{fj>Fgna
ziIY~BD<`;KU;a?Rym9n7M#pp*9e7xwa%kapxnuCcMvh?LzJ=S0h-hTn>x2m!>K~ft
zvvb>BZy*E74$@!Te>9N%Z(n!)qh-|ZDSC{z1-{L5I?&C#_uSQ*rYFhHY=!2A9IxIr
zP1Ti#3K^XXv<UJ-<jreoqgPeTr|Q|I&_hF>uV?SxuN4fUc<L+Ve%aBNjEyatTS)cn
zynly$xg>?}LA>#!UnHs9*ddL!H`WI&Ivy1ARg|{JQog%AsoGoOCU303$mVgdx%%Zp
zmT)7>i@Y@j9EY#STG;Y(7Qbh*a5ug{N@a${?9v<$u%&&FJgfIj_CUmf+H!t|+<D%<
z^gBv+W7hlPU4l|gir%K`KK*?8Oe*&+Z_P0Hk)d~`zkCJk^Q!MiuU~nPc9|czu>YE|
zZ6tqPx@t!guzK!c%e|#?`vwKx7x4+Ye$k5TtOLBPz7ORpl&kZ&1XXW{8!>P2`5pew
zsbBd0+L@z{w_DBZ`MkBAQ|dHs>eO|ZR$p$LILT!780i}fernBLSMJZsbwcB?O*>S|
z*PRmE)SX{8)ulWYS>7CdZ}&R(ob8P+iS?Na3h>K$*Fqfk9(W!lzjS4(K{nsd^jZ6j
zk49`uOr#r6{W&D77Hhqp1$Il6Jla#I(r5M6>k>n&iL1iL+!JSo-#(D~xZ#{ObR_KD
z>60iwXTN(hor+3Q6IUfxj6|;N)1G+S&mX63k}}U7i`V=9LCjiq9N(FL+>3(CI2E-m
zj(payUnqz9EYmR)fPOu9BqJioYJX}{yrprCJX=6bYMa*Bht~$_(qbtjyKCGYd6Prm
za#G7>-XvK?p(`rUt=KRfZ_Ja=nZA9WBo8xQv-Q~-4xH#{j4k|X9n4WHTO@4b7d-2u
zk7)`uvUn+!rn<DZ>Eg?nIP$I4g3TG>+S(Ep7I=$$xlI&aY+zINJE{9c;9#!Ux_*=Y
z$E-VU-)AxY%2@;OG};T?ddv5U-Oe)0)|ML<ECo*q<juvH>$;Td%ZWF7PXyGrhITW`
ziB45Z@Li|xB|7~>$hVDYaSuR{=Ypd3`~Cp=pB|~7yQ{0eAM)3)Uv0MgmrVSoj`Fqy
z7Sr2F!Bi=pD`96DCHkKzWor$bPOoA)WpAVnZaKVF<$ei!zsKmyG&-==q5KOB{rI*)
zzVd^sgkGIb!DlW%vZ%5HTSI+(id#y!`A=TGa5ow!GljDbr75F~>L#QmdYD+Az(YOG
zs&MKinRMLaanWO@S{QcU3on?8ZoI(!`F&i?(fIr$pW--LuRVNvY=5<!oQzjI>@k}~
znq0@-a4^6~ex}-2GbUNG4s}t@`WuJb%lqg3ZWXrlQdR<F3s2jz+-~g_h_dquTp038
zcraRhlwmMBAaD2aTIUY$!}RZuPqSFwGP`$`fa<Bq7=>l{l?<Sb&u!1lD!K1O9*y9B
z`{Znk+h@G-tNJ!8P>`YE7SI>>;)y}^!8;1n04%FCb@}m!Qw?lLt=Tm@oTybb`rY(F
zQ_IxdC$A2*AF9<q$KikZOOs}Zguj&t$gxZK^zie%%Fw<9#&+iTfJkYkbKu5_y8b<x
z`St4Cna7PH?4}*v%8pW#U{i*(+g@^>q{3q{8>3wUtRu?t!zYCM?y2s7p}OBl&}CBU
zoxa6c5e{p+1Svz55KGjue^{Mqw?j4GVV9&s&&zkfg0D|R9|v38ZA}_Hh{7yixVE_7
zD(I`+<-Ak=m3bn-%VqFp#izHCJ3J~Ad#gtzb96K#lbFR^o}>sZAIWQ1_TTXp?(Zy+
zM)R75oWUkpb06@jlvvg(jKqAEO!Z1OMci|gbli@6yN5601UxzqZy@hdHNi0xAn3_w
z`MOYG;~6?9pmtHRIJ<c}Zimo3$CLcN?`q}u1dZqrPl?EQ?hk>s^S6Ovg(aZSZj8aO
z{`tm2Ia23RN1CTx%y~P*D=YhATaM0i6hFBue<(9>lBa`X^^H~Gt&8p{_d2+38jd~7
z={OGrOUi2mtzE9TUKFk~m1B$vV7GrF7Y1-1G7WxV_5E8ik`Be-{^YZ8Kyd$gNC3XR
zcTQPr0Km`xaHzxu?QDJ%eZvp(SpvMT`dsn2uIPEg)s6mvJ_qm`>l^6<3{X3U&_94q
z0K)Vz9@hZC)D$=j)nx;i8AJdm(Ee+<Pm4kH&*%CKasbn><q+RuJpd>M^y@X}pzogt
z)Y`9q|KXb{kKvD3L$}If{L|G8KpxYd&VhSBtI=116Xxz{f3%-F`o;kz#iPK9(?+Ju
zKU;^6U(cm~J>?x0yEB;rR5LGzu|He^PlwXm06sS09&{fDK7f&rfr*cS-UT3_UhHA`
z_4u_K^ufT$#Jq=vm5rT)6S|;|7hq&yVq#=w+Oy~9Z5TqJ-vMU6J^T{KbXWw=UtvAy
zD|kHo-V-*-(^c(zFAR~Tl&;>4VCN8m?-Lf0mXVb^bXZwMRqez{b=@<1`UZwZ#ugVZ
zSz1}!*gCtoUUPHz@bvQ!xD|-G9TXWA9TOWDpOBh%|3P}j!$+C<1%*Y$C8bZFRoB$k
zy{vC|)!5P5)!ozk=Iy)Tk<qd7i4T)g1S09v=P&aMi%XPm-`6)bx4<9UKgacRoPRq0
zFtXo_3z`H5MrLLvX4aqMVqgsXIdDGaJrc)Q_;t>+Uhx$;cs!g<@btYWRqgDON*Bm`
zuihNu5Ry_RNK<|e?bnh0a|4U`ca7}N1N+OkrU6|DjQ_EN4mI*0YXPcFpMhX`fIbCq
zF)=`3V&Vf(0BsGcM8I*I5n5pbsMy+*#aU;Di!wd@6WOKHZH_3+8cE%Ia^#yv>iZQF
zC4M8RG;L8FIUZw0i>`#xfw`=6bburX;5wuUPTNAwC^`_~tw9Iwm^07;wv1@pf-RX2
z(AaC&Xvef!sRteR(t#&lopb<{8EFN(0mT0{^*?m35cEOXCiV~=IM^CP2UZvg=)hv*
zRG8WVlj^+9(8?FD;MaDhbq#u!7)5mX<wuu#&SxHyw&IxMFD&I^(f7>+B5C|67;Z3F
zpANKVXV3ve9@Brr5@tFOmDZW{k`AC3n!>oOb}sbZ8a8AV54~Y{Ks+i!!<>;0bQloU
zwqfpgP^lUs+d4$H|9C-cSB}{Ew917%7q09JU0hXD1zF*J$2eFooMSO!41@nSoJr{E
zBmWi;F#6E%K<t;=Rk;2r)tB^EMM3uLsMH;dwf@$)P=-%<?V~_uuQ=DkqMn})*{=$}
zXBp(Fq46O(aD!EZHL8F|D>eRCIVK3nG3QP^B*t(*_`_h}nPv#er+Z^t$)?40;F~ny
z=cqJTTQ1v9lOOX(aADMT{LYfcn@ZhVr?$Ckx6L-|(lY}5N^qXK*V60LJn+{O5HGtu
z0=)gC>of1#>mD-VWuokCVs=|w4qzR@d*u1{2}BJ91?0XyVkIY5cwEzJ&Mf++dNWP{
zd&reyv8g<S^3(^D6`RkqgMJ?5&FSvOnb>yIQ=tdIdcvsH_GW=|uq$!Z#5QxFePV9E
zQwJJ6?DLe^x|a$-5;_UzBD}7Fjtdn5o%6sZb4&{y<0FbsK*4bY{2=IMPPSd91AK0&
z%bh|>w2AG{)Etq)*e-6X3*_}s_EBkyRuayY!el~TV66uco1ZAG@l-u>O@~PA%F{BB
zS@{V%;EoamVLe(xDLSALu5yNY;uRf;jkU(8?{wfl&;fW|E|<;n?EW!2;H+>2^NkKz
zQXKkUuh#X(Pj{*_56&*Al`?EY?Lb-uwO~!&f|LrLb_OE-zvt=rz5ty&4TwSo*RiLb
zWCf6YlGLZOWzD`>x{Ysqn7sm@Y_5_obWb{9z7m&U{jAiSr|-A7K}4X0TIZg^ow!tj
zcX_tjooeJp(}*cu2qt&c5<?L0>s$8Gy+tgyCv-nKr!c*B&wSM|_EM3%dQ12f(xaYd
z<9C;W;BgiC^@IJp6^TV*A+MY%StQvcsyt<cXwX?1jjD;jh!S{eh}lYJFDZqg>ciAa
zL_^I((9`N{QG3<g{35aA7&7+rsGVJ~obvLtUr5Pw&fNlj2jOxe@S}iOvPz;bb`o=P
z=jcF;6VvBWWyu{aDi2ulESHP+Ca9#>)VQyk4hVkLI@tew5w0GMUp=;?5|Y&^axIIH
z3o{^;<4nn|@%~QyOBP_o@N^d)m~s>uTlbb@+K}B09Xmpk$MS*}6oGC$_d1RZ9O%y3
zL;muVgyV3)9AE2PBc$wqnawP&OkNjpimzP=c(|hMB-mNz(da$%_Eqe~k@E5YQ<VAW
z`ttNC{RO5f%0M(#g(a+7hcLq-j3OK$`v((;{Xu+RR`<4`lEEv5OD|2hQUuGgtMyk!
zU4<io06G8}4;HlO6c}zU%ajg$G6qltesak!r?@zz6I8S4z?=IFKX5w^p&!b2)Ui$=
znoKet!d*$ULkd#QLGu`+Vn|b<4VlfEi6LX^aM3g+3U+IIK5|uybBRn<t8)m{epx@<
z?4bCH!ZUE8#)R{bCep)?*xgEg$odFtxZBihRD!)u&TU69Qq^`dT}P=NWYXphidagr
za=A%&t8l3J;uIZN<=!#HFwGT3STAoQ!b61?auiea$bs>7XmK6FZS48E6ag>w(+e#J
z!><lj3}iC&P_d91m2QJ&1-*9;gJnJ9qPq{V@IVUMjQpjJ!f8u+|I`Dv`Kj^!6C#S+
z4pf>8Y)5i>h01_yL^1vOF7;CtPl&l9xDF*^E(cYC{G}v+#`6Z)bgq$78LtHo3+X5K
zZN?3%pg(kWx7JNS4;IqE?9ZQ&4Z^ezW6db=NE#Q0)b1p_`n*|<OgcBwe7XgZ))U0t
zti_*8l*$nwA|`fCu_Tpy<siuO2^EU9qDVL<rsu6n-yml$Lh}m6iVzz~V>BS(Vo;n|
zU5XnqBkmxXrD`q--frnAU-Ozm#c@(EQBXFK9U}GdG-)dT@CsHb-yP4RiMtu#B<OV>
zzjW7b;pJwgi+a+?R0Hd~9IoAJ&48y^Rf<~ot{q{k9WMYHoCQ;MG%!{jBFJzW7uF0d
zgxN6w*T{ZzTRquY6Dw1e1r#P4FJ5>l2-V{t**?o&Gj=_|jC+X=@cZvdc1%sgDQloa
z+bcmAraEZGv9$3}h23W==(rpau!ihJu!^ojv)Fsw)p?H9BD<}^ya>zF4WS6E{FtV$
zX9jK`9k{j@Gb?7|1e!Ek5uX$ZV{c$DZU;Olk8*^K`Om21_AiAYe6Z{k@mPvg`}X@M
z6(Fo52$85MOo0=vI`I2E(nVY!Z(}BCqL>kDa^>du!wJ<~k5~gr^1YHpN423N6|-J5
zY6cYP<m?bXzuR8EzH+P~q+CwW6W{K5GzZ4BU~a}5-K?Xmq+7U1>Eo(eR73BtGE9F)
zc`I7#@9*mB%2mkA4dCd*zoQ7>N{njix{)fy6jKOq>PoY*imnef%0iBIbsD94#(jDD
z@NJXA8%dw{JEcrdXfu?7UA9}0?QZ!2_l+AsOt+kbv>*?j4scAvXgYaJJAu8Zb%|*@
zK(M<4kx!W+g(yKx5d?Ae<etj8L&<5xQwWQ}0G%SLZUdQC?7!;xE<|hHV`?)@xj*ns
z%Z^G{tIOEBgNfN#?R1Lbchi>I<`~f^fZ`N|ubGIX?Ew)^;B9giLA+)T&jV(3(uBzG
zpQ^O>qQtzkq($5!w1hEUb8Ar|ojp0y69KvKMcdriP%%)WQ=KQP+@o=(qI`ejsg^qF
zPnq98dRl~Ghu~C!M8akY?g~8oI!%G9PBzWSDsZoXPPV#HjLVJQUz197=eRYjhlyYk
z1wp7xZqWigCwf}MKpXOMM~fnwiF%b>-v2d{z%3(oeBP)9ZndS&S%Pa<rz#L&aTKZv
zXc|Jn&Al&2S1!<w)Q&WBlF$*E*(p@%Mzd&|B6!XW?v+{J)f$1|ZFVEI!j~Iyy#sdw
z9c3v_UFf}FXP4uFQEGs1;8V{u7!Rn3;0g=9gYyCBX;B(Ds{D1-50)_4Dt<p57>q^J
zfoShoI&ff+VYi8tyUn`_NyzdSkYE%6Q1w_p$UYHkrR{x*phjx%zhgUa2SqqFDkIJr
zHj~S?$oD#zDmAWiVJ0BkyWrK1*@w+zsru=XfcBe%{6bd_a4<~#=B}udnih0`c?{Gc
zo^tLDJy=DK?S^q;B8iAZtTYATFusmYcI%oL!k!}stR*4W*W%Q#I|-~iAr{kvy2pBx
zd_*mVT5F2P4vRyz*U~z6GAz8!nHpm^g}@M&MA9w`H*7O(1gbUS*jHhL@!A{&=jXhI
zK00A^^~q=ME#~l(S(C7b<{sX6Z{&`D0Qs<`W~H;DiAmSI4bNRM=N?F;166BLp~o=D
zwjBPk(ET2nGDYN_&K3lu>nVG%YCB3)eJ~sqK~*bs^0+0=|7wh;No53Ei*4OkeX&z3
z<$3Nw;zi=GcwbeI9$EF-(2ys?ibBQRMKU@D07x;XM6`(L6k*f|1CdmvITX8xThFZt
z15@%ql(HQHwxG)LC0HhBZgSB!r2JLRH4oQs)VKSZj$LNQdOZhwOxZ2x+s*Ctc3%@@
zzZ=A_6w6psZSsxKJl)k7_H=i2`?$Q9;Q#T9uz48}fcrnw>|15G*(4nx;=0jrFt|Gd
zFQlc8u|=|AhVi|$J>=e~4gBN-?5R1tz%<6ro*Xp0coS2w=}j?+S24^zLqWymr$X9W
zk|I{0Th@Q$UfGmK?qwk6`{vc=2~A&eD^d1N5g18w62z*F9vrLV?6>RA<xn=%I^-GT
zN}Z~YMz+W<(wIPtxm^vb+;;W;`ltXL7i6oV+z3&ox&(aq=W)2D!|@FjZI~)~VC85I
zFxrf&q$*S3JqQ4-?3_JFX{quiDJXU0nWzRt8-Jv*yOuDyyRx&Ih5{u?VmvSgjM`~(
za=aVCL2Kf4q+RmTDFep|m0fgKiv&frrW^>CjcIk8eyu@Z?LkJ0tBhdnC~lpt;)*nx
zeu|PcrTz|<vj~&oR0CEOsKqv06tioIfN%mWve*uHwaH_Xe_<9eQc+%TFfhlf&BvOl
zlET^%jEfItA+tt?YGFmm2EFrS(S@mBY%{v1otV9D1(hV%4zMq^z?vw_pyRT319>*P
z(lgU74r`qJQi#viW3kdxXv*J`tn40!Q0v>_()A<H_n^4HVofPMoJe7+6FIlXE|(YM
zOhk4dVx~4D%du*p?_6#Sp1t`PK^`5A+e3vBP&^m}!8EtiEVf0Od@J?}!M`D^TMITk
zPq|h^3=s;kIz1Yu4hzFoO@|IZO059Q&R;_DQJtSoVHK-E-9k)ocToMxMn0&kO-_E8
z!&^5J6Ip;g1nwcfH&wb=Kdi}4FoS(`n#LnH-$xSY0L)`nBGxLUV^%OkkZA!OCC*7P
z>p-#g6SB-W-&Q&;%_>mlQ>f>OV!B=1rmtt4NXYn5r3vh9V*eT2=?}LpMFKbH<B&(z
zxh13;95_4EGxcM|W=4Z<+8Z;BVJ2)S_gi=<*R32mBF3l8xR!@LIw0d$D!6N5MGi-5
z;)MD|oVi>JdCLk6tuDJti2(GG-_cspgQ!opD0E==UF)_-W|+n^Kn}=*b!6XsNBlZK
z<A4#e1x$B~Yn`}1gibke(vXX`s4la~txYlo7Zs`oGMxoa?wnX~;-w+ngTCA&FL!C7
zC}y2baIDp!mW0RmNvf3AQS$C%Xf#nYUJAT@_w<h8M3@|wJA=qZDOrIaoumcq7Hc9Y
zWdvlWw<HnX-J0Y?ev0zS-H-9RME<-MLzA%u1vamaV693PT2N%>94T?p3I7nk&DgPK
zU*hs~4}~=vD@ur$0V64P*3}eP#|xM)NCzsY`e~$r)qA&h)IjIWhl#|Du2xXivH;cz
z<M%{yqC7QVF~_LEFUa$EHrALITVRwFNZ!KQ=>PyujdWUR3Esy9pBdLY;sQn=nL@@Z
z<bx?{apj{-#I*!1{@wf%$dhb^QBQ&>isV^xN~f6+)h(kvsJ;^)j;Jf?^atm?(a%EP
z<j4+fI4HG=D~-~muqL~YT0OD@trLlBVN`~lv$PQ!ay(SjZh^KJEGNE3pPukXCttv%
z5!zUn%(@2P?h}amjFmLvsz66;ZQZC^C<jO(fA5~^Pie<ZRWB1{5>hb<1D%eLjEJfu
zk<a9^QiVfGF`Z{9(Ou%I6BhcTDma#s7)`5SqUb<OV{BMmV%{FeTu-d^HlcCI&#eh!
z&>i^N=RvI9ut`b#6idk4q;b;5GOaqi5P}X~cuuO@oVTdOm}bCS7AhLYp?RT&X++aJ
z0LASvFgN2f(Cz&cbnDJ^LGY`n4Sj7x8M^~{JO>d!4vA#!#*4_(a+`Iu#a;t~3?QC}
z62eH(0T1L<8Sw}m*n_*?gk-@U0Tn22Z8<8Cv~OXheW-7d-F<;ItMI~et)c6X(LuZQ
zu}3ubK3j0&iH$LXqMhNq7}*}ma*jkU5!Q|8!*~v~BUo!sYC2Kam{w39WDOdJ=zyEU
zfte{xrB0e1CAZ6LZ}%KR5R@m*hY>(iSK`3FrCEs)8b4^J2NDQKCaP{D8Qs|@rjPH;
zRBa6*guu>FI45V8Xncc^{4gm;bTsZ`ovdZ(!R*lVAfLJ_rQK;e6B8Pyq5dmb9^kI$
z#v%B%#ISo`jkO3aI`N{Luasfx+h;}UM`@zqg{>Z2e6;eavu(5rTEKB(+o}UG#bjeD
zG~6Tn90^5D=5XDd*~deShrf|J&oAC{S`IR2{Sp|B^H>Ar;Bi=l*E396rxSlOAE`fZ
z6A9{&7HbooCUc4F;>@5krRm}@joXM~&@ro7o3(kFvX+F_lJZg?NTAxWc9xqEENdub
zovl3A3n=?h!nkW6srxA`HN-idf-_(r^b|P2TnfBXoV6B0MHe#4k%3~>RxZ7wf{H`I
zu)3}krwfe~r<D<+DefXAr;Z5Y2<=mcf{eT59nwIgmZoZap&iDphYsv*5y03^7?U@j
z7A)m5qXX~=@X)$BY!8Sc;F5EsAQ7|jww$V)wb@Hi>nR?DLK6<oosb?3AdiqrqH6J6
zRM9~#am*%cnzIeR7g<}$2qN1;;gs2WqC8IAJ?MQJN#m3#Q7uKq!D};!qHrfveoPs~
z4#s?BS}&ln*O&IRGE!X$XUO<oBv&^9J*B%@mZeh*Zjec&t#Hjteh_VPYkRu~_EHbE
z){NrZow(f{k(8LMU^4z9xqqgjWV7Fg*fC5TF&p>s4v-2y1MKd}V+=cqMBv`Ulbm)0
zn+@ndaqtvCAN?I!3XSiS_j7Q$_kwAu*XA{8a%1$c%Bq!N($?Z}mp-xRu}0(0%TxBp
z>|Y*xT@U!<$PpiKgMmGG&=!P(uIU${Xe8$qI-r9W#Sy%SPBfceBmWAqyR2Am$RMqZ
z$Ng~CMo6Jnk>s-;P`IJuYQydmmob_U)_(})##zZ~R)W<V*7PDF6SZW>l@U}g!fRMt
z=>CbX>xnaNCKH+}q<#Ur8p<VbSQ9B8DO5(xTD9%#2yz&2$b<XmPRY+zyn2ciO*DB8
z?yALTspFg{F_J{-vDmI`$+ml#f-ZHp_y7lZTh77Jy0RoCi@|1(0C*%-?@Forgsldy
z16lcD8o~nH5kcXp%kv1j%R;NC)XddK(+*ItfVYXQ0+6mQpJ=O$x=XzQ#u8KbP+du~
zZR2<z?uvq7TqP#3Ys*xu<WAn;s(%@&qK}|AuAtmBZPzap{G`%jJ3Ygl;fv#u-SSW_
zs@4#d;Tcwc80CSFoj~!fL-@nwo`XE-RZUZ8VmT)PAJMEw9_VP10v{0jdGK9Z8A0%v
z+L=HSqEmx2N#s1T>x7TyrTqe+$f0#J{>~?1!8xx;m9aVEAYsl4G62tyYAIDFYaPUB
zbkWqvUkX#HI*^Fv@kVwi>F`vQ^pW1WC3cz-t@m_U9miblp?$Zn9{Ex|T4yJw)oD3Y
zp#pHIPjsOH(2oR<3gz-Dqf8r*HHVZrfKKf>$6C^QHt7Hl)`S#{h@F)L%LC@J5#7f<
zJ&|>9ASVme9V!#t7ko(bXhCOYPsFT*)80vwyg^nd%J)wIWPg+vceR$*r~>LG)}ab3
zQSg!7AhB6nG0~{p>)yku<sIFD-~hfDlUumMCq<0*>c0CD1`!(6xsF=UAfc%WSQ9$X
zcNmKQ?1B89ytSlOavcRp2ac37ec81jAv?=Oi3V|6LY_hBRatLh2(n#Eow62tYXLHv
ze9E<C-0@tM)V)Ozkz;%(9qgA{<VLZmr&xWmY2gjX$+xkC0u8~dIlN61>#K+^wZ@~Y
zf#krhS$1%epwYS)a}Bb+dlI%$30R9cv;d@9Xa^`ViNsuXu&+I+`+Y3YjAuEWZ#i&W
zf2n8l!&`Jnk*9ibVwuN;kZncE(<Kq_)$-9i@iHj3`5WHs&rQOLx_Ui1()S!}v4FgV
zeJ}07rY<$UtEBEm=_a)Yig}A)da55CxUUGxTF=KluPP{IwfXyYSg8kIBG$zy^)#Ut
zX*%%v0krV;8y++CV>%F!_XxvkJjHbO;`sv*OrVK@VbK`%JPDQ%loHddQKY9yvD1|)
zDqpt!ob%{vn*9KGvsr*2|69$fGf{6AY8m>L#E*gSLj1=?+mhZSNz<_-%{+8K0IfWu
zOS*3vxS7jcfRRii?(NSWh$l5fwk=BcSECZ8ll=GIp0jMVIP3!qjM5I$1~RqMgqog)
z4yr4>yyr(=z6iFuVM9+Gxx0ko@ORK$nyT+gLcXOONqL45H5*}_u4uL>kseRnTO(CW
zmM@-z<<zE3J8hn$7$j<mfx+!4{uVjNw9)||U6~Wjh7nUDkk~*XDmwF48O6z%Vp&73
z?+`yoaZMV@mhH*Wsv$eR=1C#ck3b>QRjVCV9m;78&ViB<v5w~hf-Bow5ugC+VvE|y
zx)bOq&PzdbzV<R6YPNy={jJcW<k$q|F$z4^A1?$tS$ZFzw`$-n0#iC0>xy>oDOEfv
z`B?lU4~#V%YBnlZ+CCM=3N8KoGXxn(!V0^3&EbVU7T1y3ZSkGz>&s#TiBugwZ%N%E
zhd2DhDQ_J@L-f1oboTSa2b=~6tCcta`q=M?{dX%HJ7TiES{lhq+@6+qG4@YKG}VX-
zo=4$EX<9Cgs%bdEGhan5ZT4ny*NP<zGL=ArWCGG9xkw=>yu(ClrCnP9{>d_??~yjU
zkF+Gg7_+Gf8oyb5D+kujdB=e2NVe)hv3WR3?#4sw1NUPIX7N~tIdoJjH}zP6YB^zG
z3jNbLl&L8I-R8Dp1H6^GXnbQd!R1W16h$=Fp!nmYN5n|yt+{=<Y>;lo3sVIs@HRUX
z8`X2LE;kZiliTS`$c2KNT+QA);?yf+=yj*~mIEWr=W_XJCq95#ow>rzl7s~+npCda
z4c`t)@I>%zxNC`HPratdhHJ9=7T`MkNZvRnV1af#v~N}o+#sdg*~0UN9$Vz29s@}`
z2cckMbw&afPQXnnkyP)IOtnTFhnfv!ib&pYqQX{>g0p_IE2T9d!1QKcXJc%q-Ofew
zb6Z?w<%Yt!ZH+ZJJ`B4>bOL3x(ugKz+<LICU4ag!GnBQIP^m>NQ8Mcaj$!~=_gpki
z%=hkFC}w3m3~Rod+Jabg5=_O<p?Y8p24qh<U^Cc^u7JMxu1{jGQ2dCquVteTj%fN3
zQ@EDH5MG#0!deeZh&Jd1(3DW!18g2N1gHe>7DHK*FVNl~M1AT~_IV%#RNmxgifQ!3
zl3ZVBL_=m?o4RaN?Y_zitN^jet`a_pN$Eir>lS!zqr)|iGGzaZ@QOHXW(;X*Qmw&(
zxwW_!5%OC2bxld=mu;&RKT2x{T#I3J1GeXbHPsmMvhaHyu>q7@DMiZ&J}S;zrYi6$
zri1{kKxyg`@X;?kTG{-OeA?G28Oc~rhRu4aOe2c=15*#lG=vx(_^t-6zWrU%et#{+
zVQ4k#^zurM?6<7;sZ$N-=PHG>!li=7Ur8$2q`<Ojqn;=5e<s*@K>M(6)>awEF+gih
z9bV9?^FT%-jvP*bqL@nlkTLVyB8DGypcK1rw?GDbu%m~)ID+%Qu}^}1M0BJI<aA+~
zDOv?PJXD8?X1$%G;5lgB%CK=z`4r$pz2&qAGyHD$OUHb-qh>mq5o2`;d`e;0lzxV(
zyaZ7PMi>Zh5pi!roC)m@g`*g0ykH<9r?s>)A>b6xvRzX%MK&^&73)eit&gkR*uA>t
zG_Gkx6h(-Fog}q{x`F**mi=fQiVs8Tv7Jw;b1>-<mm3Q>75d{qQ%klr(=3Xh0(lkl
zeci2~Hn>Iy9yJ1=n$g77!}B`U1+^6QdPto|N&iA)r({15zD&6ltC6BU-%0NNa$LWU
z%Z@r7pI|p#SkK=p3Iw#0Ga*&^{WB3yJ%A0Q1Ha5b3gn+D!fx!G1x;+g&*WKryA~T{
zP$#wsdA<O9J3^%!$MFQK9#hL{%VFxtr^N+<gr>Kedx*#=6t6#~PBxjHFiwS0l-j3u
zqc@U@131fN9Lx;I0MsceHxzjMG>T=P<5nWnmGo?mQ5CL0@jNk*uiOJdN=?ctvcwL1
zhLX}AB1vG0pQ}u2QANW-heS*_qe*Kli*$hVD-jGPq9R3NJIurvP*aZViQQUSl-1l0
zH235ZAl4d%yDZO*BI091<+1wU5QUStSq_V&$~%*|&AM{Aa2{ezT|p^bX56#^NPJ~i
zU<2o7lsXV_Wv2*7MC~|Lg_z_+n?FsNXj@BYtg8VtdM!J<x2&{~>MeHwJacGQs1n%=
zt5)TdY^$;rLscjU9cXM#QbvQ$_{3WSB=jA8^*}@&js+_MMqUYqI(!QU>QRrDl~83T
zH2vmIDm3erE^lXae22$U0|}gHxP#0chK<0L4DwbFia`@j^hOXTy1Z~np(sj5VuhwJ
zq{DMWb~8g2u!kwIWU58!V&<)^r(k5SWe`541v$N>{;+P?|FuA8x}#_VIW`I_Fc%`w
z>BvaVjaskd0?~#w^}u!+O~3&`!#3Ofgl{q(_>l#zzy4hjk8=+VIqZXl6PGcon&#E^
z7-y$w5mLLja&5Sy!{JrI{(t}i=v|)A)%MocSK0h@R$=DFB%4tt`uOi?tA7~qVGQH=
z>B|1`>mT{=fH{Nq9>6z8iw@iiz^yowt!TwLh&-P6e^c{k1D~2hpq(hPNw}2@6a?+j
znmZGH;&=M;Ze@-l*m9CGIaFsV)Nw!)`K7od5AQjwfpd9V+bdlew|*%OmUXlCLi)!B
z*Qr3jAJR+|{4Q50KO}IF)^y;@b{MP*T%*OH*l`5-bKLh3ZPpJ|h*i3Xs8({~IO<1B
z9@9#w2DG-4(%}T^EhDISbB0Y6B>o0_2}tU}jT9QX6xcyP4`9KWoI&FY>ZJo}qd-VX
zFK+!92${lcubt^Y))JuAOKRQTM}<tjD90)~(7yp7{_TC?Q5SU*#&xuf3VO}%gFClR
zX=u)O*gmcI@+<d>IFUX<6F7hHm+E+jd9~!^l>JwyRFjJCGgbYoy0<?gX;t%DBS%(t
zaHoLYZYzPI8piJV^4sll;wrZ{zCW#}-sE%ljjQSI&DkRzDU2r9zm<1si=qE3&+y+p
zZPsI?U^5Y91l4}R7FwN^dFjOEwd%{=8WmvY@j1-H>Y6*DA+2ZPe7jPQuydw~-TnA?
zZ^pkLe)y5;cXw6&zo5|XZNGW9LRBNoctO@@hRvYAgROOJ^!Oo_Q-^zKhGVsl)YxX1
zgl(9vo3<NA*7;?Z)&6RHGPUKdOJg8xv%f|_be8*ReE$ETj43&`U5gvVtHP;7Kyrzm
zA>T^5nO>qjoYeU7r|)ZY<Hc@PpG{$cT*2+ru`bEVM=lA<u|n)-V+}_w7(?tA2!b|U
z9{e@x@}E`2Dow&MV~$Vg*px%&apG-UJyimp#S&hmEBnBgxXLq2RG>_i-S(UAJ0c)+
ztB)&1AjZJ;GEY5?7siMid;rNPnRVQ+dvpGa7W~vuY-ER$2&zMX7XiU#XFm<;sD}E6
z`a$JVxB48h!(R=r#kj9p8Wtz$*+{0US{Yn&l?YR2`2B_S@(okl&R$1#Q)sn0rZKq%
ze%!<jmv4JS+W(PinPN%l<eSf1s$8CJ*EOmh9ASVAvkoI7Zd*2Up2kC!gn}1SQ1C*E
zg4z}6hZbsCL-`;teHAjYQZc!-_%BcpC9)NAalUOrTg{9#&FH|H@Al9h7km`%M=)d&
zOXbMYf&AMQxVg0s6!rDboseb%bYMtx0!0oaAZU(*3=nZ-Aunqo$14}qAg9m)r29__
zr9rzt*3DD~Ama)0?lNj23;5sHuaj&6bbvPn;VF>9xXj{5;1-vurcIDrGw)W^RjAJh
zpQ~2*<)%iniO9PVmiR}cGww5OKO;E*(!nsi1t**+TvPmov_0eAlC)WJ;*ViZ8vH?E
zH*tpF`pG0q?KkwR2mDj2ZOJF4ZDjnT9R``6|7Xt1|NW=+1?xqG@tHz_f=;z?l`KP7
z^845OCvGl_!&BwmbB&v96s3~!HtEDO(MI=%*$N*$Fzyw7b?Gwf-?rHHFSfmYH&`t}
z-dUolQ$`ajF|kJ9GCGz&FH8(h=_#(tm}Oo{AD^pH#NUr-__*u$EzBQ9j_iYss><Y6
zvL6(Ae)p4MtQoXeCo$aImk~Pf;3wE&$X%Wm2#D?dC3HakS4xOGZHr+cFh^#Y(JX%w
zhfT9}T^(G8XsMb@Er-a(dmFb9K$)QNc%y#ULG(KSd3}S+q)O`kDcrZ05Jh!9L&n=g
zuM>E(7UHot#N&T^SD5Z4cJL#_mxOZ3>EN5a<m7w4n@`H@Ldv5u-`681XPsVnt5SZ1
zy7)$MNvB#W>h3Y;Y5G_6jNu(-qWznlyU8I+;GM51VhBO5xhdOr+%R@Z(<WbAda5xf
zSCt8w>oeJ5uP5-}Mv)v-8APG~BD45Y#{HkV!sFJ{!jn4PKCAFbOOcZOrXHfq$@<2z
z^1_!5d>&R8ZmaQC<RnS)uYUWY=YK8fk?x@bgRH+BS$iu%v5d~cEcco()u&Dyse=yr
z>{m)>VlEE5d^E9{{P>I%ME-0vAlyF104*qWyd$G`_b8&srj@vF#SnCC93k&Euc(*C
zUbjZO_!EAd^6jnbf(;NxRbN9e&V*p>iczCQWFSD9iPj$$5CD%<vOoyDK!W_@sVzEi
z_$Q8|AI#ymIqadmk&X}sO(6_cH;Y11P?Hp@fES+n6vDBPRU~fVknhiTHXs-CfilF0
ze@AydU8O*GV@(O*B$W<qT0uZ{ug1A7YuurDsegQ*W3`EX3?#dMFuclFb+t?)AmArX
z|8wsA+lkm;k`#IXbME_TYwwLivpSU+<B$@g@dEKnm5ItGPpADeuY28(5Z<r2`_;<D
z^V@MrXmicKYEpjNwg0qd#PAC^L4-xEVa15k8s5f%4NVYQy%|;0%Fl><te2JMTSzs!
z`05LPVEm@8ANDoy(w@@)9)9)Paw0_+T8A{yc|E9*&q=_Y3J6g;-*PW&N5(Wpwt8&+
zv);at_Tkev8|3Ti!~Ah>U=oC8H1q-m;Z!B=`+05FNtz^X(5@W?nnCy;g<NJ_9DZGh
zY(^9KNeUG~AS9Qlw!5bpvW%iOAu9Fj0f_%stuVaNWlcd5v_=IzL-}^l)Po`?Z}Y@H
z&$93gD8F$g5k{3deg1|tf6Y4|5!Ivu9ggEl4XjT8ngKyp(l|^!iQV+eQvz$`PH=~$
z_si&VJ>+AoT|Vcv8D!jNU4HwAj{cJ^)<TA))I-9q+B`KY(Axm53kq|&R9Q$)dCCDh
zs4nz2CkC=Z*;gT9l9>Q#4NydB5wq-&kPC)H(3ku$SPfMl5^nVoIC2goxk{lh$N#lv
zAiIb)B{mXki&jCg8M$jJRf?9b)+%_4X1o-+gwIL;)<--^Ot_VJvs>!!*|^U(#CtmW
zz<&#G`uhZ_m-+z3O9v(@qJOUT8w1}&{wgx|M_Y}pcY7S#U*rW@CZ_-+C@v=WGd#xE
zw`H*FA4>=Hi~dsh$KUn<5(}X*VJP|}olgJTbd>$NLr3kQcV2POTe5smTD?ENjO&cP
z>H5cXvHzP*4|;+1PO2%CE>$pU%kZPbH!a`CG`4)H2S9+{9)7(8x6*fqZKZCxhz`$&
zG2LMEX-k?DIbkFk!NG45{3Rsk_RZtd_oKJCrr4w{&P4FuKJbWmy5fR=)8if4H%jTo
z=QyP$^z4qhr;8z^pC>#TzEOT@&lJbe97!XAn!|ctUS<27JIBp02%L!ZzgppMRIahK
zw?ZzsP`>T_zH`3p={G$O`Gkdz2@LVPwMluN<3GfBqSIWPeOTlyV?^s~A%BlhG4}`I
zHG;S7UY%=d&{cKI{?MeRzuwbW5g9bvbK?hli<A9q?WGWjEQe#-HXSy<D4Uo0zvMkD
zUvP8T;q$A@b0IA)A<fOQm^qJ48*^v4&&Det^yO~w%HWctS6_e`<Cgu$2Kjoculn=w
zzLW3r@1Dh;#vXT!DLMA2=luGh)Q@BMt~JGX4mot*5^i7R_+Ao&FYFCJmh4*nj}xc8
z<62FDUdIMRpx3u~{~D54Zru1^ME>b5aR7LnYWg#OVf5CXAlC4mhc~w)JM#81pG!O<
zG8&e>V&mz;S7aEj#J7@Dl%>eA&f>74dT7wuUrHkRvCG)ZFU_&NDZ0;U97r`h{EhoK
zj^%zn7<t)wvEwE0L>5eT?M#fzX%8%ydEBYI6C+5c(n|>nQa8hd4VaIdF&$MbJY%Qp
ze52>)<)VbA$GW_y-dSII-=SAq&&`}#a+_w^k$m93c}{Jt_Awbn^=<s%@u?gbT6HHq
zyiOf$xAt73rKshms@|Qwu2wyb+I-6^yYC~cZhBh$@`@!mYyWCM#i!a!US66<ey}+R
zr{sO=)OLtioTxvp_{367LH&iGMa)-uB>AFCF867eW!!ryH^yU^(V|&THWe-m<3e{E
zc6L|SwsMWDwcf|v^voXrT9*T3QA|z>X?xS&ag5M&kCl3{{A|8k*u2GD_?0d(-}ijs
zWOn=wXRXEao5xkl*@K06#th&sa{*29@R+&KtX|!^3e$*G#N3Njs4L$Nrmg9w*Rk8l
zt(}54{=+}sadH^I|MJc1Bx>2E_)}*IB%A+~^?-p<0TRytI5+oSp5q_R{z0a0bCbVq
z;BQk0|8)cT5LNyvk??OT{%!8mzpgk1<=*-IOsc<a=eG$p|I!jS``@M4{B7mm=0p5T
z<wVY3EB{?~#NW2?+hlitX@Lyo4}ymA+thczZQ!>VhyK#Qb0|Y2)PUcg^AG*D>Tff*
z{H1Cxl*8hWnMMCDkINrg`Tf)ve`%!<O5pcr-TSwRFn-&Wzg5|PX#xO_S^iZce^TJT
mt^T*-^{=aUS^rh_KMGrOlRXebex|DC1iB#`A=B>XU;iJjUV;|@

literal 0
HcmV?d00001

diff --git a/static/files/excels/cmdb_excel_2015_12_01_22_17.xlsx b/static/files/excels/cmdb_excel_2015_12_01_22_17.xlsx
deleted file mode 100644
index 37718bab375fd8f0f1228321a03d78923e381f02..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5898
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
D8uumu

diff --git a/templates/jasset/asset_detail.html b/templates/jasset/asset_detail.html
index dd5305d8..53f9f357 100644
--- a/templates/jasset/asset_detail.html
+++ b/templates/jasset/asset_detail.html
@@ -193,27 +193,29 @@
                         <div>
                             <div class="text-left">
                                 {% if perm_info %}
-                                    <table class="table">
-                                    <p>授权用户信息</p>
-                                    <td class="text-navy">授权用户</td>
-                                    <td class="text-navy">系统角色</td>
-                                    {% for perm in user_perm %}
-                                        <tr>
-                                            <td class="text-navy"><a href="/juser/user_detail/?id={{ perm.0.id }}">{{ perm.0 }}</a></td>
-                                            <td>
-                                                <table class="table">
-                                                {% if perm.1 %}
-                                                     {% for role in perm.1 %}
-                                                        <tr>
-                                                            <td class="text-navy"><a href="/jperm/role/perm_role_detail/?id={{ role.id }}">{{ role }}</a></td>
-                                                        </tr>
-                                                     {% endfor %}
-                                                {% endif %}
-                                                </table>
-                                            </td>
-                                        </tr>
-                                    {% endfor %}
-                                    </table>
+                                    {% if user_perm %}
+                                        <table class="table">
+                                        <p>授权用户信息</p>
+                                        <td class="text-navy">授权用户</td>
+                                        <td class="text-navy">系统角色</td>
+                                        {% for perm in user_perm %}
+                                            <tr>
+                                                <td class="text-navy"><a href="/juser/user_detail/?id={{ perm.0.id }}">{{ perm.0 }}</a></td>
+                                                <td>
+                                                    <table class="table">
+                                                    {% if perm.1 %}
+                                                         {% for role in perm.1 %}
+                                                            <tr>
+                                                                <td class="text-navy"><a href="/jperm/role/perm_role_detail/?id={{ role.id }}">{{ role }}</a></td>
+                                                            </tr>
+                                                         {% endfor %}
+                                                    {% endif %}
+                                                    </table>
+                                                </td>
+                                            </tr>
+                                        {% endfor %}
+                                        </table>
+                                    {% endif %}
                                     {% if user_group_perm %}
                                         <table class="table">
                                             <p>授权用户组信息</p>
diff --git a/templates/jasset/asset_edit.html b/templates/jasset/asset_edit.html
index a2db11d0..87057973 100644
--- a/templates/jasset/asset_edit.html
+++ b/templates/jasset/asset_edit.html
@@ -46,6 +46,9 @@
                                         <div class="hr-line-dashed"></div>
                                         {{ af.remote_ip|bootstrap_horizontal }}
 
+                                        <div class="hr-line-dashed"></div>
+                                        {{ af.mac|bootstrap_horizontal }}
+
 {#                                        <div class="hr-line-dashed"></div>#}
 {#                                        {{ af.port|bootstrap_horizontal }}#}
 
diff --git a/templates/jasset/asset_list.html b/templates/jasset/asset_list.html
index dac011e4..175271e7 100644
--- a/templates/jasset/asset_list.html
+++ b/templates/jasset/asset_list.html
@@ -127,7 +127,7 @@
                                     <td class="text-center">{{ asset.group.all|group_str2 }}</td>
 {#                                    <td class="text-center">{{ asset.cpu }}|{{ asset.memory }}|{{ asset.disk }}</td>#}
                                     <td class="text-center">{{ asset.system_type|default_if_none:"" }}{{ asset.system_version|default_if_none:"" }}</td>
-                                    <td class="text-center"> {{ asset.cpu }} </td>
+                                    <td class="text-center"> {{ asset.cpu|get_cpu_core|default_if_none:"" }} </td>
                                     <td class="text-center"> {{ asset.memory }}{% if asset.memory %}G{% endif %}</td>
                                     <td class="text-center"> {{ asset.disk|get_disk_info }}{% if asset.memory %}G{% endif %}</td>
                                     <td class="text-center" data-editable='false'>
@@ -144,8 +144,8 @@
                                 <input type="button" id="asset_del" class="btn btn-danger btn-sm"  name="del_button" value="删除"/>
                                 <a value="/jasset/asset_edit_batch/" type="button" class="btn btn-sm btn-warning iframe">修改</a>
                                 <input type="button" id="asset_update" class="btn btn-info btn-sm"  name="update_button" value="æ›´æ–°"/>
-                                <input type="button" id="asset_update_all" class="btn btn-primary btn-sm"  name="update_button" value="更新全部"/>
-                                <input type="button" id="exec_cmd" class="btn btn-sm btn-danger"  name="exec_cmd" value="执行命令"/>
+{#                                <input type="button" id="asset_update_all" class="btn btn-primary btn-sm"  name="update_button" value="更新全部"/>#}
+                                <input type="button" id="exec_cmd" class="btn btn-sm btn-primary"  name="exec_cmd" value="执行命令"/>
                             </div>
                             {% include 'paginator.html' %}
                         </div>
@@ -347,37 +347,40 @@
     $('#asset_update').click(function () {
         var asset_id_all = getIDall();
         if (asset_id_all == ''){
-            alert("请至少选择一行!");
-            return false;
-        }
-        layer.msg('玩命更新中...', {time: 200000});
-        $.ajax({
-            type: "post",
-            data: {asset_id_all: asset_id_all},
-            url: "/jasset/asset_update_batch/",
-            success: function () {
-                parent.location.reload();
+            if (confirm("更新全部资产信息?")) {
+                layer.msg('玩命更新中...', {time: 200000});
+                $.ajax({
+                    type: "post",
+                    url: "/jasset/asset_update_batch/?arg=all",
+                    success: function () {
+                        parent.location.reload();
+                    }
+                });
             }
-        });
+        }
+        else {
+            layer.msg('玩命更新中...', {time: 200000});
+            $.ajax({
+                type: "post",
+                data: {asset_id_all: asset_id_all},
+                url: "/jasset/asset_update_batch/",
+                success: function () {
+                    parent.location.reload();
+                }
+            });
+        }
     });
 
-{#    function update_tips(){#}
-{#        layer.tips('我是另外一个tips,只不过我长得跟之前那位稍有些不一样。', '吸附元素选择器', {#}
-{#            tips: [1, '#3595CC'],#}
-{#            time: 4000#}
+{#    $('#asset_update_all').click(function () {#}
+{#        layer.msg('玩命更新中...', {time: 200000});#}
+{#        $.ajax({#}
+{#            type: "post",#}
+{#            url: "/jasset/asset_update_batch/?arg=all",#}
+{#            success: function () {#}
+{#                parent.location.reload();#}
+{#            }#}
 {#        });#}
-{#    }#}
-
-    $('#asset_update_all').click(function () {
-        layer.msg('玩命更新中...', {time: 200000});
-        $.ajax({
-            type: "post",
-            url: "/jasset/asset_update_batch/?arg=all",
-            success: function () {
-                parent.location.reload();
-            }
-        });
-    });
+{#    });#}
 
     function change_info(){
         var args = $("#asset_form").serialize();
-- 
2.18.0