ソースを参照

Accept Merge Request #33 v1.0.27 update : (master -> test)

Merge Request: v1.0.27 update
Created By: @seirios
Accepted By: @seirios
URL: https://coding.net/t/aft/p/AFT-WEB/git/merge/33
seirios 8 年 前
コミット
f463dd4247
共有100 個のファイルを変更した7349 個の追加417 個の削除を含む
  1. 8 1
      css/base.less
  2. 23 1
      entry.js
  3. BIN
      html/css/iconfont/iconfont.eot
  4. 922 0
      html/css/iconfont/iconfont.svg
  5. BIN
      html/css/iconfont/iconfont.ttf
  6. BIN
      html/css/iconfont/iconfont.woff
  7. 16 0
      js/admin/achievement.js
  8. 16 0
      js/admin/demand.js
  9. 788 0
      js/component/DicIndustryList.js
  10. 47 0
      js/component/account/achievement/content.jsx
  11. 40 0
      js/component/account/achievement/leftTab.jsx
  12. 325 0
      js/component/account/achievement/techAchievement.jsx
  13. 72 0
      js/component/account/achievement/techAchievement.less
  14. 870 0
      js/component/account/achievement/techAchievementDesc.jsx
  15. 2 2
      js/component/account/bottom.jsx
  16. 47 0
      js/component/account/demand/content.jsx
  17. 40 0
      js/component/account/demand/leftTab.jsx
  18. 311 0
      js/component/account/demand/techDemand.jsx
  19. 72 0
      js/component/account/demand/techDemand.less
  20. 625 0
      js/component/account/demand/techDemandDesc.jsx
  21. 2 2
      js/component/account/services/achievement.jsx
  22. 2 2
      js/component/account/services/activity.jsx
  23. 2 2
      js/component/account/services/activityCostList.jsx
  24. 2 2
      js/component/account/services/annualReport.jsx
  25. 2 2
      js/component/account/services/cognizance.jsx
  26. 46 147
      js/component/account/services/contract/contract.jsx
  27. 14 86
      js/component/account/services/contract/contractAdd.jsx
  28. 9 9
      js/component/account/services/contract/contractDetail.jsx
  29. 1 1
      js/component/account/services/copyright/comPatentAdd.jsx
  30. 26 16
      js/component/account/services/copyright/comPatentChange.jsx
  31. 2 2
      js/component/account/services/finance.jsx
  32. 2 2
      js/component/account/services/honorList.jsx
  33. 1 1
      js/component/account/services/intellectual.jsx
  34. 1 1
      js/component/account/services/intellectualDesc.jsx
  35. 1 1
      js/component/account/services/orgList.jsx
  36. 2 2
      js/component/account/services/orgTechCenter.jsx
  37. 1 1
      js/component/account/services/patentAdd.jsx
  38. 1 1
      js/component/account/services/patentDesc.jsx
  39. 2 2
      js/component/account/services/ratepay.jsx
  40. 2 2
      js/component/account/services/standard.jsx
  41. 2 2
      js/component/account/services/techProduct.jsx
  42. 1 1
      js/component/account/services/technology.jsx
  43. 1 1
      js/component/account/services/technologyAdd.jsx
  44. 1 1
      js/component/account/services/technologyChange.jsx
  45. 5 1
      js/component/account/set/ablt.jsx
  46. 1 0
      js/component/account/set/base.jsx
  47. 1 1
      js/component/account/set/changeMobile.jsx
  48. 1 1
      js/component/account/set/changePassword.jsx
  49. 2 1
      js/component/account/set/company.jsx
  50. 1 0
      js/component/account/set/edu.jsx
  51. 1 0
      js/component/account/set/group.jsx
  52. 2 2
      js/component/account/set/hrSituation.jsx
  53. 2 1
      js/component/account/set/person.jsx
  54. 1 0
      js/component/account/set/pfs.jsx
  55. 1 0
      js/component/account/set/tech.jsx
  56. 3 3
      js/component/account/topTab.jsx
  57. 47 0
      js/component/dataDic.js
  58. 2 2
      js/component/login/forgetPw.jsx
  59. 47 0
      js/component/manageCenter/achievement/content.jsx
  60. 40 0
      js/component/manageCenter/achievement/leftTab.jsx
  61. 325 0
      js/component/manageCenter/achievement/techAchievement.jsx
  62. 72 0
      js/component/manageCenter/achievement/techAchievement.less
  63. 905 0
      js/component/manageCenter/achievement/techAchievementDesc.jsx
  64. 2 2
      js/component/manageCenter/bottom.jsx
  65. 62 0
      js/component/manageCenter/demand/content.jsx
  66. 43 0
      js/component/manageCenter/demand/leftTab.jsx
  67. 421 0
      js/component/manageCenter/demand/techDemand.jsx
  68. 72 0
      js/component/manageCenter/demand/techDemand.less
  69. 792 0
      js/component/manageCenter/demand/techDemandDesc.jsx
  70. 1 1
      js/component/manageCenter/index/content.less
  71. 19 21
      js/component/manageCenter/servicesManage/contract/contract.jsx
  72. 15 3
      js/component/manageCenter/servicesManage/contract/contractAdd.jsx
  73. 9 3
      js/component/manageCenter/servicesManage/contract/contractDetail.jsx
  74. 1 1
      js/component/manageCenter/servicesManage/copyright/comPatentAdd.jsx
  75. 27 18
      js/component/manageCenter/servicesManage/copyright/comPatentChange.jsx
  76. 9 7
      js/component/manageCenter/servicesManage/copyright/copyright.jsx
  77. 2 2
      js/component/manageCenter/servicesManage/highTech/fosterDesc/achievement.jsx
  78. 2 2
      js/component/manageCenter/servicesManage/highTech/fosterDesc/activity.jsx
  79. 2 2
      js/component/manageCenter/servicesManage/highTech/fosterDesc/activityCostList.jsx
  80. 3 3
      js/component/manageCenter/servicesManage/highTech/fosterDesc/annualReport.jsx
  81. 5 4
      js/component/manageCenter/servicesManage/highTech/fosterDesc/companyDetail.jsx
  82. 2 2
      js/component/manageCenter/servicesManage/highTech/fosterDesc/finance.jsx
  83. 2 2
      js/component/manageCenter/servicesManage/highTech/fosterDesc/honorList.jsx
  84. 2 2
      js/component/manageCenter/servicesManage/highTech/fosterDesc/hrSituation.jsx
  85. 1 2
      js/component/manageCenter/servicesManage/highTech/fosterDesc/innovationAbility.jsx
  86. 1 1
      js/component/manageCenter/servicesManage/highTech/fosterDesc/intellectual.jsx
  87. 1 1
      js/component/manageCenter/servicesManage/highTech/fosterDesc/intellectualDesc.jsx
  88. 2 7
      js/component/manageCenter/servicesManage/highTech/fosterDesc/orgTechCenter.jsx
  89. 2 2
      js/component/manageCenter/servicesManage/highTech/fosterDesc/ratepay.jsx
  90. 2 2
      js/component/manageCenter/servicesManage/highTech/fosterDesc/standard.jsx
  91. 2 2
      js/component/manageCenter/servicesManage/highTech/fosterDesc/techProduct.jsx
  92. 11 6
      js/component/manageCenter/servicesManage/highTech/highTechApply.jsx
  93. 1 1
      js/component/manageCenter/servicesManage/patent/applyFeeDesc.jsx
  94. 1 1
      js/component/manageCenter/servicesManage/patent/clientInputPatent.jsx
  95. 1 1
      js/component/manageCenter/servicesManage/patent/comPatentAdd.jsx
  96. 9 4
      js/component/manageCenter/servicesManage/patent/comPatentDesc.jsx
  97. 11 5
      js/component/manageCenter/servicesManage/patent/comprehensive.jsx
  98. 1 1
      js/component/manageCenter/servicesManage/patent/correctionDesc.jsx
  99. 1 1
      js/component/manageCenter/servicesManage/patent/expressDesc.jsx
  100. 0 0
      js/component/manageCenter/servicesManage/patent/payment.jsx

+ 8 - 1
css/base.less

@@ -46,4 +46,11 @@ body {
 //            } 
 //         }
 //     }
-// }
+// }
+@font-face {font-family: 'myiconfont';
+    src: url('./iconfont/iconfont.eot');
+    src: url('./iconfont/iconfont.eot?#iefix') format('embedded-opentype'),
+    url('./iconfont/iconfont.woff') format('woff'),
+    url('./iconfont/iconfont.ttf') format('truetype'),
+    url('./iconfont/iconfont.svg#myiconfont') format('svg');
+}

+ 23 - 1
entry.js

@@ -10,6 +10,8 @@ module.exports = {
     'user/account/index': './js/user/account/index.js',
     'user/account/set': './js/user/account/set.js',
     'user/account/services': './js/user/account/services.js',
+    'user/account/achievement': './js/user/account/achievement.js',
+    'user/account/demand': './js/user/account/demand.js',
     //admin
     'admin/index': './js/admin/index.js',
     'admin/login': './js/admin/login.js',
@@ -21,7 +23,10 @@ module.exports = {
     'admin/servicesManage/copyright': './js/admin/servicesManage/copyright.js',
     'admin/servicesManage/highTech': './js/admin/servicesManage/highTech.js',
     'admin/servicesManage/highTechInfo': './js/admin/servicesManage/highTechInfo.js',
-    'admin/servicesManage/technology': './js/admin/servicesManage/technology.js'
+    'admin/servicesManage/technology': './js/admin/servicesManage/technology.js',
+    //admin/demand
+    'admin/demand': './js/admin/demand.js',
+    'admin/achievement': './js/admin/achievement.js'
   },
   watch: {
     'user/index': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
@@ -57,6 +62,14 @@ module.exports = {
       'webpack/hot/only-dev-server',
       './js/user/account/services.js'
     ],
+    'user/account/achievement': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
+      'webpack/hot/only-dev-server',
+      './js/user/account/achievement.js'
+    ],
+    'user/account/demand': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
+      'webpack/hot/only-dev-server',
+      './js/user/account/demand.js'
+    ],
     //admin
     'admin/index': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
       'webpack/hot/only-dev-server',
@@ -70,10 +83,19 @@ module.exports = {
       'webpack/hot/only-dev-server',
       './js/admin/userManage.js'
     ],
+    'admin/demand': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
+      'webpack/hot/only-dev-server',
+      './js/admin/demand.js'
+    ],
+    'admin/achievement': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
+      'webpack/hot/only-dev-server',
+      './js/admin/achievement.js'
+    ],
     'admin/set': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
       'webpack/hot/only-dev-server',
       './js/admin/set.js'
     ],
+    //admin-servicesManage
     'admin/servicesManage/contract': ['webpack-dev-server/client?http://127.0.0.1:80', // WebpackDevServer host and port
       'webpack/hot/only-dev-server',
       './js/admin/servicesManage/contract.js'

BIN
html/css/iconfont/iconfont.eot


+ 922 - 0
html/css/iconfont/iconfont.svg

@@ -0,0 +1,922 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+Created by FontForge 20120731 at Thu Mar  9 14:34:02 2017
+ By admin
+</metadata>
+<defs>
+<font id="anticon" horiz-adv-x="1024" >
+  <font-face 
+    font-family="anticon"
+    font-weight="500"
+    font-stretch="normal"
+    units-per-em="1024"
+    panose-1="2 0 6 3 0 0 0 0 0 0"
+    ascent="896"
+    descent="-128"
+    x-height="792"
+    bbox="-0.142858 -128.087 1024.37 896.923"
+    underline-thickness="0"
+    underline-position="0"
+    unicode-range="U+0078-E94F"
+  />
+<missing-glyph 
+ />
+    <glyph glyph-name=".notdef" 
+ />
+    <glyph glyph-name=".notdef" 
+ />
+    <glyph glyph-name=".null" horiz-adv-x="0" 
+ />
+    <glyph glyph-name="nonmarkingreturn" horiz-adv-x="341" 
+ />
+    <glyph glyph-name="x" unicode="x" horiz-adv-x="1001" 
+d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5
+t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5
+t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" />
+    <glyph glyph-name="stepforward" unicode="&#xe600;" 
+d="M327 820l431 -356v300q0 15 10.5 25.5t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5v-760q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v301l-431 -357q-21 -18 -46 -7t-25 39v808q0 28 25 39t46 -7z" />
+    <glyph glyph-name="stepbackward" unicode="&#xe601;" 
+d="M759 820l-431 -356v300q0 15 -10.5 25.5t-25.5 10.5v0q-15 0 -25.5 -10.5t-10.5 -25.5v-760q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v301l431 -357q21 -18 46 -7t25 39v808q0 28 -25 39t-46 -7z" />
+    <glyph glyph-name="forward" unicode="&#xe602;" 
+d="M575 790l436 -375q13 -12 13 -30t-13 -29l-436 -378q-18 -17 -40.5 -6.5t-22.5 36.5v377v375q0 26 22.5 36.5t40.5 -6.5zM63 790l436 -375q13 -12 13 -30t-13 -29l-436 -378q-18 -17 -40.5 -6.5t-22.5 36.5v752q0 26 22.5 36.5t40.5 -6.5z" />
+    <glyph glyph-name="banckward" unicode="&#xe603;" horiz-adv-x="1025" 
+d="M449 790l-436 -376q-13 -11 -13 -29t13 -30l436 -377q18 -17 40.5 -6.5t22.5 36.5v377v375q0 26 -22.5 36.5t-40.5 -6.5zM961 790l-436 -376q-13 -11 -13 -29t13 -30l436 -377q18 -17 40.5 -6.5t22.5 36.5v752q0 26 -22.5 36.5t-40.5 -6.5z" />
+    <glyph glyph-name="caretright" unicode="&#xe604;" 
+d="M393 820l489 -403q14 -13 14 -32t-14 -32l-489 -405q-21 -18 -46 -7t-25 39v808q0 28 25 39t46 -7z" />
+    <glyph glyph-name="caretleft" unicode="&#xe605;" 
+d="M631 820l-489 -403q-14 -13 -14 -32t14 -32l489 -405q21 -18 46 -7t25 39v808q0 28 -25 39t-46 -7z" />
+    <glyph glyph-name="caretdown" unicode="&#xe606;" 
+d="M76 504l403 -489q13 -15 32 -15t32 15l405 489q18 20 7 45t-39 25h-808q-28 0 -39 -25t7 -45z" />
+    <glyph glyph-name="caretup" unicode="&#xe607;" 
+d="M76 263l405 489q13 14 32 14t32 -14l403 -489q18 -20 7 -45.5t-39 -25.5h-808q-28 0 -39 25.5t7 45.5z" />
+    <glyph glyph-name="rightcircle" unicode="&#xe608;" 
+d="M512 895q-104 0 -199 -40.5t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5zM681 358l-235 -220q-11 -11 -26 -10.5t-25 11.5t-9.5 26t11.5 25l207 194l-207 195
+q-11 10 -11.5 25t9.5 26t25 11.5t26 -9.5l235 -221q12 -11 12 -26.5t-12 -26.5z" />
+    <glyph glyph-name="leftcircle" unicode="&#xe609;" 
+d="M512 895q-104 0 -199 -40.5t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5zM629 139q-10 -11 -25 -11.5t-26 9.5l-235 221q-12 11 -12 26.5t11 26.5l236 220q11 11 26 10.5
+t25 -11.5t9.5 -26t-11.5 -25l-207 -195l207 -194q11 -10 11.5 -25t-9.5 -26z" />
+    <glyph glyph-name="upcircle" unicode="&#xe60a;" 
+d="M512 895q-104 0 -199 -40.5t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5zM757 278.5q-11 -10.5 -25.5 -10t-24.5 11.5l-195 208l-195 -208q-10 -11 -25 -11.5t-25.5 10
+t-11 25t9.5 25.5l221 236q10 11 26 11t26 -11l221 -236q10 -11 9.5 -25.5t-11.5 -25z" />
+    <glyph glyph-name="downcircle" unicode="&#xe60b;" 
+d="M512 895q-104 0 -199 -40.5t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5zM759 430l-221 -236q-10 -11 -26 -11t-26 11l-221 236q-10 11 -9.5 25.5t11 25t25.5 10t25 -11.5
+l195 -208l195 208q10 11 24.5 11.5t25.5 -10t11.5 -25t-9.5 -25.5z" />
+    <glyph glyph-name="rightcircleo" unicode="&#xe60c;" 
+d="M511.5 823q89.5 0 171.5 -34q79 -34 140 -95t94 -139q35 -82 35 -171.5t-35 -171.5q-33 -78 -94 -139t-140 -95q-81 -34 -170.5 -34t-171.5 34q-79 34 -140 95t-94 139q-35 82 -35 171.5t35 171.5q33 78 94 139t140 95q81 34 170.5 34zM512 895q-104 0 -199 -40.5
+t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5v0zM681 411l-235 220q-11 11 -26 10.5t-25 -11.5t-9.5 -26t11.5 -25l207 -195l-207 -194q-11 -10 -11.5 -25t9.5 -26t25 -11.5
+t26 9.5l235 221q12 11 12 26.5t-12 26.5z" />
+    <glyph glyph-name="leftcircleo" unicode="&#xe60d;" 
+d="M511.5 823q89.5 0 171.5 -34q79 -34 140 -95t94 -139q35 -82 35 -171.5t-35 -171.5q-33 -78 -94 -139t-140 -95q-81 -34 -170.5 -34t-171.5 34q-79 34 -140 95t-94 139q-35 82 -35 171.5t35 171.5q33 78 94 139t140 95q81 34 170.5 34zM512 895q-104 0 -199 -40.5
+t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5v0zM331 384.5q0 -15.5 12 -26.5l235 -221q11 -10 26 -9.5t25 11.5t9.5 26t-11.5 25l-207 194l207 195q11 10 11.5 25t-9.5 26
+t-25 11.5t-26 -10.5l-236 -220q-11 -11 -11 -26.5z" />
+    <glyph glyph-name="upcircleo" unicode="&#xe60e;" 
+d="M511.5 823q89.5 0 171.5 -34q79 -34 140 -95t94 -139q35 -82 35 -171.5t-35 -171.5q-33 -78 -94 -139t-140 -95q-81 -34 -170.5 -34t-171.5 34q-79 34 -140 95t-94 139q-35 82 -35 171.5t35 171.5q33 78 94 139t140 95q81 34 170.5 34zM512 895q-104 0 -199 -40.5
+t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5v0zM512 576q-16 0 -26 -11l-221 -236q-10 -11 -9.5 -25.5t11 -25t25.5 -10t25 11.5l195 208l195 -208q10 -11 24.5 -11.5t25.5 10
+t11.5 25t-9.5 25.5l-221 236q-10 11 -26 11z" />
+    <glyph glyph-name="downcircleo" unicode="&#xe60f;" 
+d="M511.5 823q89.5 0 171.5 -34q79 -34 140 -95t94 -139q35 -82 35 -171.5t-35 -171.5q-33 -78 -94 -139t-140 -95q-81 -34 -170.5 -34t-171.5 34q-79 34 -140 95t-94 139q-35 82 -35 171.5t35 171.5q33 78 94 139t140 95q81 34 170.5 34zM512 895q-104 0 -199 -40.5
+t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5v0zM512 183q-16 0 -26 11l-221 236q-10 11 -9.5 25.5t11 25t25.5 10t25 -11.5l195 -208l195 208q10 11 24.5 11.5t25.5 -10
+t11.5 -25t-9.5 -25.5l-221 -236q-10 -11 -26 -11z" />
+    <glyph glyph-name="verticleleft" unicode="&#xe610;" 
+d="M273 78l382 307l-380 305q-14 11 -16 29t9.5 32t29.5 16t32 -9l358 -288v262q0 15 10.5 25.5t25.5 10.5h8q15 0 25.5 -10.5t10.5 -25.5v-696q0 -15 -10.5 -25.5t-25.5 -10.5h-8q-15 0 -25.5 10.5t-10.5 25.5v264l-360 -290q-12 -10 -27 -10q-21 0 -35 17q-11 14 -9 32
+t16 29z" />
+    <glyph glyph-name="verticleright" unicode="&#xe611;" 
+d="M752 78l-382 307l380 305q14 11 16 29t-9.5 32t-29.5 16t-32 -9l-358 -288v262q0 15 -10.5 25.5t-25.5 10.5h-8q-15 0 -25.5 -10.5t-10.5 -25.5v-696q0 -15 10.5 -25.5t25.5 -10.5h8q15 0 25.5 10.5t10.5 25.5v264l360 -290q12 -10 27 -10q21 0 34 17q12 14 10 32t-16 29
+z" />
+    <glyph glyph-name="rollback" unicode="&#xe612;" 
+d="M811.5 471.5q-88.5 88.5 -213.5 88.5h-336l114 114q12 12 12 28.5t-12 28t-28.5 11.5t-28.5 -12l-183 -183q-12 -12 -12 -28.5t12 -28.5l178 -178q12 -12 28.5 -12t28 11.5t11.5 28t-11 28.5l-113 112h340q92 0 157 -65t65 -157v-192q0 -17 12 -28.5t28.5 -11.5t28 11.5
+t11.5 28.5v192q0 125 -88.5 213.5z" />
+    <glyph glyph-name="retweet" unicode="&#xe613;" 
+d="M366 579h349l-119 -119q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t25 11l179 178q11 11 11 25.5t-11 25.5l-184 184q-10 10 -25 10t-25.5 -10.5t-10.5 -25.5t10 -25l120 -120h-344q-124 0 -211.5 -87.5t-87.5 -211.5q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5
+q0 94 66.5 160.5t160.5 66.5zM923 455q-15 0 -25.5 -10.5t-10.5 -25.5q0 -94 -66.5 -160.5t-160.5 -66.5h-349l120 120q10 10 10 25t-10.5 25.5t-25.5 10.5t-25 -11l-179 -178q-10 -11 -10 -25.5t10 -25.5l184 -184q10 -10 25 -10t25.5 10.5t10.5 25.5t-10 25l-120 120h344
+q124 0 211.5 87.5t87.5 211.5q0 15 -10.5 25.5t-25.5 10.5z" />
+    <glyph glyph-name="shrink" unicode="&#xe614;" 
+d="M109 247h211l-232 -232q-13 -13 -13 -31t13 -31t31 -13t31 13l236 236v-210q0 -18 13 -31t31 -13t31 13t13 31v312q0 19 -13 31.5t-31 12.5h-321q-18 0 -31 -12.5t-13 -31t13 -31.5t31 -13zM595 431h321q18 0 31 13t13 31t-13 31t-31 13h-211l232 232q13 13 13 31.5
+t-13 31t-31 12.5t-31 -12l-236 -236v209q0 18 -13 31t-31 13t-31 -13t-13 -31v-312q0 -18 13 -31t31 -13z" />
+    <glyph glyph-name="arrowsalt" unicode="&#xe615;" 
+d="M430 23h-211l232 232q13 13 13 31.5t-13 31t-31 12.5t-31 -12l-236 -236v209q0 18 -13 31t-31 13t-31 -13t-13 -31v-312q0 -18 13 -31t31 -13h321q18 0 31 13t13 31t-13 31t-31 13zM916 831h-321q-18 0 -31 -13t-13 -31t13 -31t31 -13h211l-232 -232q-13 -13 -13 -31
+t13 -31t31 -13t31 13l236 236v-210q0 -18 13 -31t31 -13t31 13t13 31v312q0 18 -13 31t-31 13z" />
+    <glyph glyph-name="doubleright" unicode="&#xe617;" 
+d="M431 17q-11 14 -9 32t16 29l381 307l-379 305q-14 11 -16 29t9 32t29 16t32 -9l422 -339q17 -13 17 -34t-17 -34l-424 -341q-12 -10 -27 -10q-21 0 -34 17zM101 17q-11 14 -9 32t16 29l381 307l-379 305q-14 11 -16 29t9 32t29 16t32 -9l422 -339q17 -13 17 -34t-17 -34
+l-424 -341q-12 -10 -27 -10q-21 0 -34 17z" />
+    <glyph glyph-name="doubleleft" unicode="&#xe618;" 
+d="M559 0q-15 0 -27 10l-424 341q-17 13 -17 34t17 34l422 339q14 11 32 9t29 -16t9 -32t-16 -29l-379 -305l381 -307q14 -11 16 -29t-9 -32q-13 -17 -34 -17zM889 0q-15 0 -27 10l-424 341q-17 13 -17 34t17 34l422 339q14 11 32 9t29 -16t9 -32t-16 -29l-379 -305
+l381 -307q14 -11 16 -29t-9 -32q-13 -17 -34 -17z" />
+    <glyph glyph-name="arrowdown" unicode="&#xe619;" 
+d="M558 725v-574v0l208 216q13 14 31 14t31.5 -12.5t13.5 -30.5t-12 -32l-284 -294q-13 -14 -31.5 -14t-31.5 14l-285 296q-12 13 -12 30q0 19 14 32q13 13 31 12.5t31 -13.5l208 -216v0v573q0 17 12 30t29 14q19 1 33 -12.5t14 -32.5z" />
+    <glyph glyph-name="arrowup" unicode="&#xe61a;" 
+d="M470 43v574v0l-208 -216q-13 -14 -31 -14t-31.5 12.5t-13.5 30.5t12 32l284 294q13 14 31.5 14t31.5 -14l285 -296q12 -13 12 -30q0 -19 -14 -32q-13 -13 -31 -12.5t-31 13.5l-208 216v0v-573q0 -17 -12 -30t-29 -14q-19 -1 -33 12.5t-14 32.5z" />
+    <glyph glyph-name="arrowright" unicode="&#xe61b;" 
+d="M173 428h574v0l-216 208q-14 13 -14 31t12.5 31.5t30.5 13.5t32 -12l294 -284q14 -13 14 -31.5t-14 -31.5l-296 -285q-13 -12 -30 -12q-19 0 -32 14q-13 13 -12.5 31t13.5 31l216 208v0h-573q-17 0 -30 12t-14 29q-1 19 12.5 33t32.5 14z" />
+    <glyph glyph-name="arrowleft" unicode="&#xe61c;" 
+d="M855 428h-574v0l216 208q14 13 14 31t-12.5 31.5t-30.5 13.5t-32 -12l-294 -284q-14 -13 -14 -31.5t14 -31.5l296 -285q13 -12 30 -12q19 0 32 14q13 13 12.5 31t-13.5 31l-216 208v0h573q17 0 30 12t14 29q1 19 -12.5 33t-32.5 14z" />
+    <glyph glyph-name="down" unicode="&#xe61d;" 
+d="M896 596q0 -15 -10 -28l-341 -423q-13 -17 -34 -17t-34 17l-339 422q-11 14 -9 32t16 29t32 9t29 -16l305 -379l307 381q11 14 29 16t32 -9q17 -13 17 -34z" />
+    <glyph glyph-name="up" unicode="&#xe61e;" 
+d="M896 236q0 15 -10 28l-341 423q-13 17 -34 17t-34 -17l-339 -422q-11 -14 -9 -32t16 -29t32 -9t29 16l305 379l307 -381q11 -14 29 -16t32 9q17 13 17 34z" />
+    <glyph glyph-name="right" unicode="&#xe61f;" 
+d="M301 0q15 0 27 10l424 341q16 13 16 34t-16 34l-422 339q-14 11 -32 9t-29.5 -16t-9.5 -32t16 -29l380 -305l-382 -307q-14 -11 -16 -29t9 -32q14 -17 35 -17z" />
+    <glyph glyph-name="left" unicode="&#xe620;" 
+d="M724 0q-15 0 -27 10l-424 341q-16 13 -16 34t16 34l422 339q14 11 32 9t29.5 -16t9.5 -32t-16 -29l-380 -305l382 -307q14 -11 16 -29t-10 -32q-13 -17 -34 -17z" />
+    <glyph glyph-name="minussquareo" unicode="&#xe621;" 
+d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM732 347h-442q-14 0 -25 10.5t-11 25.5v0q0 15 11 25.5t25 10.5h442q14 0 25 -10.5t11 -25.5v0
+q0 -15 -11 -25.5t-25 -10.5z" />
+    <glyph glyph-name="minuscircle" unicode="&#xe622;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM832 384q0 -15 -10.5 -25.5t-25.5 -10.5h-568q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h568
+q15 0 25.5 -10.5t10.5 -25.5v0z" />
+    <glyph glyph-name="minuscircleo" unicode="&#xe623;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
+q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM796 348h-568q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5z" />
+    <glyph glyph-name="minus" unicode="&#xe624;" 
+d="M796 348h-568q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5z" />
+    <glyph glyph-name="pluscircleo" unicode="&#xe625;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
+q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM732 420h-184v183q0 15 -10.5 25.5t-25.5 10.5v0q-14 0 -25 -10.5t-11 -25.5v-183h-184q-15 0 -25.5 -11t-10.5 -25v0q0 -15 10.5 -25.5t25.5 -10.5h184v-183
+q0 -15 11 -25.5t25 -10.5v0q15 0 25.5 10.5t10.5 25.5v183h184q15 0 25.5 10.5t10.5 25.5v0q0 14 -10.5 25t-25.5 11z" />
+    <glyph glyph-name="pluscircle" unicode="&#xe626;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM768 384q0 -15 -10.5 -25.5t-25.5 -10.5h-184v-183q0 -15 -10.5 -25.5t-25.5 -10.5v0q-14 0 -25 10.5
+t-11 25.5v183h-184q-15 0 -25.5 10.5t-10.5 25.5v0q0 14 10.5 25t25.5 11h184v183q0 15 11 25.5t25 10.5v0q15 0 25.5 -10.5t10.5 -25.5v-183h184q15 0 25.5 -11t10.5 -25v0z" />
+    <glyph glyph-name="plus" unicode="&#xe627;" 
+d="M866 420h-318v310q0 15 -10.5 25.5t-25.5 10.5v0q-15 0 -25.5 -10.5t-10.5 -25.5v-310h-312q-14 0 -25 -10.5t-11 -25.5v0q0 -15 11 -25.5t25 -10.5h312v-312q0 -14 10.5 -25t25.5 -11v0q15 0 25.5 11t10.5 25v312h318q15 0 25.5 10.5t10.5 25.5v0q0 15 -10.5 25.5
+t-25.5 10.5z" />
+    <glyph glyph-name="infocirlce" unicode="&#xe628;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM509 712q15 0 25.5 -11t10.5 -25.5t-10.5 -25t-25.5 -10.5t-25.5 10.5t-10.5 25t10.5 25.5t25.5 11zM666 154
+q0 -15 -10.5 -25.5t-25.5 -10.5h-85h-72h-85q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h85v314h-60q-15 0 -25.5 11t-10.5 25v0q0 15 10.5 25.5t25.5 10.5h60h36v0q15 0 25.5 -10.5t10.5 -25.5v-350h85q15 0 25.5 -10.5t10.5 -25.5v0z" />
+    <glyph glyph-name="infocirlceo" unicode="&#xe629;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
+q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM630 190h-85v350q0 15 -10.5 25.5t-25.5 10.5v0h-36h-60q-15 0 -25.5 -10.5t-10.5 -25.5v0q0 -14 10.5 -25t25.5 -11h60v-314h-85q-15 0 -25.5 -10.5
+t-10.5 -25.5v0q0 -15 10.5 -25.5t25.5 -10.5h85h72h85q15 0 25.5 10.5t10.5 25.5v0q0 15 -10.5 25.5t-25.5 10.5zM509 676zM473 675.5q0 14.5 10.5 25.5t25.5 11t25.5 -11t10.5 -25.5t-10.5 -25t-25.5 -10.5t-25.5 10.5t-10.5 25z" />
+    <glyph glyph-name="info" unicode="&#xe62a;" 
+d="M660 136h-85v404q0 15 -10.5 25.5t-25.5 10.5v0h-36h-60q-15 0 -25.5 -10.5t-10.5 -25.5v0q0 -14 10.5 -25t25.5 -11h60v-368h-85q-15 0 -25.5 -10.5t-10.5 -25.5v0q0 -15 10.5 -25.5t25.5 -10.5h85h72h85q15 0 25.5 10.5t10.5 25.5v0q0 15 -10.5 25.5t-25.5 10.5z
+M539 676zM503 675.5q0 14.5 10.5 25.5t25.5 11t25.5 -11t10.5 -25.5t-10.5 -25t-25.5 -10.5t-25.5 10.5t-10.5 25z" />
+    <glyph glyph-name="exclamation" unicode="&#xe62b;" 
+d="M512 193q-17 0 -28.5 11.5t-11.5 28.5v495q0 17 11.5 28.5t28.5 11.5t28.5 -11.5t11.5 -28.5v-495q0 -17 -11.5 -28.5t-28.5 -11.5zM512 83zM467 83q0 19 13 32t32 13t32 -13t13 -32t-13 -32t-32 -13t-32 13t-13 32z" />
+    <glyph glyph-name="exclamationcircle" unicode="&#xe62c;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM472 665q0 17 11.5 28.5t28.5 11.5t28.5 -11.5t11.5 -28.5v-369q0 -17 -11.5 -28.5t-28.5 -11.5t-28.5 11.5
+t-11.5 28.5v369zM512 102q-19 0 -32 13t-13 32t13 32t32 13t32 -13t13 -32t-13 -32t-32 -13z" />
+    <glyph glyph-name="exclamationcircleo" unicode="&#xe62d;" 
+d="M512 824q90 0 171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140t-140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171q34 79 95 140t140 94q81 35 171 35zM512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257
+t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5v0zM512 256q-17 0 -28.5 11.5t-11.5 28.5v369q0 17 11.5 28.5t28.5 11.5t28.5 -11.5t11.5 -28.5v-369q0 -17 -11.5 -28.5t-28.5 -11.5zM512 147zM467 147q0 19 13 32
+t32 13t32 -13t13 -32t-13 -32t-32 -13t-32 13t-13 32z" />
+    <glyph glyph-name="closecircle" unicode="&#xe62e;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM717 229q11 -10 11 -25t-10.5 -25.5t-25.5 -10.5t-26 10l-154 155l-154 -155q-11 -10 -26 -10t-25.5 10.5
+t-10.5 25.5t11 25l154 155l-154 155q-11 10 -11 25t10.5 25.5t25.5 10.5t26 -10l154 -155l154 155q11 10 26 10t25.5 -10.5t10.5 -25t-11 -25.5l-154 -155z" />
+    <glyph glyph-name="closecircleo" unicode="&#xe62f;" 
+d="M717.5 589.5q-10.5 10.5 -25.5 10.5t-26 -10l-154 -155l-154 155q-11 10 -26 10t-25.5 -10.5t-10.5 -25.5t11 -25l154 -155l-154 -155q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t26 10l154 155l154 -155q11 -10 26 -10t25.5 10.5t10.5 25t-11 25.5l-154 155l154 155
+q11 10 11 25t-10.5 25.5zM512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140
+q-35 81 -35 171t34 171q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140z" />
+    <glyph glyph-name="checkcircle" unicode="&#xe630;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM772 540l-359 -361v0l-1 -1q-3 -3 -8 -6q-8 -5 -18 -5q-21 0 -31 18l-109 191q-8 13 -4 27t17 21.5t27.5 3.5
+t21.5 -17l86 -149l327 328q11 11 26 11t25.5 -10.5t10.5 -25.5t-11 -25z" />
+    <glyph glyph-name="checkcircleo" unicode="&#xe631;" 
+d="M721 590l-327 -328l-86 149q-7 13 -21.5 17t-27.5 -3.5t-17 -21.5t4 -27l109 -191q10 -18 31 -18q10 0 18 5q5 3 8 6l1 1l359 360q11 11 11 26t-10.5 25.5t-25.5 10.5t-26 -11zM512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5
+t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171
+q-34 -79 -95 -140z" />
+    <glyph glyph-name="check" unicode="&#xe632;" 
+d="M328 96q-3 0 -5 1q-20 2 -30 20l-159 278q-8 15 -4 31t18.5 24t30.5 3.5t25 -18.5l133 -233l491 492q11 12 28 12t28.5 -11.5t11.5 -28.5t-12 -28l-526 -528l-2 -2q-11 -12 -28 -12z" />
+    <glyph glyph-name="close" unicode="&#xe633;" 
+d="M568 381l254 255q12 11 12 27.5t-11.5 28t-28 11.5t-27.5 -12l-255 -254l-255 254q-11 12 -27.5 12t-28 -11.5t-11.5 -28t12 -27.5l254 -255l-254 -255q-12 -11 -12 -27.5t11.5 -28t28 -11.5t27.5 12l255 255l255 -255q11 -12 27.5 -12t28 11.5t11.5 28t-12 27.5z" />
+    <glyph glyph-name="customerservice" unicode="&#xe634;" 
+d="M838 579q-6 26 -18 52q-25 59 -72 105q-46 45 -107 70q-63 26 -131 26t-131 -26q-60 -25 -107 -70.5t-72 -104.5q-11 -25 -18 -53q-24 -8 -45 -23q-22 -16 -38 -38q-35 -47 -35 -106q0 -72 51 -123q37 -37 87 -48q4 -1 8 -1q15 0 25 11q10 10 10 25l-1 227q0 107 77 183
+q78 76 188.5 76t188.5 -76t78 -183v-236q0 -107 -78 -183q-31 -31 -71 -50q1 11 1 22q-1 46 -34 79t-79 35h-3q-48 0 -82 -34.5t-34 -82.5q0 -47 33.5 -81t80.5 -35v0h2v0h2h1v0v0q66 1 126 26t107 70.5t73 104.5q22 53 26 111q35 13 62 40q51 51 51 123q0 58 -34 104.5
+t-88 63.5zM82 355q1 -3 3 -7q-2 5 -3 7zM92 333q2 -4 5 -9q-4 6 -5 9zM160 332l-3 3l3 -3l2 -2zM173 332q-4 3 -7 6q-31 31 -31 73q0 29 14 53q9 17 24 29v-161zM181 316q-1 0 -2 0.5t-1 1.5q1 -1 3 -2v0zM188 571v0q1 5 4 13q-2 -7 -4 -13zM204 248l-10 2q9 -2 10 -2h2h-2z
+M210 248h-1h1v0zM237 274v1l-1 227l1 -227v-1zM307 756q7 5 10 7q-6 -4 -10 -7zM382 799q-30 -13 -58 -31q28 18 58 31q1 0 2.5 0.5t2.5 0.5q-3 0 -5 -1zM442 761l2 0.5t3 0.5h2zM742 730q-45 44 -104 69q-1 0 -2.5 0.5t-2.5 0.5q1 0 2.5 -0.5t2.5 -0.5q59 -25 104 -69l6 -6
+zM754 718q4 -4 9 -10q-5 6 -9 10zM765 706q2 -3 8 -10q-4 4 -8 10zM404 52v0v3v-3zM512 161h3h-3v0zM544.5 21q-12.5 -13 -30.5 -14h-2q-19 0 -32 13.5t-13 31.5q0 19 13 32.5t32 13.5t32 -13.5t13 -32t-12.5 -31.5zM565 44v8v3v-1v-2v-8zM615 19l1 3l-1 -3q1 1 2.5 1.5
+t2.5 0.5q-2 -1 -5 -2zM742 38l-6 -6q1 1 3.5 3t2.5 3l6 6q-3 -4 -6 -6zM784 266v-14v14v236v6v-3v-3v-236zM813 140q-3 -7 -7 -14q4 7 7 14q0 1 1 2.5t1 2.5q-1 -3 -2 -5zM813 628q-3 7 -7 14q4 -7 7 -14q1 -2 3 -7q-1 3 -3 7zM831 572q0 3 -1 7q0 -1 0.5 -3t0.5 -4v0z
+M839 510q7 -3 12 -7q-5 4 -12 7v0zM864 332q-11 -11 -25 -18v0q14 7 25 18q0 1 1 1q0 1 1 1q-1 0 -1 -1q-1 0 -1 -1zM858 338q-5 -5 -11 -10v168q17 -13 27 -30q15 -25 15 -55q0 -42 -31 -73zM945 460l-2 6q1 -2 2 -6zM935 485q1 -1 3 -6q-1 1 -1.5 3.5t-1.5 2.5zM943 356
+q0 2 2 7q-1 -2 -2 -7z" />
+    <glyph glyph-name="creditcard" unicode="&#xe635;" 
+d="M952 766h-880q-30 0 -51 -21t-21 -51v-120v-96v-405q0 -29 21 -50.5t51 -21.5h880q30 0 51 21.5t21 50.5v405v96v120q0 30 -21 51t-51 21zM952 73h-880v405h880v-405zM72 574v120h880v-120h-880zM237 192v0q18 0 31 13t13 31v0q0 18 -13 31t-31 13v0q-18 0 -31 -13
+t-13 -31v0q0 -18 13 -31t31 -13zM404 192v0q18 0 31 13t13 31v0q0 18 -13 31t-31 13v0q-19 0 -31.5 -13t-12.5 -31v0q0 -18 12.5 -31t31.5 -13z" />
+    <glyph glyph-name="codesquareo" unicode="&#xe636;" 
+d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM888 7h-752v753h752v-753zM203.5 357.5q10.5 -10.5 25.5 -10.5t25 11l140 141q11 10 11 25t-10 26l-141 142q-10 10 -25 10t-25.5 -10.5
+t-10.5 -25t10 -25.5l115 -117l-115 -115q-10 -11 -10 -26t10.5 -25.5zM383 384q0 -15 10.5 -25.5t24.5 -10.5l199 -1h1q14 0 25 10.5t11 25.5t-11 25.5t-25 10.5l-199 1v0q-15 0 -25.5 -10.5t-10.5 -25.5z" />
+    <glyph glyph-name="book" unicode="&#xe637;" 
+d="M822 832h-259h-72h-121h-72h-94q-29 0 -50.5 -21t-21.5 -51v-753q0 -29 21.5 -50.5t50.5 -21.5h619q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM491 760v-209l-9 8l-33 34q-8 7 -18 7t-17 -7l-44 -44v211h121zM298 760v-277q0 -15 10 -25t25 -10v0
+q37 0 63 25l35 35l35 -34q25 -25 60 -26h1q15 0 25.5 10t10.5 25v277h260v-624h-618v624h93zM204 7v57h618v-57h-618z" />
+    <glyph glyph-name="barschart" unicode="&#xe638;" 
+d="M203 730v-696q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v696q0 15 10.5 25.5t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5zM167 70h694q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5h-694q-15 0 -25.5 10.5t-10.5 25.5v0
+q0 15 10.5 25.5t25.5 10.5zM394 537v-371q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v371q0 15 10.5 25.5t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5zM777 667v-501q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v501q0 15 10.5 25.5
+t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5zM585 411v-245q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v245q0 15 10.5 25.5t25.5 10.5v0q14 0 25 -10.5t11 -25.5z" />
+    <glyph glyph-name="bars" unicode="&#xe639;" 
+d="M187 639zM124 639q0 26 18.5 44.5t44.5 18.5t44.5 -18.5t18.5 -44.5t-18.5 -44.5t-44.5 -18.5t-44.5 18.5t-18.5 44.5zM856 610h-498q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h498q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5zM187 384
+zM124 384q0 26 18.5 44.5t44.5 18.5t44.5 -18.5t18.5 -44.5t-18.5 -44.5t-44.5 -18.5t-44.5 18.5t-18.5 44.5zM856 355h-498q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h498q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5zM187 129zM124 129
+q0 26 18.5 44.5t44.5 18.5t44.5 -18.5t18.5 -44.5t-18.5 -44.5t-44.5 -18.5t-44.5 18.5t-18.5 44.5zM856 100h-498q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h498q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5z" />
+    <glyph glyph-name="question" unicode="&#xe63a;" 
+d="M644 633q-61 64 -152 64q-84 0 -143.5 -59.5t-59.5 -143.5q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 54 38.5 92.5t92.5 38.5h1q59 0 99 -42q35 -37 32 -85q-1 -18 -4 -29t-21 -37.5t-54 -62.5q-43 -43 -66.5 -77t-27.5 -72q-2 -15 7.5 -26.5t24.5 -12.5h4
+q14 0 24 9t12 23q3 35 73 105q61 61 79.5 98t20.5 78q5 79 -52 139zM486 80zM443 80q0 18 12.5 30.5t30.5 12.5t30.5 -12.5t12.5 -30.5t-12.5 -30.5t-30.5 -12.5t-30.5 12.5t-12.5 30.5z" />
+    <glyph glyph-name="questioncircle" unicode="&#xe63b;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM505.5 83q-17.5 0 -30.5 13t-13 31t13 30.5t30.5 12.5t30.5 -12.5t13 -30.5t-13 -31t-30.5 -13zM691 505
+q-2 -38 -19.5 -70.5t-67.5 -83.5q-59 -58 -61 -87q-2 -13 -12 -22.5t-24 -9.5h-4q-15 2 -24.5 13.5t-7.5 26.5q3 33 23.5 63t58.5 67q30 30 45.5 52t18 31t2.5 24q2 39 -26 69q-33 34 -81 34v0q-45 0 -76.5 -31.5t-31.5 -75.5q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5
+t-10.5 25.5q0 74 52.5 126.5t126.5 52.5q80 1 134 -56q50 -53 46 -123z" />
+    <glyph glyph-name="questioncircleo" unicode="&#xe63c;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
+q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM546 372zM507 232h-4q-15 2 -24.5 13.5t-7.5 26.5q3 33 23.5 63t58.5 67q30 30 45.5 52t18 31.5t2.5 23.5q2 39 -26 69q-33 35 -81 35v0q-45 0 -76.5 -32
+t-31.5 -76q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5t-10.5 25.5q0 74 52.5 126.5t126.5 53.5q80 0 134 -57q50 -53 46 -123q-2 -37 -19.5 -70t-67.5 -84q-59 -58 -61 -86q-2 -14 -12 -23.5t-24 -9.5zM506 127zM462 127q0 18 13 30.5t30.5 12.5t30.5 -12.5t13 -30.5
+t-13 -30.5t-30.5 -12.5t-30.5 12.5t-13 30.5z" />
+    <glyph glyph-name="pause" unicode="&#xe63d;" 
+d="M326 704v0q-15 0 -25.5 -11t-10.5 -25v-568q0 -14 10.5 -25t25.5 -11v0q15 0 25 11t9 25v568q1 14 -9 25t-25 11zM698 704v0q-14 0 -25 -11t-11 -25v-568q0 -14 11 -25t25 -11v0q15 0 25.5 11t10.5 25v568q0 14 -10.5 25t-25.5 11z" />
+    <glyph glyph-name="pausecircle" unicode="&#xe63e;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM393 228q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v312q0 15 10.5 25.5t25.5 10.5v0
+q15 0 25.5 -10.5t10.5 -25.5v-312zM703 228q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v312q0 15 10.5 25.5t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5v-312z" />
+    <glyph glyph-name="pausecircleo" unicode="&#xe63f;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
+q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM357 576v0q-15 0 -25.5 -10.5t-10.5 -25.5v-312q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v312q0 15 -10.5 25.5t-25.5 10.5zM667 576v0
+q-15 0 -25.5 -10.5t-10.5 -25.5v-312q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v312q0 15 -10.5 25.5t-25.5 10.5z" />
+    <glyph glyph-name="clockcircle" unicode="&#xe640;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM769 356q0 -15 -10.5 -25.5t-25.5 -10.5h-185v0q-30 0 -51 21t-21 51v0v240q0 15 10.5 25.5t25.5 10.5v0
+q15 0 25.5 -10.5t10.5 -25.5v-240h185q15 0 25.5 -10.5t10.5 -25.5v0z" />
+    <glyph glyph-name="clockcircleo" unicode="&#xe641;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
+q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM733 392h-185v240q0 15 -10.5 25.5t-25.5 10.5v0q-15 0 -25.5 -10.5t-10.5 -25.5v-240v0q0 -30 21 -51t51 -21v0h185q15 0 25.5 10.5t10.5 25.5v0
+q0 15 -10.5 25.5t-25.5 10.5z" />
+    <glyph glyph-name="swap" unicode="&#xe642;" 
+d="M194 481q-1 0 -1 0.5t-0.5 0.5h-0.5h-0.5h-0.5h-0.5h-0.5v0h-1h-0.5h-0.5v0l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-0.5h-0.5h-1l-1 1v0v0h-0.5h-0.5l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-1v1h-0.5h-0.5l-0.5 0.5l-0.5 0.5h-0.5h-0.5v0.5v0.5h-1l-1 1v0l-0.5 0.5l-0.5 0.5h-1q-1 2 -2 3
+q-1 0 -1 0.5v0.5v0l-1 1v1h-1v1v0l-0.5 0.5l-0.5 0.5v0v0.5t-0.5 0.5h-0.5v1l-0.5 0.5l-0.5 0.5v1v0v0.5t-0.5 0.5h-0.5v0.5v0.5q0 1 -0.5 1t-0.5 0.5v1v0.5v0v0v0.5v0.5v0.5v0.5l-1 1v0.5v0.5v0.5v0.5v0v0.5v0.5v1v0v1v4v1v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0l1 1v0.5v0.5
+v0.5v0.5v0v0.5v0.5v0q1 1 1 1.5v0.5v0.5v0.5l0.5 0.5l0.5 0.5v0v0.5v0.5l0.5 0.5l0.5 0.5v0.5t0.5 1l0.5 0.5v0v0v0.5t0.5 0.5t0.5 0.5v0.5l0.5 0.5l0.5 0.5q0 1 1 1v0v1h1l0.5 0.5l0.5 0.5l178 178q10 11 25 11t25 -11v0q11 -11 11 -25.5t-11 -25.5l-116 -116h545
+q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5h-631v0h-2h-0.5h-0.5zM830 287q1 0 1 -0.5t0.5 -0.5h0.5h0.5h0.5h0.5h0.5v0v0h2v0v0l0.5 -0.5l0.5 -0.5h0.5h0.5h0.5h0.5h1v-1h1v0h0.5h0.5l0.5 -0.5l0.5 -0.5h0.5h0.5h1v-1h0.5h0.5l0.5 -0.5l0.5 -0.5h0.5h0.5
+v-0.5v-0.5h1l1 -1l0.5 -0.5l0.5 -0.5v0h1q1 -2 2 -3q1 0 1 -0.5v-0.5v0l1 -1v-1h1v-1h0.5t0.5 -0.5v-0.5v0v-0.5t0.5 -0.5t0.5 -0.5v-0.5l0.5 -0.5l0.5 -0.5v-0.5v-0.5v-0.5t0.5 -0.5h0.5v-0.5v-0.5v-1l0.5 -0.5t0.5 -1v-0.5v0v-0.5v-0.5v0v-0.5v-0.5l1 -1v-0.5v-0.5v-0.5
+v-0.5v0v-0.5v-0.5v-1v0v-1v-4v-1v-0.5v-1v-0.5v0v-0.5v-0.5v-0.5v-0.5v0l-1 -1v-0.5v-0.5v-0.5v-0.5v0v-0.5v-0.5l-1 -1v-0.5v-0.5v-0.5v-0.5l-0.5 -0.5l-0.5 -0.5v0v-0.5v-0.5l-0.5 -0.5l-0.5 -0.5v-0.5t-0.5 -1l-0.5 -0.5v0v0v-0.5t-0.5 -0.5t-0.5 -0.5v-0.5l-1 -1v0
+q0 -1 -0.5 -1h-0.5v-1h-1l-0.5 -0.5t-0.5 -1.5l-177 -177q-11 -11 -26 -11t-25 11v0q-11 10 -11 25t11 26l116 116h-545q-14 0 -25 10.5t-11 25.5v0q0 15 11 25.5t25 10.5h632v0h1h1z" />
+    <glyph glyph-name="swapleft" unicode="&#xe643;" 
+d="M164 320h-1l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-0.5h-0.5v0h-1h-1v0v0l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-0.5h-0.5h-1l-1 1v0v0h-0.5h-0.5l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-1v1h-0.5h-0.5l-0.5 0.5l-0.5 0.5h-0.5h-0.5v0.5v0.5h-1l-1 1v0l-0.5 0.5l-0.5 0.5h-1q-1 2 -2 3
+q-1 0 -1 0.5v0.5v0l-1 1v1h-1v1v0l-0.5 0.5l-0.5 0.5v0v0.5t-0.5 0.5h-0.5v1l-0.5 0.5l-0.5 0.5v1v0v0.5t-0.5 0.5h-0.5v0.5v0.5q0 1 -0.5 1t-0.5 0.5v1v0.5v0v0.5v0.5v0v0.5v0.5l-1 1v0.5v0.5v0.5v0.5v0v0.5v0.5v1v1v0v4v1v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0l1 1v0.5v0.5
+v0.5v0.5v0v0.5v0.5v1q1 0 1 0.5v0.5v0.5v0.5l0.5 0.5l0.5 0.5v0v1v0l0.5 0.5l0.5 0.5v1l0.5 0.5l0.5 0.5v0v0v0.5t0.5 0.5t0.5 0.5v0.5l0.5 0.5l0.5 0.5q0 1 0.5 1h0.5v1h1l0.5 0.5t0.5 1.5l178 177q10 11 25 11t25 -11v0q11 -11 11 -25.5t-11 -25.5l-116 -116h545
+q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5h-631v0h-2h-1z" />
+    <glyph glyph-name="swapright" unicode="&#xe644;" 
+d="M830 320h1l0.5 0.5l0.5 0.5h0.5h0.5h0.5h0.5v0v0h2v0v0l0.5 0.5l0.5 0.5h0.5h0.5h0.5h0.5h1v1h1v0h0.5h0.5l0.5 0.5l0.5 0.5h0.5h0.5h1v1h0.5h0.5l0.5 0.5l0.5 0.5h0.5h0.5v0.5v0.5h1l1 1v0.5t0.5 0.5h0.5h1q1 2 2 3q1 0 1 0.5v0.5v0l1 1v1h1v1h0.5t0.5 0.5v0.5v0v0.5
+t0.5 0.5t0.5 0.5v0.5l0.5 0.5l0.5 0.5v0.5v0.5v0.5t0.5 0.5h0.5v0.5v0.5v1l0.5 0.5t0.5 1v0.5v0v0v0.5v0.5v0.5v0.5l1 1v0.5v0.5v0.5v0.5v0v0.5v0.5v1v1v0v4v1v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0l-1 1v0.5v0.5v0.5v0.5v0v0.5v0.5l-1 1v0.5v0.5v0.5v0.5l-0.5 0.5l-0.5 0.5v0
+v0.5v0.5l-0.5 0.5l-0.5 0.5v0.5t-0.5 1l-0.5 0.5v0v0l-0.5 0.5l-0.5 0.5v0.5v0.5l-0.5 0.5l-0.5 0.5q0 1 -1 1v0l-0.5 0.5l-0.5 0.5l-0.5 0.5t-0.5 1.5l-177 177q-11 11 -26 11t-25 -11v0q-11 -10 -11 -25t11 -26l116 -116h-545q-14 0 -25 -10.5t-11 -25.5v0q0 -15 11 -25.5
+t25 -10.5h632v0h1h0.5h0.5z" />
+    <glyph glyph-name="plussquareo" unicode="&#xe645;" 
+d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM732 420h-184v183q0 15 -10.5 25.5t-25.5 10.5v0q-14 0 -25 -10.5t-11 -25.5v-183h-184
+q-15 0 -25.5 -11t-10.5 -25v0q0 -15 10.5 -25.5t25.5 -10.5h184v-183q0 -15 11 -25.5t25 -10.5v0q15 0 25.5 10.5t10.5 25.5v183h184q15 0 25.5 10.5t10.5 25.5v0q0 14 -10.5 25t-25.5 11z" />
+    <glyph glyph-name="frown" unicode="&#xe646;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM254 454q-25 0 -42.5 17.5t-17.5 42t17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5zM640 130
+q-15 0 -25.5 11t-10.5 25q0 39 -27 66t-65 27t-65 -27t-27 -66q0 -14 -10.5 -25t-25.5 -11t-25.5 11t-10.5 25q0 68 48 116.5t116 48.5t116 -48.5t48 -116.5q0 -14 -10.5 -25t-25.5 -11zM769.5 454q-24.5 0 -42 17.5t-17.5 42t17.5 42.5t42 18t42.5 -18t18 -42.5t-18 -42
+t-42.5 -17.5z" />
+    <glyph glyph-name="menufold" unicode="&#xe658;" 
+d="M97 695h828q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-828q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM923 450h-565q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h565q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM925 72h-825
+q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h825q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM195 281q11 -10 25 -10q15 0 26 11q10 10 10 25t-10 25l-96 94l94 88q11 11 11.5 26t-10 25.5t-25.5 11t-25 -9.5l-121 -114q-12 -11 -12 -26t11 -26z" />
+    <glyph glyph-name="mail" unicode="&#xe659;" 
+d="M886 768h-753q-30 0 -51 -21t-21 -51v-626q0 -30 21 -51t51 -21h753q30 0 51 21t21 51v626q0 30 -21 51t-51 21zM809 696l-268 -224l-2 -1l-1 -2q-11 -11 -26 -11h-1q-15 0 -25 11l-2 1l-274 226h599zM886 70h-753v0v597l303 -250q31 -31 76 -31v0q45 0 76 32l298 249
+v-597v0z" />
+    <glyph glyph-name="link" unicode="&#xe65b;" 
+d="M542 230l-179 -179q-39 -38 -93 -38t-92 38q-39 39 -39 93t39 93l178 179q11 10 11 25t-10.5 25.5t-25.5 10.5t-25 -11l-179 -178q-60 -60 -60 -144t59.5 -143.5t143.5 -59.5t144 59l179 179q10 11 10 26t-10.5 25.5t-25.5 10.5t-25 -11zM899.5 773.5
+q-59.5 59.5 -143.5 59.5t-144 -60l-179 -179q-10 -10 -10 -25t10.5 -25.5t25.5 -10.5t25 10l179 179q39 39 93 39t92.5 -38.5t38.5 -93t-39 -92.5l-178 -179q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t26 10l179 179q59 60 59 144t-59.5 143.5zM486 308l102 102q11 10 11 25
+t-10.5 25.5t-25.5 10.5t-25 -11l-102 -102q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t25 11z" />
+    <glyph glyph-name="areachart" unicode="&#xe65c;" 
+d="M923 -64h-824q-15 0 -25.5 10.5t-10.5 25.5v825q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5v-789h788q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM192 96l117 209q4 7 12 9.5t16 -0.5l111 -52l118 171q11 15 27 7l110 -56l160 251q7 11 19.5 7.5
+t12.5 -16.5v-520q0 -16 -11.5 -27.5t-27.5 -11.5h-646q-11 0 -17 9.5t-1 19.5z" />
+    <glyph glyph-name="linechart" unicode="&#xe65d;" 
+d="M923 -64h-824q-15 0 -25.5 10.5t-10.5 25.5v825q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5v-789h788q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM385 153q-19 0 -30 16l-157 250q-8 13 -5 27.5t15.5 22.5t27 5t22.5 -15l112 -182l46 177q4 16 19 23
+l182 88q13 6 26 2.5t21 -15.5l91 -148l134 403q5 14 18 21t27 2t21 -18t2 -27l-158 -477q-7 -22 -30 -24.5t-35 16.5l-115 186l-137 -66l-62 -240q-6 -23 -29 -26q-3 -1 -6 -1z" />
+    <glyph glyph-name="home" unicode="&#xe65e;" 
+d="M932 454l-372 358q-20 18 -48 18t-48 -18l-372 -358q-11 -10 -12 -25t9 -26v0q10 -11 25 -12t26 9l372 358l372 -358q11 -10 26 -9t25 12v0q10 11 9 26t-12 25zM833 321v0q-15 0 -25.5 -10.5t-10.5 -25.5v-277h-143v240q0 30 -21 51t-51 21h-140q-30 0 -51 -21t-21 -51
+v-240h-143v277q0 15 -10.5 25.5t-25.5 10.5v0q-15 0 -25.5 -10.5t-10.5 -25.5v-277q0 -30 21 -51t51 -21h570q30 0 51 21t21 51v277q0 15 -10.5 25.5t-25.5 10.5zM442 248h140v-240h-140v240z" />
+    <glyph glyph-name="laptop" unicode="&#xe65f;" 
+d="M887 760v0v0v-559v0l-752 -1v0v560v0h752zM887 832h-752q-30 0 -51 -21t-21 -51v-559q0 -30 21 -51t51 -21h752q30 0 51 21t21 51v559q0 30 -21 51t-51 21v0zM923 -16h-824q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h824q15 0 25.5 -10.5t10.5 -25.5v0
+q0 -15 -10.5 -25.5t-25.5 -10.5z" />
+    <glyph glyph-name="star" unicode="&#xe660;" 
+d="M956 497.5q-8 23.5 -26.5 39t-42.5 19.5l-205 31l-92 195q-11 24 -33 37q-21 13 -45 13t-45 -13q-22 -13 -33 -37l-92 -195l-205 -31q-24 -4 -42.5 -19.5t-26.5 -39t-2.5 -47t22.5 -41.5l151 -154l-36 -218q-6 -40 20 -70.5t66 -30.5q22 0 42 11l181 100l181 -100
+q20 -11 42 -11q40 0 66 30.5t20 70.5l-36 218l151 154q17 18 22.5 41.5t-2.5 47z" />
+    <glyph glyph-name="staro" unicode="&#xe661;" 
+d="M512 760q9 0 13 -9l105 -222q3 -7 11 -9l235 -35q9 -2 12 -10.5t-4 -14.5l-171 -176q-5 -5 -4 -12l41 -247q1 -7 -3.5 -12t-11.5 -5q-4 0 -7 2l-209 115q-3 2 -7 2t-7 -2l-209 -115q-3 -2 -7 -2q-7 0 -11.5 5t-3.5 12l41 247q1 7 -4 12l-171 176q-7 6 -4 14.5t12 9.5
+l235 36q8 1 11 9l105 222q4 9 13 9zM512 832q-24 0 -45 -13q-22 -13 -33 -37l-92 -195l-205 -31q-24 -4 -42.5 -19.5t-26.5 -39t-2.5 -47t22.5 -41.5l151 -154l-36 -218q-6 -40 20 -70.5t66 -30.5q22 0 42 11l181 100l181 -100q20 -11 42 -11q40 0 66 30.5t20 70.5l-36 218
+l151 154q17 18 22.5 41.5t-2.5 47t-26.5 39t-42.5 19.5l-205 31l-92 195q-11 24 -33 37q-21 13 -45 13v0z" />
+    <glyph glyph-name="filter" unicode="&#xe663;" 
+d="M890.5 719.5q-9.5 23.5 -30.5 37t-46 13.5h-602q-25 0 -46 -13.5t-30.5 -37t-4.5 -48t22 -42.5l273 -263v-262q0 -15 11 -25l125 -129q10 -11 26 -11q6 0 13 2q23 9 23 34v393l248 261q18 18 23 42.5t-4.5 48zM821 680l-259 -272q-10 -10 -10 -25v-322l-54 58v262
+q0 15 -10 25l-284 274q-5 5 -2 11.5t10 6.5h602q7 0 9.5 -6.5t-2.5 -11.5z" />
+    <glyph glyph-name="exception" unicode="&#xe665;" 
+d="M667.5 63q13.5 0 23 9.5t9.5 23.5v382q0 14 -9.5 23.5t-23 9.5t-22.5 -9.5t-9 -23.5v-382q0 -14 9 -23.5t22.5 -9.5zM632 -26q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5t-10.5 -26t-25.5 -11t-25.5 11t-10.5 26zM542 644h-317q-13 0 -22.5 -10.5t-9.5 -25.5
+t9.5 -25.5t22.5 -10.5h317q14 0 23.5 10.5t9.5 25.5t-9.5 25.5t-23.5 10.5zM225 380h127q14 0 23.5 10.5t9.5 25.5t-9.5 25.5t-23.5 10.5h-127q-13 0 -22.5 -10.5t-9.5 -25.5t9.5 -25.5t22.5 -10.5zM225 188h191q14 0 23.5 10.5t9.5 25.5t-9.5 25.5t-23.5 10.5h-191
+q-13 0 -22.5 -10.5t-9.5 -25.5t9.5 -25.5t22.5 -10.5zM857 833h-690q-42 0 -72 -30t-30 -72v-690q0 -42 30 -72t72 -30h254q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-254q-12 0 -21 9t-9 21v690q0 12 9 21t21 9h690q12 0 21 -9t9 -21v-690q0 -12 -9 -21t-21 -9h-69
+q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h69q42 0 72 30t30 72v690q0 42 -30 72t-72 30z" />
+    <glyph glyph-name="meho" unicode="&#xe666;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM254 454q-25 0 -42.5 17.5t-17.5 42t17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5zM643 118
+h-264q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5h264q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM769.5 454q-24.5 0 -42 17.5t-17.5 42t17.5 42.5t42 18t42.5 -18t18 -42.5t-18 -42t-42.5 -17.5z" />
+    <glyph glyph-name="meh" unicode="&#xe667;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
+q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM254 514zM194 513.5q0 24.5 17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5t-42.5 17.5t-17.5 42zM770 514zM710 513.5q0 24.5 17.5 42.5
+t42 18t42.5 -18t18 -42.5t-18 -42t-42.5 -17.5t-42 17.5t-17.5 42zM643 190h-264q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h264q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5z" />
+    <glyph glyph-name="shoppingcart" unicode="&#xe668;" 
+d="M923 194h-596l30 61l497 1q13 0 22.5 8t11.5 20l69 386q3 16 -7.5 28t-26.5 12l-632 3l-5 25q-3 12 -13 20t-22 8h-155q-14 0 -24.5 -10.5t-10.5 -25t10.5 -25t24.5 -10.5h126l24 -112l58 -281l-75 -122q-13 -18 -3 -37t32 -19h63q-21 -28 -21 -62q0 -43 30 -73t72.5 -30
+t72.5 30t30 73q0 34 -20 62h161q-21 -28 -21 -62q0 -43 30 -73t72.5 -30t72.5 30t30 73q0 34 -20 62h113q15 0 25 10t10 24.5t-10 25t-25 10.5zM306 643l576 -2l-57 -316l-452 -1zM403 30q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22 -9.5t9 -22.5t-9 -22.5t-22 -9.5z
+M728 30q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22 -9.5t9 -22.5t-9 -22.5t-22 -9.5z" />
+    <glyph glyph-name="save" unicode="&#xe669;" 
+d="M650 768h-450q-30 0 -51 -21t-21 -51v-623q0 -30 21 -51t51 -21h623q30 0 51 21t21 51v450zM329 696h217v-206q0 -15 -10.5 -25.5t-25.5 -10.5h-145q-15 0 -25.5 10.5t-10.5 25.5v206zM823 73h-623v623h57v-206q0 -45 31.5 -76.5t76.5 -31.5h145q44 0 76 32t32 76v206h2
+l203 -203v-420v0zM469 526q15 0 25.5 10.5t10.5 25.5v43q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-43q0 -15 10.5 -25.5t25.5 -10.5z" />
+    <glyph glyph-name="user" unicode="&#xe66a;" 
+d="M819 103q-25 60 -71 106t-106 71q-20 9 -42 15q61 20 107 66q81 81 81 195t-81 194.5t-195 80.5t-194.5 -80.5t-80.5 -194.5t80 -195q46 -46 107 -66q-23 -6 -42 -15q-60 -25 -106 -71t-71 -106q-26 -62 -26 -130q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5
+q0 108 76.5 185t185 77t185 -76.5t76.5 -185.5q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q-1 68 -27 130zM309 556q0 84 59.5 143.5t143.5 59.5t143.5 -59.5t59.5 -143.5t-59.5 -144t-143.5 -60t-143.5 60t-59.5 144z" />
+    <glyph glyph-name="videocamera" unicode="&#xe66b;" 
+d="M1010 573q-11 10 -26 10q-9 0 -18 -5l-126 -67v188q0 29 -20.5 50t-50.5 21h-698q-29 0 -50 -21t-21 -50v-630q0 -29 21 -50t50 -21h698q30 0 50.5 21t20.5 50v203l123 -79q10 -6 22 -6q13 0 25 9q14 12 14 31v316q0 18 -14 30zM945 477v-178l-103 66v57zM761 667v-566
+q0 -10 -6.5 -17t-16.5 -7h-636q-9 0 -16 7t-7 17v566q0 10 7 17t16 7h636q10 0 16.5 -7t6.5 -17z" />
+    <glyph glyph-name="totop" unicode="&#xe66c;" 
+d="M920 74h-816q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h816q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM365.5 576q14.5 0 25.5 10l85 85v-449q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v449l85 -85q10 -10 25 -10t25.5 10.5t10.5 25.5
+t-10 25l-146 146q-11 11 -26 11t-25 -11l-147 -146q-10 -11 -10 -25.5t10.5 -25t25 -10.5z" />
+    <glyph glyph-name="team" unicode="&#xe66d;" 
+d="M839 409q-30 30 -67 47q44 23 72 64q35 51 35 113q0 84 -59 142.5t-142 58.5q-65 0 -117 -36q-45 -33 -67 -83q-60 64 -147 64q-84 0 -143 -59t-59 -142q0 -62 35 -113q28 -41 73 -65q-38 -17 -68 -47q-67 -67 -67 -161v-165q0 -37 26.5 -64t64.5 -27h276q27 0 49.5 15.5
+t33.5 40.5h248q37 0 64 26.5t27 63.5v165q-1 95 -68 162zM586 725q38 38 92 38t92 -38t38 -91.5t-38 -92t-92 -38.5t-92 38t-38 92t38 92zM216 578q0 54 38 92t92 38t92 -38t38 -92t-38 -92t-92 -38t-92 38t-38 92zM504 27q0 -8 -6 -13.5t-14 -5.5h-276q-8 0 -13.5 5.5
+t-5.5 13.5v165q0 65 46 111t111 46t112 -46l1 -1v-1q45 -46 45 -109v-165zM486 372q-21 17 -46 28q62 33 90 96q24 -25 54 -40q-38 -17 -68 -47q-17 -17 -30 -37zM835 82q0 -8 -5.5 -13.5t-13.5 -5.5h-241v129q0 69 -38 126q12 23 29 40q47 47 112 47t111 -46.5t46 -111.5
+v-165z" />
+    <glyph glyph-name="solution" unicode="&#xe66f;" 
+d="M575 608q0 15 -9.5 25.5t-23.5 10.5h-317q-13 0 -22.5 -10.5t-9.5 -25.5t9.5 -25.5t22.5 -10.5h317q14 0 23.5 10.5t9.5 25.5zM225 380h127q14 0 23.5 10.5t9.5 25.5t-9.5 25.5t-23.5 10.5h-127q-13 0 -22.5 -10.5t-9.5 -25.5t9.5 -25.5t22.5 -10.5zM225 188h191
+q14 0 23.5 10.5t9.5 25.5t-9.5 25.5t-23.5 10.5h-191q-13 0 -22.5 -10.5t-9.5 -25.5t9.5 -25.5t22.5 -10.5zM857 833h-690q-42 0 -72 -30t-30 -72v-690q0 -42 30 -72t72 -30h254q15 0 25.5 10.5t10.5 24.5q1 15 -10 26t-26 11h-254q-12 0 -21 9t-9 21v690q0 12 9 21t21 9
+h690q12 0 21 -9t9 -21v-373q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v373q0 42 -30 72t-72 30zM894 94q-25 26 -57 42q33 38 33 88q0 57 -40 97t-96.5 40t-96.5 -40t-40 -97q0 -52 36 -91q-28 -15 -51 -37q-49 -48 -62 -116q-3 -16 7.5 -29t27.5 -13v0
+q13 0 23 8t13 21q10 52 51 86t95 34t95.5 -34t51.5 -86q3 -13 12.5 -21t22.5 -8v0q17 0 28 13t8 29q-13 66 -61 114zM733.5 160q-26.5 0 -45.5 19t-19 45.5t19 45.5t45.5 19t45.5 -19t19 -45.5t-19 -45.5t-45.5 -19z" />
+    <glyph glyph-name="sharealt" unicode="&#xe671;" 
+d="M814 233q-38 0 -70.5 -18t-53.5 -49l-236 168q6 24 6 48q0 39 -15 75l257 130q45 -51 112 -51q61 0 104.5 43.5t43.5 104.5t-43.5 104.5t-104.5 43.5t-104.5 -43.5t-43.5 -104.5q0 -17 4 -33l-264 -133q-59 62 -144 62q-82 0 -140 -58t-58 -140t58 -140t140 -58
+q49 0 91.5 22.5t69.5 60.5l243 -172v-10q0 -61 43.5 -104.5t104.5 -43.5t104.5 43.5t43.5 104.5t-43.5 104.5t-104.5 43.5zM814 760q31 0 53.5 -22.5t22.5 -54t-22.5 -53.5t-53.5 -22t-53.5 22t-22.5 53.5t22.5 54t53.5 22.5zM262 256q-52 0 -89 37t-37 89t37 89t89 37
+t89 -37t37 -89t-37 -89t-89 -37zM814 9q-31 0 -53.5 22t-22.5 53.5t22.5 54t53.5 22.5t53.5 -22.5t22.5 -54t-22.5 -53.5t-53.5 -22z" />
+    <glyph glyph-name="setting" unicode="&#xe672;" 
+d="M962 456l-4 24l-73 25q-10 30 -24 58l34 69l-14 19q-43 60 -102 103l-20 14l-69 -35q-28 14 -58 24l-24 73l-24 4q-39 6 -72 6t-72 -6l-24 -4l-25 -73q-30 -10 -57 -24l-69 35l-20 -15q-59 -43 -102 -102l-14 -20l34 -69q-14 -28 -24 -57l-73 -25l-4 -24q-6 -39 -6 -72
+t6 -72l4 -24l73 -25q10 -30 24 -57l-34 -69l14 -20q22 -30 47 -55q23 -23 55 -47l20 -14l69 34q28 -14 57 -24l25 -73l24 -4q39 -6 72 -6t72 6l24 4l25 73q29 10 57 24l69 -35l20 15q32 23 55 47q24 23 47 55l14 20l-34 69q14 28 24 58l73 24l4 24q6 39 6 72t-6 72zM896 385
+v-1q0 -19 -2 -42l-36 -11l-31 -11l-10 -32q-8 -27 -21 -52l-16 -29l32 -63q-14 -17 -28 -31v-1q-14 -14 -32 -27l-62 31l-29 -15q-26 -13 -54 -22l-31 -10l-10 -31l-12 -35q-21 -3 -42 -3q-19 0 -42 3l-11 35l-11 31l-31 10q-28 9 -53 22l-29 15l-30 -15l-33 -16
+q-17 13 -31 28q-15 14 -28 31l31 62l-15 29q-14 27 -22 53l-10 32l-66 22q-3 21 -3 42q0 19 3 42l66 22l10 31q8 27 22 53l15 30l-15 29l-16 33q26 33 59 59l62 -31l30 15q25 14 53 22l31 10l10 31l12 36q23 2 42 2q20 0 42 -2l22 -67l31 -9q28 -9 54 -22l29 -16l62 32
+q33 -27 60 -60l-32 -62l15 -29q14 -26 23 -53l9 -32l31 -10l36 -12q3 -22 2 -41zM512 558q-72 0 -123 -51t-51 -123t51 -123t123 -51t123 51t51 123t-51 123t-123 51zM584 312q-30 -30 -72 -30t-72 30t-30 72t30 72t72.5 30t72 -30t29.5 -72t-30 -72z" />
+    <glyph glyph-name="picture" unicode="&#xe674;" 
+d="M886 768h-752q-30 0 -51 -21.5t-21 -50.5v-626q0 -29 21 -50.5t51 -21.5h752q30 0 51 21.5t21 50.5v626q0 30 -21 51t-51 21zM886 70v0h-752v0v213l186 190l217 -270q9 -10 22.5 -11.5t24.5 5.5l161 109l141 -67v-169zM886 330l-118 48q-21 16 -42 2l-156 -105l-222 275
+q-10 12 -26 12t-27 -11l-161 -165v310v0h752v0v-366zM696 622q-42 0 -71.5 -29.5t-29.5 -71.5t29.5 -71.5t71.5 -29.5t71.5 29.5t29.5 71.5t-29.5 71.5t-71.5 29.5zM696 492q-12 0 -20.5 8.5t-8.5 20.5t8.5 20.5t20.5 8.5t20.5 -8.5t8.5 -20.5t-8.5 -20.5t-20.5 -8.5z" />
+    <glyph glyph-name="phone" unicode="&#xe675;" 
+d="M914 733q-66 101 -128 101q-36 0 -64 -28q-48 -48 -77 -93q-44 -68 -29 -115q4 -15 17.5 -31t44.5 -47v0q32 -32 38 -41q10 -14 -19 -60q-27 -43 -99 -118q-61 -58 -99 -85q-48 -35 -71 -35q-5 0 -8 2q-9 7 -41 38q-32 32 -47.5 45t-30.5 17q-12 4 -25 4q-43 0 -100 -40
+q-40 -27 -82 -70q-33 -32 -28 -73q6 -57 100 -119q78 -50 176 -50q101 0 210.5 53.5t206.5 151.5q68 68 117 144q48 76 70 153q49 170 -32 296zM878 457q-20 -67 -63 -135q-43 -69 -106 -132q-44 -44 -92 -80q-47 -34 -95 -58q-47 -22 -93 -34q-45 -12 -87 -12
+q-77 0 -137 39q-35 23 -52 40q-16 16 -17 27q-1 7 8 15q39 39 72 62q39 27 60 27q2 0 3 -1q5 -2 12 -9q11 -9 38 -35q35 -36 49 -46l2 -1q21 -14 48 -14q24 0 52 12q27 11 61 36q41 30 106 91l1 1l2 2q76 80 107 129q16 25 24 47q7 20 8 37q2 31 -15 55q-10 14 -44 48l-2 2
+q-26 26 -35 37q-7 9 -9 13q-4 16 21 55q24 37 67 80v0q8 8 14 8q10 0 26 -15q18 -17 42 -54q31 -48 38 -106q6 -62 -14 -131z" />
+    <glyph glyph-name="paperclip" unicode="&#xe676;" 
+d="M885 629q-73 72 -177 72v0q-49 0 -94 -18q-46 -18 -82 -53l-233 -231q-42 -41 -41.5 -99.5t42 -100t100.5 -41.5h1q59 0 100 41l205 202q10 10 10 25t-10 25q-11 10 -25.5 10t-25.5 -10l-204 -202q-21 -21 -50 -21h-1q-30 1 -50 21q-21 21 -21 50.5t20 49.5l233 231
+q52 50 126 50v0q74 0 126.5 -51.5t52.5 -124.5t-52 -124l-247 -245q-76 -75 -186 -75v0q-110 0 -187 76.5t-77.5 184.5t76.5 184l319 316q10 10 10 24.5t-10 25.5q-11 10 -25.5 10t-25.5 -10l-319 -316q-47 -47 -73 -109q-24 -60 -24 -125t25 -125q25 -62 73 -110
+q48 -47 111 -72q60 -25 127 -25v0q66 0 126 24q63 25 110 72l248 245q35 35 54 81q18 45 18 93q0 103 -73 175z" />
+    <glyph glyph-name="notification" unicode="&#xe677;" 
+d="M922 518h-57v18q0 20 -14 34.5t-34 14.5h-172q-12 24 -33 24q-70 0 -145 22.5t-132 54.5t-103 63.5t-72 54t-25 22.5q-10 6 -22 6q-19 0 -33 -13.5t-14 -33.5v-801q0 -20 14 -34t33 -14q13 0 24 7q4 6 12.5 15t35 36t55.5 52t73.5 55t89 51.5t101 36.5t111.5 15
+q19 0 30 22h4q2 -74 -25 -171q-6 -20 1.5 -39.5t24.5 -31.5q16 -10 35 -10q22 0 40 15q84 69 105 169q7 34 6 68q4 5 10 14q19 29 19 45v23h57q15 0 25.5 10.5t10.5 25.5v138q0 15 -10.5 25.5t-25.5 10.5zM584 275q-92 -6 -186 -46q-84 -36 -167 -98q-48 -37 -93 -81v679
+q50 -39 104 -73q83 -51 165 -81q91 -33 177 -37v-2v-7v-253v-1zM793 291q-6 -10 -14 -21q-5 -3 -8 -7q-11 -13 -8 -30v0q4 -27 -3 -60q-13 -62 -59 -109q29 116 18 202q-2 14 -12 23t-24 9h-25v30q0 4 -2 9v176h137v-222zM886 380h-21v66h21v-66z" />
+    <glyph glyph-name="menuunfold" unicode="&#xe679;" 
+d="M925 695h-828q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5h828q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM99 450h565q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5h-565q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5zM97 72h825
+q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5h-825q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5zM827 281q-11 -10 -26 -10t-25 11q-11 10 -11 25t11 25l96 94l-94 88q-11 11 -11.5 26t9.5 25.5t25 11t26 -9.5l121 -114q11 -11 11 -26t-11 -26z" />
+    <glyph glyph-name="inbox" unicode="&#xe67a;" 
+d="M885 450v0l-112 286q-4 12 -14 19.5t-23 7.5h-455q-13 0 -23 -8t-14 -20l-105 -282v-1v0q-2 -8 -1 -15v-5v-366q0 -25 17.5 -43t42.5 -18h628q25 0 43 18t18 43v366q0 3 -1 4q1 7 -1 14zM589 493v-16q0 -34 -21.5 -54.5t-55.5 -20.5t-55 20.5t-21 54.5l-1 16h-205l79 193
+h399l82 -193h-201zM214 416h158q18 -43 55 -67t85 -24q52 0 90 27q34 24 51 64h157v-334h-596v334z" />
+    <glyph glyph-name="lock" unicode="&#xe67b;" 
+d="M801 596q-24 60 -67 106q-43 45 -100 71q-58 26 -122 26t-122 -26q-56 -26 -99.5 -71.5t-67.5 -105.5q-25 -61 -25 -128v-436q0 -26 18 -45t43 -19h505q26 0 44 19t18 45v385v17v34q0 67 -25 128zM414 714h1l1 1q45 21 96 21q50 0 96 -21q45 -20 80 -57t54 -85
+q21 -50 21 -105v-27h-502v0v27q0 55 20 105q20 48 55 85t78 56zM763 377v-345v-1h-502v1v345h502zM483 235v-83q0 -12 8.5 -20.5t20.5 -8.5t21 8.5t9 20.5v83q24 16 24 46q0 22 -15.5 38t-38 16t-38.5 -16t-16 -38q0 -30 25 -46z" />
+    <glyph glyph-name="qrcode" unicode="&#xe67c;" 
+d="M876 492h-63v-103h-91v103h-153v102h-51v39h51v52h51v63h-51v51h-166v-63h103v-39h-52v-115h52v-90h-52v-52h-90v52h-63v-52h-39v52h-115v-52h-51v-63h63v51h91v-51h51v-102h63v102h102v52h193v-40h-153v-63h51v-102h114v63h-51v39h205v51h39v-51h63v63h-51v103zM466 287
+h-63v-166h51v-39h-51v-63h103v-51h63v51h51v63h-63v-51h-39v90h102v64h-154v102zM96 338h63v-63h-63v63zM153 531h154q23 0 40 17t17 40v154q0 23 -17 40t-40 17h-154q-23 0 -40 -17t-17 -40v-154q0 -23 17 -40t40 -17zM159 594v142h142v-142h-142zM198 697h64v-64h-64v64z
+M870 799h-154q-23 0 -40 -17t-17 -40v-154q0 -23 17 -40t40 -17h154q24 0 40.5 17t16.5 40v154q0 23 -16.5 40t-40.5 17zM864 736v-142h-142v142h142zM762 697h63v-64h-63v64zM870 236h-154q-23 0 -40 -17t-17 -40v-154q0 -24 17 -40.5t40 -16.5h154q24 0 40.5 16.5
+t16.5 40.5v154q0 23 -16.5 40t-40.5 17zM864 173v-142h-142v142h142zM762 133h63v-63h-63v63zM307 236h-154q-23 0 -40 -17t-17 -40v-154q0 -24 17 -40.5t40 -16.5h154q23 0 40 16.5t17 40.5v154q0 23 -17 40t-40 17zM301 173v-142h-142v142h142zM198 133h64v-63h-64v63z
+" />
+    <glyph glyph-name="tags" unicode="&#xe67d;" 
+d="M910 352l-360 362q-12 13 -30 13h-362q-26 0 -44 -18t-18 -43v-224q0 -17 12 -30l359 -354q18 -18 43.5 -18t44.5 18l28 28l28 -28q19 -18 44 -18t44 18l210 208q18 17 18 42.5t-17 43.5zM280 457q-32 0 -54.5 22.5t-22.5 54.5t22.5 54.5t54.5 22.5t54.5 -22.5
+t22.5 -54.5t-22.5 -54.5t-54.5 -22.5v0zM869 306l-210 -207q-2 -2 -4 -2t-4 2l-32 31l142 140q16 16 16 39t-16 39l-319 322h72l355 -358q1 -1 1 -3t-1 -3v0zM869 306zM280 560q-11 0 -18.5 -7.5t-7.5 -18.5t7.5 -18.5t18.5 -7.5t18.5 7.5t7.5 18.5t-7.5 18.5t-18.5 7.5v0z
+" />
+    <glyph glyph-name="tagso" unicode="&#xe67e;" 
+d="M280 617q-34 0 -58.5 -24t-24.5 -58.5t24.5 -59t58.5 -24.5t58.5 24.5t24.5 59t-24.5 58.5t-58.5 24zM280 514q-8 0 -14 6t-6 14t6 14t14 6t14 -6t6 -14t-6 -14t-14 -6zM910 352l-360 362q-12 13 -30 13h-362q-26 0 -44 -18t-18 -43v-224q0 -17 12 -30l359 -354
+q18 -18 43.5 -18t44.5 18l28 28l28 -28q19 -18 44 -18t44 18l210 208q18 17 18 42.5t-17 43.5zM765 266q18 17 18 42.5t-18 43.5l-309 312h56l351 -355l-208 -205l-27 26zM159 451v213h209l351 -355l-140 -138l-37 -36l-31 -31z" />
+    <glyph glyph-name="cloudo" unicode="&#xe67f;" 
+d="M702 35h-404q-48 0 -90.5 17t-76.5 50q-34 34 -52 76t-18 90q0 83 53 147q19 23 42 40q0 38 15 71q14 33 41 60l1 1q27 26 61 39.5t72 13.5q12 0 24 -1q24 26 54 46q72 48 159 48q58 0 109 -20q51 -21 92 -61q42 -41 63 -90q14 -34 19 -71q32 -25 55 -60l7 -11v-1
+q35 -59 35 -128q0 -52 -19 -99q-20 -46 -58 -83t-84 -56q-47 -18 -100 -18zM263 535q-18 -17 -26 -37v0q-9 -21 -9 -44q0 -7 1 -13l2 -23l-19 -12q-24 -14 -43 -37v0q-36 -44 -36 -101q0 -33 12 -62t36.5 -52.5t53.5 -35.5q29 -11 63 -11h404q39 0 72.5 13.5t61 40
+t41.5 59.5t14 71q0 54 -29 98l-2 4q-20 29 -49 49l-14 10l-2 17q-2 34 -15 64q-15 37 -47 67q-31 31 -68 46q-38 15 -82 15q-66 0 -119 -35q-30 -21 -51 -48l-15 -19l-23 6q-14 4 -30 3q-24 0 -44.5 -8t-37.5 -25z" />
+    <glyph glyph-name="cloud" unicode="&#xe680;" 
+d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5
+t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128z" />
+    <glyph glyph-name="cloudupload" unicode="&#xe681;" 
+d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5
+t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128zM751.5 367.5q-10.5 -10.5 -25.5 -10.5t-26 11l-68 68v-246q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5t-10.5 25.5v246l-68 -69q-11 -10 -25.5 -10t-25 10.5t-10.5 25.5t10 25l130 130q10 10 25 10
+t25 -10l130 -130q11 -10 11 -25t-10.5 -25.5z" />
+    <glyph glyph-name="clouddownload" unicode="&#xe682;" 
+d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5
+t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128zM751 294l-129 -130q-11 -10 -26 -10t-25 10l-130 130q-10 10 -10 25t10.5 25.5t25 10.5t25.5 -11l68 -68v246q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5v-246l69 68q10 11 25 11t25.5 -10.5
+t10.5 -25.5t-11 -25z" />
+    <glyph glyph-name="clouddownloado" unicode="&#xe683;" 
+d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5
+t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128zM142 203q-11 25 -11 55q0 25 8 47t24 42h1q17 22 40 35l38 22l-6 43q-1 5 -1 13q0 19 7 36v1q7 16 21 29t31 20t36 7q15 0 28 -4l43 -12l26 36q21 27 51 48q50 33 111 33q42 0 77 -15q36 -14 65 -42
+q29 -29 43 -63q13 -29 15 -63l1 -31l27 -18q27 -18 46 -45l2 -3q14 -21 21 -43.5t7 -47.5q0 -35 -13 -65t-38.5 -54.5t-55.5 -36.5q-31 -13 -67 -13h-440q-31 0 -57 11q-25 10 -48 31q-21 21 -31 45v0zM466.5 355q14.5 0 25.5 -11l68 -68v246q0 15 10.5 25.5t25.5 10.5
+t25.5 -10.5t10.5 -25.5v-246l69 68q10 11 25 11t25.5 -10.5t10.5 -25.5t-11 -25l-129 -130q-11 -10 -26 -10t-25 10l-130 130q-10 10 -10 25t10.5 25.5t25 10.5z" />
+    <glyph glyph-name="clouduploado" unicode="&#xe684;" 
+d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5
+t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128zM142 203q-11 25 -11 55q0 25 8 47t24 42h1q17 22 40 35l38 22l-6 43q-1 5 -1 13q0 19 7 36v1q7 16 21 29t31 20t36 7q15 0 28 -4l43 -12l26 36q21 27 51 48q50 33 111 33q42 0 77 -15q36 -14 65 -42
+q29 -29 43 -63q13 -29 15 -63l1 -31l27 -18q27 -18 46 -45l2 -3q14 -21 21 -43.5t7 -47.5q0 -35 -13 -65t-38.5 -54.5t-55.5 -36.5q-31 -13 -67 -13h-440q-31 0 -57 11q-25 10 -48 31q-21 21 -31 45v0zM466.5 357q14.5 0 25.5 11l68 68v-246q0 -15 10.5 -25.5t25.5 -10.5
+t25.5 10.5t10.5 25.5v246l69 -68q10 -11 25 -11t25.5 10.5t10.5 25.5t-11 25l-129 130q-11 10 -26 10t-25 -10l-130 -130q-10 -10 -10 -25t10.5 -25.5t25 -10.5z" />
+    <glyph glyph-name="enviroment" unicode="&#xe685;" 
+d="M512 592q-54 0 -92 -38.5t-38 -92.5t38 -92t92 -38t92 38t38 92t-38 92.5t-92 38.5zM871 621q-31 62 -86 109t-125 74q-71 26 -148 26v0q-77 0 -149 -26q-69 -27 -124 -74t-86 -109q-32 -64 -32 -133q0 -97 47 -197q39 -83 109 -164q92 -108 212 -192q10 -7 22.5 -7
+t23.5 7q120 85 212 192q70 82 109 164q47 100 47 197q0 69 -32 133zM655 319q-59 -59 -143 -59t-143 59t-59 142.5t59 142.5t143 59t143 -59t59 -142.5t-59 -142.5z" />
+    <glyph glyph-name="enviromento" unicode="&#xe686;" 
+d="M512 663q-84 0 -143 -59t-59 -142.5t59 -142.5t143 -59t143 59t59 142.5t-59 142.5t-143 59zM512 331q-54 0 -92 38t-38 92t38 92.5t92 38.5t92 -38.5t38 -92.5t-38 -92t-92 -38zM871 621q-31 62 -86 109t-125 74q-71 26 -148 26v0q-77 0 -149 -26q-69 -27 -124 -74
+t-86 -109q-32 -64 -32 -133q0 -97 47 -197q39 -83 109 -164q92 -108 212 -192q10 -7 22.5 -7t23.5 7q120 85 212 192q70 82 109 164q47 100 47 197q0 69 -32 133zM831 487q0 -81 -40 -166q-34 -73 -98 -148q-77 -90 -181 -166q-104 76 -181 166q-63 75 -98 148
+q-40 85 -40 167q0 53 24 102q25 48 69 86q45 39 102 61q60 22 124 22v0q64 0 124 -22q57 -22 102 -61q45 -38 69 -86q24 -50 24 -103z" />
+    <glyph glyph-name="eye" unicode="&#xe687;" 
+d="M512 487q-42 0 -72 -30t-30 -72t30 -72t72 -30t72 30t30 72t-30 72t-72 30zM963 384q0 14 -21 62q-26 65 -61 109q-57 71 -139 112q-99 50 -230 50t-231 -50q-80 -41 -138 -112q-34 -43 -61 -109q-21 -48 -21 -62v0v0v0v0q0 -14 21 -62q27 -66 61 -109q57 -71 139 -112
+q100 -50 230 -50t230 50q81 41 139 112q35 44 62 109q20 48 20 62v0v0v0v0zM512 212q-72 0 -122.5 50.5t-50.5 122t50.5 122.5t122.5 51t122.5 -51t50.5 -122.5t-50.5 -122t-122.5 -50.5z" />
+    <glyph glyph-name="eyeo" unicode="&#xe688;" 
+d="M963 384q0 14 -21 62q-26 65 -61 109q-57 71 -139 112q-99 50 -230 50t-231 -50q-80 -41 -138 -112q-34 -43 -61 -109q-21 -48 -21 -62v0v0v0v0q0 -14 21 -62q27 -66 61 -109q57 -71 139 -112q100 -50 230 -50t230 50q81 41 139 112q35 44 62 109q20 48 20 62v0v0v0v0z
+M889 384q-25 -77 -64 -126h-1q-46 -59 -114 -93q-85 -42 -198.5 -42t-198.5 42q-67 34 -114 93q-40 49 -65 126q25 77 65 126q47 59 114 93q85 43 199 43t198 -43q67 -33 114 -93q40 -49 65 -126zM512 558q-72 0 -122.5 -50.5t-50.5 -122.5t50.5 -122.5t122.5 -50.5
+t122.5 50.5t50.5 122.5t-50.5 122.5t-122.5 50.5zM614 385q0 -42 -30 -72t-72 -30t-72 30t-30 72t30 72t72 30t72 -30t30 -72z" />
+    <glyph glyph-name="camera" unicode="&#xe689;" 
+d="M899 659h-168l-94 100h-1q-10 10 -26 10h-196q-16 0 -27 -10v0l-94 -100h-168q-26 0 -44.5 -18.5t-18.5 -44.5v-532q0 -26 18.5 -44.5t44.5 -18.5l774 -1q26 0 44.5 19t18.5 45v532q0 26 -18.5 44.5t-44.5 18.5zM428 696h168l35 -37h-238zM511 164q-72 0 -123 51t-51 123
+t51 123t123 51t123 -51t51 -123t-51 -123t-123 -51zM511 440q-42 0 -72 -30t-30 -72.5t30 -72.5t72.5 -30t72.5 30t30 72.5t-30 72.5t-73 30z" />
+    <glyph glyph-name="camerao" unicode="&#xe68a;" 
+d="M511 164q72 0 123 51t51 123t-51 123t-123 51t-123 -51t-51 -123t51 -123t123 -51zM439 410q30 30 72.5 30t72.5 -30t30 -72.5t-30 -72.5t-72.5 -30t-72.5 30t-30 72.5t30 72.5zM899 659h-168l-94 100h-1q-10 10 -26 10h-196q-16 0 -27 -10v0l-94 -100h-168
+q-26 0 -44.5 -18.5t-18.5 -44.5v-532q0 -26 18.5 -44.5t44.5 -18.5l774 -1q26 0 44.5 19t18.5 45v532q0 26 -18.5 44.5t-44.5 18.5zM428 696h168l35 -37h-238zM881 81h-739v497h739v-497z" />
+    <glyph glyph-name="windows" unicode="&#xe68b;" 
+d="M527 27l434 -71v401h-434v-330zM527 758v-329h434v401zM68 429h367v317l-367 -61v-256zM68 99l367 -60v318h-367v-258z" />
+    <glyph glyph-name="export2" unicode="&#xe690;" 
+d="M248.5 473q14.5 0 25 10.5t10.5 25.5v203q0 8 5.5 13.5t13.5 5.5h567q8 0 13 -5.5t5 -13.5v-587q0 -7 -5 -12.5t-13 -5.5h-255q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h255q37 0 63.5 26.5t26.5 63.5v587q0 38 -26.5 64t-63.5 26h-567q-38 0 -64 -26
+t-26 -64v-203q0 -15 10.5 -25.5t25 -10.5zM622 263q44 66 55 136q2 14 -7 26t-23 14q-3 1 -5 1q-14 0 -24 -9t-12 -22l-3.5 -17.5t-14 -40t-26.5 -50.5q-70 -104 -206 -104h-4q-14 0 -25 -10.5t-11 -25.5v-42l-100 96l101 84v-35q0 -14 10.5 -24.5t25 -10.5t25 10.5
+t10.5 24.5v111q0 23 -20 33q-7 3 -16 3q-12 0 -22 -8l-190 -159q-13 -10 -13 -26q-1 -16 11 -27l190 -181q17 -16 38.5 -7t21.5 33v91q152 13 234 136z" />
+    <glyph glyph-name="export" unicode="&#xe691;" 
+d="M838 330q-15 0 -25.5 -10.5t-10.5 -25.5v-204q0 -8 -5.5 -13t-12.5 -5h-567q-8 0 -13.5 5t-5.5 13v587q0 8 5.5 13.5t13.5 5.5h254q15 0 25.5 10.5t10.5 25t-10.5 25t-25.5 10.5h-254q-37 0 -63.5 -26t-26.5 -64v-587q0 -37 26.5 -63.5t63.5 -26.5h567q37 0 63.5 26.5
+t26.5 63.5v204q0 15 -10.5 25.5t-25.5 10.5zM464 540q-45 -68 -54 -136q-2 -15 7 -26.5t23 -13.5q2 -1 5 -1q13 0 23.5 9t12.5 22q0 5 3 17.5t14 40t27 50.5q70 103 206 104l3 -1q15 0 25.5 10.5t10.5 25.5v42l101 -95l-101 -84v34q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5
+t-10.5 -25.5v-111q0 -22 21 -32q7 -3 15 -3q13 0 23 8l190 158q12 11 13 26q0 17 -11 28l-190 181q-17 16 -39 6.5t-22 -32.5v-91q-152 -13 -234 -136z" />
+    <glyph glyph-name="edit" unicode="&#xe692;" 
+d="M862 68h-701q-14 0 -24 -10t-10 -24.5t10 -24.5t24 -10h701q14 0 24 10t10 24.5t-10 24.5t-24 10zM334 171q7 0 14 3h1l195 91l2 1l332 332q18 18 18 43t-18 42l-67 67q-18 18 -42.5 18t-42.5 -18l-331 -330l-1 -2l-1 -2l-91 -194q-9 -18 2 -35q11 -16 30 -16zM728 656
+l40 40l55 -55l-40 -40zM402 275l49 103l229 229l55 -55l-229 -229z" />
+    <glyph glyph-name="circledowno" unicode="&#xe693;" 
+d="M512 895q-104 0 -199 -40.5t-163.5 -109t-109 -163t-40.5 -199t40.5 -199t109 -163t163.5 -109t199 -40.5t198.5 40.5t163 109t109 163t40.5 199t-40.5 199t-109 163t-163 109t-198.5 40.5zM822 73q-61 -61 -139 -94q-82 -35 -171.5 -35t-171.5 35q-79 33 -139.5 94
+t-94.5 140q-34 81 -34 170.5t35 171.5q33 79 94 139.5t140 94.5q81 34 170.5 34t171.5 -34q79 -34 139.5 -95t94.5 -139q34 -82 34 -171.5t-34 -171.5q-34 -78 -95 -139zM768 520q-16 0 -28 -12l-229 -229l-228 228q-12 12 -28.5 12t-28 -11.5t-11.5 -28t12 -28.5l256 -255
+q11 -12 27.5 -12t28.5 12l257 256q12 12 12 28.5t-12 27.5q-12 12 -28 12z" />
+    <glyph glyph-name="circledown" unicode="&#xe694;" 
+d="M512 895q-104 0 -199 -40.5t-163.5 -109t-109 -163t-40.5 -199t40.5 -199t109 -163t163.5 -109t199 -40.5t198.5 40.5t163 109t109 163t40.5 199t-40.5 199t-109 163t-163 109t-198.5 40.5zM796 452l-258 -256q-11 -12 -27 -12q-17 0 -28 12l-256 255q-12 12 -12 28.5
+t11.5 28t28 11.5t28.5 -12l227 -228l230 229q12 12 28.5 12t28 -11.5t11.5 -28.5q0 -16 -12 -28z" />
+    <glyph glyph-name="appstoreo" unicode="&#xe695;" 
+d="M380 335h-233q-34 0 -58.5 -24.5t-24.5 -58.5v-233q0 -34 24.5 -58.5t58.5 -24.5h233q34 0 58.5 24.5t24.5 58.5v233q0 34 -24.5 58.5t-58.5 24.5zM395 19q0 -6 -5 -11q-4 -4 -10 -4h-233q-6 0 -10.5 4.5t-4.5 10.5v233q0 6 4.5 10.5t10.5 4.5h233q6 0 10.5 -4.5
+t4.5 -10.5v-233v0zM380 831h-233q-34 0 -58.5 -24.5t-24.5 -58.5v-233q0 -34 24.5 -58.5t58.5 -24.5h233q34 0 58.5 24.5t24.5 58.5v233q0 34 -24.5 58.5t-58.5 24.5zM395 515q0 -6 -5 -11q-4 -4 -10 -4h-233q-6 0 -10.5 4.5t-4.5 10.5v233q0 6 4.5 10.5t10.5 4.5h233
+q6 0 10.5 -4.5t4.5 -10.5v-233v0zM876 335h-233q-34 0 -58.5 -24.5t-24.5 -58.5v-233q0 -34 24.5 -58.5t58.5 -24.5h233q35 0 59 24.5t24 58.5v233q0 34 -24.5 58.5t-58.5 24.5zM891 19q0 -6 -4 -11q-5 -4 -11 -4h-233q-6 0 -10.5 4.5t-4.5 10.5v233q0 6 4.5 10.5t10.5 4.5
+h233q6 0 10.5 -4.5t4.5 -10.5v-233zM876 831h-233q-34 0 -58.5 -24.5t-24.5 -58.5v-233q0 -34 24.5 -58.5t58.5 -24.5h233q35 0 59 24.5t24 58.5v233q0 34 -24.5 58.5t-58.5 24.5zM891 515q0 -6 -4 -11q-5 -4 -11 -4h-233q-6 0 -10.5 4.5t-4.5 10.5v233q0 6 4.5 10.5
+t10.5 4.5h233q6 0 10.5 -4.5t4.5 -10.5v-233z" />
+    <glyph glyph-name="appstore" unicode="&#xe696;" 
+d="M380 335h-233q-34 0 -58.5 -24.5t-24.5 -58.5v-233q0 -34 24.5 -58.5t58.5 -24.5h233q34 0 58.5 24.5t24.5 58.5v233q0 34 -24.5 58.5t-58.5 24.5zM380 831h-233q-34 0 -58.5 -24.5t-24.5 -58.5v-233q0 -34 24.5 -58.5t58.5 -24.5h233q34 0 58.5 24.5t24.5 58.5v233
+q0 34 -24.5 58.5t-58.5 24.5zM876 335h-233q-34 0 -58.5 -24.5t-24.5 -58.5v-233q0 -34 24.5 -58.5t58.5 -24.5h233q35 0 59 24.5t24 58.5v233q0 34 -24.5 58.5t-58.5 24.5zM876 831h-233q-34 0 -58.5 -24.5t-24.5 -58.5v-233q0 -34 24.5 -58.5t58.5 -24.5h233q35 0 59 24.5
+t24 58.5v233q0 34 -24.5 58.5t-58.5 24.5z" />
+    <glyph glyph-name="scan" unicode="&#xe697;" 
+d="M128.5 584q13.5 0 23 9.5t9.5 22.5v99q0 8 5.5 13.5t13.5 5.5h99q13 0 22.5 9.5t9.5 23t-9.5 23t-22.5 9.5h-126q-23 0 -40 -17t-17 -40v-126q0 -13 9.5 -22.5t23 -9.5zM279 33h-99q-8 0 -13.5 5.5t-5.5 13.5v98q0 14 -9.5 23.5t-23 9.5t-23 -9.5t-9.5 -23.5v-125
+q0 -24 17 -40.5t40 -16.5h126q13 0 22.5 9.5t9.5 23t-9.5 23t-22.5 9.5zM894.5 183q-13.5 0 -23 -9.5t-9.5 -23.5v-98q0 -8 -5.5 -13.5t-13.5 -5.5h-99q-13 0 -22.5 -9.5t-9.5 -23t9.5 -23t22.5 -9.5h126q24 0 40.5 16.5t16.5 40.5v125q0 14 -9.5 23.5t-23 9.5zM870 799
+h-126q-13 0 -22.5 -9.5t-9.5 -23t9.5 -23t22.5 -9.5h99q8 0 13.5 -5.5t5.5 -13.5v-99q0 -13 9.5 -22.5t23 -9.5t23 9.5t9.5 22.5v126q0 23 -16.5 40t-40.5 17zM250 588v-409q0 -24 16.5 -41t40.5 -17h409q24 0 41 17t17 41v409q0 24 -17 40.5t-41 16.5h-409
+q-24 0 -40.5 -16.5t-16.5 -40.5zM311 202v362q0 8 6 14t14 6h361q9 0 14.5 -6t5.5 -14v-362q0 -8 -5.5 -13.5t-14.5 -5.5h-361q-8 0 -14 5.5t-6 13.5z" />
+    <glyph glyph-name="hdd" unicode="&#xe69a;" 
+d="M786 765v0q-4 15 -17 24.5t-29 9.5h-462q-16 0 -29 -9.5t-17 -24.5v0q-3 -8 -68 -243q-68 -245 -68 -248v-257q0 -20 14.5 -34.5t34.5 -14.5h733q20 0 34.5 14.5t14.5 34.5l1 265zM864 224v-193h-705v193h705zM861 287h-699l127 449h440zM588 70q13 0 22.5 9.5t9.5 22.5
+v51q0 13 -9.5 22.5t-22.5 9.5t-22 -9.5t-9 -22.5v-51q0 -13 9 -22.5t22 -9.5zM691 70q13 0 22.5 9.5t9.5 22.5v51q0 13 -9.5 22.5t-22.5 9.5t-22 -9.5t-9 -22.5v-51q0 -13 9 -22.5t22 -9.5zM794 70q13 0 22 9.5t9 22.5v51q0 13 -9 22.5t-22 9.5t-22.5 -9.5t-9.5 -22.5v-51
+q0 -13 9.5 -22.5t22.5 -9.5z" />
+    <glyph glyph-name="ie" unicode="&#xe69b;" 
+d="M878 548q24 66 22 118q-3 57 -37 91q-33 33 -111.5 27.5t-173.5 -47.5q-13 1 -27 1q-65 0 -126 -21q-58 -21 -107 -60q-101 -80 -132 -203l-7 -28l17 22q69 89 150 136q-22 -21 -25 -25q-73 -73 -126 -159q-49 -80 -75 -160q-25 -75 -24 -135t28 -88q37 -36 99 -36
+q69 0 160 44q78 -39 168 -39q121 0 219 70t137 184l3 8h-213l-1 -3q-21 -38 -58 -60t-80.5 -22t-80.5 22t-57 60q-18 32 -19 69h319h204l1 5q2 20 2 43q0 100 -49 186zM201 222q45 -111 146 -177q-54 -23 -95 -26q-45 -3 -67 20q-23 23 -19 71t35 112zM859 578
+q-30 42 -70 75q-39 32 -85 53q108 42 149 1q37 -38 6 -129zM402 423q5 57 48 96t101 39t100.5 -39t48.5 -96h-298z" />
+    <glyph glyph-name="delete" unicode="&#xe69f;" 
+d="M178 -50q-1 0 -3 1l1 -0.5t2 -0.5zM170 -46q-3 2 -5 3q2 -1 5 -3zM950.5 692.5q-10.5 10.5 -26.5 10.5h-184v58q0 29 -21 49.5t-50 20.5h-314q-30 0 -50.5 -20.5t-20.5 -49.5v-58h-185q-15 0 -25.5 -10.5t-10.5 -25t10.5 -25t25.5 -10.5h31v-623q0 -29 21 -49.5t50 -20.5
+h632q29 0 50 20.5t21 49.5v623h20q15 0 26 10.5t11 25t-10.5 25zM354 760h315v-57h-315v57zM833 9h-632v623h91h541v-623v0zM511.5 512q-14.5 0 -25 -10.5t-10.5 -25.5v-334q0 -15 10.5 -25.5t25 -10.5t25 10.5t10.5 25.5v334q0 15 -10.5 25.5t-25 10.5zM317 512
+q-15 0 -25.5 -10.5t-10.5 -25.5v-334q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v334q0 15 -10.5 25.5t-25.5 10.5zM704 512q-15 0 -25.5 -10.5t-10.5 -25.5v-334q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v334q0 15 -10.5 25.5t-25.5 10.5z" />
+    <glyph glyph-name="enter" unicode="&#xe6a0;" 
+d="M900 510v192q0 17 -11.5 28.5t-28 11.5t-28.5 -11.5t-12 -28.5v-192q0 -92 -65 -157t-157 -65h-340l113 112q11 12 11 28.5t-11.5 28t-28 11.5t-28.5 -12l-178 -178q-12 -12 -12 -28.5t12 -28.5l183 -183q12 -12 28.5 -12t28.5 11.5t12 28t-12 28.5l-114 114h336
+q125 0 213.5 88.5t88.5 213.5z" />
+    <glyph glyph-name="pushpino" unicode="&#xe6a1;" 
+d="M303 728q2 -10 1 -20l-1 -36l29 -23l214 -170l30 -24l37 12q44 15 90 15q49 0 95 -16q26 -10 51 -24l-169 -170l-43 -43l-13 -13v0l-169 -170q-27 45 -36 96q-13 72 10 141l12 37l-24 30l-170 214l-23 29l-36 -1h-1.5h-2.5q-8 0 -16 1zM318 831q-14 0 -24 -10l-219 -219
+q-11 -11 -9.5 -27t14.5 -24q48 -31 104 -31h6l170 -215q-28 -84 -11.5 -175.5t74.5 -163.5q11 -13 27 -13q14 0 24 10l206 207l223 -223q10 -10 23.5 -10t23 9.5t9.5 23t-10 23.5l-223 223l206 207q11 11 10 26t-13 25q-98 80 -226 80q-57 0 -112 -18l-215 170q2 60 -30 110
+q-10 15 -28 15v0z" />
+    <glyph glyph-name="pushpin" unicode="&#xe6a2;" 
+d="M949 -7l-223 223l206 207q11 11 10 26t-13 25q-72 58 -163 74t-175 -12l-215 170q2 60 -30 110q-9 13 -25 14.5t-27 -9.5l-219 -219q-11 -11 -9.5 -27t14.5 -24q50 -33 110 -31l170 -215q-28 -84 -11.5 -175.5t74.5 -163.5q10 -12 25 -13t26 10l206 207l223 -223
+q10 -10 23.5 -10t23 9.5t9.5 23t-10 23.5z" />
+    <glyph glyph-name="heart" unicode="&#xe6a3;" horiz-adv-x="1025" 
+d="M1000 648q-23 56 -66 99q-84 85 -201 85q-64 0 -121.5 -28t-99.5 -79q-42 51 -99.5 79t-121.5 28q-117 0 -201 -86q-43 -43 -66 -99q-25 -59 -24 -122q1 -69 29 -130.5t79 -104.5q5 -4 9 -8q14 -12 113 -102q208 -191 257 -235q11 -9 25 -9t25 9q33 30 181 165
+q158 144 196 179q52 43 81 105t29 132q0 64 -24 122z" />
+    <glyph glyph-name="hearto" unicode="&#xe6a4;" horiz-adv-x="1025" 
+d="M1000 648q-23 56 -66 99q-84 85 -201 85q-64 0 -121.5 -28t-99.5 -79q-42 51 -99.5 79t-121.5 28q-117 0 -201 -86q-43 -43 -66 -99q-25 -59 -24 -122q1 -69 29 -130.5t79 -104.5q5 -4 9 -8q14 -12 113 -102q208 -191 257 -235q11 -9 25 -9t25 9q33 30 181 165
+q158 144 196 179q52 43 81 105t29 132q0 64 -24 122zM568 672q30 40 73.5 61.5t91.5 21.5q85 0 147 -62q32 -32 49 -74q18 -44 18 -93q0 -53 -22 -101q-22 -46 -60 -77l-2 -2q-62 -55 -197 -180q-108 -98 -154 -140q-58 53 -202 184l-48 44q-76 69 -94 85q-1 2 -2 3
+q-6 4 -8 7q-39 32 -60 78.5t-21 97.5q-1 49 18 93q17 42 49 74q62 63 147 63q48 0 91.5 -22t73.5 -61q21 -28 56 -28t56 28z" />
+    <glyph glyph-name="smile-circle" unicode="&#xe6a7;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM254 454q-25 0 -42.5 17.5t-17.5 42t17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5zM512 130
+q-68 0 -116 48.5t-48 116.5q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5q0 -38 27 -65.5t65 -27.5t65 27.5t27 65.5q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5q0 -68 -48 -116.5t-116 -48.5zM769.5 454q-24.5 0 -42 17.5t-17.5 42t17.5 42.5t42 18t42.5 -18
+t18 -42.5t-18 -42t-42.5 -17.5z" />
+    <glyph glyph-name="smileo" unicode="&#xe6a8;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
+q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM640 331q-15 0 -25.5 -10.5t-10.5 -25.5q0 -38 -27 -65.5t-65 -27.5t-65 27.5t-27 65.5q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5
+q0 -68 48 -116.5t116 -48.5t116 48.5t48 116.5q0 15 -10.5 25.5t-25.5 10.5zM254 514zM194 513.5q0 24.5 17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5t-42.5 17.5t-17.5 42zM770 514zM710 513.5q0 24.5 17.5 42.5t42 18t42.5 -18t18 -42.5t-18 -42
+t-42.5 -17.5t-42 17.5t-17.5 42z" />
+    <glyph glyph-name="frowno" unicode="&#xe6a9;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171
+q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM640 130q-15 0 -25.5 11t-10.5 25q0 39 -27 66t-65 27t-65 -27t-27 -66q0 -14 -10.5 -25t-25.5 -11t-25.5 11t-10.5 25q0 68 48 116.5t116 48.5t116 -48.5
+t48 -116.5q0 -14 -10.5 -25t-25.5 -11zM254 514zM194 513.5q0 24.5 17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5t-42.5 17.5t-17.5 42zM770 514zM710 513.5q0 24.5 17.5 42.5t42 18t42.5 -18t18 -42.5t-18 -42t-42.5 -17.5t-42 17.5t-17.5 42z" />
+    <glyph glyph-name="calculator" unicode="&#xe6aa;" 
+d="M857 832h-689q-16 0 -27.5 -11.5t-11.5 -27.5v-818q0 -16 11.5 -27.5t27.5 -11.5h689q16 0 27 11.5t11 27.5v818q0 16 -11 27.5t-27 11.5zM818 14h-612v740h612v-740v0zM324 410h377q16 0 27.5 11.5t11.5 27.5v185q0 16 -11.5 27.5t-27.5 11.5h-377q-16 0 -27.5 -11.5
+t-11.5 -27.5v-185q0 -16 11.5 -27.5t27.5 -11.5zM362 595h300v-108h-300v108zM293 189h23v-23q0 -16 11.5 -27.5t27.5 -11.5t27.5 11.5t11.5 27.5v23h23q16 0 27.5 11.5t11.5 27.5t-11.5 27t-27.5 11h-23v24q0 16 -11.5 27t-27.5 11t-27.5 -11t-11.5 -27v-24h-23
+q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5zM607 328q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5h124q16 0 27.5 11.5t11.5 27.5t-11.5 27t-27.5 11h-124zM731 162h-124q-16 0 -27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5h124q16 0 27.5 11.5t11.5 27.5
+t-11.5 27.5t-27.5 11.5z" />
+    <glyph glyph-name="chrome" unicode="&#xe6ac;" horiz-adv-x="1025" 
+d="M258 449l-146 254q71 90 176 141.5t224 51.5q138 0 255.5 -68t185.5 -183h-418q-11 1 -23 1q-90 0 -161 -55.5t-93 -141.5v0zM695 571h294q35 -90 35 -187q0 -103 -40 -197.5t-107.5 -163t-161.5 -109.5t-197 -42l209 363q47 67 47 149q0 110 -79 187v0v0zM326 384
+q0 77 54.5 131.5t131.5 54.5t131.5 -54.5t54.5 -131.5t-54.5 -131.5t-131.5 -54.5t-131.5 54.5t-54.5 131.5zM582 131l-146 -253q-122 18 -222 89t-157 181t-57 236q0 135 66 251l209 -362q32 -68 96 -109.5t141 -41.5q36 0 70 9z" />
+    <glyph glyph-name="github" unicode="&#xe6ad;" horiz-adv-x="1025" 
+d="M0 371q0 -166 95.5 -298.5t247.5 -185.5q6 -1 10 -1t6.5 1.5t4 3t2 5t0.5 5v6v6.5v88q-37 -4 -66 0.5t-45.5 14t-29 23.5t-17 25.5t-9 24t-5.5 14.5q-9 15 -27 27.5t-27 20t-2 14.5q50 26 113 -66q34 -51 119 -30q10 41 40 70q-116 21 -172 86t-56 158q0 87 55 151
+q-22 65 6 137q29 2 65 -11.5t50.5 -23t25.5 -17.5q57 16 128.5 16t129.5 -16q13 9 29 19t49 21.5t61 9.5q27 -71 7 -135q56 -64 56 -151q0 -93 -57 -158.5t-172 -85.5q43 -43 43 -104v-129q0 -1 1 -3q0 -6 0.5 -9t4.5 -6t12 -3q153 52 250.5 185.5t97.5 300.5
+q0 104 -40.5 199t-109 163.5t-163.5 109t-199 40.5t-199 -40.5t-163.5 -109t-109 -163.5t-40.5 -199v0z" />
+    <glyph glyph-name="iconfontdesktop" unicode="&#xe6b4;" 
+d="M902 766h-779q-23 0 -40 -17t-17 -40v-480q0 -24 17 -40.5t40 -16.5h357v-108h-147q-13 0 -22.5 -9.5t-9.5 -22.5t9.5 -22t22.5 -9h358q13 0 22.5 9t9.5 22t-9.5 22.5t-22.5 9.5h-148v108h359q24 0 40.5 16.5t16.5 40.5v480q0 23 -16.5 40t-40.5 17zM896 703v-468h-767
+v468h767z" />
+    <glyph glyph-name="caretcircleoup" unicode="&#xe6b5;" 
+d="M512 895q-104 0 -199 -40.5t-163.5 -109t-109 -163.5t-40.5 -199t40.5 -198.5t109 -163t163.5 -109t199 -40.5t198.5 40.5t163 109t109 163t40.5 198.5t-40.5 199t-109 163.5t-163 109t-198.5 40.5zM828 67q-62 -62 -142 -96q-83 -35 -174 -35t-174 35q-81 34 -143 96
+t-96 142q-35 83 -35 174t35 175q34 80 96 142t142 96q83 35 174.5 35t174.5 -35q80 -34 142 -96t96 -142q35 -83 35 -174.5t-35 -174.5q-34 -80 -96 -142zM528 559q-7 7 -16 7h-1q-10 0 -16 -7l-229 -244q-10 -11 -4.5 -25t21.5 -14h457q16 0 22 14t-5 25z" />
+    <glyph glyph-name="upload" unicode="&#xe6b6;" 
+d="M488 822q10 10 24 10t24 -10l156 -156q10 -10 10 -24.5t-10 -24.5t-24 -10t-25 10l-96 97v-578q0 -14 -10.5 -24t-24.5 -10t-24.5 10t-10.5 24v578l-97 -97q-10 -10 -24 -10t-24 10t-10 24.5t10 24.5zM924.5 256q-14.5 0 -24.5 -10.5t-10 -24.5v-195q0 -9 -6 -15t-15 -6
+h-716q-9 0 -15 6t-6 15v195q0 14 -10 24.5t-24.5 10.5t-24.5 -10.5t-10 -24.5v-223q0 -26 18 -44t44 -18h772q26 0 44 18.5t18 43.5v223q0 14 -10 24.5t-24.5 10.5z" />
+    <glyph glyph-name="download" unicode="&#xe6b7;" 
+d="M488 112q10 -10 24 -10t24 10l156 156q11 10 11 24t-10.5 24.5t-24.5 10.5t-24 -11l-97 -96v577q0 15 -10.5 25t-24.5 10t-24 -10t-10 -25v-577l-97 97q-11 10 -25 10t-24 -10.5t-10 -24.5t10 -24zM924.5 256q-14.5 0 -24.5 -10.5t-10 -24.5v-195q0 -9 -6 -15t-15 -6
+h-716q-9 0 -15 6t-6 15v195q0 14 -10 24.5t-24.5 10.5t-24.5 -10.5t-10 -24.5v-223q0 -26 18 -44t44 -18h772q26 0 44 18.5t18 43.5v223q0 14 -10 24.5t-24.5 10.5z" />
+    <glyph glyph-name="piechart" unicode="&#xe6b8;" 
+d="M467 -128q95 0 180 36t150 101l-330 328v465q-95 0 -181.5 -36.5t-149 -99t-99.5 -148.5t-37 -180.5t37 -181t99.5 -148.5t149 -99t181.5 -37v0v0zM531 404h493q0 100 -39 191t-105 157t-157.5 105t-191.5 39v-492v0zM557 339l332 -327q64 64 99.5 148.5t35.5 178.5h-467
+v0z" />
+    <glyph glyph-name="lock1" unicode="&#xe6b9;" 
+d="M824 614q-26 64 -73 113q-46 50 -107 77q-63 28 -132 28t-132 -28q-61 -27 -108 -76.5t-72 -113.5q-27 -66 -27 -139v-470q0 -29 19.5 -49t46.5 -20h545q28 0 47.5 20t18.5 49v415l1 19v36q0 72 -27 139zM407 741v0l1 1q49 22 104 22q54 0 104 -22q48 -22 86 -62
+q38 -39 59 -92t21 -113v-29h-541v0v29q0 59 22 113q21 53 59 92.5t85 60.5zM783 378v-373q0 -1 -1 -1h-540q-1 0 -1 1v373h542zM480 224v-90q0 -13 9.5 -22t22.5 -9t22.5 9t9.5 22v90q27 17 27 49q0 25 -17.5 42t-41.5 17t-41.5 -17t-17.5 -42q0 -32 27 -49z" />
+    <glyph glyph-name="unlock" unicode="&#xe6ba;" 
+d="M241 446v30q0 58 22 113q21 52 59 91q38 40 85 61v0l1 1q49 22 104 22q54 0 104 -22q48 -22 86 -61q21 -23 53 -83q10 -20 31 -20h14q14 0 21.5 11.5t2.5 24.5v0q-26 64 -73 113q-46 50 -107 77q-63 28 -132 28t-132 -28q-61 -27 -108 -76.5t-72 -113.5q-27 -66 -27 -139
+v-470q0 -29 19.5 -49t46.5 -20h545q28 0 47 20t19 49l1 377q0 26 -19 45t-45 19h-546v0zM783 5q0 -1 -1 -1h-540q-1 0 -1 1v373h542v-373zM480 224v-90q0 -13 9.5 -22t22.5 -9t22.5 9t9.5 22v90q27 17 27 49q0 25 -17.5 42t-41.5 17t-41.5 -17t-17.5 -42q0 -32 27 -49z" />
+    <glyph glyph-name="windowso" unicode="&#xe6bc;" 
+d="M527 27l434 -71v401h-434v-330zM599 285h290v-244l-290 47v197zM527 758v-329h434v401zM889 501h-290v196l290 48v-244zM68 429h367v317l-367 -61v-256zM140 624l223 37v-160h-223v123zM68 99l367 -60v318h-367v-258zM140 285h223v-161l-223 36v125z" />
+    <glyph glyph-name="dotchart" unicode="&#xe6bd;" 
+d="M923 8h-788v789q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-825q0 -15 10.5 -25.5t25.5 -10.5h824q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM319 259zM253 259.5q0 27.5 19 46.5t46.5 19t47 -19t19.5 -46.5t-19.5 -47t-47 -19.5t-46.5 19.5t-19 47z
+M598 299zM512 299q0 35 25 60t60.5 25t60.5 -25t25 -60t-25 -60t-60.5 -25t-60.5 25t-25 60zM623 514zM563 514q0 25 17.5 42.5t42.5 17.5t42.5 -17.5t17.5 -42.5t-17.5 -42.5t-42.5 -17.5t-42.5 17.5t-17.5 42.5zM850 657zM805 657.5q0 18.5 13 32t32 13.5t32.5 -13.5
+t13.5 -32t-13.5 -32t-32.5 -13.5t-32 13.5t-13 32zM863 466zM830 466q0 14 9.5 23.5t23.5 9.5t23.5 -9.5t9.5 -23.5t-9.5 -23.5t-23.5 -9.5t-23.5 9.5t-9.5 23.5z" />
+    <glyph glyph-name="barchart" unicode="&#xe6be;" 
+d="M923 -64h-824q-15 0 -25.5 10.5t-10.5 25.5v824q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5v-788h788q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM264 523q-29 -1 -50 -22t-22 -50q0 -23 11.5 -41t30.5 -28v-285q0 -13 9.5 -22.5t22.5 -9.5v0
+q13 0 22.5 9.5t9.5 22.5v285q19 9 30.5 27t11.5 40q0 31 -22.5 53t-53.5 21zM542 641q-30 -1 -51 -22t-21 -50q-1 -23 10.5 -41t31.5 -28v-403q0 -13 9 -22.5t23 -9.5v0q13 0 22.5 9.5t9.5 22.5v403q18 9 30 27t12 40q0 31 -22.5 53t-53.5 21zM895 438q0 31 -22.5 53
+t-53.5 21q-29 -1 -50 -22t-22 -50q0 -23 11.5 -41t30.5 -28v-274q0 -13 9.5 -22.5t22.5 -9.5v0q13 0 22.5 9.5t9.5 22.5v274q19 9 30.5 27t11.5 40z" />
+    <glyph glyph-name="codesquare" unicode="&#xe6bf;" 
+d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM229 347q-15 0 -25.5 10.5t-10.5 25.5t10 26l115 115l-115 117q-10 11 -10 25.5t10.5 25t25.5 10.5t25 -10l141 -142q10 -11 10 -26
+t-11 -25l-140 -141q-10 -11 -25 -11zM618 347v0l-199 1q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5v0l199 -1q15 0 25.5 -10.5t10.5 -25.5t-11 -25.5t-25 -10.5z" />
+    <glyph glyph-name="plussquare" unicode="&#xe6c0;" 
+d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM732 348h-184v-183q0 -15 -10.5 -25.5t-25 -10.5t-25.5 10.5t-11 25.5v183h-184q-15 0 -25.5 10.5t-10.5 25t10.5 25.5t25.5 11h184v183
+q0 15 11 25.5t25.5 10.5t25 -10.5t10.5 -25.5v-183h184q15 0 25.5 -11t10.5 -25.5t-10.5 -25t-25.5 -10.5z" />
+    <glyph glyph-name="minussquare" unicode="&#xe6c1;" 
+d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM768 383q0 -15 -11 -25.5t-25 -10.5h-442q-14 0 -25 10.5t-11 25.5v0q0 15 11 25.5t25 10.5h442q14 0 25 -10.5t11 -25.5v0z" />
+    <glyph glyph-name="closesquare" unicode="&#xe6c2;" 
+d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM717.5 178.5q-10.5 -10.5 -25.5 -10.5t-26 10l-154 155l-154 -155q-11 -10 -26 -10t-25.5 10.5t-10.5 25.5t11 25l154 155l-154 155
+q-11 10 -11 25t10.5 25.5t25.5 10.5t26 -10l154 -155l154 155q11 10 26 10t25.5 -10.5t10.5 -25.5t-11 -25l-154 -155l154 -155q11 -11 11 -25.5t-10.5 -25z" />
+    <glyph glyph-name="closesquareo" unicode="&#xe6c3;" 
+d="M717.5 589.5q-10.5 10.5 -25.5 10.5t-26 -10l-154 -155l-154 155q-11 10 -26 10t-25.5 -10.5t-10.5 -25.5t11 -25l154 -155l-154 -155q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t26 10l154 155l154 -155q11 -10 26 -10t25.5 10.5t10.5 25t-11 25.5l-154 155l154 155
+q11 10 11 25t-10.5 25.5zM888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0z" />
+    <glyph glyph-name="checksquare" unicode="&#xe6c4;" 
+d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM772 539l-359 -360l-1 -1q-3 -3 -8 -6q-8 -5 -18 -5q-21 0 -31 18l-109 191q-8 13 -4 27t17 21.5t27.5 3.5t21.5 -17l86 -149l327 328
+q11 11 26 11t25.5 -10.5t10.5 -25.5t-11 -26z" />
+    <glyph glyph-name="checksquareo" unicode="&#xe6c5;" 
+d="M721 590l-327 -328l-86 149q-7 13 -21.5 17t-27.5 -3.5t-17 -21.5t4 -27l109 -191q10 -18 31 -18q10 0 18 5q5 3 8 6l1 1l359 360q11 11 11 26t-10.5 25.5t-25.5 10.5t-26 -11zM888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753
+q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0z" />
+    <glyph glyph-name="fastbackward" unicode="&#xe6c6;" 
+d="M525 414l436 376q18 17 40.5 6.5t22.5 -36.5v-752q0 -26 -22.5 -36.5t-40.5 6.5l-436 377q-13 12 -13 30t13 29zM36 800v0q15 0 25.5 -10.5t10.5 -25.5v-298l377 324q18 17 40.5 6.5t22.5 -36.5v-375v-377q0 -26 -22.5 -36.5t-40.5 6.5l-377 326v-300q0 -15 -10.5 -25.5
+t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v760q0 15 10.5 25.5t25.5 10.5z" />
+    <glyph glyph-name="fastforward" unicode="&#xe6c7;" 
+d="M499 414l-436 376q-18 17 -40.5 6.5t-22.5 -36.5v-752q0 -26 22.5 -36.5t40.5 6.5l436 378q13 11 13 29t-13 29zM988 800v0q-15 0 -25.5 -10.5t-10.5 -25.5v-298l-377 324q-18 17 -40.5 6.5t-22.5 -36.5v-375v-377q0 -26 22.5 -36.5t40.5 6.5l377 326v-300
+q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v760q0 15 -10.5 25.5t-25.5 10.5z" />
+    <glyph glyph-name="upsquare" unicode="&#xe6c8;" 
+d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM757.5 277q-10.5 -10 -25.5 -9.5t-25 10.5l-195 208l-195 -208q-10 -10 -25 -10.5t-26 9.5t-11.5 25t10.5 26l221 236q10 11 26 11t26 -11
+l221 -236q10 -11 9.5 -26t-11 -25z" />
+    <glyph glyph-name="downsquare" unicode="&#xe6c9;" 
+d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM759 451l-221 -236q-10 -11 -26 -11t-26 11l-221 236q-11 11 -10.5 26t11.5 25t26 9.5t25 -11.5l195 -207l195 207q10 11 25 11.5
+t25.5 -9.5t11 -25t-9.5 -26z" />
+    <glyph glyph-name="leftsquare" unicode="&#xe6ca;" 
+d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM616 189q11 -10 11.5 -25t-9.5 -25.5t-25 -11t-26 9.5l-236 221q-11 10 -11 26t11 26l236 221q11 11 26 10.5t25 -11.5t9.5 -26t-10.5 -25
+l-208 -195z" />
+    <glyph glyph-name="rightsquare" unicode="&#xe6cb;" 
+d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM694 358l-236 -221q-11 -10 -26 -9.5t-25 11t-9.5 25.5t10.5 25l208 195l-208 195q-10 10 -10.5 25t9.5 26t25 11.5t26 -10.5l236 -221
+q11 -10 11 -26t-11 -26z" />
+    <glyph glyph-name="rightsquareo" unicode="&#xe6cc;" 
+d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM705 384q0 16 -11 26l-236 221q-11 11 -26 10.5t-25 -11.5t-9.5 -26t10.5 -25l208 -195
+l-208 -195q-10 -10 -10.5 -25t9.5 -26t25 -11.5t26 10.5l236 221q11 10 11 26z" />
+    <glyph glyph-name="leftsquareo" unicode="&#xe6cd;" 
+d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM331 358l236 -221q11 -10 26 -9.5t25 11t9.5 25.5t-11.5 25l-207 195l207 195q11 10 11.5 25
+t-9.5 26t-25 11.5t-26 -10.5l-236 -221q-11 -10 -11 -26t11 -26z" />
+    <glyph glyph-name="down-square-o" unicode="&#xe6ce;" 
+d="M888 760v0v0v-753h-752v753h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM538 215l221 236q10 11 9.5 26t-11 25t-25.5 9.5t-25 -11.5l-195 -207l-195 207q-10 11 -25 11.5
+t-26 -9.5t-11.5 -25t10.5 -26l221 -236q10 -11 26 -11t26 11z" />
+    <glyph glyph-name="up-square-o" unicode="&#xe6cf;" 
+d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM512 575q-16 0 -26 -11l-221 -236q-11 -11 -10.5 -26t11.5 -25t26 -9.5t25 10.5l195 208
+l195 -208q10 -10 25 -10.5t25.5 9.5t11 25t-9.5 26l-221 236q-10 11 -26 11z" />
+    <glyph glyph-name="play" unicode="&#xe6d0;" 
+d="M512 894q-139 0 -256.5 -68.5t-186 -186t-68.5 -256.5t68.5 -256.5t186 -186t256.5 -68.5t256.5 68.5t186 186t68.5 256.5t-68.5 256.5t-186 186t-256.5 68.5zM712 369l-291 -247q-6 -6 -15 -6q-8 0 -14.5 5.5t-6.5 14.5v495q0 8 6.5 13.5t15 5.5t14.5 -6l291 -247
+q6 -6 6 -14t-6 -14z" />
+    <glyph glyph-name="playcircleo" unicode="&#xe6d1;" 
+d="M512 894q-139 0 -256.5 -68.5t-186 -186t-68.5 -256.5t68.5 -256.5t186 -186t256.5 -68.5t256.5 68.5t186 186t68.5 256.5t-68.5 256.5t-186 186t-256.5 68.5zM822 73q-60 -61 -139 -95q-82 -34 -171 -34t-171 34q-78 34 -139 95q-61 60 -95 139q-34 82 -34 171t35 171
+q33 78 94 140q60 60 139 94q82 34 171 34t171 -34q78 -34 139 -95q61 -60 95 -139q34 -82 34 -171t-35 -171q-33 -79 -94 -139zM712 397l-291 247q-6 6 -15 6q-8 0 -14.5 -5.5t-6.5 -13.5v-495q0 -9 6.5 -14t15 -5t14.5 5l291 247q6 6 6 14t-6 14z" />
+    <glyph glyph-name="tag" unicode="&#xe6d2;" 
+d="M963 291v3q-1 9 -4 18q-4 10 -10 19q-4 5 -7 8l-479 483q-4 5 -9 8q-12 7 -25 7h-291q-31 0 -53 -22t-22 -52v-298q0 -5 1 -10l0.5 -1l0.5 -1q1 -4 2 -7q1 -1 1 -2q4 -7 10 -13l477 -472q9 -8 18 -13q17 -9 35 -9q15 0 28 6q14 5 25 16l280 277q3 2 5 5q3 3 5 7q2 3 3 5
+q2 3 3 5q0 2 1 3q5 14 5 30zM264.5 560q-29.5 0 -50.5 21t-21 50.5t21 50.5t50.5 21t50.5 -21t21 -50.5t-21 -50.5t-50.5 -21z" />
+    <glyph glyph-name="tago" unicode="&#xe6d3;" 
+d="M963 291v3q-1 9 -4 18q-4 10 -10 19q-4 5 -7 8l-479 483q-4 5 -9 8q-12 7 -25 7h-291q-31 0 -52.5 -22t-21.5 -52v-298v-10l0.5 -1l0.5 -1q1 -4 2 -7q1 -1 1 -2q4 -7 10 -13l238 -236l239 -236q9 -8 19 -13q16 -9 34 -9q15 0 28 6q14 5 25 16l280 277q3 2 5 5q3 3 5 7
+q2 3 3 5q2 3 3 5q0 2 1 3q5 14 5 30zM891 287v0v0v0v0v0h-1v0l-280 -277v0q-1 -1 -2 -1t-1 1h-0.5h-0.5l-239 236l-231 229v288q0 2 2 2h281l471 -476h1v-1v0v0v-1zM264 632zM193 631.5q0 29.5 21 50.5t50.5 21t50.5 -21t21 -50.5t-21 -50.5t-50.5 -21t-50.5 21t-21 50.5z
+" />
+    <glyph glyph-name="addfile" unicode="&#xe910;" 
+d="M860 128h-156v156q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-156h-148q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h148v-148q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v148h156q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM875 594
+l-278 281q-6 6 -15 11q-2 2 -4 2q-1 1 -3 2q-14 6 -29 6h-346q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h212q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-212v880h312v-240q0 -30 21 -51t51 -21h240v-156q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5
+v188q0 29 -21 50zM584 584v202l200 -202h-200z" />
+    <glyph glyph-name="folder1" unicode="&#xe662;" 
+d="M952 704h-463l-25 78q-7 22 -26 36t-43 14h-323q-30 0 -51 -21t-21 -51v-688q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v560q0 30 -21 51t-51 21zM72 760h323l18 -56h-341v56zM952 72h-880v560h880v-560z" />
+    <glyph glyph-name="file1" unicode="&#xe664;" 
+d="M875 594l-278 281q-6 6 -15 11q-2 2 -4 2q-1 1 -3 2q-14 6 -29 6h-346q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v600q0 29 -21 50zM784 584h-200v202zM824 -56h-624v880h312v-240q0 -30 21 -51t51 -21h240v-568z" />
+    <glyph glyph-name="switcher" unicode="&#xe913;" 
+d="M572 292h-376q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h376q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM696 568v-624h-624v624h624zM696 640h-624q-30 0 -51 -21t-21 -51v-624q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v624q0 30 -21 51t-51 21z
+M952 896h-592q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h592v-596q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v596q0 30 -21 51t-51 21zM824 768h-660q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h660v-660q0 -15 10.5 -25.5t25.5 -10.5
+t25.5 10.5t10.5 25.5v660q0 30 -21 51t-51 21z" />
+    <glyph glyph-name="addfolder" unicode="&#xe914;" 
+d="M988 256h-156v156q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-156h-148q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h148v-148q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v148h156q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM952 704
+h-463l-25 78q-7 22 -26 36t-43 14h-323q-30 0 -51 -21t-21 -51v-688q0 -30 21 -51t51 -21h468q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-468v560h880v-148q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v148q0 30 -21 51t-51 21zM72 704v56h323l18 -56h-341z
+" />
+    <glyph glyph-name="folderopen" unicode="&#xe699;" 
+d="M960 512v120q0 30 -21 51t-51 21h-399l-25 78q-7 22 -26 36t-43 14h-323q-30 0 -51 -21t-21 -51v-688q0 -5 1 -11v0v-2v-1l0.5 -0.5l0.5 -0.5v-1v-1.5t0.5 -1l0.5 -0.5v-1q0 -2 1 -3v0q5 -17 18 -29v0q1 0 1.5 -0.5l1 -1t0.5 -1.5q1 0 1 -0.5t0.5 -0.5t1 -0.5t1.5 -0.5
+v-0.5v-0.5q1 0 1.5 -0.5l1.5 -1.5v0q15 -10 32 -11l1 -1h3h1h1h2h788q25 0 44.5 15.5t25.5 39.5l92 368q8 31 -11 58t-51 31zM72 760h323l41 -128h452v-120h-724q-25 0 -44.5 -15t-25.5 -39l-22 -89v391zM860 72h-788l92 368h788z" />
+    <glyph glyph-name="search1" unicode="&#xe670;" 
+d="M950 -2l-206 205q88 107 88 245q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5q138 0 245 88l206 -206q10 -10 25 -10t26 10q10 11 10 26t-10 26zM569 160q-57 -24 -121 -24t-121 24q-56 24 -99.5 67.5t-66.5 99.5
+q-25 57 -25 121t25 121q23 56 66.5 99.5t99.5 67.5q57 24 121 24t121 -24q56 -24 99.5 -67.5t67.5 -99.5q24 -57 24 -121t-24 -121q-24 -56 -67.5 -99.5t-99.5 -67.5z" />
+    <glyph glyph-name="ellipsis1" unicode="&#xe647;" 
+d="M128 384q0 -27 18.5 -45.5t45.5 -18.5t45.5 18.5t18.5 45.5t-18.5 45.5t-45.5 18.5t-45.5 -18.5t-18.5 -45.5zM448 384q0 -27 18.5 -45.5t45.5 -18.5t45.5 18.5t18.5 45.5t-18.5 45.5t-45.5 18.5t-45.5 -18.5t-18.5 -45.5zM768 384q0 -27 18.5 -45.5t45.5 -18.5
+t45.5 18.5t18.5 45.5t-18.5 45.5t-45.5 18.5t-45.5 -18.5t-18.5 -45.5z" />
+    <glyph glyph-name="calendar" unicode="&#xe6bb;" 
+d="M888 768h-120v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-368v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-120q-30 0 -51 -21t-21 -51v-688q0 -30 21 -51t51 -21h752q30 0 51 21t21 51v688q0 30 -21 51t-51 21zM136 696h120v-20
+q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20h368v-20q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20h120v-112h-752v112zM888 8h-752v504h752v-504zM288 384h64q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5
+t22.5 9.5zM480 384h64q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM672 384h64q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM288 190h64q13 0 22.5 -9.5
+t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM480 190h64q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5z" />
+    <glyph glyph-name="filetext1" unicode="&#xe698;" 
+d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
+M584 412q0 15 -10.5 25.5t-25.5 10.5h-256q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h256q15 0 25.5 10.5t10.5 25.5zM776 252q0 15 -10.5 25.5t-25.5 10.5h-448q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h448q15 0 25.5 10.5t10.5 25.5zM648 92
+q0 15 -10.5 25.5t-25.5 10.5h-320q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h320q15 0 25.5 10.5t10.5 25.5z" />
+    <glyph glyph-name="copy1" unicode="&#xe648;" 
+d="M875 658l-214 217q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-281q-30 0 -51.5 -21t-21.5 -51v-56h-56q-29 0 -50.5 -21.5t-21.5 -50.5v-752q0 -30 21.5 -51t50.5 -21h496q29 0 50 21t21 51v56h57q30 0 50.5 21t20.5 51v536q0 30 -20 50zM647 786l137 -138h-137v138z
+M695 -56h-495v752h56v-624q0 -30 21.5 -51t51.5 -21h366v-56zM823 72h-495v752h247v-176q0 -30 21.5 -51t51.5 -21h175v-504zM640 476q0 15 -10.5 25.5t-25.5 10.5h-184q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h184q15 0 25.5 10.5t10.5 25.5zM768 348
+q0 15 -10.5 25.5t-25.5 10.5h-312q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h312q15 0 25.5 10.5t10.5 25.5zM704 220q0 15 -10.5 25.5t-25.5 10.5h-248q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h248q15 0 25.5 10.5t10.5 25.5z" />
+    <glyph glyph-name="jpgfile1" unicode="&#xe69c;" 
+d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
+M350 200q0 -18 -5.5 -25t-16.5 -7q-15 0 -25 19l-30 -23q20 -34 61 -34q30 0 45.5 18.5t15.5 47.5v123h-45v-119zM501 319h-64v-186h44v62h22q31 0 52 16t21 48q0 60 -75 60zM500 230h-19v53h18q34 0 34 -25q0 -28 -33 -28zM683 239v-36h30v-30q-6 -5 -18 -5q-50 0 -50 58
+q0 27 13 42.5t34 15.5q18 0 34 -15l23 29q-24 24 -59 24q-39 0 -65 -26t-26 -71q0 -46 25.5 -70.5t66.5 -24.5q39 0 61 22v87h-69z" />
+    <glyph glyph-name="pdffile1" unicode="&#xe6b3;" 
+d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
+M333 320h-67v-192h46v64h22q33 0 54.5 16.5t21.5 49.5q0 62 -77 62zM332 228h-20v56h18q35 0 35 -26q0 -30 -33 -30zM498 320h-56v-192h58q44 0 69 24.5t25 72.5t-25.5 71.5t-70.5 23.5zM495 165h-6v118h6q25 0 38.5 -13t13.5 -45q0 -60 -52 -60zM752 282v38h-122v-192h46
+v73h65v38h-65v43h76z" />
+    <glyph glyph-name="exclefile1" unicode="&#xe6b0;" 
+d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
+M460 229l-56 155h86l16 -57q5 -18 14 -53h2q15 29 30 53l33 57h82l-111 -159l60 -162h-86l-19 63q-4 14 -14 54h-2q-14 -25 -31 -54l-39 -63h-82z" />
+    <glyph glyph-name="pptfile1" unicode="&#xe6b1;" 
+d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
+M538 390h-112l-57 -334h77l19 119h37q55 0 96 28t51 82q10 56 -21 80.5t-90 24.5zM574 285q-9 -49 -65 -49h-33l16 93h32q29 0 41.5 -10t8.5 -34z" />
+    <glyph glyph-name="unknowfile1" unicode="&#xe6af;" 
+d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
+M510 329q0 18 -11 28t-29 10q-28 0 -58 -29l-55 51q52 59 125 59q56 0 90.5 -28t34.5 -84q0 -21 -10 -40.5t-24 -34t-27.5 -29t-22 -33t-5.5 -39.5h-88q-5 30 6.5 57t28.5 43.5t31 35.5t14 33zM432 62q0 19 12 31t29.5 12t29.5 -12.5t12 -30.5t-12 -30.5t-29.5 -12.5
+t-29.5 12.5t-12 30.5z" />
+    <glyph glyph-name="wordfile1" unicode="&#xe6b2;" 
+d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z
+M559 142q-1 14 -1 46v48l-7 136h-60l-55 -136q-21 -57 -34 -94h-2l5 94l5 136h-73l2 -298h88l49 130q3 8 24 70h2q-2 -35 -1 -70l4 -130h90l104 298h-68l-43 -136q-3 -11 -12.5 -43t-15.5 -51h-1z" />
+    <glyph glyph-name="dingding" unicode="&#xe923;" 
+d="M913 513q-3 -11 -12 -31v0l-1 -2q-16 -34 -48.5 -90.5t-56.5 -96.5l-24 -40q0 1 -1 1l-27 -47h131l-251 -335l57 228h-103l36 150q-46 -11 -104 -30q-3 -1 -7 -2.5t-19 -2t-32 4t-44.5 20.5t-56.5 42l-5 5l-11.5 11.5t-13.5 17t-9.5 17.5t-2 16t12.5 11q14 5 136 22
+l114 14q-218 -3 -270 5q-38 6 -79 59.5t-52 110.5l-3 15q2 21 49 7q31 -8 118 -27.5t160 -34.5l72 -14q-5 1 -13 3.5t-33 10.5l-50 16t-58.5 19t-63 21t-60.5 21t-53.5 20t-39 16.5t-20.5 11.5q-21 24 -45 99t-20 126q0 2 1 5t6.5 7t14.5 2q271 -124 456 -192
+q30 -11 76 -26.5t73.5 -25t62 -23t53.5 -25t36.5 -25.5t22.5 -30t1 -35z" />
+    <glyph glyph-name="dingding-o" unicode="&#xe925;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM749 415q-1 -6 -7 -19v0v0q-6 -13 -16.5 -32t-20.5 -36.5t-19.5 -33t-15.5 -25.5l-6 -10v1l-17 -28h79
+l-151 -201l35 136h-62l21 90q-28 -6 -63 -17q-3 -3 -10.5 -4.5t-32 7.5t-52.5 34l-3 3l-7 7t-8 9.5t-5.5 10t-1 10t7.5 6.5q8 3 81 13l69 9q-131 -2 -162 3q-23 4 -47.5 36t-31.5 66l-2 10q3 11 30 3q18 -5 70.5 -16.5t96 -20.5l43.5 -9q-220 68 -235 84q-12 15 -26.5 59.5
+t-12.5 75.5q0 1 0.5 3t4 4.5t8.5 0.5q163 -74 274 -115q19 -7 46.5 -16t43.5 -15t37 -14t32.5 -15t21.5 -15.5t13.5 -18t0.5 -20.5z" />
+    <glyph glyph-name="mobile1" unicode="&#xe678;" 
+d="M760 896h-496q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h496q30 0 51 21t21 51v880q0 30 -21 51t-51 21zM542 -64h-60q-15 0 -24.5 9.5t-9.5 22.5t9.5 22.5t24.5 9.5h60q15 0 24.5 -9.5t9.5 -22.5t-9.5 -22.5t-24.5 -9.5zM760 65h-496v704h496v-704z" />
+    <glyph glyph-name="tablet1" unicode="&#xe66e;" 
+d="M824 896h-624q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v880q0 30 -21 51t-51 21zM542 -64h-60q-15 0 -24.5 9.5t-9.5 22.5t9.5 22.5t24.5 9.5h60q15 0 24.5 -9.5t9.5 -22.5t-9.5 -22.5t-24.5 -9.5zM824 65h-624v759h624v-759z" />
+    <glyph glyph-name="bells" unicode="&#xe64e;" 
+d="M860 64h-28v448q0 123 -82 214t-202 104v30q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-30q-120 -13 -202 -104t-82 -214v-448h-28q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h276v-48q0 -30 21 -51t51 -21t51 21t21 51v48h276q15 0 25.5 10.5
+t10.5 25.5t-10.5 25.5t-25.5 10.5zM760 64h-496v448q0 103 72.5 175.5t175.5 72.5t175.5 -72.5t72.5 -175.5v-448z" />
+    <glyph glyph-name="disconnect" unicode="&#xe64f;" 
+d="M900 772q-60 60 -144.5 60t-143.5 -60l-180 -180q-11 -10 -11 -25t11 -26t26 -11t25 11l180 180q38 38 92.5 38t93 -38.5t38.5 -93t-38 -92.5l-180 -180q-10 -11 -10 -25.5t10.5 -25t25.5 -10.5t25 10l180 180q60 59 60 143.5t-60 144.5zM377 615q15 0 25.5 10.5
+t10.5 25.5v145q0 15 -10.5 25.5t-25.5 10.5t-26 -10.5t-11 -25.5v-145q1 -15 11 -26q11 -10 26 -10zM809 139q-11 11 -25 10q-16 0 -26.5 -10.5t-10.5 -25.5t11 -25l102 -103q11 -10 26 -10t25.5 10.5t10.5 25.5t-10 25zM924 285h-145q-16 0 -26 -11q-11 -11 -11 -25.5
+t11 -25t26 -10.5h144q15 0 26 10.5t11 25.5t-10.5 25.5t-25.5 10.5zM648 153q-15 0 -25.5 -10.5t-10.5 -25.5v-145q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v145q0 15 -11 25q-10 11 -25 11zM541 227l-180 -180q-38 -39 -92.5 -39t-93.5 39q-38 39 -38 93t38 93
+l180 180q10 10 10 25t-10.5 25.5t-25.5 10.5t-25 -10l-180 -180q-60 -60 -60 -144q0 -85 60 -144q60 -60 144 -60q85 0 144 60l180 180q11 10 11 25t-11 25.5t-26 10.5t-25 -10zM215 629q11 -11 26 -11t25.5 10.5t10.5 25.5t-11 26l-102 102q-11 11 -26 11t-25.5 -10.5
+t-10.5 -25.5t11 -26zM101 483h145q15 0 25 11q11 10 11 25t-10.5 25.5t-25.5 10.5h-145q-15 0 -25.5 -10.5t-10.5 -25.5q-1 -15 10 -25.5t26 -10.5z" />
+    <glyph glyph-name="database" unicode="&#xe650;" 
+d="M824 896h-624q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v880q0 30 -21 51t-51 21zM824 -47h-624v244q0 -1 1 -1h622q1 0 1 1v-244zM824 267q0 1 -1 1h-622q-1 0 -1 -1v244q0 -1 1 -1h622q1 0 1 1v-244zM824 581q0 1 -1 1h-622q-1 0 -1 -1
+v243h624v-243zM321 75zM285 75q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM321 389zM285 389q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM321 703zM285 703
+q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5z" />
+    <glyph glyph-name="barcode" unicode="&#xe652;" 
+d="M706 128h70q1 0 1 1v638q0 1 -1 1h-70q-1 0 -1 -1v-638q0 -1 1 -1zM534 72h-70q-1 0 -1 -1v-70q0 -1 1 -1h70q1 0 1 1v70q0 1 -1 1zM640 72h-70q-1 0 -1 -1v-70q0 -1 1 -1h70q1 0 1 1v70q0 1 -1 1zM428 72h-214q-1 0 -1 -1v-70q0 -1 1 -1h214q1 0 1 1v70q0 1 -1 1z
+M670 768h-34q-1 0 -1 -1v-638q0 -1 1 -1h34q1 0 1 1v638q0 1 -1 1zM213 767q0 1 -1 1h-34q-1 0 -1 -1v-638q0 -1 1 -1h34q1 0 1 1v638zM1023 768h-70q-1 0 -1 -1v-766q0 -1 1 -1h70q1 0 1 1v766q0 1 -1 1zM916 72h-240q-1 0 -1 -1v-70q0 -1 1 -1h240q1 0 1 1v70q0 1 -1 1z
+M916 768h-34q-1 0 -1 -1v-638q0 -1 1 -1h34q1 0 1 1v638q0 1 -1 1zM108 128h34q1 0 1 1v638q0 1 -1 1h-34q-1 0 -1 -1v-638q0 -1 1 -1zM354 128h34q1 0 1 1v638q0 1 -1 1h-34q-1 0 -1 -1v-638q0 -1 1 -1zM424 128h70q1 0 1 1v638q0 1 -1 1h-70q-1 0 -1 -1v-638q0 -1 1 -1z
+M530 128h70q1 0 1 1v638q0 1 -1 1h-70q-1 0 -1 -1v-638q0 -1 1 -1zM812 128h34q1 0 1 1v638q0 1 -1 1h-34q-1 0 -1 -1v-638q0 -1 1 -1zM71 768h-70q-1 0 -1 -1v-766q0 -1 1 -1h70q1 0 1 1v766q0 1 -1 1zM178 72h-70q-1 0 -1 -1v-70q0 -1 1 -1h70q1 0 1 1v70q0 1 -1 1z
+M248 128h70q1 0 1 1v638q0 1 -1 1h-70q-1 0 -1 -1v-638q0 -1 1 -1z" />
+    <glyph glyph-name="hourglass" unicode="&#xe653;" 
+d="M860 8h-92v219l-192 157l192 157v219h92q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-696q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h92v-219l192 -157l-192 -157v-219h-92q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h696q15 0 25.5 10.5
+t10.5 25.5t-10.5 25.5t-25.5 10.5zM328 581v179h368v-179l-182 -147l-2 2l-2 -2zM696 8h-368v179l184 149l184 -149v-179z" />
+    <glyph glyph-name="key" unicode="&#xe654;" 
+d="M876 427q-77 78 -186.5 84t-193.5 -60l-369 369q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -25l369 -370q-66 -84 -60 -193.5t84 -186.5q84 -84 203.5 -84t204 84t84 203.5t-84.5 203.5zM825 71q-63 -63 -152.5 -63t-153 63t-63.5 152.5t63.5 153t153 63.5t152.5 -63.5
+t63 -153t-63 -152.5zM353 596l76 76q11 10 11 25t-10.5 25.5t-25.5 10.5t-26 -10l-76 -77zM333 768q11 11 11 25.5t-10.5 25t-25.5 10.5t-26 -10l-76 -77l51 -50z" />
+    <glyph glyph-name="flag" unicode="&#xe655;" 
+d="M888 640h-176v56q0 30 -21 51t-51 21h-360q-3 27 -23.5 45.5t-48.5 18.5h-72q-30 0 -51 -21t-21 -51v-752q0 -30 21 -51t51 -21h72q30 0 51 21t21 51v256h360v-56q0 -30 21 -51t51 -21h176q30 0 51 21t21 51v360q0 30 -21 51t-51 21zM208 8h-72v752h72v-752zM640 336
+h-360v360h360v-360zM888 208h-176v360h176v-360z" />
+    <glyph glyph-name="layout" unicode="&#xe656;" 
+d="M136 624zM100 624q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM952 768h-880q-30 0 -51 -21t-21 -51v-624q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v624q0 30 -21 51t-51 21zM256 72h-184v408h184v-408zM952 72
+h-624v169q0 -1 1 -1h622q1 0 1 1v-169zM952 311q0 1 -1 1h-622q-1 0 -1 -1v169h624v-169zM952 552h-880v144h880v-144zM240 624zM204 624q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM344 624zM308 624
+q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5z" />
+    <glyph glyph-name="printer" unicode="&#xe673;" 
+d="M392 144h240v-72h-240v72zM392 312h240v-72h-240v72zM888 648h-120v112q0 30 -21 51t-51 21h-368q-30 0 -51 -21t-21 -51v-112h-120q-30 0 -51 -21t-21 -51v-304q0 -30 21 -51t51 -21h120v-192q0 -30 21 -51t51 -21h368q30 0 51 21t21 51v192h120q30 0 51 21t21 51v304
+q0 30 -21 51t-51 21zM328 759q0 1 1 1h366q1 0 1 -1v-110q0 -1 -1 -1h-366q-1 0 -1 1v110zM696 8h-368v368h368v-368zM888 272h-120v104q0 30 -21 51t-51 21h-368q-30 0 -51 -21t-21 -51v-104h-120v304h752v-304zM820 508zM784 508q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5
+t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5z" />
+    <glyph glyph-name="USB" unicode="&#xe6d7;" 
+d="M768 704v-192h56v-138h-276v330h60l-96 128l-96 -128h60v-440h-276v129q37 17 50 55q6 16 6 32q0 40 -28 68t-68 28t-68 -28t-28 -68q0 -31 18 -56t46 -34v-126q0 -30 21 -51t51 -21h276v-71q-27 -11 -43.5 -35t-16.5 -54q0 -40 28 -68t68 -28t68 28t28 68q0 30 -16.5 54
+t-43.5 35v181h276q30 0 51 21t21 51v138h64v192h-192zM160 456q-10 0 -17 7t-7 17t7 17t17 7t17 -7t7 -17t-7 -17t-17 -7zM888 584h-48v48h48v-48z" />
+    <glyph glyph-name="skin" unicode="&#xe6d8;" 
+d="M888 832h-259q-2 -5 -3 -11q-13 -36 -44 -58.5t-70 -22.5t-70 22.5t-44 58.5q-1 6 -3 11h-259q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h56v-312q0 -30 21 -51t51 -21h496q30 0 51 21t21 51v312h56q30 0 51 21t21 51v368q0 30 -21 51t-51 21zM888 392h-129
+q1 0 1 -1v-382q0 -1 -1 -1h-494q-1 0 -1 1v382q0 1 1 1h-129v368h210q26 -43 70 -69t96 -26t96 26t70 69h210v-368z" />
+    <glyph glyph-name="tool" unicode="&#xe6d9;" 
+d="M925 731l-167 -166l-68 67l166 166q-63 40 -139.5 32t-130.5 -63q-43 -42 -57.5 -99.5t0.5 -111.5l-189 -189q-54 15 -111.5 0.5t-99.5 -57.5q-55 -54 -63 -130.5t32 -139.5l166 166l67 -68l-166 -166q63 -42 140.5 -34t132.5 63q43 42 57.5 99.5t-0.5 111.5l189 189
+q54 -16 111.5 -1t99.5 57q56 56 63.5 133.5t-33.5 140.5zM395 44q-47 -47 -114 -45l95 95q18 18 18 43t-18 43l-68 68q-18 18 -43.5 18t-43.5 -18l-95 -95q-1 67 46 114q37 37 88 44.5t96 -15.5q21 -12 39 -29q17 -17 28 -39q24 -44 16.5 -95.5t-44.5 -88.5zM468 273
+q-13 21 -30 37q-17 18 -37 30l155 155q13 -21 30 -37q17 -18 37 -30zM852 501q-37 -37 -88 -44.5t-96 15.5q-21 12 -39 29q-17 17 -28 39q-24 44 -16.5 95.5t44.5 87.5q47 47 114 46l-95 -95q-18 -18 -18 -43.5t18 -43.5l68 -67q18 -18 43.5 -18t43.5 18l95 95
+q1 -67 -46 -114z" />
+    <glyph glyph-name="car" unicode="&#xe6dc;" 
+d="M952 448h8l-50 242q-5 29 -30.5 49.5t-55.5 20.5h-624q-30 0 -55 -20.5t-31 -49.5l-50 -242h8q-30 0 -51 -21t-21 -51v-176q0 -28 18.5 -48.5t45.5 -23.5v0q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5h384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v0
+q27 3 45.5 23.5t18.5 48.5v176q0 30 -21 51t-51 21zM182 688h656l50 -240h-752zM952 200h-64v-72q0 -23 -16.5 -39.5t-39.5 -16.5t-39.5 16.5t-16.5 39.5v72h-528v-72q0 -23 -16.5 -39.5t-39.5 -16.5t-39.5 16.5t-16.5 39.5v72h-64v176h880v-176zM192 288zM156 288
+q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM832 288zM796 288q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5z" />
+    <glyph glyph-name="addusergroup" unicode="&#xe6dd;" 
+d="M420 470q-5 24 -5 48q0 13 1 25q-38 5 -63.5 34.5t-25.5 68.5q0 43 30.5 73.5t73.5 30.5q28 0 52 -14t37 -37q33 18 69 24q-22 45 -64.5 72t-93.5 27q-73 0 -124.5 -51.5t-51.5 -124.5q0 -70 48 -121t117 -55zM777 307q-73 35 -154 35q-146 0 -249 -103t-103 -249
+q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 116 82 198t198 82q28 0 56 -6q44 33 98 43zM909 142h-88v88q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-88h-88q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h88v-88q0 -15 10.5 -25.5t25.5 -10.5
+t25.5 10.5t10.5 25.5v88h88q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM799 518q0 73 -51.5 124.5t-124.5 51.5t-124.5 -51.5t-51.5 -124.5t51.5 -124.5t124.5 -51.5t124.5 51.5t51.5 124.5zM623 414q-43 0 -73.5 30.5t-30.5 73.5t30.5 73.5t73.5 30.5t73.5 -30.5
+t30.5 -73.5t-30.5 -73.5t-73.5 -30.5zM454 397q-24 33 -33 73q-94 -3 -172.5 -50.5t-124 -127.5t-45.5 -174q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 116 82 198t198 82q11 0 23 -1z" />
+    <glyph glyph-name="carryout" unicode="&#xe6df;" 
+d="M162 312h380q14 0 24 10t10 24v4q0 14 -10 24t-24 10h-380q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10zM537.5 265.5q-10.5 -10.5 -10.5 -25.5t11 -25l84 -85l1 -1l1 -1l4 -3q10 -10 23.5 -10t23.5 10l224 224q10 10 10 24t-10 23l-3 4q-10 10 -24 10t-24 -10
+l-197 -197l-63 63q-10 10 -25 10t-25.5 -10.5zM952 704h-84v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-248v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-248v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-84
+q-30 0 -51 -21t-21 -51v-560q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v560q0 30 -21 51t-51 21zM952 72h-880v376h880v-376zM952 520h-880v112h84v-20q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20h248v-20q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20
+h248v-20q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20h84v-112zM162 188h252q14 0 24 10t10 24v4q0 14 -10 24t-24 10h-252q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10z" />
+    <glyph glyph-name="deleteuser" unicode="&#xe6e0;" 
+d="M722 320q-95 63 -210 63q-104 0 -192.5 -51.5t-140 -140t-51.5 -193.5v0v-1v-1q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v2v0q0 130 91.5 221.5t220.5 91.5q58 0 111 -21q46 27 99 30zM787 96l62 62q11 11 11 26t-10.5 25.5t-25.5 10.5t-26 -10l-62 -63l-62 63
+q-11 10 -26 10t-25.5 -10.5t-10.5 -25.5t11 -26l62 -62l-62 -62q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t26 10l62 62l62 -62q11 -10 26 -10t25.5 10.5t10.5 25.5t-11 25zM736 607.5q0 92.5 -65.5 158.5t-158.5 66t-158.5 -66t-65.5 -158.5t65.5 -158.5t158.5 -66t158.5 66
+t65.5 158.5zM512 455q-63 0 -107.5 44.5t-44.5 108t44.5 108t107.5 44.5t107.5 -44.5t44.5 -108t-44.5 -108t-107.5 -44.5z" />
+    <glyph glyph-name="deleteusergroup" unicode="&#xe6e1;" 
+d="M420 470q-5 24 -5 48q0 13 1 25q-38 5 -63.5 34.5t-25.5 68.5q0 43 30.5 73.5t73.5 30.5q28 0 52 -14t37 -37q33 18 69 24q-22 45 -64.5 72t-93.5 27q-73 0 -124.5 -51.5t-51.5 -124.5q0 -70 48 -121t117 -55zM898 44l-62 62l62 62q11 11 11 26t-10.5 25.5t-25.5 10.5
+t-26 -11l-62 -62l-62 62q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -26l62 -62l-62 -62q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t26 11l62 62l62 -62q11 -11 26 -11t25.5 10.5t10.5 25.5t-11 26zM777 307q-73 35 -154 35q73 0 124.5 51.5t51.5 124.5t-51.5 124.5
+t-124.5 51.5t-124.5 -51.5t-51.5 -124.5t51.5 -124.5t124.5 -51.5q-146 0 -249 -103t-103 -249q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 116 82 198t198 82q28 0 56 -6q44 33 98 43zM519 518q0 43 30.5 73.5t73.5 30.5t73.5 -30.5t30.5 -73.5t-30.5 -73.5
+t-73.5 -30.5t-73.5 30.5t-30.5 73.5zM454 397q-24 33 -33 73q-94 -3 -172.5 -50.5t-124 -127.5t-45.5 -174q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 116 82 198t198 82q11 0 23 -1z" />
+    <glyph glyph-name="man" unicode="&#xe6e2;" 
+d="M384 576q-133 0 -226.5 -93.5t-93.5 -226.5t93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5zM384 8q-103 0 -175.5 72.5t-72.5 175.5t72.5 175.5t175.5 72.5t175.5 -72.5t72.5 -175.5t-72.5 -175.5t-175.5 -72.5zM949.5 821.5
+q-10.5 10.5 -25.5 10.5h-376q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h340v-340q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v376q0 15 -10.5 25.5z" />
+    <glyph glyph-name="isv" unicode="&#xe6e3;" 
+d="M860 292q-15 0 -25.5 -10.5t-10.5 -25.5v-248h-624v248q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-248q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v248q0 15 -10.5 25.5t-25.5 10.5zM888 832h-752q-30 0 -51 -21t-21 -51v-204q0 -71 51 -122t123 -51
+q41 0 77 18t60 50q24 -32 60 -50t77 -18q42 0 77.5 18t60.5 49q24 -31 59.5 -49t76.5 -18q72 0 123 51t51 122v204q0 30 -21 51t-51 21zM339 658v-102q0 -42 -29.5 -71.5t-72 -29.5t-72 29.5t-29.5 71.5v204h203v-102zM512 455q-42 0 -71.5 29.5t-29.5 71.5v204h202v-204
+v-11q-4 -38 -33 -64t-68 -26zM888 556q0 -42 -29.5 -71.5t-72 -29.5t-72 29.5t-29.5 71.5v204h203v-204z" />
+    <glyph glyph-name="gift" unicode="&#xe6e4;" 
+d="M888 576h-248q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5h-248q-30 0 -51 -21t-21 -51v-112q0 -30 21 -51t51 -21h-8v-312q0 -30 21 -51t51 -21h624
+q30 0 51 21t21 51v312h-8q30 0 51 21t21 51v112q0 30 -21 51t-51 21zM384 648q-23 0 -39.5 16.5t-16.5 39.5t16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5v-56h-56zM476 8h-276v312h276v-312zM476 392h-340v112h340v-112zM584 704q0 23 16.5 39.5t39.5 16.5t39.5 -16.5
+t16.5 -39.5t-16.5 -39.5t-39.5 -16.5h-56v56zM824 8h-276v312h276v-312zM888 392h-340v112h340v-112z" />
+    <glyph glyph-name="idcard" unicode="&#xe6e5;" 
+d="M200 128h176q30 0 51 21t21 51v88q0 41 -19 76t-51 57q38 37 38 91q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 -54 38 -91q-32 -22 -51 -57t-19 -76v-88q0 -30 21 -51t51 -21zM288 568q23 0 39.5 -16.5t16.5 -39.5t-16.5 -39.5t-39.5 -16.5t-39.5 16.5
+t-16.5 39.5t16.5 39.5t39.5 16.5zM200 283v1v4q0 36 26 62t62 26t62 -26t26 -62v-4v-1v-78q0 -5 -5 -5h-166q-5 0 -5 5v78zM952 768h-880q-30 0 -51 -21t-21 -51v-624q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v624q0 30 -21 51t-51 21zM952 72h-880v624h880v-624zM548 348
+h248q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-248q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM548 184h184q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-184q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM548 512h312q15 0 25.5 10.5
+t10.5 25.5t-10.5 25.5t-25.5 10.5h-312q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5z" />
+    <glyph glyph-name="medicinebox" unicode="&#xe6e6;" 
+d="M952 584h-120v112q0 30 -21 51t-51 21h-496q-30 0 -51 -21t-21 -51v-112h-120q-30 0 -51 -21t-21 -51v-440q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v440q0 30 -21 51t-51 21zM264 696h496v-112h-496v112zM952 72h-880v440h880v-440zM388 256h88v-88q0 -15 10.5 -25.5
+t25.5 -10.5t25.5 10.5t10.5 25.5v88h88q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-88v88q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-88h-88q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5z" />
+    <glyph glyph-name="redenvelopes" unicode="&#xe6e7;" 
+d="M512 457l-59 59q-11 10 -25.5 10t-25 -10.5t-10.5 -25t10 -25.5l67 -67h-115q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10h122v-64h-90q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10h90v-84q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v84h90q14 0 24 10
+t10 24v4q0 14 -10 24t-24 10h-90v64h122q14 0 24 10t10 24v4q0 14 -10 24t-24 10h-114l67 68q11 10 11 25t-10.5 25.5t-25.5 10.5t-26 -10zM896 770h-1q-3 26 -23.5 44t-47.5 18h-624q-27 0 -47.5 -18t-23.5 -44h-1h1q-1 -5 -1 -10v-752q0 -30 21 -51t51 -21h624q30 0 51 21
+t21 51v752q0 5 -1 10h1zM715 760l-158 -78q-19 -10 -45 -10t-45 10l-157 78h405zM824 8h-624v725l248 -126q26 -14 64 -14t64 14l248 126v-725z" />
+    <glyph glyph-name="rest" unicode="&#xe6e8;" 
+d="M275 615q15 0 25.5 10.5t10.5 25.5v209q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-209q0 -15 10.5 -25.5t25.5 -10.5zM888 471h-120q0 30 -21 51t-51 21h-496q-30 0 -51 -21t-21 -51v-248q0 -5 1 -10q-1 -10 -1 -21q0 -133 93.5 -226.5t226.5 -93.5
+q119 0 208.5 77.5t107.5 193.5h124q30 0 51 21t21 51v184q0 30 -21 51t-51 21zM696 215h-1q1 -12 1 -23q0 -103 -72.5 -175.5t-175.5 -72.5t-175.5 72.5t-72.5 175.5q0 11 1 23h-1v256h496v-256zM888 223h-112v176h112v-176zM613 615q15 0 25.5 10.5t10.5 25.5v209
+q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-209q0 -15 10.5 -25.5t25.5 -10.5zM443 615q15 0 25.5 10.5t10.5 25.5v209q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-209q0 -15 10.5 -25.5t25.5 -10.5z" />
+    <glyph glyph-name="Safety" unicode="&#xe6ea;" 
+d="M512 832l-384 -128v-384q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5v384zM824 320q0 -129 -91.5 -220.5t-220.5 -91.5t-220.5 91.5t-91.5 220.5v330l312 110l312 -110v-330zM378 421q-10 10 -25 10t-25.5 -10.5t-10.5 -25.5t11 -25l129 -129l2 -3
+q10 -9 24 -9t24 9l224 224q10 10 10 24t-10 24l-3 3q-10 10 -24 10t-24 -10l-197 -197z" />
+    <glyph glyph-name="wallet" unicode="&#xe6eb;" 
+d="M620 384zM584 384q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM952 768h-880q-30 0 -51 -21t-21 -51v-624q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v624q0 30 -21 51t-51 21zM952 328h-432v112h432v-112z
+M952 512h-432q-30 0 -51 -21t-21 -51v-112q0 -30 21 -51t51 -21h432v-184h-880v624h880v-184z" />
+    <glyph glyph-name="woman" unicode="&#xe6ec;" 
+d="M512 320q119 0 203.5 84.5t84.5 203.5t-84.5 203.5t-203.5 84.5t-203.5 -84.5t-84.5 -203.5t84.5 -203.5t203.5 -84.5zM512 824q89 0 152.5 -63.5t63.5 -152.5t-63.5 -152.5t-152.5 -63.5t-152.5 63.5t-63.5 152.5t63.5 152.5t152.5 63.5zM860 256h-696
+q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h312v-276q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v276h312q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5z" />
+    <glyph glyph-name="adduser" unicode="&#xe6ed;" 
+d="M860 132h-88v88q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-88h-88q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h88v-88q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v88h88q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM736 607.5
+q0 92.5 -65.5 158.5t-158.5 66t-158.5 -66t-65.5 -158.5t65.5 -158.5t158.5 -66t158.5 66t65.5 158.5zM512 455q-63 0 -107.5 44.5t-44.5 108t44.5 108t107.5 44.5t107.5 -44.5t44.5 -108t-44.5 -108t-107.5 -44.5zM722 320q-95 63 -210 63q-104 0 -192.5 -51.5t-140 -140
+t-51.5 -193.5v0v-1v-1q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v2v0q0 130 91.5 221.5t220.5 91.5q58 0 111 -21q46 27 99 30z" />
+    <glyph glyph-name="bank" unicode="&#xe6ee;" 
+d="M940 419l-402 401q-10 11 -25 11t-26 -11l-401 -401q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t25 11l377 376l376 -376q10 -11 25 -11t25.5 11t10.5 25.5t-10 25.5zM828 292q-15 0 -25.5 -10.5t-10.5 -25.5v-248h-560v248q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5
+t-10.5 -25.5v-248q0 -30 21 -51t51 -21h560q30 0 51 21t21 51v248q0 15 -10.5 25.5t-25.5 10.5zM320 358v-4q0 -14 10 -24t24 -10h122v-64h-90q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10h90v-84q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v84h90q14 0 24 10
+t10 24v4q0 14 -10 24t-24 10h-90v64h122q14 0 24 10t10 24v4q0 14 -10 24t-24 10h-135q2 1 2 2l85 85q11 10 11 25t-10.5 25.5t-25.5 10.5t-26 -10l-59 -60l-60 60q-10 10 -25 10t-25.5 -10.5t-10.5 -25.5t10 -25l85 -85l2 -2h-134q-14 0 -24 -10t-10 -24z" />
+    <glyph glyph-name="Trophy" unicode="&#xe6ef;" 
+d="M760 384h8q53 0 90.5 37.5t37.5 90.5v256h-128q-4 27 -24 45.5t-48 18.5h-368q-28 0 -48.5 -18.5t-23.5 -45.5h-128v-256q0 -53 37.5 -90.5t90.5 -37.5h8q19 -75 77 -127t135 -63v-186h-312q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h696q15 0 25.5 10.5
+t10.5 25.5t-10.5 25.5t-25.5 10.5h-312v186q77 11 135 63t77 127zM768 696h56v-184q0 -23 -16.5 -39.5t-39.5 -16.5v240zM256 456q-23 0 -39.5 16.5t-16.5 39.5v184h56v-240zM512 264q-76 0 -130 54t-54 130v312h368v-312q0 -76 -54 -130t-130 -54z" />
+    <glyph glyph-name="Contacts" unicode="&#xe6f0;" 
+d="M100 526h120q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-120q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM256 204q0 15 -10.5 25.5t-25.5 10.5h-120q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h120q15 0 25.5 10.5t10.5 25.5zM888 832
+h-688q-30 0 -51 -21t-21 -51v-56h72v56h688v-752h-688v54h-72v-54q0 -30 21 -51t51 -21h688q30 0 51 21t21 51v752q0 30 -21 51t-51 21zM100 347h120q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-120q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM309 114
+q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 76 54 130t130 54t130 -54t54 -130q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 106 -75 181t-181 75t-181 -75t-75 -181zM725 530q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113z
+M565 442q-36 0 -62 26t-26 62t26 62t62 26t62 -26t26 -62t-26 -62t-62 -26z" />
+    <glyph glyph-name="loading1" unicode="&#xe6ae;" 
+d="M512 -128q-104 0 -199 40q-92 39 -163 110t-110 163q-40 95 -40 199q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5q0 -90 35 -171q33 -79 94 -140t140 -95q81 -34 171 -34t171 35q79 33 140 94t95 140q34 81 34 171t-35 171q-33 79 -94 140t-140 95q-81 34 -171 34
+q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5q104 0 199 -40q92 -39 163 -110t110 -163q40 -95 40 -199t-40 -199q-39 -92 -110 -163t-163 -110q-95 -40 -199 -40z" />
+    <glyph glyph-name="loading2" unicode="&#xe64d;" 
+d="M988 348q-15 0 -25.5 10.5t-10.5 25.5q0 90 -35 171q-33 79 -94 140t-140 95q-81 34 -171 34q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5q104 0 199 -40q92 -39 163 -110t110 -163q40 -95 40 -199q0 -15 -10.5 -25.5t-25.5 -10.5z" />
+    <glyph glyph-name="like2" unicode="&#xe69d;" 
+d="M958 421v3q-2 3 -2 4q-15 58 -66 77q-24 8 -50 8h-1h-87h-32.5h-32.5h-21q4 27 7 41q13 67 -5 119q-7 20 -24 66l-9 24q-16 40 -54 56q-29 13 -59 13q-34 0 -66 -17q-51 -26 -50 -83q1 -23 1 -36q1 -41 2 -62q0 -5 -2 -9q-3 -6 -10.5 -19t-11.5 -20q-35 -61 -53 -90
+q-12 -18 -32.5 -30t-35.5 -15l-15 -3h-113q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h248h80h80h50h50h94q42 0 72 10q40 13 64.5 44t28.5 73q2 23 -3 45q25 40 23 84q-1 12 -5 24q24 36 23 76q0 15 -5 30q14 21 20 45l4 5v44zM248 8h-112v368h112v-368zM888 391
+l-2 -8q-3 -11 -9 -21l-19 -28l9 -32q2 -6 2 -13q1 -17 -11 -33l-18 -28l9 -32q1 -5 2 -9q1 -20 -12 -40l-16 -25l6 -25v0v-3q3 -13 2 -25v0v-1q-2 -20 -13 -33q-11 -14 -30 -21q-19 -6 -50 -6h-94h-24.5h-25h-25.5h-25h-77h-83h-64l1 388q46 22 72 62v1q19 30 53 91l1 1v0
+q2 3 14 24q1 1 4 6t4 7q14 24 12 51q-1 22 -2 57v2v16v20q-1 6 2 10q2 4 9 8q16 8 32 8q15 0 31 -7q10 -4 15 -15q7 -21 9 -24q15 -41 23 -64q12 -35 2 -82q-3 -17 -7 -43l-14 -84h106h32h32h88h1v0q13 0 26 -4q15 -6 20 -27q1 0 1.5 -2t0.5 -3v-14z" />
+    <glyph glyph-name="dislike2" unicode="&#xe69e;" 
+d="M960 352v44l-4 6q-6 24 -20 44q5 14 5 30q2 40 -23 76q4 12 5 25q2 43 -23 83q5 22 2 46q-3 41 -27.5 72t-64.5 44q-30 10 -72 10h-94h-50h-51h-79h-80h-248q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h113q6 -1 16 -3t32.5 -14.5t34.5 -30.5q18 -29 53 -90
+q4 -7 11.5 -20t10.5 -18q2 -5 2 -10q-1 -20 -2 -62q0 -13 -1 -36q-1 -56 50 -83q32 -17 66 -17q30 0 59 12q38 17 54 57l9 24q15 41 24 65q18 53 5 120q-4 19 -7 41h21h32.5h32.5h87h1q26 0 50 8q52 19 66 77l2 4v3zM248 392h-112v368h112v-368zM888 363q0 -1 -1 -3
+q0 -2 -1 -2q-5 -21 -20 -27q-13 -4 -26 -4v0h-1h-88h-32h-15.5h-16.5h-106l14 -84q4 -26 7 -43q10 -48 -2 -82q-8 -23 -24 -63q-1 -5 -4.5 -14t-4.5 -10q-4 -12 -14 -16q-16 -7 -31 -7q-16 0 -32 8q-7 4 -10 8q-2 3 -2 10q1 23 1 37v1q1 39 2 57q2 27 -12 51q-1 2 -4 6.5
+t-4 6.5q-13 23 -14 24v0l-1 2q-34 60 -53 91h-1q-25 40 -71 62l-1 388h64h83h77h25h25.5h25h24.5h94q31 0 50 -6t30 -21q11 -13 13 -33v-1v0q1 -12 -2 -24v-4v0l-6 -25l16 -25q13 -20 12 -39q0 -5 -2 -9l-9 -33l18 -28q12 -16 11 -33q0 -7 -2 -13l-9 -32l19 -28q6 -10 9 -21
+l2 -8v-14z" />
+    <glyph glyph-name="like1" unicode="&#xe64c;" 
+d="M184 448h-48q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h48q30 0 51 21t21 51v368q0 30 -21 51t-51 21zM957 422q-11 43 -47 56q-21 6 -42 6h-226q-7 0 -8 1.5t0 8.5q2 10 4.5 26.5t5 30.5t4.5 26q12 62 -4 109q-6 17 -36 97q-10 28 -36 39q-53 22 -102 -3
+q-34 -18 -33 -54q0 -10 1 -48t2 -58q1 -18 -8 -33q-73 -125 -76 -130q-4 -6 -28 -32q-17 -18 -24 -30t-7 -29q0 -284 -1 -397q0 -30 21.5 -51t51.5 -21h390q40 0 66 9q32 10 51 34t22 58q2 29 -6 50q-1 4 2 9q28 37 26 76q-1 10 -7 29q-3 7 2 13q26 33 25 69q0 7 -3.5 21
+t-3.5 16q-2 6 0 9q19 21 26 53q0 1 1 2v29z" />
+    <glyph glyph-name="dislike1" unicode="&#xe64b;" 
+d="M256 392q0 -30 -21 -51t-51 -21h-48q-30 0 -51 21t-21 51v368q0 30 21 51t51 21h48q30 0 51 -21t21 -51v-368zM957 346q-11 -43 -47 -56q-21 -6 -42 -6h-226q-7 0 -8 -1.5t0 -8.5q2 -10 4.5 -26.5t5 -30.5t4.5 -26q12 -62 -4 -109q-6 -17 -36 -97q-10 -28 -36 -39
+q-53 -22 -102 3q-34 18 -33 54q0 10 1 48t2 58q1 18 -8 33q-73 125 -76 130q-4 6 -28 32q-17 18 -24 30t-7 29q0 284 -1 397q0 30 21.5 51t51.5 21h390q40 0 66 -9q32 -10 51 -34t22 -58q2 -29 -6 -50q-1 -4 2 -9q28 -37 26 -76q-1 -10 -7 -29q-3 -7 2 -13q26 -33 25 -69
+q0 -7 -3.5 -21t-3.5 -15q-2 -7 0 -9q19 -22 26 -54q0 -1 1 -2v-28q-2 -7 -3 -10z" />
+    <glyph glyph-name="bulb1" unicode="&#xe649;" 
+d="M640 -56h-256q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h256q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM896 522q0 155 -112.5 264.5t-271.5 109.5t-271.5 -109.5t-112.5 -264.5q0 -102 52 -188.5t140 -135.5v-62q0 -30 21 -51t51 -21h240
+q30 0 51 21t21 51v62q88 49 140 135.5t52 188.5zM733 309q-43 -42 -99 -65l-1 -0.5l-1 -0.5v-107h-240v107l-1 0.5l-1 0.5q-56 23 -99 65t-67 96q-24 56 -24 117t24 117q24 54 67 96t99 65q58 24 122 24t122 -24q56 -23 99 -65t67 -96q24 -56 24 -117t-24 -117
+q-24 -54 -67 -96z" />
+    <glyph glyph-name="rocket1" unicode="&#xe90f;" 
+d="M954 799l-6 21l-21 5q-27 7 -72 7q-111 0 -235 -34q-63 -18 -112 -41q-50 -25 -78 -53q-25 -25 -65 -97q-9 -17 -19 -36q-60 -18 -143 -70q-97 -61 -132 -107q-11 -14 -6 -31.5t22 -23.5q3 -1 10.5 -4t11.5 -4q79 -30 111 -46v0l192 -193q16 -33 46 -112q4 -10 9 -21
+q6 -17 23 -22q5 -1 10 -1q12 0 22 7q46 34 106 132q53 84 70 143q21 11 37 19q73 40 98 65q35 35 64.5 106.5t46.5 163.5q16 83 16 152q0 47 -6 75zM293 457q-21 -47 -46 -105q-29 14 -82 34q33 27 76 54q31 19 59 34q-4 -10 -7 -17zM568 113q-27 -43 -54 -76q-20 51 -34 82
+q55 23 106 46q1 0 15 7q-14 -28 -33 -59zM888 725q0 -64 -14 -140q-16 -81 -42 -145q-24 -61 -50 -87v0q-17 -17 -82 -52q-58 -32 -144 -71q-56 -25 -126 -54l-126 126q27 65 54 126q39 86 71 144q35 64 52 82q19 19 59 38q43 21 100 36q113 32 216 32q17 0 31 -1
+q1 -16 1 -34zM185 144q-29 0 -51.5 -17t-31.5 -44l-37 -125q-1 -2 -1 -5q0 -7 5 -12t12 -5q3 0 5 1l124 37q27 9 44.5 32t17.5 52q0 35 -25.5 60.5t-61.5 25.5zM594.5 466.5q18.5 -18.5 45.5 -18.5t45.5 18.5t18.5 45.5t-18.5 45.5t-45.5 18.5t-45.5 -18.5t-18.5 -45.5
+t18.5 -45.5z" />
+    <glyph glyph-name="select1" unicode="&#xe64a;" 
+d="M888 832h-752q-30 0 -51 -21t-21 -51v-752q0 -30 21 -51t51 -21h504q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-504v752h752v-504q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v504q0 30 -21 51t-51 21zM634 314l103 103q9 9 4.5 20t-16.5 11h-241
+q-15 0 -25.5 -10.5t-10.5 -25.5v-240q0 -13 11 -17.5t20 4.5l103 104l188 -188q11 -11 26 -11t25.5 10.5t10.5 25.5t-10 26z" />
+    <glyph glyph-name="apple1" unicode="&#xe68c;" 
+d="M902 547q-21 31 -49 52.5t-55.5 31t-46.5 13.5t-36 4q-35 4 -75 -7.5t-73 -25t-48 -13.5q-17 0 -75 22.5t-94 21.5q-65 -1 -121.5 -35.5t-90.5 -92.5q-32 -56 -40 -128t5.5 -142t39.5 -133.5t60 -112.5q20 -30 34.5 -48t36 -40t44.5 -32.5t47 -9.5q29 1 77.5 21.5
+t89.5 20.5q40 0 88 -20.5t81 -20.5q25 1 47 11t42.5 30.5t34 37.5t33.5 47q44 64 71 146v0q-8 3 -17.5 8t-33 22.5t-40.5 38.5t-31.5 58t-14.5 80q-1 36 11 70t24.5 53.5t34 39t26.5 23t14 9.5zM716 896q-39 -2 -81 -23.5t-70 -54.5q-27 -30 -41.5 -73t-9.5 -85
+q41 -3 80.5 17.5t68.5 55.5q28 34 43 77t10 86z" />
+    <glyph glyph-name="apple-o" unicode="&#xe6d4;" 
+d="M698 577h10h2l2 -1q30 -1 59 -13q13 -5 25 -12q-4 -5 -10 -11q-30 -37 -46 -79q-21 -52 -21 -110q1 -125 88 -210q16 -15 33 -27q-18 -40 -42 -74q-37 -55 -58 -74q-21 -20 -40 -21h-2q-17 0 -47 14q-64 27 -119 27q-56 0 -122 -28q-31 -13 -48 -14h-1q-15 0 -38 22
+t-61 77q-66 95 -88 218q-11 65 -5 120q7 57 31 101q25 42 65 67q41 24 86 25h1q23 0 77 -21q58 -24 90 -24q29 0 87 23q63 25 92 25zM698 649q-41 0 -103 -24t-76 -24q-17 0 -74 22.5t-93 22.5h-2q-65 -1 -121.5 -35.5t-90.5 -92.5q-32 -57 -40 -128.5t5.5 -141.5
+t39.5 -133.5t60 -112.5q20 -29 34 -47.5t35 -40t43.5 -32t45.5 -10.5h3q30 1 78.5 21.5t89.5 20.5q40 0 87 -20.5t79 -20.5h3q25 1 47 11t42.5 30.5t33.5 37.5t34 47q44 64 71 146v0q-8 3 -17.5 8t-33 22.5t-40.5 38.5t-31.5 58t-15.5 80q0 36 12 70t24.5 53.5t34 39t26 23
+t14.5 9.5q-21 31 -49 52.5t-55.5 31t-46.5 13.5t-36 4q-9 1 -17 1zM716 896q-39 -2 -81 -23.5t-70 -54.5q-27 -30 -41.5 -73t-9.5 -85q41 -3 80.5 17.5t68.5 55.5q28 34 43 77t10 86z" />
+    <glyph glyph-name="android1" unicode="&#xe938;" 
+d="M888 575q-26 0 -44.5 -18.5t-18.5 -44.5v-247q0 -27 18.5 -45.5t44 -18.5t44 18.5t18.5 45.5v247q0 26 -18 44.5t-44 18.5zM136.5 575q-25.5 0 -44 -18.5t-18.5 -44.5v-247q0 -27 18.5 -45.5t44 -18.5t44 18.5t18.5 45.5v247q0 26 -18.5 44.5t-44 18.5zM236 573v-452
+q0 -20 14.5 -34t34.5 -14h55v-138q0 -26 18.5 -44.5t44 -18.5t44 18.5t18.5 44.5v138h97v-138q0 -26 18 -44.5t44 -18.5t44 18.5t18 44.5v138h56q20 0 34 14t14 35v451h-554zM643 807l52 75q5 8 -2 13t-13 -3l-53 -78q-55 22 -115 22t-115 -22l-53 77q-6 9 -13 3
+q-7 -4 -2 -13l52 -74q-62 -29 -101.5 -80t-44.5 -114h554q-5 63 -44.5 114t-101.5 80zM395 690q-13 0 -22 9t-9 22t9 22t22 9t22 -9t9 -22t-9 -22t-22 -9zM632.5 690q-12.5 0 -21.5 9t-9 22t9 22t21.5 9t21.5 -9t9 -22t-9 -22t-21.5 -9z" />
+    <glyph glyph-name="android" unicode="&#xe68d;" 
+d="M888.5 601.5q-24.5 24.5 -60.5 24.5q-6 0 -13 -1v1h-4q-9 53 -43 100q-32 44 -81 74l29 41v4v2l1 2q1 7 1 10q0 16 -10 26.5t-26 10.5q-18 0 -30 -18l-33 -48q-53 18 -107 18t-107 -18l-33 48q-12 18 -30 18q-16 0 -26 -10.5t-10 -26.5q0 -11 7 -19l26 -37
+q-50 -30 -82 -75q-34 -47 -42 -100h-6v-1q-6 1 -12 1q-37 0 -61 -24t-24 -60v-269q0 -36 24 -60.5t60 -24.5q6 0 13 1v-107q0 -25 17.5 -42.5t42.5 -17.5h37v-67q0 -36 24 -60q24 -25 60.5 -25t60.5 24q24 25 24 61v66h73v-66q0 -36 25 -60q24 -25 60 -25t61 25q24 24 24 60
+v67h36q25 0 43 17.5t18 42.5v105q6 -1 12 -1q36 0 61 24q24 25 24 61v268q1 36 -23.5 60.5zM209 272q0 -12 -12 -12t-12 12v269q0 12 12 12t12 -12v-269zM358 726q66 48 154 48t154 -48q56 -42 71 -100h-450q15 58 71 100zM403 -45q-1 -10 -12 -10q-12 0 -12 12v67h24v-69z
+M646 -45q-2 -10 -12 -10q-13 0 -13 12v67h25v-69zM743 96h-461v457h461v-457zM840 272q0 -12 -12.5 -12t-12.5 12v269q0 12 12.5 12t12.5 -12v-269zM585 712q-16 0 -26 -10.5t-10 -26.5t10 -26t26 -10t26.5 10t10 26t-10.5 26.5t-26 10.5zM439.5 712q-15.5 0 -26 -10.5
+t-10.5 -26.5t10.5 -26t26 -10t26 10t10.5 26t-10.5 26.5t-26 10.5z" />
+    <glyph glyph-name="aliwangwang-o1" unicode="&#xe68f;" 
+d="M985 560q-37 88 -106 157q-68 69 -158 106q-92 39 -192 39q-83 0 -160 -26q-54 25 -122 40t-105 17.5t-69 2.5h-12q-25 -1 -38.5 -21.5t-4.5 -43.5l84 -211q-69 -117 -69 -253q0 -101 39 -193q38 -88 106 -157q69 -68 158 -106q92 -39 193 -39q100 0 193 39
+q88 37 157 106q68 68 106 157q39 92 39 193.5t-39 192.5zM919 202q-32 -75 -91 -134t-134 -91h-1q-78 -33 -164.5 -33t-164.5 33q-76 32 -135 91t-90 134v1q-34 78 -34 164q0 117 59 216l18 30l-83 210q40 -1 82 -7q91 -14 158 -45l26 -12l28 9q65 22 136 22q86 0 164 -33
+q76 -32 135 -91t91 -134v0q33 -78 33 -165q0 -86 -33 -165zM511.5 577q-20.5 0 -34.5 -14t-14 -34v-72q0 -20 14 -34.5t34.5 -14.5t34.5 14.5t14 34.5v72q0 20 -14 34t-34.5 14zM740.5 577q-20.5 0 -34.5 -14t-14 -34v-72q0 -20 14 -34.5t34.5 -14.5t34.5 14.5t14 34.5v72
+q0 20 -14 34t-34.5 14z" />
+    <glyph glyph-name="aliwangwang" unicode="&#xe68e;" 
+d="M985 560q-37 88 -106 157q-68 69 -158 106q-91 39 -192 39q-83 0 -160 -26q-54 25 -122 40t-105 17.5t-69 2.5h-12q-25 -1 -38.5 -21.5t-4.5 -43.5l84 -211q-69 -117 -69 -253q0 -101 39 -193q38 -88 106 -157q69 -68 158 -106q92 -39 193 -39t193 39q88 37 157 106
+q68 68 106 157q39 92 39 193.5t-39 192.5zM560 457q0 -20 -14 -34.5t-34.5 -14.5t-34.5 14.5t-14 34.5v72q0 20 14 34t34.5 14t34.5 -14t14 -34v-72zM789 457q0 -20 -14 -34.5t-34.5 -14.5t-34.5 14.5t-14 34.5v72q0 20 14 34t34.5 14t34.5 -14t14 -34v-72z" />
+    <glyph glyph-name="pay-circle1" unicode="&#xe6a5;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM737 419q0 -14 -10.5 -23.5t-24.5 -9.5h-154v-64h122q14 0 24.5 -10.5t10.5 -24.5v-4q0 -14 -10.5 -23.5
+t-24.5 -9.5h-122v-149q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5t-10.5 25.5v149h-122q-15 0 -24.5 9.5t-9.5 23.5v4q0 14 10 24.5t24 10.5h122v64h-154q-15 0 -25 10t-10 24v3q0 14 10 24.5t25 10.5h166l-2 1l-118 118q-11 11 -11 26t10.5 25.5t25.5 10.5t26 -10l93 -93
+l92 92q11 11 25.5 11t25.5 -10.5t10.5 -25.5t-10.5 -25l-118 -118q-1 -1 -2 -1h167q14 0 24.5 -11t10.5 -25v-4z" />
+    <glyph glyph-name="pay-circle-o1" unicode="&#xe6a6;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 35q-79 33 -140 94t-94 140q-35 81 -35 171t35 171
+q33 79 94 140t140 94q81 35 171 35t171 -35q79 -33 140 -94t94 -140q35 -81 35 -171t-35 -171q-33 -79 -94 -140zM702 459h-167q1 0 2 1l118 118q11 10 11 25t-10.5 25.5t-25.5 10.5t-26 -11l-92 -92l-93 93q-11 10 -26 10t-25.5 -10.5t-10.5 -25.5t11 -26l118 -118l2 -1
+h-166q-14 0 -24.5 -10.5t-10.5 -24.5v-3q0 -14 10 -24t25 -10h154v-64h-123q-13 0 -23 -10.5t-10 -24.5v-4q0 -14 9.5 -23.5t23.5 -9.5h123v-149q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v149h122q14 0 24.5 9.5t10.5 23.5v4q0 14 -10.5 24.5t-24.5 10.5h-122v64
+h154q14 0 24.5 9.5t10.5 23.5v4q0 14 -10.5 25t-24.5 11z" />
+    <glyph glyph-name="poweroff" unicode="&#xe6d5;" 
+d="M512 512q15 0 25.5 10.5t10.5 25.5v312q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-312q0 -15 10.5 -25.5t25.5 -10.5zM512 -128q-104 0 -199 40q-92 39 -163 110t-110 163q-40 95 -40 199q0 123 55 231q53 105 147 177q12 9 27 7t24 -14t7 -27t-14 -24
+q-81 -61 -127 -151q-47 -94 -47 -199q0 -90 35 -171q33 -79 94 -140t140 -95q81 -34 171 -34t171 35q79 33 140 94t95 140q34 81 34 171q0 105 -47 199q-46 90 -127 151q-12 9 -14 24t7 27t24 14t27 -7q94 -72 147 -177q55 -109 55 -231q0 -104 -40 -200q-39 -91 -110 -162
+t-163 -110q-95 -40 -199 -40z" />
+    <glyph glyph-name="trademark" unicode="&#xe651;" 
+d="M666.5 397q46.5 43 46.5 115q0 37 -14 69q-14 30 -39 51q-25 19 -59 27.5t-125 8.5h-113v-578h65v264h23l194 -264h82l-196 264q89 0 135.5 43zM516 420h-88v182h91q66 0 96 -22q31 -22 31 -69.5t-32 -69.5q-31 -22 -98 -21zM512 896q-139 0 -257 -68.5t-186.5 -186.5
+t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM512 -56q-182 0 -311 129t-129 311t129 311t311 129t311 -129t129 -311t-129 -311t-311 -129z" />
+    <glyph glyph-name="find" unicode="&#xe6db;" 
+d="M521 512q-58 4 -99.5 -37.5t-37.5 -99.5l-98 -217l217 98q58 -4 99.5 37.5t37.5 99.5l98 217zM551.5 344.5q-16.5 -16.5 -39.5 -16.5t-39.5 16.5t-16.5 39.5t16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5t-16.5 -39.5zM512 896q-139 0 -257 -68.5t-186.5 -186.5
+t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM512 -56q-182 0 -311 129t-129 311t129 311t311 129t311 -129t129 -311t-129 -311t-311 -129z" />
+    <glyph glyph-name="copyright" unicode="&#xe6de;" 
+d="M518 176q-79 0 -121 56q-42 53 -42 150q0 96 43 152q44 58 121 58q63 0 101 -29q38 -31 49 -91h80q-14 96 -74 142q-59 46 -156 46q-119 0 -185 -83q-62 -75 -62 -195q0 -121 62 -195q65 -79 184 -79q96 0 156 51q59 50 78 153h-81q-19 -136 -153 -136zM512 896
+q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM512 -56q-182 0 -311 129t-129 311t129 311t311 129t311 -129t129 -311t-129 -311t-311 -129z" />
+    <glyph glyph-name="sound" unicode="&#xe6e9;" 
+d="M464 731l-233 -155h-166q-27 0 -46 -21t-19 -51v-240q0 -30 19 -51t46 -21h166l233 -155q23 -15 39.5 -5t16.5 40v624q0 30 -16.5 40t-39.5 -5zM448 134l-191 130h-185v240h185l191 127v-497zM640 232q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5
+q93 0 158.5 65.5t65.5 158.5t-65.5 158.5t-158.5 65.5q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5q63 0 107.5 -44.5t44.5 -107.5t-44.5 -107.5t-107.5 -44.5zM640 768q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5q129 0 220.5 -91.5t91.5 -220.5
+t-91.5 -220.5t-220.5 -91.5q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5z" />
+    <glyph glyph-name="earth" unicode="&#xe6f1;" 
+d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM394 808q-46 -39 -80 -104q-31 16 -59 36h-2q65 47 141 68zM198 692q40 -31 87 -54q-35 -94 -41 -204h-169
+q17 150 123 258zM72 362h170q4 -126 43 -232q-46 -23 -87 -54q-56 56 -88.5 130t-37.5 156zM253 28h2q28 20 59 36q35 -65 80 -104q-76 21 -141 68zM481 -10q-59 19 -103 100q50 16 103 20v-120zM481 182q-67 -4 -132 -25q-32 92 -35 205h167v-180zM481 434h-165
+q6 97 33 177q64 -21 132 -25v-152v0zM481 658q-53 4 -103 20q44 82 103 100v-120zM949 434h-169q-6 110 -41 204q46 23 87 54q106 -108 123 -258zM771 740h-2q-28 -20 -59 -36q-35 65 -81 104q77 -21 142 -68zM553 774q53 -22 93 -96q-45 -15 -93 -19v115zM553 587
+q62 4 122 24q27 -80 33 -177h-155v153zM553 362h157q-3 -113 -35 -205q-59 19 -122 24v181zM553 -6v115q48 -4 93 -19q-40 -74 -93 -96zM630 -40q46 39 80 104q31 -16 59 -36h2q-65 -47 -141 -68zM826 76q-40 31 -87 54q39 106 43 232h169q-4 -82 -36.5 -156t-88.5 -130z
+" />
+    <glyph glyph-name="wifi" unicode="&#xe6d6;" 
+d="M964 576q-92 93 -212 140.5t-241 47.5t-240.5 -47.5t-212.5 -140.5q-10 -10 -10 -25t10.5 -25.5t25.5 -10.5t25 11q82 81 188 123.5t214 42.5t214 -42.5t188 -123.5q10 -11 25 -11t25.5 10.5t10.5 25.5t-10 25zM194 422q-10 -11 -10 -26t10.5 -25.5t25.5 -10.5t25 11
+q54 54 124.5 82t141.5 28t141.5 -28t124.5 -82q10 -11 25 -11t25.5 10.5t10.5 25.5t-10 26q-86 86 -201.5 116.5t-231 0t-201.5 -116.5zM693 258v0q-75 75 -181 75t-181 -75q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t26 11q54 54 130 54t130 -54v0l3 -3q10 -11 25 -11
+t25.5 11t10.5 25.5t-10 25.5q-3 2 -3 3zM512 54zM458 54q0 -22 16 -38t38 -16t38 16t16 38t-16 38t-38 16t-38 -16t-16 -38z" />
+    <glyph glyph-name="sync" unicode="&#xe6da;" 
+d="M989 384q-15 1 -26 -8.5t-12 -24.5q-7 -83 -42.5 -157.5t-96.5 -131.5t-138.5 -87.5t-161.5 -30.5q-133 0 -243 73q-97 64 -149 167h100q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-184q-15 0 -25.5 -10.5t-10.5 -25.5v-184q0 -15 10.5 -25.5t25.5 -10.5
+t25.5 10.5t10.5 25.5v86q59 -100 157 -165q128 -85 283 -85q98 0 188 35.5t161 101.5t112.5 153t48.5 183q2 15 -8 26.5t-25 12.5zM988 768q-15 0 -25.5 -10.5t-10.5 -25.5v-86q-59 100 -157 165q-128 85 -283 85q-98 0 -188 -35.5t-161 -101.5t-112.5 -153t-49.5 -183
+q-1 -15 9 -26.5t25 -12.5h2q14 0 24.5 9.5t11.5 23.5q6 83 42 157.5t97 131.5t138.5 87.5t161.5 30.5q133 0 243 -73q97 -64 149 -167h-100q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h184q15 0 25.5 10.5t10.5 25.5v184q0 15 -10.5 25.5t-25.5 10.5z" />
+    <glyph glyph-name="login" unicode="&#xe657;" 
+d="M443 274q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t26 11l136 135q10 11 10 26t-10 26l-136 135q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -26l74 -74h-481q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h481zM984 583q-39 92 -110 163t-163 110q-95 40 -199 40
+q-123 0 -231 -55q-105 -53 -177 -147q-9 -12 -7 -27t14 -24t27 -7t24 14q61 81 151 127q94 47 199 47q90 0 171 -35q79 -33 140 -94t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140t-140 -94q-81 -35 -171 -35q-105 0 -199 47q-90 46 -151 127q-9 12 -24 14t-27 -7
+t-14 -24t7 -27q72 -94 177 -147q108 -55 231 -55q104 0 199 40q92 39 163 110t110 163q40 95 40 199t-40 199z" />
+    <glyph glyph-name="logout" unicode="&#xe65a;" 
+d="M772 29q-116 -85 -260 -85q-90 0 -171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171q34 79 95 140t140 94q81 35 171 35q144 0 260 -85q12 -9 26.5 -6.5t23.5 14.5t7 26.5t-14 23.5q-135 99 -303 99q-104 0 -199 -40q-92 -39 -163 -110t-110 -163q-40 -95 -40 -199
+t40 -199q39 -92 110 -163t163 -110q95 -40 199 -40q168 0 303 99q12 9 14 23.5t-6.5 26.5t-23.5 14.5t-27 -6.5zM1014 410l-136 135q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -26l74 -74h-481q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h481l-74 -74
+q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t26 11l136 135q10 11 10 26t-10 26z" />
+    <glyph glyph-name="reload1" unicode="&#xe616;" 
+d="M954 392q-2 15 -14.5 23.5t-27 6t-23 -14.5t-6.5 -27q5 -28 5 -60q0 -76 -28.5 -144.5t-81.5 -121.5t-122 -81.5t-144 -28.5t-144 28.5t-122 81.5t-81.5 122t-28.5 144t28.5 144t81.5 122t122 81.5t144 28.5h13l-82 -82q-11 -11 -11 -25.5t10.5 -25.5t25.5 -11t26 11
+l135 136q11 10 11 25t-11 26l-135 135q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -25l66 -67q-89 -1 -171 -35q-81 -34 -143 -96t-96 -143q-35 -83 -35 -174t35 -174q34 -81 96 -143t143 -96q83 -35 174 -35t174 35q81 34 143 96t96 142q35 83 35 175q0 37 -6 72z" />
+    <glyph glyph-name="message1" unicode="&#xe6ab;" 
+d="M292 471q-23 0 -39 -16t-16 -39t16 -39t39 -16t39 16t16 39t-16 39t-39 16zM732 471q-23 0 -39 -16t-16 -39t16 -39t39 -16t39 16t16 39t-16 39t-39 16zM512 471q-23 0 -39 -16t-16 -39t16 -39t39 -16t39 16t16 39t-16 39t-39 16zM983 604q-39 86 -110 153
+q-71 66 -163 102q-94 37 -198 37t-198 -37q-92 -36 -163 -102q-71 -67 -110 -153q-41 -90 -41 -187q0 -88 33 -169.5t94 -147.5l23 -196q3 -19 20 -28q7 -4 16 -4t18 5l148 84q78 -24 160 -24q103 0 198 37q92 37 163 103t110 152q41 89 41 188q0 97 -41 187zM918 259
+q-33 -73 -94 -130q-61 -56 -140 -87q-82 -33 -172 -33q-79 0 -152 25q-16 5 -30 -3l-115 -65l-18 155q-1 12 -10 21q-56 56 -85.5 127t-29.5 148q0 82 34 157q33 73 94 130t140 88q82 32 172 32t172 -32q79 -32 140 -88.5t94 -129.5q34 -75 34 -157.5t-34 -157.5z" />
+    <glyph glyph-name="shake" unicode="&#xe94f;" 
+d="M760 896h-496q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h464q33 0 68.5 22t35.5 50v880q0 30 -21 51t-51 21zM542 -64h-60q-15 0 -24.5 9.5t-9.5 22.5t9.5 22.5t24.5 9.5h60q15 0 24.5 -9.5t9.5 -22.5t-9.5 -22.5t-24.5 -9.5zM760 65h-496v704h496v-704zM80 870
+l-44 -10q-19 -12 -29 -33t-6 -44l127 -832l-75 853q-3 39 27 66zM130 886q-20 -11 -31.5 -31t-10.5 -44l54 -839v856q0 39 32 63zM988 860l-44 10q30 -26 27 -66l-75 -853l127 832q4 23 -6 44t-29 33zM936 812q1 23 -10.5 43t-31.5 31l-44 6q32 -25 32 -64v-856z" />
+  </font>
+</defs></svg>

BIN
html/css/iconfont/iconfont.ttf


BIN
html/css/iconfont/iconfont.woff


+ 16 - 0
js/admin/achievement.js

@@ -0,0 +1,16 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import '../../css/base.less';
+
+import TopTab from '../component/manageCenter/topTab.jsx';
+import Footer from '../component/manageCenter/bottom.jsx';
+import Content from '../component/manageCenter/achievement/content.jsx';
+
+ReactDOM.render(
+    <div className="wrap clearfix">
+        <TopTab active={'achievement'}/>
+        <Content />
+        <Footer />
+    </div>,
+    document.getElementById('root')
+)

+ 16 - 0
js/admin/demand.js

@@ -0,0 +1,16 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import '../../css/base.less';
+
+import TopTab from '../component/manageCenter/topTab.jsx';
+import Footer from '../component/manageCenter/bottom.jsx';
+import Content from '../component/manageCenter/demand/content.jsx';
+
+ReactDOM.render(
+    <div className="wrap clearfix">
+        <TopTab active={'demand'}/>
+        <Content />
+        <Footer />
+    </div>,
+    document.getElementById('root')
+)

+ 788 - 0
js/component/DicIndustryList.js

@@ -0,0 +1,788 @@
+module.exports = {
+    IndustryObject: [{
+        value: 464,
+        label: "教育休闲",
+        children: [{
+            value: 542,
+            label: "其他教育休闲"
+        }, {
+            value: 541,
+            label: "休闲娱乐"
+        }, {
+            value: 540,
+            label: "玩具"
+        }, {
+            value: 539,
+            label: "体育"
+        }, {
+            value: 538,
+            label: "办公文教"
+        }, {
+            value: 258,
+            label: "乐器"
+        }, {
+            value: 127,
+            label: "工艺美术"
+        }]
+    }, {
+        value: 463,
+        label: "包装印刷",
+        children: [{
+            value: 560,
+            label: "包装"
+        }, {
+            value: 534,
+            label: "包装袋、箱"
+        }, {
+            value: 533,
+            label: "印刷"
+        }, {
+            value: 436,
+            label: "标签、标牌"
+        }, {
+            value: 435,
+            label: "器皿、容器"
+        }, {
+            value: 355,
+            label: "造纸"
+        }, {
+            value: 354,
+            label: "纸类包装"
+        }, {
+            value: 353,
+            label: "纸浆"
+        }, {
+            value: 181,
+            label: "包装材料"
+        }, {
+            value: 180,
+            label: "其他包装印刷"
+        }, {
+            value: 179,
+            label: "记录媒介复制"
+        }, {
+            value: 176,
+            label: "装订"
+        }]
+    }, {
+        value: 462,
+        label: "电气自动化",
+        children: [{
+            value: 555,
+            label: "电气电工"
+        }, {
+            value: 550,
+            label: "电池充电器"
+        }, {
+            value: 549,
+            label: "其他电气自动化"
+        }, {
+            value: 373,
+            label: "人工智能"
+        }, {
+            value: 372,
+            label: "自动化元件"
+        }, {
+            value: 371,
+            label: "自动化应用"
+        }, {
+            value: 370,
+            label: "控制系统"
+        }, {
+            value: 241,
+            label: "电力绝缘"
+        }, {
+            value: 238,
+            label: "电力"
+        }, {
+            value: 237,
+            label: "电线、电缆"
+        }, {
+            value: 236,
+            label: "发电机"
+        }, {
+            value: 235,
+            label: "电动机"
+        }, {
+            value: 234,
+            label: "变压器、稳压器"
+        }, {
+            value: 233,
+            label: "开关、插座、插头"
+        }]
+    }, {
+        value: 461,
+        label: "采矿冶金",
+        children: [{
+            value: 572,
+            label: "金属合金冶炼铸造"
+        }, {
+            value: 571,
+            label: "非金属开采冶炼"
+        }, {
+            value: 570,
+            label: "黑色金属开采冶炼"
+        }, {
+            value: 569,
+            label: "有色金属开采冶炼"
+        }, {
+            value: 552,
+            label: "其他采矿冶金"
+        }, {
+            value: 512,
+            label: "石油天然气开采提炼"
+        }, {
+            value: 511,
+            label: "煤炭开采冶炼"
+        }, {
+            value: 192,
+            label: "矿业设备"
+        }]
+    }, {
+        value: 460,
+        label: "航空航天",
+        children: [{
+            value: 567,
+            label: "飞行器"
+        }, {
+            value: 545,
+            label: "其他航空航天"
+        }, {
+            value: 510,
+            label: "卫星导航"
+        }, {
+            value: 509,
+            label: "卫星通信"
+        }, {
+            value: 508,
+            label: "航空运行保障系统"
+        }, {
+            value: 507,
+            label: "空中管理系统"
+        }, {
+            value: 506,
+            label: "民用飞机"
+        }]
+    }, {
+        value: 459,
+        label: "海洋开发",
+        children: [{
+            value: 561,
+            label: "海底勘探"
+        }, {
+            value: 546,
+            label: "其他海洋开发"
+        }, {
+            value: 505,
+            label: "海洋船舶"
+        }, {
+            value: 504,
+            label: "渔业捕捞"
+        }, {
+            value: 503,
+            label: "海洋渔业资源保护与监测"
+        }, {
+            value: 502,
+            label: "海洋能源利用"
+        }, {
+            value: 501,
+            label: "海底矿产利用"
+        }, {
+            value: 500,
+            label: "海水养殖"
+        }, {
+            value: 497,
+            label: "海水淡化"
+        }]
+    }, {
+        value: 458,
+        label: "农林牧业",
+        children: [{
+            value: 579,
+            label: "农副产品深加工"
+        }, {
+            value: 554,
+            label: "养殖"
+        }, {
+            value: 553,
+            label: "种植"
+        }, {
+            value: 496,
+            label: "其他农业牧业"
+        }, {
+            value: 495,
+            label: "农副产品贮藏与保鲜"
+        }, {
+            value: 494,
+            label: "农机用具"
+        }, {
+            value: 493,
+            label: "饲料、肥料及添加剂"
+        }, {
+            value: 492,
+            label: "病虫害防治"
+        }, {
+            value: 491,
+            label: "家畜良种胚胎育种"
+        }, {
+            value: 489,
+            label: "动植物新品培育"
+        }]
+    }, {
+        value: 457,
+        label: "医药与医疗",
+        children: [{
+            value: 547,
+            label: "其他医药与医疗"
+        }, {
+            value: 488,
+            label: "生物化工"
+        }, {
+            value: 487,
+            label: "医疗器械"
+        }, {
+            value: 486,
+            label: "新剂型及制剂"
+        }, {
+            value: 485,
+            label: "化学药物"
+        }, {
+            value: 484,
+            label: "中药、天然药物"
+        }, {
+            value: 483,
+            label: "生物医药"
+        }]
+    }, {
+        value: 456,
+        label: "电子信息",
+        children: [{
+            value: 472,
+            label: "其他电子信息"
+        }, {
+            value: 471,
+            label: "智能交通"
+        }, {
+            value: 470,
+            label: "信息安全"
+        }, {
+            value: 469,
+            label: "广播电视"
+        }, {
+            value: 468,
+            label: "通信"
+        }, {
+            value: 467,
+            label: "硬件/数码"
+        }, {
+            value: 466,
+            label: "微电子"
+        }, {
+            value: 465,
+            label: "软件"
+        }, {
+            value: 291,
+            label: "网络"
+        }, {
+            value: 286,
+            label: "电子元器件"
+        }]
+    }, {
+        value: 375,
+        label: "新型材料",
+        children: [{
+            value: 473,
+            label: "金属材料"
+        }, {
+            value: 382,
+            label: "其他新材料技术"
+        }, {
+            value: 381,
+            label: "纳米及超细材料"
+        }, {
+            value: 378,
+            label: "无机非金属材料"
+        }, {
+            value: 377,
+            label: "高分子材料"
+        }, {
+            value: 376,
+            label: "生物医用材料"
+        }]
+    }, {
+        value: 31,
+        label: "仪器仪表",
+        children: [{
+            value: 566,
+            label: "实验仪器"
+        }, {
+            value: 565,
+            label: "分析仪器"
+        }, {
+            value: 564,
+            label: "检测仪器"
+        }, {
+            value: 563,
+            label: "压力仪表"
+        }, {
+            value: 562,
+            label: "温度仪表"
+        }, {
+            value: 527,
+            label: "其他仪器仪表"
+        }, {
+            value: 526,
+            label: "光学仪器"
+        }, {
+            value: 525,
+            label: "计时仪器"
+        }]
+    }, {
+        value: 26,
+        label: "橡胶塑料",
+        children: [{
+            value: 578,
+            label: "塑料原料与制品"
+        }, {
+            value: 577,
+            label: "橡胶原料与制品"
+        }, {
+            value: 207,
+            label: "其他橡胶塑料"
+        }, {
+            value: 206,
+            label: "橡塑加工与制造"
+        }, {
+            value: 205,
+            label: "合成材料及其助剂"
+        }]
+    }, {
+        value: 25,
+        label: "交通运输",
+        children: [{
+            value: 576,
+            label: "物流仓储"
+        }, {
+            value: 575,
+            label: "公路运输"
+        }, {
+            value: 442,
+            label: "电梯、缆车"
+        }, {
+            value: 441,
+            label: "摩托车"
+        }, {
+            value: 440,
+            label: "自行车"
+        }, {
+            value: 363,
+            label: "装卸搬运"
+        }, {
+            value: 362,
+            label: "管道运输"
+        }, {
+            value: 361,
+            label: "水路运输"
+        }, {
+            value: 360,
+            label: "铁路运输"
+        }, {
+            value: 200,
+            label: "其他交通运输"
+        }, {
+            value: 198,
+            label: "公路管理与养护"
+        }, {
+            value: 197,
+            label: "城市公共交通系统"
+        }, {
+            value: 195,
+            label: "航空运输"
+        }, {
+            value: 194,
+            label: "汽车"
+        }]
+    }, {
+        value: 20,
+        label: "安全防护",
+        children: [{
+            value: 556,
+            label: "防盗预警"
+        }, {
+            value: 432,
+            label: "交通安全"
+        }, {
+            value: 430,
+            label: "防身"
+        }, {
+            value: 174,
+            label: "其他安全防护"
+        }, {
+            value: 173,
+            label: "作业安防"
+        }, {
+            value: 172,
+            label: "救生"
+        }, {
+            value: 171,
+            label: "运动防护"
+        }, {
+            value: 170,
+            label: "军用安防"
+        }, {
+            value: 169,
+            label: "消防"
+        }, {
+            value: 168,
+            label: "监控"
+        }]
+    }, {
+        value: 19,
+        label: "环保和资源",
+        children: [{
+            value: 557,
+            label: "噪声污染治理"
+        }, {
+            value: 548,
+            label: "其他环保和资源"
+        }, {
+            value: 544,
+            label: "节能环保"
+        }, {
+            value: 482,
+            label: "生态保护"
+        }, {
+            value: 481,
+            label: "环境监测"
+        }, {
+            value: 480,
+            label: "固体废弃物污染处理"
+        }, {
+            value: 348,
+            label: "清洁生产与循环经济"
+        }, {
+            value: 167,
+            label: "资源利用与开发"
+        }, {
+            value: 163,
+            label: "大气污染防治"
+        }, {
+            value: 161,
+            label: "水污染治理"
+        }]
+    }, {
+        value: 18,
+        label: "机械",
+        children: [{
+            value: 523,
+            label: "光机电一体化"
+        }, {
+            value: 428,
+            label: "模具"
+        }, {
+            value: 427,
+            label: "机械检测"
+        }, {
+            value: 426,
+            label: "机械清洗清理"
+        }, {
+            value: 425,
+            label: "机械制冷"
+        }, {
+            value: 424,
+            label: "铸造/热处理"
+        }, {
+            value: 423,
+            label: "雕刻切割"
+        }, {
+            value: 422,
+            label: "机械干燥"
+        }, {
+            value: 421,
+            label: "机械分离"
+        }, {
+            value: 420,
+            label: "机械过滤"
+        }, {
+            value: 419,
+            label: "减速机/变速机"
+        }, {
+            value: 418,
+            label: "泵"
+        }, {
+            value: 417,
+            label: "阀门"
+        }, {
+            value: 346,
+            label: "机械输送"
+        }, {
+            value: 345,
+            label: "电焊"
+        }, {
+            value: 344,
+            label: "机械粉碎"
+        }, {
+            value: 341,
+            label: "发动机"
+        }, {
+            value: 340,
+            label: "机床"
+        }, {
+            value: 339,
+            label: "内燃机"
+        }, {
+            value: 300,
+            label: "液压机"
+        }, {
+            value: 160,
+            label: "其他机械"
+        }, {
+            value: 159,
+            label: "通用零部件"
+        }]
+    }, {
+        value: 17,
+        label: "新能源",
+        children: [{
+            value: 543,
+            label: "风能"
+        }, {
+            value: 479,
+            label: "其他新能源"
+        }, {
+            value: 478,
+            label: "能量转换与储存"
+        }, {
+            value: 477,
+            label: "核能及氢能"
+        }, {
+            value: 476,
+            label: "潮汐能"
+        }, {
+            value: 475,
+            label: "生物质能"
+        }, {
+            value: 474,
+            label: "地热能"
+        }, {
+            value: 416,
+            label: "太阳能 "
+        }]
+    }, {
+        value: 15,
+        label: "化学化工",
+        children: [{
+            value: 522,
+            label: "化工生产"
+        }, {
+            value: 521,
+            label: "日用化学"
+        }, {
+            value: 520,
+            label: "合成化学"
+        }, {
+            value: 519,
+            label: "涂料、颜料、油墨"
+        }, {
+            value: 518,
+            label: "农药"
+        }, {
+            value: 517,
+            label: "肥料"
+        }, {
+            value: 516,
+            label: "基础化学"
+        }, {
+            value: 515,
+            label: "精炼石油"
+        }, {
+            value: 413,
+            label: "专用化学"
+        }, {
+            value: 140,
+            label: "其他化学化工"
+        }, {
+            value: 580,
+            label: "盐湖化工"
+        }]
+    }, {
+        value: 7,
+        label: "轻工纺织",
+        children: [{
+            value: 559,
+            label: "皮革"
+        }, {
+            value: 558,
+            label: "纺织"
+        }, {
+            value: 551,
+            label: "其他轻工纺织"
+        }, {
+            value: 532,
+            label: "毛皮"
+        }, {
+            value: 529,
+            label: "编织物"
+        }, {
+            value: 528,
+            label: "棉及化纤印染精加工"
+        }, {
+            value: 86,
+            label: "服装服饰"
+        }, {
+            value: 85,
+            label: "制鞋"
+        }]
+    }, {
+        value: 5,
+        label: "家居用品",
+        children: [{
+            value: 574,
+            label: "护理用品"
+        }, {
+            value: 573,
+            label: "卫浴"
+        }, {
+            value: 402,
+            label: "餐具"
+        }, {
+            value: 401,
+            label: "厨具"
+        }, {
+            value: 308,
+            label: "日常用品"
+        }, {
+            value: 307,
+            label: "家用电器"
+        }, {
+            value: 73,
+            label: "其他家居用品"
+        }, {
+            value: 72,
+            label: "家居照明"
+        }, {
+            value: 68,
+            label: "家具"
+        }, {
+            value: 67,
+            label: "家居清洁"
+        }, {
+            value: 63,
+            label: "家居饰品"
+        }]
+    }, {
+        value: 4,
+        label: "建筑建材",
+        children: [{
+            value: 400,
+            label: "建筑电气"
+        }, {
+            value: 399,
+            label: "采暖空调"
+        }, {
+            value: 398,
+            label: "建筑照明"
+        }, {
+            value: 397,
+            label: "建筑通风"
+        }, {
+            value: 396,
+            label: "建筑给排水"
+        }, {
+            value: 305,
+            label: "建筑装潢"
+        }, {
+            value: 304,
+            label: "建筑材料"
+        }, {
+            value: 65,
+            label: "其他建筑建材"
+        }, {
+            value: 62,
+            label: "建筑施工"
+        }, {
+            value: 61,
+            label: "管件、管材"
+        }, {
+            value: 58,
+            label: "建筑装饰"
+        }, {
+            value: 57,
+            label: "建筑结构"
+        }]
+    }, {
+        value: 2,
+        label: "食品饮料",
+        children: [{
+            value: 568,
+            label: "方便食品"
+        }, {
+            value: 537,
+            label: "茶类"
+        }, {
+            value: 535,
+            label: "焙烤类"
+        }, {
+            value: 393,
+            label: "果蔬类"
+        }, {
+            value: 392,
+            label: "水产类"
+        }, {
+            value: 391,
+            label: "肉类"
+        }, {
+            value: 390,
+            label: "粗粮"
+        }, {
+            value: 389,
+            label: "调味及发酵"
+        }, {
+            value: 388,
+            label: "食用油"
+        }, {
+            value: 387,
+            label: "酒类酿造"
+        }, {
+            value: 302,
+            label: "甜品类"
+        }, {
+            value: 99,
+            label: "乳品"
+        }, {
+            value: 50,
+            label: "其他食品饮料"
+        }, {
+            value: 49,
+            label: "食品添加剂"
+        }, {
+            value: 48,
+            label: "食品加工"
+        }, {
+            value: 46,
+            label: "饮料类"
+        }]
+    }, {
+        value: 589,
+        label: "钒钛产业",
+        children: [{
+            value: "590",
+            label: "钒钛资源"
+        }, {
+            value: "591",
+            label: "钒钛冶金"
+        }, {
+            value: "592",
+            label: "钒钛化工"
+        }, {
+            value: "593",
+            label: "钒钛钢"
+        }, {
+            value: "594",
+            label: "钒钛新材料"
+        }, {
+            value: "595",
+            label: "其他"
+        }]
+    }]
+}

+ 47 - 0
js/component/account/achievement/content.jsx

@@ -0,0 +1,47 @@
+import React, { Component } from 'react';
+import '../content.less';
+import LeftTab from './leftTab';
+import TechAchievement from './techAchievement';
+
+
+class Content extends Component {
+    constructor() {
+        super();
+        this.state = {
+            loading: false,
+            component: 'div'
+        };
+    }
+    componentWillMount() {
+        if (window.location.hash) {
+            this.getKey(window.location.hash.substr(1));
+        } else {
+            this.getKey("techAchievement");
+        };
+    }
+    getKey(key) {
+        switch (key) {
+            case 'techAchievement':
+                require.ensure([], () => {
+                    const TechDemand = require('./techAchievement').default;
+                    this.setState({
+                        component: TechAchievement
+                    });
+                });
+                break;
+        };
+        window.location.hash = key;
+    }
+    render() {
+        return (
+            <div className="acc-content">
+                <LeftTab handlekey={this.getKey.bind(this)} />
+                <div className="content-right">
+                    <this.state.component />
+                </div>
+            </div>
+        )
+    }
+}
+
+export default Content;

+ 40 - 0
js/component/account/achievement/leftTab.jsx

@@ -0,0 +1,40 @@
+import React from 'react';
+import { Menu, Icon } from 'antd';
+import '../leftTab.less';
+const SubMenu = Menu.SubMenu;
+const MenuItemGroup = Menu.ItemGroup;
+
+
+const LeftTab = React.createClass({
+    getInitialState() {
+        return {
+            current: 'techAchievement'
+        };
+    },
+    handleClick(e) {
+        this.props.handlekey(e.key);
+        this.setState({
+            current: e.key,
+        });
+    },
+    componentWillMount() {
+        if (window.location.hash) {
+            this.state.current = window.location.hash.substr(1);
+        };
+    },
+    render() {
+        return (
+            <Menu onClick={this.handleClick}
+                selectedKeys={[this.state.current]}
+                mode="vertical"
+                className="account-left"
+            >
+                <Menu.Item key="techAchievement">
+                    科技成果列表
+                </Menu.Item>
+            </Menu>
+        );
+    },
+});
+
+export default LeftTab;

+ 325 - 0
js/component/account/achievement/techAchievement.jsx

@@ -0,0 +1,325 @@
+import React from 'react';
+import { Icon, Button, Input, Select, Spin, Table, Switch, message, DatePicker, Modal } from 'antd';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import moment from 'moment';
+import './techAchievement.less';
+import TechAchievementDesc from './techAchievementDesc.jsx';
+import { provinceArr, achievementCategoryList } from '../../dataDic.js';
+import { companySearch, getAchievementCategory } from '../../tools.js';
+
+const AchievementList = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + '/api/user/achievement/list',
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                serialNumber: this.state.serialNumber, //编号
+                name: this.state.name, //名称
+                keyword: this.state.keyword, // 关键词
+                category: this.state.category, //类型(0--专利, 2--软著, 3--项目, 4--版权, 5--工业设计, 6--配方, 7--非标)
+                ownerType: this.state.ownerType, //所有人类型(0-个人,1-组织)
+                status: this.state.status ? Number(this.state.status) : undefined, //状态
+                releaseDateStartDate: this.state.releaseDate[0],
+                releaseDateEndDate: this.state.releaseDate[1],
+                releaseStatus: this.state.releaseStatus ? Number(this.state.releaseStatus) : undefined, //是否发布(0--未发布,1--已发布)
+            },
+            success: function (data) {
+                let theArr = [];
+                if (!data.data && !data.data.list) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                } else {
+                    for (let i = 0; i < data.data.list.length; i++) {
+                        let thisdata = data.data.list[i];
+                        theArr.push({
+                            key: i,
+                            id: thisdata.id,
+                            serialNumber: thisdata.serialNumber,
+                            dataCategory: thisdata.dataCategory,
+                            name: thisdata.name,
+                            keyword: thisdata.keyword,
+                            category: thisdata.category,
+                            ownerName: thisdata.ownerName,
+                            ownerType: thisdata.ownerType,
+                            ownerMobile: thisdata.ownerMobile,
+                            status: thisdata.status,
+                            releaseDate: thisdata.releaseDate,
+                            releaseDateFormattedDate: thisdata.releaseDateFormattedDate
+                        });
+                    };
+                }
+                this.state.pagination.current = data.data.pageNo;
+                this.state.pagination.total = data.data.totalCount;
+                this.setState({
+                    dataSource: theArr,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            searchMore: true,
+            validityPeriodDate: [],
+            releaseDate: [],
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: false,
+            pagination: {
+                defaultCurrent: 1,
+                defaultPageSize: 10,
+                showQuickJumper: true,
+                pageSize: 10,
+                onChange: function (page) {
+                    this.loadData(page);
+                }.bind(this),
+                showTotal: function (total) {
+                    return '共' + total + '条数据';
+                }
+            },
+            columns: [
+                {
+                    title: '编号',
+                    dataIndex: 'serialNumber',
+                    key: 'serialNumber',
+                }, {
+                    title: '名称',
+                    dataIndex: 'name',
+                    key: 'name',
+                }, {
+                    title: '关键字',
+                    dataIndex: 'keyword',
+                    key: 'keyword',
+                }, {
+                    title: '类型',
+                    dataIndex: 'category',
+                    key: 'category',
+                    render: text => { return getAchievementCategory(text); }
+                }, {
+                    title: '所有人名称',
+                    dataIndex: 'ownerName',
+                    key: 'ownerName',
+                }, {
+                    title: '所有人类型',
+                    dataIndex: 'ownerType',
+                    key: 'ownerType',
+                    render: text => {
+                        switch (text) {
+                            case "0":
+                                return <span>个人</span>;
+                            case "1":
+                                return <span>组织</span>
+                        }
+                    }
+                }, {
+                    title: '所有人联系方式',
+                    dataIndex: 'ownerMobile',
+                    key: 'ownerMobile',
+                }, {
+                    title: '状态',
+                    dataIndex: 'status',
+                    key: 'status',
+                    render: text => {
+                        switch (text) {
+                            case "0":
+                                return <span>进行中</span>;
+                            case "1":
+                                return <span>未解决</span>;
+                            case "2":
+                                return <span>已解决</span>;
+                        }
+                    }
+                }, {
+                    title: '发布时间',
+                    dataIndex: 'releaseDateFormattedDate',
+                    key: 'releaseDateFormattedDate',
+                }
+            ],
+            dataSource: [],
+            searchTime: [,]
+        };
+    },
+    componentWillMount() {
+        let theArr = [];
+        achievementCategoryList.map(function (item) {
+            theArr.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        this.state.achievementCategoryOption = theArr;
+        this.loadData();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true
+        });
+    },
+    delectRow() {
+        let deletedIds = [];
+        for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
+            let rowItem = this.state.selectedRows[idx];
+            if (rowItem.id) {
+                deletedIds.push(rowItem.id)
+            };
+        };
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/achievement/delete",
+            data: {
+                ids: deletedIds
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('删除成功!');
+                this.setState({
+                    loading: false,
+                });
+            } else {
+                message.warning(data.error[0].message);
+            };
+            this.loadData();
+        }.bind(this));
+    },
+    addClick() {
+        this.state.RowData = {};
+        this.setState({
+            showDesc: true
+        });
+    },
+    closeDesc(e, s) {
+        this.state.showDesc = e;
+        if (s) {
+            this.loadData();
+        };
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.serialNumber = undefined;
+        this.state.name = undefined;
+        this.state.keyword = undefined;
+        this.state.category = undefined;
+        this.state.ownerType = undefined;
+        this.state.status = undefined;
+        this.state.releaseStatus = undefined;
+        this.state.releaseDate = [];
+        this.loadData();
+    },
+    searchSwitch() {
+        this.setState({
+            searchMore: !this.state.searchMore
+        });
+    },
+    render() {
+        const rowSelection = {
+            selectedRowKeys: this.state.selectedRowKeys,
+            onChange: (selectedRowKeys, selectedRows) => {
+                this.setState({
+                    selectedRows: selectedRows,
+                    selectedRowKeys: selectedRowKeys
+                });
+            }
+        };
+        const hasSelected = this.state.selectedRowKeys.length > 0;
+        const { RangePicker } = DatePicker;
+        return (
+            <div className="user-content" >
+                <div className="content-title">
+                    <span>科技成果管理</span>
+                    <div className="patent-addNew">
+                        <Button type="primary" onClick={this.addClick}>发布成果<Icon type="plus" /></Button>
+                    </div>
+                </div>
+                <div className="user-search">
+                    <Input placeholder="编号"
+                        value={this.state.serialNumber}
+                        onChange={(e) => { this.setState({ serialNumber: e.target.value }); }} />
+                    <Input placeholder="名称"
+                        value={this.state.name}
+                        onChange={(e) => { this.setState({ name: e.target.value }); }} />
+                    <Input placeholder="关键字"
+                        value={this.state.keyword}
+                        onChange={(e) => { this.setState({ keyword: e.target.value }); }} />
+                    <Select placeholder="选择类型" style={{ width: 160 }}
+                        value={this.state.category}
+                        onChange={(e) => { this.setState({ category: e }) }}>
+                        {this.state.achievementCategoryOption}
+                    </Select>
+                    <Select placeholder="选择所有人类型"
+                        style={{ width: 120 }}
+                        value={this.state.ownerType}
+                        onChange={(e) => { this.setState({ ownerType: e }) }}>
+                        <Select.Option value="0" >个人</Select.Option>
+                        <Select.Option value="1" >组织</Select.Option>
+                    </Select>
+                    <Select placeholder="选择成果状态" style={{ width: 120 }}
+                        value={this.state.status}
+                        onChange={(e) => { this.setState({ status: e }) }}>
+                        <Select.Option value="0" >进行中</Select.Option>
+                        <Select.Option value="1" >未解决</Select.Option>
+                        <Select.Option value="2" >已解决</Select.Option>
+                    </Select>
+                    <Select placeholder="选择是否发布" style={{ width: 120 }}
+                        value={this.state.releaseStatus}
+                        onChange={(e) => { this.setState({ releaseStatus: e }) }}>
+                        <Select.Option value="0" >未发布</Select.Option>
+                        <Select.Option value="1" >已发布</Select.Option>
+                    </Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                    <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                        disabled={!hasSelected}
+                        onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    <span>更多搜索<Switch defaultChecked={false} onChange={this.searchSwitch} /></span>
+                    <div className="search-more" style={this.state.searchMore ? { display: 'none' } : {}}>
+                        <p>
+                            <span>发布时间 :</span>
+                            <RangePicker
+                                value={[this.state.releaseDate[0] ? moment(this.state.releaseDate[0]) : null,
+                                this.state.releaseDate[1] ? moment(this.state.releaseDate[1]) : null]}
+                                onChange={(data, dataString) => { this.setState({ releaseDate: dataString }); }} />
+                        </p>
+                    </div>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            rowSelection={rowSelection}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <TechAchievementDesc
+                    data={this.state.RowData}
+                    achievementCategoryOption={this.state.achievementCategoryOption}
+                    showDesc={this.state.showDesc}
+                    closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default AchievementList;

+ 72 - 0
js/component/account/achievement/techAchievement.less

@@ -0,0 +1,72 @@
+.user-content {
+    background: #fff;
+    padding: 20px;
+    .content-title {
+        color: #333;
+        font-size: 16px;
+    }
+    .user-search {
+        margin-bottom: 10px;
+        >input {
+            width: 140px;
+        }
+        >input,
+        >button,
+        .ant-select {
+            margin-right: 10px;
+            margin-top: 10px;
+        }
+        .ant-switch {
+            margin-left: 10px;
+        }
+        .search-more {
+            margin: 10px 0;
+            >p {
+                span {
+                    margin-right: 10px
+                }
+            }
+        }
+    }
+}
+
+.patent-addNew {
+    float: right;
+    margin-left: 20px;
+    button {
+        background: #ea0862;
+        color: #fff;
+        border: none;
+        border-radius: 4px;
+        padding: 6px 10px;
+        margin-left: 20px;
+    }
+    button:hover {
+        background: #ea0862;
+    }
+}
+
+#demand-form {
+    .half-item {
+        float: left;
+        width: 50%;
+        margin-bottom: 10px;
+    }
+    .item-title {
+        line-height: 30px;
+        font-size: 14px;
+        color: #666;
+    }
+    .form-title {
+        font-size: 16px;
+        color: #333;
+    }
+    .keyWord-tips {
+        >button {
+            vertical-align: middle;
+        }
+    }
+    .set-submit {
+        margin-right: 20px;
+    }
+}

+ 870 - 0
js/component/account/achievement/techAchievementDesc.jsx

@@ -0,0 +1,870 @@
+import React from 'react';
+import { Icon, Tooltip, Modal, message, Spin, Upload, Input, InputNumber, Select, DatePicker, Button, Radio, Form, Cascader, Tag } from 'antd';
+import moment from 'moment';
+import './techAchievement.less';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import { IndustryObject } from '../../DicIndustryList.js';
+import { beforeUploadFile, splitUrl, companySearch } from '../../tools.js';
+
+const KeyWordTagGroup = React.createClass({
+    getInitialState() {
+        return {
+            tags: [],
+            inputVisible: false,
+            inputValue: ''
+        };
+    },
+    handleClose(removedTag) {
+        const tags = this.state.tags.filter(tag => tag !== removedTag);
+        this.props.tagsArr(tags);
+        this.setState({ tags });
+    },
+    showInput() {
+        this.setState({ inputVisible: true }, () => this.input.focus());
+    },
+    handleInputChange(e) {
+        this.setState({ inputValue: e.target.value });
+    },
+    handleInputConfirm() {
+        const state = this.state;
+        const inputValue = state.inputValue;
+        let tags = state.tags;
+        if (inputValue && tags.indexOf(inputValue) === -1) {
+            tags = [...tags, inputValue];
+        }
+        this.props.tagsArr(tags);
+        this.setState({
+            tags,
+            inputVisible: false,
+            inputValue: '',
+        });
+    },
+    componentWillMount() {
+        this.state.tags = this.props.keyWordArr;
+    },
+    componentWillReceiveProps(nextProps) {
+        if (this.props.keyWordArr != nextProps.keyWordArr) {
+            this.state.tags = nextProps.keyWordArr;
+        };
+    },
+    render() {
+        const { tags, inputVisible, inputValue } = this.state;
+        return (
+            <div className="keyWord-tips">
+                {tags.map((tag, index) => {
+                    const isLongTag = tag.length > 10;
+                    const tagElem = (
+                        <Tag key={tag} closable={index !== -1} afterClose={() => this.handleClose(tag)}>
+                            {isLongTag ? `${tag.slice(0, 10)}...` : tag}
+                        </Tag>
+                    );
+                    return isLongTag ? <Tooltip title={tag}>{tagElem}</Tooltip> : tagElem;
+                })}
+                {inputVisible && (
+                    <Input
+                        ref={input => this.input = input}
+                        type="text"
+                        style={{ width: 78 }}
+                        value={inputValue}
+                        onChange={this.handleInputChange}
+                        onBlur={this.handleInputConfirm}
+                        onPressEnter={this.handleInputConfirm}
+                    />
+                )}
+                {!inputVisible && <Button className="addtips" type="dashed" disabled={tags.length > 9 ? true : false} onClick={this.showInput}>+ 新关键词</Button>}
+            </div>
+        );
+    }
+});
+
+const PicturesWall = React.createClass({
+    getInitialState() {
+        return {
+            previewVisible: false,
+            previewImage: '',
+            fileList: [],
+        }
+    },
+    handleCancel() {
+        this.setState({ previewVisible: false })
+    },
+    handlePreview(file) {
+        this.setState({
+            previewImage: file.url || file.thumbUrl,
+            previewVisible: true,
+        });
+    },
+    handleChange(info) {
+        let fileList = info.fileList;
+        this.setState({ fileList });
+        this.props.fileList(fileList);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.fileList = nextProps.pictureUrl;
+    },
+    render() {
+        const { previewVisible, previewImage, fileList } = this.state;
+        const uploadButton = (
+            <div>
+                <Icon type="plus" />
+                <div className="ant-upload-text">点击上传</div>
+            </div>
+        );
+        return (
+            <div className="clearfix">
+                <Upload
+                    action={globalConfig.context + "/api/user/achievement/uploadPicture"}
+                    data={{ 'sign': this.props.pictureSign }}
+                    listType="picture-card"
+                    fileList={fileList}
+                    onPreview={this.handlePreview}
+                    onChange={this.handleChange} >
+                    {fileList.length >= 5 ? null : uploadButton}
+                </Upload>
+                <Modal maskClosable={false} visible={previewVisible} footer={null} onCancel={this.handleCancel}>
+                    <img alt="example" style={{ width: '100%' }} src={previewImage} />
+                </Modal>
+            </div>
+        );
+    }
+});
+
+const AchievementDetailForm = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            textFileList: [],
+            techPlanFileList: [],
+            businessPlanFileList: [],
+            maturityPictureUrl: [],
+            technicalPictureUrl: [],
+            tags: []
+        };
+    },
+    loadData(id) {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/achievement/detail",
+            data: {
+                id: id
+            },
+            success: function (data) {
+                let thisData = data.data;
+                if (!thisData) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                    thisData = {};
+                };
+                let d = new Date()
+                if (thisData && thisData.dateOfBirthMonth && thisData.dateOfBirthYear) {
+                    d.setMonth(thisData.dateOfBirthMonth - 1);
+                    d.setYear(parseInt(thisData.dateOfBirthYear));
+                };
+                this.setState({
+                    data: thisData,
+                    orgDisplay: thisData.ownerType,
+                    tags: thisData.keyword ? thisData.keyword.split(",") : [],
+                    technicalPictureUrl: thisData.technicalPictureUrl ? splitUrl(thisData.technicalPictureUrl, ',', globalConfig.avatarHost + '/upload') : [],
+                    maturityPictureUrl: thisData.maturityPictureUrl ? splitUrl(thisData.maturityPictureUrl, ',', globalConfig.avatarHost + '/upload') : []
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getTagsArr(e) {
+        this.setState({ tags: e });
+    },
+    getMaturityPictureUrl(e) {
+        this.setState({ maturityPictureUrl: e });
+    },
+    getTechnicalPictureUrl(e) {
+        this.setState({ technicalPictureUrl: e });
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            //keyword长度判断
+            if (this.state.tags.length < 3) {
+                message.warning('关键词数量不能小于3个!');
+                return;
+            };
+            //url转化
+            let theTechnicalPictureUrl = [];
+            if (this.state.technicalPictureUrl.length) {
+                let picArr = [];
+                this.state.technicalPictureUrl.map(function (item) {
+                    picArr.push(item.response.data);
+                });
+                theTechnicalPictureUrl = picArr.join(",");
+            };
+            let theMaturityPictureUrl = [];
+            if (this.state.maturityPictureUrl.length) {
+                let picArr = [];
+                this.state.maturityPictureUrl.map(function (item) {
+                    picArr.push(item.response.data);
+                });
+                theMaturityPictureUrl = picArr.join(",");
+            };
+            if (!err) {
+                this.setState({
+                    loading: true
+                });
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: this.props.data.id ? globalConfig.context + '/api/user/achievement/update' : globalConfig.context + '/api/user/achievement/apply',
+                    data: {
+                        id: this.props.data.id,
+                        dataCategory: values.dataCategory,
+                        serialNumber: this.props.data.serialNumber,
+                        name: values.name,
+                        keyword: this.state.tags ? this.state.tags.join(",") : [],
+                        category: values.category,
+                        summary: values.summary,
+                        introduction: values.introduction,
+                        technicalPictureUrl: theTechnicalPictureUrl,
+                        fieldA: values.field ? values.field[0] : undefined,
+                        fieldB: values.field ? values.field[1] : undefined,
+                        maturity: values.maturity,
+                        maturityPictureUrl: theMaturityPictureUrl,
+                        maturityTextFileUrl: this.state.maturityTextFileUrl,
+                        maturityVideoUrl: values.maturityVideoUrl,
+                        innovation: values.innovation,
+                        ownerName: values.ownerName,
+                        ownerType: values.ownerType,
+                        ownerIdNumber: values.ownerIdNumber,
+                        ownerMobile: values.ownerMobile,
+                        ownerEmail: values.ownerEmail,
+                        ownerPostalAddress: values.ownerPostalAddress,
+                        cooperationMode: values.cooperationMode,
+                        transferMode: values.transferMode,
+                        bargainingMode: values.bargainingMode,
+                        transferPrice: values.transferPrice,
+                        technicalScene: values.technicalScene,
+                        breakthrough: values.breakthrough,
+                        patentCase: values.patentCase,
+                        awards: values.awards,
+                        teamDes: values.teamDes,
+                        parameter: values.parameter,
+                        orgId: values.orgId,
+                        orgName: values.orgName,
+                        orgAddress: values.orgAddress,
+                        orgEmail: values.orgEmail,
+                        orgContacts: values.orgContacts,
+                        orgContactsMobile: values.orgContactsMobile,
+                        releaseStatus: values.releaseStatus,
+                        techPlanUrl: this.state.techPlanUrl,
+                        businessPlanUrl: this.state.businessPlanUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.setState({
+                            visible: false
+                        });
+                        this.props.handleOk();
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this));
+            }
+        });
+    },
+    componentWillMount() {
+        if (this.props.data.id) {
+            this.loadData(this.props.data.id);
+        } else {
+            this.state.data = {};
+        };
+    },
+    componentWillReceiveProps(nextProps) {
+        if (!this.props.visible && nextProps.visible) {
+            this.state.textFileList = [];
+            this.state.techPlanFileList = [];
+            this.state.businessPlanFileList = [];
+            if (nextProps.data.id) {
+                this.loadData(nextProps.data.id);
+            } else {
+                this.state.data = {};
+                this.state.tags = [];
+                this.state.maturityPictureUrl = [];
+                this.state.technicalPictureUrl = [];
+            };
+            this.props.form.resetFields();
+        };
+    },
+    render() {
+        const theData = this.state.data || {};
+        const { getFieldDecorator } = this.props.form;
+        const FormItem = Form.Item
+        const formItemLayout = {
+            labelCol: { span: 8 },
+            wrapperCol: { span: 14 },
+        };
+        return (
+            <Form horizontal onSubmit={this.handleSubmit} id="demand-form">
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="编号" >
+                        <span>{theData.serialNumber}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="名称" >
+                        {getFieldDecorator('name', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.name
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="数据类别" >
+                        {getFieldDecorator('dataCategory', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.dataCategory
+                        })(
+                            <Select placeholder="选择数据类型" style={{ width: 160 }} >
+                                <Select.Option value="0" >成果</Select.Option>
+                                <Select.Option value="1" >技术</Select.Option>
+                                <Select.Option value="2" >项目</Select.Option>
+                            </Select>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="类型" >
+                        {getFieldDecorator('category', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.category
+                        })(
+                            <Select style={{ width: 160 }} placeholder="请选择成果类型">
+                                {this.props.achievementCategoryOption}
+                            </Select>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="是否发布" >
+                        {getFieldDecorator('releaseStatus', {
+                            initialValue: theData.releaseStatus
+                        })(
+                            <Radio.Group>
+                                <Radio value="0">未发布</Radio>
+                                <Radio value="1">发布</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="发布时间" >
+                        <span>{theData.releaseDateFormattedDate}</span>
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="关键词" >
+                    <KeyWordTagGroup
+                        keyWordArr={this.state.tags}
+                        tagsArr={this.getTagsArr}
+                        visible={this.props.visible} />
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="摘要" >
+                    {getFieldDecorator('summary', {
+                        initialValue: theData.summary
+                    })(
+                        <Input type="textarea" rows={4} />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="成果简介" >
+                    {getFieldDecorator('introduction', {
+                        initialValue: theData.introduction
+                    })(
+                        <Input type="textarea" rows={4} placeholder="项目成果简介;项目核心创新点;项目详细用途;预期效益说明;主要技术(性能)指标;市场前景;应用范围;发展历程。" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="技术图片" >
+                    <PicturesWall
+                        pictureSign="achievement_technical_picture"
+                        fileList={this.getTechnicalPictureUrl}
+                        pictureUrl={this.state.technicalPictureUrl} />
+                    <p>图片建议:专利证书或专利申请书图片、技术图纸、样品图片、技术相关网络图片;成熟度处于非研发阶段的项目,必须上传样品图片,如未上传,成熟度将视为处在研发阶段。</p>
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="应用领域" >
+                    {getFieldDecorator('field', {
+                        rules: [{ type: 'array', required: true, message: '此项为必填项!' }],
+                        initialValue: [theData.fieldA, theData.fieldB]
+                    })(
+                        <Cascader style={{ width: 300 }} options={IndustryObject} placeholder="应用领域" />
+                        )}
+                </FormItem>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="成熟度" >
+                        {getFieldDecorator('maturity', {
+                            initialValue: theData.maturity
+                        })(
+                            <Select placeholder="选择成熟度" style={{ width: 160 }} >
+                                <Select.Option value="0" >正在研发</Select.Option>
+                                <Select.Option value="1" >已有样品</Select.Option>
+                                <Select.Option value="2" >通过小试</Select.Option>
+                                <Select.Option value="3" >通过中试</Select.Option>
+                                <Select.Option value="4" >可以量产</Select.Option>
+                            </Select>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="创新度" >
+                        {getFieldDecorator('innovation', {
+                            initialValue: theData.innovation
+                        })(
+                            <Select placeholder="选择创新度" style={{ width: 160 }} >
+                                <Select.Option value="0" >行业先进</Select.Option>
+                                <Select.Option value="1" >行业领先</Select.Option>
+                                <Select.Option value="2" >国内先进</Select.Option>
+                                <Select.Option value="3" >国内领先</Select.Option>
+                                <Select.Option value="4" >国际先进</Select.Option>
+                                <Select.Option value="5" >国际领先</Select.Option>
+                            </Select>
+                            )}
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="成熟度证明材料(图片)" >
+                    <PicturesWall
+                        pictureSign="achievement_maturity_picture"
+                        fileList={this.getMaturityPictureUrl}
+                        pictureUrl={this.state.maturityPictureUrl} />
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 6 }}
+                    label="成熟度证明材料(文本)" >
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/api/user/achievement/uploadTextFile"}
+                        data={{ 'sign': 'achievement_maturity_text_file' }}
+                        beforeUpload={beforeUploadFile}
+                        fileList={this.state.textFileList}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                if (!info.file.response.error.length) {
+                                    message.success(`${info.file.name} 文件上传成功!`);
+                                } else {
+                                    message.warning(info.file.response.error[0].message);
+                                    return;
+                                };
+                                this.state.maturityTextFileUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            };
+                            this.setState({ textFileList: info.fileList.slice(-1) });
+                        }} >
+                        <Button><Icon type="upload" /> 上传需求文本文件 </Button>
+                    </Upload>
+                    <p style={{ marginTop: '10px' }}>{theData.maturityTextFileUrl ?
+                        <span className="download-file">
+                            <a onClick={() => { window.open(globalConfig.context + '/api/user/achievement/download?id=' + this.props.data.id + '&sign=achievement_maturity_text_file') }}>成熟度证明材料(文本文件)</a>
+                        </span>
+                        : <span><Icon type="exclamation-circle" style={{ color: '#ffbf00', marginRight: '6px' }} />未上传!</span>}</p>
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="成熟度证明材料(视频地址)" >
+                    {getFieldDecorator('maturityVideoUrl', {
+                        initialValue: theData.maturityVideoUrl
+                    })(
+                        <Input />
+                        )}
+                </FormItem>
+                <div className="clearfix" >
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="成果所有人名称" >
+                        {getFieldDecorator('ownerName', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.ownerName
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所有人证件号" >
+                        {getFieldDecorator('ownerIdNumber', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.ownerIdNumber
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所有人联系电话" >
+                        {getFieldDecorator('ownerMobile', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.ownerMobile
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所有人电子邮箱" >
+                        {getFieldDecorator('ownerEmail', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.ownerEmail
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所有人通信地址" >
+                        {getFieldDecorator('ownerPostalAddress', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.ownerPostalAddress
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所有人类型" >
+                        {getFieldDecorator('ownerType', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.ownerType
+                        })(
+                            <Radio.Group onChange={(e) => { this.setState({ orgDisplay: e.target.value }); }}>
+                                <Radio value="0">个人</Radio>
+                                <Radio value="1">组织</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix" style={{ display: this.state.orgDisplay == '1' ? 'block' : 'none' }}>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所属组织名称" >
+                        {getFieldDecorator('orgName', {
+                            initialValue: theData.orgName
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所属组织地址" >
+                        {getFieldDecorator('orgAddress', {
+                            initialValue: theData.orgAddress
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所属组织邮箱" >
+                        {getFieldDecorator('orgEmail', {
+                            initialValue: theData.orgEmail
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所属组织联系人名称" >
+                        {getFieldDecorator('orgContacts', {
+                            initialValue: theData.orgContacts
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所属组织联系人电话" >
+                        {getFieldDecorator('orgContactsMobile', {
+                            initialValue: theData.orgContactsMobile
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="合作方式" >
+                        {getFieldDecorator('cooperationMode', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.cooperationMode
+                        })(
+                            <Radio.Group>
+                                <Radio value="0">技术转让</Radio>
+                                <Radio value="1">授权生产</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="转让方式" >
+                        {getFieldDecorator('transferMode', {
+                            initialValue: theData.transferMode
+                        })(
+                            <Select placeholder="选择转让方式" style={{ width: 160 }} >
+                                <Select.Option value="0" >完全转让</Select.Option>
+                                <Select.Option value="1" >许可转让</Select.Option>
+                                <Select.Option value="2" >技术入股</Select.Option>
+                            </Select>
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="议价方式" >
+                        {getFieldDecorator('bargainingMode', {
+                            initialValue: theData.bargainingMode
+                        })(
+                            <Radio.Group>
+                                <Radio value="0">面议</Radio>
+                                <Radio value="1">定价</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="转让价格" >
+                        {getFieldDecorator('transferPrice', {
+                            initialValue: theData.transferPrice
+                        })(
+                            <InputNumber />
+                            )}
+                        <span style={{ marginLeft: '20px' }}>万元</span>
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="技术场景" >
+                    {getFieldDecorator('technicalScene', {
+                        initialValue: theData.technicalScene
+                    })(
+                        <Input type="textarea" rows={2} placeholder="说明解决了什么问题。" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="技术突破" >
+                    {getFieldDecorator('breakthrough', {
+                        initialValue: theData.breakthrough
+                    })(
+                        <Input type="textarea" rows={2} placeholder="说明该技术成果突破性的研究。" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="专利情况" >
+                    {getFieldDecorator('patentCase', {
+                        initialValue: theData.patentCase
+                    })(
+                        <Input type="textarea" rows={2} placeholder="一个“技术”可能由多个专利构成,需要说明技术-专利的关系。" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="获奖情况" >
+                    {getFieldDecorator('awards', {
+                        initialValue: theData.awards
+                    })(
+                        <Input type="textarea" rows={2} placeholder="一个“技术”可能存在社会奖励情况,需要说明社会奖励情况。" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="技术团队情况" >
+                    {getFieldDecorator('teamDes', {
+                        initialValue: theData.teamDes
+                    })(
+                        <Input type="textarea" rows={2} placeholder="一个“技术”、“项目”可能存在团队,需要说明团队情况。" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="技术参数" >
+                    {getFieldDecorator('parameter', {
+                        initialValue: theData.parameter
+                    })(
+                        <Input type="textarea" rows={2} placeholder="描述技术参数信息" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 6 }}
+                    label="技术方案" >
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/api/user/achievement/uploadTextFile"}
+                        data={{ 'sign': 'achievement_tech_plan' }}
+                        beforeUpload={beforeUploadFile}
+                        fileList={this.state.techPlanFileList}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                if (!info.file.response.error.length) {
+                                    message.success(`${info.file.name} 文件上传成功!`);
+                                } else {
+                                    message.warning(info.file.response.error[0].message);
+                                    return;
+                                };
+                                this.state.techPlanUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            };
+                            this.setState({ techPlanFileList: info.fileList.slice(-1) });
+                        }} >
+                        <Button><Icon type="upload" /> 上传技术方案文件 </Button>
+                    </Upload>
+                    <p style={{ marginTop: '10px' }}>{theData.techPlanUrl ?
+                        <span className="download-file">
+                            <a onClick={() => { window.open(globalConfig.context + '/api/user/achievement/download?id=' + this.props.data.id + '&sign=achievement_tech_plan') }}>技术方案</a>
+                        </span>
+                        : <span><Icon type="exclamation-circle" style={{ color: '#ffbf00', marginRight: '6px' }} />未上传!</span>}</p>
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 6 }}
+                    label="商业计划书" >
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/api/user/achievement/uploadTextFile"}
+                        data={{ 'sign': 'achievement_business_plan' }}
+                        beforeUpload={beforeUploadFile}
+                        fileList={this.state.businessPlanFileList}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                if (!info.file.response.error.length) {
+                                    message.success(`${info.file.name} 文件上传成功!`);
+                                } else {
+                                    message.warning(info.file.response.error[0].message);
+                                    return;
+                                };
+                                this.state.businessPlanUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            };
+                            this.setState({ businessPlanFileList: info.fileList.slice(-1) });
+                        }} >
+                        <Button><Icon type="upload" /> 上传商业计划书文件 </Button>
+                    </Upload>
+                    <p style={{ marginTop: '10px' }}>{theData.businessPlanUrl ?
+                        <span className="download-file">
+                            <a onClick={() => { window.open(globalConfig.context + '/api/user/achievement/download?id=' + this.props.data.id + '&sign=achievement_business_plan') }}>商业计划书</a>
+                        </span>
+                        : <span><Icon type="exclamation-circle" style={{ color: '#ffbf00', marginRight: '6px' }} />未上传!</span>}</p>
+                </FormItem>
+                <FormItem wrapperCol={{ span: 12, offset: 3 }}>
+                    <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
+                    <Button className="set-submit" type="ghost" onClick={this.props.closeDesc}>取消</Button>
+                </FormItem>
+            </Form >
+        )
+    }
+}));
+
+const AchievementDetail = React.createClass({
+    getInitialState() {
+        return {
+            visible: false
+        };
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    handleOk(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false, true);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc;
+    },
+    render() {
+        if (this.props.data) {
+            return (
+                <div className="patent-desc">
+                    <Modal maskClosable={false} title="成果详情" visible={this.state.visible}
+                        onOk={this.checkPatentProcess} onCancel={this.handleCancel}
+                        width='1000px'
+                        footer=''
+                        className="admin-desc-content">
+                        <AchievementDetailForm
+                            data={this.props.data}
+                            achievementCategoryOption={this.props.achievementCategoryOption}
+                            closeDesc={this.handleCancel}
+                            visible={this.state.visible}
+                            handleOk={this.handleOk} />
+                    </Modal>
+                </div>
+            );
+        } else {
+            return <div></div>
+        }
+    },
+});
+
+export default AchievementDetail;

+ 2 - 2
js/component/account/bottom.jsx

@@ -5,8 +5,8 @@ const Bottom = React.createClass({
     render() {
         return (
             <div className="account-bottom">
-                <p>公司地址   联系方式公司地址  公司地址   联系方式 公司地址 公司地址   联系方式 公司地址</p>
-                <p>公司地址   联系方式公司地址 公司地址   联系方式公司地址</p>
+                <p>阿凡提科技</p>
+                <p>技术支持@湖南智明</p>
             </div>
         )
     }

+ 47 - 0
js/component/account/demand/content.jsx

@@ -0,0 +1,47 @@
+import React, { Component } from 'react';
+import '../content.less';
+import LeftTab from './leftTab';
+import TechDemand from './techDemand';
+
+
+class Content extends Component {
+    constructor() {
+        super();
+        this.state = {
+            loading: false,
+            component: 'div'
+        };
+    }
+    componentWillMount() {
+        if (window.location.hash) {
+            this.getKey(window.location.hash.substr(1));
+        } else {
+            this.getKey("techDemand");
+        };
+    }
+    getKey(key) {
+        switch (key) {
+            case 'techDemand':
+                require.ensure([], () => {
+                    const TechDemand = require('./techDemand').default;
+                    this.setState({
+                        component: TechDemand
+                    });
+                });
+                break;
+        };
+        window.location.hash = key;
+    }
+    render() {
+        return (
+            <div className="acc-content">
+                <LeftTab handlekey={this.getKey.bind(this)} />
+                <div className="content-right">
+                    <this.state.component />
+                </div>
+            </div>
+        )
+    }
+}
+
+export default Content;

+ 40 - 0
js/component/account/demand/leftTab.jsx

@@ -0,0 +1,40 @@
+import React from 'react';
+import { Menu, Icon } from 'antd';
+import '../leftTab.less';
+const SubMenu = Menu.SubMenu;
+const MenuItemGroup = Menu.ItemGroup;
+
+
+const LeftTab = React.createClass({
+    getInitialState() {
+        return {
+            current: 'techDemand'
+        };
+    },
+    handleClick(e) {
+        this.props.handlekey(e.key);
+        this.setState({
+            current: e.key,
+        });
+    },
+    componentWillMount() {
+        if (window.location.hash) {
+            this.state.current = window.location.hash.substr(1);
+        };
+    },
+    render() {
+        return (
+            <Menu onClick={this.handleClick}
+                selectedKeys={[this.state.current]}
+                mode="vertical"
+                className="account-left"
+            >
+                <Menu.Item key="techDemand">
+                    科技需求列表
+                </Menu.Item>
+            </Menu>
+        );
+    },
+});
+
+export default LeftTab;

+ 311 - 0
js/component/account/demand/techDemand.jsx

@@ -0,0 +1,311 @@
+import React from 'react';
+import { Icon, Button, Input, Select, Spin, Table, Switch, message, DatePicker, Modal } from 'antd';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import moment from 'moment';
+import './techDemand.less';
+import TechDemandDesc from './techDemandDesc.jsx';
+import { provinceArr, demandTypeList } from '../../dataDic.js';
+import { companySearch, getDemandType } from '../../tools.js';
+
+const DemandList = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/demand/list",
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                serialNumber: this.state.serialNumber,
+                name: this.state.name,
+                keyword: this.state.keyword,
+                demandType: this.state.demandType ? Number(this.state.demandType) : undefined,
+                status: this.state.status ? Number(this.state.status) : undefined,
+                releaseStatus: this.state.releaseStatus ? Number(this.state.releaseStatus) : undefined,
+                validityPeriodStartDate: this.state.validityPeriodDate[0],
+                validityPeriodEndDate: this.state.validityPeriodDate[1],
+                releaseDateStartDate: this.state.releaseDate[0],
+                releaseDateEndDate: this.state.releaseDate[1],
+            },
+            success: function (data) {
+                let theArr = [];
+                if (!data.data && !data.data.list) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                } else {
+                    for (let i = 0; i < data.data.list.length; i++) {
+                        let thisdata = data.data.list[i];
+                        theArr.push({
+                            key: i,
+                            id: thisdata.id,
+                            serialNumber: thisdata.serialNumber,
+                            dataCategory: thisdata.dataCategory,
+                            name: thisdata.name,
+                            keyword: thisdata.keyword,
+                            releaseDate: thisdata.releaseDate,
+                            demandType: thisdata.demandType,
+                            validityPeriod: thisdata.validityPeriod,
+                            status: thisdata.status,
+                            releaseStatus: thisdata.releaseStatus,
+                            employerId: thisdata.employerId,
+                            releaseDateFormattedDate: thisdata.releaseDateFormattedDate,
+                            validityPeriodFormattedDate: thisdata.validityPeriodFormattedDate
+                        });
+                    };
+                }
+                this.state.pagination.current = data.data.pageNo;
+                this.state.pagination.total = data.data.totalCount;
+                this.setState({
+                    dataSource: theArr,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            searchMore: true,
+            validityPeriodDate: [],
+            releaseDate: [],
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: false,
+            pagination: {
+                defaultCurrent: 1,
+                defaultPageSize: 10,
+                showQuickJumper: true,
+                pageSize: 10,
+                onChange: function (page) {
+                    this.loadData(page);
+                }.bind(this),
+                showTotal: function (total) {
+                    return '共' + total + '条数据';
+                }
+            },
+            columns: [
+                {
+                    title: '编号',
+                    dataIndex: 'serialNumber',
+                    key: 'serialNumber',
+                }, {
+                    title: '需求名称',
+                    dataIndex: 'name',
+                    key: 'name',
+                }, {
+                    title: '关键字',
+                    dataIndex: 'keyword',
+                    key: 'keyword',
+                }, {
+                    title: '需求类型',
+                    dataIndex: 'demandType',
+                    key: 'demandType',
+                    render: text => { return getDemandType(text); }
+                }, {
+                    title: '需求状态',
+                    dataIndex: 'status',
+                    key: 'status',
+                    render: text => {
+                        switch (text) {
+                            case "0":
+                                return <span>进行中</span>;
+                            case "1":
+                                return <span>未解决</span>;
+                            case "2":
+                                return <span>已解决</span>;
+                        }
+                    }
+                }, {
+                    title: '有效期限',
+                    dataIndex: 'validityPeriodFormattedDate',
+                    key: 'validityPeriodFormattedDate',
+                }, {
+                    title: '发布时间',
+                    dataIndex: 'releaseDateFormattedDate',
+                    key: 'releaseDateFormattedDate',
+                }
+            ],
+            dataSource: [],
+            searchTime: [,]
+        };
+    },
+    componentWillMount() {
+        let theArr = [];
+        demandTypeList.map(function (item) {
+            theArr.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        this.state.demandTypeOption = theArr;
+        this.loadData();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true
+        });
+    },
+    delectRow() {
+        let deletedIds = [];
+        for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
+            let rowItem = this.state.selectedRows[idx];
+            if (rowItem.id) {
+                deletedIds.push(rowItem.id)
+            };
+        };
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/demand/delete",
+            data: {
+                ids: deletedIds
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('删除成功!');
+                this.setState({
+                    loading: false,
+                });
+            } else {
+                message.warning(data.error[0].message);
+            };
+            this.loadData();
+        }.bind(this));
+    },
+    addClick() {
+        this.state.RowData = {};
+        this.setState({
+            showDesc: true
+        });
+    },
+    closeDesc(e, s) {
+        this.state.showDesc = e;
+        if (s) {
+            this.loadData();
+        };
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.serialNumber = undefined;
+        this.state.name = undefined;
+        this.state.keyword = undefined;
+        this.state.demandType = undefined;
+        this.state.username = undefined;
+        this.state.status = undefined;
+        this.state.releaseStatus = undefined;
+        this.state.validityPeriodDate = [];
+        this.state.releaseDate = [];
+        this.loadData();
+    },
+    searchSwitch() {
+        this.setState({
+            searchMore: !this.state.searchMore
+        });
+    },
+    render() {
+        const rowSelection = {
+            selectedRowKeys: this.state.selectedRowKeys,
+            onChange: (selectedRowKeys, selectedRows) => {
+                this.setState({
+                    selectedRows: selectedRows,
+                    selectedRowKeys: selectedRowKeys
+                });
+            }
+        };
+        const hasSelected = this.state.selectedRowKeys.length > 0;
+        const { RangePicker } = DatePicker;
+        return (
+            <div className="user-content" >
+                <div className="content-title">
+                    <span>科技需求管理</span>
+                    <div className="patent-addNew">
+                        <Button type="primary" onClick={this.addClick}>新增需求<Icon type="plus" /></Button>
+                    </div>
+                </div>
+                <div className="user-search">
+                    <Input placeholder="需求编号"
+                        value={this.state.serialNumber}
+                        onChange={(e) => { this.setState({ serialNumber: e.target.value }); }} />
+                    <Input placeholder="需求名称"
+                        value={this.state.name}
+                        onChange={(e) => { this.setState({ name: e.target.value }); }} />
+                    <Input placeholder="关键字"
+                        value={this.state.keyword}
+                        onChange={(e) => { this.setState({ keyword: e.target.value }); }} />
+                    <Select placeholder="选择需求类型"
+                        style={{ width: 120 }}
+                        value={this.state.demandType}
+                        onChange={(e) => { this.setState({ demandType: e }) }}>
+                        {this.state.demandTypeOption}
+                    </Select>
+                    <Select placeholder="选择需求状态" style={{ width: 120 }}
+                        value={this.state.status}
+                        onChange={(e) => { this.setState({ status: e }) }}>
+                        <Select.Option value="0" >进行中</Select.Option>
+                        <Select.Option value="1" >未解决</Select.Option>
+                        <Select.Option value="2" >已解决</Select.Option>
+                    </Select>
+                    <Select placeholder="选择是否发布" style={{ width: 120 }}
+                        value={this.state.releaseStatus}
+                        onChange={(e) => { this.setState({ releaseStatus: e }) }}>
+                        <Select.Option value="0" >未发布</Select.Option>
+                        <Select.Option value="1" >已发布</Select.Option>
+                    </Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                    <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                        disabled={!hasSelected}
+                        onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    <span>更多搜索<Switch defaultChecked={false} onChange={this.searchSwitch} /></span>
+                    <div className="search-more" style={this.state.searchMore ? { display: 'none' } : {}}>
+                        <p>
+                            <span>有效期限 :</span>
+                            <RangePicker
+                                value={[this.state.validityPeriodDate[0] ? moment(this.state.validityPeriodDate[0]) : null,
+                                this.state.validityPeriodDate[1] ? moment(this.state.validityPeriodDate[1]) : null]}
+                                onChange={(data, dataString) => { this.setState({ validityPeriodDate: dataString }); }} />
+                            <span>发布时间 :</span>
+                            <RangePicker
+                                value={[this.state.releaseDate[0] ? moment(this.state.releaseDate[0]) : null,
+                                this.state.releaseDate[1] ? moment(this.state.releaseDate[1]) : null]}
+                                onChange={(data, dataString) => { this.setState({ releaseDate: dataString }); }} />
+                        </p>
+                    </div>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            rowSelection={rowSelection}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <TechDemandDesc
+                    data={this.state.RowData}
+                    demandTypeOption={this.state.demandTypeOption}
+                    showDesc={this.state.showDesc}
+                    closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default DemandList;

+ 72 - 0
js/component/account/demand/techDemand.less

@@ -0,0 +1,72 @@
+.user-content {
+    background: #fff;
+    padding: 20px;
+    .content-title {
+        color: #333;
+        font-size: 16px;
+    }
+    .user-search {
+        margin-bottom: 10px;
+        >input {
+            width: 140px;
+        }
+        >input,
+        >button,
+        .ant-select {
+            margin-right: 10px;
+            margin-top: 10px;
+        }
+        .ant-switch {
+            margin-left: 10px;
+        }
+        .search-more {
+            margin: 10px 0;
+            >p {
+                span {
+                    margin-right: 10px
+                }
+            }
+        }
+    }
+}
+
+.patent-addNew {
+    float: right;
+    margin-left: 20px;
+    button {
+        background: #ea0862;
+        color: #fff;
+        border: none;
+        border-radius: 4px;
+        padding: 6px 10px;
+        margin-left: 20px;
+    }
+    button:hover {
+        background: #ea0862;
+    }
+}
+
+#demand-form {
+    .half-item {
+        float: left;
+        width: 50%;
+        margin-bottom: 10px;
+    }
+    .item-title {
+        line-height: 30px;
+        font-size: 14px;
+        color: #666;
+    }
+    .form-title {
+        font-size: 16px;
+        color: #333;
+    }
+    .keyWord-tips {
+        >button {
+            vertical-align: middle;
+        }
+    }
+    .set-submit {
+        margin-right: 20px;
+    }
+}

+ 625 - 0
js/component/account/demand/techDemandDesc.jsx

@@ -0,0 +1,625 @@
+import React from 'react';
+import { Icon, Tooltip, Modal, message, Spin, Upload, Input, InputNumber, Select, DatePicker, Button, Radio, Form, Cascader, Tag } from 'antd';
+import moment from 'moment';
+import './techDemand.less';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import { IndustryObject } from '../../DicIndustryList.js';
+import { beforeUploadFile, splitUrl, companySearch } from '../../tools.js';
+
+const KeyWordTagGroup = React.createClass({
+    getInitialState() {
+        return {
+            tags: [],
+            inputVisible: false,
+            inputValue: ''
+        };
+    },
+    handleClose(removedTag) {
+        const tags = this.state.tags.filter(tag => tag !== removedTag);
+        this.props.tagsArr(tags);
+        this.setState({ tags });
+    },
+    showInput() {
+        this.setState({ inputVisible: true }, () => this.input.focus());
+    },
+    handleInputChange(e) {
+        this.setState({ inputValue: e.target.value });
+    },
+    handleInputConfirm() {
+        const state = this.state;
+        const inputValue = state.inputValue;
+        let tags = state.tags;
+        if (inputValue && tags.indexOf(inputValue) === -1) {
+            tags = [...tags, inputValue];
+        }
+        this.props.tagsArr(tags);
+        this.setState({
+            tags,
+            inputVisible: false,
+            inputValue: '',
+        });
+    },
+    componentWillMount() {
+        this.state.tags = this.props.keyWordArr;
+    },
+    componentWillReceiveProps(nextProps) {
+        if (this.props.keyWordArr != nextProps.keyWordArr) {
+            this.state.tags = nextProps.keyWordArr;
+        };
+    },
+    render() {
+        const { tags, inputVisible, inputValue } = this.state;
+        return (
+            <div className="keyWord-tips">
+                {tags.map((tag, index) => {
+                    const isLongTag = tag.length > 10;
+                    const tagElem = (
+                        <Tag key={tag} closable={index !== -1} afterClose={() => this.handleClose(tag)}>
+                            {isLongTag ? `${tag.slice(0, 10)}...` : tag}
+                        </Tag>
+                    );
+                    return isLongTag ? <Tooltip title={tag}>{tagElem}</Tooltip> : tagElem;
+                })}
+                {inputVisible && (
+                    <Input
+                        ref={input => this.input = input}
+                        type="text"
+                        style={{ width: 78 }}
+                        value={inputValue}
+                        onChange={this.handleInputChange}
+                        onBlur={this.handleInputConfirm}
+                        onPressEnter={this.handleInputConfirm}
+                    />
+                )}
+                {!inputVisible && <Button className="addtips" type="dashed" disabled={tags.length > 9 ? true : false} onClick={this.showInput}>+ 新关键词</Button>}
+            </div>
+        );
+    }
+});
+
+const PicturesWall = React.createClass({
+    getInitialState() {
+        return {
+            previewVisible: false,
+            previewImage: '',
+            fileList: [],
+        }
+    },
+    handleCancel() {
+        this.setState({ previewVisible: false })
+    },
+    handlePreview(file) {
+        this.setState({
+            previewImage: file.url || file.thumbUrl,
+            previewVisible: true,
+        });
+    },
+    handleChange(info) {
+        let fileList = info.fileList;
+        this.setState({ fileList });
+        this.props.fileList(fileList);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.fileList = nextProps.pictureUrl;
+    },
+    render() {
+        const { previewVisible, previewImage, fileList } = this.state;
+        const uploadButton = (
+            <div>
+                <Icon type="plus" />
+                <div className="ant-upload-text">点击上传</div>
+            </div>
+        );
+        return (
+            <div className="clearfix">
+                <Upload
+                    action={globalConfig.context + "/api/user/demand/uploadPicture"}
+                    data={{ 'sign': 'demand_picture' }}
+                    listType="picture-card"
+                    fileList={fileList}
+                    onPreview={this.handlePreview}
+                    onChange={this.handleChange} >
+                    {fileList.length >= 5 ? null : uploadButton}
+                </Upload>
+                <Modal maskClosable={false} visible={previewVisible} footer={null} onCancel={this.handleCancel}>
+                    <img alt="example" style={{ width: '100%' }} src={previewImage} />
+                </Modal>
+            </div>
+        );
+    }
+});
+
+const DemandDetailForm = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            textFileList: [],
+            videoFileList: [],
+            pictureUrl: [],
+            tags: []
+        };
+    },
+    loadData(id) {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + (window.userData.type == 0 ? '/api/user/demand/userDemandDetail' : '/api/user/demand/orgDemandDetail'),
+            data: {
+                id: id
+            },
+            success: function (data) {
+                let thisData = data.data;
+                if (!thisData) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                    thisData = {};
+                };
+                let d = new Date()
+                if (thisData && thisData.dateOfBirthMonth && thisData.dateOfBirthYear) {
+                    d.setMonth(thisData.dateOfBirthMonth - 1);
+                    d.setYear(parseInt(thisData.dateOfBirthYear));
+                };
+                this.setState({
+                    data: thisData,
+                    tags: thisData.keyword ? thisData.keyword.split(",") : [],
+                    pictureUrl: thisData.pictureUrl ? splitUrl(thisData.pictureUrl, ',', globalConfig.avatarHost + '/upload') : []
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getContactsList() {
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/user/cognizance/getContacts",
+            success: function (data) {
+                let theOption = [];
+                if (data.error.length || !data.data) {
+                    return;
+                };
+                for (let item in data.data) {
+                    let theData = data.data[item];
+                    theOption.push(
+                        <Select.Option value={item} key={theData}>{theData}</Select.Option>
+                    );
+                };
+                this.setState({
+                    contactsOption: theOption
+                });
+            }.bind(this),
+        });
+    },
+    getTagsArr(e) {
+        this.setState({ tags: e });
+    },
+    getPictureUrl(e) {
+        this.setState({ pictureUrl: e });
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            //keyword长度判断
+            if (this.state.tags.length < 3) {
+                message.warning('关键词数量不能小于3个!');
+            };
+            //url转化
+            let thePictureUrl = [];
+            if (this.state.pictureUrl.length) {
+                let picArr = [];
+                this.state.pictureUrl.map(function (item) {
+                    picArr.push(item.response.data);
+                });
+                thePictureUrl = picArr.join(",");
+            };
+            if (!err) {
+                this.setState({
+                    loading: true
+                });
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: this.props.data.id ? globalConfig.context + '/api/user/demand/update' : globalConfig.context + '/api/user/demand/apply',
+                    data: {
+                        id: this.props.data.id,
+                        dataCategory: window.userData.type ? Number(window.userData.type) : undefined,
+                        serialNumber: this.props.data.serialNumber,
+                        name: values.name,
+                        keyword: this.state.tags ? this.state.tags.join(",") : [],
+                        industryCategoryA: values.industryCategory ? values.industryCategory[0] : undefined,
+                        industryCategoryB: values.industryCategory ? values.industryCategory[1] : undefined,
+                        demandType: values.demandType,
+                        problemDes: values.problemDes,
+                        technicalRequirements: values.technicalRequirements,
+                        pictureUrl: thePictureUrl,
+                        textFileUrl: this.state.textFileUrl,
+                        videoUrl: values.videoUrl,
+                        fixedBudget: values.fixedBudget,
+                        fixedCycle: values.fixedCycle,
+                        peopleNumber: values.peopleNumber,
+                        fixedScheme: values.fixedScheme,
+                        costEscrow: values.costEscrow,
+                        budgetCost: values.budgetCost,
+                        releaseStatus: values.releaseStatus,
+                        principalId: values.principalId,
+                        validityPeriodFormattedDate: values.validityPeriod ? values.validityPeriod.format('YYYY-MM-DD') : undefined,
+                        //
+                        contacts: values.contacts,
+                        status: this.state.status
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.setState({
+                            visible: false
+                        });
+                        this.props.handleOk();
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this));
+            }
+        });
+    },
+    componentWillMount() {
+        if (window.userData.type == "1") {
+            this.getContactsList();
+        };
+        if (this.props.data.id) {
+            this.loadData(this.props.data.id);
+        } else {
+            this.state.data = {};
+        };
+    },
+    componentWillReceiveProps(nextProps) {
+        if (!this.props.visible && nextProps.visible) {
+            this.state.textFileList = [];
+            this.state.videoFileList = [];
+            if (nextProps.data.id) {
+                this.loadData(nextProps.data.id);
+            } else {
+                this.state.data = {};
+                this.state.tags = [];
+                this.state.pictureUrl = [];
+            };
+            this.props.form.resetFields();
+        };
+    },
+    render() {
+        const theData = this.state.data || {};
+        const { getFieldDecorator } = this.props.form;
+        const FormItem = Form.Item
+        const formItemLayout = {
+            labelCol: { span: 6 },
+            wrapperCol: { span: 12 },
+        };
+        return (
+            <Form horizontal onSubmit={this.handleSubmit} id="demand-form">
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="编号" >
+                        <span>{theData.serialNumber}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="需求名称" >
+                        {getFieldDecorator('name', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.name
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    {window.userData.type == "1" ? <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="联系人" >
+                        {getFieldDecorator('contacts', {
+                            initialValue: theData.contacts
+                        })(
+                            <Select style={{ width: 260 }}
+                                placeholder="请选择联系人"
+                                notFoundContent="未获取到联系人列表"
+                                showSearch
+                                filterOption={companySearch}>
+                                {this.state.contactsOption}
+                            </Select>
+                            )}
+                    </FormItem> : <div></div>}
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="是否发布" >
+                        {getFieldDecorator('releaseStatus', {
+                            initialValue: theData.releaseStatus
+                        })(
+                            <Radio.Group>
+                                <Radio value="0">未发布</Radio>
+                                <Radio value="1">发布</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="发布时间" >
+                        <span>{theData.releaseDateFormattedDate}</span>
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="需求状态" >
+                        {(() => {
+                            if (theData.status > 1) {
+                                return <Radio.Group
+                                    value={this.state.status}
+                                    onChange={(e) => { this.setState({ status: e }); }}>
+                                    <Radio value="2">未解决</Radio>
+                                    <Radio value="3">已解决</Radio>
+                                </Radio.Group>
+                            } else {
+                                switch (theData.status) {
+                                    case "0":
+                                        return <span>草稿</span>;
+                                    case "1":
+                                        return <span>进行中</span>;
+                                };
+                            };
+                        })()}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="需求创建时间" >
+                        <span>{theData.createTimeFormattedDate}</span>
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 20 }}
+                    label="关键词" >
+                    <KeyWordTagGroup
+                        keyWordArr={this.state.tags}
+                        tagsArr={this.getTagsArr}
+                        visible={this.props.visible} />
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 18 }}
+                    label="行业类别" >
+                    {getFieldDecorator('industryCategory', {
+                        rules: [{ type: 'array', required: true, message: '此项为必填项!' }],
+                        initialValue: [theData.industryCategoryA, theData.industryCategoryB]
+                    })(
+                        <Cascader style={{ width: 300 }} options={IndustryObject} placeholder="请选择一个行业" />
+                        )}
+                </FormItem>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="需求类型" >
+                        {getFieldDecorator('demandType', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.demandType
+                        })(
+                            <Select style={{ width: 160 }} placeholder="请选择需求类型">
+                                {this.props.demandTypeOption}
+                            </Select>
+                            )}
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 18 }}
+                    label="问题说明" >
+                    {getFieldDecorator('problemDes', {
+                        rules: [{ required: true, message: '此项为必填项!' }],
+                        initialValue: theData.problemDes
+                    })(
+                        <Input type="textarea" rows={4} />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 18 }}
+                    label="技术指标要求" >
+                    {getFieldDecorator('technicalRequirements', {
+                        initialValue: theData.technicalRequirements
+                    })(
+                        <Input type="textarea" rows={2} />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 18 }}
+                    label="需求文件(图片)" >
+                    <PicturesWall
+                        uid={theData.uid}
+                        fileList={this.getPictureUrl}
+                        pictureUrl={this.state.pictureUrl}
+                        visible={this.props.visible} />
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 6 }}
+                    label="需求文件(文本)" >
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/api/user/demand/uploadTextFile"}
+                        data={{ 'sign': 'demand_text_file'}}
+                        beforeUpload={beforeUploadFile}
+                        fileList={this.state.textFileList}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                if (!info.file.response.error.length) {
+                                    message.success(`${info.file.name} 文件上传成功!`);
+                                } else {
+                                    message.warning(info.file.response.error[0].message);
+                                    return;
+                                };
+                                this.state.textFileUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            };
+                            this.setState({ textFileList: info.fileList.slice(-1) });
+                        }} >
+                        <Button><Icon type="upload" /> 上传需求文本文件 </Button>
+                    </Upload>
+                    <p style={{ marginTop: '10px' }}>{theData.textFileUrl ?
+                        <span className="download-file">
+                            <a onClick={() => { window.open(globalConfig.context + '/api/user/demand/download?id=' + this.props.data.id) }}>需求文件(文本文件)</a>
+                        </span>
+                        : <span><Icon type="exclamation-circle" style={{ color: '#ffbf00', marginRight: '6px' }} />未上传!</span>}</p>
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 18 }}
+                    label="需求文件(视频地址)" >
+                    {getFieldDecorator('videoUrl', {
+                        initialValue: theData.videoUrl
+                    })(
+                        <Input />
+                        )}
+                </FormItem>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="固定周期" >
+                        {getFieldDecorator('fixedCycle', {
+                            initialValue: theData.fixedCycle
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="固定人数" >
+                        {getFieldDecorator('peopleNumber', {
+                            initialValue: theData.peopleNumber
+                        })(
+                            <InputNumber />
+                            )}
+                        <span style={{ marginLeft: '20px' }}>人</span>
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 18 }}
+                    label="固定方案" >
+                    {getFieldDecorator('fixedScheme', {
+                        initialValue: theData.fixedScheme
+                    })(
+                        <Input type="textarea" rows={2} />
+                        )}
+                </FormItem>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="预算费用" >
+                        {getFieldDecorator('budgetCost', {
+                            initialValue: theData.budgetCost
+                        })(
+                            <InputNumber />
+                            )}
+                        <span style={{ marginLeft: '20px' }}>万元</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="费用托管" >
+                        {getFieldDecorator('costEscrow', {
+                            initialValue: theData.costEscrow
+                        })(
+                            <Radio.Group>
+                                <Radio value={0}>否</Radio>
+                                <Radio value={1}>是</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="有效期限" >
+                        {getFieldDecorator('validityPeriod', {
+                            initialValue: theData.validityPeriod ? moment(theData.validityPeriod) : null
+                        })(
+                            <DatePicker />
+                            )}
+                    </FormItem>
+                </div>
+                <FormItem wrapperCol={{ span: 12, offset: 3 }}>
+                    <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
+                    <Button className="set-submit" type="ghost" onClick={this.props.closeDesc}>取消</Button>
+                </FormItem>
+            </Form >
+        )
+    }
+}));
+
+const DemandDetail = React.createClass({
+    getInitialState() {
+        return {
+            visible: false
+        };
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    handleOk(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false, true);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc;
+    },
+    render() {
+        if (this.props.data) {
+            return (
+                <div className="patent-desc">
+                    <Modal maskClosable={false} title="用户需求详情" visible={this.state.visible}
+                        onOk={this.checkPatentProcess} onCancel={this.handleCancel}
+                        width='1000px'
+                        footer=''
+                        className="admin-desc-content">
+                        <DemandDetailForm
+                            data={this.props.data}
+                            detailApiUrl={this.props.detailApiUrl}
+                            companyOption={this.props.companyOption}
+                            userOption={this.props.userOption}
+                            demandTypeOption={this.props.demandTypeOption}
+                            closeDesc={this.handleCancel}
+                            visible={this.state.visible}
+                            handleOk={this.handleOk} />
+                    </Modal>
+                </div>
+            );
+        } else {
+            return <div></div>
+        }
+    },
+});
+
+export default DemandDetail;

+ 2 - 2
js/component/account/services/achievement.jsx

@@ -232,7 +232,7 @@ const AchievementDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="科技成果转化" visible={this.state.visible}
+                    <Modal maskClosable={false} title="科技成果转化" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -397,7 +397,7 @@ const Achievement = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/account/services/activity.jsx

@@ -372,7 +372,7 @@ const ActivityDesc = React.createClass({
     render() {
         return (
             <div className="admin-desc">
-                <Modal title="企业研究开发活动情况详情"
+                <Modal maskClosable={false} title="企业研究开发活动情况详情"
                     visible={this.state.visible}
                     onCancel={this.handleCancel}
                     width='800px'
@@ -580,7 +580,7 @@ const Activity = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/account/services/activityCostList.jsx

@@ -336,7 +336,7 @@ const ActivityDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="企业研究开发费用结构明细" visible={this.state.visible}
+                    <Modal maskClosable={false} title="企业研究开发费用结构明细" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -570,7 +570,7 @@ const Activity = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/account/services/annualReport.jsx

@@ -420,7 +420,7 @@ const AnnualReportDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="企业年报详情" visible={this.state.visible}
+                    <Modal maskClosable={false} title="企业年报详情" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='1000px'
                         footer=''
@@ -515,7 +515,7 @@ const AnnualReportAdd = React.createClass({
     render() {
         return (
             <div className="cognizance-add">
-                <Modal title="年报申请" visible={this.state.visible}
+                <Modal maskClosable={false} title="年报申请" visible={this.state.visible}
                     onOk={this.handleOk} onCancel={this.handleCancel}
                     width='800px'
                     footer={[

+ 2 - 2
js/component/account/services/cognizance.jsx

@@ -380,7 +380,7 @@ const CognizanceDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="高企管理" visible={this.state.visible}
+                    <Modal maskClosable={false} title="高企管理" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='1000px'
                         footer=''
@@ -483,7 +483,7 @@ const CognizanceAdd = React.createClass({
     render() {
         return (
             <div className="cognizance-add">
-                <Modal title="高企申请" visible={this.state.visible}
+                <Modal maskClosable={false} title="高企申请" visible={this.state.visible}
                     onOk={this.handleOk} onCancel={this.handleCancel}
                     width='800px'
                     footer={[

+ 46 - 147
js/component/account/services/contract/contract.jsx

@@ -1,7 +1,7 @@
 import React from 'react';
 import { Icon, Button, Input, Select, Spin, Table, DatePicker, message, Cascader, Switch, Modal } from 'antd';
-import { provinceArr, contractStateList, contractTypeList } from '../../../dataDic.js';
-import { getTime, companySearch, getContractState, getContractType, getInUrgentTime, getSearchUrl } from '../../../tools.js';
+import { contractStateList, contractTypeList } from '../../../dataDic.js';
+import { getTime, companySearch, getContractState, getContractType, getSearchUrl } from '../../../tools.js';
 import ajax from 'jquery/src/ajax/xhr.js';
 import $ from 'jquery/src/ajax';
 import ContractAdd from './contractAdd.jsx';
@@ -12,7 +12,6 @@ import './contract.less';
 
 const Contract = React.createClass({
     loadData(pageNo) {
-        this.state.data = [];
         this.setState({
             loading: true
         });
@@ -20,46 +19,45 @@ const Contract = React.createClass({
             method: "get",
             dataType: "json",
             crossDomain: false,
-            url: globalConfig.context + "/api/admin/contract/list",
+            url: globalConfig.context + "/api/user/contract/list",
             data: {
                 pageNo: pageNo || 1,
                 pageSize: this.state.pagination.pageSize,
-                province: this.state.province,
-                uid: this.state.unitId,
                 type: this.state.contractType,
                 status: this.state.contractState,
+                serialNumber: this.state.serialNumber,
                 startDateFormattedDate: this.state.startDateFormattedDate,
                 endDateFormattedDate: this.state.endDateFormattedDate,
             },
             success: function (data) {
-                if (data.error.length || !data.data || !data.data.list) {
-                    message.warning(data.error[0].message);
+                let theArr = [];
+                if (!data.data && !data.data.list) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
                     return;
                 };
                 for (let i = 0; i < data.data.list.length; i++) {
                     let thisdata = data.data.list[i];
-                    this.state.data.push({
+                    theArr.push({
                         key: i,
-                        completeDate: thisdata.completeDate,
-                        completeDateFormattedDate: thisdata.completeDateFormattedDate,
-                        contacts: thisdata.contacts,
-                        depict: thisdata.depict,
-                        founder: thisdata.founder,
                         id: thisdata.id,
-                        province: thisdata.province,
+                        uid: thisdata.uid,
+                        contacts: thisdata.contacts,
                         serialNumber: thisdata.serialNumber,
+                        type: thisdata.type,
                         signDate: thisdata.signDate,
-                        signDateFormattedDate: thisdata.signDateFormattedDate,
+                        depict: thisdata.depict,
                         status: thisdata.status,
-                        type: thisdata.type,
-                        uid: thisdata.uid,
-                        unitName: thisdata.unitName,
+                        completeDate: thisdata.completeDate,
+                        signDateFormattedDate: thisdata.signDateFormattedDate,
+                        completeDateFormattedDate: thisdata.completeDateFormattedDate
                     });
                 };
                 this.state.pagination.defaultCurrent = data.data.pageNo;
                 this.state.pagination.total = data.data.totalCount;
                 this.setState({
-                    dataSource: this.state.data,
+                    dataSource: theArr,
                     pagination: this.state.pagination
                 });
             }.bind(this),
@@ -69,103 +67,34 @@ const Contract = React.createClass({
             });
         }.bind(this));
     },
-    getAuthorList() {
-        this.setState({
-            loading: true
-        });
-        $.ajax({
-            method: "get",
-            dataType: "json",
-            crossDomain: false,
-            url: globalConfig.context + "/api/admin/contract/principal",
-            success: function (data) {
-                if (!data.data) {
-                    if (data.error && data.error.length) {
-                        message.warning(data.error[0].message);
-                    };
-                    return;
-                };
-                let _me = this, theArr = [];
-                for (var item in data.data) {
-                    theArr.push(
-                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
-                    )
-                };
-                this.setState({
-                    authorOption: theArr
-                });
-            }.bind(this),
-        }).always(function () {
-            this.setState({
-                loading: false
-            });
-        }.bind(this));
-    },
-    getCompanyList() {
-        this.setState({
-            loading: true
-        });
+    getContactsList() {
         $.ajax({
             method: "get",
             dataType: "json",
             crossDomain: false,
-            url: globalConfig.context + "/api/admin/getUnitNames",
+            url: globalConfig.context + "/api/user/cognizance/getContacts",
             success: function (data) {
+                let theOption = [];
                 if (data.error.length || !data.data) {
                     return;
                 };
-                let _me = this, theArr = [];
-                for (var item in data.data) {
-                    theArr.push(
-                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
-                    )
+                for (let item in data.data) {
+                    let theData = data.data[item];
+                    theOption.push(
+                        <Select.Option value={item} key={theData}>{theData}</Select.Option>
+                    );
                 };
                 this.setState({
-                    companyOption: theArr
+                    contactsOption: theOption,
+                    contactsList: data.data
                 });
             }.bind(this),
-        }).always(function () {
-            this.setState({
-                loading: false
-            });
-        }.bind(this));
-    },
-    getStateList() {
-        this.setState({
-            loading: true
         });
-        $.ajax({
-            method: "get",
-            dataType: "json",
-            crossDomain: false,
-            url: globalConfig.context + "/api/admin/contract/status",
-            success: function (data) {
-                if (!data.data) {
-                    if (data.error && data.error.length) {
-                        message.warning(data.error[0].message);
-                        return;
-                    };
-                };
-                let _me = this, theArr = [];
-                for (var item in data.data) {
-                    theArr.push(
-                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
-                    )
-                };
-                this.setState({
-                    statusOption: theArr
-                });
-            }.bind(this),
-        }).always(function () {
-            this.setState({
-                loading: false
-            });
-        }.bind(this));
     },
     getInitialState() {
         return {
             visible: false,
-            data: [],
+            contactsList: {},
             loading: false,
             showAdd: false,
             showDesc: false,
@@ -190,14 +119,6 @@ const Contract = React.createClass({
                     dataIndex: 'serialNumber',
                     key: 'serialNumber',
                 }, {
-                    title: '省份',
-                    dataIndex: 'province',
-                    key: 'province',
-                }, {
-                    title: '公司名称',
-                    dataIndex: 'unitName',
-                    key: 'unitName',
-                }, {
                     title: '签订时间',
                     dataIndex: 'signDateFormattedDate',
                     key: 'signDateFormattedDate',
@@ -212,13 +133,14 @@ const Contract = React.createClass({
                     key: 'type',
                     render: (text) => { return getContractType(text) }
                 }, {
-                    title: '创建人',
-                    dataIndex: 'founder',
-                    key: 'founder'
+                    title: '联系人',
+                    dataIndex: 'contacts',
+                    key: 'contacts',
+                    render: (text) => { return this.state.contactsList[text] }
                 }, {
-                    title: '技术员',
-                    dataIndex: 'techPrincipal',
-                    key: 'techPrincipal',
+                    title: '完成时间',
+                    dataIndex: 'completeDateFormattedDate',
+                    key: 'completeDateFormattedDate',
                 }, {
                     title: '描述',
                     dataIndex: 'describe',
@@ -229,12 +151,7 @@ const Contract = React.createClass({
         };
     },
     componentWillMount() {
-        let _me = this, pArr = [], tArr = [], sArr = [];
-        provinceArr.map(function (item) {
-            pArr.push(
-                <Select.Option value={item} key={item}>{item}</Select.Option>
-            )
-        });
+        let _me = this, tArr = [], sArr = [];
         contractTypeList.map(function (item) {
             tArr.push(
                 <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
@@ -246,14 +163,11 @@ const Contract = React.createClass({
             )
         });
         this.setState({
-            provinceOption: pArr,
             typeOption: tArr,
             stateOption: sArr
         });
         this.loadData();
-        this.getAuthorList();
-        this.getCompanyList();
-        this.getStateList();
+        this.getContactsList();
         // if (window.location.search) {
         //     let theArr = getSearchUrl(window.location.search);
         //     if (theArr.length > 1) {
@@ -287,8 +201,9 @@ const Contract = React.createClass({
         };
     },
     addClick() {
+        this.state.RowData = {};
         this.setState({
-            showAdd: true
+            showAdd: true,
         });
     },
     closeAdd(e, s) {
@@ -308,10 +223,9 @@ const Contract = React.createClass({
         this.loadData();
     },
     reset() {
-        this.state.province = undefined;
-        this.state.unitId = undefined;
         this.state.contractState = undefined;
         this.state.contractType = undefined;
+        this.state.serialNumber = undefined;
         this.state.startDateFormattedDate = [];
         this.state.endDateFormattedDate = [];
         this.loadData();
@@ -324,8 +238,7 @@ const Contract = React.createClass({
                     <div className="content-title">
                         <span>合同申请管理</span>
                         <ContractAdd
-                            companyOption={this.state.companyOption}
-                            authorOption={this.state.authorOption}
+                            contactsOption={this.state.contactsOption}
                             typeOption={this.state.typeOption}
                             data={this.state.RowData}
                             onClick={this.addClick}
@@ -333,22 +246,9 @@ const Contract = React.createClass({
                             closeAdd={this.closeAdd} />
                     </div>
                     <div className="foster-query">
-                        <Select placeholder="选择省份"
-                            style={{ width: 100 }}
-                            value={this.state.province}
-                            showSearch
-                            filterOption={companySearch}
-                            onChange={(e) => { this.setState({ province: e }) }}>
-                            {this.state.provinceOption}
-                        </Select>
-                        <Select placeholder="选择公司"
-                            style={{ width: 200 }}
-                            value={this.state.unitId}
-                            showSearch
-                            filterOption={companySearch}
-                            onChange={(e) => { this.setState({ unitId: e }) }}>
-                            {this.state.companyOption}
-                        </Select>
+                        <Input value={this.state.serialNumber}
+                            placeholder="输入合同编号"
+                            onChange={(e) => { this.setState({ serialNumber: e.target.value }); }} />
                         <Select placeholder="选择一个合同类型"
                             style={{ width: 200 }}
                             value={this.state.contractType}
@@ -358,7 +258,7 @@ const Contract = React.createClass({
                             {this.state.typeOption}
                         </Select>
                         <Select style={{ width: 120 }}
-                            value={this.state.searchStatus}
+                            value={this.state.contractState}
                             onChange={(e) => { this.setState({ contractState: e }) }}
                             placeholder="选择一个状态">
                             {this.state.stateOption}
@@ -391,7 +291,6 @@ const Contract = React.createClass({
                     </div>
                     <ContractDetail
                         data={this.state.RowData}
-                        authorOption={this.state.authorOption}
                         statusOption={this.state.statusOption}
                         showDesc={this.state.showDesc}
                         closeDesc={this.closeDesc} />

+ 14 - 86
js/component/account/services/contract/contractAdd.jsx

@@ -6,29 +6,6 @@ import ajax from 'jquery/src/ajax/xhr.js'
 import $ from 'jquery/src/ajax';
 
 const ContractAddFrom = Form.create()(React.createClass({
-    getContactsList() {
-        $.ajax({
-            method: "get",
-            dataType: "json",
-            crossDomain: false,
-            url: globalConfig.context + "/api/user/cognizance/getContacts",
-            success: function (data) {
-                let theOption = [];
-                if (data.error.length || !data.data) {
-                    return;
-                };
-                for (let item in data.data) {
-                    let theData = data.data[item];
-                    theOption.push(
-                        <Select.Option value={item} key={theData}>{theData}</Select.Option>
-                    );
-                };
-                this.setState({
-                    contactsOption: theOption
-                });
-            }.bind(this),
-        });
-    },
     getInitialState() {
         return {
             loading: false,
@@ -47,7 +24,7 @@ const ContractAddFrom = Form.create()(React.createClass({
             dataType: "json",
             crossDomain: false,
             cache: false,
-            url: globalConfig.context + "/api/admin/contract/detail",
+            url: globalConfig.context + "/api/user/contract/detail",
             data: {
                 id: id || this.props.data.id
             }
@@ -80,8 +57,7 @@ const ContractAddFrom = Form.create()(React.createClass({
             )
         };
         this.state.yearOption = theArr;
-        if (this.props.data.id) {
-            this.getContactsList();
+        if (this.props.data && this.props.data.id) {
             this.loadData(this.props.data.id);
         } else {
             this.state.data = {};
@@ -93,8 +69,7 @@ const ContractAddFrom = Form.create()(React.createClass({
     },
     componentWillReceiveProps(nextProps) {
         if (!this.props.visible && nextProps.visible) {
-            if (nextProps.data.id) {
-                this.getContactsList();
+            if (nextProps.data && nextProps.data.id) {
                 this.loadData(nextProps.data.id);
             } else {
                 this.state.data = {};
@@ -115,9 +90,8 @@ const ContractAddFrom = Form.create()(React.createClass({
                     method: "POST",
                     dataType: "json",
                     crossDomain: false,
-                    url: globalConfig.context + "/api/admin/contract/apply",
+                    url: globalConfig.context + (this.state.data.id ? "/api/user/contract/update" : "/api/user/contract/apply"),
                     data: {
-                        "uid": this.state.data.uid || values.uid,
                         "id": this.state.data.id,
                         "contacts": values.contacts, //联系人
                         "type": values.type, //合同类型
@@ -157,11 +131,6 @@ const ContractAddFrom = Form.create()(React.createClass({
                 <div className="clearfix">
                     <FormItem className="half-item"
                         {...formItemLayout}
-                        label="公司名称" >
-                        <span>{theData.unitName}</span>
-                    </FormItem>
-                    <FormItem className="half-item"
-                        {...formItemLayout}
                         label="联系人" >
                         {getFieldDecorator('contacts', {
                             initialValue: theData.contacts
@@ -169,7 +138,7 @@ const ContractAddFrom = Form.create()(React.createClass({
                             <Select placeholder="请选择联系人"
                                 style={{ width: 260 }}
                                 notFoundContent="未获取到联系人列表">
-                                {this.state.contactsOption}
+                                {this.props.contactsOption}
                             </Select>
                             )}
                     </FormItem>
@@ -199,7 +168,7 @@ const ContractAddFrom = Form.create()(React.createClass({
                         )}
                 </FormItem>
                 <div className="clearfix">
-                    <span style={{ float: "left", lineHeight: '32px', marginLeft: '50px' }}>
+                    <span style={{ float: "left", lineHeight: '32px', marginRight: '20px' }}>
                         <Checkbox checked={this.state.highTechCheck} onChange={(e) => {
                             this.setState({ highTechCheck: e.target.checked });
                         }}></Checkbox>
@@ -219,7 +188,7 @@ const ContractAddFrom = Form.create()(React.createClass({
                     </FormItem>
                 </div>
                 <div className="clearfix">
-                    <span style={{ float: "left", lineHeight: '32px', marginLeft: '50px' }}>
+                    <span style={{ float: "left", lineHeight: '32px', marginRight: '20px' }}>
                         <Checkbox checked={this.state.patentCheck} onChange={(e) => {
                             this.setState({ patentCheck: e.target.checked });
                         }}></Checkbox>
@@ -235,7 +204,7 @@ const ContractAddFrom = Form.create()(React.createClass({
                     </FormItem>
                 </div>
                 <div className="clearfix">
-                    <span style={{ float: "left", lineHeight: '32px', marginLeft: '50px' }}>
+                    <span style={{ float: "left", lineHeight: '32px', marginRight: '20px' }}>
                         <Checkbox checked={this.state.copyrightCheck} onChange={(e) => {
                             this.setState({ copyrightCheck: e.target.checked });
                         }}></Checkbox>
@@ -251,7 +220,7 @@ const ContractAddFrom = Form.create()(React.createClass({
                     </FormItem>
                 </div>
                 <div className="clearfix">
-                    <span style={{ float: "left", lineHeight: '32px', marginLeft: '50px' }}>
+                    <span style={{ float: "left", lineHeight: '32px', marginRight: '20px' }}>
                         <Checkbox checked={this.state.techProjectCheck} onChange={(e) => {
                             this.setState({ techProjectCheck: e.target.checked });
                         }}></Checkbox>
@@ -266,43 +235,6 @@ const ContractAddFrom = Form.create()(React.createClass({
                             )}
                     </FormItem>
                 </div>
-                <div className="clearfix">
-                    <FormItem className="half-item"
-                        {...formItemLayout}
-                        label={"审核人"} >
-                        {getFieldDecorator('principals')(
-                            <Select
-                                placeholder="请选择审核人"
-                                notFoundContent="未找到"
-                                style={{ width: 260 }}
-                                showSearch
-                                multiple
-                                filterOption={companySearch} >
-                                {this.props.authorOption}
-                            </Select>
-                        )}
-                    </FormItem>
-                    <FormItem className="half-item"
-                        {...formItemLayout}
-                        label="处理时间"
-                    >
-                        {getFieldDecorator('recordTime')(
-                            <DatePicker />
-                        )}
-                    </FormItem>
-                </div>
-                <FormItem
-                    labelCol={{ span: 3 }}
-                    wrapperCol={{ span: 19 }}
-                    label="备注" >
-                    {getFieldDecorator('comment', {
-                        initialValue: theData.comment
-                    })(
-                        <Input type="textarea"
-                            placeholder="多行输入"
-                            rows={2} />
-                        )}
-                </FormItem>
                 <FormItem style={{ paddingLeft: '40px' }}>
                     <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
                     <Button type="ghost" style={{ marginLeft: '20px' }} onClick={this.props.closeModal}>取消</Button>
@@ -334,9 +266,6 @@ const ContractAdd = React.createClass({
         this.props.closeAdd(false);
     },
     componentWillReceiveProps(nextProps) {
-        if (nextProps.showAdd && nextProps.data) {
-            this.state.data = nextProps.data;
-        };
         this.state.visible = nextProps.showAdd;
     },
     spinChange(e) {
@@ -347,9 +276,9 @@ const ContractAdd = React.createClass({
     render() {
         return (
             <div className="patent-addNew">
-                <Button className="patent-addNew" type="primary" onClick={this.showModal}>申请合同<Icon type="plus" /></Button>
+                <Button className="patent-addNew" type="primary" onClick={this.props.onClick}>申请合同<Icon type="plus" /></Button>
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="合同详情"
+                    <Modal maskClosable={false} title="合同详情"
                         visible={this.state.visible}
                         onCancel={this.handleCancel}
                         width='800px'
@@ -359,11 +288,10 @@ const ContractAdd = React.createClass({
                             spinState={this.spinChange}
                             closeModal={this.handleCancel}
                             visible={this.state.visible}
-                            data={this.state.data}
+                            data={this.props.data}
                             okClick={() => { this.props.closeAdd(false, true) }}
-                            companyOption={this.props.companyOption}
-                            authorOption={this.props.authorOption}
-                            typeOption={this.props.typeOption} />
+                            typeOption={this.props.typeOption}
+                            contactsOption={this.props.contactsOption} />
                     </Modal>
                 </Spin>
             </div>

+ 9 - 9
js/component/account/services/contract/contractDetail.jsx

@@ -5,7 +5,7 @@ import ajax from 'jquery/src/ajax/xhr.js';
 import $ from 'jquery/src/ajax';
 import moment from 'moment';
 import { copyrightStateList } from '../../../dataDic.js';
-import { companySearch, getCopyrightState, getPatentType, getPatentState, gethighTechState, getTechnologyState } from '../../../tools.js';
+import { companySearch, getCopyrightState, getPatentType, getPatentState, getCognizanceState, getTechnologyState } from '../../../tools.js';
 
 const ContractDetailForm = Form.create()(React.createClass({
     getInitialState() {
@@ -129,7 +129,7 @@ const ContractDetailForm = Form.create()(React.createClass({
                     title: '申请状态',
                     dataIndex: 'state',
                     key: 'state',
-                    render: (text) => { return gethighTechState(text) },
+                    render: (text) => { return getCognizanceState(text) },
                     width: 200
                 }, {
                     title: '证书编号',
@@ -187,7 +187,7 @@ const ContractDetailForm = Form.create()(React.createClass({
             dataType: "json",
             crossDomain: false,
             cache: false,
-            url: globalConfig.context + "/api/admin/contract/log",
+            url: globalConfig.context + "/api/user/contract/log",
             data: {
                 cid: id || this.props.data.id
             }
@@ -196,7 +196,7 @@ const ContractDetailForm = Form.create()(React.createClass({
             dataType: "json",
             crossDomain: false,
             cache: false,
-            url: globalConfig.context + "/api/admin/contract/detail",
+            url: globalConfig.context + "/api/user/contract/detail",
             data: {
                 id: id || this.props.data.id
             }
@@ -244,7 +244,7 @@ const ContractDetailForm = Form.create()(React.createClass({
             dataType: "json",
             crossDomain: false,
             cache: false,
-            url: globalConfig.context + "/api/admin/contract/techProject",
+            url: globalConfig.context + "/api/user/contract/techProject",
             data: {
                 contractId: id || this.props.data.id
             }
@@ -253,7 +253,7 @@ const ContractDetailForm = Form.create()(React.createClass({
             dataType: "json",
             crossDomain: false,
             cache: false,
-            url: globalConfig.context + "/api/admin/contract/cognizance",
+            url: globalConfig.context + "/api/user/contract/cognizance",
             data: {
                 contractId: id || this.props.data.id
             }
@@ -262,7 +262,7 @@ const ContractDetailForm = Form.create()(React.createClass({
             dataType: "json",
             crossDomain: false,
             cache: false,
-            url: globalConfig.context + "/api/admin/contract/copyright",
+            url: globalConfig.context + "/api/user/contract/copyright",
             data: {
                 contractId: id || this.props.data.id
             }
@@ -271,7 +271,7 @@ const ContractDetailForm = Form.create()(React.createClass({
             dataType: "json",
             crossDomain: false,
             cache: false,
-            url: globalConfig.context + "/api/admin/contract/patent",
+            url: globalConfig.context + "/api/user/contract/patent",
             data: {
                 contractId: id || this.props.data.id
             }
@@ -559,7 +559,7 @@ const ContractDetail = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="合同详情" visible={this.state.visible}
+                    <Modal maskClosable={false} title="合同详情" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='1000px'
                         footer=''

+ 1 - 1
js/component/account/services/copyright/comPatentAdd.jsx

@@ -197,7 +197,7 @@ const PatentAdd = React.createClass({
             <div className="patent-addNew">
                 <Button className="patent-addNew" type="primary" onClick={this.showModal}>申请新软著<Icon type="plus" /></Button>
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="申请新软著"
+                    <Modal maskClosable={false} title="申请新软著"
                         visible={this.state.visible}
                         onCancel={this.handleCancel}
                         width='800px'

+ 26 - 16
js/component/account/services/copyright/comPatentChange.jsx

@@ -201,23 +201,33 @@ const CopyrightDescForm = Form.create()(React.createClass({
         const { getFieldDecorator } = this.props.form;
         const theData = this.state;
         const formItemLayout = {
-            labelCol: { span: 6 },
-            wrapperCol: { span: 12 },
+            labelCol: { span: 8 },
+            wrapperCol: { span: 16 },
         };
         const _me = this;
         return (
             <Form onSubmit={this.handleSubmit} id="CopyrightDesc-form">
-                <Row className="express-desc-row">
-                    <Col span={4}>公司名称</Col>
-                    <Col span={8}>{theData.unitName}</Col>
-                    <Col span={4}>组织机构代码</Col>
-                    <Col span={8}>{theData.unitNumber}</Col>
-                </Row>
-                <Row className="express-desc-row">
-                    <Col span={4}>公司地址</Col>
-                    <Col span={8}>{theData.province}/{theData.city}/{theData.area}</Col>
-                    <Col span={4}>联系人</Col>
-                    <Col span={8}>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="公司名称" >
+                        <span>{theData.unitName}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="组织机构代码" >
+                        <span>{theData.unitNumber}</span>
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="公司地址" >
+                        <span>{theData.postalAddress}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="联系人" >
                         {getFieldDecorator('contact', {
                             rules: [{ required: true, message: '此项为必填项!' }],
                             initialValue: theData.contact
@@ -228,8 +238,8 @@ const CopyrightDescForm = Form.create()(React.createClass({
                                 {this.state.contactsOption}
                             </Select>
                             )}
-                    </Col>
-                </Row>
+                    </FormItem>
+                </div>
                 <Row className="express-desc-row">
                     <Col span={4}>编号</Col>
                     <Col span={8}>{theData.serialNumber}</Col>
@@ -415,7 +425,7 @@ const CopyrightDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="软著详情" visible={this.state.visible}
+                    <Modal maskClosable={false} title="软著详情" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''

+ 2 - 2
js/component/account/services/finance.jsx

@@ -358,7 +358,7 @@ const FinanceDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="财务报表信息" visible={this.state.visible}
+                    <Modal maskClosable={false} title="财务报表信息" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -522,7 +522,7 @@ const Finance = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/account/services/honorList.jsx

@@ -185,7 +185,7 @@ const HonorListDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="企业荣誉及其他证明材料" visible={this.state.visible}
+                    <Modal maskClosable={false} title="企业荣誉及其他证明材料" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -327,7 +327,7 @@ const HonorList = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 1 - 1
js/component/account/services/intellectual.jsx

@@ -149,7 +149,7 @@ const Intellectual = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 1 - 1
js/component/account/services/intellectualDesc.jsx

@@ -279,7 +279,7 @@ const intellectualDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="知识产权详情" visible={this.state.visible}
+                    <Modal maskClosable={false} title="知识产权详情" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='600px'
                         footer=''

+ 1 - 1
js/component/account/services/orgList.jsx

@@ -60,7 +60,7 @@ const OrgAdd = React.createClass({
         return (
             <div className="patent-desc" style={{ float: 'right', marginRight: '20px' }}>
                 <Button type="primary" onClick={this.showModal}>添加用户</Button>
-                <Modal title="新增团体用户" visible={this.state.visible}
+                <Modal maskClosable={false} title="新增团体用户" visible={this.state.visible}
                     onCancel={this.handleCancel}
                     width='350px'
                     footer={[

+ 2 - 2
js/component/account/services/orgTechCenter.jsx

@@ -183,7 +183,7 @@ const CenterListDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="产学研情况详情" visible={this.state.visible}
+                    <Modal maskClosable={false} title="产学研情况详情" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -367,7 +367,7 @@ const CenterList = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 1 - 1
js/component/account/services/patentAdd.jsx

@@ -223,7 +223,7 @@ const PatentAdd = React.createClass({
             <div className="patent-addNew">
                 <Button disabled={this.props.ButtonDisabled} className="patent-addNew" type="primary" onClick={this.showModal}>申请新专利<Icon type="plus" /></Button>
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="新专利申请" visible={this.state.visible}
+                    <Modal maskClosable={false} title="新专利申请" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='720px'
                         footer=''

+ 1 - 1
js/component/account/services/patentDesc.jsx

@@ -92,7 +92,7 @@ const PatentDesc = React.createClass({
             return (
                 <div className="patent-desc">
                     <Spin spinning={this.state.loading} className='spin-box'>
-                        <Modal title="专利详情" visible={this.state.visible}
+                        <Modal maskClosable={false} title="专利详情" visible={this.state.visible}
                             onOk={this.handleOk} onCancel={this.handleCancel}
                             width='800px'
                             footer=''

+ 2 - 2
js/component/account/services/ratepay.jsx

@@ -310,7 +310,7 @@ const RatepayDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="所得税纳税申报信息" visible={this.state.visible}
+                    <Modal maskClosable={false} title="所得税纳税申报信息" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -463,7 +463,7 @@ const Ratepay = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/account/services/standard.jsx

@@ -91,7 +91,7 @@ const StandardDesc = React.createClass({
         if (this.props.data) {
             return (
                 <div className="admin-desc">
-                    <Modal title="企业参与国家标准或行业标准制定情况明细" visible={this.state.visible} onCancel={this.handleCancel}
+                    <Modal maskClosable={false} title="企业参与国家标准或行业标准制定情况明细" visible={this.state.visible} onCancel={this.handleCancel}
                         width='400px' footer={[
                             <Button key="submit" type="primary" size="large" loading={this.state.loading} onClick={this.handleOk}>确认</Button>,
                             <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>
@@ -319,7 +319,7 @@ const Standard = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/account/services/techProduct.jsx

@@ -302,7 +302,7 @@ const TechProductDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="上年度高新技术产品(服务)情况表" visible={this.state.visible}
+                    <Modal maskClosable={false} title="上年度高新技术产品(服务)情况表" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='1000px'
                         footer=''
@@ -501,7 +501,7 @@ const TechProduct = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 1 - 1
js/component/account/services/technology.jsx

@@ -217,7 +217,7 @@ const Technology = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 1 - 1
js/component/account/services/technologyAdd.jsx

@@ -86,7 +86,7 @@ const ApplyAdd = React.createClass({
     render() {
         return (
             <div className="cognizance-add">
-                <Modal title="新科技项目申请" visible={this.state.visible}
+                <Modal maskClosable={false} title="新科技项目申请" visible={this.state.visible}
                     onOk={this.handleOk} onCancel={this.handleCancel}
                     width='800px'
                     footer={[

+ 1 - 1
js/component/account/services/technologyChange.jsx

@@ -374,7 +374,7 @@ const ApplyChange = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="编辑科技项目" visible={this.state.visible}
+                    <Modal maskClosable={false} title="编辑科技项目" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='1000px'
                         footer=''

+ 5 - 1
js/component/account/set/ablt.jsx

@@ -88,7 +88,7 @@ const Base = React.createClass({
             tags: []
         };
     },
-    componentWillMount() {
+    loadData() {
         this.setState({
             loading: true
         });
@@ -114,6 +114,9 @@ const Base = React.createClass({
             });
         }.bind(this));
     },
+    componentWillMount() {
+        this.loadData();
+    },
     getTagsArr(e) {
         this.state.tags = e.slice(1);
     },
@@ -138,6 +141,7 @@ const Base = React.createClass({
         }).done(function (data) {
             if (!data.error.length) {
                 message.success('保存成功!');
+                this.loadData();
             } else {
                 message.warning(data.error[0].message);
             }

+ 1 - 0
js/component/account/set/base.jsx

@@ -139,6 +139,7 @@ const BaseFrom = Form.create()(React.createClass({
                 }).done(function (data) {
                     if (!data.error.length) {
                         message.success('保存成功!');
+                        this.getData();
                     } else {
                         message.warning(data.error[0].message);
                     }

+ 1 - 1
js/component/account/set/changeMobile.jsx

@@ -101,7 +101,7 @@ const ChangePw = React.createClass({
         return (
             <div style={{ 'float': 'left', 'marginTop': '0' }}>
                 <Button type="ghost" onClick={this.showModal}>更换手机</Button>
-                <Modal className="change-modal" title="更换手机号码" visible={this.state.visible}
+                <Modal maskClosable={false} className="change-modal" title="更换手机号码" visible={this.state.visible}
                     onOk={this.handleOk} onCancel={this.handleCancel}
                     width={360}
                     footer={[

+ 1 - 1
js/component/account/set/changePassword.jsx

@@ -58,7 +58,7 @@ const ChangePw = React.createClass({
         return (
             <div style={{ 'float': 'left','marginTop':'0' }}>
                 <Button type="primary" onClick={this.showModal}>修改密码</Button>
-                <Modal className="change-modal" title="设置新密码" visible={this.state.visible}
+                <Modal maskClosable={false} className="change-modal" title="设置新密码" visible={this.state.visible}
                     onOk={this.handleOk} onCancel={this.handleCancel}
                     width={360}
                     footer={[

+ 2 - 1
js/component/account/set/company.jsx

@@ -100,7 +100,7 @@ class PicturesWall extends React.Component {
                 >
                     {fileList.length >= 9 ? null : uploadButton}
                 </Upload>
-                <Modal visible={previewVisible} footer={null} onCancel={this.handleCancel}>
+                <Modal maskClosable={false} visible={previewVisible} footer={null} onCancel={this.handleCancel}>
                     <img alt="example" style={{ width: '100%' }} src={previewImage} />
                 </Modal>
             </div>
@@ -224,6 +224,7 @@ const PersonFrom = Form.create()(React.createClass({
                 }).done(function (data) {
                     if (!data.error.length) {
                         message.success('保存成功!');
+                        this.getData();
                     } else {
                         message.warning(data.error[0].message);
                     }

+ 1 - 0
js/component/account/set/edu.jsx

@@ -133,6 +133,7 @@ const EduFrom = Form.create()(React.createClass({
                 }).done(function (data) {
                     if (!data.error.length) {
                         message.success('保存成功!');
+                        this.getData();
                     } else {
                         message.warning(data.error[0].message);
                     }

+ 1 - 0
js/component/account/set/group.jsx

@@ -82,6 +82,7 @@ const BaseFrom = Form.create()(React.createClass({
                 }).done(function (data) {
                     if (!data.error.length) {
                         message.success('保存成功!');
+                        this.getData();
                     } else {
                         message.warning(data.error[0].message);
                     }

+ 2 - 2
js/component/account/set/hrSituation.jsx

@@ -557,7 +557,7 @@ const HrSituationDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="人力资源状况" visible={this.state.visible}
+                    <Modal maskClosable={false} title="人力资源状况" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='1200px'
                         footer=''
@@ -741,7 +741,7 @@ const HrSituation = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 1
js/component/account/set/person.jsx

@@ -102,7 +102,7 @@ class PicturesWall extends React.Component {
                 >
                     {fileList.length >= 9 ? null : uploadButton}
                 </Upload>
-                <Modal visible={previewVisible} footer={null} onCancel={this.handleCancel}>
+                <Modal maskClosable={false} visible={previewVisible} footer={null} onCancel={this.handleCancel}>
                     <img alt="example" style={{ width: '100%' }} src={previewImage} />
                 </Modal>
             </div>
@@ -193,6 +193,7 @@ const PersonFrom = Form.create()(React.createClass({
                 }).done(function (data) {
                     if (!data.error.length) {
                         message.success('保存成功!');
+                        this.getData();
                     } else {
                         message.warning(data.error[0].message);
                     }

+ 1 - 0
js/component/account/set/pfs.jsx

@@ -123,6 +123,7 @@ const PfsFrom = Form.create()(React.createClass({
                 }).done(function (data) {
                     if (!data.error.length) {
                         message.success('保存成功!');
+                        this.getData();
                     } else {
                         message.warning(data.error[0].message);
                     }

+ 1 - 0
js/component/account/set/tech.jsx

@@ -60,6 +60,7 @@ const TechFrom = Form.create()(React.createClass({
                 }).done(function (data) {
                     if (!data.error.length) {
                         message.success('保存成功!');
+                        this.getData();
                     } else {
                         message.warning(data.error[0].message);
                     }

+ 3 - 3
js/component/account/topTab.jsx

@@ -39,9 +39,9 @@ const TopTab = React.createClass({
                     <Row>
                         <Col className={this.props.active === 'set' ? 'active' : ''} span={3}><a href={globalConfig.context + "/user/account/set.html"}>账号设置</a></Col>
                         <Col className={this.props.active === 'services' ? 'active' : ''} span={3}><a href={globalConfig.context + "/user/account/services.html"}>科技服务</a></Col>
-                        <Col className={this.props.active === 'achievement' ? 'active' : ''} span={3}><a href="./set.html">科技成果</a></Col>
-                        <Col className={this.props.active === 'demand' ? 'active' : ''} span={3}><a href="./set.html">科技需求</a></Col>
-                        <Col className={this.props.active === 'idea' ? 'active' : ''} span={3}><a href="./set.html">科技思想</a></Col>
+                        <Col className={this.props.active === 'achievement' ? 'active' : ''} span={3}><a href={globalConfig.context + "/user/account/achievement.html"}>科技成果</a></Col>
+                        <Col className={this.props.active === 'demand' ? 'active' : ''} span={3}><a href={globalConfig.context + "/user/account/demand.html"}>科技需求</a></Col>
+                        <Col className={this.props.active === 'idea' ? 'active' : ''} span={3}><a href={globalConfig.context + "/user/account/idea.html"}>科技思想</a></Col>
                     </Row>
                 </div>
             </div >

+ 47 - 0
js/component/dataDic.js

@@ -614,5 +614,52 @@ module.exports = {
             value: "4",
             key: "作废"
         }
+    ],
+    //需求类型
+    demandTypeList:[
+        {
+            value: "0",
+            key: "技术购买型需求"
+        }, {
+            value: "1",
+            key: "技术设备类需求"
+        }, {
+            value: "2",
+            key: "技术方案型需求"
+        }, {
+            value: "3",
+            key: "技术攻关型需求"
+        }, {
+            value: "4",
+            key: "技术咨询型需求"
+        }, {
+            value: "5",
+            key: "技术人才型需求"
+        }
+    ],
+    //成果数据类型
+    achievementCategoryList:[
+        {
+            value: "0",
+            key: "专利"
+        }, {
+            value: "1",
+            key: "软著"
+        }, {
+            value: "2",
+            key: "项目"
+        }, {
+            value: "3",
+            key: "版权"
+        }, {
+            value: "4",
+            key: "工业设计"
+        }, {
+            value: "5",
+            key: "配方"
+        }, {
+            value: "6",
+            key: "非标"
+        }
     ]
 };

+ 2 - 2
js/component/login/forgetPw.jsx

@@ -129,7 +129,7 @@ const ChangePw = React.createClass({
         return (
             <div style={{ 'float': 'right', 'marginTop': '0' }}>
                 <a className="login-form-forgot" onClick={this.showModal}>忘记密码</a>
-                <Modal key='1' className="change-modal" title="忘记密码" visible={this.state.forgetPw}
+                <Modal maskClosable={false} key='1' className="change-modal" title="忘记密码" visible={this.state.forgetPw}
                     onOk={this.forgetPwOk} onCancel={this.handleCancel}
                     width={360}
                     footer={[
@@ -144,7 +144,7 @@ const ChangePw = React.createClass({
                         <Button key="getCodeBtn" onClick={this.getMCode} disabled={this.state.getCodeButton}>获取验证码</Button>
                     </p>
                 </Modal>
-                <Modal key='2' className="change-modal" title="设置新密码" visible={this.state.setPw}
+                <Modal maskClosable={false} key='2' className="change-modal" title="设置新密码" visible={this.state.setPw}
                     onOk={this.setPwOk} onCancel={this.handleCancel}
                     width={360}
                     footer={[

+ 47 - 0
js/component/manageCenter/achievement/content.jsx

@@ -0,0 +1,47 @@
+import React, { Component } from 'react';
+import '../content.less';
+import LeftTab from './leftTab';
+import TechAchievement from './techAchievement';
+
+
+class Content extends Component {
+    constructor() {
+        super();
+        this.state = {
+            loading: false,
+            component: 'div'
+        };
+    }
+    componentWillMount() {
+        if (window.location.hash) {
+            this.getKey(window.location.hash.substr(1));
+        } else {
+            this.getKey("techAchievement");
+        };
+    }
+    getKey(key) {
+        switch (key) {
+            case 'techAchievement':
+                require.ensure([], () => {
+                    const TechDemand = require('./techAchievement').default;
+                    this.setState({
+                        component: TechAchievement
+                    });
+                });
+                break;
+        };
+        window.location.hash = key;
+    }
+    render() {
+        return (
+            <div className="manage-content">
+                <LeftTab handlekey={this.getKey.bind(this)} />
+                <div className="content-right">
+                    <this.state.component />
+                </div>
+            </div>
+        )
+    }
+}
+
+export default Content;

+ 40 - 0
js/component/manageCenter/achievement/leftTab.jsx

@@ -0,0 +1,40 @@
+import React from 'react';
+import { Menu, Icon } from 'antd';
+import '../leftTab.less';
+const SubMenu = Menu.SubMenu;
+const MenuItemGroup = Menu.ItemGroup;
+
+
+const LeftTab = React.createClass({
+    getInitialState() {
+        return {
+            current: 'techAchievement'
+        };
+    },
+    handleClick(e) {
+        this.props.handlekey(e.key);
+        this.setState({
+            current: e.key,
+        });
+    },
+    componentWillMount() {
+        if (window.location.hash) {
+            this.state.current = window.location.hash.substr(1);
+        };
+    },
+    render() {
+        return (
+            <Menu onClick={this.handleClick}
+                selectedKeys={[this.state.current]}
+                mode="vertical"
+                className="account-left"
+            >
+                <Menu.Item key="techAchievement">
+                    科技成果列表
+                </Menu.Item>
+            </Menu>
+        );
+    },
+});
+
+export default LeftTab;

+ 325 - 0
js/component/manageCenter/achievement/techAchievement.jsx

@@ -0,0 +1,325 @@
+import React from 'react';
+import { Icon, Button, Input, Select, Spin, Table, Switch, message, DatePicker, Modal } from 'antd';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import moment from 'moment';
+import './techAchievement.less';
+import TechAchievementDesc from './techAchievementDesc.jsx';
+import { provinceArr, achievementCategoryList } from '../../dataDic.js';
+import { companySearch, getAchievementCategory } from '../../tools.js';
+
+const AchievementList = React.createClass({
+    loadData(pageNo) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + '/api/admin/achievement/list',
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                serialNumber: this.state.serialNumber, //编号
+                name: this.state.name, //名称
+                keyword: this.state.keyword, // 关键词
+                category: this.state.category, //类型(0--专利, 2--软著, 3--项目, 4--版权, 5--工业设计, 6--配方, 7--非标)
+                ownerType: this.state.ownerType, //所有人类型(0-个人,1-组织)
+                status: this.state.status ? Number(this.state.status) : undefined, //状态
+                releaseDateStartDate: this.state.releaseDate[0],
+                releaseDateEndDate: this.state.releaseDate[1],
+                releaseStatus: this.state.releaseStatus ? Number(this.state.releaseStatus) : undefined, //是否发布(0--未发布,1--已发布)
+            },
+            success: function (data) {
+                let theArr = [];
+                if (!data.data && !data.data.list) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                } else {
+                    for (let i = 0; i < data.data.list.length; i++) {
+                        let thisdata = data.data.list[i];
+                        theArr.push({
+                            key: i,
+                            id: thisdata.id,
+                            serialNumber: thisdata.serialNumber,
+                            dataCategory: thisdata.dataCategory,
+                            name: thisdata.name,
+                            keyword: thisdata.keyword,
+                            category: thisdata.category,
+                            ownerName: thisdata.ownerName,
+                            ownerType: thisdata.ownerType,
+                            ownerMobile: thisdata.ownerMobile,
+                            status: thisdata.status,
+                            releaseDate: thisdata.releaseDate,
+                            releaseDateFormattedDate: thisdata.releaseDateFormattedDate
+                        });
+                    };
+                }
+                this.state.pagination.current = data.data.pageNo;
+                this.state.pagination.total = data.data.totalCount;
+                this.setState({
+                    dataSource: theArr,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            searchMore: true,
+            validityPeriodDate: [],
+            releaseDate: [],
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: false,
+            pagination: {
+                defaultCurrent: 1,
+                defaultPageSize: 10,
+                showQuickJumper: true,
+                pageSize: 10,
+                onChange: function (page) {
+                    this.loadData(page);
+                }.bind(this),
+                showTotal: function (total) {
+                    return '共' + total + '条数据';
+                }
+            },
+            columns: [
+                {
+                    title: '编号',
+                    dataIndex: 'serialNumber',
+                    key: 'serialNumber',
+                }, {
+                    title: '名称',
+                    dataIndex: 'name',
+                    key: 'name',
+                }, {
+                    title: '关键字',
+                    dataIndex: 'keyword',
+                    key: 'keyword',
+                }, {
+                    title: '类型',
+                    dataIndex: 'category',
+                    key: 'category',
+                    render: text => { return getAchievementCategory(text); }
+                }, {
+                    title: '所有人名称',
+                    dataIndex: 'ownerName',
+                    key: 'ownerName',
+                }, {
+                    title: '所有人类型',
+                    dataIndex: 'ownerType',
+                    key: 'ownerType',
+                    render: text => {
+                        switch (text) {
+                            case "0":
+                                return <span>个人</span>;
+                            case "1":
+                                return <span>组织</span>
+                        }
+                    }
+                }, {
+                    title: '所有人联系方式',
+                    dataIndex: 'ownerMobile',
+                    key: 'ownerMobile',
+                }, {
+                    title: '状态',
+                    dataIndex: 'status',
+                    key: 'status',
+                    render: text => {
+                        switch (text) {
+                            case "0":
+                                return <span>进行中</span>;
+                            case "1":
+                                return <span>未解决</span>;
+                            case "2":
+                                return <span>已解决</span>;
+                        }
+                    }
+                }, {
+                    title: '发布时间',
+                    dataIndex: 'releaseDateFormattedDate',
+                    key: 'releaseDateFormattedDate',
+                }
+            ],
+            dataSource: [],
+            searchTime: [,]
+        };
+    },
+    componentWillMount() {
+        let theArr = [];
+        achievementCategoryList.map(function (item) {
+            theArr.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        this.state.achievementCategoryOption = theArr;
+        this.loadData();
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true
+        });
+    },
+    delectRow() {
+        let deletedIds = [];
+        for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
+            let rowItem = this.state.selectedRows[idx];
+            if (rowItem.id) {
+                deletedIds.push(rowItem.id)
+            };
+        };
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/achievement/delete",
+            data: {
+                ids: deletedIds
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('删除成功!');
+                this.setState({
+                    loading: false,
+                });
+            } else {
+                message.warning(data.error[0].message);
+            };
+            this.loadData();
+        }.bind(this));
+    },
+    addClick() {
+        this.state.RowData = {};
+        this.setState({
+            showDesc: true
+        });
+    },
+    closeDesc(e, s) {
+        this.state.showDesc = e;
+        if (s) {
+            this.loadData();
+        };
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.serialNumber = undefined;
+        this.state.name = undefined;
+        this.state.keyword = undefined;
+        this.state.category = undefined;
+        this.state.ownerType = undefined;
+        this.state.status = undefined;
+        this.state.releaseStatus = undefined;
+        this.state.releaseDate = [];
+        this.loadData();
+    },
+    searchSwitch() {
+        this.setState({
+            searchMore: !this.state.searchMore
+        });
+    },
+    render() {
+        const rowSelection = {
+            selectedRowKeys: this.state.selectedRowKeys,
+            onChange: (selectedRowKeys, selectedRows) => {
+                this.setState({
+                    selectedRows: selectedRows,
+                    selectedRowKeys: selectedRowKeys
+                });
+            }
+        };
+        const hasSelected = this.state.selectedRowKeys.length > 0;
+        const { RangePicker } = DatePicker;
+        return (
+            <div className="user-content" >
+                <div className="content-title">
+                    <span>科技成果管理</span>
+                    <div className="patent-addNew">
+                        <Button type="primary" onClick={this.addClick}>发布成果<Icon type="plus" /></Button>
+                    </div>
+                </div>
+                <div className="user-search">
+                    <Input placeholder="编号"
+                        value={this.state.serialNumber}
+                        onChange={(e) => { this.setState({ serialNumber: e.target.value }); }} />
+                    <Input placeholder="名称"
+                        value={this.state.name}
+                        onChange={(e) => { this.setState({ name: e.target.value }); }} />
+                    <Input placeholder="关键字"
+                        value={this.state.keyword}
+                        onChange={(e) => { this.setState({ keyword: e.target.value }); }} />
+                    <Select placeholder="选择类型" style={{ width: 160 }}
+                        value={this.state.category}
+                        onChange={(e) => { this.setState({ category: e }) }}>
+                        {this.state.achievementCategoryOption}
+                    </Select>
+                    <Select placeholder="选择所有人类型"
+                        style={{ width: 120 }}
+                        value={this.state.ownerType}
+                        onChange={(e) => { this.setState({ ownerType: e }) }}>
+                        <Select.Option value="0" >个人</Select.Option>
+                        <Select.Option value="1" >组织</Select.Option>
+                    </Select>
+                    <Select placeholder="选择成果状态" style={{ width: 120 }}
+                        value={this.state.status}
+                        onChange={(e) => { this.setState({ status: e }) }}>
+                        <Select.Option value="0" >进行中</Select.Option>
+                        <Select.Option value="1" >未解决</Select.Option>
+                        <Select.Option value="2" >已解决</Select.Option>
+                    </Select>
+                    <Select placeholder="选择是否发布" style={{ width: 120 }}
+                        value={this.state.releaseStatus}
+                        onChange={(e) => { this.setState({ releaseStatus: e }) }}>
+                        <Select.Option value="0" >未发布</Select.Option>
+                        <Select.Option value="1" >已发布</Select.Option>
+                    </Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                    <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                        disabled={!hasSelected}
+                        onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    <span>更多搜索<Switch defaultChecked={false} onChange={this.searchSwitch} /></span>
+                    <div className="search-more" style={this.state.searchMore ? { display: 'none' } : {}}>
+                        <p>
+                            <span>发布时间 :</span>
+                            <RangePicker
+                                value={[this.state.releaseDate[0] ? moment(this.state.releaseDate[0]) : null,
+                                this.state.releaseDate[1] ? moment(this.state.releaseDate[1]) : null]}
+                                onChange={(data, dataString) => { this.setState({ releaseDate: dataString }); }} />
+                        </p>
+                    </div>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            rowSelection={rowSelection}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <TechAchievementDesc
+                    data={this.state.RowData}
+                    achievementCategoryOption={this.state.achievementCategoryOption}
+                    showDesc={this.state.showDesc}
+                    closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default AchievementList;

+ 72 - 0
js/component/manageCenter/achievement/techAchievement.less

@@ -0,0 +1,72 @@
+.user-content {
+    background: #fff;
+    padding: 20px;
+    .content-title {
+        color: #333;
+        font-size: 16px;
+    }
+    .user-search {
+        margin-bottom: 10px;
+        >input {
+            width: 140px;
+        }
+        >input,
+        >button,
+        .ant-select {
+            margin-right: 10px;
+            margin-top: 10px;
+        }
+        .ant-switch {
+            margin-left: 10px;
+        }
+        .search-more {
+            margin: 10px 0;
+            >p {
+                span {
+                    margin-right: 10px
+                }
+            }
+        }
+    }
+}
+
+.patent-addNew {
+    float: right;
+    margin-left: 20px;
+    button {
+        background: #ea0862;
+        color: #fff;
+        border: none;
+        border-radius: 4px;
+        padding: 6px 10px;
+        margin-left: 20px;
+    }
+    button:hover {
+        background: #ea0862;
+    }
+}
+
+#demand-form {
+    .half-item {
+        float: left;
+        width: 50%;
+        margin-bottom: 10px;
+    }
+    .item-title {
+        line-height: 30px;
+        font-size: 14px;
+        color: #666;
+    }
+    .form-title {
+        font-size: 16px;
+        color: #333;
+    }
+    .keyWord-tips {
+        >button {
+            vertical-align: middle;
+        }
+    }
+    .set-submit {
+        margin-right: 20px;
+    }
+}

+ 905 - 0
js/component/manageCenter/achievement/techAchievementDesc.jsx

@@ -0,0 +1,905 @@
+import React from 'react';
+import { Icon, Tooltip, Modal, message, Spin, Upload, Input, InputNumber, Select, DatePicker, Button, Radio, Form, Cascader, Tag } from 'antd';
+import moment from 'moment';
+import './techAchievement.less';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import { IndustryObject } from '../../DicIndustryList.js';
+import { beforeUploadFile, splitUrl, companySearch } from '../../tools.js';
+
+const KeyWordTagGroup = React.createClass({
+    getInitialState() {
+        return {
+            tags: [],
+            inputVisible: false,
+            inputValue: ''
+        };
+    },
+    handleClose(removedTag) {
+        const tags = this.state.tags.filter(tag => tag !== removedTag);
+        this.props.tagsArr(tags);
+        this.setState({ tags });
+    },
+    showInput() {
+        this.setState({ inputVisible: true }, () => this.input.focus());
+    },
+    handleInputChange(e) {
+        this.setState({ inputValue: e.target.value });
+    },
+    handleInputConfirm() {
+        const state = this.state;
+        const inputValue = state.inputValue;
+        let tags = state.tags;
+        if (inputValue && tags.indexOf(inputValue) === -1) {
+            tags = [...tags, inputValue];
+        }
+        this.props.tagsArr(tags);
+        this.setState({
+            tags,
+            inputVisible: false,
+            inputValue: '',
+        });
+    },
+    componentWillMount() {
+        this.state.tags = this.props.keyWordArr;
+    },
+    componentWillReceiveProps(nextProps) {
+        if (this.props.keyWordArr != nextProps.keyWordArr) {
+            this.state.tags = nextProps.keyWordArr;
+        };
+    },
+    render() {
+        const { tags, inputVisible, inputValue } = this.state;
+        return (
+            <div className="keyWord-tips">
+                {tags.map((tag, index) => {
+                    const isLongTag = tag.length > 10;
+                    const tagElem = (
+                        <Tag key={tag} closable={index !== -1} afterClose={() => this.handleClose(tag)}>
+                            {isLongTag ? `${tag.slice(0, 10)}...` : tag}
+                        </Tag>
+                    );
+                    return isLongTag ? <Tooltip title={tag}>{tagElem}</Tooltip> : tagElem;
+                })}
+                {inputVisible && (
+                    <Input
+                        ref={input => this.input = input}
+                        type="text"
+                        style={{ width: 78 }}
+                        value={inputValue}
+                        onChange={this.handleInputChange}
+                        onBlur={this.handleInputConfirm}
+                        onPressEnter={this.handleInputConfirm}
+                    />
+                )}
+                {!inputVisible && <Button className="addtips" type="dashed" disabled={tags.length > 9 ? true : false} onClick={this.showInput}>+ 新关键词</Button>}
+            </div>
+        );
+    }
+});
+
+const PicturesWall = React.createClass({
+    getInitialState() {
+        return {
+            previewVisible: false,
+            previewImage: '',
+            fileList: [],
+        }
+    },
+    handleCancel() {
+        this.setState({ previewVisible: false })
+    },
+    handlePreview(file) {
+        this.setState({
+            previewImage: file.url || file.thumbUrl,
+            previewVisible: true,
+        });
+    },
+    handleChange(info) {
+        let fileList = info.fileList;
+        this.setState({ fileList });
+        this.props.fileList(fileList);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.fileList = nextProps.pictureUrl;
+    },
+    render() {
+        const { previewVisible, previewImage, fileList } = this.state;
+        const uploadButton = (
+            <div>
+                <Icon type="plus" />
+                <div className="ant-upload-text">点击上传</div>
+            </div>
+        );
+        return (
+            <div className="clearfix">
+                <Upload
+                    action={globalConfig.context + "/api/admin/achievement/uploadPicture"}
+                    data={{ 'sign': this.props.pictureSign }}
+                    listType="picture-card"
+                    fileList={fileList}
+                    onPreview={this.handlePreview}
+                    onChange={this.handleChange} >
+                    {fileList.length >= 5 ? null : uploadButton}
+                </Upload>
+                <Modal maskClosable={false} visible={previewVisible} footer={null} onCancel={this.handleCancel}>
+                    <img alt="example" style={{ width: '100%' }} src={previewImage} />
+                </Modal>
+            </div>
+        );
+    }
+});
+
+const AchievementDetailForm = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            textFileList: [],
+            techPlanFileList: [],
+            businessPlanFileList: [],
+            maturityPictureUrl: [],
+            technicalPictureUrl: [],
+            tags: []
+        };
+    },
+    loadData(id) {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/achievement/detail",
+            data: {
+                id: id
+            },
+            success: function (data) {
+                let thisData = data.data;
+                if (!thisData) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                    thisData = {};
+                };
+                let d = new Date()
+                if (thisData && thisData.dateOfBirthMonth && thisData.dateOfBirthYear) {
+                    d.setMonth(thisData.dateOfBirthMonth - 1);
+                    d.setYear(parseInt(thisData.dateOfBirthYear));
+                };
+                this.setState({
+                    data: thisData,
+                    orgDisplay: thisData.ownerType,
+                    tags: thisData.keyword ? thisData.keyword.split(",") : [],
+                    technicalPictureUrl: thisData.technicalPictureUrl ? splitUrl(thisData.technicalPictureUrl, ',', globalConfig.avatarHost + '/upload') : [],
+                    maturityPictureUrl: thisData.maturityPictureUrl ? splitUrl(thisData.maturityPictureUrl, ',', globalConfig.avatarHost + '/upload') : []
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getSalesmanList() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/salesman",
+            success: function (data) {
+                if (!data.data) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    }
+                    return;
+                };
+                let _me = this, theArr = [];
+                for (var item in data.data) {
+                    theArr.push(
+                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
+                    )
+                };
+                this.setState({
+                    salesmanOption: theArr
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getTagsArr(e) {
+        this.setState({ tags: e });
+    },
+    getMaturityPictureUrl(e) {
+        this.setState({ maturityPictureUrl: e });
+    },
+    getTechnicalPictureUrl(e) {
+        this.setState({ technicalPictureUrl: e });
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            //keyword长度判断
+            if (this.state.tags.length < 3) {
+                message.warning('关键词数量不能小于3个!');
+                return;
+            };
+            //url转化
+            let theTechnicalPictureUrl = [];
+            if (this.state.technicalPictureUrl.length) {
+                let picArr = [];
+                this.state.technicalPictureUrl.map(function (item) {
+                    picArr.push(item.response.data);
+                });
+                theTechnicalPictureUrl = picArr.join(",");
+            };
+            let theMaturityPictureUrl = [];
+            if (this.state.maturityPictureUrl.length) {
+                let picArr = [];
+                this.state.maturityPictureUrl.map(function (item) {
+                    picArr.push(item.response.data);
+                });
+                theMaturityPictureUrl = picArr.join(",");
+            };
+            if (!err) {
+                this.setState({
+                    loading: true
+                });
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: this.props.data.id ? globalConfig.context + '/api/admin/achievement/update' : globalConfig.context + '/api/admin/achievement/apply',
+                    data: {
+                        id: this.props.data.id,
+                        dataCategory: values.dataCategory,
+                        serialNumber: this.props.data.serialNumber,
+                        name: values.name,
+                        keyword: this.state.tags ? this.state.tags.join(",") : [],
+                        category: values.category,
+                        summary: values.summary,
+                        introduction: values.introduction,
+                        technicalPictureUrl: theTechnicalPictureUrl,
+                        fieldA: values.field ? values.field[0] : undefined,
+                        fieldB: values.field ? values.field[1] : undefined,
+                        maturity: values.maturity,
+                        maturityPictureUrl: theMaturityPictureUrl,
+                        maturityTextFileUrl: this.state.maturityTextFileUrl,
+                        maturityVideoUrl: values.maturityVideoUrl,
+                        innovation: values.innovation,
+                        ownerName: values.ownerName,
+                        ownerType: values.ownerType,
+                        ownerIdNumber: values.ownerIdNumber,
+                        ownerMobile: values.ownerMobile,
+                        ownerEmail: values.ownerEmail,
+                        ownerPostalAddress: values.ownerPostalAddress,
+                        cooperationMode: values.cooperationMode,
+                        transferMode: values.transferMode,
+                        bargainingMode: values.bargainingMode,
+                        transferPrice: values.transferPrice,
+                        technicalScene: values.technicalScene,
+                        breakthrough: values.breakthrough,
+                        patentCase: values.patentCase,
+                        awards: values.awards,
+                        teamDes: values.teamDes,
+                        parameter: values.parameter,
+                        orgId: values.orgId,
+                        orgName: values.orgName,
+                        orgAddress: values.orgAddress,
+                        orgEmail: values.orgEmail,
+                        orgContacts: values.orgContacts,
+                        orgContactsMobile: values.orgContactsMobile,
+                        releaseStatus: values.releaseStatus,
+                        techPlanUrl: this.state.techPlanUrl,
+                        businessPlanUrl: this.state.businessPlanUrl
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.setState({
+                            visible: false
+                        });
+                        this.props.handleOk();
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this));
+            }
+        });
+    },
+    componentWillMount() {
+        this.getSalesmanList();
+        if (this.props.data.id) {
+            this.loadData(this.props.data.id, this.props.detailApiUrl);
+        } else {
+            this.state.data = {};
+        };
+    },
+    componentWillReceiveProps(nextProps) {
+        if (!this.props.visible && nextProps.visible) {
+            this.state.textFileList = [];
+            this.state.techPlanFileList = [];
+            this.state.businessPlanFileList = [];
+            if (nextProps.data.id) {
+                this.loadData(nextProps.data.id);
+            } else {
+                this.state.data = {};
+                this.state.tags = [];
+                this.state.maturityPictureUrl = [];
+                this.state.technicalPictureUrl = [];
+            };
+            this.props.form.resetFields();
+        };
+    },
+    render() {
+        const theData = this.state.data || {};
+        const { getFieldDecorator } = this.props.form;
+        const FormItem = Form.Item
+        const formItemLayout = {
+            labelCol: { span: 8 },
+            wrapperCol: { span: 14 },
+        };
+        return (
+            <Form horizontal onSubmit={this.handleSubmit} id="demand-form">
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="编号" >
+                        <span>{theData.serialNumber}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="名称" >
+                        {getFieldDecorator('name', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.name
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="数据类别" >
+                        {getFieldDecorator('dataCategory', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.dataCategory
+                        })(
+                            <Select placeholder="选择数据类型" style={{ width: 160 }} >
+                                <Select.Option value="0" >成果</Select.Option>
+                                <Select.Option value="1" >技术</Select.Option>
+                                <Select.Option value="2" >项目</Select.Option>
+                            </Select>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="类型" >
+                        {getFieldDecorator('category', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.category
+                        })(
+                            <Select style={{ width: 160 }} placeholder="请选择成果类型">
+                                {this.props.achievementCategoryOption}
+                            </Select>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="是否发布" >
+                        {getFieldDecorator('releaseStatus', {
+                            initialValue: theData.releaseStatus
+                        })(
+                            <Radio.Group>
+                                <Radio value="0">未发布</Radio>
+                                <Radio value="1">发布</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="发布时间" >
+                        <span>{theData.releaseDateFormattedDate}</span>
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="关键词" >
+                    <KeyWordTagGroup
+                        keyWordArr={this.state.tags}
+                        tagsArr={this.getTagsArr}
+                        visible={this.props.visible} />
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="摘要" >
+                    {getFieldDecorator('summary', {
+                        initialValue: theData.summary
+                    })(
+                        <Input type="textarea" rows={4} />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="成果简介" >
+                    {getFieldDecorator('introduction', {
+                        initialValue: theData.introduction
+                    })(
+                        <Input type="textarea" rows={4} placeholder="项目成果简介;项目核心创新点;项目详细用途;预期效益说明;主要技术(性能)指标;市场前景;应用范围;发展历程。" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="技术图片" >
+                    <PicturesWall
+                        pictureSign="achievement_technical_picture"
+                        fileList={this.getTechnicalPictureUrl}
+                        pictureUrl={this.state.technicalPictureUrl} />
+                    <p>图片建议:专利证书或专利申请书图片、技术图纸、样品图片、技术相关网络图片;成熟度处于非研发阶段的项目,必须上传样品图片,如未上传,成熟度将视为处在研发阶段。</p>
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="应用领域" >
+                    {getFieldDecorator('field', {
+                        rules: [{ type: 'array', required: true, message: '此项为必填项!' }],
+                        initialValue: [theData.fieldA, theData.fieldB]
+                    })(
+                        <Cascader style={{ width: 300 }} options={IndustryObject} placeholder="应用领域" />
+                        )}
+                </FormItem>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="成熟度" >
+                        {getFieldDecorator('maturity', {
+                            initialValue: theData.maturity
+                        })(
+                            <Select placeholder="选择成熟度" style={{ width: 160 }} >
+                                <Select.Option value="0" >正在研发</Select.Option>
+                                <Select.Option value="1" >已有样品</Select.Option>
+                                <Select.Option value="2" >通过小试</Select.Option>
+                                <Select.Option value="3" >通过中试</Select.Option>
+                                <Select.Option value="4" >可以量产</Select.Option>
+                            </Select>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="创新度" >
+                        {getFieldDecorator('innovation', {
+                            initialValue: theData.innovation
+                        })(
+                            <Select placeholder="选择创新度" style={{ width: 160 }} >
+                                <Select.Option value="0" >行业先进</Select.Option>
+                                <Select.Option value="1" >行业领先</Select.Option>
+                                <Select.Option value="2" >国内先进</Select.Option>
+                                <Select.Option value="3" >国内领先</Select.Option>
+                                <Select.Option value="4" >国际先进</Select.Option>
+                                <Select.Option value="5" >国际领先</Select.Option>
+                            </Select>
+                            )}
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="成熟度证明材料(图片)" >
+                    <PicturesWall
+                        pictureSign="achievement_maturity_picture"
+                        fileList={this.getMaturityPictureUrl}
+                        pictureUrl={this.state.maturityPictureUrl} />
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 6 }}
+                    label="成熟度证明材料(文本)" >
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/api/admin/achievement/uploadTextFile"}
+                        data={{ 'sign': 'achievement_maturity_text_file' }}
+                        beforeUpload={beforeUploadFile}
+                        fileList={this.state.textFileList}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                if (!info.file.response.error.length) {
+                                    message.success(`${info.file.name} 文件上传成功!`);
+                                } else {
+                                    message.warning(info.file.response.error[0].message);
+                                    return;
+                                };
+                                this.state.maturityTextFileUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            };
+                            this.setState({ textFileList: info.fileList.slice(-1) });
+                        }} >
+                        <Button><Icon type="upload" /> 上传需求文本文件 </Button>
+                    </Upload>
+                    <p style={{ marginTop: '10px' }}>{theData.maturityTextFileUrl ?
+                        <span className="download-file">
+                            <a onClick={() => { window.open(globalConfig.context + '/api/admin/achievement/download?id=' + this.props.data.id + '&sign=achievement_maturity_text_file') }}>成熟度证明材料(文本文件)</a>
+                        </span>
+                        : <span><Icon type="exclamation-circle" style={{ color: '#ffbf00', marginRight: '6px' }} />未上传!</span>}</p>
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="成熟度证明材料(视频地址)" >
+                    {getFieldDecorator('maturityVideoUrl', {
+                        initialValue: theData.maturityVideoUrl
+                    })(
+                        <Input />
+                        )}
+                </FormItem>
+                <div className="clearfix" >
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="成果所有人名称" >
+                        {getFieldDecorator('ownerName', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.ownerName
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所有人证件号" >
+                        {getFieldDecorator('ownerIdNumber', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.ownerIdNumber
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所有人联系电话" >
+                        {getFieldDecorator('ownerMobile', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.ownerMobile
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所有人电子邮箱" >
+                        {getFieldDecorator('ownerEmail', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.ownerEmail
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所有人通信地址" >
+                        {getFieldDecorator('ownerPostalAddress', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.ownerPostalAddress
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所有人类型" >
+                        {getFieldDecorator('ownerType', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.ownerType
+                        })(
+                            <Radio.Group onChange={(e) => { this.setState({ orgDisplay: e.target.value }); }}>
+                                <Radio value="0">个人</Radio>
+                                <Radio value="1">组织</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix" style={{ display: this.state.orgDisplay == '1' ? 'block' : 'none' }}>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所属组织名称" >
+                        {getFieldDecorator('orgName', {
+                            initialValue: theData.orgName
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所属组织地址" >
+                        {getFieldDecorator('orgAddress', {
+                            initialValue: theData.orgAddress
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所属组织邮箱" >
+                        {getFieldDecorator('orgEmail', {
+                            initialValue: theData.orgEmail
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所属组织联系人名称" >
+                        {getFieldDecorator('orgContacts', {
+                            initialValue: theData.orgContacts
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="所属组织联系人电话" >
+                        {getFieldDecorator('orgContactsMobile', {
+                            initialValue: theData.orgContactsMobile
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="合作方式" >
+                        {getFieldDecorator('cooperationMode', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.cooperationMode
+                        })(
+                            <Radio.Group>
+                                <Radio value="0">技术转让</Radio>
+                                <Radio value="1">授权生产</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="转让方式" >
+                        {getFieldDecorator('transferMode', {
+                            initialValue: theData.transferMode
+                        })(
+                            <Select placeholder="选择转让方式" style={{ width: 160 }} >
+                                <Select.Option value="0" >完全转让</Select.Option>
+                                <Select.Option value="1" >许可转让</Select.Option>
+                                <Select.Option value="2" >技术入股</Select.Option>
+                            </Select>
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="议价方式" >
+                        {getFieldDecorator('bargainingMode', {
+                            initialValue: theData.bargainingMode
+                        })(
+                            <Radio.Group>
+                                <Radio value="0">面议</Radio>
+                                <Radio value="1">定价</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="转让价格" >
+                        {getFieldDecorator('transferPrice', {
+                            initialValue: theData.transferPrice
+                        })(
+                            <InputNumber />
+                            )}
+                        <span style={{ marginLeft: '20px' }}>万元</span>
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="技术场景" >
+                    {getFieldDecorator('technicalScene', {
+                        initialValue: theData.technicalScene
+                    })(
+                        <Input type="textarea" rows={2} placeholder="说明解决了什么问题。" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="技术突破" >
+                    {getFieldDecorator('breakthrough', {
+                        initialValue: theData.breakthrough
+                    })(
+                        <Input type="textarea" rows={2} placeholder="说明该技术成果突破性的研究。" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="专利情况" >
+                    {getFieldDecorator('patentCase', {
+                        initialValue: theData.patentCase
+                    })(
+                        <Input type="textarea" rows={2} placeholder="一个“技术”可能由多个专利构成,需要说明技术-专利的关系。" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="获奖情况" >
+                    {getFieldDecorator('awards', {
+                        initialValue: theData.awards
+                    })(
+                        <Input type="textarea" rows={2} placeholder="一个“技术”可能存在社会奖励情况,需要说明社会奖励情况。" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="技术团队情况" >
+                    {getFieldDecorator('teamDes', {
+                        initialValue: theData.teamDes
+                    })(
+                        <Input type="textarea" rows={2} placeholder="一个“技术”、“项目”可能存在团队,需要说明团队情况。" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 18 }}
+                    label="技术参数" >
+                    {getFieldDecorator('parameter', {
+                        initialValue: theData.parameter
+                    })(
+                        <Input type="textarea" rows={2} placeholder="描述技术参数信息" />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 6 }}
+                    label="技术方案" >
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/api/admin/achievement/uploadTextFile"}
+                        data={{ 'sign': 'achievement_tech_plan' }}
+                        beforeUpload={beforeUploadFile}
+                        fileList={this.state.techPlanFileList}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                if (!info.file.response.error.length) {
+                                    message.success(`${info.file.name} 文件上传成功!`);
+                                } else {
+                                    message.warning(info.file.response.error[0].message);
+                                    return;
+                                };
+                                this.state.techPlanUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            };
+                            this.setState({ techPlanFileList: info.fileList.slice(-1) });
+                        }} >
+                        <Button><Icon type="upload" /> 上传技术方案文件 </Button>
+                    </Upload>
+                    <p style={{ marginTop: '10px' }}>{theData.techPlanUrl ?
+                        <span className="download-file">
+                            <a onClick={() => { window.open(globalConfig.context + '/api/admin/achievement/download?id=' + this.props.data.id + '&sign=achievement_tech_plan') }}>技术方案</a>
+                        </span>
+                        : <span><Icon type="exclamation-circle" style={{ color: '#ffbf00', marginRight: '6px' }} />未上传!</span>}</p>
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 4 }}
+                    wrapperCol={{ span: 6 }}
+                    label="商业计划书" >
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/api/admin/achievement/uploadTextFile"}
+                        data={{ 'sign': 'achievement_business_plan' }}
+                        beforeUpload={beforeUploadFile}
+                        fileList={this.state.businessPlanFileList}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                if (!info.file.response.error.length) {
+                                    message.success(`${info.file.name} 文件上传成功!`);
+                                } else {
+                                    message.warning(info.file.response.error[0].message);
+                                    return;
+                                };
+                                this.state.businessPlanUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            };
+                            this.setState({ businessPlanFileList: info.fileList.slice(-1) });
+                        }} >
+                        <Button><Icon type="upload" /> 上传商业计划书文件 </Button>
+                    </Upload>
+                    <p style={{ marginTop: '10px' }}>{theData.businessPlanUrl ?
+                        <span className="download-file">
+                            <a onClick={() => { window.open(globalConfig.context + '/api/admin/achievement/download?id=' + this.props.data.id + '&sign=achievement_business_plan') }}>商业计划书</a>
+                        </span>
+                        : <span><Icon type="exclamation-circle" style={{ color: '#ffbf00', marginRight: '6px' }} />未上传!</span>}</p>
+                </FormItem>
+                <FormItem wrapperCol={{ span: 12, offset: 3 }}>
+                    <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
+                    <Button className="set-submit" type="ghost" onClick={this.props.closeDesc}>取消</Button>
+                </FormItem>
+            </Form >
+        )
+    }
+}));
+
+const AchievementDetail = React.createClass({
+    getInitialState() {
+        return {
+            visible: false
+        };
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    handleOk(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false, true);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc;
+    },
+    render() {
+        if (this.props.data) {
+            return (
+                <div className="patent-desc">
+                    <Modal maskClosable={false} title="成果详情" visible={this.state.visible}
+                        onOk={this.checkPatentProcess} onCancel={this.handleCancel}
+                        width='1000px'
+                        footer=''
+                        className="admin-desc-content">
+                        <AchievementDetailForm
+                            data={this.props.data}
+                            companyOption={this.props.companyOption}
+                            userOption={this.props.userOption}
+                            achievementCategoryOption={this.props.achievementCategoryOption}
+                            closeDesc={this.handleCancel}
+                            visible={this.state.visible}
+                            handleOk={this.handleOk} />
+                    </Modal>
+                </div>
+            );
+        } else {
+            return <div></div>
+        }
+    },
+});
+
+export default AchievementDetail;

+ 2 - 2
js/component/manageCenter/bottom.jsx

@@ -5,8 +5,8 @@ const Bottom = React.createClass({
     render() {
         return (
             <div className="account-bottom">
-                <p>公司地址   联系方式公司地址  公司地址   联系方式 公司地址 公司地址   联系方式 公司地址</p>
-                <p>公司地址   联系方式公司地址 公司地址   联系方式公司地址</p>
+                <p>阿凡提科技</p>
+                <p>技术支持@湖南智明</p>
             </div>
         )
     }

+ 62 - 0
js/component/manageCenter/demand/content.jsx

@@ -0,0 +1,62 @@
+import React, { Component } from 'react';
+import '../content.less';
+import LeftTab from './leftTab';
+import TechDemand from './techDemand';
+
+
+class Content extends Component {
+    constructor() {
+        super();
+        this.state = {
+            loading: false,
+            component: 'div',
+            apiUrl: 'orgList'
+        };
+    }
+    componentWillMount() {
+        if (window.location.hash) {
+            this.getKey(window.location.hash.substr(1));
+        } else {
+            this.getKey("techDemandOrg");
+        };
+    }
+    getKey(key) {
+        switch (key) {
+            case 'techDemandOrg':
+                require.ensure([], () => {
+                    const TechDemand = require('./techDemand').default;
+                    this.setState({
+                        component: TechDemand,
+                        listApiUrl: '/api/admin/demand/orgList',
+                        detailApiUrl:'/api/admin/demand/orgDemandDetail'
+                    });
+                });
+                break;
+            case 'techDemandUser':
+                require.ensure([], () => {
+                    const TechDemand = require('./techDemand').default;
+                    this.setState({
+                        component: TechDemand,
+                        listApiUrl: '/api/admin/demand/userList',
+                        detailApiUrl:'/api/admin/demand/userDemandDetail'
+                    });
+                });
+                break;
+        };
+        window.location.hash = key;
+    }
+    render() {
+        return (
+            <div className="manage-content">
+                <LeftTab handlekey={this.getKey.bind(this)} />
+                <div className="content-right">
+                    <this.state.component
+                        data-listApiUrl={this.state.listApiUrl}
+                        data-detailApiUrl={this.state.detailApiUrl} />
+                </div>
+            </div>
+        )
+    }
+}
+
+export default Content;

+ 43 - 0
js/component/manageCenter/demand/leftTab.jsx

@@ -0,0 +1,43 @@
+import React from 'react';
+import { Menu, Icon } from 'antd';
+import '../leftTab.less';
+const SubMenu = Menu.SubMenu;
+const MenuItemGroup = Menu.ItemGroup;
+
+
+const LeftTab = React.createClass({
+    getInitialState() {
+        return {
+            current: 'techDemandOrg'
+        };
+    },
+    handleClick(e) {
+        this.props.handlekey(e.key);
+        this.setState({
+            current: e.key,
+        });
+    },
+    componentWillMount() {
+        if (window.location.hash) {
+            this.state.current = window.location.hash.substr(1);
+        };
+    },
+    render() {
+        return (
+            <Menu onClick={this.handleClick}
+                selectedKeys={[this.state.current]}
+                mode="vertical"
+                className="account-left"
+            >
+                <Menu.Item key="techDemandOrg">
+                    组织科技需求列表
+                </Menu.Item>
+                <Menu.Item key="techDemandUser">
+                    个人科技需求列表
+                </Menu.Item>
+            </Menu>
+        );
+    },
+});
+
+export default LeftTab;

+ 421 - 0
js/component/manageCenter/demand/techDemand.jsx

@@ -0,0 +1,421 @@
+import React from 'react';
+import { Icon, Button, Input, Select, Spin, Table, Switch, message, DatePicker, Modal } from 'antd';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import moment from 'moment';
+import './techDemand.less';
+import TechDemandDesc from './techDemandDesc.jsx';
+import { provinceArr, demandTypeList } from '../../dataDic.js';
+import { companySearch, getDemandType } from '../../tools.js';
+
+const DemandList = React.createClass({
+    loadData(pageNo, apiUrl) {
+        this.state.data = [];
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + (apiUrl || this.props['data-listApiUrl']),
+            data: {
+                pageNo: pageNo || 1,
+                pageSize: this.state.pagination.pageSize,
+                serialNumber: this.state.serialNumber,
+                name: this.state.name,
+                keyword: this.state.keyword,
+                infoSources: this.state.infoSources ? Number(this.state.infoSources) : undefined,
+                demandType: this.state.demandType ? Number(this.state.demandType) : undefined,
+                //username: this.state.username,
+                status: this.state.status ? Number(this.state.status) : undefined,
+                releaseStatus: this.state.releaseStatus ? Number(this.state.releaseStatus) : undefined,
+                validityPeriodStartDate: this.state.validityPeriodDate[0],
+                validityPeriodEndDate: this.state.validityPeriodDate[1],
+                releaseDateStartDate: this.state.releaseDate[0],
+                releaseDateEndDate: this.state.releaseDate[1],
+            },
+            success: function (data) {
+                let theArr = [];
+                if (!data.data && !data.data.list) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                } else {
+                    for (let i = 0; i < data.data.list.length; i++) {
+                        let thisdata = data.data.list[i];
+                        theArr.push({
+                            key: i,
+                            id: thisdata.id,
+                            serialNumber: thisdata.serialNumber,
+                            dataCategory: thisdata.dataCategory,
+                            name: thisdata.name,
+                            keyword: thisdata.keyword,
+                            infoSources: thisdata.infoSources,
+                            username: thisdata.username,
+                            demandType: thisdata.demandType,
+                            validityPeriod: thisdata.validityPeriod,
+                            employerName: thisdata.employerName,
+                            employerId: thisdata.employerId,
+                            province: thisdata.province,
+                            status: thisdata.status,
+                            releaseStatus: thisdata.releaseStatus,
+                            releaseDate: thisdata.releaseDate,
+                            principalId: thisdata.principalId,
+                            validityPeriodFormattedDate: thisdata.validityPeriodFormattedDate,
+                            releaseDateFormattedDate: thisdata.releaseDateFormattedDate
+                        });
+                    };
+                }
+                this.state.pagination.current = data.data.pageNo;
+                this.state.pagination.total = data.data.totalCount;
+                this.setState({
+                    dataSource: theArr,
+                    pagination: this.state.pagination
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getInitialState() {
+        return {
+            searchMore: true,
+            validityPeriodDate: [],
+            releaseDate: [],
+            selectedRowKeys: [],
+            selectedRows: [],
+            loading: false,
+            pagination: {
+                defaultCurrent: 1,
+                defaultPageSize: 10,
+                showQuickJumper: true,
+                pageSize: 10,
+                onChange: function (page) {
+                    this.loadData(page);
+                }.bind(this),
+                showTotal: function (total) {
+                    return '共' + total + '条数据';
+                }
+            },
+            columns: [
+                {
+                    title: '编号',
+                    dataIndex: 'serialNumber',
+                    key: 'serialNumber',
+                }, {
+                    title: '需求名称',
+                    dataIndex: 'name',
+                    key: 'name',
+                }, {
+                    title: '关键字',
+                    dataIndex: 'keyword',
+                    key: 'keyword',
+                }, {
+                    title: '需求类型',
+                    dataIndex: 'demandType',
+                    key: 'demandType',
+                    render: text => { return getDemandType(text); }
+                }, {
+                    title: '信息来源',
+                    dataIndex: 'infoSources',
+                    key: 'infoSources',
+                    render: text => {
+                        switch (text) {
+                            case "0":
+                                return <span>平台采集</span>;
+                            case "1":
+                                return <span>客户发布</span>
+                        }
+                    }
+                }, {
+                    title: '雇主名称',
+                    dataIndex: 'username',
+                    key: 'username',
+                }, {
+                    title: '需求状态',
+                    dataIndex: 'status',
+                    key: 'status',
+                    render: text => {
+                        switch (text) {
+                            case "0":
+                                return <span>进行中</span>;
+                            case "1":
+                                return <span>未解决</span>;
+                            case "2":
+                                return <span>已解决</span>;
+                        }
+                    }
+                }, {
+                    title: '有效期限',
+                    dataIndex: 'validityPeriodFormattedDate',
+                    key: 'validityPeriodFormattedDate',
+                }, {
+                    title: '发布时间',
+                    dataIndex: 'releaseDateFormattedDate',
+                    key: 'releaseDateFormattedDate',
+                }, {
+                    title: '管理员',
+                    dataIndex: 'principalId',
+                    key: 'principalId',
+                }
+            ],
+            dataSource: [],
+            searchTime: [,]
+        };
+    },
+    getCompanyList() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/demand/unitNames",
+            success: function (data) {
+                let theArr = [];
+                if (!data.data) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                } else {
+                    data.data.map(function (item) {
+                        theArr.push(
+                            <Select.Option value={item.uid} key={item.uid}>{item.unitName}</Select.Option>
+                        )
+                    });
+                };
+                this.setState({
+                    companyOption: theArr
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getUserList() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/demand/userNames",
+            success: function (data) {
+                let theArr = [];
+                if (!data.data) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                } else {
+                    data.data.map(function (item) {
+                        theArr.push(
+                            <Select.Option value={item.uid} key={item.uid}>{item.username}</Select.Option>
+                        )
+                    });
+                };
+                this.setState({
+                    userOption: theArr
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    componentWillMount() {
+        let theArr = [];
+        demandTypeList.map(function (item) {
+            theArr.push(
+                <Select.Option value={item.value} key={item.key}>{item.key}</Select.Option>
+            )
+        });
+        this.state.demandTypeOption = theArr;
+        this.loadData();
+        this.getCompanyList();
+        this.getUserList();
+    },
+    componentWillReceiveProps(nextProps) {
+        if (this.props['data-listApiUrl'] != nextProps['data-listApiUrl']) {
+            this.loadData(null, nextProps['data-listApiUrl']);
+            this.state.selectedRowKeys = [];
+            this.state.selectedRows = [];
+        };
+    },
+    tableRowClick(record, index) {
+        this.state.RowData = record;
+        this.setState({
+            showDesc: true
+        });
+    },
+    delectRow() {
+        let deletedIds = [];
+        for (let idx = 0; idx < this.state.selectedRows.length; idx++) {
+            let rowItem = this.state.selectedRows[idx];
+            if (rowItem.id) {
+                deletedIds.push(rowItem.id)
+            };
+        };
+        this.setState({
+            selectedRowKeys: [],
+            loading: deletedIds.length > 0
+        });
+        $.ajax({
+            method: "POST",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/demand/delete",
+            data: {
+                ids: deletedIds
+            }
+        }).done(function (data) {
+            if (!data.error.length) {
+                message.success('删除成功!');
+                this.setState({
+                    loading: false,
+                });
+            } else {
+                message.warning(data.error[0].message);
+            };
+            this.loadData();
+        }.bind(this));
+    },
+    addClick() {
+        this.state.RowData = {};
+        this.setState({
+            showDesc: true
+        });
+    },
+    closeDesc(e, s) {
+        this.state.showDesc = e;
+        if (s) {
+            this.loadData();
+        };
+    },
+    search() {
+        this.loadData();
+    },
+    reset() {
+        this.state.serialNumber = undefined;
+        this.state.name = undefined;
+        this.state.keyword = undefined;
+        this.state.infoSources = undefined;
+        this.state.demandType = undefined;
+        this.state.username = undefined;
+        this.state.status = undefined;
+        this.state.releaseStatus = undefined;
+        this.state.validityPeriodDate = [];
+        this.state.releaseDate = [];
+        this.loadData();
+    },
+    searchSwitch() {
+        this.setState({
+            searchMore: !this.state.searchMore
+        });
+    },
+    render() {
+        const rowSelection = {
+            selectedRowKeys: this.state.selectedRowKeys,
+            onChange: (selectedRowKeys, selectedRows) => {
+                this.setState({
+                    selectedRows: selectedRows,
+                    selectedRowKeys: selectedRowKeys
+                });
+            }
+        };
+        const hasSelected = this.state.selectedRowKeys.length > 0;
+        const { RangePicker } = DatePicker;
+        return (
+            <div className="user-content" >
+                <div className="content-title">
+                    <span>科技需求管理</span>
+                    <div className="patent-addNew">
+                        <Button type="primary" onClick={this.addClick}>新增需求<Icon type="plus" /></Button>
+                    </div>
+                </div>
+                <div className="user-search">
+                    <Input placeholder="需求编号"
+                        value={this.state.serialNumber}
+                        onChange={(e) => { this.setState({ serialNumber: e.target.value }); }} />
+                    <Input placeholder="需求名称"
+                        value={this.state.name}
+                        onChange={(e) => { this.setState({ name: e.target.value }); }} />
+                    <Input placeholder="关键字"
+                        value={this.state.keyword}
+                        onChange={(e) => { this.setState({ keyword: e.target.value }); }} />
+                    <Select placeholder="选择信息来源" style={{ width: 120 }}
+                        value={this.state.infoSources}
+                        onChange={(e) => { this.setState({ infoSources: e }) }}>
+                        <Select.Option value="0" >平台采集</Select.Option>
+                        <Select.Option value="1" >客户发布</Select.Option>
+                    </Select>
+                    <Select placeholder="选择需求类型"
+                        style={{ width: 120 }}
+                        value={this.state.demandType}
+                        onChange={(e) => { this.setState({ demandType: e }) }}>
+                        {this.state.demandTypeOption}
+                    </Select>
+                    <Select placeholder="选择需求状态" style={{ width: 120 }}
+                        value={this.state.status}
+                        onChange={(e) => { this.setState({ status: e }) }}>
+                        <Select.Option value="0" >进行中</Select.Option>
+                        <Select.Option value="1" >未解决</Select.Option>
+                        <Select.Option value="2" >已解决</Select.Option>
+                    </Select>
+                    <Select placeholder="选择是否发布" style={{ width: 120 }}
+                        value={this.state.releaseStatus}
+                        onChange={(e) => { this.setState({ releaseStatus: e }) }}>
+                        <Select.Option value="0" >未发布</Select.Option>
+                        <Select.Option value="1" >已发布</Select.Option>
+                    </Select>
+                    <Button type="primary" onClick={this.search}>搜索</Button>
+                    <Button onClick={this.reset}>重置</Button>
+                    <Button style={{ background: "#3fcf9e", border: "none", color: "#fff" }}
+                        disabled={!hasSelected}
+                        onClick={this.delectRow}>删除<Icon type="minus" /></Button>
+                    <span>更多搜索<Switch defaultChecked={false} onChange={this.searchSwitch} /></span>
+                    <div className="search-more" style={this.state.searchMore ? { display: 'none' } : {}}>
+                        <p>
+                            <span>有效期限 :</span>
+                            <RangePicker
+                                value={[this.state.validityPeriodDate[0] ? moment(this.state.validityPeriodDate[0]) : null,
+                                this.state.validityPeriodDate[1] ? moment(this.state.validityPeriodDate[1]) : null]}
+                                onChange={(data, dataString) => { this.setState({ validityPeriodDate: dataString }); }} />
+                            <span>发布时间 :</span>
+                            <RangePicker
+                                value={[this.state.releaseDate[0] ? moment(this.state.releaseDate[0]) : null,
+                                this.state.releaseDate[1] ? moment(this.state.releaseDate[1]) : null]}
+                                onChange={(data, dataString) => { this.setState({ releaseDate: dataString }); }} />
+                        </p>
+                    </div>
+                </div>
+                <div className="patent-table">
+                    <Spin spinning={this.state.loading}>
+                        <Table columns={this.state.columns}
+                            dataSource={this.state.dataSource}
+                            rowSelection={rowSelection}
+                            pagination={this.state.pagination}
+                            onRowClick={this.tableRowClick} />
+                    </Spin>
+                </div>
+                <TechDemandDesc
+                    data={this.state.RowData}
+                    detailApiUrl={this.props['data-detailApiUrl']}
+                    companyOption={this.state.companyOption}
+                    userOption={this.state.userOption}
+                    demandTypeOption={this.state.demandTypeOption}
+                    showDesc={this.state.showDesc}
+                    closeDesc={this.closeDesc} />
+            </div >
+        );
+    }
+});
+
+export default DemandList;

+ 72 - 0
js/component/manageCenter/demand/techDemand.less

@@ -0,0 +1,72 @@
+.user-content {
+    background: #fff;
+    padding: 20px;
+    .content-title {
+        color: #333;
+        font-size: 16px;
+    }
+    .user-search {
+        margin-bottom: 10px;
+        >input {
+            width: 140px;
+        }
+        >input,
+        >button,
+        .ant-select {
+            margin-right: 10px;
+            margin-top: 10px;
+        }
+        .ant-switch {
+            margin-left: 10px;
+        }
+        .search-more {
+            margin: 10px 0;
+            >p {
+                span {
+                    margin-right: 10px
+                }
+            }
+        }
+    }
+}
+
+.patent-addNew {
+    float: right;
+    margin-left: 20px;
+    button {
+        background: #ea0862;
+        color: #fff;
+        border: none;
+        border-radius: 4px;
+        padding: 6px 10px;
+        margin-left: 20px;
+    }
+    button:hover {
+        background: #ea0862;
+    }
+}
+
+#demand-form {
+    .half-item {
+        float: left;
+        width: 50%;
+        margin-bottom: 10px;
+    }
+    .item-title {
+        line-height: 30px;
+        font-size: 14px;
+        color: #666;
+    }
+    .form-title {
+        font-size: 16px;
+        color: #333;
+    }
+    .keyWord-tips {
+        >button {
+            vertical-align: middle;
+        }
+    }
+    .set-submit {
+        margin-right: 20px;
+    }
+}

+ 792 - 0
js/component/manageCenter/demand/techDemandDesc.jsx

@@ -0,0 +1,792 @@
+import React from 'react';
+import { Icon, Tooltip, Modal, message, Spin, Upload, Input, InputNumber, Select, DatePicker, Button, Radio, Form, Cascader, Tag } from 'antd';
+import moment from 'moment';
+import './techDemand.less';
+import ajax from 'jquery/src/ajax/xhr.js';
+import $ from 'jquery/src/ajax';
+import { IndustryObject } from '../../DicIndustryList.js';
+import { beforeUploadFile, splitUrl, companySearch } from '../../tools.js';
+
+const KeyWordTagGroup = React.createClass({
+    getInitialState() {
+        return {
+            tags: [],
+            inputVisible: false,
+            inputValue: ''
+        };
+    },
+    handleClose(removedTag) {
+        const tags = this.state.tags.filter(tag => tag !== removedTag);
+        this.props.tagsArr(tags);
+        this.setState({ tags });
+    },
+    showInput() {
+        this.setState({ inputVisible: true }, () => this.input.focus());
+    },
+    handleInputChange(e) {
+        this.setState({ inputValue: e.target.value });
+    },
+    handleInputConfirm() {
+        const state = this.state;
+        const inputValue = state.inputValue;
+        let tags = state.tags;
+        if (inputValue && tags.indexOf(inputValue) === -1) {
+            tags = [...tags, inputValue];
+        }
+        this.props.tagsArr(tags);
+        this.setState({
+            tags,
+            inputVisible: false,
+            inputValue: '',
+        });
+    },
+    componentWillMount() {
+        this.state.tags = this.props.keyWordArr;
+    },
+    componentWillReceiveProps(nextProps) {
+        if (this.props.keyWordArr != nextProps.keyWordArr) {
+            this.state.tags = nextProps.keyWordArr;
+        };
+    },
+    render() {
+        const { tags, inputVisible, inputValue } = this.state;
+        return (
+            <div className="keyWord-tips">
+                {tags.map((tag, index) => {
+                    const isLongTag = tag.length > 10;
+                    const tagElem = (
+                        <Tag key={tag} closable={index !== -1} afterClose={() => this.handleClose(tag)}>
+                            {isLongTag ? `${tag.slice(0, 10)}...` : tag}
+                        </Tag>
+                    );
+                    return isLongTag ? <Tooltip title={tag}>{tagElem}</Tooltip> : tagElem;
+                })}
+                {inputVisible && (
+                    <Input
+                        ref={input => this.input = input}
+                        type="text"
+                        style={{ width: 78 }}
+                        value={inputValue}
+                        onChange={this.handleInputChange}
+                        onBlur={this.handleInputConfirm}
+                        onPressEnter={this.handleInputConfirm}
+                    />
+                )}
+                {!inputVisible && <Button className="addtips" type="dashed" disabled={tags.length > 9 ? true : false} onClick={this.showInput}>+ 新关键词</Button>}
+            </div>
+        );
+    }
+});
+
+const PicturesWall = React.createClass({
+    getInitialState() {
+        return {
+            previewVisible: false,
+            previewImage: '',
+            fileList: [],
+        }
+    },
+    handleCancel() {
+        this.setState({ previewVisible: false })
+    },
+    handlePreview(file) {
+        this.setState({
+            previewImage: file.url || file.thumbUrl,
+            previewVisible: true,
+        });
+    },
+    handleChange(info) {
+        let fileList = info.fileList;
+        this.setState({ fileList });
+        this.props.fileList(fileList);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.fileList = nextProps.pictureUrl;
+    },
+    render() {
+        const { previewVisible, previewImage, fileList } = this.state;
+        const uploadButton = (
+            <div>
+                <Icon type="plus" />
+                <div className="ant-upload-text">点击上传</div>
+            </div>
+        );
+        return (
+            <div className="clearfix">
+                <Upload
+                    action={globalConfig.context + "/api/admin/demand/uploadPicture"}
+                    data={{ 'sign': 'demand_picture', 'uid': this.props.uid }}
+                    listType="picture-card"
+                    fileList={fileList}
+                    onPreview={this.handlePreview}
+                    onChange={this.handleChange} >
+                    {fileList.length >= 5 ? null : uploadButton}
+                </Upload>
+                <Modal maskClosable={false} visible={previewVisible} footer={null} onCancel={this.handleCancel}>
+                    <img alt="example" style={{ width: '100%' }} src={previewImage} />
+                </Modal>
+            </div>
+        );
+    }
+});
+
+const DemandDetailForm = Form.create()(React.createClass({
+    getInitialState() {
+        return {
+            visible: false,
+            loading: false,
+            textFileList: [],
+            videoFileList: [],
+            pictureUrl: [],
+            tags: []
+        };
+    },
+    loadData(id, detailApiUrl) {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + detailApiUrl,
+            data: {
+                id: id
+            },
+            success: function (data) {
+                let thisData = data.data;
+                if (!thisData) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    };
+                    thisData = {};
+                };
+                let d = new Date()
+                if (thisData && thisData.dateOfBirthMonth && thisData.dateOfBirthYear) {
+                    d.setMonth(thisData.dateOfBirthMonth - 1);
+                    d.setYear(parseInt(thisData.dateOfBirthYear));
+                };
+                this.setState({
+                    data: thisData,
+                    tags: thisData.keyword ? thisData.keyword.split(",") : [],
+                    pictureUrl: thisData.pictureUrl ? splitUrl(thisData.pictureUrl, ',', globalConfig.avatarHost + '/upload') : []
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getSalesmanList() {
+        this.setState({
+            loading: true
+        });
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/salesman",
+            success: function (data) {
+                if (!data.data) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                    }
+                    return;
+                };
+                let _me = this, theArr = [];
+                for (var item in data.data) {
+                    theArr.push(
+                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
+                    )
+                };
+                this.setState({
+                    salesmanOption: theArr
+                });
+            }.bind(this),
+        }).always(function () {
+            this.setState({
+                loading: false
+            });
+        }.bind(this));
+    },
+    getContactsList(theUid) {
+        $.ajax({
+            method: "get",
+            dataType: "json",
+            crossDomain: false,
+            url: globalConfig.context + "/api/admin/getContacts",
+            data: {
+                uid: theUid
+            },
+            success: function (data) {
+                let theOption = [];
+                if (!data.data) {
+                    if (data.error && data.error.length) {
+                        message.warning(data.error[0].message);
+                        return;
+                    };
+                };
+                for (let item in data.data) {
+                    let theData = data.data[item];
+                    theOption.push(
+                        <Select.Option value={item} key={theData}>{theData}</Select.Option>
+                    );
+                };
+                this.setState({
+                    contactsOption: theOption
+                });
+            }.bind(this),
+        });
+    },
+    getTagsArr(e) {
+        this.setState({ tags: e });
+    },
+    getPictureUrl(e) {
+        this.setState({ pictureUrl: e });
+    },
+    handleSubmit(e) {
+        e.preventDefault();
+        this.props.form.validateFields((err, values) => {
+            //keyword长度判断
+            if (this.state.tags.length < 3) {
+                message.warning('关键词数量不能小于3个!');
+            };
+            //url转化
+            let thePictureUrl = [];
+            if (this.state.pictureUrl.length) {
+                let picArr = [];
+                this.state.pictureUrl.map(function (item) {
+                    picArr.push(item.response.data);
+                });
+                thePictureUrl = picArr.join(",");
+            };
+            if (!err) {
+                this.setState({
+                    loading: true
+                });
+                $.ajax({
+                    method: "POST",
+                    dataType: "json",
+                    crossDomain: false,
+                    url: this.props.data.id ? globalConfig.context + '/api/admin/demand/update' : globalConfig.context + '/api/admin/demand/apply',
+                    data: {
+                        id: this.props.data.id,
+                        dataCategory: this.props.detailApiUrl.indexOf('org') >= 0 ? 1 : 0,
+                        serialNumber: this.props.data.serialNumber,
+                        name: values.name,
+                        keyword: this.state.tags ? this.state.tags.join(",") : [],
+                        infoSources: values.infoSources,
+                        industryCategoryA: values.industryCategory ? values.industryCategory[0] : undefined,
+                        industryCategoryB: values.industryCategory ? values.industryCategory[1] : undefined,
+                        demandType: values.demandType,
+                        problemDes: values.problemDes,
+                        technicalRequirements: values.technicalRequirements,
+                        pictureUrl: thePictureUrl,
+                        textFileUrl: this.state.textFileUrl,
+                        videoUrl: values.videoUrl,
+                        fixedBudget: values.fixedBudget,
+                        fixedCycle: values.fixedCycle,
+                        peopleNumber: values.peopleNumber,
+                        fixedScheme: values.fixedScheme,
+                        costEscrow: values.costEscrow,
+                        budgetCost: values.budgetCost,
+                        employerId: values.employerId || this.state.data.employerId,
+                        releaseStatus: values.releaseStatus,
+                        principalId: values.principalId,
+                        validityPeriodFormattedDate: values.validityPeriod ? values.validityPeriod.format('YYYY-MM-DD') : undefined,
+                        //
+                        contacts: values.contacts,
+                        status: this.state.status
+                    }
+                }).done(function (data) {
+                    if (!data.error.length) {
+                        message.success('保存成功!');
+                        this.setState({
+                            visible: false
+                        });
+                        this.props.handleOk();
+                    } else {
+                        message.warning(data.error[0].message);
+                    }
+                }.bind(this));
+            }
+        });
+    },
+    componentWillMount() {
+        this.getSalesmanList();
+        if (this.props.data.id) {
+            this.loadData(this.props.data.id, this.props.detailApiUrl);
+            if (this.props.data.employerId && this.props.detailApiUrl.indexOf('org') >= 0) {
+                this.getContactsList(this.props.data.employerId)
+            };
+        } else {
+            this.state.data = {};
+        };
+    },
+    componentWillReceiveProps(nextProps) {
+        if (!this.props.visible && nextProps.visible) {
+            this.state.textFileList = [];
+            this.state.videoFileList = [];
+            if (nextProps.data.id) {
+                this.loadData(nextProps.data.id, nextProps.detailApiUrl);
+                if (nextProps.data.employerId && nextProps.detailApiUrl.indexOf('org') >= 0) {
+                    this.getContactsList(nextProps.data.employerId)
+                };
+            } else {
+                this.state.data = {};
+                this.state.tags = [];
+                this.state.pictureUrl = [];
+            };
+            this.props.form.resetFields();
+        };
+    },
+    render() {
+        const theData = this.state.data || {};
+        const { getFieldDecorator } = this.props.form;
+        const FormItem = Form.Item
+        const formItemLayout = {
+            labelCol: { span: 6 },
+            wrapperCol: { span: 12 },
+        };
+        return (
+            <Form horizontal onSubmit={this.handleSubmit} id="demand-form">
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="编号" >
+                        <span>{theData.serialNumber}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="需求名称" >
+                        {getFieldDecorator('name', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.name
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item" style={{ display: theData.username ? 'block' : 'none' }}
+                        {...formItemLayout}
+                        label="雇主名称" >
+                        <span>{theData.username}</span>
+                    </FormItem>
+                    <FormItem className="half-item" style={{ display: theData.username ? 'none' : 'block' }}
+                        {...formItemLayout}
+                        label="雇主名称" >
+                        {getFieldDecorator('employerId', {
+                            initialValue: theData.employerId
+                        })(
+                            <Select
+                                placeholder="请选择"
+                                notFoundContent="未找到"
+                                style={{ width: 260 }}
+                                showSearch
+                                filterOption={companySearch}
+                                onSelect={(e, n) => {
+                                    theData.uid = e;
+                                    if (this.props.detailApiUrl.indexOf('org') >= 0) {
+                                        this.getContactsList(e);
+                                    };
+                                }}>
+                                {this.props.detailApiUrl.indexOf('org') >= 0 ? this.props.companyOption : this.props.userOption}
+                            </Select>
+                            )}
+                    </FormItem>
+                    {this.props.detailApiUrl.indexOf('org') >= 0 ? <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="联系人" >
+                        {getFieldDecorator('contacts', {
+                            initialValue: theData.contacts
+                        })(
+                            <Select style={{ width: 260 }}
+                                placeholder="请选择联系人"
+                                notFoundContent="未获取到联系人列表"
+                                showSearch
+                                filterOption={companySearch}>
+                                {this.state.contactsOption}
+                            </Select>
+                            )}
+                    </FormItem> : <div></div>}
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="负责人" >
+                        {getFieldDecorator('principalId', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.principalId
+                        })(
+                            <Select style={{ width: 260 }}
+                                placeholder="请选择负责人"
+                                notFoundContent="未获取到负责人列表"
+                                showSearch
+                                filterOption={companySearch}>
+                                {this.state.salesmanOption}
+                            </Select>
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="是否发布" >
+                        {getFieldDecorator('releaseStatus', {
+                            initialValue: theData.releaseStatus
+                        })(
+                            <Radio.Group>
+                                <Radio value="0">未发布</Radio>
+                                <Radio value="1">发布</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="发布时间" >
+                        <span>{theData.releaseDateFormattedDate}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="需求状态" >
+                        {(() => {
+                            if (theData.status > 1) {
+                                return <Radio.Group
+                                    value={this.state.status}
+                                    onChange={(e) => { this.setState({ status: e }); }}>
+                                    <Radio value="2">未解决</Radio>
+                                    <Radio value="3">已解决</Radio>
+                                </Radio.Group>
+                            } else {
+                                switch (theData.status) {
+                                    case "0":
+                                        return <span>草稿</span>;
+                                    case "1":
+                                        return <span>进行中</span>;
+                                };
+                            };
+                        })()}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="需求创建时间" >
+                        <span>{theData.createTimeFormattedDate}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="信息来源" >
+                        {getFieldDecorator('infoSources', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.infoSources
+                        })(
+                            <Radio.Group>
+                                <Radio value="0">平台采集</Radio>
+                                <Radio value="1">客户发布</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 20 }}
+                    label="关键词" >
+                    <KeyWordTagGroup
+                        keyWordArr={this.state.tags}
+                        tagsArr={this.getTagsArr}
+                        visible={this.props.visible} />
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 18 }}
+                    label="行业类别" >
+                    {getFieldDecorator('industryCategory', {
+                        rules: [{ type: 'array', required: true, message: '此项为必填项!' }],
+                        initialValue: [theData.industryCategoryA, theData.industryCategoryB]
+                    })(
+                        <Cascader style={{ width: 300 }} options={IndustryObject} placeholder="请选择一个行业" />
+                        )}
+                </FormItem>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="需求类型" >
+                        {getFieldDecorator('demandType', {
+                            rules: [{ required: true, message: '此项为必填项!' }],
+                            initialValue: theData.demandType
+                        })(
+                            <Select style={{ width: 160 }} placeholder="请选择需求类型">
+                                {this.props.demandTypeOption}
+                            </Select>
+                            )}
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 18 }}
+                    label="问题说明" >
+                    {getFieldDecorator('problemDes', {
+                        rules: [{ required: true, message: '此项为必填项!' }],
+                        initialValue: theData.problemDes
+                    })(
+                        <Input type="textarea" rows={4} />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 18 }}
+                    label="技术指标要求" >
+                    {getFieldDecorator('technicalRequirements', {
+                        initialValue: theData.technicalRequirements
+                    })(
+                        <Input type="textarea" rows={2} />
+                        )}
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 18 }}
+                    label="需求文件(图片)" >
+                    <PicturesWall
+                        uid={theData.uid}
+                        fileList={this.getPictureUrl}
+                        pictureUrl={this.state.pictureUrl}
+                        visible={this.props.visible} />
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 6 }}
+                    label="需求文件(文本)" >
+                    <Upload
+                        name="ratepay"
+                        action={globalConfig.context + "/api/admin/demand/uploadTextFile"}
+                        data={{ 'sign': 'demand_text_file', 'uid': theData.uid }}
+                        beforeUpload={beforeUploadFile}
+                        fileList={this.state.textFileList}
+                        onChange={(info) => {
+                            if (info.file.status !== 'uploading') {
+                                console.log(info.file, info.fileList);
+                            }
+                            if (info.file.status === 'done') {
+                                if (!info.file.response.error.length) {
+                                    message.success(`${info.file.name} 文件上传成功!`);
+                                } else {
+                                    message.warning(info.file.response.error[0].message);
+                                    return;
+                                };
+                                this.state.textFileUrl = info.file.response.data;
+                            } else if (info.file.status === 'error') {
+                                message.error(`${info.file.name} 文件上传失败。`);
+                            };
+                            this.setState({ textFileList: info.fileList.slice(-1) });
+                        }} >
+                        <Button><Icon type="upload" /> 上传需求文本文件 </Button>
+                    </Upload>
+                    <p style={{ marginTop: '10px' }}>{theData.textFileUrl ?
+                        <span className="download-file">
+                            <a onClick={() => { window.open(globalConfig.context + '/api/admin/demand/download?id=' + this.props.data.id) }}>需求文件(文本文件)</a>
+                        </span>
+                        : <span><Icon type="exclamation-circle" style={{ color: '#ffbf00', marginRight: '6px' }} />未上传!</span>}</p>
+                </FormItem>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 18 }}
+                    label="需求文件(视频地址)" >
+                    {getFieldDecorator('videoUrl', {
+                        initialValue: theData.videoUrl
+                    })(
+                        <Input />
+                        )}
+                </FormItem>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="固定周期" >
+                        {getFieldDecorator('fixedCycle', {
+                            initialValue: theData.fixedCycle
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="固定人数" >
+                        {getFieldDecorator('peopleNumber', {
+                            initialValue: theData.peopleNumber
+                        })(
+                            <InputNumber />
+                            )}
+                        <span style={{ marginLeft: '20px' }}>人</span>
+                    </FormItem>
+                </div>
+                <FormItem
+                    labelCol={{ span: 3 }}
+                    wrapperCol={{ span: 18 }}
+                    label="固定方案" >
+                    {getFieldDecorator('fixedScheme', {
+                        initialValue: theData.fixedScheme
+                    })(
+                        <Input type="textarea" rows={2} />
+                        )}
+                </FormItem>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="预算费用" >
+                        {getFieldDecorator('budgetCost', {
+                            initialValue: theData.budgetCost
+                        })(
+                            <InputNumber />
+                            )}
+                        <span style={{ marginLeft: '20px' }}>万元</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="费用托管" >
+                        {getFieldDecorator('costEscrow', {
+                            initialValue: theData.costEscrow
+                        })(
+                            <Radio.Group>
+                                <Radio value={0}>否</Radio>
+                                <Radio value={1}>是</Radio>
+                            </Radio.Group>
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="有效期限" >
+                        {getFieldDecorator('validityPeriod', {
+                            initialValue: theData.validityPeriod ? moment(theData.validityPeriod) : null
+                        })(
+                            <DatePicker />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix" style={{ display: 'none' }}>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="雇主客户ID" >
+                        {getFieldDecorator('employerId', {
+                            initialValue: theData.employerName
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="雇主地址" >
+                        {getFieldDecorator('employerAddress', {
+                            initialValue: theData.employerAddress
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="雇主联系人名称" >
+                        {getFieldDecorator('employerContacts', {
+                            initialValue: theData.employerContacts
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="雇主联系人电话" >
+                        {getFieldDecorator('employerContactsMobile', {
+                            initialValue: theData.employerContactsMobile
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="雇主联系人邮箱" >
+                        {getFieldDecorator('employerContactsMailbox', {
+                            initialValue: theData.employerContactsMailbox
+                        })(
+                            <Input />
+                            )}
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="雇主地址" >
+                        <span>{theData.employerAddress}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="雇主联系人名称" >
+                        <span>{theData.employerContacts}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="雇主联系人电话" >
+                        <span>{theData.employerContactsMobile}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="雇主联系人邮箱" >
+                        <span>{theData.employerContactsMailbox}</span>
+                    </FormItem>
+                </div>
+                <FormItem wrapperCol={{ span: 12, offset: 3 }}>
+                    <Button className="set-submit" type="primary" htmlType="submit">保存</Button>
+                    <Button className="set-submit" type="ghost" onClick={this.props.closeDesc}>取消</Button>
+                </FormItem>
+            </Form >
+        )
+    }
+}));
+
+const DemandDetail = React.createClass({
+    getInitialState() {
+        return {
+            visible: false
+        };
+    },
+    showModal() {
+        this.setState({
+            visible: true,
+        });
+    },
+    handleCancel(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false);
+    },
+    handleOk(e) {
+        this.setState({
+            visible: false,
+        });
+        this.props.closeDesc(false, true);
+    },
+    componentWillReceiveProps(nextProps) {
+        this.state.visible = nextProps.showDesc;
+    },
+    render() {
+        if (this.props.data) {
+            return (
+                <div className="patent-desc">
+                    <Modal maskClosable={false} title="用户需求详情" visible={this.state.visible}
+                        onOk={this.checkPatentProcess} onCancel={this.handleCancel}
+                        width='1000px'
+                        footer=''
+                        className="admin-desc-content">
+                        <DemandDetailForm
+                            data={this.props.data}
+                            detailApiUrl={this.props.detailApiUrl}
+                            companyOption={this.props.companyOption}
+                            userOption={this.props.userOption}
+                            demandTypeOption={this.props.demandTypeOption}
+                            closeDesc={this.handleCancel}
+                            visible={this.state.visible}
+                            handleOk={this.handleOk} />
+                    </Modal>
+                </div>
+            );
+        } else {
+            return <div></div>
+        }
+    },
+});
+
+export default DemandDetail;

+ 1 - 1
js/component/manageCenter/index/content.less

@@ -101,7 +101,7 @@
             .activity-list {
                 li {
                     border-bottom: 1px dashed #eee;
-                    padding:10px 0;
+                    padding: 10px 0;
                     .list-type {
                         color: #666
                     }

+ 19 - 21
js/component/manageCenter/servicesManage/contract/contract.jsx

@@ -28,6 +28,7 @@ const Contract = React.createClass({
                 uid: this.state.unitId,
                 type: this.state.contractType,
                 status: this.state.contractState,
+                contractId: this.state.contractId,
                 startDateFormattedDate: this.state.startDateFormattedDate,
                 endDateFormattedDate: this.state.endDateFormattedDate,
             },
@@ -247,9 +248,10 @@ const Contract = React.createClass({
                     return;
                 };
                 let theArr = [];
-                for (var item in data.data) {
+                for (let i = 0; i < data.data.length; i++) {
+                    let item = data.data[i];
                     theArr.push(
-                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
+                        <Select.Option value={item.contractId} key={item.contractId}>{item.serialNumber}</Select.Option>
                     );
                 };
                 this.setState({
@@ -284,24 +286,20 @@ const Contract = React.createClass({
             typeOption: tArr,
             stateOption: sArr
         });
-        this.loadData();
         this.getAuthorList();
         this.getCompanyList();
         this.getStateList();
         this.getContractList();
-        // if (window.location.search) {
-        //     let theArr = getSearchUrl(window.location.search);
-        //     if (theArr.length > 1) {
-        //         let theObj = {};
-        //         theObj.id = theArr[0];
-        //         theObj.uid = theArr[1];
-        //         if (theObj.id != 'null' && theObj.uid != 'null') {
-        //             this.tableRowClick(theObj);
-        //         };
-        //     } else if (theArr.length == 1) {
-        //         this.state.unitName = theArr[0];
-        //     };
-        // };
+        if (window.location.search) {
+            let theObj = getSearchUrl(window.location.search);
+            if (theObj.rid) {
+                theObj.id = theObj.rid;
+                if (theObj.rid != 'null' && theObj.uid != 'null') {
+                    this.tableRowClick(theObj);
+                };
+            };
+        };
+        this.loadData();
     },
     tableRowClick(record, index) {
         this.state.RowData = record;
@@ -323,7 +321,6 @@ const Contract = React.createClass({
                 deletedIds.push(rowItem.id)
             };
         };
-        debugger
         this.setState({
             selectedRowKeys: [],
             loading: deletedIds.length > 0
@@ -332,13 +329,13 @@ const Contract = React.createClass({
             method: "POST",
             dataType: "json",
             crossDomain: false,
-            url: globalConfig.context + "/api/admin/copyright/delete",
+            url: globalConfig.context + "/api/admin/contract/delete",
             data: {
-                id: deletedIds
+                ids: deletedIds
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });
@@ -380,6 +377,7 @@ const Contract = React.createClass({
         this.state.unitId = undefined;
         this.state.contractState = undefined;
         this.state.contractType = undefined;
+        this.state.contractId = undefined;
         this.state.startDateFormattedDate = [];
         this.state.endDateFormattedDate = [];
         this.loadData();
@@ -444,7 +442,7 @@ const Contract = React.createClass({
                             {this.state.typeOption}
                         </Select>
                         <Select style={{ width: 120 }}
-                            value={this.state.searchStatus}
+                            value={this.state.contractState}
                             onChange={(e) => { this.setState({ contractState: e }) }}
                             placeholder="选择一个状态">
                             {this.state.stateOption}

+ 15 - 3
js/component/manageCenter/servicesManage/contract/contractAdd.jsx

@@ -86,7 +86,7 @@ const ContractAddFrom = Form.create()(React.createClass({
             )
         };
         this.state.yearOption = theArr;
-        if (this.props.data.uid && this.props.data.id) {
+        if (this.props.data && this.props.data.uid && this.props.data.id) {
             this.getContactsList(this.props.data.uid);
             this.loadData(this.props.data.id);
         } else {
@@ -99,7 +99,7 @@ const ContractAddFrom = Form.create()(React.createClass({
     },
     componentWillReceiveProps(nextProps) {
         if (!this.props.visible && nextProps.visible) {
-            if (nextProps.data.uid && nextProps.data.id) {
+            if (nextProps.data && nextProps.data.uid && nextProps.data.id) {
                 this.getContactsList(nextProps.data.uid);
                 this.loadData(nextProps.data.id);
             } else {
@@ -132,6 +132,7 @@ const ContractAddFrom = Form.create()(React.createClass({
                         "copyrightNum": this.state.copyrightCheck ? values.copyrightNum : 0,
                         "cognizanceYear": this.state.highTechCheck ? values.cognizanceYear : undefined,
                         "techProjectNum": this.state.techProjectCheck ? values.techProjectNum : 0,
+                        "previousFee": values.previousFee,
                         "comment": values.comment //"备注"
                     }
                 }).done(function (data) {
@@ -169,6 +170,7 @@ const ContractAddFrom = Form.create()(React.createClass({
                         "cognizanceYear": this.state.highTechCheck ? values.cognizanceYear : undefined,
                         "techProjectNum": this.state.techProjectCheck ? values.techProjectNum : 0,
                         "principals": values.principals,
+                        "previousFee": values.previousFee,
                         "signDateFormattedDate": values.recordTime ? values.recordTime.format("YYYY-MM-DD HH:mm:ss") : undefined,
                         "comment": values.comment //"备注"
                     }
@@ -244,6 +246,16 @@ const ContractAddFrom = Form.create()(React.createClass({
                             </Select>
                             )}
                     </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="前期费用" >
+                        {getFieldDecorator('previousFee', {
+                            initialValue: theData.previousFee
+                        })(
+                            <Input style={{ width: '80px', marginRight: '20px' }} />
+                            )}
+                        <span>元</span>
+                    </FormItem>
                 </div>
                 <FormItem
                     labelCol={{ span: 3 }}
@@ -410,7 +422,7 @@ const ContractAdd = React.createClass({
             <div className="patent-addNew">
                 <Button className="patent-addNew" type="primary" onClick={this.showModal}>申请合同<Icon type="plus" /></Button>
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="合同详情"
+                    <Modal maskClosable={false} title="合同详情"
                         visible={this.state.visible}
                         onCancel={this.handleCancel}
                         width='800px'

+ 9 - 3
js/component/manageCenter/servicesManage/contract/contractDetail.jsx

@@ -487,8 +487,8 @@ const ContractDetailForm = Form.create()(React.createClass({
     handleSubmit(e) {
         e.preventDefault();
         this.props.form.validateFields((err, values) => {
-            if (values.status || values.principal || values.recordTime || values.comment) {
-                if (!values.status || !values.principal || !values.recordTime) {
+            if (values.status || values.principals || values.recordTime || values.comment) {
+                if (!values.status || !values.principals || !values.recordTime) {
                     message.warning("请填写完整的状态流转信息!");
                     return;
                 };
@@ -504,6 +504,7 @@ const ContractDetailForm = Form.create()(React.createClass({
                         "cid": this.props.data.id,
                         "comment": values.comment,
                         "status": values.status,
+                        "recordTimeFormattedDate":values.recordTime.format("YYYY-MM-DD HH:mm:ss"),
                         "principals": values.principals //流转分发人
                     }
                 }).done(function (data) {
@@ -581,6 +582,11 @@ const ContractDetailForm = Form.create()(React.createClass({
                         label="联系人" >
                         <span>{this.state.contactsList ? this.state.contactsList[theData.contacts] : ''}</span>
                     </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="前期费用" >
+                        <span>{theData.previousFee}</span>
+                    </FormItem>
                 </div>
                 <p style={{ fontSize: '14px', color: '#333' }}>状态流转记录: </p>
                 <Table style={{ margin: '10px 0', background: "#eee" }}
@@ -753,7 +759,7 @@ const ContractDetail = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="合同详情" visible={this.state.visible}
+                    <Modal maskClosable={false} title="合同详情" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='1000px'
                         footer=''

+ 1 - 1
js/component/manageCenter/servicesManage/copyright/comPatentAdd.jsx

@@ -215,7 +215,7 @@ const PatentAdd = React.createClass({
             <div className="patent-addNew">
                 <Button className="patent-addNew" type="primary" onClick={this.showModal}>申请新软著<Icon type="plus" /></Button>
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="申请新软著"
+                    <Modal maskClosable={false} title="申请新软著"
                         visible={this.state.visible}
                         onCancel={this.handleCancel}
                         width='800px'

+ 27 - 18
js/component/manageCenter/servicesManage/copyright/comPatentChange.jsx

@@ -204,23 +204,33 @@ const CopyrightDescForm = Form.create()(React.createClass({
         const { getFieldDecorator } = this.props.form;
         const theData = this.state;
         const formItemLayout = {
-            labelCol: { span: 6 },
+            labelCol: { span: 8 },
             wrapperCol: { span: 16 },
         };
         const _me = this;
         return (
             <Form onSubmit={this.handleSubmit} id="CopyrightDesc-form">
-                <Row className="express-desc-row">
-                    <Col span={4}>公司名称</Col>
-                    <Col span={8}>{theData.unitName}</Col>
-                    <Col span={4}>组织机构代码</Col>
-                    <Col span={8}>{theData.unitNumber}</Col>
-                </Row>
-                <Row className="express-desc-row">
-                    <Col span={4}>公司地址</Col>
-                    <Col span={8}>{theData.postalAddress}</Col>
-                    <Col span={4}>联系人</Col>
-                    <Col span={8}>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="公司名称" >
+                        <span>{theData.unitName}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="组织机构代码" >
+                        <span>{theData.unitNumber}</span>
+                    </FormItem>
+                </div>
+                <div className="clearfix">
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="公司地址" >
+                        <span>{theData.postalAddress}</span>
+                    </FormItem>
+                    <FormItem className="half-item"
+                        {...formItemLayout}
+                        label="联系人" >
                         {getFieldDecorator('contact', {
                             rules: [{ required: true, message: '此项为必填项!' }],
                             initialValue: theData.contact
@@ -231,18 +241,17 @@ const CopyrightDescForm = Form.create()(React.createClass({
                                 {this.state.contactsOption}
                             </Select>
                             )}
-                    </Col>
-                </Row>
+                    </FormItem>
+                </div>
                 <p>状态流转记录: </p>
                 <Table style={{ margin: '10px 0', background: "#eee" }}
                     pagination={false}
                     dataSource={this.state.stateTable}
                     columns={this.state.stateColumns} />
-                <div className="clearfix" style={{paddingLeft:'4px', paddingTop: '20px',marginBottom:'10px', background: '#eee' }}>
+                <div className="clearfix" style={{ paddingLeft: '4px', paddingTop: '20px', marginBottom: '10px', background: '#eee' }}>
                     <FormItem className="half-item"
                         {...formItemLayout}
-                        label="状态流转"
-                    >
+                        label="状态流转" >
                         {getFieldDecorator('status')(
                             <Select
                                 style={{ width: 200 }}
@@ -468,7 +477,7 @@ const CopyrightDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="软著详情" visible={this.state.visible}
+                    <Modal maskClosable={false} title="软著详情" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''

+ 9 - 7
js/component/manageCenter/servicesManage/copyright/copyright.jsx

@@ -47,6 +47,7 @@ const copyright = React.createClass({
                         province: thisdata.province,
                         unitName: thisdata.unitName,
                         serialNumber: thisdata.serialNumber,
+                        contractNumber: thisdata.contractNumber,
                         createTime: thisdata.createTime,
                         acceptTime: thisdata.acceptTime,
                         principal: thisdata.principal,
@@ -243,9 +244,9 @@ const copyright = React.createClass({
                     dataIndex: 'province',
                     key: 'province',
                 }, {
-                    title: '外包公司',
-                    dataIndex: 'outsource',
-                    key: 'outsource',
+                    title: '合同编号',
+                    dataIndex: 'contractNumber',
+                    key: 'contractNumber',
                 }, {
                     title: '公司名称',
                     dataIndex: 'unitName',
@@ -341,9 +342,10 @@ const copyright = React.createClass({
                     return;
                 };
                 let theArr = [];
-                for (var item in data.data) {
+                for (let i = 0; i < data.data.length; i++) {
+                    let item = data.data[i];
                     theArr.push(
-                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
+                        <Select.Option value={item.contractId} key={item.contractId}>{item.serialNumber}</Select.Option>
                     );
                 };
                 this.setState({
@@ -418,7 +420,7 @@ const copyright = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });
@@ -608,7 +610,7 @@ const copyright = React.createClass({
                         statusOption={this.state.statusOption}
                         showDesc={this.state.showDesc}
                         closeDesc={this.closeDesc} />
-                    <Modal title="软著批量流转" visible={this.state.visible}
+                    <Modal maskClosable={false} title="软著批量流转" visible={this.state.visible}
                         onCancel={this.handleCancel}
                         width='800px'
                         footer={[

+ 2 - 2
js/component/manageCenter/servicesManage/highTech/fosterDesc/achievement.jsx

@@ -247,7 +247,7 @@ const AchievementDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="科技成果转化" visible={this.state.visible}
+                    <Modal maskClosable={false} title="科技成果转化" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -413,7 +413,7 @@ const Achievement = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/manageCenter/servicesManage/highTech/fosterDesc/activity.jsx

@@ -375,7 +375,7 @@ const ActivityDesc = React.createClass({
     render() {
         return (
             <div className="admin-desc">
-                <Modal title="企业研究开发活动情况详情"
+                <Modal maskClosable={false} title="企业研究开发活动情况详情"
                     visible={this.state.visible}
                     onCancel={this.handleCancel}
                     width='800px'
@@ -588,7 +588,7 @@ const Activity = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/manageCenter/servicesManage/highTech/fosterDesc/activityCostList.jsx

@@ -343,7 +343,7 @@ const ActivityDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="企业研究开发费用结构明细" visible={this.state.visible}
+                    <Modal maskClosable={false} title="企业研究开发费用结构明细" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -581,7 +581,7 @@ const Activity = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 3 - 3
js/component/manageCenter/servicesManage/highTech/fosterDesc/annualReport.jsx

@@ -426,7 +426,7 @@ const AnnualReportDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="企业年报信息" visible={this.state.visible}
+                    <Modal maskClosable={false} title="企业年报信息" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='1000px'
                         footer=''
@@ -523,7 +523,7 @@ const AnnualReportAdd = React.createClass({
     render() {
         return (
             <div className="cognizance-add">
-                <Modal title="年报申请" visible={this.state.visible}
+                <Modal maskClosable={false} title="年报申请" visible={this.state.visible}
                     onOk={this.handleOk} onCancel={this.handleCancel}
                     width='800px'
                     footer={[
@@ -698,7 +698,7 @@ const AnnualReport = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 5 - 4
js/component/manageCenter/servicesManage/highTech/fosterDesc/companyDetail.jsx

@@ -296,12 +296,13 @@ const CompanyDetail = Form.create()(React.createClass({
                 }).done(function (data) {
                     if (!data.error.length) {
                         message.success('保存成功!');
-                        this.setState({
-                            loading: false
-                        });
+                        this.loadInfoData();
                     } else {
                         message.warning(data.error[0].message);
-                    }
+                    };
+                    this.setState({
+                        loading: false
+                    });
                 }.bind(this));
             }
         });

+ 2 - 2
js/component/manageCenter/servicesManage/highTech/fosterDesc/finance.jsx

@@ -366,7 +366,7 @@ const FinanceDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="财务报表信息" visible={this.state.visible}
+                    <Modal maskClosable={false} title="财务报表信息" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -532,7 +532,7 @@ const Finance = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/manageCenter/servicesManage/highTech/fosterDesc/honorList.jsx

@@ -193,7 +193,7 @@ const HonorListDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="企业荣誉及其他证明材料" visible={this.state.visible}
+                    <Modal maskClosable={false} title="企业荣誉及其他证明材料" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -336,7 +336,7 @@ const HonorList = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/manageCenter/servicesManage/highTech/fosterDesc/hrSituation.jsx

@@ -573,7 +573,7 @@ const HrSituationDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="人力资源状况" visible={this.state.visible}
+                    <Modal maskClosable={false} title="人力资源状况" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='1200px'
                         footer=''
@@ -760,7 +760,7 @@ const HrSituation = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 1 - 2
js/component/manageCenter/servicesManage/highTech/fosterDesc/innovationAbility.jsx

@@ -9,7 +9,6 @@ const Base = React.createClass({
     getInitialState() {
         return {
             loading: false,
-            tags: []
         };
     },
     loadData() {
@@ -48,7 +47,6 @@ const Base = React.createClass({
         this.loadData()
     },
     submit() {
-        let theTags = this.state.tags.join(",");
         this.setState({
             loading: true
         })
@@ -68,6 +66,7 @@ const Base = React.createClass({
         }).done(function (data) {
             if (!data.error.length) {
                 message.success('保存成功!');
+                this.loadData();
             } else {
                 message.warning(data.error[0].message);
             }

+ 1 - 1
js/component/manageCenter/servicesManage/highTech/fosterDesc/intellectual.jsx

@@ -148,7 +148,7 @@ const Intellectual = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 1 - 1
js/component/manageCenter/servicesManage/highTech/fosterDesc/intellectualDesc.jsx

@@ -292,7 +292,7 @@ const intellectualDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="知识产权详情" visible={this.state.visible}
+                    <Modal maskClosable={false} title="知识产权详情" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='600px'
                         footer=''

+ 2 - 7
js/component/manageCenter/servicesManage/highTech/fosterDesc/orgTechCenter.jsx

@@ -191,7 +191,7 @@ const CenterListDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="产学研情况详情" visible={this.state.visible}
+                    <Modal maskClosable={false} title="产学研情况详情" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -352,11 +352,6 @@ const CenterList = React.createClass({
     componentWillMount() {
         this.loadOrgTechCenterDetail();
     },
-    componentWillReceiveProps(nextProps) {
-        if (this.props.data.uid !== nextProps.data.uid) {
-            this.loadOrgTechCenterDetail(nextProps.data.uid);
-        };
-    },
     tableRowClick(record, index) {
         this.state.RowData = record;
         this.setState({
@@ -385,7 +380,7 @@ const CenterList = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/manageCenter/servicesManage/highTech/fosterDesc/ratepay.jsx

@@ -319,7 +319,7 @@ const RatepayDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="企业所得税纳税申报信息" visible={this.state.visible}
+                    <Modal maskClosable={false} title="企业所得税纳税申报信息" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -473,7 +473,7 @@ const Ratepay = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/manageCenter/servicesManage/highTech/fosterDesc/standard.jsx

@@ -91,7 +91,7 @@ const StandardDesc = React.createClass({
         if (this.props.data) {
             return (
                 <div className="admin-desc">
-                    <Modal title="企业参与国家标准或行业标准制定情况明细" visible={this.state.visible} onCancel={this.handleCancel}
+                    <Modal maskClosable={false} title="企业参与国家标准或行业标准制定情况明细" visible={this.state.visible} onCancel={this.handleCancel}
                         width='400px' footer={[
                             <Button key="submit" type="primary" size="large" loading={this.state.loading} onClick={this.handleOk}>确认</Button>,
                             <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>
@@ -326,7 +326,7 @@ const Standard = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 2 - 2
js/component/manageCenter/servicesManage/highTech/fosterDesc/techProduct.jsx

@@ -312,7 +312,7 @@ const TechProductDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="上年度高新技术产品(服务)情况表" visible={this.state.visible}
+                    <Modal maskClosable={false} title="上年度高新技术产品(服务)情况表" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''
@@ -510,7 +510,7 @@ const TechProduct = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 11 - 6
js/component/manageCenter/servicesManage/highTech/highTechApply.jsx

@@ -614,7 +614,7 @@ const CognizanceDesc = React.createClass({
         return (
             <div className="patent-addNew">
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="高企管理" visible={this.state.visible}
+                    <Modal maskClosable={false} title="高企管理" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='1000px'
                         footer=''
@@ -762,7 +762,7 @@ const CognizanceAdd = React.createClass({
     render() {
         return (
             <div className="cognizance-add">
-                <Modal title="高企申请" visible={this.state.visible}
+                <Modal maskClosable={false} title="高企申请" visible={this.state.visible}
                     onOk={this.handleOk} onCancel={this.handleCancel}
                     width='800px'
                     footer={[
@@ -868,6 +868,7 @@ const Cognizance = React.createClass({
                         uid: thisdata.uid,
                         cid: thisdata.cid,
                         year: thisdata.year,
+                        contractNumber: thisdata.contractNumber,
                         serialNumber: thisdata.serialNumber,
                         locationProvince: thisdata.locationProvince,
                         unitName: thisdata.unitName,
@@ -1035,6 +1036,10 @@ const Cognizance = React.createClass({
                         };
                     }
                 }, {
+                    title: '合同编号',
+                    dataIndex: 'contractNumber',
+                    key: 'contractNumber'
+                }, {
                     title: '年份',
                     dataIndex: 'year',
                     key: 'year'
@@ -1086,9 +1091,10 @@ const Cognizance = React.createClass({
                     return;
                 };
                 let theArr = [];
-                for (var item in data.data) {
+                for (let i = 0; i < data.data.length; i++) {
+                    let item = data.data[i];
                     theArr.push(
-                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
+                        <Select.Option value={item.contractId} key={item.contractId}>{item.serialNumber}</Select.Option>
                     );
                 };
                 this.setState({
@@ -1108,7 +1114,6 @@ const Cognizance = React.createClass({
                 <Select.Option value={item} key={item}>{item}</Select.Option>
             )
         });
-        this.loadData();
         this.getAuthorList();
         this.getSalesmanList();
         this.getCompanyList();
@@ -1164,7 +1169,7 @@ const Cognizance = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });

+ 1 - 1
js/component/manageCenter/servicesManage/patent/applyFeeDesc.jsx

@@ -76,7 +76,7 @@ const PatentDesc = React.createClass({
             return (
                 <div className="applyFee-desc">
                     <Spin spinning={this.state.loading} className='spin-box'>
-                        <Modal title="登记申请费用" visible={this.state.visible}
+                        <Modal maskClosable={false} title="登记申请费用" visible={this.state.visible}
                             onOk={this.handleOk} onCancel={this.handleCancel}
                             width='360px'
                             footer={[

+ 1 - 1
js/component/manageCenter/servicesManage/patent/clientInputPatent.jsx

@@ -243,7 +243,7 @@ const PatentAdd = React.createClass({
             <div className="patent-addNew">
                 <Button className="patent-addNew" type="primary" onClick={this.showModal}>新专利添加<Icon type="plus" /></Button>
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="新专利添加" visible={this.state.visible}
+                    <Modal maskClosable={false} title="新专利添加" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='720px'
                         footer=''

+ 1 - 1
js/component/manageCenter/servicesManage/patent/comPatentAdd.jsx

@@ -364,7 +364,7 @@ const PatentAdd = React.createClass({
             <div className="patent-addNew">
                 <Button className="patent-addNew" type="primary" onClick={this.showModal}>申请新专利<Icon type="plus" /></Button>
                 <Spin spinning={this.state.loading} className='spin-box'>
-                    <Modal title="新专利申请" visible={this.state.visible}
+                    <Modal maskClosable={false} title="新专利申请" visible={this.state.visible}
                         onOk={this.handleOk} onCancel={this.handleCancel}
                         width='800px'
                         footer=''

+ 9 - 4
js/component/manageCenter/servicesManage/patent/comPatentDesc.jsx

@@ -41,7 +41,7 @@ class Avatar extends React.Component {
             <Upload className="upload-file"
                 name="avatar"
                 fileList={this.state.fileList}
-                action={globalConfig.context + "/api/admin/patent/upload"}
+                action={this.props.name == "patent_prory_statement" ? globalConfig.context + "/api/admin/patent/uploadProry" : globalConfig.context + "/api/admin/patent/upload"}
                 data={{ 'sign': this.props.name, 'uid': this.props.uid, 'id': this.props.id }}
                 beforeUpload={beforeUpload}
                 onChange={this.handleChange.bind(this)}
@@ -252,6 +252,7 @@ const PatentDesc = React.createClass({
                 "patentWritingUrl": this.state.patentWritingUrl,
                 "authorizationNoticeUrl": this.state.authorizationNoticeUrl,
                 "patentCertificateUrl": this.state.patentCertificateUrl,
+                "patentProryStatementUrl": this.state.patentProryStatementUrl,
                 "pState": this.props.data.patentState,
                 "firstInventorName": this.state.firstInventorName,
                 "firstInventorIdNumber": this.state.firstInventorIdNumber,
@@ -317,6 +318,9 @@ const PatentDesc = React.createClass({
     getPatentCertificateUrl(e) {
         this.state.patentCertificateUrl = e;
     },
+    getPatentProryStatementUrl(e) {
+        this.state.patentProryStatementUrl = e;
+    },
     render() {
         const Step = Steps.Step;
         const theData = this.state.data;
@@ -325,9 +329,9 @@ const PatentDesc = React.createClass({
             return (
                 <div className="patent-desc">
                     <Spin spinning={this.state.loading} className='spin-box'>
-                        <Modal title="专利详情" visible={this.state.visible}
+                        <Modal maskClosable={false} title="专利详情" visible={this.state.visible}
                             onOk={this.checkPatentProcess} onCancel={this.handleCancel}
-                            width='800px'
+                            width='1000px'
                             footer={[
                                 <Button key="submit" type="primary" size="large" onClick={this.checkPatentProcess}>保存</Button>,
                                 <Button key="back" type="ghost" size="large" onClick={this.handleCancel}>取消</Button>,
@@ -516,8 +520,9 @@ const PatentDesc = React.createClass({
                                 <Avatar visible={this.state.visible} urlData={this.getPatentWritingUrl} name='patent_writing' uid={theData.uid} id={theData.id} />
                                 <Avatar visible={this.state.visible} urlData={this.getAuthorizationNoticeUrl} name='authorization_notice' uid={theData.uid} id={theData.id} />
                                 <Avatar visible={this.state.visible} urlData={this.getPatentCertificateUrl} name='patent_certificate' uid={theData.uid} id={theData.id} />
+                                <Avatar visible={this.state.visible} urlData={this.getPatentProryStatementUrl} name='patent_prory_statement' uid={theData.uid} id={theData.id} />
                             </div>
-                            <div className="avatar-text"><span>专利稿件上传</span><span>授权通知书上传</span><span>专利证书上传</span></div>
+                            <div className="avatar-text"><span>专利稿件上传</span><span>授权通知书上传</span><span>专利证书上传</span><span>专利代理委托书上传</span></div>
                             <div className="widthHalf">
                                 <span>撰写人:</span>
                                 <Select

+ 11 - 5
js/component/manageCenter/servicesManage/patent/comprehensive.jsx

@@ -21,7 +21,7 @@ const Patent = React.createClass({
             crossDomain: false,
             url: globalConfig.context + "/api/admin/patent/patentList",
             data: {
-                page: pageNo || 1,
+                pageNo: pageNo || 1,
                 pageSize: this.state.pagination.pageSize || null,
                 serialNumber: this.state.number || null,
                 patentNumber: this.state.patentNumber || null,
@@ -47,6 +47,7 @@ const Patent = React.createClass({
                         id: thisdata.id,
                         oid: thisdata.oid,
                         uid: thisdata.uid,
+                        contractNumber:thisdata.contractNumber,
                         number: thisdata.serialNumber || '',
                         patentNumber: thisdata.patentNumber || '',
                         unitName: thisdata.unitName || '',
@@ -185,9 +186,10 @@ const Patent = React.createClass({
                     return;
                 };
                 let theArr = [];
-                for (var item in data.data) {
+                for (let i = 0; i < data.data.length; i++) {
+                    let item = data.data[i];
                     theArr.push(
-                        <Select.Option value={item} key={item}>{data.data[item]}</Select.Option>
+                        <Select.Option value={item.contractId} key={item.contractId}>{item.serialNumber}</Select.Option>
                     );
                 };
                 this.setState({
@@ -237,6 +239,10 @@ const Patent = React.createClass({
                     dataIndex: 'patentNumber',
                     key: 'patentNumber',
                 }, {
+                    title: '合同编号',
+                    dataIndex: 'contractNumber',
+                    key: 'contractNumber',
+                }, {
                     title: '事务所',
                     dataIndex: 'office',
                     key: 'office',
@@ -420,7 +426,7 @@ const Patent = React.createClass({
             }
         }).done(function (data) {
             if (!data.error.length) {
-                message.success('保存成功!');
+                message.success('删除成功!');
                 this.setState({
                     loading: false,
                 });
@@ -599,7 +605,7 @@ const Patent = React.createClass({
                     patentStateOption={this.state.patentStateOption}
                     showDesc={this.state.showDesc}
                     closeDesc={this.closeDesc} />
-                <Modal title="专利批量流转" visible={this.state.visible}
+                <Modal maskClosable={false} title="专利批量流转" visible={this.state.visible}
                     onCancel={this.handleCancel}
                     width='800px'
                     footer={[

+ 1 - 1
js/component/manageCenter/servicesManage/patent/correctionDesc.jsx

@@ -59,7 +59,7 @@ const CorrectionDesc = React.createClass({
             return (
                 <div className="payment-desc">
                     <Spin spinning={this.state.loading} className='spin-box'>
-                        <Modal title="通知答复确认" visible={this.state.visible}
+                        <Modal maskClosable={false} title="通知答复确认" visible={this.state.visible}
                             onOk={this.handleOk} onCancel={this.handleCancel}
                             width='500px'
                             footer={[

+ 1 - 1
js/component/manageCenter/servicesManage/patent/expressDesc.jsx

@@ -84,7 +84,7 @@ const ExpressDesc = React.createClass({
             return (
                 <div className="express-desc">
                     <Spin spinning={this.state.loading} className='spin-box'>
-                        <Modal title="收发登记详情" visible={this.state.visible}
+                        <Modal maskClosable={false} title="收发登记详情" visible={this.state.visible}
                             onOk={this.handleOk} onCancel={this.handleCancel}
                             width='800px'
                             footer={[

+ 0 - 0
js/component/manageCenter/servicesManage/patent/payment.jsx


Some files were not shown because too many files changed in this diff